Merge lp:~ubuntuone-control-tower/ubuntu/lucid/ubuntuone-storage-protocol/trunk into lp:ubuntu/lucid/ubuntuone-storage-protocol

Proposed by dobey
Status: Merged
Merged at revision: not available
Proposed branch: lp:~ubuntuone-control-tower/ubuntu/lucid/ubuntuone-storage-protocol/trunk
Merge into: lp:ubuntu/lucid/ubuntuone-storage-protocol
Diff against target: 492 lines (+125/-83)
10 files modified
PKG-INFO (+1/-1)
debian/changelog (+13/-0)
debian/control (+5/-4)
debian/source/format (+2/-0)
setup.py (+12/-9)
ubuntuone/__init__.py (+5/-4)
ubuntuone/storageprotocol/client.py (+27/-26)
ubuntuone/storageprotocol/context.py (+21/-8)
ubuntuone/storageprotocol/hash.py (+26/-24)
ubuntuone/storageprotocol/validators.py (+13/-7)
To merge this branch: bzr merge lp:~ubuntuone-control-tower/ubuntu/lucid/ubuntuone-storage-protocol/trunk
Reviewer Review Type Date Requested Status
Ubuntu branches Pending
Review via email: mp+22581@code.launchpad.net
To post a comment you must log in.
14. By Luke Yelavich

