From 62edad42ae06de58f5419da69408484195375b7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=96=E6=A4=92=E8=82=89=E4=B8=9D?= <641840315@qq.com> Date: Wed, 28 Aug 2024 16:55:10 +0800 Subject: [PATCH 1/3] =?UTF-8?q?1.=E6=96=B0=E5=A2=9E=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E7=AB=AF=E8=AF=81=E4=B9=A6=E6=9C=89=E6=95=88?= =?UTF-8?q?=E6=80=A7=202.=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../ui/activity/CasCloudLoginActivity.java | 34 ++++++++ .../cloudapp/utils/CasConstantsUtil.java | 2 +- .../huawei/cloudapp/utils/CasHttpUtils.java | 81 ++++++++++++++----- 4 files changed, 95 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 9d4a82a..c5c13fb 100644 --- a/README.md +++ b/README.md @@ -211,7 +211,7 @@ implementation 'org.bouncycastle:bcprov-jdk15to18:1.71' | auth_ts | 是 | String | 验签时间戳 | | background_timeout | 是 | String | 页面非活跃状态超时时长 (取值\[16, 3600\],单位是s) | | available_playtime | 是 | String | 单次连接可用时长 (值为0时,无超时判断) | - | touch_timeout | 否 | String | 单次连接可用时长 (值为0时,无超时判断) | + | touch_timeout | 否 | String | 无触控时长 (值为0时,无超时判断) | | user_id | 否 | String | 用户id | | client_mode | 是 | String | direct/management | | region_id | 否 | String | 云手机所在region的id | diff --git a/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudLoginActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudLoginActivity.java index 056d0d9..4546599 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudLoginActivity.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudLoginActivity.java @@ -31,7 +31,9 @@ import static com.huawei.cloudapp.utils.CasConstantsUtil.USERNAME; import static com.huawei.cloudapp.utils.CasConstantsUtil.USER_INFO; import android.app.Activity; +import android.content.Context; import android.content.Intent; +import android.content.res.AssetManager; import android.os.Bundle; import android.util.Log; @@ -48,7 +50,13 @@ import com.huawei.cloudapp.presenter.UserPresenter; import com.huawei.cloudapp.ui.views.MaterialLoginView; import com.huawei.cloudapp.utils.CasAESKeystoreUtils; import com.huawei.cloudapp.utils.CasCommonUtils; +import com.huawei.cloudapp.utils.CasHttpUtils; +import java.io.IOException; +import java.io.InputStream; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; import java.util.HashMap; import java.util.List; @@ -56,6 +64,7 @@ import java.util.List; public class CasCloudLoginActivity extends Activity implements IHandleData { private static final String TAG = "CasCloudLoginActivity"; + private static final String CERT_DIR = "certificates"; private MaterialLoginView loginView; private CasRecord mUserRecord; private UserPresenter mUserPresenter; @@ -81,9 +90,34 @@ public class CasCloudLoginActivity extends Activity implements IHandleData selectedRegion = REGION_NAME.get(Integer.parseInt(selectedRegionPosition)); } } + loadCertificates(this); initView(); } + private void loadCertificates(Context context) { + AssetManager assetManager = context.getAssets(); + String[] certificates; + try { + certificates = assetManager.list(CERT_DIR); + } catch (IOException e) { + Log.e(TAG, "get certificates failed."); + e.printStackTrace(); + return; + } + try { + CertificateFactory cf = CertificateFactory.getInstance("X.509"); + for (String certificate : certificates) { + InputStream in = assetManager.open(CERT_DIR + "/" + certificate); + CasHttpUtils.addCertificate((X509Certificate) cf.generateCertificate(in)); + in.close(); + } + } catch (CertificateException e) { + throw new RuntimeException(e); + } catch (IOException e) { + e.printStackTrace(); + } + } + private void initView() { setContentView(R.layout.activity_cas_cloud_login); loginView = findViewById(R.id.login); diff --git a/app/src/main/java/com/huawei/cloudapp/utils/CasConstantsUtil.java b/app/src/main/java/com/huawei/cloudapp/utils/CasConstantsUtil.java index 3ecbdc9..f4a3949 100644 --- a/app/src/main/java/com/huawei/cloudapp/utils/CasConstantsUtil.java +++ b/app/src/main/java/com/huawei/cloudapp/utils/CasConstantsUtil.java @@ -221,7 +221,7 @@ public class CasConstantsUtil { public static final String PERSONAL = "personal"; public static final String ENTERPRISE = "enterprise"; - public static final String MANAGEMENT_DEV_ENV_URL = "https://140.210.196.28:18000"; + public static final String MANAGEMENT_DEV_ENV_URL = "https://139.9.235.129:18000"; public static final String MANAGEMENT_PROD_ENV_URL = "https://139.9.146.101:18000"; public static final String PHONE = "phone"; public static final String LIST = "list"; diff --git a/app/src/main/java/com/huawei/cloudapp/utils/CasHttpUtils.java b/app/src/main/java/com/huawei/cloudapp/utils/CasHttpUtils.java index fb608e1..ce6837a 100644 --- a/app/src/main/java/com/huawei/cloudapp/utils/CasHttpUtils.java +++ b/app/src/main/java/com/huawei/cloudapp/utils/CasHttpUtils.java @@ -2,6 +2,7 @@ package com.huawei.cloudapp.utils; import android.os.Handler; import android.os.Message; +import android.util.Base64; import android.util.Log; import androidx.annotation.NonNull; @@ -9,9 +10,17 @@ import androidx.annotation.NonNull; import java.io.IOException; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.security.cert.CertificateExpiredException; +import java.security.cert.CertificateNotYetValidException; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; @@ -29,6 +38,11 @@ public class CasHttpUtils { public static final String TAG = "CasHttpUtils"; public static final MediaType JSON = MediaType.get("application/json"); + private static final List TRUSTED_CERTS = new ArrayList<>(); + + public static void addCertificate(X509Certificate cert) { + TRUSTED_CERTS.add(cert); + } public static void post(String url, Map header, String json, Handler handler, int msgCode) { RequestBody body = RequestBody.create(json, JSON); @@ -44,24 +58,25 @@ public class CasHttpUtils { .post(body) .build(); - OKHttpClientBuilder.buildOKHttpClient().build().newCall(request).enqueue(new Callback() { - @Override - public void onFailure(@NonNull Call call, @NonNull IOException e) { - Message message = new Message(); - message.what = msgCode; - message.obj = null; - handler.sendMessage(message); - Log.e(TAG, "Failed to get response."); - } + OKHttpClientBuilder.buildOKHttpClient(request.url().host()) + .build().newCall(request).enqueue(new Callback() { + @Override + public void onFailure(@NonNull Call call, @NonNull IOException e) { + Message message = new Message(); + message.what = msgCode; + message.obj = null; + handler.sendMessage(message); + Log.e(TAG, "Failed to get response."); + } - @Override - public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { - Message message = new Message(); - message.what = msgCode; - message.obj = response.body().string(); - handler.sendMessage(message); - } - }); + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { + Message message = new Message(); + message.what = msgCode; + message.obj = response.body().string(); + handler.sendMessage(message); + } + }); } public static void post(String url, Map header, String bodyStr, Callback callback) { @@ -78,7 +93,7 @@ public class CasHttpUtils { .post(body) .build(); - OKHttpClientBuilder.buildOKHttpClient() + OKHttpClientBuilder.buildOKHttpClient(request.url().host()) .callTimeout(10, TimeUnit.SECONDS) .connectTimeout(30, TimeUnit.SECONDS) .build().newCall(request).enqueue(callback); @@ -95,14 +110,14 @@ public class CasHttpUtils { Request request = builder.url(url) .build(); - OKHttpClientBuilder.buildOKHttpClient() + OKHttpClientBuilder.buildOKHttpClient(request.url().host()) .callTimeout(10, TimeUnit.SECONDS) .connectTimeout(30, TimeUnit.SECONDS) .build().newCall(request).enqueue(callback); } public static class OKHttpClientBuilder { - public static OkHttpClient.Builder buildOKHttpClient() { + public static OkHttpClient.Builder buildOKHttpClient(String serverHost) { try { TrustManager[] trustAllCerts = buildTrustManagers(); final SSLContext sslContext = SSLContext.getInstance("SSL"); @@ -111,7 +126,10 @@ public class CasHttpUtils { final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]); - builder.hostnameVerifier((hostname, session) -> true); + builder.hostnameVerifier((hostname, session) -> { + HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier(); + return hv.verify(serverHost, session) || serverHost.equals(hostname); + }); return builder; } catch (NoSuchAlgorithmException | KeyManagementException e) { e.printStackTrace(); @@ -127,7 +145,26 @@ public class CasHttpUtils { } @Override - public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) { + public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { + for (java.security.cert.X509Certificate cert : chain) { + try { + cert.checkValidity(); + } catch (CertificateExpiredException | CertificateNotYetValidException e) { + Log.e(TAG, "certificate [" + cert.getSubjectDN() + "] check failed, error msg: " + e.getMessage()); + e.printStackTrace(); + throw e; + } + String publicKey = Base64.encodeToString(cert.getPublicKey().getEncoded(), Base64.DEFAULT); + for (X509Certificate trustedCert : TRUSTED_CERTS) { + String trustedPublicKey = Base64.encodeToString(trustedCert.getPublicKey().getEncoded(), Base64.DEFAULT); + if (trustedPublicKey.equalsIgnoreCase(publicKey)) { + Log.i(TAG, "verify certificate success: " + cert.getSubjectDN()); + return; + } + } + } + Log.e(TAG, "Failed to verify the certificate public key."); + throw new CertificateException("Failed to verify the certificate public key."); } @Override -- Gitee From df10005f6e057257318d7b1811a4de69866a34d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=96=E6=A4=92=E8=82=89=E4=B8=9D?= <641840315@qq.com> Date: Wed, 28 Aug 2024 17:26:55 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E8=A1=A5=E5=85=85=E4=BF=A1=E4=BB=BB?= =?UTF-8?q?=E8=AF=81=E4=B9=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/certificates/CPH_background.crt | 20 ++++++++++++++ .../assets/certificates/myhuaweicloud.com.crt | 26 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 app/src/main/assets/certificates/CPH_background.crt create mode 100644 app/src/main/assets/certificates/myhuaweicloud.com.crt diff --git a/app/src/main/assets/certificates/CPH_background.crt b/app/src/main/assets/certificates/CPH_background.crt new file mode 100644 index 0000000..c623aeb --- /dev/null +++ b/app/src/main/assets/certificates/CPH_background.crt @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDTzCCAjegAwIBAgIEE9aETzANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJD +TjEPMA0GA1UECBMGU2hhblhpMQ0wCwYDVQQHEwRYaUFuMQswCQYDVQQKEwJIdzEO +MAwGA1UECxMFQ2xvdWQxDDAKBgNVBAMTA0NQSDAeFw0yMzA5MTIwOTE1MThaFw0y +NDA5MTEwOTE1MThaMFgxCzAJBgNVBAYTAkNOMQ8wDQYDVQQIEwZTaGFuWGkxDTAL +BgNVBAcTBFhpQW4xCzAJBgNVBAoTAkh3MQ4wDAYDVQQLEwVDbG91ZDEMMAoGA1UE +AxMDQ1BIMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk5yb2RQ9VcMd +pQkN7Byzlf7zHvR39cODEI+BFTez4c8r3Vz4eHfWPJZ/DlFkjziClYm2xIvwcKw0 +/SLhbq4U6E+l9TeNGvri9OOTQpM9Im0LGdduISLOk3lvhneb2VwM5Lc4ALLKiUkZ +/TtMxPvtcP/DlLHeF+opJ77r2Ahj+15pHevCYYzurFd6gCPBLW3pZKqog/etB1ny +5IrgdT9vhoG6JrZoHH+rXfI7jd7jN8CAiqvcF68hjrhfo9FkykOWu0y4HqVGEalK +8c1aXJVAaZSbgv2ZFXiyqYXqLPaJwHpcj9zaeFc14AdP+IHIiUUFY8eV3Lxn777y +JbISvUec0QIDAQABoyEwHzAdBgNVHQ4EFgQUAxS4CzBzwrBCfTftK8zyuf/ljQMw +DQYJKoZIhvcNAQELBQADggEBAHiOb5ltN3XG90/63vDL2dJzAnBHLDCAXATWQPtl +F0TBtMYVNho/X9eaCGjE25BeWhcbtFSTgV4q9wWwXjM88cgFW4swUGNqdCCFe+cB +cd4ETF+M6rmN5GsgLT8SStH0F++uLfVDUpidgIe4AdVIdIogtBS3/3svg73JxWt6 +kuY7g3PBGWjlbgL5xFF+xkKMWOiVI5dedHyh4Xf7CDD71HHY+9Hr5Cl+whYNFvK8 +StgVVLQq1V24hIX+KxsXMAV3jjzzDKRP9xX8fny7bmJVUx4Pq8q6jWW5zU2mk38o +0LQ85LCmwImWLdwMI4e+8G3VHHUDsLZ3S3r6UvXFjSOGhxo= +-----END CERTIFICATE----- diff --git a/app/src/main/assets/certificates/myhuaweicloud.com.crt b/app/src/main/assets/certificates/myhuaweicloud.com.crt new file mode 100644 index 0000000..619b81c --- /dev/null +++ b/app/src/main/assets/certificates/myhuaweicloud.com.crt @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE----- +MIIETjCCAzagAwIBAgINAe5fIh38YjvUMzqFVzANBgkqhkiG9w0BAQsFADBMMSAw +HgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFs +U2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjAeFw0xODExMjEwMDAwMDBaFw0yODEx +MjEwMDAwMDBaMFAxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52 +LXNhMSYwJAYDVQQDEx1HbG9iYWxTaWduIFJTQSBPViBTU0wgQ0EgMjAxODCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKdaydUMGCEAI9WXD+uu3Vxoa2uP +UGATeoHLl+6OimGUSyZ59gSnKvuk2la77qCk8HuKf1UfR5NhDW5xUTolJAgvjOH3 +idaSz6+zpz8w7bXfIa7+9UQX/dhj2S/TgVprX9NHsKzyqzskeU8fxy7quRU6fBhM +abO1IFkJXinDY+YuRluqlJBJDrnw9UqhCS98NE3QvADFBlV5Bs6i0BDxSEPouVq1 +lVW9MdIbPYa+oewNEtssmSStR8JvA+Z6cLVwzM0nLKWMjsIYPJLJLnNvBhBWk0Cq +o8VS++XFBdZpaFwGue5RieGKDkFNm5KQConpFmvv73W+eka440eKHRwup08CAwEA +AaOCASkwggElMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMB0G +A1UdDgQWBBT473/yzXhnqN5vjySNiPGHAwKz6zAfBgNVHSMEGDAWgBSP8Et/qC5F +JK5NUPpjmove4t0bvDA+BggrBgEFBQcBAQQyMDAwLgYIKwYBBQUHMAGGImh0dHA6 +Ly9vY3NwMi5nbG9iYWxzaWduLmNvbS9yb290cjMwNgYDVR0fBC8wLTAroCmgJ4Yl +aHR0cDovL2NybC5nbG9iYWxzaWduLmNvbS9yb290LXIzLmNybDBHBgNVHSAEQDA+ +MDwGBFUdIAAwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFsc2lnbi5j +b20vcmVwb3NpdG9yeS8wDQYJKoZIhvcNAQELBQADggEBAJmQyC1fQorUC2bbmANz +EdSIhlIoU4r7rd/9c446ZwTbw1MUcBQJfMPg+NccmBqixD7b6QDjynCy8SIwIVbb +0615XoFYC20UgDX1b10d65pHBf9ZjQCxQNqQmJYaumxtf4z1s4DfjGRzNpZ5eWl0 +6r/4ngGPoJVpjemEuunl1Ig423g7mNA2eymw0lIYkN5SQwCuaifIFJ6GlazhgDEw +fpolu4usBCOmmQDo8dIm7A9+O4orkjgTHY+GzYZSR+Y0fFukAj6KYXwidlNalFMz +hriSqHKvoflShx8xpfywgVcvzfTO3PYkz6fiNJBonf6q8amaEsybwMbDqKWwIX7e +SPY= +-----END CERTIFICATE----- -- Gitee From 6bd589c0eaed13ab367c856100314c2973ebbb22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=96=E6=A4=92=E8=82=89=E4=B8=9D?= <641840315@qq.com> Date: Thu, 19 Sep 2024 10:45:16 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/certificates/CPH_background.crt | Bin 1208 -> 853 bytes .../ui/activity/CasCloudLoginActivity.java | 6 +++++- .../ui/activity/CasCloudPhoneActivity.java | 4 ++++ .../ui/fragment/home/PhoneListFragment.java | 4 ++++ app/src/main/res/values/strings.xml | 1 + 5 files changed, 14 insertions(+), 1 deletion(-) diff --git a/app/src/main/assets/certificates/CPH_background.crt b/app/src/main/assets/certificates/CPH_background.crt index c623aeb0229dde5218c289d5d0cf5204367aa3d2..c608aceee97cd464007bf8107c416d7d9cf10446 100644 GIT binary patch literal 853 zcmXqLVh%KDVzOMo%*4pV#1ec`V!i<{8>d#AN85K^Mn-N{27^dLZUas>=1>+kVJ2rk zLjeOm5QjsUJvbvVF)t$1kk^14B*HGt5|Qbc2UE=@%;ZsS$Y;OTNaM6;JQ%h>>dlS2%$EWW z?>20ZH%{Z#(u`;p{F8QzC)mH>_cxO-0iPH1+0R|!r7%rs^_I7mYyL1aWW0T4u(ajC zj;7~_+I;2z9qYQ~_|v^xt^HxVxX5Sq2LbHOQ~jsC^}pO4&0ct9ugs=HCtU2D_PpCs z-|RPeMZ(%Ad#`7E#R+sxt}6Za>1*ZBmWv8+B)v|~{%CmScsuuuoYykvmvVJZU>4t9 zeC_YD_kTUrME@$q?XZiG557~!FFNC6DRkCk%{Xq*;!k+OhkVd=-5cUm3Ka#Nh% zOrCg2)5fjhq0TR@NfYC5|ut1xA=GABz}^Na&??7TX`%9*V2&IHlS* zzio4BR5fxS0#gex5E&W#1?8T6`0Jwdk6+dBd*@U~i}a1ZvjrAkm>lVwesZS$8IR7l z8{ez+Y7}+~_vF5{d{Aw*<;LYDKcn_dT(+BeQ5XwXgyd7+>)yw%WK9mv<6a{4w_`7p zN@$Vd@-IJ6`< z1arpk!saXj6<375h38gI!GX35l{jiB2W>byx0VE7E!T|@SH`>?pu=r^ey6lMMmn; zp1|t&f;<9Uux8v8=(lW&#WvbGhWQflpeVYks`(NWQ0bp$dZi4S~yY}9D3_AU_Uwm>aDOf38co!J( zHJuK|u%6 zZQHx9e9I2hXiK9FOdA}pLqV2i)83jxZ;|fRt<$IS(%fs};N8iS%woRFRteZ`!+kw0 zwj?{gu6cI#H@lT^FGXujyNVQZ4U`+1y7U;wBsZ%>^~W#6FkaGXPs1Uu3WZYyIDq{N z3wHwLcY9r~VN&xLjG<;va1u9YAELvj-||&>VW)3xthQibbVxl3`8m4JWdi(BKTl=5;XlRv#Oo#w0NPzDs77W zgM?9?Xje<5B5Rpx7Bxw=yNI3OTG}?LTN+nOWM~D7^*Y%KGcS~8q>#8>Ylk#s~hN~?P*{8`bda8b{AZ=VG{r+z6I)hgL^)WmgTboaMvsNR { @@ -257,8 +259,10 @@ public class CasCloudLoginActivity extends Activity implements IHandleData toastStr = getResources().getString(R.string.no_permission); } else if (e instanceof CustomException.ServerError) { toastStr = getResources().getString(R.string.service_internal_error); - } else if (e instanceof CustomException.ServiceUnavailableException) { + } else if (e instanceof CustomException.ServiceUnavailableException) { toastStr = getResources().getString(R.string.cas_phone_connect_server_fail_tip_message); + } else if (e instanceof SSLHandshakeException) { + toastStr = getResources().getString(R.string.cas_phone_certificate_exception_tip_message); } else { toastStr = getResources().getString(R.string.failed_to_login); Log.e(TAG, "handleError: ", e); diff --git a/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java index 5ccf1b3..53755eb 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java @@ -135,6 +135,8 @@ import java.util.List; import java.util.Timer; import java.util.TimerTask; +import javax.net.ssl.SSLHandshakeException; + public class CasCloudPhoneActivity extends FragmentActivity implements IHandleData { private static final String TAG = "CasCloudPhoneActivity"; @@ -1135,6 +1137,8 @@ public class CasCloudPhoneActivity extends FragmentActivity implements IHandleDa } else if (e instanceof CustomException.ParamInvalidException || e instanceof CustomException.ResourceNotFoundException) { message = getResources().getString(R.string.param_invalid); + } else if (e instanceof SSLHandshakeException) { + message = getResources().getString(R.string.cas_phone_certificate_exception_tip_message); } else { message = getResources().getString(R.string.request_failed); } diff --git a/app/src/main/java/com/huawei/cloudapp/ui/fragment/home/PhoneListFragment.java b/app/src/main/java/com/huawei/cloudapp/ui/fragment/home/PhoneListFragment.java index b369e65..245c2e9 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/fragment/home/PhoneListFragment.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/fragment/home/PhoneListFragment.java @@ -96,6 +96,8 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; +import javax.net.ssl.SSLHandshakeException; + public class PhoneListFragment extends CloudPhoneFragment implements IHandleData, OnRefreshListener, OnLoadMoreListener { private static final String TAG = "PhoneListFragment"; @@ -854,6 +856,8 @@ public class PhoneListFragment extends CloudPhoneFragment implements IHandleData e instanceof CustomException.ServerNotFoundException || e instanceof CustomException.ResourceNotFoundException) { message = getResources().getString(R.string.param_invalid); + } else if (e instanceof SSLHandshakeException) { + message = getResources().getString(R.string.cas_phone_certificate_exception_tip_message); } else { message = getResources().getString(R.string.request_failed); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ede62b7..f61ab51 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -29,6 +29,7 @@ 初始化状态错误,请重试 初始化失败,请重试 登录信息失效,请重新登录 + 证书错误,请使用最新版客户端 云手机ip: 进入云手机 云手机port: -- Gitee