Try to open browser safely. fix #694

This commit is contained in:
Karlatemp 2020-12-04 21:08:29 +08:00
parent 2d8c01ba8b
commit 0237741009
No known key found for this signature in database
GPG Key ID: 21FBDDF664FF06F8

View File

@ -38,12 +38,18 @@ public object SwingSolver : LoginSolver() {
public override suspend fun onSolveSliderCaptcha(bot: Bot, url: String): String {
return openWindow("Mirai SliderCaptcha(${bot.id})") {
JLabel("需要滑动验证码, 完成后请关闭该窗口").append()
Desktop.getDesktop().browse(URI(url))
// Try to open browser safely. #694
kotlin.runCatching {
Desktop.getDesktop().browse(URI(url))
}.onFailure {
JTextField(url).last()
}
}
}
public override suspend fun onSolveUnsafeDeviceLoginVerify(bot: Bot, url: String): String {
return openWindow("Mirai UnsafeDeviceLoginVerify(${bot.id})") {
val title = "Mirai UnsafeDeviceLoginVerify(${bot.id})"
return openWindow(title) {
JLabel(
"""
<html>
@ -53,13 +59,15 @@ public object SwingSolver : LoginSolver() {
成功后请关闭该窗口
""".trimIndent()
).append()
HyperLinkLabel(url, "设备锁验证").last()
HyperLinkLabel(url, "设备锁验证", title).last()
}
}
}
// 隔离类代码
// 在 jvm 中, 使用 WindowHelperJvm 不会加载 SwingSolverKt
// 不会触发各种 NoDefClassError
@Suppress("DEPRECATION")
internal object WindowHelperJvm {
internal val isDesktopSupported: Boolean = kotlin.run {
@ -122,19 +130,23 @@ internal class WindowInitializer(private val initializer: WindowInitializer.(JFr
}
}
internal val windowIcon: BufferedImage? by lazy {
internal val windowImage: BufferedImage? by lazy {
WindowHelperJvm::class.java.getResourceAsStream("project-mirai.png")?.use {
ImageIO.read(it)
}
}
internal val windowIcon: Icon? by lazy {
windowImage?.let(::ImageIcon)
}
internal suspend fun openWindow(title: String = "", initializer: WindowInitializer.(JFrame) -> Unit = {}): String {
return openWindow(title, WindowInitializer(initializer))
}
internal suspend fun openWindow(title: String = "", initializer: WindowInitializer = WindowInitializer {}): String {
val frame = JFrame()
frame.iconImage = windowIcon
frame.iconImage = windowImage
frame.minimumSize = Dimension(228, 62) // From Windows 10
val value = JTextField()
val def = CompletableDeferred<String>()
@ -176,18 +188,33 @@ internal suspend fun openWindow(title: String = "", initializer: WindowInitializ
}
/**
* 构造方法中url指代用户需要点击的链接, text为显示的提示内容
* @param url 打开的链接
* @param text 显示的提示内容
* @param fallbackTitle 无法打开链接时的提醒窗口标题
*/
internal class HyperLinkLabel constructor(url: String, text: String) : JLabel() {
internal class HyperLinkLabel constructor(
url: String,
text: String,
fallbackTitle: String
) : JLabel() {
init {
super.setText("<html><a href='$url'>$text</a></html>")
addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) {
// Try to open browser safely. #694
try {
Desktop.getDesktop().browse(URI(url))
} catch (ex: Exception) {
ex.printStackTrace()
JOptionPane.showInputDialog(
this@HyperLinkLabel,
"Mirai 无法直接打开浏览器, 请手动复制以下 URL 打开",
fallbackTitle,
JOptionPane.WARNING_MESSAGE,
windowIcon,
null,
url
)
}
}
})