Skip to content

Commit bb42f95

Browse files
committed
Implemented connect to localhost with ssh-tunneling warning dialog
1 parent f834ce5 commit bb42f95

File tree

11 files changed

+70
-13
lines changed

11 files changed

+70
-13
lines changed

core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/url/UrlValidatorImpl.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,6 @@ internal class UrlValidatorImpl : UrlValidator {
1919
isValid = false,
2020
validationError = UrlValidator.Error.BadScheme,
2121
)
22-
input.contains(LOCALHOST_IPV4) -> ValidationResult(
23-
isValid = false,
24-
validationError = UrlValidator.Error.Localhost,
25-
)
2622
!URLUtil.isValidUrl(input) -> ValidationResult(
2723
isValid = false,
2824
validationError = UrlValidator.Error.Invalid,
@@ -31,6 +27,10 @@ internal class UrlValidatorImpl : UrlValidator {
3127
isValid = false,
3228
validationError = UrlValidator.Error.Invalid,
3329
)
30+
input.contains(LOCALHOST_IPV4) -> ValidationResult(
31+
isValid = false,
32+
validationError = UrlValidator.Error.Localhost,
33+
)
3434
else -> ValidationResult(isValid = true)
3535
}
3636

presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/ModalRenderer.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ fun ModalRenderer(
192192
onDismissRequest = dismiss,
193193
)
194194

195-
Modal.ExportInProgress -> ProgressDialog(
195+
Modal.ExportInProgress -> ProgressDialog(
196196
titleResId = R.string.exporting_progress_title,
197197
subTitleResId = R.string.exporting_progress_sub_title,
198198
canDismiss = false,
@@ -242,5 +242,14 @@ fun ModalRenderer(
242242
onDismissRequest = dismiss,
243243
onResult = { processIntent(ImageToImageIntent.UpdateImage(it)) }
244244
)
245+
246+
Modal.ConnectLocalHost -> DecisionInteractiveDialog(
247+
title = R.string.interaction_warning_title.asUiText(),
248+
text = R.string.interaction_warning_localhost_sub_title.asUiText(),
249+
confirmActionResId = R.string.yes_i_did,
250+
dismissActionResId = R.string.cancel,
251+
onConfirmAction = { processIntent(ServerSetupIntent.ConnectToLocalHost) },
252+
onDismissRequest = dismiss,
253+
)
245254
}
246255
}

presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/Modal.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ sealed interface Modal {
2222

2323
data object ExportInProgress : Modal
2424

25+
data object ConnectLocalHost : Modal
26+
2527

2628
@Immutable
2729
data class SelectSdModel(val models: List<String>, val selected: String) : Modal
@@ -64,13 +66,13 @@ sealed interface Modal {
6466
sealed interface Image : Modal {
6567

6668
@Immutable
67-
data class Single(val result: AiGenerationResult, val autoSaveEnabled: Boolean): Image
69+
data class Single(val result: AiGenerationResult, val autoSaveEnabled: Boolean) : Image
6870

6971
@Immutable
70-
data class Batch(val results: List<AiGenerationResult>, val autoSaveEnabled: Boolean): Image
72+
data class Batch(val results: List<AiGenerationResult>, val autoSaveEnabled: Boolean) : Image
7173

7274
@Immutable
73-
data class Crop(val bitmap: Bitmap): Image
75+
data class Crop(val bitmap: Bitmap) : Image
7476

7577
companion object {
7678
fun create(list: List<AiGenerationResult>, autoSaveEnabled: Boolean): Image =

presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupIntent.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ sealed interface ServerSetupIntent : MviIntent {
4646

4747
data object LaunchManageStoragePermission : ServerSetupIntent
4848

49+
data object ConnectToLocalHost : ServerSetupIntent
50+
4951
sealed class LaunchUrl : ServerSetupIntent, KoinComponent {
5052

5153
protected val linksProvider: LinksProvider by inject()

presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupViewModel.kt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,26 @@ class ServerSetupViewModel(
200200
is ServerSetupIntent.UpdateStabilityAiApiKey -> updateState {
201201
it.copy(stabilityAiApiKey = intent.key)
202202
}
203+
204+
ServerSetupIntent.ConnectToLocalHost -> {
205+
connectToLocalHostWithSSH()
206+
}
207+
}
208+
209+
private fun connectToLocalHostWithSSH() {
210+
emitEffect(ServerSetupEffect.HideKeyboard)
211+
!connectToAutomaticInstance()
212+
.doOnSubscribe { setScreenModal(Modal.Communicating(canCancel = false)) }
213+
.subscribeOnMainThread(schedulersProvider)
214+
.subscribeBy(::errorLog) { result ->
215+
result.fold(
216+
onSuccess = { onSetupComplete() },
217+
onFailure = { t ->
218+
val message = t.localizedMessage ?: "Bad key"
219+
setScreenModal(Modal.Error(message.asUiText()))
220+
}
221+
)
222+
}
203223
}
204224

205225
private fun connectToServer() {
@@ -243,6 +263,9 @@ class ServerSetupViewModel(
243263
)
244264
isValid = isValid && loginValidation.isValid && passwordValidation.isValid
245265
}
266+
if (serverUrlValidation.validationError is UrlValidator.Error.Localhost) {
267+
newState = it.copy(screenModal = Modal.ConnectLocalHost)
268+
}
246269
newState
247270
}
248271
isValid

presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/mappers/ServerSetupValidationUrlMapper.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ fun ValidationResult<UrlValidator.Error>.mapToUi(): UiText? {
1212
UrlValidator.Error.BadScheme -> R.string.error_invalid_scheme
1313
UrlValidator.Error.Empty -> R.string.error_empty_url
1414
UrlValidator.Error.Invalid -> R.string.error_invalid_url
15-
UrlValidator.Error.Localhost -> R.string.error_localhost_url
16-
}.asUiText()
15+
UrlValidator.Error.Localhost -> null
16+
}?.asUiText()
1717
}

presentation/src/main/res/values-ru/strings.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<string name="locale">ru</string>
66
<string name="ok">OK</string>
77
<string name="yes">Да</string>
8+
<string name="yes_i_did">Да, я это сделал</string>
89
<string name="no">Нет</string>
910
<string name="cancel">Отмена</string>
1011
<string name="retry">Повторить</string>
@@ -208,6 +209,9 @@
208209
<string name="interaction_export_sub_title">Эта функция экспортирует все изображения галереи в архив *.zip. Этот процесс может длиться долго, если у вас много изображений. Хотите продолжить?</string>
209210
<string name="interaction_cache_sub_title">Это приведет к сбросу настроек программы и удалению всех созданных изображений. Вы хотите продолжить?</string>
210211

212+
<string name="interaction_warning_title">Предупреждение</string>
213+
<string name="interaction_warning_localhost_sub_title">Если вы хотите подключиться к вашему локальному серверу (127.0.0.1), убедитесь, что у вас включено SSH-туннелирование в целях безопасности!</string>
214+
211215
<string name="interaction_delete_generation_title">Удалить изображение</string>
212216
<string name="interaction_delete_generation_sub_title">Вы уверены, что хотите окончательно удалить это изображение?</string>
213217

presentation/src/main/res/values-tr/strings.xml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<string name="locale">tr</string>
66
<string name="ok">Tamam</string>
77
<string name="yes">Evet</string>
8+
<string name="yes_i_did">Evet, yaptım</string>
89
<string name="no">Hayır</string>
910
<string name="cancel">İptal</string>
1011
<string name="retry">yeniden dene</string>
@@ -95,7 +96,7 @@
9596
<string name="hint_server_setup_title">Lütfen Stable Diffusion WebUI(AUTOMATIC1111) URL adresinizi yazın.</string>
9697
<string name="hint_valid_urls">Bazı sunucu örnekleri:\n• http://192.168.0.2:7860\n• http://alanadiniz.com:7860\n• https://alanadiniz.com</string>
9798
<string name="hint_demo_mode">This mode allows you to test the application behavior, even if you don\'t have Stable Diffusion WebUI server.\n\nIn demo mode app ignores user prompt, does not use AI server, and returns some mock images.</string>
98-
<string name="hint_args_warning" tools:ignore="TypographyDashes">Before connecting ensure that:\n• you are running AUTOMATIC1111 WebUI with flags --api --listen\n• your firewall is not blocking 7860 port\n• phone is on the same WiFi with your PC</string>
99+
<string name="hint_args_warning" tools:ignore="TypographyDashes,Typos">Before connecting ensure that:\n• you are running AUTOMATIC1111 WebUI with flags --api --listen\n• your firewall is not blocking 7860 port\n• phone is on the same WiFi with your PC</string>
99100

100101
<string name="hint_server_horde_title">Horde AI bulutuna bağlanın</string>
101102
<string name="hint_server_horde_sub_title">Horde AI, Görüntü oluşturma çalışanları ve metin oluşturma çalışanlarından oluşan kitle kaynaklı dağıtılmış bir kümedir.</string>
@@ -128,7 +129,7 @@
128129
<string name="home_tab_settings">Ayarlar</string>
129130

130131
<string name="gallery_tab_image">Resim</string>
131-
<string name="gallery_tab_original">Orjinal</string>
132+
<string name="gallery_tab_original">Orijinal</string>
132133
<string name="gallery_tab_info">Bilgi</string>
133134

134135
<string name="title_text_to_image">Yazıdan Resime</string>
@@ -208,6 +209,9 @@
208209
<string name="interaction_export_sub_title">Bu işlem bütün galerideki resimleri tek bir .zip arşivi dosyası olarak dışa aktaracaktır. Galerinizin boyutuna göre bu işlem uzun bir zaman alabailir. Devam etmek istiyor musunuz?</string>
209210
<string name="interaction_cache_sub_title">Bu işlem bütün uygulama ayarlarını ve oluşturulan resimleri silecektir. Devam etmek istiyor musunuz?</string>
210211

212+
<string name="interaction_warning_title">Uyarı</string>
213+
<string name="interaction_warning_localhost_sub_title">Eğer localhost (127.0.0.1) sunucunuza bağlanmak istiyorsanız, lütfen güvenlik için ssh tünellemesinin etkinleştirildiğinden emin olun!</string>
214+
211215
<string name="interaction_delete_generation_title">Resmi sil</string>
212216
<string name="interaction_delete_generation_sub_title">Kalıcı olarak bu resmi silmek istediğinize emin misiniz?</string>
213217

presentation/src/main/res/values-uk/strings.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<string name="locale">uk</string>
66
<string name="ok">OK</string>
77
<string name="yes">Так</string>
8+
<string name="yes_i_did">Так, я зробив</string>
89
<string name="no">Ні</string>
910
<string name="cancel">Скасувати</string>
1011
<string name="retry">Повторити</string>
@@ -208,6 +209,9 @@
208209
<string name="interaction_export_sub_title">Ця функція експортує всі зображення галереї у архів *.zip. Цей процес може тривати довго, якщо у вас багато зображень. Бажаєте продовжити?</string>
209210
<string name="interaction_cache_sub_title">Це призведе до скидання налаштувань програми та видалення всіх створених зображень. Ви бажаєте продовжити?</string>
210211

212+
<string name="interaction_warning_title">Попередження</string>
213+
<string name="interaction_warning_localhost_sub_title">Якщо ви хочете підключитися до свого сервера localhost (127.0.0.1), будь ласка, переконайтеся, що у вас увімкнено тунелювання ssh з міркувань безпеки!</string>
214+
211215
<string name="interaction_delete_generation_title">Видалити зображення</string>
212216
<string name="interaction_delete_generation_sub_title">Ви впевнені, що хочете остаточно видалити це зображення?</string>
213217

presentation/src/main/res/values-zh/strings.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
<string name="locale">zh</string>
1111
<string name="ok">确定</string>
1212
<string name="yes">是</string>
13+
<string name="yes_i_did">是的,我做到了</string>
1314
<string name="no">否</string>
1415
<string name="cancel">取消</string>
1516
<string name="retry">重试</string>
@@ -255,6 +256,10 @@
255256
<string name="interaction_export_sub_title">这将把所有图库图像导出为*.zip压缩包。此过程可能很长,如果您有很多图片,您想继续吗?</string>
256257
<string name="interaction_cache_sub_title">这将重置应用设置并删除所有生成的图像。您想继续吗?</string>
257258

259+
<!-- 警告互动 -->
260+
<string name="interaction_warning_title">警告性的</string>
261+
<string name="interaction_warning_localhost_sub_title">如果您想连接到本地主机(127.0.0.1)服务器,请确保您已启用 ssh 隧道以确保安全!</string>
262+
258263
<!-- 删除图像提示 -->
259264
<string name="interaction_delete_generation_title">删除图像</string>
260265
<string name="interaction_delete_generation_sub_title">您确定要永久删除此图像吗?</string>

presentation/src/main/res/values/strings.xml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<string name="locale">en</string>
1010
<string name="ok">OK</string>
1111
<string name="yes">Yes</string>
12+
<string name="yes_i_did">Yes, I did</string>
1213
<string name="no">No</string>
1314
<string name="cancel">Cancel</string>
1415
<string name="retry">Retry</string>
@@ -111,7 +112,7 @@
111112
<string name="hint_server_setup_title">Provide your Stable Diffusion WebUI URL</string>
112113
<string name="hint_valid_urls">Here are the examples of server URLs:\n• http://192.168.0.2:7860\n• http://yourdomain.com:7860\n• https://yourdomain.com</string>
113114
<string name="hint_demo_mode">This mode allows you to test the application behavior, even if you don\'t have Stable Diffusion WebUI server.\n\nIn demo mode app ignores user prompt, does not use AI server, and returns some mock images.</string>
114-
<string name="hint_args_warning" tools:ignore="TypographyDashes">Before connecting ensure that:\n• you are running AUTOMATIC1111 WebUI with flags --api --listen\n• your firewall is not blocking 7860 port\n• phone is on the same WiFi with your PC</string>
115+
<string name="hint_args_warning" tools:ignore="TypographyDashes,Typos">Before connecting ensure that:\n• you are running AUTOMATIC1111 WebUI with flags --api --listen\n• your firewall is not blocking 7860 port\n• phone is on the same WiFi with your PC</string>
115116

116117
<string name="hint_server_horde_title">Connect to Horde AI cloud</string>
117118
<string name="hint_server_horde_sub_title">Horde AI is a crowdsourced distributed cluster of Image generation workers and text generation workers.</string>
@@ -227,6 +228,9 @@
227228
<string name="interaction_export_sub_title">This will export all the gallery images as *.zip archive. This process may be long if you have many images, would you like to proceed?</string>
228229
<string name="interaction_cache_sub_title">This will reset app settings and delete all the generated images. Do you want to proceed?</string>
229230

231+
<string name="interaction_warning_title">Warning</string>
232+
<string name="interaction_warning_localhost_sub_title">If you want to connect to your localhost (127.0.0.1) server, please make sure that you have ssh tunneling enabled for security!</string>
233+
230234
<string name="interaction_delete_generation_title">Delete image</string>
231235
<string name="interaction_delete_generation_sub_title">Are you sure you want to permanently delete this image?</string>
232236

0 commit comments

Comments
 (0)