cast_permission_manager.cc 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  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
  3. // found in the LICENSE file.
  4. #include "chromecast/browser/cast_permission_manager.h"
  5. #include "base/callback.h"
  6. #include "base/logging.h"
  7. #include "chromecast/base/metrics/cast_metrics_helper.h"
  8. #include "chromecast/browser/cast_permission_user_data.h"
  9. #include "chromecast/common/activity_url_filter.h"
  10. #include "content/public/browser/permission_controller.h"
  11. #include "content/public/browser/web_contents.h"
  12. #include "third_party/blink/public/common/permissions/permission_utils.h"
  13. namespace {
  14. bool IsRequestingOriginAllowed(
  15. const GURL& requesting_origin,
  16. const GURL& app_web_url,
  17. const std::vector<std::string>& additional_feature_permission_origins) {
  18. // |app_web_url| is allowed by default.
  19. if (requesting_origin == app_web_url.DeprecatedGetOriginAsURL()) {
  20. return true;
  21. }
  22. chromecast::ActivityUrlFilter activity_url_filter(
  23. additional_feature_permission_origins);
  24. return activity_url_filter.UrlMatchesWhitelist(requesting_origin);
  25. }
  26. blink::mojom::PermissionStatus GetPermissionStatusFromCastPermissionUserData(
  27. blink::PermissionType permission,
  28. const GURL& requesting_origin,
  29. chromecast::shell::CastPermissionUserData* cast_permission_user_data) {
  30. std::string app_id = cast_permission_user_data->GetAppId();
  31. GURL app_web_url = cast_permission_user_data->GetAppWebUrl();
  32. // We expect to grant blink::PermissionType::PROTECTED_MEDIA_IDENTIFIER
  33. // to origins same as |app_web_url| by default.
  34. if (requesting_origin != app_web_url.DeprecatedGetOriginAsURL() ||
  35. permission != blink::PermissionType::PROTECTED_MEDIA_IDENTIFIER) {
  36. chromecast::metrics::CastMetricsHelper::GetInstance()
  37. ->RecordApplicationEventWithValue(
  38. app_id, /*session_id=*/"", /*sdk_version=*/"",
  39. "Cast.Platform.PermissionRequestWithFrame",
  40. static_cast<int>(permission));
  41. }
  42. if (!cast_permission_user_data->GetEnforceFeaturePermissions()) {
  43. return blink::mojom::PermissionStatus::GRANTED;
  44. }
  45. // Permissions that are granted by default should have been added to the
  46. // FeaturePermissions in CastPermissionUserData.
  47. bool permitted =
  48. cast_permission_user_data->GetFeaturePermissions().count(
  49. static_cast<int32_t>(permission)) > 0 &&
  50. IsRequestingOriginAllowed(
  51. requesting_origin, app_web_url,
  52. cast_permission_user_data->GetAdditionalFeaturePermissionOrigins());
  53. return permitted ? blink::mojom::PermissionStatus::GRANTED
  54. : ::blink::mojom::PermissionStatus::DENIED;
  55. }
  56. } // namespace
  57. namespace chromecast {
  58. namespace shell {
  59. // TODO(b/191718807): Be more restrictive on the permissions.
  60. // Currently, only collect metrics.
  61. blink::mojom::PermissionStatus GetPermissionStatusInternal(
  62. blink::PermissionType permission,
  63. const GURL& requesting_origin) {
  64. // We expect to grant blink::PermissionType::BACKGROUND_SYNC by
  65. // default.
  66. if (permission != blink::PermissionType::BACKGROUND_SYNC) {
  67. metrics::CastMetricsHelper::GetInstance()->RecordApplicationEventWithValue(
  68. "Cast.Platform.PermissionRequestWithoutFrame",
  69. static_cast<int>(permission));
  70. }
  71. blink::mojom::PermissionStatus permission_status =
  72. blink::mojom::PermissionStatus::GRANTED;
  73. LOG(INFO) << __func__ << ": "
  74. << (permission_status == blink::mojom::PermissionStatus::GRANTED
  75. ? " grants "
  76. : " doesn't grant ")
  77. << "permission " << static_cast<int>(permission)
  78. << " out of frame context.";
  79. return permission_status;
  80. }
  81. blink::mojom::PermissionStatus GetPermissionStatusInternal(
  82. blink::PermissionType permission,
  83. content::RenderFrameHost* render_frame_host,
  84. const GURL& requesting_origin) {
  85. DCHECK(render_frame_host);
  86. CastPermissionUserData* cast_permission_user_data =
  87. CastPermissionUserData::FromWebContents(
  88. content::WebContents::FromRenderFrameHost(render_frame_host));
  89. if (!cast_permission_user_data) {
  90. LOG(ERROR) << __func__ << ": No permission data in frame!";
  91. return GetPermissionStatusInternal(permission, requesting_origin);
  92. }
  93. blink::mojom::PermissionStatus permission_status =
  94. GetPermissionStatusFromCastPermissionUserData(
  95. permission, requesting_origin, cast_permission_user_data);
  96. LOG(INFO) << __func__ << ": "
  97. << (permission_status == blink::mojom::PermissionStatus::GRANTED
  98. ? " grants "
  99. : " doesn't grant ")
  100. << "permission " << static_cast<int>(permission)
  101. << " to frame associated with app: "
  102. << cast_permission_user_data->GetAppId();
  103. return permission_status;
  104. }
  105. CastPermissionManager::CastPermissionManager() {}
  106. CastPermissionManager::~CastPermissionManager() {}
  107. void CastPermissionManager::RequestPermission(
  108. blink::PermissionType permission,
  109. content::RenderFrameHost* render_frame_host,
  110. const GURL& requesting_origin,
  111. bool user_gesture,
  112. base::OnceCallback<void(blink::mojom::PermissionStatus)> callback) {
  113. blink::mojom::PermissionStatus permission_status =
  114. GetPermissionStatusInternal(permission, render_frame_host,
  115. requesting_origin);
  116. std::move(callback).Run(permission_status);
  117. }
  118. void CastPermissionManager::RequestPermissions(
  119. const std::vector<blink::PermissionType>& permissions,
  120. content::RenderFrameHost* render_frame_host,
  121. const GURL& requesting_origin,
  122. bool user_gesture,
  123. base::OnceCallback<void(const std::vector<blink::mojom::PermissionStatus>&)>
  124. callback) {
  125. std::vector<blink::mojom::PermissionStatus> permission_statuses;
  126. for (auto permission : permissions) {
  127. permission_statuses.push_back(GetPermissionStatusInternal(
  128. permission, render_frame_host, requesting_origin));
  129. }
  130. std::move(callback).Run(permission_statuses);
  131. }
  132. void CastPermissionManager::ResetPermission(blink::PermissionType permission,
  133. const GURL& requesting_origin,
  134. const GURL& embedding_origin) {}
  135. void CastPermissionManager::RequestPermissionsFromCurrentDocument(
  136. const std::vector<blink::PermissionType>& permissions,
  137. content::RenderFrameHost* render_frame_host,
  138. bool user_gesture,
  139. base::OnceCallback<void(const std::vector<blink::mojom::PermissionStatus>&)>
  140. callback) {
  141. std::vector<blink::mojom::PermissionStatus> permission_statuses;
  142. for (auto permission : permissions) {
  143. permission_statuses.push_back(GetPermissionStatusInternal(
  144. permission, render_frame_host,
  145. render_frame_host->GetLastCommittedOrigin().GetURL()));
  146. }
  147. std::move(callback).Run(permission_statuses);
  148. }
  149. blink::mojom::PermissionStatus CastPermissionManager::GetPermissionStatus(
  150. blink::PermissionType permission,
  151. const GURL& requesting_origin,
  152. const GURL& embedding_origin) {
  153. return GetPermissionStatusInternal(permission, requesting_origin);
  154. }
  155. content::PermissionResult
  156. CastPermissionManager::GetPermissionResultForOriginWithoutContext(
  157. blink::PermissionType permission,
  158. const url::Origin& origin) {
  159. blink::mojom::PermissionStatus status =
  160. GetPermissionStatus(permission, origin.GetURL(), origin.GetURL());
  161. return content::PermissionResult(
  162. status, content::PermissionStatusSource::UNSPECIFIED);
  163. }
  164. blink::mojom::PermissionStatus
  165. CastPermissionManager::GetPermissionStatusForCurrentDocument(
  166. blink::PermissionType permission,
  167. content::RenderFrameHost* render_frame_host) {
  168. return GetPermissionStatusInternal(
  169. permission, render_frame_host,
  170. render_frame_host->GetLastCommittedOrigin().GetURL());
  171. }
  172. blink::mojom::PermissionStatus
  173. CastPermissionManager::GetPermissionStatusForWorker(
  174. blink::PermissionType permission,
  175. content::RenderProcessHost* render_process_host,
  176. const GURL& worker_origin) {
  177. return GetPermissionStatusInternal(permission, worker_origin);
  178. }
  179. CastPermissionManager::SubscriptionId
  180. CastPermissionManager::SubscribePermissionStatusChange(
  181. blink::PermissionType permission,
  182. content::RenderProcessHost* render_process_host,
  183. content::RenderFrameHost* render_frame_host,
  184. const GURL& requesting_origin,
  185. base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback) {
  186. return SubscriptionId();
  187. }
  188. void CastPermissionManager::UnsubscribePermissionStatusChange(
  189. SubscriptionId subscription_id) {}
  190. } // namespace shell
  191. } // namespace chromecast