From: <ju...@us...> - 2008-02-04 11:55:01
|
Revision: 139 http://fclient.svn.sourceforge.net/fclient/?rev=139&view=rev Author: jurner Date: 2008-02-04 03:55:00 -0800 (Mon, 04 Feb 2008) Log Message: ----------- fixes Modified Paths: -------------- trunk/sandbox/fcp/fcp2_0_requests.py Modified: trunk/sandbox/fcp/fcp2_0_requests.py =================================================================== --- trunk/sandbox/fcp/fcp2_0_requests.py 2008-02-04 11:53:43 UTC (rev 138) +++ trunk/sandbox/fcp/fcp2_0_requests.py 2008-02-04 11:55:00 UTC (rev 139) @@ -7,6 +7,13 @@ class Upload(object): """Wrapper class to represent a freenet upload + @ivar directoryAdded: (bool) True if the upload contains a directory, False otherwise + @ivar items: (list) of dicts containing paramaters for each upload + @ivar keyType: L{consts.KeyType} the type of key to upload + @ivar params: (dict) request parameters + @ivar privateKey: (str) private keey (required for SSK or USK uploads) + @ivar targetNames: (list) of names already in use (for multi-uploads) + @note: you can upload one or more items of any kind (data, files, redirects), except from directories wich have to be the only item to upload """ @@ -39,10 +46,14 @@ @param privateKey: (str) privateKey if keyType is SSK or USK """ - if keyType not in consts.KeyType.TypesAll: raise ValueError('Invalid key type: %r' % keyType) - + if keyType in (consts.KeyType.SSK, consts.KeyType.USK) and privateKey is None: + raise ValueError('For %s a public key is required' % keyType) + elif keyType in (consts.KeyType.CHK, consts.KeyType.KSK) and privateKey is not None: + raise ValueError('For %s no public key is required' % keyType) + + self.directoryAdded = False self.items = [] self.keyType = keyType self.params = { @@ -53,27 +64,26 @@ 'PriorityClass': priorityClass, } self.privateKey = privateKey - self._directoryAdded = False - self._targetNames = [] # record to check if names are unique (assert order is arbitrary) + self.targetNames = [] # record to check if names are unique (assert order is arbitrary) def _addItem(self, **params): """Private method to add an upload item""" - if self._directoryAdded: + if self.directoryAdded: raise ValueError('A directory has already been added, no other items allowed') - if itemType == self.ItemTypeDirectory: - if self._directoryAdded: + if params['FcItemType'] == self.ItemTypeDirectory: + if self.directoryAdded: raise ValueError('An item has already been added, no additional directory allowed') else: - self._directoryAdded = True + self.directoryAdded = True name = params['Name'] - if name in self._targetNames: + if name in self.targetNames: raise ValueError('Target name already exists: %r' % name) self.targetNames.append(name) - self.iotems.append(params) + self.items.append(params) def addData(self, name, data, contentType=None): @@ -88,14 +98,15 @@ ContentType=contentType, DataLength=len(data), Name=name, - UploadFrom=self.UploadFrom.Direct + UploadFrom=consts.UploadFrom.Direct ) - def addDirectory(name, directory, allowUnreadableFiles=False): + def addDirectory(name, directory, allowUnreadableFiles=False, defaultName=None): """Adds a directory to be uploaded @param name: target name @param directory: (abspath) of the directory to be uploaded + @param defaultName: (for SSKs and USKs, the file to display when the key is requested) @note: if you add a directory, every attempt to add anything else will fail """ @@ -103,7 +114,8 @@ FcItemType=self.ItemTypeDirectory, AllowUnreadableFiles=allowUnreadableFiles, Filename=directory, - Name=name, + Name=name, + DefaultName=defaultName, ) @@ -118,7 +130,7 @@ ContentType=contentType, Filename=filename, Name=name, - UploadFrom=self.UploadFrom.Disk, + UploadFrom=consts.UploadFrom.Disk, ) @@ -133,7 +145,7 @@ DataLength=len(data), Name=name, TargetURI=redirect, - UploadFrom=self.UploadFrom.Redirect + UploadFrom=consts.UploadFrom.Redirect ) @@ -142,91 +154,88 @@ @param messageClass: (L{fcp2_0_message.Message}) class to fill in @return: (L{fcp2_0_message.Message}) instance """ - if self.keyType in (consts.KeyType.SSK, consts.KeyType.USK) and self.privateKey is None: - raise ValueError('For %s a public key is required' % self.keyType) - elif self.keyType in (consts.KeyType.CHK, consts.KeyType.KSK) and self.privateKey is not None: - raise ValueError('For %s no public key is required' % self.keyType) - - n = len(self.items) if n == 0: return None - elif n == 1 and self.itemTypes[0] == self.ItemTypeDirectory: - msg = messageClass(messageClass.MessageClientPutDiskDir, **self.params) + elif n == 1 and self.items[0]['FcItemType'] == self.ItemTypeDirectory: + msg = messageClass(consts.Message.ClientPutDiskDir) params = self.items[0] + targetName = params.pop('Name') for param, value in params.items(): if value is None: continue if param.startswith(self.ReservedParamPrefix): continue - - if param == 'Name': - param = 'TargetFilename' - elif param == 'ContentType': - param = 'Metadata.ContentType' msg[param] = value elif n == 1: - msg = messageClass(messageClass.MessageClientPut, **self.params) + msg = messageClass(consts.Message.ClientPut) params = self.items[0] + targetFilename = params.pop('Name') for param, value in params.items(): if value is None: continue if param.startswith(self.ReservedParamPrefix): continue - if param == 'Name': - param = 'TargetFilename' - elif param == 'ContentType': + if param == 'ContentType': param = 'Metadata.ContentType' msg[param] = value - if params['FcItemType'] == self.ItemTypeData: - msg.data = params['FcData'] + if params['FcItemType'] == self.ItemTypeData: + msg.data = params['FcData'] + if self.keyType == consts.Keytype.CHK: + msg['TargetFilename'] = targetFilename + #TODO: USK@s allowed for complex dirs? else: #NOTE: for simplicity we take the first item as default item and its name # as TargetName if that causes any problems, pass it twice - msg = messageClass(messageClass.MessageClientPutComplexDir, **self.params) + msg = messageClass(consts.Message.ClientPutComplexDir) msg.data = '' - defaultName = temParams[0]['Name'] - msg['DefaultName'] = defaultName - params = {'TargetFilename': defaultName} + header = self.items.pop(0) + targetFilename = header['Name'] + msg['DefaultName'] = self.items[0]['Name'] + k = 0 for itemParams in self.items: - k = 0 for param, value in itemParams.items(): if value is None: continue if param.startswith(self.ReservedParamPrefix): if param == 'FcData': - msg.data += data + msg.data += value continue if param == 'ContentType': param = 'Metadata.ContentType' param = 'Files.%s.%s' % (k, param) msg[param] = value - k += 1 + k += 1 - if not msg.data: - msg.data = None + if not msg.data: + msg.data = None - # set some defaults - msg['Global'] = consts.FcpFalse - msg['Verbosity'] = consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression - # compose URI - if self.KeyType == consts.KeyType.CHK: - msg['URI'] == consts.KeyType.CHK - elif self.KeyType == consts.KeyType.KSK: - msg['URI'] == consts.KeyType.KSK + '/' + params.pop('TargetFilename') - elif self.KeyType == consts.KeyType.SSK: - msg['URI'] == consts.KeyType.SSK + self.privateKey + '/' + params.pop('TargetFilename') - elif self.KeyType == consts.KeyType.USK: - msg['URI'] == consts.KeyType.USH + self.privateKey + '/' + params.pop('TargetFilename') - - return msg + # determine Uri + if self.keyType == consts.KeyType.CHK: + msg['URI'] = consts.KeyType.CHK + elif self.keyType == consts.KeyType.KSK: + msg['URI'] = consts.KeyType.KSK + '/' + targetFilename + elif self.keyType == consts.KeyType.SSK: + msg['URI'] = self.privateKey + targetFilename + elif self.keyType == consts.KeyType.USK: + msg['URI'] = self.privateKey + targetFilename + + # set params and some defaults + msg['Global'] = False + msg['Verbosity'] = consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression + for param, value in self.params.items(): + if value is None: + continue + msg[param] = value + + return msg This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-07 23:49:39
|
Revision: 171 http://fclient.svn.sourceforge.net/fclient/?rev=171&view=rev Author: jurner Date: 2008-02-07 15:49:44 -0800 (Thu, 07 Feb 2008) Log Message: ----------- some fixes Modified Paths: -------------- trunk/sandbox/fcp/fcp2_0_requests.py Modified: trunk/sandbox/fcp/fcp2_0_requests.py =================================================================== --- trunk/sandbox/fcp/fcp2_0_requests.py 2008-02-07 23:49:12 UTC (rev 170) +++ trunk/sandbox/fcp/fcp2_0_requests.py 2008-02-07 23:49:44 UTC (rev 171) @@ -185,7 +185,7 @@ if params['FcItemType'] == self.ItemTypeData: msg.data = params['FcData'] - if self.keyType == consts.Keytype.CHK: + if self.keyType == consts.KeyType.CHK: msg['TargetFilename'] = targetFilename @@ -217,13 +217,12 @@ if not msg.data: msg.data = None - - + # determine Uri if self.keyType == consts.KeyType.CHK: msg['URI'] = consts.KeyType.CHK elif self.keyType == consts.KeyType.KSK: - msg['URI'] = consts.KeyType.KSK + '/' + targetFilename + msg['URI'] = consts.KeyType.KSK + targetFilename elif self.keyType == consts.KeyType.SSK: msg['URI'] = self.privateKey + targetFilename elif self.keyType == consts.KeyType.USK: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-16 10:07:49
|
Revision: 216 http://fclient.svn.sourceforge.net/fclient/?rev=216&view=rev Author: jurner Date: 2008-02-16 02:07:55 -0800 (Sat, 16 Feb 2008) Log Message: ----------- worked a bit on uploads. Still a sketch Modified Paths: -------------- trunk/sandbox/fcp/fcp2_0_requests.py Modified: trunk/sandbox/fcp/fcp2_0_requests.py =================================================================== --- trunk/sandbox/fcp/fcp2_0_requests.py 2008-02-16 10:07:11 UTC (rev 215) +++ trunk/sandbox/fcp/fcp2_0_requests.py 2008-02-16 10:07:55 UTC (rev 216) @@ -4,28 +4,29 @@ #****************************************************************************************************************** # #****************************************************************************************************************** +#TODO: if only one item is added its name is ignored so far. How to handle self.targetName vs. item['Name'] +#TODO: Metadata.ContentType vs. ContentType is pretty inconsistent class Upload(object): - """Wrapper class to represent a freenet upload + """Wrapper class to manage a freenet uploads + @ivar defaultItem: (int) for directories or multiple uploads the name of this item is used as + default item when a page is displayed @ivar directoryAdded: (bool) True if the upload contains a directory, False otherwise @ivar items: (list) of dicts containing paramaters for each upload @ivar keyType: L{consts.KeyType} the type of key to upload @ivar params: (dict) request parameters @ivar privateKey: (str) private keey (required for SSK or USK uploads) + @ivar targetName: (str) for CHKs the name to be appended to the CHK. For SSKs and USKs the + (target-name/version) part of the key @ivar targetNames: (list) of names already in use (for multi-uploads) @note: you can upload one or more items of any kind (data, files, redirects), except from directories wich have to be the only item to upload """ + PrivateParamNames = ('Data', 'RequestType', 'Name') - ReservedParamPrefix = 'Fc' # params prefixed with this are skipped when generating the message - ItemTypeData = 0 - ItemTypeDirectory = 1 - ItemTypeFile = 2 - ItemTypeRedirect = 3 - def __init__(self, keyType, dontCompress=None, @@ -35,6 +36,7 @@ priorityClass=consts.Priority.Medium, privateKey=None, + targetName=None, ): """ @param keyType: (L{consts.KeyType}) the desired key type to upload @@ -45,14 +47,19 @@ @param priorityClass: @param privateKey: (str) privateKey if keyType is SSK or USK + @param targetName: """ if keyType not in consts.KeyType.TypesAll: raise ValueError('Invalid key type: %r' % keyType) - if keyType in (consts.KeyType.SSK, consts.KeyType.USK) and privateKey is None: - raise ValueError('For %s a public key is required' % keyType) + if keyType in (consts.KeyType.SSK, consts.KeyType.USK) : + if privateKey is None: + raise ValueError('For %s a public key is required' % keyType) + if not targetName: + raise ValueError('For %s a target name is required' % keyType) elif keyType in (consts.KeyType.CHK, consts.KeyType.KSK) and privateKey is not None: raise ValueError('For %s no public key is required' % keyType) + self.defaultItem = 0 self.directoryAdded = False self.items = [] self.keyType = keyType @@ -64,15 +71,16 @@ 'PriorityClass': priorityClass, } self.privateKey = privateKey + self.targetName = targetName self.targetNames = [] # record to check if names are unique (assert order is arbitrary) - def _addItem(self, **params): + def _addItem(self, isDefault=False, **params): """Private method to add an upload item""" if self.directoryAdded: raise ValueError('A directory has already been added, no other items allowed') - if params['FcItemType'] == self.ItemTypeDirectory: + if params['RequestType'] == self.RequestTypeDirectory: if self.directoryAdded: raise ValueError('An item has already been added, no additional directory allowed') else: @@ -85,16 +93,22 @@ self.targetNames.append(name) self.items.append(params) + if isDefault: + self.defaultItem =len(self.items) -1 + - def addData(self, name, data, contentType=None): + def addData(self, name, data, contentType=None, isDefault=False): """Adds data to be uploaded @param name: target name @param data: (str) data to upload @param contentType: (str) content type of the data (if desired) + @param isDefault: (bool) if True, the item is the default item """ return self._addItem( - FcItemType=self.ItemTypeData, - FcData=data, + isDefault=isDefault, + + RequestType=consts.RequestType.PutData, + Data=data, ContentType=contentType, DataLength=len(data), Name=name, @@ -111,7 +125,7 @@ @note: if you add a directory, every attempt to add anything else will fail """ return self._addItem( - FcItemType=self.ItemTypeDirectory, + RequestType=consts.RequestType.PutDir, AllowUnreadableFiles=allowUnreadableFiles, Filename=directory, Name=name, @@ -119,28 +133,34 @@ ) - def addFile(self, name, filename, contentType=None): + def addFile(self, name, filename, contentType=None, isDefault=False): """Adds a file to be uploaded @param name: target name @param filename: (abspath) of the file to be uploaded @param contentType: (str) content type of the file (if desired) + @param isDefault: (bool) if True, the item is the default item """ return self._addItem( - FcItemType=self.ItemTypeFile, + isDefault=isDefault, + + RequestType=sconsts.RequestType.PutFile, ContentType=contentType, Filename=filename, Name=name, UploadFrom=consts.UploadFrom.Disk, ) - - def addRedirect(self, name, redirect): + #TODO: isDefault for redirects??? + def addRedirect(self, name, redirect, isDefault=False): """Adds a redirect to be uploaded @param name: target name @param redirect: (freenet-key) to redirect to + @param isDefault: (bool) if True, the item is the default item """ return self._addItem( - FcItemType=self.ItemTypeRedirect, + isDefault=isDefault, + + RequestType=consts.RequestType.PutRedirect, ContentType=contentType, DataLength=len(data), Name=name, @@ -152,81 +172,80 @@ def getMessage(self, messageClass): """Returns the message for the request, ready to send the request to the node @param messageClass: (L{fcp2_0_message.Message}) class to fill in - @return: (L{fcp2_0_message.Message}) instance + @return: (tuple) (L{consts.RequestType}, L{fcp2_0_message.Message}) or (None, None) + if ther is nothing to upload """ n = len(self.items) if n == 0: - return None + return None, None - elif n == 1 and self.items[0]['FcItemType'] == self.ItemTypeDirectory: - msg = messageClass(consts.Message.ClientPutDiskDir) - params = self.items[0] - targetName = params.pop('Name') - for param, value in params.items(): - if value is None: - continue - if param.startswith(self.ReservedParamPrefix): - continue - msg[param] = value + elif n == 1: + requestType = self.items[0]['RequestType'] - elif n == 1: - msg = messageClass(consts.Message.ClientPut) - params = self.items[0] - targetFilename = params.pop('Name') - for param, value in params.items(): - if value is None: - continue - if param.startswith(self.ReservedParamPrefix): - continue + if requestType == consts.RequestType.PutDir: + msg = messageClass(consts.Message.ClientPutDiskDir) + params = self.items[0] + for param, value in params.items(): + if value is None or param in PrivateParamNames: + continue + msg[param] = value + + item = self.items[self.defaultItem] + msg['DefaultName'] = item['Name'] + + else: + msg = messageClass(consts.Message.ClientPut) + for param, value in params.items(): + if value is None or param in PrivateParamNames: + continue + if param == 'ContentType': + param = 'Metadata.ContentType' + msg[param] = value + + if params['RequestType'] == self.RequestTypeData: + msg.data = params['Data'] - if param == 'ContentType': - param = 'Metadata.ContentType' - msg[param] = value - - if params['FcItemType'] == self.ItemTypeData: - msg.data = params['FcData'] - if self.keyType == consts.KeyType.CHK: - msg['TargetFilename'] = targetFilename - - - #TODO: USK@s allowed for complex dirs? else: - - #NOTE: for simplicity we take the first item as default item and its name - # as TargetName if that causes any problems, pass it twice + requestType = consts.PutMultipole msg = messageClass(consts.Message.ClientPutComplexDir) - msg.data = '' - header = self.items.pop(0) - targetFilename = header['Name'] - msg['DefaultName'] = self.items[0]['Name'] - k = 0 - for itemParams in self.items: + data = None + for n, itemParams in enumerate(self.items): for param, value in itemParams.items(): - if value is None: + if param == 'Data': + if data is None: + data = '' + data += value continue - if param.startswith(self.ReservedParamPrefix): - if param == 'FcData': - msg.data += value + + if param == 'Name': + param = 'Files.%s.%s' % (n, param) + msg[param] = value continue - + + if value is None or param in PrivateParamNames: + continue + if param == 'ContentType': param = 'Metadata.ContentType' - param = 'Files.%s.%s' % (k, param) + param = 'Files.%s.%s' % (n, param) msg[param] = value - k += 1 + + item = self.items[self.defaultItem] + msg['DefaultName'] = item['Name'] + if data is not None: + msg.data = data - if not msg.data: - msg.data = None - # determine Uri if self.keyType == consts.KeyType.CHK: msg['URI'] = consts.KeyType.CHK + if self.targetName: + msg['TargetFilename'] = self.targetName elif self.keyType == consts.KeyType.KSK: - msg['URI'] = consts.KeyType.KSK + targetFilename + msg['URI'] = consts.KeyType.KSK + self.targetName elif self.keyType == consts.KeyType.SSK: - msg['URI'] = self.privateKey + targetFilename + msg['URI'] = self.privateKey + self.targetName elif self.keyType == consts.KeyType.USK: - msg['URI'] = self.privateKey + targetFilename + msg['URI'] = self.privateKey + self.targetName # set params and some defaults msg['Global'] = False @@ -236,5 +255,5 @@ continue msg[param] = value - return msg + return requestType, msg This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-24 11:50:40
|
Revision: 246 http://fclient.svn.sourceforge.net/fclient/?rev=246&view=rev Author: jurner Date: 2008-02-24 03:50:43 -0800 (Sun, 24 Feb 2008) Log Message: ----------- del Modified Paths: -------------- trunk/sandbox/fcp/fcp2_0_requests.py Modified: trunk/sandbox/fcp/fcp2_0_requests.py =================================================================== --- trunk/sandbox/fcp/fcp2_0_requests.py 2008-02-24 11:50:25 UTC (rev 245) +++ trunk/sandbox/fcp/fcp2_0_requests.py 2008-02-24 11:50:43 UTC (rev 246) @@ -22,6 +22,7 @@ @note: you can upload one or more items of any kind (data, files, redirects), except from directories wich have to be the only item to upload + @note: if you want to upload a single redirect keyType has to be set to L{consts.KeyType.KSK} """ PrivateParamNames = ('Data', 'RequestType', 'Name') @@ -80,7 +81,7 @@ if self.directoryAdded: raise ValueError('A directory has already been added, no other items allowed') - if params['RequestType'] == self.RequestTypeDirectory: + if params['RequestType'] == consts.RequestType.PutDir: if self.directoryAdded: raise ValueError('An item has already been added, no additional directory allowed') else: @@ -116,7 +117,7 @@ ) - def addDirectory(name, directory, allowUnreadableFiles=False, defaultName=None): + def addDirectory(self, name, directory, allowUnreadableFiles=False, defaultName=None): """Adds a directory to be uploaded @param name: target name @param directory: (abspath) of the directory to be uploaded @@ -143,14 +144,14 @@ return self._addItem( isDefault=isDefault, - RequestType=sconsts.RequestType.PutFile, + RequestType=consts.RequestType.PutFile, ContentType=contentType, Filename=filename, Name=name, UploadFrom=consts.UploadFrom.Disk, ) - #TODO: isDefault for redirects??? + def addRedirect(self, name, redirect, isDefault=False): """Adds a redirect to be uploaded @param name: target name @@ -161,8 +162,6 @@ isDefault=isDefault, RequestType=consts.RequestType.PutRedirect, - ContentType=contentType, - DataLength=len(data), Name=name, TargetURI=redirect, UploadFrom=consts.UploadFrom.Redirect @@ -186,7 +185,7 @@ msg = messageClass(consts.Message.ClientPutDiskDir) params = self.items[0] for param, value in params.items(): - if value is None or param in PrivateParamNames: + if value is None or param in self.PrivateParamNames: continue msg[param] = value @@ -195,18 +194,23 @@ else: msg = messageClass(consts.Message.ClientPut) - for param, value in params.items(): - if value is None or param in PrivateParamNames: + item = self.items[0] + for param, value in item.items(): + if value is None or param in self.PrivateParamNames: continue if param == 'ContentType': param = 'Metadata.ContentType' msg[param] = value - if params['RequestType'] == self.RequestTypeData: - msg.data = params['Data'] + # handle some specilal cases + if requestType == consts.RequestType.PutData: + msg.data = item['Data'] + elif requestType == consts.RequestType.PutRedirect: + if self.keyType != consts.KeyType.KSK: + raise ValueError('For redirects keyType must be %s' % consts.KeyType.KSK) else: - requestType = consts.PutMultipole + requestType = consts.RequestType.PutMultiple msg = messageClass(consts.Message.ClientPutComplexDir) data = None for n, itemParams in enumerate(self.items): @@ -222,7 +226,7 @@ msg[param] = value continue - if value is None or param in PrivateParamNames: + if value is None or param in self.PrivateParamNames: continue if param == 'ContentType': This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-24 11:52:31
|
Revision: 247 http://fclient.svn.sourceforge.net/fclient/?rev=247&view=rev Author: jurner Date: 2008-02-24 03:52:23 -0800 (Sun, 24 Feb 2008) Log Message: ----------- too much trouble, split requests up into client methods. Del module. Removed Paths: ------------- trunk/sandbox/fcp/fcp2_0_requests.py Deleted: trunk/sandbox/fcp/fcp2_0_requests.py =================================================================== --- trunk/sandbox/fcp/fcp2_0_requests.py 2008-02-24 11:50:43 UTC (rev 246) +++ trunk/sandbox/fcp/fcp2_0_requests.py 2008-02-24 11:52:23 UTC (rev 247) @@ -1,263 +0,0 @@ -"""fcp request objects""" - -import fcp2_0_consts as consts -#****************************************************************************************************************** -# -#****************************************************************************************************************** -#TODO: if only one item is added its name is ignored so far. How to handle self.targetName vs. item['Name'] -#TODO: Metadata.ContentType vs. ContentType is pretty inconsistent -class Upload(object): - """Wrapper class to manage a freenet uploads - - @ivar defaultItem: (int) for directories or multiple uploads the name of this item is used as - default item when a page is displayed - @ivar directoryAdded: (bool) True if the upload contains a directory, False otherwise - @ivar items: (list) of dicts containing paramaters for each upload - @ivar keyType: L{consts.KeyType} the type of key to upload - @ivar params: (dict) request parameters - @ivar privateKey: (str) private keey (required for SSK or USK uploads) - @ivar targetName: (str) for CHKs the name to be appended to the CHK. For SSKs and USKs the - (target-name/version) part of the key - @ivar targetNames: (list) of names already in use (for multi-uploads) - - @note: you can upload one or more items of any kind (data, files, redirects), except from directories - wich have to be the only item to upload - @note: if you want to upload a single redirect keyType has to be set to L{consts.KeyType.KSK} - """ - - PrivateParamNames = ('Data', 'RequestType', 'Name') - - - def __init__(self, - keyType, - dontCompress=None, - earlyEncode=None, - maxRetries=None, - persistence=consts.Persistence.Connection, - priorityClass=consts.Priority.Medium, - - privateKey=None, - targetName=None, - ): - """ - @param keyType: (L{consts.KeyType}) the desired key type to upload - @param dontCompress: - @param earlyEncode: - @param maxRetries: - @param persistence: - @param priorityClass: - - @param privateKey: (str) privateKey if keyType is SSK or USK - @param targetName: - """ - if keyType not in consts.KeyType.TypesAll: - raise ValueError('Invalid key type: %r' % keyType) - if keyType in (consts.KeyType.SSK, consts.KeyType.USK) : - if privateKey is None: - raise ValueError('For %s a public key is required' % keyType) - if not targetName: - raise ValueError('For %s a target name is required' % keyType) - elif keyType in (consts.KeyType.CHK, consts.KeyType.KSK) and privateKey is not None: - raise ValueError('For %s no public key is required' % keyType) - - self.defaultItem = 0 - self.directoryAdded = False - self.items = [] - self.keyType = keyType - self.params = { - 'DontCompress': dontCompress, - 'EarlyEncode': earlyEncode, - 'MaxRetries': maxRetries, - 'Persistence': persistence, - 'PriorityClass': priorityClass, - } - self.privateKey = privateKey - self.targetName = targetName - self.targetNames = [] # record to check if names are unique (assert order is arbitrary) - - - def _addItem(self, isDefault=False, **params): - """Private method to add an upload item""" - if self.directoryAdded: - raise ValueError('A directory has already been added, no other items allowed') - - if params['RequestType'] == consts.RequestType.PutDir: - if self.directoryAdded: - raise ValueError('An item has already been added, no additional directory allowed') - else: - self.directoryAdded = True - - name = params['Name'] - if name in self.targetNames: - raise ValueError('Target name already exists: %r' % name) - - self.targetNames.append(name) - self.items.append(params) - - if isDefault: - self.defaultItem =len(self.items) -1 - - - def addData(self, name, data, contentType=None, isDefault=False): - """Adds data to be uploaded - @param name: target name - @param data: (str) data to upload - @param contentType: (str) content type of the data (if desired) - @param isDefault: (bool) if True, the item is the default item - """ - return self._addItem( - isDefault=isDefault, - - RequestType=consts.RequestType.PutData, - Data=data, - ContentType=contentType, - DataLength=len(data), - Name=name, - UploadFrom=consts.UploadFrom.Direct - ) - - - def addDirectory(self, name, directory, allowUnreadableFiles=False, defaultName=None): - """Adds a directory to be uploaded - @param name: target name - @param directory: (abspath) of the directory to be uploaded - @param defaultName: (for SSKs and USKs, the file to display when the key is requested) - - @note: if you add a directory, every attempt to add anything else will fail - """ - return self._addItem( - RequestType=consts.RequestType.PutDir, - AllowUnreadableFiles=allowUnreadableFiles, - Filename=directory, - Name=name, - DefaultName=defaultName, - ) - - - def addFile(self, name, filename, contentType=None, isDefault=False): - """Adds a file to be uploaded - @param name: target name - @param filename: (abspath) of the file to be uploaded - @param contentType: (str) content type of the file (if desired) - @param isDefault: (bool) if True, the item is the default item - """ - return self._addItem( - isDefault=isDefault, - - RequestType=consts.RequestType.PutFile, - ContentType=contentType, - Filename=filename, - Name=name, - UploadFrom=consts.UploadFrom.Disk, - ) - - - def addRedirect(self, name, redirect, isDefault=False): - """Adds a redirect to be uploaded - @param name: target name - @param redirect: (freenet-key) to redirect to - @param isDefault: (bool) if True, the item is the default item - """ - return self._addItem( - isDefault=isDefault, - - RequestType=consts.RequestType.PutRedirect, - Name=name, - TargetURI=redirect, - UploadFrom=consts.UploadFrom.Redirect - ) - - - def getMessage(self, messageClass): - """Returns the message for the request, ready to send the request to the node - @param messageClass: (L{fcp2_0_message.Message}) class to fill in - @return: (tuple) (L{consts.RequestType}, L{fcp2_0_message.Message}) or (None, None) - if ther is nothing to upload - """ - n = len(self.items) - if n == 0: - return None, None - - elif n == 1: - requestType = self.items[0]['RequestType'] - - if requestType == consts.RequestType.PutDir: - msg = messageClass(consts.Message.ClientPutDiskDir) - params = self.items[0] - for param, value in params.items(): - if value is None or param in self.PrivateParamNames: - continue - msg[param] = value - - item = self.items[self.defaultItem] - msg['DefaultName'] = item['Name'] - - else: - msg = messageClass(consts.Message.ClientPut) - item = self.items[0] - for param, value in item.items(): - if value is None or param in self.PrivateParamNames: - continue - if param == 'ContentType': - param = 'Metadata.ContentType' - msg[param] = value - - # handle some specilal cases - if requestType == consts.RequestType.PutData: - msg.data = item['Data'] - elif requestType == consts.RequestType.PutRedirect: - if self.keyType != consts.KeyType.KSK: - raise ValueError('For redirects keyType must be %s' % consts.KeyType.KSK) - - else: - requestType = consts.RequestType.PutMultiple - msg = messageClass(consts.Message.ClientPutComplexDir) - data = None - for n, itemParams in enumerate(self.items): - for param, value in itemParams.items(): - if param == 'Data': - if data is None: - data = '' - data += value - continue - - if param == 'Name': - param = 'Files.%s.%s' % (n, param) - msg[param] = value - continue - - if value is None or param in self.PrivateParamNames: - continue - - if param == 'ContentType': - param = 'Metadata.ContentType' - param = 'Files.%s.%s' % (n, param) - msg[param] = value - - item = self.items[self.defaultItem] - msg['DefaultName'] = item['Name'] - if data is not None: - msg.data = data - - # determine Uri - if self.keyType == consts.KeyType.CHK: - msg['URI'] = consts.KeyType.CHK - if self.targetName: - msg['TargetFilename'] = self.targetName - elif self.keyType == consts.KeyType.KSK: - msg['URI'] = consts.KeyType.KSK + self.targetName - elif self.keyType == consts.KeyType.SSK: - msg['URI'] = self.privateKey + self.targetName - elif self.keyType == consts.KeyType.USK: - msg['URI'] = self.privateKey + self.targetName - - # set params and some defaults - msg['Global'] = False - msg['Verbosity'] = consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression - for param, value in self.params.items(): - if value is None: - continue - msg[param] = value - - return requestType, msg - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |