1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/permission_request_creator_sync.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/callback.h"
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/values.h"
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_settings_service.h"
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_shared_settings_service.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/base/escape.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "url/gurl.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using base::Time;
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const char kSupervisedUserAccessRequestKeyPrefix[] =
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "X-ManagedUser-AccessRequests";
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const char kSupervisedUserAccessRequestTime[] = "timestamp";
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const char kSupervisedUserName[] = "name";
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Key for the notification setting of the custodian. This is a shared setting
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// so we can include the setting in the access request data that is used to
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// trigger notifications.
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kNotificationSetting[] = "custodian-notification-setting";
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)PermissionRequestCreatorSync::PermissionRequestCreatorSync(
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    SupervisedUserSettingsService* settings_service,
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    SupervisedUserSharedSettingsService* shared_settings_service,
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const std::string& name,
30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const std::string& supervised_user_id)
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : settings_service_(settings_service),
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      shared_settings_service_(shared_settings_service),
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      name_(name),
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      supervised_user_id_(supervised_user_id) {
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)PermissionRequestCreatorSync::~PermissionRequestCreatorSync() {}
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void PermissionRequestCreatorSync::CreatePermissionRequest(
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const GURL& url_requested,
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const base::Closure& callback) {
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Escape the URL and add the prefix.
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string key = SupervisedUserSettingsService::MakeSplitSettingKey(
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kSupervisedUserAccessRequestKeyPrefix,
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      net::EscapeQueryParamValue(url_requested.spec(), true));
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue);
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // TODO(sergiu): Use sane time here when it's ready.
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dict->SetDouble(kSupervisedUserAccessRequestTime,
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  base::Time::Now().ToJsTime());
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dict->SetString(kSupervisedUserName, name_);
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Copy the notification setting of the custodian.
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const base::Value* value = shared_settings_service_->GetValue(
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      supervised_user_id_, kNotificationSetting);
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool notifications_enabled = false;
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (value) {
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    bool success = value->GetAsBoolean(&notifications_enabled);
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK(success);
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  dict->SetBoolean(kNotificationSetting, notifications_enabled);
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  settings_service_->UploadItem(key, dict.PassAs<base::Value>());
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  callback.Run();
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
69