From 5803964b5026e3153521228e86ade49d353d9922 Mon Sep 17 00:00:00 2001 From: Ranieri Argentini Date: Tue, 3 Nov 2020 11:13:02 +0100 Subject: [PATCH 1/4] Resolves issue #218 --- owncloud/owncloud.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/owncloud/owncloud.py b/owncloud/owncloud.py index 7e3e804..01dbb10 100644 --- a/owncloud/owncloud.py +++ b/owncloud/owncloud.py @@ -901,13 +901,15 @@ def share_file_with_link(self, path, **kwargs): tree = ET.fromstring(res.content) self._check_ocs_status(tree) data_el = tree.find('data') + id_el = data_el.find('id') + name_el = data_el.find('name') return ShareInfo( { - 'id': data_el.find('id').text, + 'id': id_el.text if id_el else None, 'path': path, 'url': data_el.find('url').text, 'token': data_el.find('token').text, - 'name': data_el.find('name').text + 'name': name_el.text if name_el else None } ) raise HTTPResponseError(res) From ea7194eed4cf59eef6bf9bac6edb794cb150ad07 Mon Sep 17 00:00:00 2001 From: Ranieri Argentini Date: Tue, 3 Nov 2020 13:02:49 +0100 Subject: [PATCH 2/4] Actually test for None insteal of falsy. --- owncloud/owncloud.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/owncloud/owncloud.py b/owncloud/owncloud.py index 01dbb10..4ca2244 100644 --- a/owncloud/owncloud.py +++ b/owncloud/owncloud.py @@ -902,14 +902,21 @@ def share_file_with_link(self, path, **kwargs): self._check_ocs_status(tree) data_el = tree.find('data') id_el = data_el.find('id') + share_id = 0 + if id_el is not None: + share_id = id_el.text name_el = data_el.find('name') + share_name = '' + if name_el is not None: + share_name = name_el.text + return ShareInfo( { - 'id': id_el.text if id_el else None, + 'id': share_id, 'path': path, 'url': data_el.find('url').text, 'token': data_el.find('token').text, - 'name': name_el.text if name_el else None + 'name': share_name } ) raise HTTPResponseError(res) From 287ae7a64e409f3870d0f245ffaef9d68bbaf9ac Mon Sep 17 00:00:00 2001 From: Ranieri Argentini Date: Mon, 28 Jun 2021 09:04:06 +0200 Subject: [PATCH 3/4] Update password complexity of `test_share_with_link()` to meet requirements on test server --- owncloud/test/test.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/owncloud/test/test.py b/owncloud/test/test.py index 7c427c8..fc4b1d2 100644 --- a/owncloud/test/test.py +++ b/owncloud/test/test.py @@ -713,7 +713,7 @@ def test_share_with_link(self, file_name): path = self.test_root + file_name self.assertTrue(self.client.put_file_contents(path, 'hello world!')) - share_info = self.client.share_file_with_link(path, public_upload=False, password='AnvvsP1234', name='Test Link') + share_info = self.client.share_file_with_link(path, public_upload=False, password='AnvvsP1234!@', name='Test Link') self.assertTrue(self.client.is_shared(path)) self.assertTrue(isinstance(share_info, owncloud.ShareInfo)) @@ -1319,7 +1319,7 @@ def files_content(): [u'文件.txt', u'你好世界'.encode('utf-8'), u'文件夹'] ) - + def setUp(self): self.temp_dir = tempfile.gettempdir() + '/pyocclient_test%s-%s/' % (int(time.time()), random.randint(1, 1000)) os.mkdir(self.temp_dir) @@ -1424,7 +1424,7 @@ def test_anon_login(self): with self.assertRaises(owncloud.ResponseError) as e: self.anon_client.list('/') self.assertEqual(e.exception.status_code, 404) - + def test_anon_login_pw(self): self.anon_client = owncloud.Client(Config['owncloud_url']) self.anon_client.anon_login(self.pw_public_download_token, folder_password=self.folder_password) @@ -1461,7 +1461,7 @@ def test_from_link(self): with self.assertRaises(owncloud.ResponseError) as e: self.anon_client.list('/') self.assertEqual(e.exception.status_code, 404) - + def test_from_link_pw(self): self.anon_client = owncloud.Client.from_public_link(self.pw_public_download_link, folder_password=self.folder_password) listing = self.anon_client.list('/') @@ -1477,7 +1477,7 @@ def test_from_link_pw(self): self.anon_client = owncloud.Client.from_public_link(self.pw_public_upload_link, folder_password=self.folder_password) with self.assertRaises(owncloud.ResponseError) as e: self.anon_client.list('/') - self.assertEqual(e.exception.status_code, 404) + self.assertEqual(e.exception.status_code, 404) @data_provider(files_content) @@ -1510,7 +1510,7 @@ def test_mkdir(self, file_name, content, subdir): self.assertTrue(self.anon_client.mkdir(subdir)) # Only users with account can get file info in upload folders self.assertIsNotNone(self.client.file_info(self.public_folder_upload + subdir)) - + @data_provider(files) def test_upload_small_file(self, file_name): """Test simple upload""" @@ -1525,7 +1525,7 @@ def test_upload_small_file(self, file_name): file_info = self.client.file_info(self.public_folder_upload + file_name) self.assertIsNotNone(file_info) self.assertEqual(file_info.get_size(), 2 * 1024) - + @data_provider(files) def test_upload_big_file(self, file_name): """Test chunked upload""" From 6f463ad529c486c9d065e4ca89d47c2f6e2bc65a Mon Sep 17 00:00:00 2001 From: Ranieri Argentini Date: Mon, 28 Jun 2021 09:53:46 +0200 Subject: [PATCH 4/4] Support expireDate when sharing with link. See https://doc.owncloud.com/server/developer_manual/core/apis/ocs-share-api.html#create-a-new-share --- owncloud/owncloud.py | 7 +++++-- owncloud/test/test.py | 6 ++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/owncloud/owncloud.py b/owncloud/owncloud.py index 4ca2244..8f8278a 100644 --- a/owncloud/owncloud.py +++ b/owncloud/owncloud.py @@ -392,12 +392,12 @@ def anon_login(self, folder_token, folder_password=''): url_components = parse.urlparse(self.url) self._davpath = url_components.path + 'public.php/webdav' self._webdav_url = self.url + 'public.php/webdav' - + @classmethod def from_public_link(cls, public_link, folder_password='', **kwargs): public_link_components = parse.urlparse(public_link) url = public_link_components.scheme + '://' + public_link_components.hostname - folder_token = public_link_components.path.split('/')[-1] + folder_token = public_link_components.path.split('/')[-1] anon_session = cls(url, **kwargs) anon_session.anon_login(folder_token, folder_password=folder_password) return anon_session @@ -876,6 +876,7 @@ def share_file_with_link(self, path, **kwargs): public_upload = kwargs.get('public_upload', 'false') password = kwargs.get('password', None) name = kwargs.get('name', None) + expire_date = kwargs.get('expireDate', None) path = self._normalize_path(path) post_data = { @@ -888,6 +889,8 @@ def share_file_with_link(self, path, **kwargs): post_data['password'] = password if name is not None: post_data['name'] = self._encode_string(name) + if expire_date is not None: + post_data['expireDate'] = expire_date if perms: post_data['permissions'] = perms diff --git a/owncloud/test/test.py b/owncloud/test/test.py index fc4b1d2..d42c32d 100644 --- a/owncloud/test/test.py +++ b/owncloud/test/test.py @@ -713,8 +713,10 @@ def test_share_with_link(self, file_name): path = self.test_root + file_name self.assertTrue(self.client.put_file_contents(path, 'hello world!')) - share_info = self.client.share_file_with_link(path, public_upload=False, password='AnvvsP1234!@', name='Test Link') - + # Expire in three days + expires = (datetime.datetime.now() + datetime.timedelta(days=3)).strftime("%Y-%m-%d") + share_info = self.client.share_file_with_link(path, public_upload=False, password='AnvvsP1234!@', + name='Test Link', expireDate=expires) self.assertTrue(self.client.is_shared(path)) self.assertTrue(isinstance(share_info, owncloud.ShareInfo)) self.assertTrue(type(share_info.get_id()) is int)