| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.chrome.browser.webapps; | 5 package org.chromium.chrome.browser.webapps; |
| 6 | 6 |
| 7 import android.app.Activity; | 7 import android.app.Activity; |
| 8 import android.content.Intent; | 8 import android.content.Intent; |
| 9 import android.net.Uri; | 9 import android.net.Uri; |
| 10 import android.os.Build; | 10 import android.os.Build; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 if (webappInfo == null) return; | 56 if (webappInfo == null) return; |
| 57 | 57 |
| 58 String webappUrl = webappInfo.uri().toString(); | 58 String webappUrl = webappInfo.uri().toString(); |
| 59 String webApkPackageName = webappInfo.webApkPackageName(); | 59 String webApkPackageName = webappInfo.webApkPackageName(); |
| 60 int webappSource = webappInfo.source(); | 60 int webappSource = webappInfo.source(); |
| 61 String webappMac = IntentUtils.safeGetStringExtra(intent, ShortcutHelper
.EXTRA_MAC); | 61 String webappMac = IntentUtils.safeGetStringExtra(intent, ShortcutHelper
.EXTRA_MAC); |
| 62 | 62 |
| 63 ChromeWebApkHost.init(); | 63 ChromeWebApkHost.init(); |
| 64 boolean isValidWebApk = isValidWebApk(webApkPackageName, webappUrl); | 64 boolean isValidWebApk = isValidWebApk(webApkPackageName, webappUrl); |
| 65 | 65 |
| 66 if (isValidWebApk) { |
| 67 // {@link #isValidWebApk} checks whether the start URL sent in the i
ntent is in the |
| 68 // scope of a WebAPK but it does not check that the intent was sent
from Chrome. Unlike |
| 69 // non-WebAPK web apps, WebAPK ids are predictable. A malicious acto
r may send an intent |
| 70 // with a valid start URL and arbitrary other data. Only use the sta
rt URL, the package |
| 71 // name and the ShortcutSource from the launch intent and extract th
e remaining data |
| 72 // from the <meta-data> in the WebAPK's Android manifest. |
| 73 webappInfo = WebApkMetaDataUtils.extractWebappInfoFromWebApk( |
| 74 webApkPackageName, webappUrl, webappInfo.source()); |
| 75 |
| 76 if (webappInfo == null) return; |
| 77 } |
| 78 |
| 66 // Permit the launch to a standalone web app frame if any of the followi
ng are true: | 79 // Permit the launch to a standalone web app frame if any of the followi
ng are true: |
| 67 // - the request was for a WebAPK that is valid; | 80 // - the request was for a WebAPK that is valid; |
| 68 // - the MAC is present and valid for the homescreen shortcut to be open
ed; | 81 // - the MAC is present and valid for the homescreen shortcut to be open
ed; |
| 69 // - the intent was sent by Chrome. | 82 // - the intent was sent by Chrome. |
| 70 if (isValidWebApk || isValidMacForUrl(webappUrl, webappMac) | 83 if (isValidWebApk || isValidMacForUrl(webappUrl, webappMac) |
| 71 || wasIntentFromChrome(intent)) { | 84 || wasIntentFromChrome(intent)) { |
| 72 LaunchMetrics.recordHomeScreenLaunchIntoStandaloneActivity(webappUrl
, webappSource); | 85 LaunchMetrics.recordHomeScreenLaunchIntoStandaloneActivity(webappUrl
, webappSource); |
| 73 Intent launchIntent = createWebappLaunchIntent(webappInfo, webappSou
rce, isValidWebApk); | 86 Intent launchIntent = createWebappLaunchIntent(webappInfo, webappSou
rce, isValidWebApk); |
| 74 startActivity(launchIntent); | 87 startActivity(launchIntent); |
| 75 return; | 88 return; |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 if (webApkPackage == null || !ChromeWebApkHost.isEnabled()) { | 203 if (webApkPackage == null || !ChromeWebApkHost.isEnabled()) { |
| 191 return false; | 204 return false; |
| 192 } | 205 } |
| 193 if (!webApkPackage.equals(WebApkValidator.queryWebApkPackage(this, url))
) { | 206 if (!webApkPackage.equals(WebApkValidator.queryWebApkPackage(this, url))
) { |
| 194 Log.d(TAG, "%s is not within scope of %s WebAPK", url, webApkPackage
); | 207 Log.d(TAG, "%s is not within scope of %s WebAPK", url, webApkPackage
); |
| 195 return false; | 208 return false; |
| 196 } | 209 } |
| 197 return true; | 210 return true; |
| 198 } | 211 } |
| 199 } | 212 } |
| OLD | NEW |