1// Copyright 2013 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
5#include "chrome/browser/sessions/restore_on_startup_policy_handler.h"
6
7#include "base/prefs/pref_value_map.h"
8#include "base/strings/string_number_conversions.h"
9#include "base/values.h"
10#include "chrome/browser/prefs/session_startup_pref.h"
11#include "chrome/common/pref_names.h"
12#include "components/policy/core/browser/policy_error_map.h"
13#include "components/policy/core/common/policy_map.h"
14#include "grit/components_strings.h"
15#include "policy/policy_constants.h"
16
17namespace policy {
18
19RestoreOnStartupPolicyHandler::RestoreOnStartupPolicyHandler()
20    : TypeCheckingPolicyHandler(key::kRestoreOnStartup,
21                                base::Value::TYPE_INTEGER) {}
22
23RestoreOnStartupPolicyHandler::~RestoreOnStartupPolicyHandler() {
24}
25
26void RestoreOnStartupPolicyHandler::ApplyPolicySettings(
27    const PolicyMap& policies,
28    PrefValueMap* prefs) {
29  const base::Value* restore_on_startup_value =
30      policies.GetValue(policy_name());
31  if (restore_on_startup_value) {
32    int restore_on_startup;
33    if (!restore_on_startup_value->GetAsInteger(&restore_on_startup))
34      return;
35
36    if (restore_on_startup == SessionStartupPref::kPrefValueHomePage)
37      ApplyPolicySettingsFromHomePage(policies, prefs);
38    else
39      prefs->SetInteger(prefs::kRestoreOnStartup, restore_on_startup);
40  }
41}
42
43void RestoreOnStartupPolicyHandler::ApplyPolicySettingsFromHomePage(
44    const PolicyMap& policies,
45    PrefValueMap* prefs) {
46  const base::Value* homepage_is_new_tab_page_value =
47      policies.GetValue(key::kHomepageIsNewTabPage);
48  if (!homepage_is_new_tab_page_value) {
49    // The policy is enforcing 'open the homepage on startup' but not
50    // enforcing what the homepage should be. Don't set any prefs.
51    return;
52  }
53
54  bool homepage_is_new_tab_page;
55  if (!homepage_is_new_tab_page_value->GetAsBoolean(&homepage_is_new_tab_page))
56    return;
57
58  if (homepage_is_new_tab_page) {
59    prefs->SetInteger(prefs::kRestoreOnStartup,
60                      SessionStartupPref::kPrefValueNewTab);
61  } else {
62    const base::Value* homepage_value =
63        policies.GetValue(key::kHomepageLocation);
64    if (!homepage_value || !homepage_value->IsType(base::Value::TYPE_STRING)) {
65      // The policy is enforcing 'open the homepage on startup' but not
66      // enforcing what the homepage should be. Don't set any prefs.
67      return;
68    }
69    base::ListValue* url_list = new base::ListValue();
70    url_list->Append(homepage_value->DeepCopy());
71    prefs->SetInteger(prefs::kRestoreOnStartup,
72                      SessionStartupPref::kPrefValueURLs);
73    prefs->SetValue(prefs::kURLsToRestoreOnStartup, url_list);
74  }
75}
76
77bool RestoreOnStartupPolicyHandler::CheckPolicySettings(
78    const PolicyMap& policies,
79    PolicyErrorMap* errors) {
80  if (!TypeCheckingPolicyHandler::CheckPolicySettings(policies, errors))
81    return false;
82
83  const base::Value* restore_policy = policies.GetValue(key::kRestoreOnStartup);
84
85  if (restore_policy) {
86    int restore_value;
87    CHECK(restore_policy->GetAsInteger(&restore_value));  // Passed type check.
88    switch (restore_value) {
89      case SessionStartupPref::kPrefValueHomePage:
90        errors->AddError(policy_name(), IDS_POLICY_VALUE_DEPRECATED);
91        break;
92      case SessionStartupPref::kPrefValueLast: {
93        // If the "restore last session" policy is set, session cookies are
94        // treated as permanent cookies and site data needed to restore the
95        // session is not cleared so we have to warn the user in that case.
96        const base::Value* cookies_policy =
97            policies.GetValue(key::kCookiesSessionOnlyForUrls);
98        const base::ListValue* cookies_value;
99        if (cookies_policy && cookies_policy->GetAsList(&cookies_value) &&
100            !cookies_value->empty()) {
101          errors->AddError(key::kCookiesSessionOnlyForUrls,
102                           IDS_POLICY_OVERRIDDEN,
103                           key::kRestoreOnStartup);
104        }
105
106        const base::Value* exit_policy =
107            policies.GetValue(key::kClearSiteDataOnExit);
108        bool exit_value;
109        if (exit_policy && exit_policy->GetAsBoolean(&exit_value) &&
110            exit_value) {
111          errors->AddError(key::kClearSiteDataOnExit,
112                           IDS_POLICY_OVERRIDDEN,
113                           key::kRestoreOnStartup);
114        }
115        break;
116      }
117      case SessionStartupPref::kPrefValueURLs:
118      case SessionStartupPref::kPrefValueNewTab:
119        // No error
120        break;
121      default:
122        errors->AddError(policy_name(),
123                         IDS_POLICY_OUT_OF_RANGE_ERROR,
124                         base::IntToString(restore_value));
125    }
126  }
127  return true;
128}
129
130}  // namespace policy
131