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