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