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/profiles/incognito_mode_policy_handler.h"
6
7#include "base/logging.h"
8#include "base/prefs/pref_value_map.h"
9#include "base/strings/string_number_conversions.h"
10#include "base/values.h"
11#include "chrome/browser/prefs/incognito_mode_prefs.h"
12#include "chrome/common/pref_names.h"
13#include "components/policy/core/browser/policy_error_map.h"
14#include "components/policy/core/common/policy_map.h"
15#include "grit/components_strings.h"
16#include "policy/policy_constants.h"
17
18namespace policy {
19
20IncognitoModePolicyHandler::IncognitoModePolicyHandler() {}
21
22IncognitoModePolicyHandler::~IncognitoModePolicyHandler() {}
23
24bool IncognitoModePolicyHandler::CheckPolicySettings(const PolicyMap& policies,
25                                                     PolicyErrorMap* errors) {
26  int int_value = IncognitoModePrefs::ENABLED;
27  const base::Value* availability =
28      policies.GetValue(key::kIncognitoModeAvailability);
29
30  if (availability) {
31    if (availability->GetAsInteger(&int_value)) {
32      IncognitoModePrefs::Availability availability_enum_value;
33      if (!IncognitoModePrefs::IntToAvailability(int_value,
34                                                 &availability_enum_value)) {
35        errors->AddError(key::kIncognitoModeAvailability,
36                         IDS_POLICY_OUT_OF_RANGE_ERROR,
37                         base::IntToString(int_value));
38        return false;
39      }
40    } else {
41      errors->AddError(key::kIncognitoModeAvailability,
42                       IDS_POLICY_TYPE_ERROR,
43                       ValueTypeToString(base::Value::TYPE_INTEGER));
44      return false;
45    }
46  } else {
47    const base::Value* deprecated_enabled =
48        policies.GetValue(key::kIncognitoEnabled);
49    if (deprecated_enabled &&
50        !deprecated_enabled->IsType(base::Value::TYPE_BOOLEAN)) {
51      errors->AddError(key::kIncognitoEnabled,
52                       IDS_POLICY_TYPE_ERROR,
53                       ValueTypeToString(base::Value::TYPE_BOOLEAN));
54      return false;
55    }
56  }
57  return true;
58}
59
60void IncognitoModePolicyHandler::ApplyPolicySettings(const PolicyMap& policies,
61                                                     PrefValueMap* prefs) {
62  const base::Value* availability =
63      policies.GetValue(key::kIncognitoModeAvailability);
64  const base::Value* deprecated_enabled =
65      policies.GetValue(key::kIncognitoEnabled);
66  if (availability) {
67    int int_value = IncognitoModePrefs::ENABLED;
68    IncognitoModePrefs::Availability availability_enum_value;
69    if (availability->GetAsInteger(&int_value) &&
70        IncognitoModePrefs::IntToAvailability(int_value,
71                                              &availability_enum_value)) {
72      prefs->SetInteger(prefs::kIncognitoModeAvailability,
73                        availability_enum_value);
74    } else {
75      NOTREACHED();
76    }
77  } else if (deprecated_enabled) {
78    // If kIncognitoModeAvailability is not specified, check the obsolete
79    // kIncognitoEnabled.
80    bool enabled = true;
81    if (deprecated_enabled->GetAsBoolean(&enabled)) {
82      prefs->SetInteger(
83          prefs::kIncognitoModeAvailability,
84          enabled ? IncognitoModePrefs::ENABLED : IncognitoModePrefs::DISABLED);
85    } else {
86      NOTREACHED();
87    }
88  }
89}
90
91}  // namespace policy
92