From b1324c9e82068110552951f22443c5462d594bc5 Mon Sep 17 00:00:00 2001 From: An Qiuyu Date: Sun, 3 Aug 2025 10:29:58 +0800 Subject: [PATCH 1/2] Implement BaseFileNode for azure blob storage --- addons.json | 3 ++- addons/azureblobstorage/__init__.py | 0 addons/azureblobstorage/apps.py | 36 +++++++++++++++++++++++++++++ addons/azureblobstorage/models.py | 33 ++++++++++++++++++++++++++ addons/base/views.py | 3 +++ api/base/settings/defaults.py | 1 + 6 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 addons/azureblobstorage/__init__.py create mode 100644 addons/azureblobstorage/apps.py create mode 100644 addons/azureblobstorage/models.py diff --git a/addons.json b/addons.json index 91f61ebd35f..57c1997c391 100644 --- a/addons.json +++ b/addons.json @@ -17,7 +17,8 @@ "twofactor", "wiki", "googledrive", - "bitbucket" + "bitbucket", + "azureblobstorage" ], "addons_default": [ "osfstorage" diff --git a/addons/azureblobstorage/__init__.py b/addons/azureblobstorage/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/addons/azureblobstorage/apps.py b/addons/azureblobstorage/apps.py new file mode 100644 index 00000000000..308f9aeba75 --- /dev/null +++ b/addons/azureblobstorage/apps.py @@ -0,0 +1,36 @@ +from addons.base.apps import BaseAddonAppConfig + + +class AzureBlobStorageAddonAppConfig(BaseAddonAppConfig): + + default = True + name = 'addons.azureblobstorage' + label = 'addons_azureblobstorage' + full_name = 'Azure Blob Storage' + short_name = 'azureblobstorage' + owners = ['user', 'node'] + configs = ['accounts', 'node'] + categories = ['storage'] + has_hgrid_files = True + + # Define actions for NodeLog + FOLDER_SELECTED = 'azureblobstorage_folder_selected' + NODE_AUTHORIZED = 'azureblobstorage_node_authorized' + NODE_DEAUTHORIZED = 'azureblobstorage_node_deauthorized' + + actions = (FOLDER_SELECTED, NODE_AUTHORIZED, NODE_DEAUTHORIZED, ) + + @property + def routes(self): + # No Flask routes needed for gravyvalet-managed addon + return [] + + @property + def user_settings(self): + # No UserSettings for gravyvalet-managed addon + return None + + @property + def node_settings(self): + # No NodeSettings for gravyvalet-managed addon + return None diff --git a/addons/azureblobstorage/models.py b/addons/azureblobstorage/models.py new file mode 100644 index 00000000000..9592ba1be27 --- /dev/null +++ b/addons/azureblobstorage/models.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- + +from osf.models.files import File, Folder, BaseFileNode +from osf.models.external import ExternalProvider + +class AzureBlobStorageFileNode(BaseFileNode): + _provider = 'azureblobstorage' + + +class AzureBlobStorageFolder(AzureBlobStorageFileNode, Folder): + pass + + +class AzureBlobStorageFile(AzureBlobStorageFileNode, File): + version_identifier = 'version' + + +class AzureBlobStorageProvider(ExternalProvider): + """An alternative to `ExternalProvider` not tied to OAuth""" + + name = 'Azure Blob Storage' + short_name = 'azureblobstorage' + + def __init__(self, account=None): + super(AzureBlobStorageProvider, self).__init__() + + self.account = account + + def __repr__(self): + return '<{name}: {status}>'.format( + name=self.__class__.__name__, + status=self.account.display_name if self.account else 'anonymous' + ) diff --git a/addons/base/views.py b/addons/base/views.py index a6c90860b98..b1657c8fa27 100644 --- a/addons/base/views.py +++ b/addons/base/views.py @@ -225,6 +225,9 @@ def get_auth(auth, **kwargs): resource = _get_authenticated_resource(waterbutler_data['nid']) action = waterbutler_data['action'] + cookie = waterbutler_data['cookie'] + if not auth.user: + auth.user = OSFUser.from_cookie(cookie) _check_resource_permissions(resource, auth, action) provider_name = waterbutler_data['provider'] diff --git a/api/base/settings/defaults.py b/api/base/settings/defaults.py index 367ca1b04f9..6f3564eeb8a 100644 --- a/api/base/settings/defaults.py +++ b/api/base/settings/defaults.py @@ -101,6 +101,7 @@ # Addons 'addons.osfstorage', + 'addons.azureblobstorage', 'addons.bitbucket', 'addons.boa', 'addons.box', From e7f24b7579c5004b8b85b2932a9b6db1488850a6 Mon Sep 17 00:00:00 2001 From: An Qiuyu Date: Fri, 22 Aug 2025 07:35:39 +0800 Subject: [PATCH 2/2] fix review comments --- addons/base/views.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/addons/base/views.py b/addons/base/views.py index b1657c8fa27..a6c90860b98 100644 --- a/addons/base/views.py +++ b/addons/base/views.py @@ -225,9 +225,6 @@ def get_auth(auth, **kwargs): resource = _get_authenticated_resource(waterbutler_data['nid']) action = waterbutler_data['action'] - cookie = waterbutler_data['cookie'] - if not auth.user: - auth.user = OSFUser.from_cookie(cookie) _check_resource_permissions(resource, auth, action) provider_name = waterbutler_data['provider']