Skip to content

Commit 728b785

Browse files
authored
Merge pull request #2115 from digma-ai/improve-auth-manager
improve AuthManager
2 parents 8831503 + 7cdcee2 commit 728b785

File tree

16 files changed

+639
-385
lines changed

16 files changed

+639
-385
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package org.digma.intellij.plugin.auth
2+
3+
import com.intellij.openapi.diagnostic.Logger
4+
import org.digma.intellij.plugin.analytics.AuthenticationException
5+
import org.digma.intellij.plugin.analytics.RestAnalyticsProvider
6+
import org.digma.intellij.plugin.auth.account.DigmaAccount
7+
import org.digma.intellij.plugin.auth.account.DigmaDefaultAccountHolder
8+
import org.digma.intellij.plugin.common.ExceptionUtils
9+
import org.digma.intellij.plugin.errorreporting.ErrorReporter
10+
import org.digma.intellij.plugin.log.Log
11+
12+
abstract class AbstractLoginHandler(protected val analyticsProvider: RestAnalyticsProvider) : LoginHandler {
13+
14+
override val logger: Logger = Logger.getInstance(this::class.java)
15+
16+
protected val authApiClient = AuthApiClient(analyticsProvider)
17+
18+
protected fun defaultAccountExists(): Boolean {
19+
return DigmaDefaultAccountHolder.getInstance().account != null
20+
}
21+
22+
protected fun getDefaultAccount(): DigmaAccount? {
23+
return DigmaDefaultAccountHolder.getInstance().account
24+
}
25+
26+
27+
override fun login(user: String, password: String): LoginResult {
28+
29+
return try {
30+
31+
reportPosthogEvent("login", mapOf("user" to user))
32+
33+
Log.log(logger::trace, "login called for url {}, user {}", analyticsProvider.apiUrl, user)
34+
35+
if (defaultAccountExists()) {
36+
Log.log(logger::trace, "default account exists, deleting before login, {}", getDefaultAccount())
37+
logout()
38+
}
39+
40+
Log.log(logger::trace, "doing login for url {}, user {}", analyticsProvider.apiUrl, user)
41+
42+
val loginResult = authApiClient.login(user, password)
43+
44+
Log.log(logger::trace, "login success for url {}, user {}, created account {}", analyticsProvider.apiUrl, user, getDefaultAccount())
45+
46+
reportPosthogEvent("login success", mapOf("user" to user))
47+
48+
loginResult
49+
50+
} catch (e: Throwable) {
51+
52+
if (e is AuthenticationException) {
53+
Log.warnWithException(logger, e, "Exception in login, url {}", analyticsProvider.apiUrl)
54+
ErrorReporter.getInstance().reportError("AuthManager.login", e)
55+
val errorMessage = ExceptionUtils.getNonEmptyMessage(e)
56+
reportPosthogEvent("login failed", mapOf("user" to user, "error" to errorMessage.toString()))
57+
//return no success LoginResult
58+
LoginResult(false, null, e.detailedMessage)
59+
}
60+
61+
//don't report connection errors, there is no point, backend may be down and that happens a lot
62+
if (!ExceptionUtils.isAnyConnectionException(e)) {
63+
Log.warnWithException(logger, e, "Exception in login, url {}", analyticsProvider.apiUrl)
64+
ErrorReporter.getInstance().reportError("AuthManager.login", e)
65+
}
66+
67+
LoginResult(false, null, ExceptionUtils.getNonEmptyMessage(e))
68+
69+
}
70+
}
71+
72+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package org.digma.intellij.plugin.auth
2+
3+
import kotlinx.datetime.Clock
4+
import org.digma.intellij.plugin.analytics.RestAnalyticsProvider
5+
import org.digma.intellij.plugin.auth.account.DigmaAccount
6+
import org.digma.intellij.plugin.auth.account.DigmaAccountManager
7+
import org.digma.intellij.plugin.auth.credentials.DigmaCredentials
8+
import org.digma.intellij.plugin.model.rest.login.LoginRequest
9+
import org.digma.intellij.plugin.model.rest.login.RefreshRequest
10+
11+
12+
class AuthApiClient(private val analyticsProvider: RestAnalyticsProvider) {
13+
14+
@Synchronized
15+
fun login(user: String, password: String): LoginResult {
16+
17+
val loginResponse = analyticsProvider.login(LoginRequest(user, password))
18+
19+
val digmaAccount = DigmaAccountManager.createAccount(analyticsProvider.apiUrl, loginResponse.userId)
20+
21+
val digmaCredentials = DigmaCredentials(
22+
loginResponse.accessToken,
23+
loginResponse.refreshToken,
24+
analyticsProvider.apiUrl,
25+
TokenType.Bearer.name,
26+
loginResponse.expiration.time,
27+
Clock.System.now().toEpochMilliseconds()
28+
)
29+
30+
updateAccount(digmaAccount, digmaCredentials)
31+
32+
return LoginResult(true, loginResponse.userId, null)
33+
}
34+
35+
36+
@Synchronized
37+
fun refreshToken(
38+
digmaAccount: DigmaAccount,
39+
credentials: DigmaCredentials
40+
): Boolean {
41+
42+
val loginResponse = analyticsProvider.refreshToken(RefreshRequest(credentials.accessToken, credentials.refreshToken))
43+
44+
val digmaCredentials = DigmaCredentials(
45+
loginResponse.accessToken,
46+
loginResponse.refreshToken,
47+
digmaAccount.server.url,
48+
TokenType.Bearer.name,
49+
loginResponse.expiration.time,
50+
Clock.System.now().toEpochMilliseconds()
51+
)
52+
53+
updateAccount(digmaAccount, digmaCredentials)
54+
55+
return true
56+
57+
}
58+
59+
}

0 commit comments

Comments
 (0)