Example #1
0
    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()
Example #2
0
    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]]