* New upstream release.
* Added debian/source/format.
* Add Build-Depened on python-openssl (LP: #539809)

15. By Luke Yelavich

releasing version 1.1.90-0ubuntu1

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'PKG-INFO'
2--- PKG-INFO 2010-03-04 16:16:33 +0000
3+++ PKG-INFO 2010-03-31 23:47:26 +0000
4@@ -1,6 +1,6 @@
5 Metadata-Version: 1.0
6 Name: ubuntuone-storage-protocol
7-Version: 1.1.3
8+Version: 1.1.90
9 Summary: UNKNOWN
10 Home-page: UNKNOWN
11 Author: UNKNOWN
12
13=== modified file 'debian/changelog'
14--- debian/changelog 2010-03-05 14:14:58 +0000
15+++ debian/changelog 2010-03-31 23:47:26 +0000
16@@ -1,3 +1,16 @@
17+ubuntuone-storage-protocol (1.1.90-0ubuntu1) UNRELEASED; urgency=low
18+
19+ * New upstream release.
20+ * Added debian/source/format.
21+
22+ -- Rodney Dawes <rodney.dawes@canonical.com> Wed, 31 Mar 2010 19:40:44 -0400
23+
24+ubuntuone-storage-protocol (1.1.3-0ubuntu2) lucid; urgency=low
25+
26+ * Add Build-Depened on python-openssl (LP: #539809)
27+
28+ -- Rodney Dawes <rodney.dawes@canonical.com> Tue, 16 Mar 2010 16:12:50 -0400
29+
30 ubuntuone-storage-protocol (1.1.3-0ubuntu1) lucid; urgency=low
31
32 * New upstream release.
33
34=== modified file 'debian/control'
35--- debian/control 2010-03-04 16:27:48 +0000
36+++ debian/control 2010-03-31 23:47:26 +0000
37@@ -6,12 +6,13 @@
38 XSBC-Original-Maintainer: Rick McBride <rick.mcbride@canonical.com>
39 Build-Depends: debhelper (>= 5),
40 cdbs,
41- python-all-dev (>= 2.5)
42-Build-Depends-Indep: protobuf-compiler (> 2.0.3-0ubuntu1),
43+ python-all (>= 2.5)
44+Build-Depends-Indep: protobuf-compiler (>> 2.0.3-0ubuntu1),
45 python-central,
46 python-twisted-core,
47- python-oauth (>= 1.0~svn1092)
48-Standards-Version: 3.8.3
49+ python-oauth (>= 1.0~svn1092),
50+ python-openssl
51+Standards-Version: 3.8.4
52 Homepage: https://one.ubuntu.com
53
54 Package: python-ubuntuone-storageprotocol
55
56=== added directory 'debian/source'
57=== added file 'debian/source/format'
58--- debian/source/format 1970-01-01 00:00:00 +0000
59+++ debian/source/format 2010-03-31 23:47:26 +0000
60@@ -0,0 +1,2 @@
61+3.0 (quilt)
62+
63
64=== modified file 'setup.py'
65--- setup.py 2010-03-04 16:16:33 +0000
66+++ setup.py 2010-03-31 23:47:26 +0000
67@@ -3,13 +3,13 @@
68 #
69 # Copyright 2009 Canonical Ltd.
70 #
71-# This program is free software: you can redistribute it and/or modify it
72+# This program is free software: you can redistribute it and/or modify it
73 # under the terms of the GNU Affero General Public License version 3,
74 # as published by the Free Software Foundation.
75 #
76-# This program is distributed in the hope that it will be useful, but
77-# WITHOUT ANY WARRANTY; without even the implied warranties of
78-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
79+# This program is distributed in the hope that it will be useful, but
80+# WITHOUT ANY WARRANTY; without even the implied warranties of
81+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
82 # PURPOSE. See the GNU Affero General Public License for more details.
83 #
84 # You should have received a copy of the GNU Affero General Public License
85@@ -33,6 +33,8 @@
86 except ImportError:
87 from contrib import check
88
89+from ubuntuone.storageprotocol.context import ssl_cert_location
90+
91 class StorageProtocolBuild(build.build):
92 """Class to build the protobuf files."""
93
94@@ -45,7 +47,7 @@
95 sys.stderr.write("*** Cannot find protoc; is the protobuf-compiler "
96 "package installed?\n")
97 sys.exit(-1)
98-
99+
100 for source in glob.glob("ubuntuone/storageprotocol/*.proto"):
101 protoc_command = protoc + " --python_out=. " + source
102 if os.system(protoc_command) != 0:
103@@ -119,16 +121,17 @@
104
105
106 setup(name='ubuntuone-storage-protocol',
107- version='1.1.3',
108+ version='1.1.90',
109 packages=['ubuntuone',
110 'ubuntuone.storageprotocol'],
111- data_files=[('/etc/ssl/certs',
112- ['data/UbuntuOne-Go_Daddy_CA.pem',
113+ data_files=[(ssl_cert_location,
114+ ['data/UbuntuOne-Go_Daddy_CA.pem',
115 'data/UbuntuOne-Go_Daddy_Class_2_CA.pem'])],
116
117 cmdclass = {
118 'build' : StorageProtocolBuild,
119 'clean' : StorageProtocolClean,
120 'check' : StorageProtocolCheck
121- }
122+ },
123+ namespace_packages = ['ubuntuone'],
124 )
125
126=== modified file 'ubuntuone/__init__.py'
127--- ubuntuone/__init__.py 2009-06-30 12:00:00 +0000
128+++ ubuntuone/__init__.py 2010-03-31 23:47:26 +0000
129@@ -2,15 +2,16 @@
130 #
131 # Copyright 2009 Canonical Ltd.
132 #
133-# This program is free software: you can redistribute it and/or modify it
134+# This program is free software: you can redistribute it and/or modify it
135 # under the terms of the GNU Affero General Public License version 3,
136 # as published by the Free Software Foundation.
137 #
138-# This program is distributed in the hope that it will be useful, but
139-# WITHOUT ANY WARRANTY; without even the implied warranties of
140-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
141+# This program is distributed in the hope that it will be useful, but
142+# WITHOUT ANY WARRANTY; without even the implied warranties of
143+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
144 # PURPOSE. See the GNU Affero General Public License for more details.
145 #
146 # You should have received a copy of the GNU Affero General Public License
147 # along with this program. If not, see <http://www.gnu.org/licenses/>.
148 """ubuntuone package"""
149+__import__('pkg_resources').declare_namespace(__name__)
150
151=== modified file 'ubuntuone/storageprotocol/client.py'
152--- ubuntuone/storageprotocol/client.py 2010-03-04 16:16:33 +0000
153+++ ubuntuone/storageprotocol/client.py 2010-03-31 23:47:26 +0000
154@@ -164,8 +164,9 @@
155 elif msg.type == protocol_pb2.Volumes.UDF:
156 vol = volumes.UDFVolume.from_msg(msg.udf)
157 else:
158- raise TypeError("Message.volume_created's type is not valid: %s" %
159- message.volume_created.type)
160+ msg = "Message.volume_created's type is not valid: %s" % \
161+ message.volume_created.type
162+ raise TypeError(msg)
163
164 self._volume_created_callback(vol)
165
166@@ -235,50 +236,50 @@
167 p.start()
168 return p.deferred
169
170- def get_content(self, share, node, hash, offset=0,
171+ def get_content(self, share, node, a_hash, offset=0,
172 callback=None, node_attr_callback=None):
173- """Get the content of node with hash
174+ """Get the content of node with 'a_hash'.
175
176 the content will be on request.content
177 or callback will be called for every piece that arrives.
178
179 """
180- req = self.get_content_request(share, node, hash, offset,
181+ req = self.get_content_request(share, node, a_hash, offset,
182 callback, node_attr_callback)
183 return req.deferred
184
185- def get_content_request(self, share, node, hash, offset=0,
186+ def get_content_request(self, share, node, a_hash, offset=0,
187 callback=None, node_attr_callback=None):
188- """Get the content of node with hash, return the request.
189+ """Get the content of node with 'a_hash', return the request.
190
191 The content will be on request.content, or callback will be
192 called for every piece that arrives.
193
194 """
195- p = GetContent(self, share, node, hash, offset,
196- callback, node_attr_callback)
197+ p = GetContent(self, share, node, a_hash, offset,
198+ callback, node_attr_callback)
199 p.start()
200 return p
201
202- def put_content(self, share, node, previous_hash, hash,
203+ def put_content(self, share, node, previous_hash, new_hash,
204 crc32, size, deflated_size, fd):
205 """Put the content of fd into file node."""
206- req = self.put_content_request(share, node, previous_hash,
207- hash, crc32, size, deflated_size, fd)
208+ req = self.put_content_request(share, node, previous_hash, new_hash,
209+ crc32, size, deflated_size, fd)
210 return req.deferred
211
212- def put_content_request(self, share, node, previous_hash, hash,
213+ def put_content_request(self, share, node, previous_hash, new_hash,
214 crc32, size, deflated_size, fd):
215 """Put the content of fd into file node, return the request."""
216- p = PutContent(self, share, node, previous_hash, hash, crc32, size,
217- deflated_size, fd)
218+ p = PutContent(self, share, node, previous_hash, new_hash,
219+ crc32, size, deflated_size, fd)
220 p.start()
221 return p
222
223 def query(self, items):
224- """Get the current hash for items if changed
225+ """Get the current hash for items if changed.
226
227- items is a list of (node, hash) tuples.
228+ 'items' is a list of (node, hash) tuples.
229
230 """
231 r = MultiQuery(self, items)
232@@ -510,14 +511,14 @@
233
234 """
235
236- def __init__(self, protocol, share, node_id, hash,
237+ def __init__(self, protocol, share, node_id, a_hash,
238 offset=0, callback=None, node_attr_callback=None):
239- """Request the content of node with hash.
240+ """Request the content of node with 'a_hash'.
241
242 @param protocol: the request handler
243 @param share: the share node or root
244 @param node_id: the node id of the node we want to read
245- @param hash: the hash of the content of the version we have
246+ @param a_hash: the hash of the content of the version we have
247 @param offset: offset for reading
248 @param callback: function to call when data arrives
249
250@@ -525,7 +526,7 @@
251 request.Request.__init__(self, protocol)
252 self.share = share
253 self.node_id = node_id
254- self.hash = hash
255+ self.hash = a_hash
256 self.offset = offset
257 self.callback = callback
258 self.node_attr_callback = node_attr_callback
259@@ -981,11 +982,11 @@
260
261 def add_items(msg, *args):
262 """Add items to query."""
263- for share, node, hash in args:
264+ for share, node, content_hash in args:
265 qi = msg.query.add()
266 qi.share = share
267 qi.node = str(node)
268- qi.hash = hash
269+ qi.hash = content_hash
270
271 for item in items:
272 add_items(qm, item)
273@@ -1073,7 +1074,7 @@
274 """Put content request."""
275
276 def __init__(self, protocol, share, node_id,
277- previous_hash, hash, crc32, size,
278+ previous_hash, new_hash, crc32, size,
279 deflated_size, fd):
280 """Put content into a node.
281
282@@ -1081,7 +1082,7 @@
283 @param share: the share node or root
284 @param node_id: the node to receive the content
285 @param previous_hash: the hash the node has (for conflict checking)
286- @param hash: the hash hint for the new content
287+ @param new_hash: the hash hint for the new content
288 @param crc32: the crc32 hint for the new content
289 @param size: the size hint for the new content
290 @param fd: a file-like object to read data from
291@@ -1091,7 +1092,7 @@
292 self.share = share
293 self.node_id = node_id
294 self.previous_hash = previous_hash
295- self.hash = hash
296+ self.hash = new_hash
297 self.crc32 = crc32
298 self.size = size
299 self.deflated_size = deflated_size
300
301=== modified file 'ubuntuone/storageprotocol/context.py'
302--- ubuntuone/storageprotocol/context.py 2009-07-16 16:30:00 +0000
303+++ ubuntuone/storageprotocol/context.py 2010-03-31 23:47:26 +0000
304@@ -2,34 +2,47 @@
305 #
306 # Copyright 2009 Canonical Ltd.
307 #
308-# This program is free software: you can redistribute it and/or modify it
309+# This program is free software: you can redistribute it and/or modify it
310 # under the terms of the GNU Affero General Public License version 3,
311 # as published by the Free Software Foundation.
312 #
313-# This program is distributed in the hope that it will be useful, but
314-# WITHOUT ANY WARRANTY; without even the implied warranties of
315-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
316+# This program is distributed in the hope that it will be useful, but
317+# WITHOUT ANY WARRANTY; without even the implied warranties of
318+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
319 # PURPOSE. See the GNU Affero General Public License for more details.
320 #
321 # You should have received a copy of the GNU Affero General Public License
322 # along with this program. If not, see <http://www.gnu.org/licenses/>.
323-"""
324+"""
325 Standard Routines for working with ssl context creation
326 """
327+import os
328+import sys
329
330 from OpenSSL import SSL
331 from twisted.internet import ssl
332
333+if sys.platform == "win32":
334+ from bzrlib import win32utils as win
335+ ssl_cert_location = os.path.join(
336+ win.get_appdata_location_unicode(),
337+ "ubuntuone-storageprotocol")
338+else:
339+ ssl_cert_location = '/etc/ssl/certs'
340+
341+
342 def get_ssl_context(no_verify):
343 """ Get the ssl context """
344 if no_verify:
345 ctx = ssl.ClientContextFactory()
346 else:
347 ca_file = ssl.Certificate.loadPEM(file(
348- '/etc/ssl/certs/UbuntuOne-Go_Daddy_Class_2_CA.pem', 'r').read())
349+ os.path.join(ssl_cert_location,
350+ 'UbuntuOne-Go_Daddy_Class_2_CA.pem'), 'r').read())
351 ca_file_2 = ssl.Certificate.loadPEM(file(
352- '/etc/ssl/certs/UbuntuOne-Go_Daddy_CA.pem', 'r').read())
353- ctx = ssl.CertificateOptions(verify=True,
354+ os.path.join(ssl_cert_location,
355+ 'UbuntuOne-Go_Daddy_CA.pem'), 'r').read())
356+ ctx = ssl.CertificateOptions(verify=True,
357 caCerts=[ca_file.original, ca_file_2.original],
358 method=SSL.SSLv23_METHOD)
359 return ctx
360
361=== modified file 'ubuntuone/storageprotocol/hash.py'
362--- ubuntuone/storageprotocol/hash.py 2009-06-30 12:00:00 +0000
363+++ ubuntuone/storageprotocol/hash.py 2010-03-31 23:47:26 +0000
364@@ -1,35 +1,35 @@
365-# ubuntuone.storageprotocol.hash - hash handling
366+# ubuntuone.storageprotocol.hash - content hash handling
367 #
368 # Author: Lucio Torre <lucio.torre@canonical.com>
369 #
370 # Copyright 2009 Canonical Ltd.
371 #
372-# This program is free software: you can redistribute it and/or modify it
373+# This program is free software: you can redistribute it and/or modify it
374 # under the terms of the GNU Affero General Public License version 3,
375 # as published by the Free Software Foundation.
376 #
377-# This program is distributed in the hope that it will be useful, but
378-# WITHOUT ANY WARRANTY; without even the implied warranties of
379-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
380+# This program is distributed in the hope that it will be useful, but
381+# WITHOUT ANY WARRANTY; without even the implied warranties of
382+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
383 # PURPOSE. See the GNU Affero General Public License for more details.
384 #
385 # You should have received a copy of the GNU Affero General Public License
386 # along with this program. If not, see <http://www.gnu.org/licenses/>.
387-""" Hash Handling Stuffs
388-"""
389+"""Hash Handling Stuffs."""
390+
391+import copy
392 import hashlib
393-import copy
394 import zlib
395
396-# XXX:
397-# lucio.torre
398-# rename this module so it doesnt shadow builtin hash
399+# XXX: (lucio.torre) Rename this module so it doesnt shadow builtin hash
400+# see Bug #384153 for updates
401
402 class ContentHash(object):
403- """ encapsulates the generation of content hashes
404-
405- we cant subclass openssl hash classes, so we do some
406- composition to get similar methods
407+ """Encapsulates the generation of content hashes.
408+
409+ We cant subclass openssl hash classes, so we do some
410+ composition to get similar methods.
411+
412 """
413 method = None
414 method_name = ""
415@@ -41,20 +41,20 @@
416 update = property(lambda self: self.hash_object.update)
417 digest = property(lambda self: self.hash_object.digest)
418 hexdigest = property(lambda self: self.hash_object.hexdigest)
419+
420 def copy(self):
421- """ Copies generated hash
422- """
423+ """Copies the generated hash."""
424 cp = copy.copy(self)
425 cp.hash_object = self.hash_object.copy()
426 return cp
427+
428 def content_hash(self):
429- """ adds hex digest to content hash
430- """
431+ """Adds hex digest to content hash."""
432 return self.method_name +":"+ self.hash_object.hexdigest()
433
434 class SHA1ContentHash(ContentHash):
435- """ Generates SHA1 of ConentHash?
436- """
437+ """Generates SHA1 of ConentHash."""
438+
439 method = hashlib.sha1
440 method_name = "sha1"
441
442@@ -62,8 +62,10 @@
443 content_hash_factory = SHA1ContentHash
444
445 def crc32(data, previous_crc32=0):
446- """ a correct crc32 function
447-
448- always returns positive values
449+ """A correct crc32 function.
450+
451+ Always returns positive values.
452+
453 """
454 return zlib.crc32(data, previous_crc32) & 0xFFFFFFFFL
455+
456
457=== modified file 'ubuntuone/storageprotocol/validators.py'
458--- ubuntuone/storageprotocol/validators.py 2009-08-11 16:00:00 +0000
459+++ ubuntuone/storageprotocol/validators.py 2010-03-31 23:47:26 +0000
460@@ -33,19 +33,25 @@
461 is_valid_share_id = is_valid_share
462
463 def is_valid_sha1(sha1):
464- """
465- A valid sha1 hash says "sha1:", and then a 40 hex characters
466+ """Validate 'sha1'.
467+
468+ A valid sha1 hash reads "sha1:", and then a 40 hex characters.
469+
470 """
471 return bool(re.match(r'sha1:[0-9a-z]{40}$', sha1))
472
473-def is_valid_hash(hash):
474- """
475- A valid hash is either the empty string, request.UNKNOWN_HASH, or
476- one of the other known hash types.
477+def is_valid_hash(a_hash):
478+ """Validate 'a_hash'.
479+
480+ A valid hash is either the empty string, request.UNKNOWN_HASH, or one of
481+ the other known hash types.
482+
483 """
484 # circular import
485 from ubuntuone.storageprotocol import request
486- return hash == '' or hash == request.UNKNOWN_HASH or is_valid_sha1(hash)
487+ is_valid = a_hash == '' or a_hash == request.UNKNOWN_HASH or \
488+ is_valid_sha1(a_hash)
489+ return is_valid
490
491 def validate_message(message):
492 """

Subscribers

People subscribed via source and target branches

to all changes: