def set_roots(self, config): roots = [ ] self.private_directory = '' if config.get('public_dir','') != '': list = map(string.strip,string.split(config['public_dir'],',')) if list: roots.extend(list) if config.get('download_dir','') != '': list = map(string.strip,string.split(config['download_dir'],',')) if list: #config['download_dir'] = list[0] roots.extend(list) if config.get('private_dir','') != '': list = map(string.strip,string.split(config['private_dir'],',')) if list: self.private_directory = list[0] roots.extend(list) for i in range(len(roots)): roots[i] = (utility.force_string(roots[i]), flags_full) if config.get('publish_apt',''): roots.append(('/var/cache/apt/archives',flags_deb)) # avoid redundancy (prefixes) in the roots list np_roots = [ ] for root in roots: ok = 1 for np_root in np_roots: if utility.is_subdir(root[0],np_root[0]): ok = 0 elif utility.is_subdir(np_root[0],root[0]): np_roots.remove(np_root) if ok: np_roots.append(root) self.lock.acquire() #self.roots.append(os.path.abspath(path)) #self.roots.append((path,flags)) self.roots = np_roots self.fresh = 0 self.lock.release()
def handle(self, request, address, call_id): check.check_matches(request, (types.StringType,)) check.check_is_af_inet_address(address) if request[0] == 'download chunk': path, mtime = self.paths.get(request[1],(None,None)) if not path: path, mtime = self.private_paths.get(request[1],(None,None)) try: if not path or \ os.path.getmtime(path) != mtime: return Error("no such file") file = open(path,'rb') except IOError: return Error("no such file") if address[0] !='127.0.0.1'\ and address not in self.node.trusted_addresses \ and self.private_directory != ''\ and utility.is_subdir(path,self.private_directory): return Error("access denied") try: file.seek(request[2]) return file.read(request[3]) finally: file.close() elif request[0] == 'files available': if len(request) == 3: # this returns the keys of # all published files from all directories # regardless of the directory structure list = self.paths.keys() else: list = [ ] access_denied = 0 directory_found = 0 string_request = [] for str in request[3]: string_request.append(utility.force_string(str)) if not self.roots: return Error('No public directory') request_dir = apply( os.path.join, [os.path.abspath(self.roots[0][0])] + string_request) if address[0]=='127.0.0.1': flags = flags_local else: flags = flags_fast if os.path.exists(request_dir): directory_found = 1 if address[0]!='127.0.0.1' \ and address not in self.node.trusted_addresses\ and self.private_directory != ''\ and utility.is_subdir(request_dir,self.private_directory): access_denied = 1 if not directory_found: return Error("no such directory: %s"%request_dir) elif access_denied: return Error("access denied") entry = build_entry(request_dir,None,flags,self) if entry: if not entry.is_dir: return Error("not a directory: "+request_dir) for file in entry.files: entry_2 = build_entry(file,None,flags,self) if entry_2: info = entry_2.info.copy() info['path'] = request[3] + [ info['filename'] ] list.append(info) return list[request[1]:request[2]]