From 06cd03435b522194d7f34a6c439ada985a088d3b Mon Sep 17 00:00:00 2001 From: Iordan Iordanov Date: Sat, 21 Nov 2015 14:45:27 -0500 Subject: [PATCH] Bug fix to do with AnonTLS and SDK >= 23 as well as better messaging in case the server only supports AnonTLS and the user's device is SDK >=23. --- .../bVNC/res/values-ru/strings.xml | 2 ++ eclipse_projects/bVNC/res/values/strings.xml | 2 ++ .../bVNC/src/com/iiordanov/bVNC/RfbProto.java | 28 ++++++++++++++++--- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/eclipse_projects/bVNC/res/values-ru/strings.xml b/eclipse_projects/bVNC/res/values-ru/strings.xml index b55c066c4..d80653a50 100644 --- a/eclipse_projects/bVNC/res/values-ru/strings.xml +++ b/eclipse_projects/bVNC/res/values-ru/strings.xml @@ -117,10 +117,12 @@ Авторизация VNC не удалась. Проверьте пароль VNC (и имя пользователя, если оно используется). Недостаточно памяти для отображения удаленного экрана. Попробуйте перезапустить приложение или перезагрузить устройство. Вы также можете уменьшить размер удаленного рабочего стола в настройках приложения. Не удалось подключиться или авторизоваться. Пожалуйста, проверьте адрес сервера, имя пользователя, пароль, сертификат и объект. +Пожалуйста, убедитесь, что вы выбрали правильный тип соединения. Не удалось подключиться или авторизоваться. Пожалуйста, проверьте адрес сервера, имя пользователя, пароль, сертификат и объект. Не удалось подключиться к RDP-серверу или авторизоваться. Пожалуйста, убедитесь, что параметры RDP-сервера, имя пользователя или пароль указаны верно, сервер включен и находится в пределах досягаемости сети, и на нем разрешено подключение через RDP. Не удалось подключиться к RDP-серверу. Подключение к сети было прервано, сервер RDP был выключен или отключен от сети, или сессия была прервана. Ошибка авторизации RDP. Пожалуйста, проверьте имя пользователя и пароль RDP, после чего повторите подключение. +Сервер не предлагают поддерживаемый тип безопасности. Не удалось подключиться к SSH-серверу. Пожалуйста, проверьте подключение к сети, а также адрес и порт SSH-сервера. ОШИБКА! Ключ безопасности сервера был изменен. Если вам известно о изменение ключей, пожалуйста, удалите и создайте заново подключение. Если нет, то возможно, что это атака типа \"Man in the middle\", не продолжайте подключение. Доступные способы: SSH-сервер не поддерживает способ авторизации \"Password\" и \"Keyboard-interactive\", или сначала надо использовать способ \"publickey\". Пожалуйста, настройте его так, чтобы поддерживался минимум 1 из 2 методов, или измените настройки bVNC. Доступные способы: diff --git a/eclipse_projects/bVNC/res/values/strings.xml b/eclipse_projects/bVNC/res/values/strings.xml index c82d602e9..98091180f 100644 --- a/eclipse_projects/bVNC/res/values/strings.xml +++ b/eclipse_projects/bVNC/res/values/strings.xml @@ -117,10 +117,12 @@ VNC authentication failed! Check VNC password (and user if applicable). Unable to allocate sufficient memory to draw remote screen. Try restarting the application, then restart your device. You can also try reducing the size of the remote desktop through the app settings. Unable to connect or authenticate, please check server address, user, password, and cert authority and subject. +Please ensure you have picked the right item in Connection Type. Unable to connect or authenticate, please check server address, password, and cert authority and subject. Could not connect to RDP server or authentication failed! Please ensure RDP Server setting and credentials are correct, the server is turned on, RDP is enabled, and that the server is on the same network as this device. RDP Connection failed! Either network connectivity was interrupted, the RDP server was turned off or disabled, or your session was taken over. RDP Authentication failed! Please check the RDP username and password and try again. +Server did not offer supported security type. Failed to connect to SSH Server. Please check network connectivity, and SSH Server address and port. ERROR! The server host key has changed. If this is intentional, please delete and recreate the connection. Otherwise, this may be a man in the middle attack. Not continuing. The SSH server supports neither \"password\" nor \"keyboard-interactive\" auth methods or requires \"publickey\" method first. Please configure it to allow at least one of the two methods, or reconfigure bVNC. Available auth methods: diff --git a/eclipse_projects/bVNC/src/com/iiordanov/bVNC/RfbProto.java b/eclipse_projects/bVNC/src/com/iiordanov/bVNC/RfbProto.java index b45ea1bc3..565c13948 100644 --- a/eclipse_projects/bVNC/src/com/iiordanov/bVNC/RfbProto.java +++ b/eclipse_projects/bVNC/src/com/iiordanov/bVNC/RfbProto.java @@ -549,6 +549,8 @@ int selectSecurityType(int bitPref, int connType) throws Exception { android.util.Log.i(TAG, "(Re)Selecting security type."); int secType = SecTypeInvalid; + int currentapiVersion = android.os.Build.VERSION.SDK_INT; + boolean secTypeTlsAndNewSdk = false; // Read the list of security types. int nSecTypes = is.readUnsignedByte(); @@ -591,20 +593,38 @@ int selectSecurityType(int bitPref, int connType) throws Exception { } } else { if (secTypes[i] == SecTypeNone || secTypes[i] == SecTypeVncAuth || - secTypes[i] == SecTypeVeNCrypt || secTypes[i] == SecTypeTLS) { + secTypes[i] == SecTypeVeNCrypt) { secType = secTypes[i]; break; } + + // Only permit SecTypeTLS if we are running on pre-Marshmallow Android releases + // since Anon DH ciphers are deprecated in API >= 23 + if (currentapiVersion < android.os.Build.VERSION_CODES.M && secTypes[i] == SecTypeTLS) { + secType = secTypes[i]; + break; + } else if (currentapiVersion >= android.os.Build.VERSION_CODES.M && secTypes[i] == SecTypeTLS) { + secTypeTlsAndNewSdk = true; + } + if ((bitPref & 1) != 0 && secTypes[i] == SecTypeArd) { secType = secTypes[i]; break; } } } - + if (secType == SecTypeInvalid) { - throw new Exception("Server did not offer supported security type. " + - "Please ensure you have picked the right item in Connection Type."); + String message; + // If the server tried to negotiate SecTypeTLS and this is an SDK >= Marshmallow, report + // the appropriate error to the user. + if (secTypeTlsAndNewSdk) { + message = canvas.getContext().getString(R.string.error_anon_dh_unsupported); + } else { + message = canvas.getContext().getString(R.string.error_security_type) + + " " + canvas.getContext().getString(R.string.error_pick_correct_item); + } + throw new Exception(message); } else { os.write(secType); }