11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file.
41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/sessions/restore_on_startup_policy_handler.h"
61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/pref_value_map.h"
81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/values.h"
101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/prefs/session_startup_pref.h"
111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/common/pref_names.h"
12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/browser/policy_error_map.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_map.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "grit/components_strings.h"
151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "policy/policy_constants.h"
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace policy {
181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)RestoreOnStartupPolicyHandler::RestoreOnStartupPolicyHandler()
201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    : TypeCheckingPolicyHandler(key::kRestoreOnStartup,
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                base::Value::TYPE_INTEGER) {}
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)RestoreOnStartupPolicyHandler::~RestoreOnStartupPolicyHandler() {
241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void RestoreOnStartupPolicyHandler::ApplyPolicySettings(
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const PolicyMap& policies,
281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    PrefValueMap* prefs) {
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const base::Value* restore_on_startup_value =
301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      policies.GetValue(policy_name());
311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (restore_on_startup_value) {
321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    int restore_on_startup;
331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!restore_on_startup_value->GetAsInteger(&restore_on_startup))
341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return;
351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (restore_on_startup == SessionStartupPref::kPrefValueHomePage)
371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ApplyPolicySettingsFromHomePage(policies, prefs);
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    else
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      prefs->SetInteger(prefs::kRestoreOnStartup, restore_on_startup);
401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void RestoreOnStartupPolicyHandler::ApplyPolicySettingsFromHomePage(
441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const PolicyMap& policies,
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    PrefValueMap* prefs) {
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const base::Value* homepage_is_new_tab_page_value =
471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      policies.GetValue(key::kHomepageIsNewTabPage);
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!homepage_is_new_tab_page_value) {
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // The policy is enforcing 'open the homepage on startup' but not
501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // enforcing what the homepage should be. Don't set any prefs.
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return;
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool homepage_is_new_tab_page;
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!homepage_is_new_tab_page_value->GetAsBoolean(&homepage_is_new_tab_page))
561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return;
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (homepage_is_new_tab_page) {
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    prefs->SetInteger(prefs::kRestoreOnStartup,
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                      SessionStartupPref::kPrefValueNewTab);
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  } else {
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const base::Value* homepage_value =
631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        policies.GetValue(key::kHomepageLocation);
641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!homepage_value || !homepage_value->IsType(base::Value::TYPE_STRING)) {
651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      // The policy is enforcing 'open the homepage on startup' but not
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      // enforcing what the homepage should be. Don't set any prefs.
671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return;
681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    base::ListValue* url_list = new base::ListValue();
701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    url_list->Append(homepage_value->DeepCopy());
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    prefs->SetInteger(prefs::kRestoreOnStartup,
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                      SessionStartupPref::kPrefValueURLs);
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    prefs->SetValue(prefs::kURLsToRestoreOnStartup, url_list);
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool RestoreOnStartupPolicyHandler::CheckPolicySettings(
781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const PolicyMap& policies,
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    PolicyErrorMap* errors) {
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!TypeCheckingPolicyHandler::CheckPolicySettings(policies, errors))
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return false;
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const base::Value* restore_policy = policies.GetValue(key::kRestoreOnStartup);
841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (restore_policy) {
861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    int restore_value;
871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    CHECK(restore_policy->GetAsInteger(&restore_value));  // Passed type check.
881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    switch (restore_value) {
891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      case SessionStartupPref::kPrefValueHomePage:
901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        errors->AddError(policy_name(), IDS_POLICY_VALUE_DEPRECATED);
911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        break;
921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      case SessionStartupPref::kPrefValueLast: {
931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        // If the "restore last session" policy is set, session cookies are
941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        // treated as permanent cookies and site data needed to restore the
951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        // session is not cleared so we have to warn the user in that case.
961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        const base::Value* cookies_policy =
971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            policies.GetValue(key::kCookiesSessionOnlyForUrls);
981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        const base::ListValue* cookies_value;
991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        if (cookies_policy && cookies_policy->GetAsList(&cookies_value) &&
1001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            !cookies_value->empty()) {
1011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          errors->AddError(key::kCookiesSessionOnlyForUrls,
1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                           IDS_POLICY_OVERRIDDEN,
1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                           key::kRestoreOnStartup);
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        }
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        const base::Value* exit_policy =
1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            policies.GetValue(key::kClearSiteDataOnExit);
1081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        bool exit_value;
1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        if (exit_policy && exit_policy->GetAsBoolean(&exit_value) &&
1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            exit_value) {
1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          errors->AddError(key::kClearSiteDataOnExit,
1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                           IDS_POLICY_OVERRIDDEN,
1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                           key::kRestoreOnStartup);
1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        }
1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        break;
1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      }
1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      case SessionStartupPref::kPrefValueURLs:
1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      case SessionStartupPref::kPrefValueNewTab:
1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        // No error
1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        break;
1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      default:
1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        errors->AddError(policy_name(),
1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                         IDS_POLICY_OUT_OF_RANGE_ERROR,
1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                         base::IntToString(restore_value));
1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return true;
1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace policy
131