1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/chromeos/fileapi/file_access_permissions.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Empty path is prefix of any other paths, hence it represents full permission.
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::FilePath FullPermission() { return base::FilePath(); }
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FileAccessPermissions::FileAccessPermissions() {}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FileAccessPermissions::~FileAccessPermissions() {}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FileAccessPermissions::GrantFullAccessPermission(
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& extension_id) {
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::AutoLock locker(lock_);
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  path_map_[extension_id].insert(FullPermission());
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FileAccessPermissions::GrantAccessPermission(
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& extension_id, const base::FilePath& path) {
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(!path.empty());
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock locker(lock_);
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  path_map_[extension_id].insert(path);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FileAccessPermissions::HasAccessPermission(
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& extension_id, const base::FilePath& path) const {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock locker(lock_);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathAccessMap::const_iterator path_map_iter = path_map_.find(extension_id);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (path_map_iter == path_map_.end())
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const PathSet& path_set = path_map_iter->second;
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (path_set.find(FullPermission()) != path_set.end())
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check this file and walk up its directory tree to find if this extension
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // has access to it.
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath current_path = path.StripTrailingSeparators();
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath last_path;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (current_path != last_path) {
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (path_set.find(current_path) != path_set.end())
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_path = current_path;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current_path = current_path.DirName();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FileAccessPermissions::RevokePermissions(
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& extension_id) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock locker(lock_);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path_map_.erase(extension_id);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace chromeos
66