Skip to content

Commit a3dd80c

Browse files
committed
Migrate legacy ca cert in newer version
1 parent 60946e4 commit a3dd80c

8 files changed

Lines changed: 58 additions & 44 deletions

File tree

app/src/main/kotlin/com/github/gotify/Settings.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.github.gotify.client.model.User
66

77
internal class Settings(context: Context) {
88
private val sharedPreferences: SharedPreferences
9+
val filesDir: String
910
var url: String
1011
get() = sharedPreferences.getString("url", "")!!
1112
set(value) = sharedPreferences.edit().putString("url", value).apply()
@@ -26,6 +27,9 @@ internal class Settings(context: Context) {
2627
var serverVersion: String
2728
get() = sharedPreferences.getString("version", "UNKNOWN")!!
2829
set(value) = sharedPreferences.edit().putString("version", value).apply()
30+
var legacyCert: String?
31+
get() = sharedPreferences.getString("cert", null)
32+
set(value) = sharedPreferences.edit().putString("cert", value).apply()
2933
var caCertPath: String?
3034
get() = sharedPreferences.getString("caCertPath", null)
3135
set(value) = sharedPreferences.edit().putString("caCertPath", value).apply()
@@ -44,6 +48,7 @@ internal class Settings(context: Context) {
4448

4549
init {
4650
sharedPreferences = context.getSharedPreferences("gotify", Context.MODE_PRIVATE)
51+
filesDir = context.filesDir.absolutePath
4752
}
4853

4954
fun tokenExists(): Boolean = !token.isNullOrEmpty()
@@ -52,6 +57,7 @@ internal class Settings(context: Context) {
5257
url = ""
5358
token = null
5459
validateSSL = true
60+
legacyCert = null
5561
caCertPath = null
5662
caCertCN = null
5763
clientCertPath = null

app/src/main/kotlin/com/github/gotify/api/ClientFactory.kt

Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,57 +7,78 @@ import com.github.gotify.client.api.UserApi
77
import com.github.gotify.client.api.VersionApi
88
import com.github.gotify.client.auth.ApiKeyAuth
99
import com.github.gotify.client.auth.HttpBasicAuth
10+
import java.io.File
11+
import java.io.FileOutputStream
12+
import java.io.IOException
13+
import org.tinylog.kotlin.Logger
1014

1115
internal object ClientFactory {
12-
private fun unauthorized(baseUrl: String, sslSettings: SSLSettings): ApiClient {
13-
return defaultClient(arrayOf(), "$baseUrl/", sslSettings)
16+
private fun unauthorized(
17+
settings: Settings,
18+
sslSettings: SSLSettings,
19+
baseUrl: String
20+
): ApiClient {
21+
return defaultClient(arrayOf(), settings, sslSettings, baseUrl)
1422
}
1523

1624
fun basicAuth(
17-
baseUrl: String,
25+
settings: Settings,
1826
sslSettings: SSLSettings,
1927
username: String,
2028
password: String
2129
): ApiClient {
22-
val client = defaultClient(
23-
arrayOf("basicAuth"),
24-
"$baseUrl/",
25-
sslSettings
26-
)
30+
val client = defaultClient(arrayOf("basicAuth"), settings, sslSettings)
2731
val auth = client.apiAuthorizations["basicAuth"] as HttpBasicAuth
2832
auth.username = username
2933
auth.password = password
3034
return client
3135
}
3236

33-
fun clientToken(baseUrl: String, sslSettings: SSLSettings, token: String?): ApiClient {
34-
val client = defaultClient(
35-
arrayOf("clientTokenHeader"),
36-
"$baseUrl/",
37-
sslSettings
38-
)
37+
fun clientToken(settings: Settings, token: String? = settings.token): ApiClient {
38+
val client = defaultClient(arrayOf("clientTokenHeader"), settings)
3939
val tokenAuth = client.apiAuthorizations["clientTokenHeader"] as ApiKeyAuth
4040
tokenAuth.apiKey = token
4141
return client
4242
}
4343

44-
fun versionApi(baseUrl: String, sslSettings: SSLSettings): VersionApi {
45-
return unauthorized(baseUrl, sslSettings).createService(VersionApi::class.java)
44+
fun versionApi(
45+
settings: Settings,
46+
sslSettings: SSLSettings = settings.sslSettings(),
47+
baseUrl: String = settings.url
48+
): VersionApi {
49+
return unauthorized(settings, sslSettings, baseUrl).createService(VersionApi::class.java)
4650
}
4751

4852
fun userApiWithToken(settings: Settings): UserApi {
49-
return clientToken(settings.url, settings.sslSettings(), settings.token)
50-
.createService(UserApi::class.java)
53+
return clientToken(settings).createService(UserApi::class.java)
5154
}
5255

5356
private fun defaultClient(
5457
authentications: Array<String>,
55-
baseUrl: String,
56-
sslSettings: SSLSettings
58+
settings: Settings,
59+
sslSettings: SSLSettings = settings.sslSettings(),
60+
baseUrl: String = settings.url
5761
): ApiClient {
5862
val client = ApiClient(authentications)
63+
if (settings.legacyCert != null) {
64+
Logger.info("Migrating legacy CA cert to new location")
65+
var legacyCert: String? = null
66+
try {
67+
legacyCert = settings.legacyCert
68+
settings.legacyCert = null
69+
val caCertFile = File(settings.filesDir, CertUtils.CA_CERT_NAME)
70+
FileOutputStream(caCertFile).use {
71+
it.write(legacyCert?.encodeToByteArray())
72+
}
73+
settings.caCertPath = caCertFile.absolutePath
74+
Logger.info("Migration of legacy CA cert succeeded")
75+
} catch (e: IOException) {
76+
Logger.error(e, "Migration of legacy CA cert failed")
77+
if (legacyCert != null) settings.legacyCert = legacyCert
78+
}
79+
}
5980
CertUtils.applySslSettings(client.okBuilder, sslSettings)
60-
client.adapterBuilder.baseUrl(baseUrl)
81+
client.adapterBuilder.baseUrl("$baseUrl/")
6182
return client
6283
}
6384
}

app/src/main/kotlin/com/github/gotify/init/InitializationActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ internal class InitializationActivity : AppCompatActivity() {
167167
callback: SuccessCallback<VersionInfo>,
168168
errorCallback: Callback.ErrorCallback
169169
) {
170-
ClientFactory.versionApi(settings.url, settings.sslSettings())
170+
ClientFactory.versionApi(settings)
171171
.version
172172
.enqueue(Callback.callInUI(this, callback, errorCallback))
173173
}

app/src/main/kotlin/com/github/gotify/login/LoginActivity.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ internal class LoginActivity : AppCompatActivity() {
144144
binding.checkurl.visibility = View.GONE
145145

146146
try {
147-
ClientFactory.versionApi(url, tempSslSettings())
147+
ClientFactory.versionApi(settings, tempSslSettings(), url)
148148
.version
149149
.enqueue(Callback.callInUI(this, onValidUrl(url), onInvalidUrl(url)))
150150
} catch (e: Exception) {
@@ -252,7 +252,7 @@ internal class LoginActivity : AppCompatActivity() {
252252
binding.login.visibility = View.GONE
253253
binding.loginProgress.visibility = View.VISIBLE
254254

255-
val client = ClientFactory.basicAuth(settings.url, tempSslSettings(), username, password)
255+
val client = ClientFactory.basicAuth(settings, tempSslSettings(), username, password)
256256
client.createService(UserApi::class.java)
257257
.currentUser()
258258
.enqueue(

app/src/main/kotlin/com/github/gotify/messages/MessagesActivity.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -540,7 +540,7 @@ internal class MessagesActivity :
540540

541541
private fun deleteApp(appId: Long) {
542542
val settings = viewModel.settings
543-
val client = ClientFactory.clientToken(settings.url, settings.sslSettings(), settings.token)
543+
val client = ClientFactory.clientToken(settings)
544544
client.createService(ApplicationApi::class.java)
545545
.deleteApp(appId)
546546
.enqueue(
@@ -597,8 +597,7 @@ internal class MessagesActivity :
597597

598598
private fun deleteClientAndNavigateToLogin() {
599599
val settings = viewModel.settings
600-
val api = ClientFactory.clientToken(settings.url, settings.sslSettings(), settings.token)
601-
.createService(ClientApi::class.java)
600+
val api = ClientFactory.clientToken(settings).createService(ClientApi::class.java)
602601
stopService(Intent(this@MessagesActivity, WebSocketService::class.java))
603602
try {
604603
val clients = Api.execute(api.clients)

app/src/main/kotlin/com/github/gotify/messages/MessagesModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import com.squareup.picasso.Target
1414
internal class MessagesModel(parentView: Activity) : ViewModel() {
1515
val settings = Settings(parentView)
1616
val picassoHandler = PicassoHandler(parentView, settings)
17-
val client = ClientFactory.clientToken(settings.url, settings.sslSettings(), settings.token)
17+
val client = ClientFactory.clientToken(settings)
1818
val appsHolder = ApplicationHolder(parentView, client)
1919
val messages = MessageFacade(client.createService(MessageApi::class.java), appsHolder)
2020

app/src/main/kotlin/com/github/gotify/service/WebSocketService.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,7 @@ internal class WebSocketService : Service() {
6868
override fun onCreate() {
6969
super.onCreate()
7070
settings = Settings(this)
71-
val client = ClientFactory.clientToken(
72-
settings.url,
73-
settings.sslSettings(),
74-
settings.token
75-
)
71+
val client = ClientFactory.clientToken(settings)
7672
missingMessageUtil = MissedMessageUtil(client.createService(MessageApi::class.java))
7773
Logger.info("Create ${javaClass.simpleName}")
7874
picassoHandler = PicassoHandler(this, settings)
@@ -129,7 +125,7 @@ internal class WebSocketService : Service() {
129125
}
130126

131127
private fun fetchApps() {
132-
ClientFactory.clientToken(settings.url, settings.sslSettings(), settings.token)
128+
ClientFactory.clientToken(settings)
133129
.createService(ApplicationApi::class.java)
134130
.apps
135131
.enqueue(

app/src/main/kotlin/com/github/gotify/sharing/ShareActivity.kt

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,7 @@ internal class ShareActivity : AppCompatActivity() {
6161
return
6262
}
6363

64-
val client = ClientFactory.clientToken(
65-
settings.url,
66-
settings.sslSettings(),
67-
settings.token
68-
)
64+
val client = ClientFactory.clientToken(settings)
6965
appsHolder = ApplicationHolder(this, client)
7066
appsHolder.onUpdate {
7167
val apps = appsHolder.get()
@@ -136,11 +132,7 @@ internal class ShareActivity : AppCompatActivity() {
136132
}
137133

138134
private fun executeMessageCall(appIndex: Int, message: Message): Boolean {
139-
val pushClient = ClientFactory.clientToken(
140-
settings.url,
141-
settings.sslSettings(),
142-
appsHolder.get()[appIndex].token
143-
)
135+
val pushClient = ClientFactory.clientToken(settings, appsHolder.get()[appIndex].token)
144136
return try {
145137
val messageApi = pushClient.createService(MessageApi::class.java)
146138
Api.execute(messageApi.createMessage(message))

0 commit comments

Comments
 (0)