普通文本  |  94行  |  2.89 KB

// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "extensions/common/permissions/manifest_permission_set.h"

#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
#include "base/values.h"
#include "extensions/common/error_utils.h"
#include "extensions/common/manifest_constants.h"
#include "extensions/common/manifest_handler.h"
#include "extensions/common/permissions/manifest_permission.h"

namespace {

using extensions::ErrorUtils;
using extensions::ManifestPermission;
using extensions::ManifestPermissionSet;
using extensions::ManifestHandler;
namespace errors = extensions::manifest_errors;

bool CreateManifestPermission(
    const std::string& permission_name,
    const base::Value* permission_value,
    ManifestPermissionSet* manifest_permissions,
    string16* error,
    std::vector<std::string>* unhandled_permissions) {

  scoped_ptr<ManifestPermission> permission(
      ManifestHandler::CreatePermission(permission_name));

  if (!permission) {
    if (unhandled_permissions)
      unhandled_permissions->push_back(permission_name);
    else
      LOG(WARNING) << "Unknown permission[" << permission_name << "].";
    return true;
  }

  if (!permission->FromValue(permission_value)) {
    if (error) {
      *error = ErrorUtils::FormatErrorMessageUTF16(
          errors::kInvalidPermission, permission_name);
      return false;
    }
    LOG(WARNING) << "Parse permission failed.";
    return true;
  } else {
    manifest_permissions->insert(permission.release());
    return true;
  }
}

}  // namespace

namespace extensions {

// static
bool ManifestPermissionSet::ParseFromJSON(
    const base::ListValue* permissions,
    ManifestPermissionSet* manifest_permissions,
    string16* error,
    std::vector<std::string>* unhandled_permissions) {
  for (size_t i = 0; i < permissions->GetSize(); ++i) {
    std::string permission_name;
    const base::Value* permission_value = NULL;
    if (!permissions->GetString(i, &permission_name)) {
      const base::DictionaryValue* dict = NULL;
      // permission should be a string or a single key dict.
      if (!permissions->GetDictionary(i, &dict) || dict->size() != 1) {
        if (error) {
          *error = ErrorUtils::FormatErrorMessageUTF16(
              errors::kInvalidPermission, base::IntToString(i));
          return false;
        }
        LOG(WARNING) << "Permission is not a string or single key dict.";
        continue;
      }
      base::DictionaryValue::Iterator it(*dict);
      permission_name = it.key();
      permission_value = &it.value();
    }

    if (!CreateManifestPermission(permission_name, permission_value,
                                  manifest_permissions, error,
                                  unhandled_permissions))
      return false;
  }
  return true;
}

}  // namespace extensions