Merge lp:~nataliabidart/ubuntuone-control-panel/validate-in-sd into lp:ubuntuone-control-panel

Proposed by Natalia Bidart
Status: Merged
Approved by: Roberto Alsina
Approved revision: 308
Merged at revision: 306
Proposed branch: lp:~nataliabidart/ubuntuone-control-panel/validate-in-sd
Merge into: lp:ubuntuone-control-panel
Diff against target: 233 lines (+35/-112)
4 files modified
ubuntuone/controlpanel/backend.py (+2/-28)
ubuntuone/controlpanel/sd_client/__init__.py (+4/-0)
ubuntuone/controlpanel/tests/test_backend.py (+12/-84)
ubuntuone/controlpanel/tests/test_sd_client.py (+17/-0)
To merge this branch: bzr merge lp:~nataliabidart/ubuntuone-control-panel/validate-in-sd
Reviewer Review Type Date Requested Status
Roberto Alsina (community) Approve
Diego Sarmentero (community) Approve
Review via email: mp+100041@code.launchpad.net

Commit message

- Remove custom path validation and use the one provided by syncdaemon
  (LP: #824252).

To post a comment you must log in.
Revision history for this message
Diego Sarmentero (diegosarmentero) wrote :

+1

review: Approve
Revision history for this message
Roberto Alsina (ralsina) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'ubuntuone/controlpanel/backend.py'
2--- ubuntuone/controlpanel/backend.py 2012-03-29 14:31:49 +0000
3+++ ubuntuone/controlpanel/backend.py 2012-03-29 21:44:21 +0000
4@@ -1,9 +1,6 @@
5 # -*- coding: utf-8 -*-
6-
7-# Authors: Alejandro J. Cura <alecu@canonical.com>
8-# Authors: Natalia B. Bidart <nataliabidart@canonical.com>
9 #
10-# Copyright 2010 Canonical Ltd.
11+# Copyright 2010-2012 Canonical Ltd.
12 #
13 # This program is free software: you can redistribute it and/or modify it
14 # under the terms of the GNU General Public License version 3, as published
15@@ -26,11 +23,7 @@
16 from functools import wraps
17
18 from twisted.internet.defer import inlineCallbacks, returnValue
19-# No name 'is_link' in module 'ubuntuone.platform'
20-# pylint: disable=E0611, F0401
21-from ubuntuone.platform import is_link
22 from ubuntuone.platform.credentials import CredentialsManagementTool
23-# pylint: enable=E0611, F0401
24
25 from ubuntuone.controlpanel import sd_client, replication_client
26 from ubuntuone.controlpanel.logger import setup_logging, log_call
27@@ -720,28 +713,9 @@
28 yield self.sd_client.create_folder(path=folder_path)
29
30 @log_call(logger.debug)
31- @inlineCallbacks
32 def validate_path_for_folder(self, folder_path):
33 """Validate 'folder_path' for folder creation."""
34- user_home = yield self.get_home_dir()
35- folder_path = append_path_sep(folder_path)
36-
37- # handle folder_path not within '~' or links
38- # XXX is_link expects bytes, see bug #824252
39- if not folder_path.startswith(user_home) or is_link(
40- folder_path.encode('utf-8')):
41- returnValue(False)
42-
43- # handle folder_path nested with a existing cloud folder
44- volumes = yield self.volumes_info(with_storage_info=False)
45- for _, _, data in volumes:
46- for volume in data:
47- cloud_folder = append_path_sep(volume['path'])
48- if (folder_path.startswith(cloud_folder) or
49- cloud_folder.startswith(folder_path)):
50- returnValue(False)
51-
52- returnValue(True)
53+ return self.sd_client.validate_path(folder_path)
54
55 @log_call(logger.debug)
56 @inlineCallbacks
57
58=== modified file 'ubuntuone/controlpanel/sd_client/__init__.py'
59--- ubuntuone/controlpanel/sd_client/__init__.py 2012-03-29 14:31:49 +0000
60+++ ubuntuone/controlpanel/sd_client/__init__.py 2012-03-29 21:44:21 +0000
61@@ -124,6 +124,10 @@
62 """Retrieve the folders information from syncdaemon."""
63 return self.proxy.get_folders()
64
65+ def validate_path(self, path):
66+ """Validates 'path' to create a new folder through syncdaemon."""
67+ return self.proxy.validate_path(path)
68+
69 def create_folder(self, path):
70 """Create a new folder through syncdaemon."""
71 return self.proxy.create_folder(path)
72
73=== modified file 'ubuntuone/controlpanel/tests/test_backend.py'
74--- ubuntuone/controlpanel/tests/test_backend.py 2012-03-29 14:31:49 +0000
75+++ ubuntuone/controlpanel/tests/test_backend.py 2012-03-29 21:44:21 +0000
76@@ -1,9 +1,6 @@
77 # -*- coding: utf-8 -*-
78-
79-# Authors: Alejandro J. Cura <alecu@canonical.com>
80-# Authors: Natalia B. Bidart <nataliabidart@canonical.com>
81 #
82-# Copyright 2010 Canonical Ltd.
83+# Copyright 2010-2012 Canonical Ltd.
84 #
85 # This program is free software: you can redistribute it and/or modify it
86 # under the terms of the GNU General Public License version 3, as published
87@@ -292,6 +289,10 @@
88 """Unsubcribe from 'volume_id'."""
89 self.subscribed_folders.remove(volume_id)
90
91+ def validate_path(self, path):
92+ """Validate a path for folder creation."""
93+ return path != USER_HOME
94+
95 def create_folder(self, path):
96 """Grab list of folders."""
97 self.folders.append(path)
98@@ -1144,24 +1145,8 @@
99
100 self.assertEqual(self.be.sd_client.folders, [folder_path])
101
102-
103-class BackendValidatePathForFolderTestCase(BackendBasicTestCase):
104- """Test for the path validator when creating folders."""
105-
106- msg = '%r must not be a valid path for creating a folder.'
107-
108- @defer.inlineCallbacks
109- def setUp(self):
110- yield super(BackendValidatePathForFolderTestCase, self).setUp()
111- old_home = os.environ['HOME']
112- os.environ['HOME'] = USER_HOME
113- self.addCleanup(os.environ.__setitem__, 'HOME', old_home)
114- self.patch(self.be.sd_client, 'shares', SAMPLE_SHARES)
115- self.patch(self.be.sd_client, 'folders', SAMPLE_FOLDERS)
116- self.patch(backend, 'is_link', lambda p: False)
117-
118- @defer.inlineCallbacks
119- def test_valid_if_folder_inside_home(self):
120+ @defer.inlineCallbacks
121+ def test_validate_path_for_folder(self):
122 """Test proper validation of path for creating folders."""
123 folder_path = os.path.join(USER_HOME, 'Test Me')
124
125@@ -1170,68 +1155,11 @@
126 '%r must be a valid path for creating a folder.' % folder_path)
127
128 @defer.inlineCallbacks
129- def test_valid_if_folder_shares_a_prefix_with_an_udf(self):
130- """Test proper validation of path for creating folders.
131-
132- If the user chooses a folder with the same prefix as an UDF, but
133- outside every UDF, the path is valid.
134-
135- """
136- tricky_path = ROOT_PATH
137- assert not tricky_path.endswith(os.path.sep)
138- tricky_path += ' Suffix'
139- assert tricky_path.startswith(ROOT_PATH)
140-
141- result = yield self.be.validate_path_for_folder(tricky_path)
142- self.assertTrue(result,
143- '%r must be a valid path for creating a folder.' % tricky_path)
144-
145- @inlineCallbacks
146- def test_path_not_valid_if_outside_home(self):
147- """A folder outside ~ is not valid."""
148- outside_home = os.path.abspath(os.path.join(USER_HOME, os.path.pardir))
149-
150- result = yield self.be.validate_path_for_folder(outside_home)
151- self.assertFalse(result, self.msg % outside_home)
152-
153- @defer.inlineCallbacks
154- def test_not_valid_if_folder_inside_root(self):
155- """A folder inside the root is not valid."""
156- root_path = ROOT_PATH
157- # create a valid path inside the root
158- inside_root = os.path.abspath(os.path.join(root_path, 'test'))
159-
160- result = yield self.be.validate_path_for_folder(inside_root)
161- self.assertFalse(result, self.msg % inside_root)
162-
163- @defer.inlineCallbacks
164- def test_not_valid_if_folder_inside_an_udf(self):
165- """A folder inside an UDF is not valid."""
166- udf_path = SAMPLE_FOLDERS[-1]['path']
167- # create a valid path inside an existing UDF
168- inside_udf = os.path.abspath(os.path.join(udf_path, 'test'))
169-
170- result = yield self.be.validate_path_for_folder(inside_udf)
171- self.assertFalse(result, self.msg % inside_udf)
172-
173- @defer.inlineCallbacks
174- def test_not_valid_if_folder_is_parent_of_an_udf(self):
175- """A folder parent of an UDF is not valid."""
176- udf_path = SAMPLE_FOLDERS[-1]['path']
177- # create a valid path that is parent from an existing UDF
178- udf_parent = os.path.abspath(os.path.join(udf_path, os.path.pardir))
179-
180- result = yield self.be.validate_path_for_folder(udf_parent)
181- self.assertFalse(result, self.msg % udf_parent)
182-
183- @defer.inlineCallbacks
184- def test_not_valid_if_folder_is_link(self):
185- """A link path is not valid."""
186- self.patch(backend, 'is_link', lambda p: True)
187- path_link = os.path.join(USER_HOME, 'Test Me')
188-
189- result = yield self.be.validate_path_for_folder(path_link)
190- self.assertFalse(result, self.msg % path_link)
191+ def test_validate_path_for_folder_invalid(self):
192+ """Test proper validation of path for creating folders."""
193+ result = yield self.be.validate_path_for_folder(USER_HOME)
194+ self.assertFalse(result,
195+ '%r must not be a valid path for creating a folder.' % USER_HOME)
196
197
198 class BackendSyncStatusTestCase(BackendBasicTestCase):
199
200=== modified file 'ubuntuone/controlpanel/tests/test_sd_client.py'
201--- ubuntuone/controlpanel/tests/test_sd_client.py 2012-03-29 18:28:15 +0000
202+++ ubuntuone/controlpanel/tests/test_sd_client.py 2012-03-29 21:44:21 +0000
203@@ -157,6 +157,10 @@
204 """Get the list of the shares "shared"/created/offered."""
205 self.called['list_shared'] = None
206
207+ def validate_path(self, path):
208+ """Validate a path for folder creation."""
209+ return path not in [f['path'] for f in self.folders.itervalues()]
210+
211 def create_folder(self, path):
212 """Create a user defined folder in the specified path."""
213 if path == '': # simulate an error
214@@ -510,6 +514,19 @@
215 yield self.assertFailure(self.sd.get_folders(), CustomError)
216
217 @inlineCallbacks
218+ def test_validate_path(self):
219+ """Check if a folder path is valid."""
220+ path = '~/bar/baz'
221+ result = yield self.sd.validate_path(path)
222+
223+ self.assertTrue(result)
224+
225+ yield self.sd.create_folder(path)
226+ result = yield self.sd.validate_path(path)
227+
228+ self.assertFalse(result)
229+
230+ @inlineCallbacks
231 def test_create_folder(self):
232 """Create a new folder."""
233 path = '~/bar/baz'

Subscribers

People subscribed via source and target branches