15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 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)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/browser/url_blacklist_policy_handler.h"
61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/pref_value_map.h"
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/values.h"
10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/browser/policy_error_map.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_map.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/policy_pref_names.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "grit/components_strings.h"
141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "policy/policy_constants.h"
151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace policy {
171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)URLBlacklistPolicyHandler::URLBlacklistPolicyHandler() {}
191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)URLBlacklistPolicyHandler::~URLBlacklistPolicyHandler() {}
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool URLBlacklistPolicyHandler::CheckPolicySettings(const PolicyMap& policies,
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                    PolicyErrorMap* errors) {
241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const base::Value* disabled_schemes =
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      policies.GetValue(key::kDisabledSchemes);
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const base::Value* url_blacklist = policies.GetValue(key::kURLBlacklist);
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (disabled_schemes && !disabled_schemes->IsType(base::Value::TYPE_LIST)) {
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    errors->AddError(key::kDisabledSchemes,
301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                     IDS_POLICY_TYPE_ERROR,
311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                     ValueTypeToString(base::Value::TYPE_LIST));
321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (url_blacklist && !url_blacklist->IsType(base::Value::TYPE_LIST)) {
351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    errors->AddError(key::kURLBlacklist,
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                     IDS_POLICY_TYPE_ERROR,
371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                     ValueTypeToString(base::Value::TYPE_LIST));
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return true;
411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void URLBlacklistPolicyHandler::ApplyPolicySettings(const PolicyMap& policies,
441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                    PrefValueMap* prefs) {
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const base::Value* url_blacklist_policy =
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      policies.GetValue(key::kURLBlacklist);
471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const base::ListValue* url_blacklist = NULL;
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (url_blacklist_policy)
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    url_blacklist_policy->GetAsList(&url_blacklist);
501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const base::Value* disabled_schemes_policy =
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      policies.GetValue(key::kDisabledSchemes);
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const base::ListValue* disabled_schemes = NULL;
531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (disabled_schemes_policy)
541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    disabled_schemes_policy->GetAsList(&disabled_schemes);
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<base::ListValue> merged_url_blacklist(new base::ListValue());
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // We start with the DisabledSchemes because we have size limit when
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // handling URLBlacklists.
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (disabled_schemes) {
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    for (base::ListValue::const_iterator entry(disabled_schemes->begin());
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)         entry != disabled_schemes->end(); ++entry) {
631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      std::string entry_value;
641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      if ((*entry)->GetAsString(&entry_value)) {
651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        entry_value.append("://*");
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        merged_url_blacklist->AppendString(entry_value);
671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      }
681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (url_blacklist) {
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    for (base::ListValue::const_iterator entry(url_blacklist->begin());
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)         entry != url_blacklist->end(); ++entry) {
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if ((*entry)->IsType(base::Value::TYPE_STRING))
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        merged_url_blacklist->Append((*entry)->DeepCopy());
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (disabled_schemes || url_blacklist) {
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    prefs->SetValue(policy_prefs::kUrlBlacklist,
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    merged_url_blacklist.release());
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace policy
86