From 3a783fb6c15d574a7b8b4e8b7b710dd996f46c80 Mon Sep 17 00:00:00 2001 From: chiku Date: Tue, 30 Jun 2026 15:43:01 +0900 Subject: [PATCH 1/2] Update StorageAddon guide for osf.io + gv + wb + angular-osf construction MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rewrite the storage addon developer guide for the latest construction, whose backend is the upstream osf.io + GravyValet + WaterButler and whose frontend is angular-osf. StorageAddon/README.md: - Add a "開発環境の準備" (development environment) section: run osf.io / GravyValet / WaterButler as independent Docker Compose projects and angular-osf via `ng serve`, unified behind a single-origin Caddy reverse proxy on http://localhost. All local changes live in override files; the upstream sources stay untouched. Covers per-service setup, the bring-up order, and health checks. - Describe a storage addon as a standalone plugin (triplet: osf.io addon + GravyValet foreign addon imp + WaterButler provider), installed via pip/poetry as normal Python packages instead of being embedded in the osf.io / GravyValet / WaterButler codebases. - Add the GravyValet addon imp section (ForeignAddonImpConfig, the imp / addon_imp_name properties, the unique app label, build_wb_config). - Update the osf.io addon part (proxy models + TypedModelRejoinMixin, AppConfig, getattr-based settings, migration stripping), document the identifier coupling rule (short_name / _provider / addon_imp_name / wb_key / WaterButler entry point), and the credential/settings delegation flow: osf.io -> GravyValet -> WaterButler - Drop RDM/ember-only content (mako templates, *-cfg.js, Fangorn, JS i18n, storageAddons.json, RDM timestamp); the UI is provided by angular-osf and GravyValet. - Switch the running example from "My MinIO" to NextCloud, with clickable links to the `nextcloud_plugin` repository. - Update install/verification steps (addons.json short_name, ADDONS_FOLDER_CONFIGURABLE, GravyValet ADDON_IMPS, wb_key; NextCloud Docker walkthrough), and add a screenshot of the NextCloud ExternalStorageService setup in the GravyValet admin. Figures (StorageAddon/images/): - Add Mermaid sources + rendered PNGs and embed three figures: the single-origin proxy routing (proxy-routing), the triplet install (architecture), and the credential/settings delegation (delegation), rendered on a white background so they stay legible in GitHub dark mode. Also add a naming/identifier diagram source (naming); the identifier relationships themselves are given in-text as a table. - Remove the superseded RDM UML diagrams (osf_class, wb_class, crud). Remove the orphaned RDM-osf.io "My MinIO" example sources under StorageAddon/osf.io/ and StorageAddon/waterbutler/ (43 files), no longer referenced after the rewrite. Co-Authored-By: Claude Opus 4.8 (1M context) --- StorageAddon/README.md | 1089 +- StorageAddon/images/architecture.mmd | 13 + StorageAddon/images/architecture.png | Bin 0 -> 52427 bytes StorageAddon/images/crud.png | Bin 24413 -> 0 bytes StorageAddon/images/crud.uml | 23 - StorageAddon/images/delegation.mmd | 14 + StorageAddon/images/delegation.png | Bin 0 -> 67811 bytes ...ravyvalet-add-external-storage-service.png | Bin 0 -> 159771 bytes StorageAddon/images/naming.mmd | 8 + StorageAddon/images/naming.png | Bin 0 -> 50212 bytes StorageAddon/images/osf_class.png | Bin 88505 -> 0 bytes StorageAddon/images/osf_class.uml | 96 - StorageAddon/images/proxy-routing.mmd | 7 + StorageAddon/images/proxy-routing.png | Bin 0 -> 58493 bytes StorageAddon/images/wb_class.png | Bin 50412 -> 0 bytes StorageAddon/images/wb_class.uml | 45 - StorageAddon/osf.io/addon/__init__.py | 4 - StorageAddon/osf.io/addon/apps.py | 70 - .../osf.io/addon/migrations/__init__.py | 0 StorageAddon/osf.io/addon/models.py | 146 - StorageAddon/osf.io/addon/provider.py | 22 - StorageAddon/osf.io/addon/requirements.txt | 1 - StorageAddon/osf.io/addon/routes.py | 79 - StorageAddon/osf.io/addon/serializer.py | 45 - .../osf.io/addon/settings/__init__.py | 8 - .../osf.io/addon/settings/defaults.py | 1 - .../osf.io/addon/settings/local-dist.py | 2 - StorageAddon/osf.io/addon/static/comicon.png | Bin 1673 -> 0 bytes .../static/myminioAnonymousLogActionList.json | 11 - .../addon/static/myminioLogActionList.json | 11 - .../osf.io/addon/static/myminioNodeConfig.js | 244 - .../osf.io/addon/static/myminioUserConfig.js | 172 - StorageAddon/osf.io/addon/static/node-cfg.js | 5 - StorageAddon/osf.io/addon/static/user-cfg.js | 5 - .../addon/templates/credentials_modal.mako | 47 - .../osf.io/addon/templates/node_settings.mako | 93 - .../osf.io/addon/templates/user_settings.mako | 46 - StorageAddon/osf.io/addon/tests/__init__.py | 0 StorageAddon/osf.io/addon/tests/conftest.py | 1 - StorageAddon/osf.io/addon/tests/factories.py | 34 - StorageAddon/osf.io/addon/tests/test_model.py | 104 - .../osf.io/addon/tests/test_serializer.py | 31 - StorageAddon/osf.io/addon/tests/test_view.py | 278 - StorageAddon/osf.io/addon/tests/utils.py | 51 - StorageAddon/osf.io/addon/utils.py | 131 - StorageAddon/osf.io/addon/views.py | 152 - StorageAddon/osf.io/config/Dockerfile | 197 - StorageAddon/osf.io/config/addons.json | 146 - .../config/api/base/settings/defaults.py | 495 - .../config/framework/addons/data/addons.json | 628 -- .../config/website/static/storageAddons.json | 86 - .../ja/LC_MESSAGES/js_messages.po | 8982 ----------------- StorageAddon/waterbutler/config/setup.py | 71 - StorageAddon/waterbutler/provider/__init__.py | 1 - StorageAddon/waterbutler/provider/metadata.py | 132 - StorageAddon/waterbutler/provider/provider.py | 450 - StorageAddon/waterbutler/provider/settings.py | 6 - StorageAddon/waterbutler/tests/__init__.py | 0 .../waterbutler/tests/test_provider.py | 758 -- 59 files changed, 639 insertions(+), 14402 deletions(-) create mode 100644 StorageAddon/images/architecture.mmd create mode 100644 StorageAddon/images/architecture.png delete mode 100644 StorageAddon/images/crud.png delete mode 100644 StorageAddon/images/crud.uml create mode 100644 StorageAddon/images/delegation.mmd create mode 100644 StorageAddon/images/delegation.png create mode 100644 StorageAddon/images/gravyvalet-add-external-storage-service.png create mode 100644 StorageAddon/images/naming.mmd create mode 100644 StorageAddon/images/naming.png delete mode 100644 StorageAddon/images/osf_class.png delete mode 100644 StorageAddon/images/osf_class.uml create mode 100644 StorageAddon/images/proxy-routing.mmd create mode 100644 StorageAddon/images/proxy-routing.png delete mode 100644 StorageAddon/images/wb_class.png delete mode 100644 StorageAddon/images/wb_class.uml delete mode 100644 StorageAddon/osf.io/addon/__init__.py delete mode 100644 StorageAddon/osf.io/addon/apps.py delete mode 100644 StorageAddon/osf.io/addon/migrations/__init__.py delete mode 100644 StorageAddon/osf.io/addon/models.py delete mode 100644 StorageAddon/osf.io/addon/provider.py delete mode 100644 StorageAddon/osf.io/addon/requirements.txt delete mode 100644 StorageAddon/osf.io/addon/routes.py delete mode 100644 StorageAddon/osf.io/addon/serializer.py delete mode 100644 StorageAddon/osf.io/addon/settings/__init__.py delete mode 100644 StorageAddon/osf.io/addon/settings/defaults.py delete mode 100644 StorageAddon/osf.io/addon/settings/local-dist.py delete mode 100644 StorageAddon/osf.io/addon/static/comicon.png delete mode 100644 StorageAddon/osf.io/addon/static/myminioAnonymousLogActionList.json delete mode 100644 StorageAddon/osf.io/addon/static/myminioLogActionList.json delete mode 100644 StorageAddon/osf.io/addon/static/myminioNodeConfig.js delete mode 100644 StorageAddon/osf.io/addon/static/myminioUserConfig.js delete mode 100644 StorageAddon/osf.io/addon/static/node-cfg.js delete mode 100644 StorageAddon/osf.io/addon/static/user-cfg.js delete mode 100644 StorageAddon/osf.io/addon/templates/credentials_modal.mako delete mode 100644 StorageAddon/osf.io/addon/templates/node_settings.mako delete mode 100644 StorageAddon/osf.io/addon/templates/user_settings.mako delete mode 100644 StorageAddon/osf.io/addon/tests/__init__.py delete mode 100644 StorageAddon/osf.io/addon/tests/conftest.py delete mode 100644 StorageAddon/osf.io/addon/tests/factories.py delete mode 100644 StorageAddon/osf.io/addon/tests/test_model.py delete mode 100644 StorageAddon/osf.io/addon/tests/test_serializer.py delete mode 100644 StorageAddon/osf.io/addon/tests/test_view.py delete mode 100644 StorageAddon/osf.io/addon/tests/utils.py delete mode 100644 StorageAddon/osf.io/addon/utils.py delete mode 100644 StorageAddon/osf.io/addon/views.py delete mode 100644 StorageAddon/osf.io/config/Dockerfile delete mode 100644 StorageAddon/osf.io/config/addons.json delete mode 100644 StorageAddon/osf.io/config/api/base/settings/defaults.py delete mode 100644 StorageAddon/osf.io/config/framework/addons/data/addons.json delete mode 100644 StorageAddon/osf.io/config/website/static/storageAddons.json delete mode 100644 StorageAddon/osf.io/config/website/translations/ja/LC_MESSAGES/js_messages.po delete mode 100644 StorageAddon/waterbutler/config/setup.py delete mode 100644 StorageAddon/waterbutler/provider/__init__.py delete mode 100644 StorageAddon/waterbutler/provider/metadata.py delete mode 100644 StorageAddon/waterbutler/provider/provider.py delete mode 100644 StorageAddon/waterbutler/provider/settings.py delete mode 100644 StorageAddon/waterbutler/tests/__init__.py delete mode 100644 StorageAddon/waterbutler/tests/test_provider.py diff --git a/StorageAddon/README.md b/StorageAddon/README.md index 23470c0..ec1fc61 100644 --- a/StorageAddon/README.md +++ b/StorageAddon/README.md @@ -1,711 +1,816 @@ # ストレージアドオンの作成 -具体的なストレージアドオンの例として、AWS S3互換の[MinIO](https://min.io/)と接続するストレージアドオンを実装します。このアドオンは特定のMinIOサーバーと接続するものとし、 My MinIOアドオンと名付けることとします。 +具体的なストレージアドオンの例として、[NextCloud](https://nextcloud.com/)と接続するストレージアドオンを実装します。このアドオンをNextCloudアドオンと名付け、`nextcloud_plugin`という独立したPythonパッケージとして実装します。 -基本的なアドオンの概要は[スケルトンの作成](../Skelton/README.md)を参照してください。 +本ドキュメントは以下の流れで構成されています。 -## 前提条件 +1. **[開発環境の準備](#開発環境の準備)**: osf.io・GravyValet・WaterButler・angular-osf からなる開発環境を、[Caddy](https://caddyserver.com/)による単一オリジンプロキシとともに起動します。 +2. **[ストレージアドオンの設計](#ストレージアドオンの設計)**: ストレージアドオンを構成する3要素(osf.io Addon / GravyValet Addon Imp / WaterButler Provider)とその実装方法を説明します。 +3. **[ストレージアドオンの利用方法](#ストレージアドオンの利用方法)**: 作成したアドオンを各サービスにインストール・設定します。 +4. **[NextCloud アドオンの動作確認](#nextcloud-アドオンの動作確認)**: NextCloud を接続先として、実際にファイル操作を試します。 -[開発環境の準備](../Environment.md#開発環境でRDMを起動する)のガイドに従い、開発環境にてRDMを起動しているものとします。 +本ガイドと合わせて、実装済みの参考例である [`nextcloud_plugin`](https://github.com/chiku-samugari/nextcloud_plugin) のソースコードを参照することを推奨します。 -# ストレージアドオンの設計 +# 開発環境の準備 -## サービスの構成 +ストレージアドオンの開発に先立って、開発環境の準備方法を説明します。開発環境は以下の5つの要素から構成されます。 -ストレージアドオンは以下の2つの要素から構成されます。 +- **osf.io**: バックエンドの中核。ユーザ情報を保持し、WebサーバとAPIサーバを提供します。`osf.io` ディレクトリの Compose プロジェクトとして起動します。 +- **GravyValet**: アドオンについての情報(接続先サービス・認証情報・設定)を管理します。`gravyvalet` ディレクトリの Compose プロジェクトとして起動します。 +- **WaterButler**: ストレージサービスへのファイルアクセスを担います。`waterbutler` ディレクトリのCompose プロジェクトとして起動します。 +- **angular-osf**: フロントエンド。`angular-osf` ディレクトリで `ng serve` により起動します。 +- **Caddy**: 上記4サービスを単一オリジン(`http://localhost`)に束ねるリバースプロキシ(Dockerコンテナとして起動)。 -- OSF.ioサービスで動作するAddon: ユーザ・プロジェクト設定の管理 -- WaterButlerサービスで動作するProvider: ストレージへのアクセスの仲介 +このように、バックエンドを [osf.io](https://github.com/CenterForOpenScience/osf.io)・[GravyValet](https://github.com/CenterForOpenScience/gravyvalet)・[WaterButler](https://github.com/CenterForOpenScience/waterbutler) が、フロントエンドを [angular-osf](https://github.com/CenterForOpenScience/angular-osf) が担います。 +[`RDM-osf.io` を中心とした従来の構成](../Environment.md)では、バックエンドとフロントエンド、すべてのサービスが1つの`docker-compose[.override].yml`(単一のComposeプロジェクト)にまとめられていましたが、本構成ではosf.io・GravyValet・WaterButler ・angular-osfはそれぞれ独立したリポジトリで扱い、それぞれのディレクトリで独立したDocker Composeプロジェクトとして起動します(angular-osfは`ng serve`(開発サーバ)で起動します)。 +ブラウザから見ると、これらは本来別々のオリジンで動作します。しかしosf.io の認証(セッションCookie、CASのログイン往復、同一オリジンへのリダイレクト制約)は、フロントエンドとバックエンドが単一のオリジンで提供されることを前提としています。そこで開発環境では、[Caddy](https://caddyserver.com/)による**単一オリジンのリバースプロキシ**を`http://localhost`に立て、アクセスを各サービスへ振り分けます。 -Addonによりユーザからの認証情報の受領や各種設定を行い、Providerはこの認証情報・設定情報をAddonから譲渡してもらい、実際のストレージへのアクセスを行います。 +![単一オリジンプロキシによるルーティング(ブラウザ → Caddy → 各サービス)](images/proxy-routing.png) -## ファイルの構成 +> **ブラウザ向けURLと、コンテナ間URLは別物です。** ブラウザ向けURLは `http://localhost`(Caddy 経由)に統一しますが、コンテナ間の通信(DB・CAS検証・サーバサイドのAPI/WB呼び出しなど)は、ループバックエイリアス `192.168.168.167`(osf.io のローカル開発の慣例)を用います。単一オリジンにするのは *ブラウザ向け* のみです。 -典型的なクラス構成とファイル配置は以下のようになります。 - -### OSF.io Addonのクラス構成とファイル構成 - -![OSF.io Addon クラス構成](images/osf_class.png) - -`(*)`が付いているファイルはスケルトン アドオンには存在しないファイルです。 - -``` -/addons/アドオン名/ -├── __init__.py ... モジュールの定義 -├── apps.py ... アプリケーションの定義 -├── models.py ... モデルの定義 -├── provider.py ... (*) 認証プロバイダの定義 -├── requirements.txt ... 利用するPythonモジュールの定義 -├── routes.py ... View(Routes)の定義 -├── serializer.py ... (*) モデル-ビュー(JavaScript)間の情報交換用シリアライザの定義 -├── settings ... 設定を定義するモジュール -│ ├── defaults.py ... デフォルト設定の定義 -│ ├── __init__.py ... 設定の定義 -│   └── local-dist.py ... (*) local.pyのサンプルファイル -├── static ... Webブラウザから読み込むことを想定した静的ファイル -│   ├── comicon.png ... アドオンのアイコン -│   ├── myminioAnonymousLogActionList.json ... (*) 変更履歴メッセージ定義 -│   ├── myminioLogActionList.json ... (*) 変更履歴メッセージ定義 -│   ├── myminioNodeConfig.js ... (*) Node設定の定義 -│   ├── myminioUserConfig.js ... (*) User設定の定義 -│   ├── node-cfg.js ... Node設定のエントリとなるJavaScriptファイル -│   └── user-cfg.js ... (*) User設定のエントリとなるJavaScriptファイル -├── templates ... テンプレートディレクトリ -│   ├── credentials_modal.mako ... (*) 認証情報の設定用ダイアログ -│   ├── node_settings.mako ... Node設定パネル -│   └── user_settings.mako ... (*) User設定パネル -├── tests ... テストコード -│   ├── __init__.py -│   ├── conftest.py -│   ├── factories.py -│   ├── test_model.py -│   ├── test_serializer.py ... (*) -│   ├── test_view.py -│   └── utils.py -├── utils.py ... (*) ユーティリティ関数の定義 -└── views.py ... View(Views)の定義 -``` - -### WaterButler Providerのクラス構成とファイル構成 - -![WaterButler Addon クラス構成](images/wb_class.png) - -``` -waterbutler/providers/アドオン名/ -├── __init__.py ... Providerクラスの参照 -├── metadata.py ... Metadataの定義 -├── provider.py ... Providerの定義 -└── settings.py ... デフォルト設定の定義 - -tests/providers/アドオン名/ -├── __init__.py -└── provider.py ... Providerのテストコード -``` +## 前提条件・共通の準備 -## OSF.io Addonのモジュール構成 +開発環境に以下のソフトウェアを準備します。 -スケルトン アドオンとの違いを中心に説明していきます。 +- **Docker**と**Docker Compose** +- **Node.js**と`npx` +- osf.io・GravyValet・WaterButler・angular-osf の各リポジトリを取得 +- **ループバックエイリアス `192.168.168.167`** を設定 -### Modelの構成 + ```bash + $ sudo ifconfig lo:0 192.168.168.167 netmask 255.255.255.255 up + ``` -`models.py` に、以下のModelを定義します。 +以降で追加する設定は、いずれもリポジトリにコミットされない**上書き用ファイル**(`docker-compose.override.yml`, `.docker-compose.local.env`, `config.json`, `Caddyfile` など)に記述します。追跡対象のファイルは upstream の値のまま変更しません。 -- `UserSettings`: ユーザーに関する情報(認証情報等) -- `NodeSettings`: プロジェクトに関する情報 -- `アドオン名FileNode`: ファイル・フォルダオブジェクトの親定義 -- `アドオン名File`: ファイルオブジェクトの定義 -- `アドオン名Folder`: ファイルオブジェクトの定義 +## osf.io の準備と起動 -`provider.py` に `アドオン名Provider` を、 `serializer.py` に `アドオン名Serializer` を定義します。OAuthを用いる場合は `osf.models.external.ExternalProvider` を継承し、必要なメンバを定義します。実装は [GitHubの例](https://github.com/RCOSDP/RDM-osf.io/blob/develop/addons/github/models.py#L49) などを参考にしてください(GitHubアドオンは `アドオン名Provider` を `models.py` に定義しています)。 -`アドオン名Serializer` にはビュー(JavaScript)にURLリストや接続先フォルダなどを渡すための関数を定義します。 +`osf.io`ディレクトリで作業します。 -OAuth認証をしない場合であっても、ストレージアドオンの `UserSettings` と `NodeSettings` は、 `BaseOAuthUserSettings` と `BaseOAuthNodeSettings` をそれぞれ継承して定義し、 `oauth_provider` に`アドオン名Provider` を指定します。こうすることで、統一的な構造で簡単に認証の仕組みを実装することができます。 +### 設定の上書き -My MinIOアドオンの場合は、以下のように定義します。 +まずWebサーバとAPIサーバに関するDjangoの設定ファイル`local.py`を準備します。特に変更の必要がなければ、それぞれの`local-dist.py`をコピーして使用します。 +```bash +$ cp api/base/settings/local-dist.py api/base/settings/local.py +$ cp website/settings/local-dist.py website/settings/local.py +``` -- [models.py](osf.io/addon/models.py) -- [provider.py](osf.io/addon/provider.py) -- [serializer.py](osf.io/addon/serializer.py) +`web` / `api` / `worker`は`.docker-compose.env`を読み込みます。このファイルはリポジトリの保持する内容から変えず、上書き用のenvファイル`.docker-compose.local.env`を以下の内容で作成します。 -### Viewの構成 +```dotenv +DOMAIN=http://localhost/ +API_DOMAIN=http://localhost/ +WATERBUTLER_URL=http://localhost +``` -`views.py`には、おおよそ以下の関数を定義します。 +また、このファイルを`web` / `api` / `worker`が読み込むようにサービスの設定を上書きします。これも同様に、`osf.io/docker-compose.yml`を変更するのではなく、`osf.io/docker-compose.override.yml`を作ることで設定を上書きします。`osf.io/docker-compose.override.yml`を以下の内容で作成します。 -| 関数名 | 処理 | -|:------|:----| -| set_config | プロジェクトの設定を保存する。デフォルトでは接続先のフォルダとクライアント用のAPIのURLリストのみ。 | -| get_config | プロジェクトの設定を取得する。 | -| import_auth | ログイン中のユーザの認証情報をプロジェクトにインポートする。 | -| deauthorize_node | プロジェクトの認証情報を取り消す。 | -| add_user_account | ユーザの認証情報を追加する。 | -| account_list | ユーザの認証情報リストを取得する。 | -| create_folder | ストレージサービスにフォルダを追加する。プロジェクトのアドオン設定ページでフォルダを作る機能を提供しない場合は不要。 | -| folder_list | ストレージサービスのフォルダリストを取得する。 | +```yaml +services: + web: + env_file: [.docker-compose.env, .docker-compose.local.env] + api: + env_file: [.docker-compose.env, .docker-compose.local.env] + worker: + env_file: [.docker-compose.env, .docker-compose.local.env] +``` -シリアライザ(`serializer.py`)を定義し、 `addons.base.generic_views` を利用することで、以下のように一部のView処理を簡単に定義することができます。 +### ライブラリのインストールとMigration -``` -import_auth = addons.base.generic_views.import_auth( - SHORT_NAME, - Serializer -) -``` +ライブラリのインストールとMigrationを実行するコマンドを実行します。1つ目については依存するライブラリが変更されたとき、2つ目についてはモデルなどのDB定義の定義に変更があった際に実行する必要があります。サービスの起動毎に毎回実行する必要があるものではありません。 -`generic_views` で提供していないView処理を追加したい場合や、View処理をカスタマイズしたい場合は、以下のように `views.py` に個別の関数を定義します。 +```bash +# ライブラリのインストール(初回/依存定義の変更時) +$ docker compose up requirements -``` -@must_have_addon(SHORT_NAME, 'node') -@must_be_addon_authorizer(SHORT_NAME) -def folder_list(node_addon, **kwargs): - return node_addon.get_folders() +# DBのMigration(初回/DB定義の変更時) +$ docker compose run --rm web python3 manage.py migrate ``` -フォルダの作成やフォルダリストの取得をするために、Addonでもストレージサービスへ接続する必要があります。 +### サービスの起動 -My MinIOアドオンの場合は、以下のように定義します。 +以下のコマンドでストレージサービスアドオンの開発に必要なサービスを起動します。 -- [routes.py](osf.io/addon/routes.py) -- [views.py](osf.io/addon/views.py) +```bash +$ docker compose up -d assets fakecas worker web api +``` +なお、管理者機能が必要な場合には、`admin`と`admin_assets`を追加して起動してください。 -### フレームワークによって提供されるView +```bash +$ docker compose up -d assets fakecas worker web api admin_assets admin +``` -アドオンが持つ利用者用設定画面(`user_settings.mako`)とプロジェクト用設定画面(`node_settings.mako`)のテンプレートをそれぞれ定義します。認証情報の設定用ダイアログ(`credentials_modal.mako`)はどちらの画面でも利用するので、別のファイルで定義し、それぞれから参照します。 -My MinIOアドオンの場合は、以下のように定義します。 +## GravyValet の準備と起動 -- [user_settings.mako](osf.io/addon/templates/user_settings.mako) -- [node_settings.mako](osf.io/addon/templates/node_settings.mako) -- [credentials_modal.mako](osf.io/addon/templates/credentials_modal.mako) +`gravyvalet` ディレクトリで作業します。まず以下の内容で`docker-compose.override.yml`を作成します。 -利用者用設定画面のJavaScriptファイル(`user-cfg.js`, `myminioUserConfig.js`)と、プロジェクト用設定画面のJavaScriptファイル(`node-cfg.js`, `myminioNodeConfig.js`)をそれぞれ定義します。今回は、エントリとなるJavaScriptファイル(`*-cfg.js`)と定義ファイル(`myminio*Config.js`)を分けましたが、スケルトン アドオンのように `*-cfg.js` に定義を書いても構いません。 -My MinIOアドオンの場合は、以下のように定義します。 +```yaml +services: + gravyvalet: + environment: + OSF_BASE_URL: "http://localhost" + celeryworker: + environment: + OSF_BASE_URL: "http://localhost" + celerybeat: + environment: + OSF_BASE_URL: "http://localhost" + postgres: + image: postgres:17 +``` -- [user-cfg.js](osf.io/addon/static/user-cfg.js) -- [node-cfg.js](osf.io/addon/static/node-cfg.js) -- [myminioUserConfig.js](osf.io/addon/static/myminioUserConfig.js) -- [myminioNodeConfig.js](osf.io/addon/static/myminioNodeConfig.js) +GravyValetには`local.py`のフックがなく、環境変数がフックです。環境変数`OSF_BASE_URL`から、受理するリソースURIの接頭辞(`ALLOWED_RESOURCE_URI_PREFIXES`)を導出します。プロキシのオリジンを指定し、プロジェクト(`http://localhost/`)のリソースを認識させます。一方、`OSF_API_BASE_URL`はそのままにします。こちらはGravyValetがosf.io API を呼ぶ際に`192.168.168.167`エイリアス経由で使う値であり、ブラウザ向けではありません。 -また、変更履歴メッセージの定義ファイルも追加します。 -My MinIOアドオンの場合は、以下のように定義します。 +また、`docker-compose.yml`では`postgres`サービスのイメージとして`postgres:latest`を指定しており、起動できないケースが確認されています。`postgres:17`を指定しているのはそのための対処です。 -- [myminioAnonymousLogActionList.json](osf.io/addon/static/myminioAnonymousLogActionList.json) -- [myminioLogActionList.json](osf.io/addon/static/myminioLogActionList.json) +続いて以下のコマンドで初期化を実施します。 -ストレージ操作UIであるFileViewerは[Fangorn](https://github.com/RCOSDP/RDM-osf.io/blob/develop/website/static/js/fangorn.js)を使って実装されています。アイテム選択時に表示するボタンをカスタマイズしたい場合は、 `Fangorn.config.アドオン名` を定義し、 `files.js` ファイルで読み込みます。 -My MinIOアドオンではカスタマイズせずデフォルト動作を使用しています。カスタマイズ例は、[GitHubアドオン](https://github.com/RCOSDP/RDM-osf.io/blob/develop/addons/github/static/githubFangornConfig.js)や[IQB-RIMSアドオン](https://github.com/RCOSDP/RDM-osf.io/blob/develop/addons/iqbrims/static/iqbrimsFangornConfig.js)を参照してください。 +```bash +$ docker compose up -d --build +$ docker compose exec gravyvalet python manage.py migrate +$ docker compose exec gravyvalet python manage.py fill_external_services +$ docker compose exec gravyvalet python manage.py createsuperuser +``` -### 設定モジュール +`migrate`はMigrationの実行で、初回以外にもモデルの追加や変更があったときに実行します。`fill_external_services`はGravyValetのコードベースに組み込まれているアドオン実装からExternalServiceを一通り作るコマンドで、組み込まれているストレージアドオン(S3やGoogleDriveなど)を利用することができるようになりますが、必須ではありません。`createsuperuser`によりGravyValetの管理者を作成し、`localhost:8004/admin`にブラウザでアクセスしてExternalServiceを追加することもできます。本ドキュメントで作成するアドオンからもExternalServiceを作る必要があるので、この管理者を作ることは必須です。普段の起動は`docker compose up -d`のみで十分です。 -環境ごとの設定ファイル `local.py` の雛形として `local-dist.py` ファイルを定義します。サービス管理者は `local-dist.py` を `local.py` にコピーして、適宜設定値を書き換えます。 +### 補足 -My MinIOアドオンの場合は、以下のように定義します。接続するMinIOサービスのホスト名を `HOST` プロパティに設定します。 +- GravyValetのコンテナは`gravyvalet`という名前です。例えば、GravyValetのログは以下のようにして確認することができます。 + ```bash + $ docker compose logs -f waterbutler + ``` -- [local-dist.py](osf.io/addon/settings/local-dist.py) +- Postgresは`postgres`コンテナで動作しており、DBを直接見たい場合はユーザを`postgres`、DBとして`gravyvalet`を指定します。 + ```bash + $ docker compose exec postgres psql -U postgres -W gravyvalet + ``` -### テストコード +## WaterButler の準備と起動 -シリアライザのテスト(`test_serializer.py`)を定義します。 -My MinIOアドオンの場合は、以下のように定義します。 +`waterbutler` ディレクトリで作業します。WaterButlerリポジトリには`docker-compose.yml`が含まれていません。以下の内容の`docker-compose.yml`を作成します。 -- [test_serializer.py](osf.io/addon/tests/test_serializer.py) +```yaml +services: + waterbutler: + build: + context: . + command: > + bash -c " + gosu www-data /code/.venv/bin/python -m invoke server + " + restart: unless-stopped + env_file: + - .docker-compose.env + ports: + - 7777:7777 + volumes: + - ./:/code:cached + - /code/.venv + stdin_open: true + depends_on: + - celery -## WaterButler Providerのモジュール構成 + celery: + build: + context: . + command: + gosu www-data /code/.venv/bin/python -m invoke celery + restart: unless-stopped + environment: + C_FORCE_ROOT: 1 + env_file: + - .docker-compose.env + stdin_open: true +``` -WaterButler Providerは、WaterButlerプロジェクトの中でPythonモジュールとして実装されます。 +続いて、以下のコマンドで起動します。 -`metadata.py` には、フォルダやファイルのメタデータと、リビジョンを持つクラスを定義します。 -My MinIOアドオンの場合は、以下のように定義します。 +```bash +$ docker compose up -d --build +``` -- [metadata.py](waterbutler/provider/metadata.py) +### 補足 -`provider.py`には、ストレージサービスと接続しCRUD操作などを行うProviderクラスを定義します。 +- WaterButlerのコンテナは`waterbutler`という名前です。例えばWaterButlerのログは以下のコマンドで確認することができます。 + ```bash + $ docker compose logs -f waterbutler + ``` -Providerが提供するメソッドには以下のようなものがあります。 +## angular-osf の準備と起動 +`angular-osf` ディレクトリで作業します。まず依存パッケージをインストールします。これは初回だけ実行します。 -| 関数名 | 引数 | 戻り値 | 処理 | -|:------|:----|:------|:-----| -| validate_v1_path | path, **kwargs | WaterButlerPath | 文字列で与えられたパス情報(`path`)を検証し、属性付きのWaterButlerPathオブジェクトを返す。 | -| validate_path | path, **kwargs | WaterButlerPath | 同上(廃止予定のv0仕様との互換性維持のため、2つのメソッドに分かれている)。 | -| download | path, accept_url=False, version=None, range=None, **kwargs | Stream | 指定されたパス(`path`)のデータをダウンロードする。戻り値にはデータアクセス用のStreamを返す。 | -| upload | stream, path, conflict='replace', **kwargs | Metadata | 指定されたパス(`path`)に指定されたデータ(`stream`)をアップロードする。戻り値にはアップロードしたファイルを示すMetadataを返す。 | -| delete | path, confirm_delete=0, **kwargs | なし | 指定されたパス(`path`)のファイル・フォルダを削除する。 | -| revisions | path, **kwargs | List(Revision) | 指定されたパス(`path`)のリビジョン情報を取得する。 | -| metadata | path, revision=None, **kwargs | Metadata or List(Metadata) | 指定されたパス(`path`)のメタデータを取得する。`path` がfileの場合 `Metadata` , directoryの場合 `List(Metadata)` を返す。 | -| create_folder | path, folder_precheck=True, **kwargs | Metadata | 指定されたパスにフォルダを作成する。戻り値には作成したフォルダを示すMetadataを返す。 | -| can_intra_copy | dest_provider, path=None | Bool | 指定された送信先Provider(`dest_provider`), パス(`path`)に対してintra_copy(内部コピー: ストレージサービス上でのコピー)が可能かどうかを判定する。これがFalseの場合、いったん一時ディレクトリにdownloadして、destにuploadするという操作となる。 | -| can_intra_move | dest_provider, path=None | Bool | 指定された送信先Provider(`dest_provider`), パス(`path`)に対してintra_move(内部移動: ストレージサービス中での移動)が可能かどうかを判定する。これがFalseの場合、いったん一時ディレクトリにdownloadして、destにupload、コピー元ファイルをdeleteするという操作となる。 | -| intra_copy | dest_provider, src_path, dest_path | Bool | 内部コピーを実施する。成功すればTrueを返す。 | -| intra_move | dest_provider, src_path, dest_path | Bool | 内部移動を実施する。成功すればTrueを返す。 | +```bash +$ npm install +``` -My MinIOアドオンの場合は、以下のように定義します。 +次に`src/assets/config/config.json`を以下の内容で作成します。このファイルは`.gitignore`によりgit管理から外されている設定ファイルです。これがないとangular-osfはステージング環境を指します。 -- [provider.py](waterbutler/provider/provider.py) +```json +{ + "webUrl": "http://localhost", + "apiDomainUrl": "http://localhost", + "addonsApiUrl": "http://localhost/v1", + "casUrl": "http://localhost:8080", + "recaptchaSiteKey": "6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI", + "sentryDsn": "", + "googleTagManagerId": "", + "newRelicEnabled": false +} +``` +開発サーバは**`development`**構成で起動します(i.e. `src/environments/environment.development.ts`)。 -## OSF.io AddonとWaterButler Providerの認証情報の委譲 +```bash +$ npx ng serve --configuration development --host 0.0.0.0 --port 4200 --poll 2000 +``` -OSF.io Addonは、WaterButler Providerが必要なサービスに接続できるよう、認証情報を委譲します。この認証情報の形式はAddonにより異なるため、AddonとProviderのバージョンを合わせるなど依存関係に配慮する必要があります。 +## Caddyを用いた単一オリジンプロキシの起動 -![認証情報などの委譲](images/crud.png) +任意の場所に `Caddyfile`というファイルを以下の内容で作成します。 -Addonにおける委譲設定は、 `addons.アドオン名.models.NodeSettings.serialize_waterbutler_credentials()` 関数で設定します。接続先のフォルダなどの情報は、同クラスの `serialize_waterbutler_settings()` 関数で設定します。例えば [IQB-RIMSアドオンの `serialize_waterbutler_settings()` 関数](https://github.com/RCOSDP/RDM-osf.io/blob/develop/addons/iqbrims/models.py#L226) では、フォルダごとの権限設定を渡します。 +```caddyfile +{ + admin off + auto_https off +} -My MinIOアドオンの場合は、以下のように定義します。認証情報として、アクセス先のホスト名、アクセスキー、シークレットキーを渡します。設定情報として、接続先のバケットIDを渡します。 +http://localhost { + # osf.io API (Django, :8000) + @api path /v2 /v2/* /_/* + handle @api { reverse_proxy 127.0.0.1:8000 } -``` -def serialize_waterbutler_credentials(self): - if not self.has_auth: - raise exceptions.AddonError('Cannot serialize credentials for {} addon'.format(FULL_NAME)) - return { - 'host': settings.HOST, - 'access_key': self.external_account.oauth_key, - 'secret_key': self.external_account.oauth_secret, - } + # WaterButler (ファイル操作) — /v1 より前に置くこと(GravyValet は /v1/resource-references を使う) + @wb path /v1/resources/* + handle @wb { reverse_proxy 127.0.0.1:7777 } -def serialize_waterbutler_settings(self): - if not self.folder_id: - raise exceptions.AddonError('Cannot serialize settings for {} addon'.format(FULL_NAME)) - return { - 'bucket': self.folder_id - } -``` + # GravyValet (アドオンサービス, Django, :8004) + @gv path /v1 /v1/* + handle @gv { reverse_proxy 127.0.0.1:8004 } -Provider側では、認証情報と設定情報を `waterbutler.providers.アドオン名.アドオン名Provider` クラスのコンストラクタ(`__init__()`)の引数 `credentials` と `settings` にDictionary型でそれぞれ受け取ります。 + # GravyValet のアドオンアイコン + @gvicons path /static/provider_icons/* /static/*/icons/* + handle @gvicons { reverse_proxy 127.0.0.1:8004 } -My MinIOアドオンの場合は、以下のように定義します。認証情報を使ってMy MinIOサービスとの接続を確立し、設定情報を使って接続先バケットを取得します。 + # osf.io web + CAS (Flask, :5000) + @flask path /login /login/* /logout /logout/* /oauth /oauth/* /api/v1 /api/v1/* /download /download/* + handle @flask { reverse_proxy 127.0.0.1:5000 } + # angular-osf の開発サーバ (:4200) — Host は "localhost" のまま(localhost:4200 に書き換えない) + handle { reverse_proxy 127.0.0.1:4200 } +} ``` -class MyMinIOProvider(provider.BaseProvider): - def __init__(self, auth, credentials, settings): - super().__init__(auth, credentials, settings) - host = credentials['host'] - port = 443 - m = re.match(r'^(.+)\:([0-9]+)$', host) - if m is not None: - host = m.group(1) - port = int(m.group(2)) - self.connection = MyMinIOConnection(credentials['access_key'], - credentials['secret_key'], - calling_format=OrdinaryCallingFormat(), - host=host, - port=port, - is_secure=port == 443) - self.bucket = self.connection.get_bucket(settings['bucket'], validate=False) +このファイルが配置されたディレクトリで以下のコマンドを実行することで起動します。 + +```bash +$ docker run -d --name osf-proxy --restart unless-stopped --network host -v "$PWD/Caddyfile:/etc/caddy/Caddyfile:ro" caddy:2 ``` -## Recent Activityの記録・表示 +## 起動手順のまとめ + +起動の順序は ** エイリアス -> バックエンド -> フロントエンド -> プロキシ ** です。 -何らかのユーザ操作を契機としてアドオンに対して行われた操作は、Recent Activityという形で記録することができます。 +```bash +# 0) ループバックエイリアス +$ sudo ifconfig lo:0 192.168.168.167 netmask 255.255.255.255 up -### NodeLogモデルの追加 +# 1) バックエンド +$ cd /path/to/osf.io && docker compose up -d assets fakecas worker web api +$ cd /path/to/gravyvalet && docker compose up -d +$ cd /path/to/waterbutler && docker compose up -d -Recent Activityは[NodeLogモデル](https://github.com/RCOSDP/RDM-osf.io/blob/develop/osf/models/nodelog.py)により表現されます。 -ログの追加はNode(プロジェクトに対応するモデル)の [add_logメソッド](https://github.com/RCOSDP/RDM-osf.io/blob/develop/osf/models/mixins.py#L84) により行うことができます。 +# 2) angular-osf の開発サーバ(別ターミナル。コンパイルに十数秒かかる) +$ cd /path/to/angular-osf +$ npx ng serve --configuration development --host 0.0.0.0 --port 4200 --poll 2000 -[models.py](osf.io/addon/models.py#L127-L143) +# 3) プロキシ +$ cd /path/to/Caddyfile +$ docker start osf-proxy # 初回は「単一オリジンプロキシ」の docker run を使用 ``` -self.owner.add_log( - '{0}_{1}'.format(SHORT_NAME, action), - auth=auth, - params={ - 'project': self.owner.parent_id, - 'node': self.owner._id, - 'path': metadata['materialized'], - 'bucket': self.folder_id, - 'urls': { - 'view': url, - 'download': url + '?action=download' - } - }, -) + +## Web UIを開く・動作確認 + +ブラウザで **http://localhost/** を開きます。osf.io のホームページが表示され、`Sign in` から fakecas を経由してサインインできます。ダッシュボード・プロジェクト・ファイルの参照まで、すべて単一の `http://localhost` オリジンで提供されます。 + +簡易的なヘルスチェック: + +```bash +$ curl -s -o /dev/null -w '%{http_code}\n' http://localhost/ # 200 (angular-osf) +$ curl -s -o /dev/null -w '%{http_code}\n' http://localhost/v2/ # 200 (API) ``` -この例では、NodeSettingsモデルのowner(Node)に対してログの追加を指示しています。 -パラメータには以下の値を指定することができます。 +以上で開発環境の準備は完了です。 -- `action` ... ログのアクション種別を示す名前。`アドオン名_アクション名`となる。本サンプルにより記録される`アクション名`には以下のものがある。 - - `node_authorized`, `node_deauthorized`, `node_deauthorized_no_user` ... プロジェクトに本アドオンが設定あるいは解除された場合に記録されるログ - - `bucket_linked`, `bucket_unlinked` ... プロジェクト設定画面により、バケットが設定あるいは解除された場合に記録されるログ - - `file_added`, `file_removed`, `file_updated`, `folder_created` ... WaterButlerによるファイル操作が行われた場合に記録されるログ -- `params` ... ログのパラメータ。任意のdictオブジェクトを指定することができる -- `auth` ... 操作を実施したユーザの情報。[framework.auth.Authクラス](https://github.com/RCOSDP/RDM-osf.io/blob/develop/framework/auth/core.py#L170)のインスタンスを与えることができる +# ストレージアドオンの設計 -### NodeLogモデルの表示 +## ストレージアドオンの構成 -記録されたログをどのように表示するかは、以下のJSONファイルにより定義します。 +1つのストレージサービスを扱うために以下の**3要素**を実装します。 -[myminioLogActionList.json](osf.io/addon/static/myminioLogActionList.json#L2) -``` -"myminio_bucket_linked" : "${user} linked the My MinIO bucket ${bucket} to ${node}", -``` +- **osf.io Addon**: osf.io上で動作するDjangoアプリケーション。ファイルとフォルダのモデルを持ち、アドオンの登録を担います。 +- **GravyValet Addon Imp**: GravyValet上で動作するDjangoアプリケーション。フォルダ内容の一覧やWaterButler向け設定の生成を担います。 +- **WaterButler Provider**: WaterButler上で動作する実装。実際のストレージへのアクセス、すなわちファイルの取得や移動・名称変更・削除といった処理を担います。 -[myminioAnonymousLogActionList.json](osf.io/addon/static/myminioAnonymousLogActionList.json#L2) -``` -"myminio_bucket_linked" : "A user linked an My MinIO bucket to a project", -``` +これら3要素を1つの独立したPythonパッケージにまとめ、各サービス(osf.io / GravyValet / WaterButler)へ`pip` / `poetry`でインストールして利用します。`osf.io` / `GravyValet` / `WaterButler`のソースコード内にアドオンを埋め込む必要はありません。実装済みの参考例としてNextCloudと接続するストレージアドオンである[`nextcloud_plugin`](https://github.com/chiku-samugari/nextcloud_plugin)パッケージとS3互換ストレージと接続するストレージアドオン[`s3compat_plugin`](https://github.com/chiku-samugari/s3compat_plugin)パッケージがあります。 -`アドオン名LogActionList.json`はログインした状態でのプロジェクト表示の際に利用され、`アドオン名AnonymousLogActionList.json`はパブリックなプロジェクト(RDMでは利用を想定していません)に利用されます。 -どのメッセージがログ表示に利用されるかは、add_logメソッドの `action` 引数に与えられた文字列がキーとして使用されます。また、メッセージ定義中の `${パラメータ名}` にはadd_logメソッドの `params` 引数に与えられたパラメータ中のキーを指定することができます。 +> GravyValet導入前は「osf.io Addon」と「WaterButler Provider」の2要素でしたが、GravyValetの導入により「Addon Imp」が加わりました。Addon Impは通常はGravyValet本体に組み込まれますが、本ガイドではGravyValet本体を変更せずに動的にAddon Impを追加できる**Foreign Addon Imp**の仕組みを利用します。 -メッセージの国際化は[pybabelコマンド](http://babel.pocoo.org/en/latest/cmdline.html)を用いて行うことができます。定義したアドオンのメッセージ(英語で記載する)に対応する日本語メッセージの定義ファイルを生成するためには、 -以下のコマンドを実行します。 +![ストレージアドオン構成(1つのパッケージを3サービスへインストール)](images/architecture.png) -``` -# メッセージ定義JSONなどをJavaScriptファイルへと変換する -$ docker compose run --rm web invoke assets +## ファイルの構成 -# メッセージ定義テンプレートファイル website/translations/js_messages.pot を更新する -$ docker compose run --rm web pybabel extract -F ./website/settings/babel_js.cfg -o ./website/translations/js_messages.pot . +ストレージアドオンの典型的なレイアウトは以下のようになります。`nextcloud_plugin` を例としています。 -# メッセージ定義ファイル website/translations/ja/LC_MESSAGES/js_messages.po を更新する -$ docker compose run --rm web pybabel update -i ./website/translations/js_messages.pot -o ./website/translations/en/LC_MESSAGES/js_messages.po -l en -$ docker compose run --rm web pybabel update -i ./website/translations/js_messages.pot -o ./website/translations/ja/LC_MESSAGES/js_messages.po -l ja +``` +nextcloud_plugin/ +├── pyproject.toml ... パッケージ定義、依存関係の宣言、WaterButlerエントリポイントの定義 +├── README.md +└── src/nextcloud_plugin/ + ├── addon/ ... osf.io Addonパッケージ + ├── addon_imp/ ... GravyValet Addon Impパッケージ + └── provider/ ... WaterButler Providerパッケージ ``` -すると、`website/translations/ja/LC_MESSAGES/js_messages.po`ファイルに、以下のような空の項目が追加されます。 +### osf.io Addon のファイル構成 ``` -#: website/static/js/logActionsList_extract.js:246 -msgid "${user} linked the My MinIO bucket ${bucket} to ${node}" -msgstr "" +src/nextcloud_plugin/addon/ +├── __init__.py ... パッケージ初期化ファイル +├── apps.py ... アプリケーションの定義 +├── models.py ... FileNodeモデル3クラスと`UserSettings`, `NodeSettings`の定義 +├── provider.py ... 認証プロバイダの定義 +├── serializer.py ... Node/User設定をJSON化するシリアライザの定義 +├── routes.py / views.py ... View(Routes/Views)の定義 +├── settings/ ... 設定モジュール +│ ├── __init__.py +│ └── defaults.py ... デフォルト設定(ホストの Django settings から`getattr`で上書き可能) +├── typedmodel_workaround.py ... `TypedModelRejoinMixin`を提供 +└── migrations/ ... このaddonのMigration(パッケージに同梱する) ``` -この `msgstr` に日本語によるメッセージ定義を追加することで、メッセージを国際化することができます。 +> ストレージアドオンではフロントエンドを提供しません。接続・設定・フォルダ選択・ファイルブラウズのUIは`angular-osf`と`GravyValet`が提供します。従来必要だったアドオンごとのmakoテンプレート(`node_settings.mako`等)、`*-cfg.js` / `*Config.js`、Fangornのカスタマイズ、ログ表示用JSON(`*LogActionList.json`)、`storageAddons.json`への登録、JavaScriptメッセージの国際化(pybabel)などは不要です。 + +### GravyValet Addon Impのファイル構成 ``` -#: website/static/js/logActionsList_extract.js:246 -msgid "${user} linked the My MinIO bucket ${bucket} to ${node}" -msgstr "${user}が My MinIOバケット(${bucket})を接続しました" +src/nextcloud_plugin/addon_imp/ +├── __init__.py +├── apps.py ... アプリケーションの定義 +├── imp.py ... AddonImpの実装 +└── static/{AppConfig.name}/icons/ ... アドオンのアイコンを配置するディレクトリ ``` -`js_messages.po` を変更したら、`assets`サービスを再起動してください。最新の`js_messages.po`ファイルがメッセージの表示に使用されるようになります。 +### WaterButler Providerのファイル構成 ``` -$ docker compose restart assets +src/nextcloud_plugin/provider/ +├── __init__.py +├── provider.py ... Provider の定義 +├── metadata.py ... Metadata の定義 +├── settings.py ... デフォルト設定の定義 +└── utils.py ... (必要に応じて)ユーティリティ ``` -## タイムスタンプの処理 +## 識別名について -RDMではユーザが任意のタイミングで、プロジェクト中のファイルに対してタイムスタンプを打つことができます。タイムスタンプは、ファイルに関してその時点での内容を証明するもので、研究の証跡としてのデータを考える上で非常に重要です。 +ストレージアドオンでは1つのストレージサービスを表す**1つの識別名(例: `nextcloud`)**を3要素で一貫して使う必要があります。これらが一致していない場合、ファイル操作時にAddonやProviderの解決に失敗します。 -なお、docker-composeで起動した状態では [FreeTSA Project](http://eswg.jnsa.org/sandbox/freetsa/) のサーバを用いてタイムスタンプを付与します。実環境への配備時は[UPKI電子証明書発行サービス](https://certs.nii.ac.jp/)によりタイムスタンプ付与することを想定しています。 +| 識別子 | 場所 | 値の例 | +|:-------------------|:----------------------------------------------|:------------| +| `short_name` | osf.io AddonのAppConfig | `nextcloud` | +| `_provider` | osf.io AddonのFileNodeモデル | `nextcloud` | +| `addon_imp_name` | GravyValet Addon ImpのForeignAddonImpConfig | `NEXTCLOUD` | +| `wb_key` | GravyValet のExternalStorageService | `nextcloud` | +| エントリポイント名 | WaterButler Providerの`pyproject.toml` | `nextcloud` | -### ユーザによるタイムスタンプの追加 +より正確には以下の関係を満たす必要があります。 -タイムスタンプは、ファイルの内容から計算したハッシュ値を署名する形で作成されます。ハッシュの取得は以下のいずれかの方法でおこないます。 +``` +short_name == _provider == addon_imp_name.lower() == wb_key == WaterButler エントリポイント名 +``` -- `osf.models.files.File` サブクラスの `get_hash_for_timestamp`により取得する -- WaterButlerを経由してファイルをダウンロードし、ハッシュ計算を行う +加えて、osf.io Addonにおいて以下の2つはいずれも`addons_`という形式にする必要があります(例: `addons_nextcloud`)。 -`osf.models.files.File` サブクラスはアドオンのモデルとしてハッシュ値の取得方法を定義するものです。本サンプルでは [models.py](osf.io/addon/models.py) にあります。 -ストレージにより容易にハッシュ相当の値を取得・管理する方法がある場合は、このモデルに`get_hash_for_timestamp(self)`メソッドを定義します。 -タイムスタンプ処理はこのメソッドを通じてハッシュ値を取得することができます。 -`get_hash_for_timestamp(self)`メソッドの実装は dropboxbusinessアドオンの [DropboxBusinessFileクラス](https://github.com/RCOSDP/RDM-osf.io/blob/develop/addons/dropboxbusiness/models.py#L38) を参考にしてください。 ++ AppConfigの`label`クラス属性 ( 例: `NextcloudAddonAppConfig.label`) ++ FileNodeの`app_label`Metaオプション (例: `NextcloudFileNode.Meta.app_label`) -`osf.models.files.File`モデルに`get_hash_for_timestamp(self)`が定義されていない場合は、タイムスタンプ処理はWaterButlerを経由してファイルをダウンロードする方法を試行します。 +## osf.io Addonのモジュール構成 -### RDM以外でのファイル変更によるタイムスタンプの追加 +### AppConfig -RDM以外でのファイル変更時に実施する場合も、ファイルが変更されたことを示すためにタイムスタンプを付加したい場合があります。 -このような処理を実行するためには `website.util.timestamp` モジュールを使用します。 -例えばDropbox Businessアドオンでは以下のように実装しています。 +`apps.py`に、`BaseAddonAppConfig`を継承した`AppConfig`を定義し、`name`、`short_name`([前章](#識別名について)を参照)、`label`(= `addons_`)、`full_name`(画面表示用)を設定します。さらに、`ready()`メソッドで`rejoin_models()`を呼び出します。 -[dropboxbusiness/utils.py](https://github.com/RCOSDP/RDM-osf.io/blob/develop/addons/dropboxbusiness/utils.py) -``` -... -from website.util import timestamp +NextCloudの場合は、`nextcloud_plugin`パッケージの [`src/nextcloud_plugin/addon/apps.py`](https://github.com/chiku-samugari/nextcloud_plugin/blob/main/src/nextcloud_plugin/addon/apps.py) を参照してください。要点は以下のとおりです。 -... +```python +class NextcloudAddonAppConfig(BaseAddonAppConfig): + name = 'nextcloud_plugin.addon' + short_name = 'nextcloud' + label = 'addons_nextcloud' + full_name = 'Nextcloud' + categories = ['storage'] + # ... -file_info = { - 'file_id': file_node._id, - 'file_name': attrs.get('name'), - 'file_path': attrs.get('materialized'), - 'size': attrs.get('size'), - 'created': attrs.get('created_utc'), - 'modified': attrs.get('modified_utc'), - 'file_version': '', - 'provider': PROVIDER_NAME -} -# verified by admin -verify_result = timestamp.check_file_timestamp( - admin.id, node, file_info, verify_external_only=True) + def ready(self): + super().ready() + from .models import NextcloudFileNode, NextcloudFile, NextcloudFolder + from .typedmodel_workaround import rejoin_models + rejoin_models(NextcloudFileNode, NextcloudFile, NextcloudFolder) ``` -`check_file_timestamp(uid, node, data, verify_external_only=False)`関数は以下のパラメータを指定することができます。 +### Model の構成 -- `uid` ... タイムスタンプ操作を行うユーザを示すOSFUserのID -- `node` ... ファイルが所属するプロジェクトを示すNode -- `data` ... タイムスタンプにより署名検証するデータを示す辞書型データ -- `verify_external_only` ... タイムスタンプ検証情報の格納に`osf.models.RdmFileTimestamptokenVerifyResult`を使う場合はFalse, 使わない場合(`osf.models.files.File` サブクラスの`def set_timestamp(self, timestamp_data, timestamp_status, context)`に格納する場合)はTrueとする (デフォルトはFalse) +`models.py`に以下のModelを定義します。 -なお、`def set_timestamp(self, timestamp_data, timestamp_status, context)` の定義方法は dropboxbusinessアドオンの [DropboxBusinessFileクラス](https://github.com/RCOSDP/RDM-osf.io/blob/develop/addons/dropboxbusiness/models.py#L38) を参考にしてください。 +- `UserSettings`: ユーザーに関する情報(認証情報等) +- `NodeSettings`: プロジェクトに関する情報 +- `アドオン名FileNode`: ファイル・フォルダオブジェクトの親定義 +- `アドオン名File`: ファイルオブジェクトの定義 +- `アドオン名Folder`: フォルダオブジェクトの定義 -また、タイムスタンプの付加処理はストレージのAPI呼び出しやタイムスタンプの付加処理などI/Oを伴うため、viewsモジュール内の関数など、リクエストハンドラとして振る舞う関数中で処理を行ってしまうと、他のハンドラが待たされる要因になります。 -このような状況に対応するため、RDMでは[Celery](https://docs.celeryproject.org/en/stable/)によるワーカーが用意されています。 -関数をCeleryタスクとして定義することで、時間がかかる処理はワーカーに委譲することができます。 -例えばDropbox Businessアドオンでは以下のように定義しています。 +ファイルノードの3クラス(`FileNode` / `File` / `Folder`)は、**明示的にプロキシモデル**として定義し、TypedModelに再登録する必要があります。具体的には以下のようにします。 -[dropboxbusiness/utils.py](https://github.com/RCOSDP/RDM-osf.io/blob/develop/addons/dropboxbusiness/utils.py) -``` -... -from framework.celery_tasks import app as celery_app +- `アドオン名FileNode` の基底クラスに `TypedModelRejoinMixin` を含める。 +- 3 クラスとも `Meta.proxy = True` を指定する。 +- `アドオン名FileNode` に `_provider = ''`、`db_owner = 'osf'`、`Meta.app_label = 'addons_'` を設定する。 -... +この手順に従うことで、[AppConfig.ready()](#appconfig)で呼び出す`rejoin_models()`がTypedModelへの再登録を実施します。 -@celery_app.task(bind=True, base=AbortableTask) -def celery_check_updated_files(self, team_ids): - ... -``` +```python +class NextcloudFileNode(TypedModelRejoinMixin, BaseFileNode): + _provider = 'nextcloud' + db_owner = 'osf' + class Meta: + proxy = True + app_label = 'addons_nextcloud' -呼び出し側では以下のように関数を実行することで、ワーカーに処理を任せ、自身の処理を続行することができます。 +class NextcloudFolder(NextcloudFileNode, Folder): + class Meta: + proxy = True -[dropboxbusiness/views.py](https://github.com/RCOSDP/RDM-osf.io/blob/develop/addons/dropboxbusiness/views.py) -``` -utils.celery_check_updated_files.delay(team_ids) +class NextcloudFile(NextcloudFileNode, File): + version_identifier = 'version' + class Meta: + proxy = True ``` -# My MinIOアドオンの実装 +> `BaseFileNode`クラスはTypedModelで管理されていますが、そのままではMigrationがosf.io側に生成されてしまい、ストレージアドオンを独立したPythonパッケージとして配布できません。プロキシモデルに明示的な`app_label`を与えるとMigrationがストレージアドオン側に生成されますが、TypedModelはこのようなクラスの管理を止めてしまいます。`TypedModelRejoinMixin`と`ready()`内の`rejoin_models()`により、これらのクラスを`db_owner`(= `osf`)をキーとしてTypedModelのレジストリへ再登録し、この問題を回避しています。詳細は`nextcloud_plugin`の[`src/nextcloud_plugin/addon/typedmodel_workaround.py`](https://github.com/chiku-samugari/nextcloud_plugin/blob/main/src/nextcloud_plugin/addon/typedmodel_workaround.py)を参照してください。 + +`UserSettings`と`NodeSettings`は、OAuth認証をしない場合であってもそれぞれ`BaseOAuthUserSettings`と`BaseOAuthNodeSettings`(`NodeSettings`はさらに`BaseStorageAddon`)を継承し、`oauth_provider`に認証プロバイダクラス(`アドオン名Provider`)を指定します。認証プロバイダクラスは`provider.py`に定義します(`models.py`に定義されている場合もあります)。OAuthを用いる場合は`osf.models.external.ExternalProvider`を、ユーザー名・パスワードなどを用いる場合は`osf.models.external.BasicAuthProviderMixin`を継承します。NextCloudはWebDAVのユーザー名・パスワード認証を用いるため、後者を使用します。 -ここでは、 `myminio` という識別名のアドオンの実装を例に説明します。アドオンの完全名は `My MinIO` とします。 +NextCloudアドオンでの具体例は`nextcloud_plugin`パッケージの以下のファイルを参照してください。 -アドオン名は様々な場所に埋め込まれています。アドオン名を変更したい場合は、以降で追加・変更するファイル名やコードの `myminio` 、 `My MinIO` 、 `MyMinIO` という文字列を変更してください。 +- [`src/nextcloud_plugin/addon/models.py`](https://github.com/chiku-samugari/nextcloud_plugin/blob/main/src/nextcloud_plugin/addon/models.py) +- [`src/nextcloud_plugin/addon/provider.py`](https://github.com/chiku-samugari/nextcloud_plugin/blob/main/src/nextcloud_plugin/addon/provider.py) -My MinIOアドオンは、AWS S3互換サービスと接続するアドオンなので、Amazon S3アドオンやS3 Compatible Storageアドオンを参考に実装することができます。Amazon S3アドオンやS3 Compatible Storageアドオンとの違いは以下の通りです。 +### シリアライザ -- My MinIOアドオンは簡単のため、アップロードの暗号化機能を実装しない。 -- Amazon S3アドオンやS3 Compatible Storageアドオンは、アカウントごとに接続するサービスやLocationなどを選択できるが、My MinIOはサービス側で指定した特定のMinIOサービスのみを扱う。 +`serializer.py`に`アドオン名Serializer`(`addons.base.serializer.StorageAddonSerializer`を継承)を定義します。これは、アドオンの`NodeSettings` / `UserSettings`を、設定画面やAPIが扱えるJSON形式に変換するものです。次節「Viewの構成」で用いる`addons.base.generic_views`は、このシリアライザを介して設定情報を入出力します。 -## OSF.ioへの実装 +主にシリアライズする情報は以下のとおりです。 -### addons.myminio モジュールの定義 +- **接続先フォルダ**(`serialized_folder`): プロジェクトに紐付けたフォルダの名前とパス。 +- **各種エンドポイントURL**(`addon_serialized_urls`): 認証情報の追加・一覧・インポート、認証解除、フォルダ一覧取得、設定保存などのURL。 +- **Node設定 / User設定**(`serialized_node_settings` / `serialized_user_settings`): 認証状態や接続先などの設定値。 -スケルトン アドオンと同様に、[アドオンの実装例(`osf.io/addon/`)](osf.io/addon/)を `addons/myminio` ディレクトリにコピーします。 +また、`credentials_are_valid()`により、保存された認証情報が有効か(実際にストレージへ接続できるか)を検証します。 -### RDMコードの変更 +NextCloudアドオンでの具体例は[`src/nextcloud_plugin/addon/serializer.py`](https://github.com/chiku-samugari/nextcloud_plugin/blob/main/src/nextcloud_plugin/addon/serializer.py)を参照してください。 -スケルトン アドオンと同様に、RDMのコードをいくつか変更します。 -- [addons.json](https://github.com/RCOSDP/RDM-osf.io/blob/develop/addons.json) - - 変更例のサンプル: [addons.json](osf.io/config/addons.json) -- [framework/addons/data/addons.json](https://github.com/RCOSDP/RDM-osf.io/blob/develop/framework/addons/data/addons.json) - - 変更例のサンプル: [addons.json](osf.io/config/framework/addons/data/addons.json) -- [Dockerfile](https://github.com/RCOSDP/RDM-osf.io/blob/develop/Dockerfile) - - 変更例のサンプル: [Dockerfile](osf.io/config/Dockerfile) -- [api/base/settings/defaults.py](https://github.com/RCOSDP/RDM-osf.io/blob/develop/api/base/settings/defaults.py) - - 変更例のサンプル: [defaults.py](osf.io/config/api/base/settings/defaults.py) +### Viewの構成 -`api/base/settings/defaults.py` は、 `INSTALLED_APPS` の他に、 `ADDONS_FOLDER_CONFIGURABLE` 、 `ADDONS_OAUTH` にもアドオン名を追加します。変更例サンプルでは、Amazon S3アドオンに合わせて、スケルトン アドオンとは異なる方法で設定しています。 +`views.py`には、アドオンのアカウント設定やフォルダ取得などのエンドポイントを定義します。一部のViewは[シリアライザ](#シリアライザ)と`addons.base.generic_views`モジュールを利用することで簡潔に定義することができます。 +```python +import_auth = addons.base.generic_views.import_auth(SHORT_NAME, Serializer) ``` -INSTALLED_APPS += ('addons.myminio',) -ADDONS_FOLDER_CONFIGURABLE.append('myminio') -ADDONS_OAUTH.append('myminio') + +`generic_views`で提供していないView処理を追加したい場合や、View処理をカスタマイズしたい場合は、以下のように`views.py`に個別の関数を定義します。 + +```python +@must_have_addon(SHORT_NAME, 'user') +@must_have_addon(SHORT_NAME, 'node') +def nextcloud_folder_list(node_addon, user_addon, **kwargs): + """ Returns all the subsequent folders under the folder id passed. + Not easily generalizable due to `path` kwarg. + """ + path = request.args.get('path') + return node_addon.get_folders(path=path) ``` -他にもストレージアドオンでは、 [website/static/storageAddons.json](https://github.com/RCOSDP/RDM-osf.io/blob/develop/website/static/storageAddons.json) にも設定を追加する必要があります。 +NextCloud の場合の具体例は、`nextcloud_plugin` パッケージの以下のファイルを参照してください。 -変更例は [storageAddons.json](osf.io/config/website/static/storageAddons.json) を参照してください。 +- [`src/nextcloud_plugin/addon/routes.py`](https://github.com/chiku-samugari/nextcloud_plugin/blob/main/src/nextcloud_plugin/addon/routes.py) +- [`src/nextcloud_plugin/addon/views.py`](https://github.com/chiku-samugari/nextcloud_plugin/blob/main/src/nextcloud_plugin/addon/views.py) -``` - "myminio": { - "fullName": "My MinIO", - "externalView": false - }, +### 設定モジュール + +ストレージアドオンごとの固有の設定は`settings/defaults.py` で定義とデフォルト値を設定し、osf.ioのDjango settings から`getattr` で上書きする形で読み込むようにします。これにより、サービス管理者がパッケージの中身を編集することなく、`api/base/settings/local.py`で設定を上書きできます。したがって、これらの設定項目はREADMEに明記する必要があります。 + +```python +# src/nextcloud_plugin/addon/settings/defaults.py +from django.conf import settings as _osf + +USE_SSL = getattr(_osf, 'NEXTCLOUD_USE_SSL', True) +MAX_UPLOAD_SIZE = getattr(_osf, 'NEXTCLOUD_MAX_UPLOAD_SIZE', 5 * 1024) ``` -> `externalView` を `true` に設定すると、FileViewerでファイルの外部ページリンクボタンが表示されるようになります。リンクを正しく動作させるには、WaterButlerのProviderを修正する必要があります。詳細は[GoogleDriveの実装](https://github.com/RCOSDP/RDM-waterbutler/blob/develop/waterbutler/providers/googledrive/metadata.py#L116)などを参照してください。 +> 接続先ホストや「選択可能なホストの一覧」などの**サービス単位の設定は、GravyValetの`ExternalStorageService`で管理します**。`ExternalStorageService`はAddon Impなどを元に作られる、DB上のデータです。つまり、そのようなデータはソースコードの形では保持しません。 -> FileViewerで、フォルダの操作はできるがファイルの操作ができない場合は、 `storageAddons.json` の設定が漏れている可能性があります。 +### Migration +FileNodeモデルが必要とするMigrationを以下の手順で作成し、パッケージに同梱します。 -### Migrationsファイルの作成 +1. osf.io AddonのMigration以外の部分を完成させる +2. 開発環境のosf.ioにosf.io Addonをインストールする + - インストール方法は[ストレージアドオンの利用方法](#ストレージアドオンの利用方法)を参照 +3. `makemigrations`を**アプリケーションラベル(`addons_`)を明示して**実行する + - `docker compose run --rm web python3 manage.py makemigrations addons_nextcloud` +4. 生成されたMigrationファイルからosf側への依存(`('osf', '0XXX_...')`)を手作業で取り除き、ストレージアドオンの一部として`addon/migrations/`に配置してパッケージに同梱する + - osf.ioの特定のMigration履歴にストレージアドオンパッケージを固定しないため -`makemigrations` コマンドを実行して、Migrationsファイルを作成します。 +## GravyValet Addon Impのモジュール構成 -``` -$ docker compose run --rm web python3 manage.py makemigrations -``` +GravyValet Addon Impは、`gravyvalet.addon_toolkit.interfaces.storage`の`StorageAddonHttpRequestorImp`(HTTPベース)または`StorageAddonClientRequestorImp[T]`(クライアントライブラリベース)を継承して実装します。GravyValet本体に組み込まれた既存のAddon Imp(`gravyvalet/addon_imps/storage/*.py`)は良い実装例です。例えばNextCloudはWebDAV を用いるため、`owncloud.py`のAddon Impが近い実装例となります。 + +`apps.py`には`ForeignAddonImpConfig`を継承したAppConfigを定義し、以下を実装・設定します。 -上記の出力中に以下のような出力が現れれば成功です。ストレージアドオンの場合、 `osf/migrations` と `addons/myminio/migrations` の2つのディレクトリ内にPythonファイルが作成されます。 +- `imp`: AddonImp 実装クラスを返すプロパティ。 +- `addon_imp_name`: このAddon Impの一意な識別名(大文字、例: `NEXTCLOUD`)を返すプロパティ。`addon_service.common.known_imps.KnownAddonImps`に列挙された名前、および既存のストレージアドオンで使われている値と衝突しない値を返します。 +- `name`: Djangoアプリのインポートパス(例: `nextcloud_plugin.addon_imp`)。アイコンの静的ファイルは`static/{name}/icons/` に配置します。 +- `label`: Django アプリのラベル。**一意な値を明示的に設定します**(例: `nextcloud_addon_imp`)。Django はラベルを省略するとパスの末尾(`addon_imp`)を使うため、これを省略したストレージアドオンを複数使うとGravyValet が起動できなくなります。 -> `osf/migrations` 配下に作成されるファイル名は、作成日時やRDMのバージョンによって異なります。 +```python +class NextcloudForeignAddonImpConfig(ForeignAddonImpConfig): + name = "nextcloud_plugin.addon_imp" + label = "nextcloud_addon_imp" + @property + def imp(self): + return NextcloudStorageImp + + @property + def addon_imp_name(self): + return "NEXTCLOUD" ``` -Migrations for 'osf': - osf/migrations/0214_auto_20201001_0007.py - - Create proxy model MyMinIOFileNode - - Alter field type on basefilenode - - Create proxy model MyMinIOFile - - Create proxy model MyMinIOFolder -Migrations for 'addons_myminio': - addons/myminio/migrations/0001_initial.py - - Create model NodeSettings - - Create model UserSettings - - Add field user_settings to nodesettings + +`addon_imp_name`と`name` の値はREADME にも明記する必要があります。`addon_imp_name`はサービス管理者がこのストレージアドオンを設定する際に利用する値であり、サービス管理者が知る必要のある値です。`name`は他の同様なストレージアドオンパッケージが同じ値を使うことを避ける必要があり、ストレージアドオンの開発者が知る必要のある値です。 + +`imp.py`で定義するAddon Imp本体ではストレージのブラウズ(`list_root_items` / `list_child_items` / `get_item_info`)や認証検証(`get_external_account_id`)などを実装します。また、`build_wb_config()` メソッドで、WaterButler Provider に渡す設定(`settings`)を生成します。NextCloud の場合、接続先フォルダ・ホスト・SSL 検証フラグを返します。 + +```python +async def build_wb_config(self) -> dict: + # ... + return { + "folder": f"/{folder_path}", + "host": root_host, + "verify_ssl": True, + } ``` -### 国際化メッセージファイルの作成 +具体的な実装例は`nextcloud_plugin` パッケージの以下のファイルを参照してください。 -国際化メッセージファイルの定義ファイルは以下のコマンドで生成することができます。 +- [`src/nextcloud_plugin/addon_imp/apps.py`](https://github.com/chiku-samugari/nextcloud_plugin/blob/main/src/nextcloud_plugin/addon_imp/apps.py) +- [`src/nextcloud_plugin/addon_imp/imp.py`](https://github.com/chiku-samugari/nextcloud_plugin/blob/main/src/nextcloud_plugin/addon_imp/imp.py) -> このセクションの実施時は各サービスを停止状態にしてください。 +## WaterButler Providerのモジュール構成 -``` -# メッセージ定義JSONなどをJavaScriptファイルへと変換する。各サービスが停止している状態で実施する。 -$ docker compose run --rm web invoke assets +WaterButler ProviderはWaterButlerが提供する`waterbutler.core.provider.BaseProvider`を継承して実装します。`metadata.py`にはフォルダ・ファイルのメタデータとリビジョンを表すクラスを、`provider.py`にはストレージへ接続し CRUD 操作を行うProviderクラスを定義します。 -# メッセージ定義テンプレートファイル website/translations/js_messages.pot を更新する -$ docker compose run --rm web pybabel extract -F ./website/settings/babel_js.cfg -o ./website/translations/js_messages.pot . +Provider が提供する主なメソッドは以下のとおりです。 -# メッセージ定義ファイル website/translations/ja/LC_MESSAGES/js_messages.po を更新する -$ docker compose run --rm web pybabel update -i ./website/translations/js_messages.pot -o ./website/translations/en/LC_MESSAGES/js_messages.po -l en -$ docker compose run --rm web pybabel update -i ./website/translations/js_messages.pot -o ./website/translations/ja/LC_MESSAGES/js_messages.po -l ja -``` +| 関数名 | 引数 | 戻り値 | 処理 | +|:------|:----|:------|:-----| +| `validate_v1_path` | path, **kwargs | WaterButlerPath | 文字列で与えられたパス情報(`path`)を検証し、属性付きの WaterButlerPath オブジェクトを返す。 | +| `validate_path` | path, **kwargs | WaterButlerPath | 同上(廃止予定の v0 仕様との互換性維持のため、2 つのメソッドに分かれている)。 | +| `download` | path, accept_url=False, version=None, range=None, **kwargs | Stream | 指定されたパス(`path`)のデータをダウンロードする。戻り値にはデータアクセス用の Stream を返す。 | +| `upload` | stream, path, conflict='replace', **kwargs | Metadata | 指定されたパス(`path`)に指定されたデータ(`stream`)をアップロードする。戻り値にはアップロードしたファイルを示す Metadata を返す。 | +| `delete` | path, confirm_delete=0, **kwargs | なし | 指定されたパス(`path`)のファイル・フォルダを削除する。 | +| `revisions` | path, **kwargs | List(Revision) | 指定されたパス(`path`)のリビジョン情報を取得する。 | +| `metadata` | path, revision=None, **kwargs | Metadata or List(Metadata) | 指定されたパス(`path`)のメタデータを取得する。`path` が file の場合 `Metadata`、directory の場合 `List(Metadata)` を返す。 | +| `create_folder` | path, folder_precheck=True, **kwargs | Metadata | 指定されたパスにフォルダを作成する。戻り値には作成したフォルダを示す Metadata を返す。 | +| `can_intra_copy` | dest_provider, path=None | Bool | 指定された送信先 Provider(`dest_provider`), パス(`path`)に対して intra_copy(内部コピー: ストレージサービス上でのコピー)が可能かどうかを判定する。これが False の場合、いったん一時ディレクトリに download して dest に upload する操作となる。 | +| `can_intra_move` | dest_provider, path=None | Bool | 指定された送信先 Provider(`dest_provider`), パス(`path`)に対して intra_move(内部移動: ストレージサービス中での移動)が可能かどうかを判定する。これが False の場合、いったん一時ディレクトリに download し dest に upload、コピー元ファイルを delete する操作となる。 | +| `intra_copy` | dest_provider, src_path, dest_path | Bool | 内部コピーを実施する。成功すれば True を返す。 | +| `intra_move` | dest_provider, src_path, dest_path | Bool | 内部移動を実施する。成功すれば True を返す。 | + +Providerクラスの`NAME`には[前述の識別名](#識別名について)を指定します(例: `nextcloud`)。 -変更例のサンプル [js_messages.po](osf.io/config/website/translations/ja/LC_MESSAGES/js_messages.po) を参考に日本語メッセージを追加してください。 +```python +class NextcloudProvider(provider.BaseProvider): + NAME = 'nextcloud' + def __init__(self, auth, credentials, settings, **kwargs): + super().__init__(auth, credentials, settings, **kwargs) + self.folder = settings['folder'] + self.verify_ssl = settings['verify_ssl'] + self.url = credentials['host'] + self._auth = aiohttp.BasicAuth(credentials['username'], credentials['password']) ``` -#: website/static/js/logActionsList_extract.js:246 -msgid "${user} linked the My MinIO bucket ${bucket} to ${node}" -msgstr "${user}がMy MinIOバケット(${bucket})を${node}にリンクしました" -#: website/static/js/logActionsList_extract.js:247 -msgid "${user} unselected the My MinIO bucket ${bucket} in ${node}" -msgstr "${user}が${node}のMy MinIOバケット(${bucket})の選択を解除しました" +WaterButlerは`pyproject.toml`の`[tool.poetry.plugins."waterbutler.providers"]`に登録されたエントリポイントからProviderを発見します。**このエントリポイント名が、[前述の識別名](#識別名について)になります。** -... +```toml +[tool.poetry.plugins."waterbutler.providers"] +nextcloud = "nextcloud_plugin.provider.provider:NextcloudProvider" ``` -このメッセージを追加後、`assets`サービスの再起動時にメッセージ定義が反映されます。 +NextCloud での実装例は`nextcloud_plugin` パッケージの以下のファイルを参照してください。 + +- [`src/nextcloud_plugin/provider/provider.py`](https://github.com/chiku-samugari/nextcloud_plugin/blob/main/src/nextcloud_plugin/provider/provider.py) +- [`src/nextcloud_plugin/provider/metadata.py`](https://github.com/chiku-samugari/nextcloud_plugin/blob/main/src/nextcloud_plugin/provider/metadata.py) + +## 認証情報・設定情報の委譲 + +WaterButler Providerが実際のストレージに接続するには、認証情報(`credentials`)と設定情報(`settings`)が必要です。本ドキュメントの想定する構成においてはこれらは**GravyValetが管理し、WaterButlerへ渡します**(従来の構成ではosf.io Addonの`NodeSettings.serialize_waterbutler_credentials()` / `serialize_waterbutler_settings()`が担っていました)。 -### アドオンのテスト +![認証情報・設定情報の委譲フロー(osf.io → GravyValet → WaterButler)](images/delegation.png) -以下のコマンドで、OSF.ioに追加したMy MinIOアドオンのユニットテストを実行できます。 +- 設定情報(`settings`)はGravyValet Addon Impの`build_wb_config()`が生成 + - NextCloud の場合は接続先フォルダ・ホスト・SSL 検証フラグ +- 認証情報(`credentials`)はGravyValet が管理する認証アカウント(ユーザーが接続時に入力した値)から渡される + - NextCloud の場合はホスト・ユーザー名・パスワード +WaterButler Provider側では、コンストラクタ(`__init__`)の引数`credentials`と`settings`に、それぞれDictionary型で受け取ります。NextCloudの場合は以下のように受け取ります。 + +```python +def __init__(self, auth, credentials, settings, **kwargs): + super().__init__(auth, credentials, settings, **kwargs) + self.folder = settings['folder'] # build_wb_config() が生成 + self.verify_ssl = settings['verify_ssl'] # build_wb_config() が生成 + self.url = credentials['host'] # GravyValet のアカウントから + self._auth = aiohttp.BasicAuth(credentials['username'], credentials['password']) ``` -$ docker compose run --rm web invoke test_module -m addons/myminio/tests/ + +## Recent Activity の記録 + +何らかのユーザー操作を契機としてアドオンに対して行われた操作は、Recent Activity という形で記録できます。Recent Activityは[NodeLog モデル](https://github.com/CenterForOpenScience/osf.io/blob/develop/osf/models/nodelog.py) により表現され、Node(プロジェクトに対応するモデル)の`add_log`メソッドで記録します。 + +```python +self.owner.add_log( + '{0}_{1}'.format(SHORT_NAME, action), + auth=auth, + params={ + 'project': self.owner.parent_id, + 'node': self.owner._id, + 'path': metadata['materialized'], + 'folder': self.folder_id, + 'urls': { + 'view': url, + 'download': url + '?action=download', + }, + }, +) ``` -## WaterButlerへの実装 +- `action` ... ログのアクション種別。`アドオン名_アクション名` の形式。 +- `params` ... ログのパラメータ。任意の dict を指定できる。 +- `auth` ... 操作を実施したユーザーの情報([framework.auth.Auth クラス](https://github.com/CenterForOpenScience/osf.io/blob/develop/framework/auth/core.py) のインスタンス)。 -### waterbutler.providers.myminio モジュールの定義 +> ログの表示(どのメッセージをどう描画するか)は`angular-osf`フロントエンドが担当します。`RDM-osf.io`の`アドオン名LogActionList.json` / `アドオン名AnonymousLogActionList.json`やpybabel によるJavaScriptメッセージの国際化は不要です。 -[Providerの実装例(`waterbutler/provider/`)](waterbutler/provider/) を `waterbutler/providers/myminio` にコピーします。また、[Providerのテストコード例(`waterbutler/tests`)](waterbutler/tests) を `tests/providers/myminio` にコピーします。 +# ストレージアドオンの利用方法 -### RDMコードの変更 +作成したストレージアドオンは独立したPythonパッケージなので、`pip`や`poetry`を利用して各サービスにインストールします。特に、osf.io Addonのための[Migrationを作成する必要がある](#migration)ので、ここでは開発環境へのインストール方法を、NextCloud用のストレージアドオンパッケージである[`nextcloud_plugin`](https://github.com/chiku-samugari/nextcloud_plugin)を例にとって説明します。[開発環境の準備](#開発環境の準備)のガイドに従って開発環境にてosf.io, GravyValet, WaterButler, angular-osfを起動しているものとします。特に、osf.io, GravyValet, WaterButlerがそれぞれのディレクトリ、すなわち独立したComposeプロジェクトとして起動されている前提であることに注意してください。 -[setup.py](https://github.com/RCOSDP/RDM-waterbutler/blob/develop/setup.py) に、アドオンのエントリポイント定義を追加します。`setup()` 関数の引数 `entry_points` に指定するDictionaryの `waterbutler.providers` キーに指定する配列に、以下を追加します。 +## osf.io -``` -'myminio = waterbutler.providers.myminio:MyMinIOProvider', -``` +本節での作業は`osf.io`ディレクトリにて実施します。 -変更例はサンプル [setup.py](waterbutler/config/setup.py) を参照してください。 +1. `docker-compose.override.yml`に、`nextcloud_plugin`のコードベースをボリュームとして追加 + ``` + services: + web: + volumes: + - /path/to/nextcloud_plugin/:/nextcloud_plugin:cached + api: + volumes: + - /path/to/nextcloud_plugin/:/nextcloud_plugin:cached + worker: + volumes: + - /path/to/nextcloud_plugin/:/nextcloud_plugin:cached + ``` -### docker-compose.override.yml の追加 +2. ストレージアドオンパッケージを`api`/`web`/`worker`コンテナにインストール + - `docker compose exec web pip install -e /nextcloud_plugin` + - `docker compose exec api pip install -e /nextcloud_plugin` + - `docker compose exec worker pip install -e /nextcloud_plugin` -変更したコードを使うよう、RDMの `docker-compose.override.yml` で WaterButler のサービスの `volumes` を指定します。 +3. `api/base/settings/local.py`の`INSTALLED_APPS`に、osf.io Addonパッケージを追加 -例えば、以下のようなディレクトリ階層の場合は、 + ```python + INSTALLED_APPS += ('nextcloud_plugin.addon',) + ``` -``` -. -├── RDM-osf.io -│   ├── docker-compose.override.yml -│   └── docker-compose.yml -└── RDM-waterbutler -``` +ここで使う値はAppConfigの`name`の値です。 -`RDM-osf.io/docker-compose.override.yml` の内容を以下のようにします。 +4. `api/base/settings/local.py`の`ADDONS_FOLDER_CONFIGURABLE`に、`short_name`の値を追加 -``` -version: "3.4" + ```python + ADDONS_FOLDER_CONFIGURABLE += ['nextcloud'] + ``` -services: - wb: - volumes: - - ../RDM-waterbutler:/code - wb_worker: - volumes: - - ../RDM-waterbutler:/code - wb_requirements: - volumes: - - ../RDM-waterbutler:/code -``` +5. `addons.json`の`addons`リストに`short_name`の値を追加する + ```json + "addons": [ ..., "nextcloud" ], + ``` -### アドオンのテスト +必要に応じて `addons_archivable` 等にも追加します。 -以下のコマンドで、WaterButlerに追加したMy MinIOアドオン Providerのユニットテストを実行できます。 +6. サービスを再起動する + - `docker compose restart` -``` -$ docker compose run --rm wb invoke test --provider myminio -``` +> GravyValetを利用する場合、`storageAddons.json`への追記は不要です。 +## GravyValet -# My MinIOアドオンの動作確認 +本節の作業は`gravyvalet`ディレクトリにて実施します。 -My MinIOアドオンの動作確認をしてみましょう。 +1. `docker-compose.override.yml`に、`nextcloud_plugin`のコードベースをボリュームとして追加 + ``` + services: + gravyvalet: + volumes: + - /path/to/nextcloud_plugin/:/nextcloud_plugin:cached + ``` +2. ストレージアドオンパッケージを`gravyvalet`コンテナにインストール + - `docker compose exec gravyvalet poetry add --editable /nextcloud_plugin` -## MinIOサービスの起動 +3. `app/settings.py`の`INSTALLED_APPS`に、Addon Impのパッケージ(`name`)を追加 -接続先のMinIOサービスを起動します。 + ```python + INSTALLED_APPS += ('nextcloud_plugin.addon_imp',) + ``` -``` -docker run -p 9001:9000 \ - -e "MINIO_ACCESS_KEY=minioadmin" \ - -e "MINIO_SECRET_KEY=minioadmin" \ - minio/minio server /data -``` +4. `app/settings.py`の`ADDON_IMPS`にエントリを追加する。**キーは`addon_imp_name`(`"NEXTCLOUD"`)、値は一意な5000以上の整数**(パッケージ名をキーにしないこと。前述の[命名規則](#識別名について)の注意を参照)。 -RDMと同じコンピュータで実行する場合、9000番ポートが競合してしまうので、MinIOサービスのホストへの割り当てポートは9001などに設定します。 -`MINIO_ACCESS_KEY` と `MINIO_SECRET_KEY` は認証に使うキーです。適宜書き換えてください。 + ```python + ADDON_IMPS = { + # ... + "NEXTCLOUD": 5001, + } + ``` -その他MinIOに関する詳しい説明は[MinIOのドキュメント](https://docs.min.io/)を参照してください。 +5. GravyValetのサービスを再起動します。 + - `docker compose restart` -## OSF.io Addonの設定 +6. GravyValetの管理画面`localhost:8004/admin`から、NextCloud用の`ExternalStorageService`を作成します。**`wb_key`には`short_name`の値(`"nextcloud"`)を指定します**(= WaterButlerのエントリポイント名)。NextCloudのように接続先ホストをユーザーごとに入力させる場合、Service Typeを`HOSTED`とし、`api_base_url`は空にします。また、NextCloudはユーザ名とパスワードでの認証を用いるのでCredentials Formatとしては`USERNAME_PASSWORD`を指定します。 -OSF.io Addonの設定をします。 `addons/myminio/settings/local-dist.py` を `addons/myminio/settings/local.py` にコピーし、 `HOST` プロパティに先ほど起動したMinIOサービスのホスト名を指定します。 +![NextCloud用のExternalStorageServiceの設定例](images/gravyvalet-add-external-storage-service.png) -``` -HOST = '192.168.168.167:9001' -``` +## WaterButler -RDMとMinIOサービスを同じ環境で実行している場合は、ループバックエイリアスを指定します。 +1. `docker-compose.override.yml`に、`nextcloud_plugin`のコードベースをボリュームとして追加 + ``` + services: + waterbutler: + volumes: + - /path/to/nextcloud_plugin/:/nextcloud_plugin:cached + ``` -## DBマイグレーション +2. ストレージアドオンパッケージを`waterbutler`コンテナにインストール + - `docker compose exec waterbutler poetry add --editable /nextcloud_plugin` -マイグレーションを実行し、Migrations定義をPostgreSQLサービスに反映します。 +3. WaterButlerのサービスを再起動 + - `docker compose restart` -``` -$ docker compose run --rm web python3 manage.py migrate -``` +> **明示的な再起動が必須です。** editable installでは、パッケージへのパスを記した`.pth`ファイルがインタプリタ起動時にのみ読み込まれます。そのため起動済みのプロセスはインストール後も新しいProviderを認識せず(`ProviderNotFound`となる)、必ずプロセスを再起動する必要があります。 -## サービスの再起動 +Providerは`waterbutler.providers`エントリポイントから自動的に発見されます。 -WaterButlerに追加したProviderを有効にするために、 `wb_requirements` を起動します。 +# NextCloud アドオンの動作確認 -``` -$ docker compose up wb_requirements -``` +NextCloud アドオンの動作確認をしてみましょう。 -変更したファイルに関連するサービスを再起動します。 +## NextCloud サービスの起動 + +接続先のNextCloudサービスを起動します。動作確認にはNextCloud公式のDockerイメージが手軽です。 ``` -$ docker compose restart assets web api wb +$ docker run -d --name nextcloud-test -p 8081:80 nextcloud:stable ``` -これでサービスへの反映は完了です。 +ブラウザで `http://localhost:8081` を開き、セットアップウィザードに従って管理者ユーザーを作成します。 + +> WaterButler / GravyValetの各コンテナからNextCloudへ到達できる必要があります。osf.ioと同じホストで実行する場合は、`localhost`ではなくコンテナから到達可能なアドレス(osf.ioのローカル開発で用いるループバックエイリアス`192.168.168.167`など)を使用します。また、NextCloud側の`trusted_domains`に、そのアドレス(例: `192.168.168.167:8081`)を追加する必要がある場合があります。 + +## ExternalStorageServiceの作成 + +前述の「[ストレージアドオンの利用方法](#gravyvalet)」に従い、`ExternalStorageService`を作成します(`wb_key`は`nextcloud`、Credentials Formatは`USERNAME_PASSWORD`, Service Typeは`HOSTED`、`api_base_url` は空)。 ## ストレージアドオンを試す -My MinIOアドオンを試すには、以下のような操作を実施します。 - -1. RDM Web UIにアクセスする `http://localhost:5000` -1. ユーザ設定ページを開く -1. Configure add-on accountsページを開く -1. My MinIOアドオンの認証情報を設定をする - ![Authorize Addon](images/authorize-addon.png) - 認証情報の設定ダイアログが表示されるので、MinIOサービスの `MINIO_ACCESS_KEY` と `MINIO_SECRET_KEY` を、それぞれ、`Access Key` と `Secret Key` フォームに入力して保存します。 - ![Filled Credential](images/filled-credential.png) - 成功すれば、切断ボタンと利用しているプロジェクトリストが表示されるエリアが表示されます。 - ![Successful Authorization Addon](images/successful-authorization-addon.png) -1. 適当なプロジェクトを作成する -1. Add-onsページを開く -1. My MinIOアドオンを有効化する - ![Enable Addon](images/enable-addon.png) -1. My MinIOアドオンの設定をする - ![Configure Addon](images/configure-addon.png) - `Import Account from Profile`ボタンから、アドオンの設定を行います。 - 接続に成功すると、ルート直下のフォルダリストが表示されるので、プロジェクトに紐付けるフォルダを選択し、保存します。このページでフォルダを作成することもできます。 - ![Select Current Folder](images/select-current-folder.png) - -これで、作成したプロジェクトでMy MinIOアドオンが使えるようになりました。 -プロジェクトページのFiles ウィジェットやFilesページから、My MinIOサービスに対してフォルダの作成やファイルのアップロード、削除、ダウンロードなどができるようになるはずです。 - -![Enabled Addon](images/enabled-addon.png) - -以上でMy MinIOアドオンの動作確認は完了です! +angular-osf の画面から、以下のような操作を実施します。 + +1. アカウント設定画面で、NextCloud アドオンのアカウントを接続します。`Host URL` には NextCloud のホスト(例: `http://192.168.168.167:8081/`)、ユーザー名・パスワードには NextCloud のログイン情報を入力します。 +2. 適当なプロジェクトを作成し、NextCloud アドオンを有効化します。 +3. フォルダピッカーで、プロジェクトに紐付けるフォルダを選択します。 +4. プロジェクトのFilesから、NextCloudに対してフォルダ作成・アップロード・ダウンロード・削除・移動・コピーなどができることを確認します。 + +以上でNextCloudアドオンの動作確認は完了です。 diff --git a/StorageAddon/images/architecture.mmd b/StorageAddon/images/architecture.mmd new file mode 100644 index 0000000..9424593 --- /dev/null +++ b/StorageAddon/images/architecture.mmd @@ -0,0 +1,13 @@ +flowchart LR + subgraph PLUGIN["nextcloud_plugin(単一の Python パッケージ)"] + direction TB + A["addon
(osf.io アドオン)"] + I["addon_imp
(GravyValet Addon Imp)"] + P["provider
(WaterButler Provider)"] + end + FE["angular-osf
(フロントエンド)"] --> OSF[("osf.io")] + FE --> GV[("GravyValet")] + FE --> WB[("WaterButler")] + A -. "pip install" .-> OSF + I -. "poetry install" .-> GV + P -. "poetry install" .-> WB diff --git a/StorageAddon/images/architecture.png b/StorageAddon/images/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..3d8f73caa56e94eea9832cb3ab66b12c02dfb4d9 GIT binary patch literal 52427 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 R!54|HURILLkiPTe{{els_+9`2 literal 0 HcmV?d00001 diff --git a/StorageAddon/images/crud.png b/StorageAddon/images/crud.png deleted file mode 100644 index ecf47839f74ebabaa5530e4cb3efd2498133ba86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24413 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 diff --git a/StorageAddon/images/crud.uml b/StorageAddon/images/crud.uml deleted file mode 100644 index f41ad66..0000000 --- a/StorageAddon/images/crud.uml +++ /dev/null @@ -1,23 +0,0 @@ -# Build: -# $ cat crud.uml | docker run --rm -i think/plantuml -tpng > crud.png -@startuml - -actor User as user -participant "OSF.io Addon" as osf -participant "WaterButler Provider" as wb -database "External Storage" as storage - -osf --> user : Cookie -user -> wb : CRUD Request (+ Cookie) -activate wb -'wb -> osf : Request -'activate osf -'return Credentials and Settings -osf --> wb : Credentials and Settings -wb -> storage : CRUD Request -activate storage -return (Files) -return (Files) - - -@enduml diff --git a/StorageAddon/images/delegation.mmd b/StorageAddon/images/delegation.mmd new file mode 100644 index 0000000..6c08565 --- /dev/null +++ b/StorageAddon/images/delegation.mmd @@ -0,0 +1,14 @@ +sequenceDiagram + participant FE as angular-osf + participant OSF as osf.io + participant GV as GravyValet + participant WB as WaterButler + participant NC as NextCloud + FE->>OSF: ファイル操作要求(provider = nextcloud) + OSF->>GV: 認証情報・設定を要求(wb_key = nextcloud) + Note over GV: Addon Imp の build_wb_config() が settings を生成し、
認証アカウントから credentials を取得 + GV-->>OSF: credentials + settings + OSF->>WB: make_provider(credentials, settings) + WB->>NC: WebDAV でアクセス(CRUD) + NC-->>WB: 応答 + WB-->>FE: 応答 diff --git a/StorageAddon/images/delegation.png b/StorageAddon/images/delegation.png new file mode 100644 index 0000000000000000000000000000000000000000..39f8a80fb0a16aa2fcfcb101fefab75d64fed331 GIT binary patch literal 67811 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 z ze9w*l`6cduNH$>=L=_N;P}SJ>EZF@^mAsmZPSN2VtB>hFD*ckEY_r_Id9c+yAEQw3 zH*b2bQ&3~es;Zx~ljaXX1i4^ZXAU>1?f~Nx1*+P)rC2tV^O`!9f5J-1XI`ze7*4aflc7m!w4dr#AM^2@t zb4#y z-O|06awZLBeCy<@2fpyp!_(c=U1X0NaW)VC|W6o{TNP*qJ`7sucHUibxu3<56RFk3?RC|XS_O}VzDTD^8AeRH2Z^@b_R|>^1 zN`@`-woVsc1=*^y>9}T)xuw4D>J85UtCMJc$kA>0DKafwBxrS97nq%a3PpWZl5?L` zOX91_zVUC4_YIis=j%leeEzeYk^YxUdJqq!m&4=LN7^g^QSV-#@waY-WQvgahcxtF PORpraE(d#U@$tU^Zga9t literal 0 HcmV?d00001 diff --git a/StorageAddon/images/gravyvalet-add-external-storage-service.png b/StorageAddon/images/gravyvalet-add-external-storage-service.png new file mode 100644 index 0000000000000000000000000000000000000000..80c3a871e1b48f8f4e7eeea2e3bbede36bbf8f60 GIT binary patch literal 159771 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 Lo+vqf{ SN["osf.io アドオン
short_name = nextcloud"] + KEY --> PV["osf.io アドオン
_provider = nextcloud"] + KEY --> WK["GravyValet
wb_key = nextcloud"] + KEY --> AI["GravyValet
addon_imp_name = NEXTCLOUD
.lower() = nextcloud"] + KEY --> EP["WaterButler
エントリポイント名 = nextcloud"] + KEY --> LB["osf.io アドオン
label / app_label = addons_nextcloud"] diff --git a/StorageAddon/images/naming.png b/StorageAddon/images/naming.png new file mode 100644 index 0000000000000000000000000000000000000000..cc7599a883cfe2dfba36d567ef78b5fff558decc GIT binary patch literal 50212 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®}uDYc&_gepoEQUa8UT8MK~rgXoDY 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≪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 literal 0 HcmV?d00001 diff --git a/StorageAddon/images/osf_class.png b/StorageAddon/images/osf_class.png deleted file mode 100644 index 34d7af84f65a2cdc2dd329eb36a49cf6b9bbdf91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88505 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 diff --git a/StorageAddon/images/osf_class.uml b/StorageAddon/images/osf_class.uml deleted file mode 100644 index 27a08c3..0000000 --- a/StorageAddon/images/osf_class.uml +++ /dev/null @@ -1,96 +0,0 @@ -# Build: -# $ cat osf_class.uml | docker run --rm -i think/plantuml -tpng > osf_class.png -@startuml - -package addons.base.apps <> { - class BaseAddonAppConfig -} - -package addons.base <> { - object generic_views -} - -package addons.base.serializer <> { - class StorageAddonSerializer -} - -package addons.base.models <> { - class BaseNodeSettings - class BaseUserSettings - class BaseOAuthNodeSettings - class BaseOAuthUserSettings - class BaseStorageAddon -} - -package osf.models.files <> { - class BaseFileNode - class Folder - class File -} - - -package addons.$(addon_short_name).apps <> { - class AddonAppConfig -} - -package addons.$(addon_short_name).routes <> { - object api_routes -} - -package addons.$(addon_short_name).provider <> { - class "$(AddonShortName)Provider" -} - -package addons.$(addon_short_name).serializer <> { - class "$(AddonShortName)Serializer" -} - -package addons.$(addon_short_name).models <> { - class NodeSettings - class UserSettings - class "$(AddonShortName)FileNode" - class "$(AddonShortName)Folder" - class "$(AddonShortName)File" -} - -package addons.$(addon_short_name).views <> { - object set_config - object get_config - object import_auth - object deauthorize_node - object add_user_account - object account_list - object create_folder - object folder_list -} - -BaseAddonAppConfig <|-- AddonAppConfig - -StorageAddonSerializer <|-- "$(AddonShortName)Serializer" - -BaseNodeSettings <|-- BaseOAuthNodeSettings -BaseUserSettings <|-- BaseOAuthUserSettings - -BaseOAuthNodeSettings <|-- NodeSettings -BaseStorageAddon <|-- NodeSettings -NodeSettings ..> "$(AddonShortName)Provider" -NodeSettings ..> "$(AddonShortName)Serializer" - -BaseOAuthUserSettings <|-- UserSettings -UserSettings ...> "$(AddonShortName)Provider" -UserSettings ...> "$(AddonShortName)Serializer" - -BaseFileNode <|-- "$(AddonShortName)FileNode" -Folder <|-- "$(AddonShortName)Folder" -File <|-- "$(AddonShortName)File" -"$(AddonShortName)FileNode" <|-- "$(AddonShortName)Folder" -"$(AddonShortName)FileNode" <|-- "$(AddonShortName)File" - -AddonAppConfig ..> api_routes -AddonAppConfig ..> NodeSettings -AddonAppConfig ..> UserSettings -api_routes ..> "addons.$(addon_short_name).views" -"addons.$(addon_short_name).views" ..> generic_views -"addons.$(addon_short_name).views" ..> "$(AddonShortName)Serializer" - -@enduml diff --git a/StorageAddon/images/proxy-routing.mmd b/StorageAddon/images/proxy-routing.mmd new file mode 100644 index 0000000..4863354 --- /dev/null +++ b/StorageAddon/images/proxy-routing.mmd @@ -0,0 +1,7 @@ +flowchart LR + B["ブラウザ
http://localhost"] --> C{{"Caddy
単一オリジン
リバースプロキシ"}} + C -->|"/v2, /_/"| API[("osf.io API
:8000")] + C -->|"/v1/resources/*"| WB[("WaterButler
:7777")] + C -->|"/v1, /static/*/icons"| GV[("GravyValet
:8004")] + C -->|"/login /logout /oauth /api/v1 /download"| CAS[("osf.io web/CAS
:5000")] + C -->|"上記以外すべて"| NG[("angular-osf
:4200")] diff --git a/StorageAddon/images/proxy-routing.png b/StorageAddon/images/proxy-routing.png new file mode 100644 index 0000000000000000000000000000000000000000..d6704a5874ab0f895c7a9a0e16fd09693da312bb GIT binary patch literal 58493 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 literal 0 HcmV?d00001 diff --git a/StorageAddon/images/wb_class.png b/StorageAddon/images/wb_class.png deleted file mode 100644 index 235092be323950581beac3e50d342fb86ecda9de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50412 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 diff --git a/StorageAddon/images/wb_class.uml b/StorageAddon/images/wb_class.uml deleted file mode 100644 index 3888be6..0000000 --- a/StorageAddon/images/wb_class.uml +++ /dev/null @@ -1,45 +0,0 @@ -# Build: -# $ cat wb_class.uml | docker run --rm -i think/plantuml -tpng > wb_class.png -@startuml - -package waterbutler.core.metadata <> { - class BaseMetadata - class BaseFileMetadata - class BaseFolderMetadata - class BaseFileRevisionMetadata -} - -package waterbutler.core.provider <> { - class BaseProvider -} - - -package waterbutler.providers.$(addon_short_name).metadata <> { - class "$(AddonShortName)Metadata" - class "$(AddonShortName)FileMetadataHeaders" - class "$(AddonShortName)FileMetadata" - class "$(AddonShortName)FolderKeyMetadata" - class "$(AddonShortName)FolderMetadata" - class "$(AddonShortName)Revision" -} - -package waterbutler.providers.$(addon_short_name).provider <> { - class "$(AddonShortName)Provider" -} - - -BaseMetadata <|-- "$(AddonShortName)Metadata" -"$(AddonShortName)Metadata" <|-- "$(AddonShortName)FileMetadataHeaders" -BaseFileMetadata <|-- "$(AddonShortName)FileMetadataHeaders" -"$(AddonShortName)Metadata" <|-- "$(AddonShortName)FileMetadata" -BaseFileMetadata <|-- "$(AddonShortName)FileMetadata" -"$(AddonShortName)Metadata" <|-- "$(AddonShortName)FolderKeyMetadata" -BaseFolderMetadata <|-- "$(AddonShortName)FolderKeyMetadata" -"$(AddonShortName)Metadata" <|-- "$(AddonShortName)FolderMetadata" -BaseFolderMetadata <|-- "$(AddonShortName)FolderMetadata" -BaseFileRevisionMetadata <|-- "$(AddonShortName)Revision" - -BaseProvider <|-- "$(AddonShortName)Provider" -"$(AddonShortName)Provider" ..> "waterbutler.providers.$(addon_short_name).metadata" - -@enduml diff --git a/StorageAddon/osf.io/addon/__init__.py b/StorageAddon/osf.io/addon/__init__.py deleted file mode 100644 index 0bdb5eb..0000000 --- a/StorageAddon/osf.io/addon/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -SHORT_NAME = 'myminio' -FULL_NAME = 'My MinIO' - -default_app_config = 'addons.{}.apps.MyMinIOAddonAppConfig'.format(SHORT_NAME) diff --git a/StorageAddon/osf.io/addon/apps.py b/StorageAddon/osf.io/addon/apps.py deleted file mode 100644 index 7b9dc03..0000000 --- a/StorageAddon/osf.io/addon/apps.py +++ /dev/null @@ -1,70 +0,0 @@ -import os - -from addons.base.apps import BaseAddonAppConfig, generic_root_folder -from addons.myminio import SHORT_NAME, FULL_NAME -from addons.myminio import settings - -myminio_root_folder = generic_root_folder('myminio') - -HERE = os.path.dirname(os.path.abspath(__file__)) -TEMPLATE_PATH = os.path.join( - HERE, - 'templates' -) - - -class MyMinIOAddonAppConfig(BaseAddonAppConfig): - - name = 'addons.{}'.format(SHORT_NAME) - label = 'addons_{}'.format(SHORT_NAME) - full_name = FULL_NAME - short_name = SHORT_NAME - - owners = ['user', 'node'] - configs = ['accounts', 'node'] - categories = ['storage'] - - has_hgrid_files = True - - max_file_size = settings.MAX_FILE_SIZE - - node_settings_template = os.path.join(TEMPLATE_PATH, 'node_settings.mako') - user_settings_template = os.path.join(TEMPLATE_PATH, 'user_settings.mako') - - BUCKET_LINKED = 'myminio_bucket_linked' - BUCKET_UNLINKED = 'myminio_bucket_unlinked' - FILE_ADDED = 'myminio_file_added' - FILE_REMOVED = 'myminio_file_removed' - FILE_UPDATED = 'myminio_file_updated' - FOLDER_CREATED = 'myminio_folder_created' - NODE_AUTHORIZED = 'myminio_node_authorized' - NODE_DEAUTHORIZED = 'myminio_node_deauthorized' - NODE_DEAUTHORIZED_NO_USER = 'myminio_node_deauthorized_no_user' - actions = ( - BUCKET_LINKED, - BUCKET_UNLINKED, - FILE_ADDED, - FILE_REMOVED, - FILE_UPDATED, - FOLDER_CREATED, - NODE_AUTHORIZED, - NODE_DEAUTHORIZED, - NODE_DEAUTHORIZED_NO_USER - ) - - @property - def get_hgrid_data(self): - return myminio_root_folder - - @property - def routes(self): - from . import routes - return [routes.api_routes] - - @property - def user_settings(self): - return self.get_model('UserSettings') - - @property - def node_settings(self): - return self.get_model('NodeSettings') diff --git a/StorageAddon/osf.io/addon/migrations/__init__.py b/StorageAddon/osf.io/addon/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/StorageAddon/osf.io/addon/models.py b/StorageAddon/osf.io/addon/models.py deleted file mode 100644 index 0a610c3..0000000 --- a/StorageAddon/osf.io/addon/models.py +++ /dev/null @@ -1,146 +0,0 @@ -from django.db import models - -import addons.myminio.settings as settings -from addons.base import exceptions -from addons.base.models import (BaseOAuthNodeSettings, BaseOAuthUserSettings, - BaseStorageAddon) -from addons.myminio import SHORT_NAME, FULL_NAME -from addons.myminio.provider import MyMinIOProvider -from addons.myminio.serializer import MyMinIOSerializer -from addons.myminio.utils import bucket_exists, get_bucket_names -from framework.auth.core import Auth -from osf.models.files import File, Folder, BaseFileNode - - -class MyMinIOFileNode(BaseFileNode): - _provider = SHORT_NAME - - -class MyMinIOFolder(MyMinIOFileNode, Folder): - pass - - -class MyMinIOFile(MyMinIOFileNode, File): - version_identifier = 'version' - - -class UserSettings(BaseOAuthUserSettings): - oauth_provider = MyMinIOProvider - serializer = MyMinIOSerializer - - -class NodeSettings(BaseOAuthNodeSettings, BaseStorageAddon): - oauth_provider = MyMinIOProvider - serializer = MyMinIOSerializer - - folder_id = models.TextField(blank=True, null=True) - folder_name = models.TextField(blank=True, null=True) - folder_location = models.TextField(blank=True, null=True) - user_settings = models.ForeignKey(UserSettings, null=True, blank=True, on_delete=models.CASCADE) - - @property - def folder_path(self): - return self.folder_name - - @property - def display_name(self): - return u'{0}: {1}'.format(self.config.full_name, self.folder_id) - - def set_folder(self, folder_id, auth): - host = settings.HOST - if not bucket_exists(host, - self.external_account.oauth_key, - self.external_account.oauth_secret, folder_id): - error_message = ('We are having trouble connecting to that bucket. ' - 'Try a different one.') - raise exceptions.InvalidFolderError(error_message) - - self.folder_id = str(folder_id) - self.folder_name = folder_id - self.save() - - self.nodelogger.log(action='bucket_linked', extra={'bucket': str(folder_id)}, save=True) - - def get_folders(self, **kwargs): - # This really gets only buckets, not subfolders, - # as that's all we want to be linkable on a node. - try: - buckets = get_bucket_names(self) - except Exception: - raise exceptions.InvalidAuthError() - - return [ - { - 'addon': SHORT_NAME, - 'kind': 'folder', - 'id': bucket, - 'name': bucket, - 'path': bucket, - 'urls': { - 'folders': '' - } - } - for bucket in buckets - ] - - @property - def complete(self): - return self.has_auth and self.folder_id is not None - - def authorize(self, user_settings, save=False): - self.user_settings = user_settings - self.nodelogger.log(action='node_authorized', save=save) - - def clear_settings(self): - self.folder_id = None - self.folder_name = None - self.folder_location = None - - def deauthorize(self, auth=None, log=True): - """Remove user authorization from this node and log the event.""" - self.clear_settings() - self.clear_auth() # Also performs a save - - if log: - self.nodelogger.log(action='node_deauthorized', save=True) - - def delete(self, save=True): - self.deauthorize(log=False) - super(NodeSettings, self).delete(save=save) - - def serialize_waterbutler_credentials(self): - if not self.has_auth: - raise exceptions.AddonError('Cannot serialize credentials for {} addon'.format(FULL_NAME)) - return { - 'host': settings.HOST, - 'access_key': self.external_account.oauth_key, - 'secret_key': self.external_account.oauth_secret, - } - - def serialize_waterbutler_settings(self): - if not self.folder_id: - raise exceptions.AddonError('Cannot serialize settings for {} addon'.format(FULL_NAME)) - return { - 'bucket': self.folder_id - } - - def create_waterbutler_log(self, auth, action, metadata): - url = self.owner.web_url_for('addon_view_or_download_file', path=metadata['path'], provider=SHORT_NAME) - - self.owner.add_log( - '{0}_{1}'.format(SHORT_NAME, action), - auth=auth, - params={ - 'project': self.owner.parent_id, - 'node': self.owner._id, - 'path': metadata['materialized'], - 'bucket': self.folder_id, - 'urls': { - 'view': url, - 'download': url + '?action=download' - } - }, - ) - - def after_delete(self, user): - self.deauthorize(Auth(user=user), log=True) diff --git a/StorageAddon/osf.io/addon/provider.py b/StorageAddon/osf.io/addon/provider.py deleted file mode 100644 index ae32265..0000000 --- a/StorageAddon/osf.io/addon/provider.py +++ /dev/null @@ -1,22 +0,0 @@ -from addons.myminio import SHORT_NAME, FULL_NAME -from addons.myminio.serializer import MyMinIOSerializer - - -class MyMinIOProvider(object): - """An alternative to `ExternalProvider` not tied to OAuth""" - - name = FULL_NAME - short_name = SHORT_NAME - serializer = MyMinIOSerializer - - def __init__(self, account=None): - super(MyMinIOProvider, self).__init__() - - # provide an unauthenticated session by default - self.account = account - - def __repr__(self): - return '<{name}: {status}>'.format( - name=self.__class__.__name__, - status=self.account.provider_id if self.account else 'anonymous' - ) diff --git a/StorageAddon/osf.io/addon/requirements.txt b/StorageAddon/osf.io/addon/requirements.txt deleted file mode 100644 index 8e6ed87..0000000 --- a/StorageAddon/osf.io/addon/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -boto==2.38.0 diff --git a/StorageAddon/osf.io/addon/routes.py b/StorageAddon/osf.io/addon/routes.py deleted file mode 100644 index ac287eb..0000000 --- a/StorageAddon/osf.io/addon/routes.py +++ /dev/null @@ -1,79 +0,0 @@ -from addons.myminio import SHORT_NAME -from addons.myminio import views -from framework.routing import Rule, json_renderer - -api_routes = { - 'rules': [ - Rule( - [ - '/settings/{}/accounts/'.format(SHORT_NAME), - ], - 'post', - views.myminio_add_user_account, - json_renderer, - ), - Rule( - [ - '/settings/{}/accounts/'.format(SHORT_NAME), - ], - 'get', - views.myminio_account_list, - json_renderer, - ), - Rule( - [ - '/project//{}/settings/'.format(SHORT_NAME), - '/project//node//{}/settings/'.format(SHORT_NAME), - ], - 'put', - views.myminio_set_config, - json_renderer, - ), - Rule( - [ - '/project//{}/settings/'.format(SHORT_NAME), - '/project//node//{}/settings/'.format(SHORT_NAME), - ], - 'get', - views.myminio_get_config, - json_renderer, - ), - Rule( - [ - '/project//{}/user-auth/'.format(SHORT_NAME), - '/project//node//{}/user-auth/'.format(SHORT_NAME), - ], - 'put', - views.myminio_import_auth, - json_renderer, - ), - Rule( - [ - '/project//{}/user-auth/'.format(SHORT_NAME), - '/project//node//{}/user-auth/'.format(SHORT_NAME), - ], - 'delete', - views.myminio_deauthorize_node, - json_renderer, - ), - Rule( - [ - '/project//{}/buckets/'.format(SHORT_NAME), - '/project//node//{}/buckets/'.format(SHORT_NAME), - ], - 'get', - views.myminio_folder_list, - json_renderer, - ), - Rule( - [ - '/project//{}/newbucket/'.format(SHORT_NAME), - '/project//node//{}/newbucket/'.format(SHORT_NAME), - ], - 'post', - views.myminio_create_bucket, - json_renderer - ), - ], - 'prefix': '/api/v1', -} diff --git a/StorageAddon/osf.io/addon/serializer.py b/StorageAddon/osf.io/addon/serializer.py deleted file mode 100644 index 8a50c4a..0000000 --- a/StorageAddon/osf.io/addon/serializer.py +++ /dev/null @@ -1,45 +0,0 @@ -from addons.base.serializer import StorageAddonSerializer -from addons.myminio import SHORT_NAME -from addons.myminio import settings -from addons.myminio import utils -from website.util import web_url_for - - -class MyMinIOSerializer(StorageAddonSerializer): - addon_short_name = SHORT_NAME - - REQUIRED_URLS = [] - - @property - def addon_serialized_urls(self): - node = self.node_settings.owner - user_settings = self.node_settings.user_settings or self.user_settings - - result = { - 'accounts': node.api_url_for('{}_account_list'.format(SHORT_NAME)), - 'createBucket': node.api_url_for('{}_create_bucket'.format(SHORT_NAME)), - 'importAuth': node.api_url_for('{}_import_auth'.format(SHORT_NAME)), - 'create': node.api_url_for('{}_add_user_account'.format(SHORT_NAME)), - 'deauthorize': node.api_url_for('{}_deauthorize_node'.format(SHORT_NAME)), - 'folders': node.api_url_for('{}_folder_list'.format(SHORT_NAME)), - 'config': node.api_url_for('{}_set_config'.format(SHORT_NAME)), - 'files': node.web_url_for('collect_file_trees'), - } - if user_settings: - result['owner'] = web_url_for('profile_view_id', - uid=user_settings.owner._id) - return result - - def serialized_folder(self, node_settings): - return { - 'path': node_settings.folder_id, - 'name': node_settings.folder_name - } - - def credentials_are_valid(self, user_settings, client=None): - if user_settings: - for account in user_settings.external_accounts.all(): - if utils.can_list(settings.HOST, - account.oauth_key, account.oauth_secret): - return True - return False diff --git a/StorageAddon/osf.io/addon/settings/__init__.py b/StorageAddon/osf.io/addon/settings/__init__.py deleted file mode 100644 index 4d3fcfa..0000000 --- a/StorageAddon/osf.io/addon/settings/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -import logging -from .defaults import * # noqa - -logger = logging.getLogger(__name__) -try: - from .local import * # noqa -except ImportError: - logger.warn('No local.py settings file found') diff --git a/StorageAddon/osf.io/addon/settings/defaults.py b/StorageAddon/osf.io/addon/settings/defaults.py deleted file mode 100644 index 9eb235d..0000000 --- a/StorageAddon/osf.io/addon/settings/defaults.py +++ /dev/null @@ -1 +0,0 @@ -MAX_FILE_SIZE = 128 # MB diff --git a/StorageAddon/osf.io/addon/settings/local-dist.py b/StorageAddon/osf.io/addon/settings/local-dist.py deleted file mode 100644 index dde3504..0000000 --- a/StorageAddon/osf.io/addon/settings/local-dist.py +++ /dev/null @@ -1,2 +0,0 @@ -# MyMinIO app credentials -HOST = 'changeme' diff --git a/StorageAddon/osf.io/addon/static/comicon.png b/StorageAddon/osf.io/addon/static/comicon.png deleted file mode 100644 index 7acb4dcdd2318771002d42e4c2143c4371220bab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1673 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=G`DAk4@xYmNj^jY?)nL`j6Nk5zJhu3lnFep0GlMQ#C5H3Nf9g%yyQn_7~nP?4LH zS8P>bs{~eI1!RMS^_3LBN=mYAl_Got6rA&mQWZ?~O!N$t?6?#Z6l{u8(yW49+@RWl zJX@uVl9B=|ef{$Ca=mh6z5JqdeM3u2OML?)eIp}XpbFjM%Dj@q3f;V7Wr!g#b6ir3 zlZ!G7N;32F6hP)CCgqow*eWT3EP?}wJ4-Ut5H{r%L%jv`pgu@O-%!s$ADgz+icB2Z zKr%SBr6j|BRZv=#1NKu&vVLk#YHn&?Nik5LAy(^vVGGxY;>e1`0*GbcK!o_s2IO+9 zpw#00oKjE_gyvGs1{@~boCJkYwXNnb|4F) zYw$111o|`)x zocyBTg2d!hki)=Qkc7}xgRP0gWet)9lE#!|tK!n6tkmQZq}T$+8940+rxxlX3ESvn zRc!-I30A)ODVb@NE{P?nc18w-|45X9fnw-<~dx zAr^vXgKYgn97Sx)@9Df@-|eLsuPBn0v`|nU(eiL8dbgb9A$Ct{s*A#djC)*mP!|>}#)j`KAriKNh=8t-W~lkJ&-dBft7$XQUR} z1wUstd7^u1Qu>|XS`Fjnsk(=P;@(WHniRM0sZ~?Mt0YP1>E8^0_N-4onbc!>_l<|X zR^ch;jC1-YpZs~ll4ZG8J!6;knw^~P{66s@5BKnB0@-yekLv1#{1h*Zu+j^MiVA#9O$9-omo|68iVCqCmqv(ug z-oTU2vKeeV@3xj))K+em@i(7%RMk(-kHP!oEwww5hyHu$3fFe-icxFs_= 3 && bucketName.length <= 63 && - strictBucketName.test(bucketName) && !isIpAddress.test(bucketName); - }, - - /** Reset all fields from My MinIO credentials input modal */ - clearModal: function() { - var self = this; - self.message(''); - self.messageClass('text-info'); - self.secretKey(null); - self.accessKey(null); - }, - - createBucket: function(self, bucketName) { - $osf.block(); - bucketName = bucketName.toLowerCase(); - return $osf.postJSON( - self.urls().createBucket, {bucket_name: bucketName} - ).done(function(response) { - $osf.unblock(); - self.loadedFolders(false); - self.activatePicker(); - var msg = 'Successfully created bucket "' + $osf.htmlEscape(bucketName) + '". You can now select it from the list.'; - var msgType = 'text-success'; - self.changeMessage(msg, msgType, null, true); - }).fail(function(xhr) { - var resp = JSON.parse(xhr.responseText); - var message = resp.message; - var title = resp.title || 'Problem creating bucket'; - $osf.unblock(); - if (!message) { - message = 'Looks like that name is taken. Try another name?'; - } - bootbox.confirm({ - title: $osf.htmlEscape(title), - message: $osf.htmlEscape(message), - callback: function(result) { - if (result) { - self.openCreateBucket(); - } - }, - buttons:{ - confirm:{ - label:'Try again' - } - } - }); - }); - }, - - openCreateBucket: function() { - var self = this; - - bootbox.dialog({ - title: 'Create a new bucket', - message: - '

', - buttons: { - cancel: { - label: 'Cancel', - className: 'btn-default' - }, - confirm: { - label: 'Create', - className: 'btn-success', - callback: function () { - var bucketName = $('#bucketName').val(); - - if (!bucketName) { - var errorMessage = $('#bucketModalErrorMessage'); - errorMessage.text('Bucket name cannot be empty'); - errorMessage[0].classList.add('text-danger'); - return false; - } else if (!self.isValidBucketName(bucketName, false)) { - bootbox.confirm({ - title: 'Invalid bucket name', - message: 'My MinIO buckets can contain lowercase letters, numbers, and hyphens separated by' + - ' periods. Please try another name.', - callback: function (result) { - if (result) { - self.openCreateBucket(); - } - }, - buttons: { - confirm: { - label: 'Try again' - } - } - }); - } else { - self.createBucket(self, bucketName); - } - } - } - } - }); - } -}); - -// Public API -function MyMinIONodeConfig(addonName, selector, url, folderPicker, opts, tbOpts) { - var self = this; - self.url = url; - self.folderPicker = folderPicker; - opts = opts || {}; - tbOpts = tbOpts || {}; - self.viewModel = new MyMinIOFolderPickerViewModel(addonName, url, selector, folderPicker, opts, tbOpts); - self.viewModel.updateFromData(); - $osf.applyBindings(self.viewModel, selector); -} - -module.exports = { - MyMinIONodeConfig: MyMinIONodeConfig, - _MyNinIONodeConfigViewModel: MyMinIOFolderPickerViewModel -}; diff --git a/StorageAddon/osf.io/addon/static/myminioUserConfig.js b/StorageAddon/osf.io/addon/static/myminioUserConfig.js deleted file mode 100644 index 980d65f..0000000 --- a/StorageAddon/osf.io/addon/static/myminioUserConfig.js +++ /dev/null @@ -1,172 +0,0 @@ -/** -* Module that controls the My MinIO user settings. Includes Knockout view-model -* for syncing data. -*/ - -var ko = require('knockout'); -var $ = require('jquery'); -var Raven = require('raven-js'); -var bootbox = require('bootbox'); -require('js/osfToggleHeight'); - -var language = require('js/osfLanguage').Addons.myminio; -var osfHelpers = require('js/osfHelpers'); -var addonSettings = require('js/addonSettings'); -var ChangeMessageMixin = require('js/changeMessage'); - -var ExternalAccount = addonSettings.ExternalAccount; - -var $modal = $('#myminioInputCredentials'); - - -function ViewModel(url) { - var self = this; - - self.properName = 'My MinIO'; - self.accessKey = ko.observable(); - self.secretKey = ko.observable(); - self.account_url = '/api/v1/settings/myminio/accounts/'; - self.accounts = ko.observableArray(); - - ChangeMessageMixin.call(self); - - /** Reset all fields from My MinIO credentials input modal */ - self.clearModal = function() { - self.message(''); - self.messageClass('text-info'); - self.accessKey(null); - self.secretKey(null); - }; - /** Send POST request to authorize My MinIO */ - self.connectAccount = function() { - // Selection should not be empty - if( !self.accessKey() && !self.secretKey() ){ - self.changeMessage('Please enter both an API access key and secret key.', 'text-danger'); - return; - } - - if (!self.accessKey() ){ - self.changeMessage('Please enter an API access key.', 'text-danger'); - return; - } - - if (!self.secretKey() ){ - self.changeMessage('Please enter an API secret key.', 'text-danger'); - return; - } - return osfHelpers.postJSON( - self.account_url, - ko.toJS({ - access_key: self.accessKey, - secret_key: self.secretKey, - }) - ).done(function() { - self.clearModal(); - $modal.modal('hide'); - self.updateAccounts(); - - }).fail(function(xhr, textStatus, error) { - var errorMessage = (xhr.status === 400 && xhr.responseJSON.message !== undefined) ? xhr.responseJSON.message : language.authError; - self.changeMessage(errorMessage, 'text-danger'); - Raven.captureMessage('Could not authenticate with My MinIO', { - extra: { - url: self.account_url, - textStatus: textStatus, - error: error - } - }); - }); - }; - - self.updateAccounts = function() { - return $.ajax({ - url: url, - type: 'GET', - dataType: 'json' - }).done(function (data) { - self.accounts($.map(data.accounts, function(account) { - var externalAccount = new ExternalAccount(account); - externalAccount.accessKey = account.oauth_key; - externalAccount.secretKey = account.oauth_secret; - return externalAccount; - })); - $('#myminio-header').osfToggleHeight({height: 160}); - }).fail(function(xhr, status, error) { - self.changeMessage(language.userSettingsError, 'text-danger'); - Raven.captureMessage('Error while updating addon account', { - extra: { - url: url, - status: status, - error: error - } - }); - }); - }; - - self.askDisconnect = function(account) { - var self = this; - bootbox.confirm({ - title: 'Disconnect My MinIO Account?', - message: '

' + - 'Are you sure you want to disconnect the My MinIO account ' + - osfHelpers.htmlEscape(account.name) + '? This will revoke access to My MinIO for all projects associated with this account.' + - '

', - callback: function (confirm) { - if (confirm) { - self.disconnectAccount(account); - } - }, - buttons:{ - confirm:{ - label:'Disconnect', - className:'btn-danger' - } - } - }); - }; - - self.disconnectAccount = function(account) { - var self = this; - var url = '/api/v1/oauth/accounts/' + account.id + '/'; - var request = $.ajax({ - url: url, - type: 'DELETE' - }); - request.done(function(data) { - self.updateAccounts(); - }); - request.fail(function(xhr, status, error) { - Raven.captureMessage('Error while removing addon authorization for ' + account.id, { - extra: { - url: url, - status: status, - error: error - } - }); - }); - return request; - }; - - self.selectionChanged = function() { - self.changeMessage('',''); - }; - - self.updateAccounts(); -} - -$.extend(ViewModel.prototype, ChangeMessageMixin.prototype); - -function MyMinIOUserConfig(selector, url) { - // Initialization code - var self = this; - self.selector = selector; - self.url = url; - // On success, instantiate and bind the ViewModel - self.viewModel = new ViewModel(url); - osfHelpers.applyBindings(self.viewModel, self.selector); -} - -module.exports = { - MyMinIOViewModel: ViewModel, - MyMinIOUserConfig: MyMinIOUserConfig -}; diff --git a/StorageAddon/osf.io/addon/static/node-cfg.js b/StorageAddon/osf.io/addon/static/node-cfg.js deleted file mode 100644 index 218df4d..0000000 --- a/StorageAddon/osf.io/addon/static/node-cfg.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; - -var MyMinIONodeConfig = require('./myminioNodeConfig.js').MyMinIONodeConfig; -var url = window.contextVars.node.urls.api + 'myminio/settings/'; -new MyMinIONodeConfig('My MinIO', '#myminioScope', url, '#myminioGrid'); diff --git a/StorageAddon/osf.io/addon/static/user-cfg.js b/StorageAddon/osf.io/addon/static/user-cfg.js deleted file mode 100644 index a21fee0..0000000 --- a/StorageAddon/osf.io/addon/static/user-cfg.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; - -var MyMinIOUserConfig = require('./myminioUserConfig.js').MyMinIOUserConfig; -var url = '/api/v1/settings/myminio/accounts/'; -new MyMinIOUserConfig('#myminioAddonScope', url); diff --git a/StorageAddon/osf.io/addon/templates/credentials_modal.mako b/StorageAddon/osf.io/addon/templates/credentials_modal.mako deleted file mode 100644 index a2892a5..0000000 --- a/StorageAddon/osf.io/addon/templates/credentials_modal.mako +++ /dev/null @@ -1,47 +0,0 @@ -
diff --git a/StorageAddon/osf.io/addon/templates/node_settings.mako b/StorageAddon/osf.io/addon/templates/node_settings.mako deleted file mode 100644 index d10f294..0000000 --- a/StorageAddon/osf.io/addon/templates/node_settings.mako +++ /dev/null @@ -1,93 +0,0 @@ -
- - - <%include file="credentials_modal.mako"/> - -

- - ${addon_full_name} - - - authorized by - % if not is_registration: - ${_("Disconnect Account")} - % endif - - - - - - ${_("Import Account from Profile")} - - - - - -

- ${_("Loading ...")} -

-
- - - - - ${_("Connect Account")} - - -
-

- -
-
-
-

- ${_("Current Bucket:")} - - - - - ${_("None")} - -

- -
- - -
- -
-

- Loading buckets...

-
-
-
- -
-
-
-
- ${_("Connect %(folderName)s?") % dict(folderName='') | n} -
-
-
- - -
-
-
-
-
- -
- -
- -
-

-
-
diff --git a/StorageAddon/osf.io/addon/templates/user_settings.mako b/StorageAddon/osf.io/addon/templates/user_settings.mako deleted file mode 100644 index 49a00ca..0000000 --- a/StorageAddon/osf.io/addon/templates/user_settings.mako +++ /dev/null @@ -1,46 +0,0 @@ - -
- - <%include file="credentials_modal.mako"/> - -

- - - - ${_("Connect or Reauthorize Account")} - -

- -
- - ${_("Disconnect Account")} - -
- - - - - - - - - - - - - - -
- - ${_("Private project")} - - - - -
-
- -
-
diff --git a/StorageAddon/osf.io/addon/tests/__init__.py b/StorageAddon/osf.io/addon/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/StorageAddon/osf.io/addon/tests/conftest.py b/StorageAddon/osf.io/addon/tests/conftest.py deleted file mode 100644 index da9f243..0000000 --- a/StorageAddon/osf.io/addon/tests/conftest.py +++ /dev/null @@ -1 +0,0 @@ -from osf_tests.conftest import * # noqa diff --git a/StorageAddon/osf.io/addon/tests/factories.py b/StorageAddon/osf.io/addon/tests/factories.py deleted file mode 100644 index 4a90ea0..0000000 --- a/StorageAddon/osf.io/addon/tests/factories.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- -"""Factories for the My MinIO addon.""" -import factory -from factory.django import DjangoModelFactory - -from addons.myminio import SHORT_NAME -from addons.myminio.models import ( - UserSettings, - NodeSettings -) -from osf_tests.factories import UserFactory, ProjectFactory, ExternalAccountFactory - - -class MyMinIOAccountFactory(ExternalAccountFactory): - provider = SHORT_NAME - provider_id = factory.Sequence(lambda n: 'id-{0}'.format(n)) - oauth_key = factory.Sequence(lambda n: 'key-{0}'.format(n)) - oauth_secret = factory.Sequence(lambda n: 'secret-{0}'.format(n)) - display_name = 'My MinIO Fake User' - - -class MyMinIOUserSettingsFactory(DjangoModelFactory): - class Meta: - model = UserSettings - - owner = factory.SubFactory(UserFactory) - - -class MyMinIONodeSettingsFactory(DjangoModelFactory): - class Meta: - model = NodeSettings - - owner = factory.SubFactory(ProjectFactory) - user_settings = factory.SubFactory(MyMinIOUserSettingsFactory) diff --git a/StorageAddon/osf.io/addon/tests/test_model.py b/StorageAddon/osf.io/addon/tests/test_model.py deleted file mode 100644 index b32e4f2..0000000 --- a/StorageAddon/osf.io/addon/tests/test_model.py +++ /dev/null @@ -1,104 +0,0 @@ -# from nose.tools import * # noqa -import unittest - -import mock -import pytest -from nose.tools import (assert_false, assert_true, - assert_equal, assert_is_none) - -from addons.base.tests.models import ( - OAuthAddonNodeSettingsTestSuiteMixin, - OAuthAddonUserSettingTestSuiteMixin -) -from addons.myminio import SHORT_NAME, FULL_NAME -from addons.myminio import settings -from addons.myminio.models import NodeSettings -from addons.myminio.tests.factories import ( - MyMinIOUserSettingsFactory, - MyMinIONodeSettingsFactory, - MyMinIOAccountFactory -) -from framework.auth import Auth -from osf_tests.factories import ProjectFactory, DraftRegistrationFactory -from tests.base import get_default_metaschema - -pytestmark = pytest.mark.django_db - - -class TestUserSettings(OAuthAddonUserSettingTestSuiteMixin, unittest.TestCase): - - short_name = SHORT_NAME - full_name = FULL_NAME - ExternalAccountFactory = MyMinIOAccountFactory - - -class TestNodeSettings(OAuthAddonNodeSettingsTestSuiteMixin, unittest.TestCase): - - short_name = SHORT_NAME - full_name = FULL_NAME - ExternalAccountFactory = MyMinIOAccountFactory - NodeSettingsFactory = MyMinIONodeSettingsFactory - NodeSettingsClass = NodeSettings - UserSettingsFactory = MyMinIOUserSettingsFactory - - def test_registration_settings(self): - registration = ProjectFactory() - clone, message = self.node_settings.after_register( - self.node, registration, self.user, - ) - assert_is_none(clone) - - def test_before_register_no_settings(self): - self.node_settings.user_settings = None - message = self.node_settings.before_register(self.node, self.user) - assert_false(message) - - def test_before_register_no_auth(self): - self.node_settings.external_account = None - message = self.node_settings.before_register(self.node, self.user) - assert_false(message) - - def test_before_register_settings_and_auth(self): - message = self.node_settings.before_register(self.node, self.user) - assert_true(message) - - @mock.patch('website.archiver.tasks.archive') - def test_does_not_get_copied_to_registrations(self, mock_archive): - registration = self.node.register_node( - schema=get_default_metaschema(), - auth=Auth(user=self.user), - draft_registration=DraftRegistrationFactory(branched_from=self.node), - ) - assert_false(registration.has_addon(SHORT_NAME)) - - ## Overrides ## - - def test_serialize_credentials(self): - self.user_settings.external_accounts[0].provider_id = 'user-11' - self.user_settings.external_accounts[0].oauth_key = 'key-11' - self.user_settings.external_accounts[0].oauth_secret = 'secret-15' - self.user_settings.save() - credentials = self.node_settings.serialize_waterbutler_credentials() - - expected = {'host': settings.HOST, - 'access_key': self.node_settings.external_account.oauth_key, - 'secret_key': self.node_settings.external_account.oauth_secret} - assert_equal(credentials, expected) - - @mock.patch('addons.myminio.models.bucket_exists') - def test_set_folder(self, mock_exists): - mock_exists.return_value = True - folder_id = '1234567890' - self.node_settings.set_folder(folder_id, auth=Auth(self.user)) - self.node_settings.save() - # Bucket was set - assert_equal(self.node_settings.folder_id, folder_id) - assert_equal(self.node_settings.folder_name, folder_id) - # Log was saved - last_log = self.node.logs.latest() - assert_equal(last_log.action, '{0}_bucket_linked'.format(self.short_name)) - - def test_serialize_settings(self): - settings = self.node_settings.serialize_waterbutler_settings() - expected = {'bucket': self.node_settings.folder_id} - assert_equal(settings, expected) diff --git a/StorageAddon/osf.io/addon/tests/test_serializer.py b/StorageAddon/osf.io/addon/tests/test_serializer.py deleted file mode 100644 index 4fca7b0..0000000 --- a/StorageAddon/osf.io/addon/tests/test_serializer.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- -"""Serializer tests for the My MinIO addon.""" -import mock -import pytest - -from addons.base.tests.serializers import StorageAddonSerializerTestSuiteMixin -from addons.myminio.tests.factories import MyMinIOAccountFactory -from addons.myminio.serializer import MyMinIOSerializer - -from tests.base import OsfTestCase - -pytestmark = pytest.mark.django_db - -class TestMyMinIOSerializer(StorageAddonSerializerTestSuiteMixin, OsfTestCase): - addon_short_name = 'myminio' - Serializer = MyMinIOSerializer - ExternalAccountFactory = MyMinIOAccountFactory - client = None - - def set_provider_id(self, pid): - self.node_settings.folder_id = pid - - def setUp(self): - self.mock_can_list = mock.patch('addons.myminio.serializer.utils.can_list') - self.mock_can_list.return_value = True - self.mock_can_list.start() - super(TestMyMinIOSerializer, self).setUp() - - def tearDown(self): - self.mock_can_list.stop() - super(TestMyMinIOSerializer, self).tearDown() diff --git a/StorageAddon/osf.io/addon/tests/test_view.py b/StorageAddon/osf.io/addon/tests/test_view.py deleted file mode 100644 index 275acb2..0000000 --- a/StorageAddon/osf.io/addon/tests/test_view.py +++ /dev/null @@ -1,278 +0,0 @@ -# -*- coding: utf-8 -*- -from rest_framework import status as http_status - -from boto.exception import S3ResponseError -import mock -from nose.tools import (assert_equal, assert_equals, - assert_true, assert_in, assert_false) -import pytest - -from framework.auth import Auth -from tests.base import OsfTestCase, get_default_metaschema -from osf_tests.factories import ProjectFactory, AuthUserFactory, DraftRegistrationFactory, InstitutionFactory - -from addons.base.tests.views import ( - OAuthAddonConfigViewsTestCaseMixin -) -from addons.myminio.tests.utils import MyMinIOAddonTestCase -from addons.myminio.utils import validate_bucket_name -import addons.myminio.settings as myminio_settings -from website.util import api_url_for -from admin.rdm_addons.utils import get_rdm_addon_option - -pytestmark = pytest.mark.django_db - -class TestMyMinIOViews(MyMinIOAddonTestCase, OAuthAddonConfigViewsTestCaseMixin, OsfTestCase): - def setUp(self): - self.mock_can_list = mock.patch('addons.myminio.views.utils.can_list') - self.mock_can_list.return_value = True - self.mock_can_list.start() - self.mock_uid = mock.patch('addons.myminio.views.utils.get_user_info') - self.mock_uid.return_value = {'id': '1234567890', 'display_name': 'myminio.user'} - self.mock_uid.start() - self.mock_exists = mock.patch('addons.myminio.views.utils.bucket_exists') - self.mock_exists.return_value = True - self.mock_exists.start() - super(TestMyMinIOViews, self).setUp() - - def tearDown(self): - self.mock_can_list.stop() - self.mock_uid.stop() - self.mock_exists.stop() - super(TestMyMinIOViews, self).tearDown() - - def test_myminio_settings_input_empty_keys(self): - url = self.project.api_url_for('myminio_add_user_account') - rv = self.app.post_json(url, { - 'access_key': '', - 'secret_key': '' - }, auth=self.user.auth, expect_errors=True) - assert_equals(rv.status_int, http_status.HTTP_400_BAD_REQUEST) - assert_in('All the fields above are required.', rv.body.decode()) - - def test_myminio_settings_input_empty_access_key(self): - url = self.project.api_url_for('myminio_add_user_account') - rv = self.app.post_json(url, { - 'access_key': '', - 'secret_key': 'Non-empty-secret-key' - }, auth=self.user.auth, expect_errors=True) - assert_equals(rv.status_int, http_status.HTTP_400_BAD_REQUEST) - assert_in('All the fields above are required.', rv.body.decode()) - - def test_myminio_settings_input_empty_secret_key(self): - url = self.project.api_url_for('myminio_add_user_account') - rv = self.app.post_json(url, { - 'access_key': 'Non-empty-access-key', - 'secret_key': '' - }, auth=self.user.auth, expect_errors=True) - assert_equals(rv.status_int, http_status.HTTP_400_BAD_REQUEST) - assert_in('All the fields above are required.', rv.body.decode()) - - def test_myminio_settings_rdm_addons_denied(self): - institution = InstitutionFactory() - self.user.affiliated_institutions.add(institution) - self.user.save() - rdm_addon_option = get_rdm_addon_option(institution.id, self.ADDON_SHORT_NAME) - rdm_addon_option.is_allowed = False - rdm_addon_option.save() - url = self.project.api_url_for('myminio_add_user_account') - rv = self.app.post_json(url,{ - 'access_key': 'aldkjf', - 'secret_key': 'las' - }, auth=self.user.auth, expect_errors=True) - assert_equal(rv.status_int, http_status.HTTP_403_FORBIDDEN) - assert_in('You are prohibited from using this add-on.', rv.body.decode()) - - def test_myminio_set_bucket_no_settings(self): - user = AuthUserFactory() - self.project.add_contributor(user, save=True) - url = self.project.api_url_for('myminio_set_config') - res = self.app.put_json( - url, {'myminio_bucket': 'hammertofall'}, auth=user.auth, - expect_errors=True - ) - assert_equal(res.status_code, http_status.HTTP_400_BAD_REQUEST) - - def test_myminio_set_bucket_no_auth(self): - - user = AuthUserFactory() - user.add_addon('myminio') - self.project.add_contributor(user, save=True) - url = self.project.api_url_for('myminio_set_config') - res = self.app.put_json( - url, {'myminio_bucket': 'hammertofall'}, auth=user.auth, - expect_errors=True - ) - assert_equal(res.status_code, http_status.HTTP_403_FORBIDDEN) - - def test_myminio_set_bucket_registered(self): - registration = self.project.register_node( - get_default_metaschema(), Auth(self.user), - DraftRegistrationFactory(branched_from=self.project), '' - ) - - url = registration.api_url_for('myminio_set_config') - res = self.app.put_json( - url, {'myminio_bucket': 'hammertofall'}, auth=self.user.auth, - expect_errors=True, - ) - - assert_equal(res.status_code, http_status.HTTP_400_BAD_REQUEST) - - @mock.patch('addons.myminio.views.utils.can_list', return_value=False) - def test_user_settings_cant_list(self, mock_can_list): - url = api_url_for('myminio_add_user_account') - rv = self.app.post_json(url, { - 'access_key': 'aldkjf', - 'secret_key': 'las' - }, auth=self.user.auth, expect_errors=True) - - assert_in('Unable to list buckets.', rv.body.decode()) - assert_equals(rv.status_int, http_status.HTTP_400_BAD_REQUEST) - - def test_myminio_remove_node_settings_owner(self): - url = self.node_settings.owner.api_url_for('myminio_deauthorize_node') - self.app.delete(url, auth=self.user.auth) - result = self.Serializer().serialize_settings(node_settings=self.node_settings, current_user=self.user) - assert_equal(result['nodeHasAuth'], False) - - def test_myminio_remove_node_settings_unauthorized(self): - url = self.node_settings.owner.api_url_for('myminio_deauthorize_node') - ret = self.app.delete(url, auth=None, expect_errors=True) - - assert_equal(ret.status_code, 401) - - def test_myminio_get_node_settings_owner(self): - self.node_settings.set_auth(self.external_account, self.user) - self.node_settings.folder_id = 'bucket' - self.node_settings.save() - url = self.node_settings.owner.api_url_for('myminio_get_config') - res = self.app.get(url, auth=self.user.auth) - - result = res.json['result'] - assert_equal(result['nodeHasAuth'], True) - assert_equal(result['userIsOwner'], True) - assert_equal(result['folder']['path'], self.node_settings.folder_id) - - def test_myminio_get_node_settings_unauthorized(self): - url = self.node_settings.owner.api_url_for('myminio_get_config') - unauthorized = AuthUserFactory() - ret = self.app.get(url, auth=unauthorized.auth, expect_errors=True) - - assert_equal(ret.status_code, 403) - - ## Overrides ## - - @mock.patch('addons.myminio.models.get_bucket_names') - def test_folder_list(self, mock_names): - mock_names.return_value = ['bucket1', 'bucket2'] - super(TestMyMinIOViews, self).test_folder_list() - - @mock.patch('addons.myminio.models.bucket_exists') - def test_set_config(self, mock_exists): - mock_exists.return_value = True - self.node_settings.set_auth(self.external_account, self.user) - url = self.project.api_url_for('{0}_set_config'.format(self.ADDON_SHORT_NAME)) - res = self.app.put_json(url, { - 'selected': self.folder - }, auth=self.user.auth) - assert_equal(res.status_code, http_status.HTTP_200_OK) - self.project.reload() - self.node_settings.reload() - assert_equal( - self.project.logs.latest().action, - '{0}_bucket_linked'.format(self.ADDON_SHORT_NAME) - ) - assert_equal(res.json['result']['folder']['name'], self.node_settings.folder_name) - - -class TestCreateBucket(MyMinIOAddonTestCase, OsfTestCase): - - def setUp(self): - - super(TestCreateBucket, self).setUp() - - self.user = AuthUserFactory() - self.consolidated_auth = Auth(user=self.user) - self.auth = self.user.auth - self.project = ProjectFactory(creator=self.user) - - self.project.add_addon('myminio', auth=self.consolidated_auth) - self.project.creator.add_addon('myminio') - - self.user_settings = self.user.get_addon('myminio') - self.user_settings.access_key = 'We-Will-Rock-You' - self.user_settings.secret_key = 'Idontknowanyqueensongs' - self.user_settings.save() - - self.node_settings = self.project.get_addon('myminio') - self.node_settings.bucket = 'Sheer-Heart-Attack' - self.node_settings.user_settings = self.project.creator.get_addon('myminio') - - self.node_settings.save() - - def test_bad_names(self): - assert_false(validate_bucket_name('')) - assert_false(validate_bucket_name('no')) - assert_false(validate_bucket_name('a' * 64)) - assert_false(validate_bucket_name(' leadingspace')) - assert_false(validate_bucket_name('trailingspace ')) - assert_false(validate_bucket_name('bogus naMe')) - assert_false(validate_bucket_name('.cantstartwithp')) - assert_false(validate_bucket_name('or.endwith.')) - assert_false(validate_bucket_name('..nodoubles')) - assert_false(validate_bucket_name('no_unders_in')) - assert_false(validate_bucket_name('-leadinghyphen')) - assert_false(validate_bucket_name('trailinghyphen-')) - assert_false(validate_bucket_name('Mixedcase')) - assert_false(validate_bucket_name('empty..label')) - assert_false(validate_bucket_name('label-.trailinghyphen')) - assert_false(validate_bucket_name('label.-leadinghyphen')) - assert_false(validate_bucket_name('8.8.8.8')) - assert_false(validate_bucket_name('600.9000.0.28')) - assert_false(validate_bucket_name('no_underscore')) - assert_false(validate_bucket_name('_nounderscoreinfront')) - assert_false(validate_bucket_name('no-underscore-in-back_')) - assert_false(validate_bucket_name('no-underscore-in_the_middle_either')) - - def test_names(self): - assert_true(validate_bucket_name('imagoodname')) - assert_true(validate_bucket_name('still.passing')) - assert_true(validate_bucket_name('can-have-dashes')) - assert_true(validate_bucket_name('kinda.name.spaced')) - assert_true(validate_bucket_name('a-o.valid')) - assert_true(validate_bucket_name('11.12.m')) - assert_true(validate_bucket_name('a--------a')) - assert_true(validate_bucket_name('a' * 63)) - - @mock.patch('addons.myminio.views.utils.create_bucket') - @mock.patch('addons.myminio.views.utils.get_bucket_names') - def test_create_bucket_pass(self, mock_names, mock_make): - mock_make.return_value = True - mock_names.return_value = [ - 'butintheend', - 'it', - 'doesntevenmatter' - ] - url = self.project.api_url_for('myminio_create_bucket') - ret = self.app.post_json( - url, - { - 'bucket_name': 'doesntevenmatter' - }, - auth=self.user.auth - ) - - assert_equal(ret.status_int, http_status.HTTP_200_OK) - assert_equal(ret.json, {}) - - @mock.patch('addons.myminio.views.utils.create_bucket') - def test_create_bucket_fail(self, mock_make): - error = S3ResponseError(418, 'because Im a test') - error.message = 'This should work' - mock_make.side_effect = error - - url = '/api/v1/project/{0}/myminio/newbucket/'.format(self.project._id) - ret = self.app.post_json(url, {'bucket_name': 'doesntevenmatter'}, auth=self.user.auth, expect_errors=True) - - assert_equals(ret.body.decode(), '{"message": "This should work", "title": "Problem connecting to My MinIO"}') diff --git a/StorageAddon/osf.io/addon/tests/utils.py b/StorageAddon/osf.io/addon/tests/utils.py deleted file mode 100644 index e9bbb16..0000000 --- a/StorageAddon/osf.io/addon/tests/utils.py +++ /dev/null @@ -1,51 +0,0 @@ -# -*- coding: utf-8 -*- -from nose.tools import (assert_equals, assert_true, assert_false) - -from addons.base.tests.base import OAuthAddonTestCaseMixin, AddonTestCase -from addons.myminio.tests.factories import MyMinIOAccountFactory -from addons.myminio.provider import MyMinIOProvider -from addons.myminio.serializer import MyMinIOSerializer -from addons.myminio import utils - -class MyMinIOAddonTestCase(OAuthAddonTestCaseMixin, AddonTestCase): - - ADDON_SHORT_NAME = 'myminio' - ExternalAccountFactory = MyMinIOAccountFactory - Provider = MyMinIOProvider - Serializer = MyMinIOSerializer - client = None - folder = { - 'path': 'bucket', - 'name': 'bucket', - 'id': 'bucket' - } - - def test_https(self): - connection = utils.connect_myminio(host='securehost', - access_key='a', - secret_key='s') - assert_true(connection.is_secure) - assert_equals(connection.host, 'securehost') - assert_equals(connection.port, 443) - - connection = utils.connect_myminio(host='securehost:443', - access_key='a', - secret_key='s') - assert_true(connection.is_secure) - assert_equals(connection.host, 'securehost') - assert_equals(connection.port, 443) - - def test_http(self): - connection = utils.connect_myminio(host='normalhost:80', - access_key='a', - secret_key='s') - assert_false(connection.is_secure) - assert_equals(connection.host, 'normalhost') - assert_equals(connection.port, 80) - - connection = utils.connect_myminio(host='normalhost:8080', - access_key='a', - secret_key='s') - assert_false(connection.is_secure) - assert_equals(connection.host, 'normalhost') - assert_equals(connection.port, 8080) diff --git a/StorageAddon/osf.io/addon/utils.py b/StorageAddon/osf.io/addon/utils.py deleted file mode 100644 index 6dad380..0000000 --- a/StorageAddon/osf.io/addon/utils.py +++ /dev/null @@ -1,131 +0,0 @@ -import re - -from boto import exception -from boto.s3.bucket import Bucket -from boto.s3.connection import S3Connection, OrdinaryCallingFormat, NoHostProvided -from rest_framework import status as http_status - -import addons.myminio.settings as settings -from framework.exceptions import HTTPError - - -class MyMinIOConnection(S3Connection): - def __init__(self, aws_access_key_id=None, aws_secret_access_key=None, - is_secure=True, port=None, proxy=None, proxy_port=None, - proxy_user=None, proxy_pass=None, - host=NoHostProvided, debug=0, https_connection_factory=None, - calling_format=None, path='/', - provider='aws', bucket_class=Bucket, security_token=None, - suppress_consec_slashes=True, anon=False, - validate_certs=None, profile_name=None): - super(MyMinIOConnection, self).__init__(aws_access_key_id, - aws_secret_access_key, - is_secure, port, proxy, proxy_port, proxy_user, proxy_pass, - host=host, - debug=debug, https_connection_factory=https_connection_factory, - calling_format=calling_format, - path=path, provider=provider, bucket_class=bucket_class, - security_token=security_token, anon=anon, - validate_certs=validate_certs, profile_name=profile_name) - - def _required_auth_capability(self): - return ['s3'] - - -def connect_myminio(host=None, access_key=None, secret_key=None, node_settings=None): - """Helper to build an MyMinIOConnection object - """ - if host is None: - host = settings.HOST - if node_settings is not None and node_settings.external_account is not None: - access_key = node_settings.external_account.oauth_key - secret_key = node_settings.external_account.oauth_secret - port = 443 - m = re.match(r'^(.+)\:([0-9]+)$', host) - if m is not None: - host = m.group(1) - port = int(m.group(2)) - return MyMinIOConnection(access_key, secret_key, - calling_format=OrdinaryCallingFormat(), - host=host, - port=port, - is_secure=port == 443) - - -def get_bucket_names(node_settings): - try: - buckets = connect_myminio(node_settings=node_settings).get_all_buckets() - except exception.NoAuthHandlerFound: - raise HTTPError(http_status.HTTP_403_FORBIDDEN) - except exception.BotoServerError as e: - raise HTTPError(e.status) - - return [bucket.name for bucket in buckets] - - -def validate_bucket_name(name): - """Make sure the bucket name conforms to Amazon's expectations as described at: - http://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html#bucketnamingrules - The laxer rules for US East (N. Virginia) are not supported. - """ - label = r'[a-z0-9]+(?:[a-z0-9\-]*[a-z0-9])?' - validate_name = re.compile('^' + label + '(?:\\.' + label + ')*$') - is_ip_address = re.compile(r'^[0-9]+(?:\.[0-9]+){3}$') - return ( - len(name) >= 3 and len(name) <= 63 and bool(validate_name.match(name)) and not bool(is_ip_address.match(name)) - ) - - -def create_bucket(node_settings, bucket_name): - return connect_myminio(node_settings=node_settings).create_bucket(bucket_name) - - -def bucket_exists(host, access_key, secret_key, bucket_name): - """Tests for the existance of a bucket and if the user - can access it with the given keys - """ - if not bucket_name: - return False - - connection = connect_myminio(host, access_key, secret_key) - - if bucket_name != bucket_name.lower(): - # Must use ordinary calling format for mIxEdCaSe bucket names - # otherwise use the default as it handles bucket outside of the US - connection.calling_format = OrdinaryCallingFormat() - - try: - # Will raise an exception if bucket_name doesn't exist - connect_myminio(host, access_key, secret_key).head_bucket(bucket_name) - except exception.S3ResponseError as e: - if e.status not in (301, 302): - return False - return True - - -def can_list(host, access_key, secret_key): - """Return whether or not a user can list - all buckets accessable by this keys - """ - # Bail out early as boto does not handle getting - # Called with (None, None) - if not (host and access_key and secret_key): - return False - - try: - connect_myminio(host, access_key, secret_key).get_all_buckets() - except exception.S3ResponseError: - return False - return True - - -def get_user_info(host, access_key, secret_key): - """Returns an My MinIO User with .display_name and .id, or None - """ - if not (access_key and secret_key): - return None - - try: - return connect_myminio(host, access_key, secret_key).get_all_buckets().owner - except exception.S3ResponseError: - return None diff --git a/StorageAddon/osf.io/addon/views.py b/StorageAddon/osf.io/addon/views.py deleted file mode 100644 index 66afaee..0000000 --- a/StorageAddon/osf.io/addon/views.py +++ /dev/null @@ -1,152 +0,0 @@ -from boto import exception -from django.core.exceptions import ValidationError -from flask import request -from rest_framework import status as http_status - -import addons.myminio.settings as settings -from addons.base import generic_views -from addons.myminio import SHORT_NAME, FULL_NAME -from addons.myminio import utils -from addons.myminio.serializer import MyMinIOSerializer -from admin.rdm_addons.decorators import must_be_rdm_addons_allowed -from framework.auth.decorators import must_be_logged_in -from framework.exceptions import HTTPError -from osf.models import ExternalAccount -from website.project.decorators import ( - must_have_addon, must_have_permission, - must_be_addon_authorizer, -) - -myminio_account_list = generic_views.account_list( - SHORT_NAME, - MyMinIOSerializer -) - -myminio_import_auth = generic_views.import_auth( - SHORT_NAME, - MyMinIOSerializer -) - -myminio_deauthorize_node = generic_views.deauthorize_node( - SHORT_NAME -) - -myminio_get_config = generic_views.get_config( - SHORT_NAME, - MyMinIOSerializer -) - -def _set_folder(node_addon, folder, auth): - folder_id = folder['id'] - node_addon.set_folder(folder_id, auth=auth) - node_addon.save() - -myminio_set_config = generic_views.set_config( - SHORT_NAME, - FULL_NAME, - MyMinIOSerializer, - _set_folder -) - -@must_have_addon(SHORT_NAME, 'node') -@must_be_addon_authorizer(SHORT_NAME) -def myminio_folder_list(node_addon, **kwargs): - """ Returns all the subsequent folders under the folder id passed. - """ - return node_addon.get_folders() - -@must_be_logged_in -@must_be_rdm_addons_allowed(SHORT_NAME) -def myminio_add_user_account(auth, **kwargs): - """Verifies new external account credentials and adds to user's list""" - host = settings.HOST - try: - access_key = request.json['access_key'] - secret_key = request.json['secret_key'] - except KeyError: - raise HTTPError(http_status.HTTP_400_BAD_REQUEST) - - if not (access_key and secret_key): - return { - 'message': 'All the fields above are required.' - }, http_status.HTTP_400_BAD_REQUEST - - user_info = utils.get_user_info(host, access_key, secret_key) - if not user_info: - return { - 'message': ('Unable to access account.\n' - 'Check to make sure that the above credentials are valid, ' - 'and that they have permission to list buckets.') - }, http_status.HTTP_400_BAD_REQUEST - - if not utils.can_list(host, access_key, secret_key): - return { - 'message': ('Unable to list buckets.\n' - 'Listing buckets is required permission that can be changed via IAM') - }, http_status.HTTP_400_BAD_REQUEST - - try: - account = ExternalAccount( - provider=SHORT_NAME, - provider_name=FULL_NAME, - oauth_key=access_key, - oauth_secret=secret_key, - provider_id=user_info.id, - display_name=user_info.display_name, - ) - account.save() - except ValidationError: - # ... or get the old one - account = ExternalAccount.objects.get( - provider=SHORT_NAME, - provider_id=user_info.id - ) - if account.oauth_key != access_key or account.oauth_secret != secret_key: - account.oauth_key = access_key - account.oauth_secret = secret_key - account.save() - assert account is not None - - if not auth.user.external_accounts.filter(id=account.id).exists(): - auth.user.external_accounts.add(account) - - # Ensure My MinIO is enabled. - auth.user.get_or_add_addon('myminio', auth=auth) - auth.user.save() - - return {} - - -@must_be_addon_authorizer(SHORT_NAME) -@must_have_addon('myminio', 'node') -@must_have_permission('write') -def myminio_create_bucket(auth, node_addon, **kwargs): - bucket_name = request.json.get('bucket_name', '') - # bucket_location = request.json.get('bucket_location', '') - - if not utils.validate_bucket_name(bucket_name): - return { - 'message': 'That bucket name is not valid.', - 'title': 'Invalid bucket name', - }, http_status.HTTP_400_BAD_REQUEST - - try: - # utils.create_bucket(node_addon, bucket_name, bucket_location) - utils.create_bucket(node_addon, bucket_name) - except exception.S3ResponseError as e: - return { - 'message': e.message, - 'title': 'Problem connecting to My MinIO', - }, http_status.HTTP_400_BAD_REQUEST - except exception.S3CreateError as e: - return { - 'message': e.message, - 'title': "Problem creating bucket '{0}'".format(bucket_name), - }, http_status.HTTP_400_BAD_REQUEST - except exception.BotoClientError as e: # Base class catchall - return { - 'message': e.message, - 'title': 'Error connecting to My MinIO', - }, http_status.HTTP_400_BAD_REQUEST - - return {} diff --git a/StorageAddon/osf.io/config/Dockerfile b/StorageAddon/osf.io/config/Dockerfile deleted file mode 100644 index e914981..0000000 --- a/StorageAddon/osf.io/config/Dockerfile +++ /dev/null @@ -1,197 +0,0 @@ -FROM node:8-alpine3.9 - -ARG NODE_OPTIONS='--max-old-space-size=4096' - -# Source: https://github.com/docker-library/httpd/blob/7976cabe162268bd5ad2d233d61e340447bfc371/2.4/alpine/Dockerfile#L3 -RUN set -x \ - && addgroup -g 82 -S www-data \ - && adduser -h /var/www -u 82 -D -S -G www-data www-data - -RUN apk add --no-cache --virtual .run-deps \ - su-exec \ - bash \ - python3 \ - git \ - # lxml2 - libxml2 \ - libxslt \ - # psycopg2 - postgresql-libs \ - # cryptography - libffi \ - # gevent - libev \ - libevent \ - openblas-dev \ - && yarn global add bower - -WORKDIR /code - -COPY ./requirements.txt ./ -COPY ./requirements/ ./requirements/ -COPY ./addons/bitbucket/requirements.txt ./addons/bitbucket/ -COPY ./addons/box/requirements.txt ./addons/box/ -#COPY ./addons/citations/requirements.txt ./addons/citations/ -COPY ./addons/dataverse/requirements.txt ./addons/dataverse/ -COPY ./addons/dropbox/requirements.txt ./addons/dropbox/ -#COPY ./addons/dropboxbusiness/requirements.txt ./addons/dropboxbusiness/ -#COPY ./addons/figshare/requirements.txt ./addons/figshare/ -#COPY ./addons/forward/requirements.txt ./addons/forward/ -COPY ./addons/github/requirements.txt ./addons/github/ -COPY ./addons/gitlab/requirements.txt ./addons/gitlab/ -#COPY ./addons/googledrive/requirements.txt ./addons/googledrive/ -#COPY ./addons/iqbrims/requirements.txt ./addons/iqbrims/ -COPY ./addons/mendeley/requirements.txt ./addons/mendeley/ -COPY ./addons/onedrive/requirements.txt /code/addons/onedrive/ -#COPY ./addons/osfstorage/requirements.txt ./addons/osfstorage/ -COPY ./addons/owncloud/requirements.txt ./addons/owncloud/ -COPY ./addons/s3/requirements.txt ./addons/s3/ -COPY ./addons/twofactor/requirements.txt ./addons/twofactor/ -#COPY ./addons/wiki/requirements.txt ./addons/wiki/ -COPY ./addons/zotero/requirements.txt ./addons/zotero/ -COPY ./addons/swift/requirements.txt ./addons/swift/ -COPY ./addons/azureblobstorage/requirements.txt ./addons/azureblobstorage/ -COPY ./addons/weko/requirements.txt ./addons/weko/ -COPY ./addons/s3compat/requirements.txt ./addons/s3compat/ -COPY ./addons/nextcloud/requirements.txt ./addons/nextcloud/ -COPY ./addons/nextcloudinstitutions/requirements.txt ./addons/nextcloudinstitutions/ -COPY ./addons/myminio/requirements.txt ./addons/myminio/ - -RUN set -ex \ - && mkdir -p /var/www \ - && chown www-data:www-data /var/www \ - && apk add --no-cache --virtual .build-deps \ - build-base \ - linux-headers \ - python3-dev \ - # lxml2 - musl-dev \ - libxml2-dev \ - libxslt-dev \ - # psycopg2 - postgresql-dev \ - # cryptography - libffi-dev \ - libpng-dev \ - freetype-dev \ - jpeg-dev \ - && pip3 install Cython \ - && for reqs_file in \ - /code/requirements.txt \ - /code/requirements/release.txt \ - /code/addons/*/requirements.txt \ - ; do \ - pip3 install --no-cache-dir -c /code/requirements/constraints.txt -r "$reqs_file" \ - ; done \ - && (pip3 uninstall uritemplate.py --yes || true) \ - && pip3 install --no-cache-dir uritemplate.py==0.3.0 \ - # Fix: https://github.com/CenterForOpenScience/osf.io/pull/6783 - && python3 -m compileall /usr/lib/python3.6 || true \ - && apk del .build-deps - -# Settings -COPY ./tasks/ ./tasks/ -COPY ./website/settings/ ./website/settings/ -COPY ./api/base/settings/ ./api/base/settings/ -COPY ./website/__init__.py ./website/__init__.py -COPY ./addons.json ./addons.json -RUN mv ./website/settings/local-dist.py ./website/settings/local.py \ - && mv ./api/base/settings/local-dist.py ./api/base/settings/local.py \ - && sed 's/DEBUG_MODE = True/DEBUG_MODE = False/' -i ./website/settings/local.py - -# Bower Assets -COPY ./.bowerrc ./bower.json ./ -COPY ./admin/.bowerrc ./admin/bower.json ./admin/ -RUN \ - # OSF - bower install --production --allow-root \ - && bower cache clean --allow-root \ - # Admin - && cd ./admin \ - && bower install --production --allow-root \ - && bower cache clean --allow-root - -# Webpack Assets -# -## OSF -COPY ./package.json ./.yarnrc ./yarn.lock ./ -COPY ./webpack* ./ -COPY ./website/static/ ./website/static/ -COPY ./scripts/translations/ ./scripts/translations/ -COPY ./website/translations/ ./website/translations/ -COPY ./website/static/js/translations/ ./website/static/js/translations/ -## Admin -COPY ./admin/package.json ./admin/yarn.lock ./admin/ -COPY ./admin/webpack* ./admin/ -COPY ./admin/static/ ./admin/static/ -## Addons -COPY ./addons/bitbucket/static/ ./addons/bitbucket/static/ -COPY ./addons/box/static/ ./addons/box/static/ -COPY ./addons/citations/static/ ./addons/citations/static/ -COPY ./addons/dataverse/static/ ./addons/dataverse/static/ -COPY ./addons/dropbox/static/ ./addons/dropbox/static/ -COPY ./addons/dropboxbusiness/static/ ./addons/dropboxbusiness/static/ -COPY ./addons/figshare/static/ ./addons/figshare/static/ -COPY ./addons/forward/static/ ./addons/forward/static/ -COPY ./addons/github/static/ ./addons/github/static/ -COPY ./addons/gitlab/static/ ./addons/gitlab/static/ -COPY ./addons/googledrive/static/ ./addons/googledrive/static/ -COPY ./addons/mendeley/static/ ./addons/mendeley/static/ -COPY ./addons/onedrive/static/ /code/addons/onedrive/static/ -COPY ./addons/osfstorage/static/ ./addons/osfstorage/static/ -COPY ./addons/owncloud/static/ ./addons/owncloud/static/ -COPY ./addons/s3/static/ ./addons/s3/static/ -COPY ./addons/twofactor/static/ ./addons/twofactor/static/ -COPY ./addons/wiki/static/ ./addons/wiki/static/ -COPY ./addons/zotero/static/ ./addons/zotero/static/ -COPY ./addons/swift/static/ ./addons/swift/static/ -COPY ./addons/azureblobstorage/static/ ./addons/azureblobstorage/static/ -COPY ./addons/weko/static/ ./addons/weko/static/ -COPY ./addons/jupyterhub/static/ ./addons/jupyterhub/static/ -COPY ./addons/s3compat/static/ ./addons/s3compat/static/ -COPY ./addons/nextcloud/static/ ./addons/nextcloud/static/ -COPY ./addons/nextcloudinstitutions/static/ ./addons/nextcloudinstitutions/static/ -COPY ./addons/iqbrims/static/ ./addons/iqbrims/static/ -COPY ./addons/myminio/static/ ./addons/myminio/static/ -RUN \ - # OSF - yarn install --frozen-lockfile \ - && mkdir -p ./website/static/built/ \ - && invoke build_js_config_files \ - && yarn run webpack-prod \ - # Admin - && cd ./admin \ - && yarn install --frozen-lockfile \ - && yarn run webpack-prod \ - && cd ../ \ - # Cleanup - && yarn cache clean \ - && npm cache clean --force - -# Copy the rest of the code over -COPY ./ ./ - -ARG GIT_COMMIT= -ENV GIT_COMMIT ${GIT_COMMIT} - -RUN pybabel compile -d ./website/translations -RUN pybabel compile -D django -d ./admin/translations - -# TODO: Admin/API should fully specify their bower static deps, and not include ./website/static in their defaults.py. -# (this adds an additional 300+mb to the build image) -RUN for module in \ - api.base.settings \ - admin.base.settings \ - ; do \ - export DJANGO_SETTINGS_MODULE=$module \ - && python3 manage.py collectstatic --noinput --no-init-app \ - ; done \ - && for file in \ - ./website/templates/_log_templates.mako \ - ./website/static/built/nodeCategories.json \ - ; do \ - touch $file && chmod o+w $file \ - ; done \ - && rm ./website/settings/local.py ./api/base/settings/local.py - -CMD ["su-exec", "nobody", "invoke", "--list"] diff --git a/StorageAddon/osf.io/config/addons.json b/StorageAddon/osf.io/config/addons.json deleted file mode 100644 index 995974c..0000000 --- a/StorageAddon/osf.io/config/addons.json +++ /dev/null @@ -1,146 +0,0 @@ -{ - "addons": [ - "box", - "dataverse", - "dropbox", - "figshare", - "forward", - "github", - "gitlab", - "mendeley", - "zotero", - "osfstorage", - "owncloud", - "onedrive", - "s3", - "twofactor", - "wiki", - "googledrive", - "bitbucket", - "swift", - "azureblobstorage", - "weko", - "jupyterhub", - "s3compat", - "myminio", - "nextcloud", - "nextcloudinstitutions", - "iqbrims", - "dropboxbusiness" - ], - "addons_default": [ - "osfstorage", - "nextcloudinstitutions", - "dropboxbusiness" - ], - "addons_archivable": { - "osfstorage": "full", - "box": "partial", - "dataverse": "partial", - "dropbox": "partial", - "figshare": "partial", - "forward": "full", - "googledrive": "partial", - "onedrive": "partial", - "github": "partial", - "gitlab": "partial", - "owncloud": "partial", - "s3": "partial", - "wiki": "full", - "bitbucket": "partial", - "swift": "partial", - "azureblobstorage": "partial", - "weko": "partial", - "s3compat": "partial", - "myminio": "partial", - "nextcloud": "partial", - "nextcloudinstitutions": "partial", - "iqbrims": "partial", - "dropboxbusiness": "partial" - }, - "addons_commentable": [ - "osfstorage", - "box", - "dataverse", - "dropbox", - "figshare", - "github", - "gitlab", - "googledrive", - "owncloud", - "s3", - "bitbucket", - "onedrive", - "swift", - "swift", - "azureblobstorage", - "weko", - "s3compat", - "myminio", - "nextcloud", - "nextcloudinstitutions", - "iqbrims", - "dropboxbusiness" - ], - "addons_based_on_ids": [ - "osfstorage", - "box", - "onedrive" - ], - "addons_oauth_no_redirect": [ - "bitbucket" - ], - "addons_description": { - "box": "Box is a file storage add-on. Connect your Box account to a GakuNin RDM project to interact with files hosted on Box via the GakuNin RDM.", - "dataverse": "Dataverse is an open source software application to share, cite, and archive data. Connect your Dataverse account to share your Dataverse datasets via the GakuNin RDM.", - "dropbox": "Dropbox is a file storage add-on. Connect your Dropbox account to a GakuNin RDM project to interact with files hosted on Dropbox via the GakuNin RDM.", - "figshare": "Figshare is an online digital repository. Connect your figshare account to share your figshare files along with other materials in your GakuNin RDM project.", - "forward": "The External Link add-on allows you to provide a link to a website outside of the GakuNin RDM.", - "github": "GitHub is a web-based Git repository hosting service. Connect your GitHub repo to your GakuNin RDM project to share your code alongside other materials in your GakuNin RDM project.", - "gitlab": "GitLab is an open-source web-based Git repository hosting tool and service. Connect your GitLab repo to your GakuNin RDM project to share your code alongside other materials in your GakuNin RDM project.", - "mendeley": "Mendeley is a reference management tool. Connecting Mendeley folders to GakuNin RDM projects allows you and others to view, copy, and download citations that are relevant to your project from the Project Overview page.", - "zotero": "Zotero is a reference management tool. Connecting Zotero folders to GakuNin RDM projects allows you and others to view, copy, and download citations that are relevant to your project from the Project Overview page.", - "osfstorage": "NII Storage is the default storage provider for GakuNin RDM projects.", - "owncloud": "ownCloud is an open source, self-hosted file sync and share app platform. Connect your ownCloud account to a GakuNin RDM project to interact with files hosted on ownCloud via the GakuNin RDM.", - "s3": "Amazon S3 is a file storage add-on. Connect your S3 account to a GakuNin RDM project to interact with files hosted on S3 via the GakuNin RDM.", - "twofactor": "Two-factor authentication is a security add-on. By using two-factor authentication, you'll protect your GakuNin RDM account with both your password and your mobile phone.", - "wiki": "The wiki is a versatile communication tool. Wikis can be used to explain the main points of your project and can contain information like lab notes or contact information.", - "googledrive": "Google Drive is a file storage add-on. Connect your Google Drive account to a GakuNin RDM project to interact with files hosted on Google Drive via the GakuNin RDM.", - "bitbucket": "Bitbucket is a web-based Git repository hosting service. Connect your Bitbucket repo to your GakuNin RDM project to share your code alongside other materials in your GakuNin RDM project.", - "onedrive": "Microsoft OneDrive is a file storage add-on. Connect your Microsoft OneDrive account to a GakuNin RDM project to interact with files hosted on Microsoft OneDrive via the GakuNin RDM.", - "swift": "OpenStack Swift is a file storage add-on. Connect your OpenStack Swift account to a GakuNin RDM project to interact with files hosted on OpenStack Swift via the GakuNin RDM.", - "azureblobstorage": "Azure Blob Storage is a file storage add-on. Connect your Azure Storage account to a GakuNin RDM project to interact with files hosted on Azure Blob Storage (Block Blob) via the GakuNin RDM.", - "weko": "WEKO is an application server to share, archive data.", - "jupyterhub": "Jupyter is a web-based interactive computational environment. Files on a GakuNin RDM project can be imported to/exported from Jupyter", - "s3compat": "S3 Compatible Storage is a file storage add-on. Connect your S3 Compatible Storage account to a GakuNin RDM project to interact with files hosted on S3 Compatible Storage via the GakuNin RDM.", - "myminio": "My MinIO is a file storage add-on. Connect your My MinIO account to a GakuNin RDM project to interact with files hosted on My MinIO via the GakuNin RDM.", - "nextcloud": "Nextcloud is an open source, self-hosted file sync and share app platform. Connect your Nextcloud account to a GakuNin RDM project to interact with files hosted on Nextcloud via the GakuNin RDM.", - "iqbrims": "IQB-RIMS is a file storage add-on. Connect your Google Drive account to a GakuNin RDM project to interact with files hosted on Google Drive via the GakuNin RDM.", - "nextcloudinstitutions": "Nextcloud for Institutions is a file storage add-on for Institutions. Connect your Nextcloud account to a GakuNin RDM project to interact with files hosted on Nextcloud via the GakuNin RDM.", - "dropboxbusiness": "Dropbox Business for Institutions is a file storage add-on for Institutions. Connect your Dropbox Business administrator account to a GakuNin RDM project to interact with files hosted on Dropbox via the GakuNin RDM." - }, - "addons_url": { - "box": "http://www.box.com", - "dataverse": "https://dataverse.harvard.edu/", - "dropbox": "http://www.dropbox.com", - "figshare": "http://www.figshare.com", - "github": "http://www.github.com", - "gitlab": "https://www.gitlab.com", - "mendeley": "http://www.mendeley.com", - "owncloud": "https://owncloud.org/", - "zotero": "http://www.zotero.org", - "s3": "https://aws.amazon.com/s3/", - "googledrive": "https://drive.google.com", - "bitbucket": "https://bitbucket.org/", - "onedrive": "https://onedrive.live.com", - "swift": "https://wiki.openstack.org/wiki/Swift", - "azureblobstorage": "https://azure.microsoft.com/", - "weko": "https://weko.at.nii.ac.jp/", - "jupyterhub": "https://jupyterhub.readthedocs.io/", - "s3compat": "https://aws.amazon.com/s3/", - "myminio": "https://min.io/", - "nextcloud": "https://nextcloud.com/", - "iqbrims": "https://drive.google.com", - "dropboxbusiness": "http://www.dropbox.com" - } -} diff --git a/StorageAddon/osf.io/config/api/base/settings/defaults.py b/StorageAddon/osf.io/config/api/base/settings/defaults.py deleted file mode 100644 index d66c245..0000000 --- a/StorageAddon/osf.io/config/api/base/settings/defaults.py +++ /dev/null @@ -1,495 +0,0 @@ -""" -Django settings for api project. - -Generated by 'django-admin startproject' using Django 1.8. - -For more information on this file, see -https://docs.djangoproject.com/en/1.8/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/1.8/ref/settings/ -""" - -import os -from future.moves.urllib.parse import urlparse -from website import settings as osf_settings - -BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/ - -DATABASES = { - 'default': { - 'CONN_MAX_AGE': 0, - 'ENGINE': 'osf.db.backends.postgresql', # django.db.backends.postgresql - 'NAME': os.environ.get('OSF_DB_NAME', 'osf'), - 'USER': os.environ.get('OSF_DB_USER', 'postgres'), - 'PASSWORD': os.environ.get('OSF_DB_PASSWORD', ''), - 'HOST': os.environ.get('OSF_DB_HOST', '127.0.0.1'), - 'PORT': os.environ.get('OSF_DB_PORT', '5432'), - 'ATOMIC_REQUESTS': True, - 'TEST': { - 'SERIALIZE': False, - }, - }, -} - -DATABASE_ROUTERS = ['osf.db.router.PostgreSQLFailoverRouter', ] -PASSWORD_HASHERS = [ - 'django.contrib.auth.hashers.BCryptSHA256PasswordHasher', - 'django.contrib.auth.hashers.BCryptPasswordHasher', -] - -AUTH_USER_MODEL = 'osf.OSFUser' - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = osf_settings.SECRET_KEY - -AUTHENTICATION_BACKENDS = ( - 'api.base.authentication.backends.ODMBackend', - 'guardian.backends.ObjectPermissionBackend', -) - -# SECURITY WARNING: don't run with debug turned on in production! -DEV_MODE = osf_settings.DEV_MODE -DEBUG = osf_settings.DEBUG_MODE -DEBUG_PROPAGATE_EXCEPTIONS = True - -# session: -SESSION_COOKIE_NAME = 'api' -SESSION_COOKIE_SECURE = osf_settings.SECURE_MODE -SESSION_COOKIE_HTTPONLY = osf_settings.SESSION_COOKIE_HTTPONLY -SESSION_COOKIE_SAMESITE = osf_settings.SESSION_COOKIE_SAMESITE - -# csrf: -CSRF_COOKIE_NAME = 'api-csrf' -CSRF_COOKIE_SECURE = osf_settings.SECURE_MODE -CSRF_COOKIE_HTTPONLY = osf_settings.SECURE_MODE - -ALLOWED_HOSTS = [ - '.osf.io', -] - - -# Application definition - -INSTALLED_APPS = ( - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.messages', - 'django.contrib.sessions', - 'django.contrib.staticfiles', - 'django.contrib.admin', - - # 3rd party - 'django_celery_beat', - 'django_celery_results', - 'rest_framework', - 'corsheaders', - 'raven.contrib.django.raven_compat', - 'django_extensions', - 'guardian', - 'storages', - 'waffle', - 'elasticsearch_metrics', - - # OSF - 'osf', - - # Addons - 'addons.osfstorage', - 'addons.bitbucket', - 'addons.box', - 'addons.dataverse', - 'addons.dropbox', - 'addons.figshare', - 'addons.forward', - 'addons.github', - 'addons.gitlab', - 'addons.googledrive', - 'addons.mendeley', - 'addons.onedrive', - 'addons.owncloud', - 'addons.s3', - 'addons.twofactor', - 'addons.wiki', - 'addons.zotero', - 'addons.swift', - 'addons.azureblobstorage', - 'addons.weko', - 'addons.jupyterhub', - 'addons.iqbrims', - 'addons.dropboxbusiness', - 'addons.nextcloudinstitutions', -) - -# local development using https -if osf_settings.SECURE_MODE and DEBUG: - INSTALLED_APPS += ('sslserver',) - -# TODO: Are there more granular ways to configure reporting specifically related to the API? -RAVEN_CONFIG = { - 'tags': {'App': 'api'}, - 'dsn': osf_settings.SENTRY_DSN, - 'release': osf_settings.VERSION, -} - -BULK_SETTINGS = { - 'DEFAULT_BULK_LIMIT': 100, -} - -MAX_PAGE_SIZE = 100 - -REST_FRAMEWORK = { - 'PAGE_SIZE': 10, - 'DEFAULT_RENDERER_CLASSES': ( - 'api.base.renderers.JSONAPIRenderer', - 'api.base.renderers.JSONRendererWithESISupport', - 'api.base.renderers.BrowsableAPIRendererNoForms', - ), - 'DEFAULT_PARSER_CLASSES': ( - 'api.base.parsers.JSONAPIParser', - 'api.base.parsers.JSONAPIParserForRegularJSON', - 'rest_framework.parsers.FormParser', - 'rest_framework.parsers.MultiPartParser', - ), - 'EXCEPTION_HANDLER': 'api.base.exceptions.json_api_exception_handler', - 'DEFAULT_CONTENT_NEGOTIATION_CLASS': 'api.base.content_negotiation.JSONAPIContentNegotiation', - 'DEFAULT_VERSIONING_CLASS': 'api.base.versioning.BaseVersioning', - 'DEFAULT_VERSION': '2.0', - 'ALLOWED_VERSIONS': ( - '2.0', - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - ), - 'DEFAULT_FILTER_BACKENDS': ('api.base.filters.OSFOrderingFilter',), - 'DEFAULT_PAGINATION_CLASS': 'api.base.pagination.JSONAPIPagination', - 'ORDERING_PARAM': 'sort', - 'DEFAULT_AUTHENTICATION_CLASSES': ( - # Custom auth classes - 'api.base.authentication.drf.OSFBasicAuthentication', - 'api.base.authentication.drf.OSFSessionAuthentication', - 'api.base.authentication.drf.OSFCASAuthentication', - ), - 'DEFAULT_THROTTLE_CLASSES': ( - 'rest_framework.throttling.UserRateThrottle', - 'api.base.throttling.NonCookieAuthThrottle', - 'api.base.throttling.BurstRateThrottle', - ), - 'DEFAULT_THROTTLE_RATES': { - 'user': '10000/day', - 'non-cookie-auth': '100/hour', - 'add-contributor': '10/second', - 'create-guid': '1000/hour', - 'root-anon-throttle': '1000/hour', - 'test-user': '2/hour', - 'test-anon': '1/hour', - 'send-email': '2/minute', - 'burst': '10/second', - }, -} - -# Settings related to CORS Headers addon: allow API to receive authenticated requests from OSF -# CORS plugin only matches based on "netloc" part of URL, so as workaround we add that to the list -CORS_ORIGIN_ALLOW_ALL = False -CORS_ORIGIN_WHITELIST = ( - urlparse(osf_settings.DOMAIN).netloc, - osf_settings.DOMAIN, -) -# This needs to remain True to allow cross origin requests that are in CORS_ORIGIN_WHITELIST to -# use cookies. -CORS_ALLOW_CREDENTIALS = True -# Set dynamically on app init -ORIGINS_WHITELIST = () - -MIDDLEWARE = ( - 'api.base.middleware.DjangoGlobalMiddleware', - 'api.base.middleware.CeleryTaskMiddleware', - 'api.base.middleware.PostcommitTaskMiddleware', - # A profiling middleware. ONLY FOR DEV USE - # Uncomment and add "prof" to url params to recieve a profile for that url - # 'api.base.middleware.ProfileMiddleware', - - # 'django.contrib.sessions.middleware.SessionMiddleware', - 'api.base.middleware.CorsMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - # 'django.contrib.auth.middleware.AuthenticationMiddleware', - # 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', - # 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'django.middleware.security.SecurityMiddleware', - # 'waffle.middleware.WaffleMiddleware', - 'api.base.middleware.SloanOverrideWaffleMiddleware', # Delete this and uncomment WaffleMiddleware to revert Sloan -) - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [os.path.join(BASE_DIR, 'templates')], - 'APP_DIRS': True, - }, -] - - -ROOT_URLCONF = 'api.base.urls' -WSGI_APPLICATION = 'api.base.wsgi.application' - - -LANGUAGE_CODE = 'en-us' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_L10N = True - -USE_TZ = True - -# https://django-storages.readthedocs.io/en/latest/backends/gcloud.html -if os.environ.get('GOOGLE_APPLICATION_CREDENTIALS', False): - # Required to interact with Google Cloud Storage - DEFAULT_FILE_STORAGE = 'api.base.storage.RequestlessURLGoogleCloudStorage' - GS_BUCKET_NAME = os.environ.get('GS_BUCKET_NAME', 'cos-osf-stage-cdn-us') - GS_FILE_OVERWRITE = os.environ.get('GS_FILE_OVERWRITE', False) -elif osf_settings.DEV_MODE or osf_settings.DEBUG_MODE: - DEFAULT_FILE_STORAGE = 'api.base.storage.DevFileSystemStorage' - -# https://docs.djangoproject.com/en/1.8/howto/static-files/ - -STATIC_ROOT = os.path.join(BASE_DIR, 'static/vendor') - -API_BASE = 'v2/' -API_PRIVATE_BASE = '_/' -STATIC_URL = '/static/' - -NODE_CATEGORY_MAP = osf_settings.NODE_CATEGORY_MAP - -DEBUG_TRANSACTIONS = DEBUG - -JWT_SECRET = b'osf_api_cas_login_jwt_secret_32b' -JWE_SECRET = b'osf_api_cas_login_jwe_secret_32b' - -ENABLE_VARNISH = osf_settings.ENABLE_VARNISH -ENABLE_ESI = osf_settings.ENABLE_ESI -VARNISH_SERVERS = osf_settings.VARNISH_SERVERS -ESI_MEDIA_TYPES = osf_settings.ESI_MEDIA_TYPES - -ADDONS_FOLDER_CONFIGURABLE = ['box', 'dropbox', 's3', 'googledrive', 'figshare', 'owncloud', 'onedrive', 'swift', 'azureblobstorage', 'weko', 'iqbrims'] -ADDONS_OAUTH = ADDONS_FOLDER_CONFIGURABLE + ['dataverse', 'github', 'bitbucket', 'gitlab', 'mendeley', 'zotero', 'forward'] - -BYPASS_THROTTLE_TOKEN = 'test-token' - -OSF_SHELL_USER_IMPORTS = None - -# Settings for use in the admin -OSF_URL = 'https://osf.io' - -SELECT_FOR_UPDATE_ENABLED = True - -# Disable anonymous user permissions in django-guardian -ANONYMOUS_USER_NAME = None - -# If set to True, automated tests with extra queries will fail. -NPLUSONE_RAISE = False - -# Timestamp - number of requests to send to cloud storages per minute -TS_REQUESTS_PER_MIN = 30 - -# salt used for generating hashids -HASHIDS_SALT = 'pinkhimalayan' - -# django-elasticsearch-metrics -ELASTICSEARCH_DSL = { - 'default': { - 'hosts': os.environ.get('ELASTIC6_URI', '127.0.0.1:9201'), - 'retry_on_timeout': True, - }, -} -# Store yearly indices for time-series metrics -ELASTICSEARCH_METRICS_DATE_FORMAT = '%Y' - -WAFFLE_CACHE_NAME = 'waffle_cache' -STORAGE_USAGE_CACHE_NAME = 'storage_usage' - - -CACHES = { - 'default': { - 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', - }, - STORAGE_USAGE_CACHE_NAME: { - 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', - 'LOCATION': 'osf_cache_table', - }, - WAFFLE_CACHE_NAME: { - 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', - }, -} - -SLOAN_ID_COOKIE_NAME = 'sloan_id' - -EGAP_PROVIDER_NAME = 'EGAP' - -MAX_SIZE_OF_ES_QUERY = 10000 -DEFAULT_ES_NULL_VALUE = 'N/A' - -TRAVIS_ENV = False - -### NII extensions -LOGIN_BY_EPPN = osf_settings.to_bool('LOGIN_BY_EPPN', False) -USER_TIMEZONE = osf_settings.USER_TIMEZONE -USER_LOCALE = osf_settings.USER_LOCALE -CLOUD_GATEWAY_ISMEMBEROF_PREFIX = osf_settings.CLOUD_GATEWAY_ISMEMBEROF_PREFIX -# install-addons.py -INSTALLED_APPS += ('addons.s3compat',) -ADDONS_FOLDER_CONFIGURABLE.append('s3compat') -ADDONS_OAUTH.append('s3compat') -INSTALLED_APPS += ('addons.myminio',) -ADDONS_FOLDER_CONFIGURABLE.append('myminio') -ADDONS_OAUTH.append('myminio') -INSTALLED_APPS += ('addons.nextcloud',) -ADDONS_FOLDER_CONFIGURABLE.append('nextcloud') -ADDONS_OAUTH.append('nextcloud') - -TST_COMMAND_DELIMITER = ' ' -# RSA key generation settings -SSL_GENERATE_KEY = 'openssl' + TST_COMMAND_DELIMITER + \ - 'genrsa' + TST_COMMAND_DELIMITER + \ - '-des3' + TST_COMMAND_DELIMITER + \ - '-out' + TST_COMMAND_DELIMITER + \ - '{0}.key {1}' -SSL_GENERATE_KEY_NOPASS = 'openssl' + TST_COMMAND_DELIMITER + \ - 'rsa' + TST_COMMAND_DELIMITER + \ - '-in' + TST_COMMAND_DELIMITER + \ - '{0}.key' + TST_COMMAND_DELIMITER + \ - '-out' + TST_COMMAND_DELIMITER + \ - '{0}.key.nopass' -SSL_GENERATE_CSR = 'openssl' + TST_COMMAND_DELIMITER + \ - 'req' + TST_COMMAND_DELIMITER + \ - '-new' + TST_COMMAND_DELIMITER + \ - '-key' + TST_COMMAND_DELIMITER + \ - '{0}.key.nopass' + TST_COMMAND_DELIMITER + \ - '-out' + TST_COMMAND_DELIMITER + \ - '{0}.csr' -SSL_GENERATE_SELF_SIGNED = 'openssl' + TST_COMMAND_DELIMITER + \ - 'req' + TST_COMMAND_DELIMITER + \ - '-x509' + TST_COMMAND_DELIMITER + \ - '-nodes' + TST_COMMAND_DELIMITER + \ - '-days' + TST_COMMAND_DELIMITER + \ - '365' + TST_COMMAND_DELIMITER + \ - '-newkey' + TST_COMMAND_DELIMITER + \ - 'rsa:2048' + TST_COMMAND_DELIMITER + \ - '-keyout' + TST_COMMAND_DELIMITER + \ - '{0}.key' + TST_COMMAND_DELIMITER + \ - '-out' + TST_COMMAND_DELIMITER + \ - '{0}.crt' -SSL_PRIVATE_KEY_GENERATION = 'openssl' + TST_COMMAND_DELIMITER + \ - 'genrsa' + TST_COMMAND_DELIMITER + \ - '-out' + TST_COMMAND_DELIMITER + \ - '{0}' + TST_COMMAND_DELIMITER + \ - '{1}' -SSL_PUBLIC_KEY_GENERATION = 'openssl' + TST_COMMAND_DELIMITER + \ - 'rsa' + TST_COMMAND_DELIMITER + \ - '-in' + TST_COMMAND_DELIMITER + \ - '{0}' + TST_COMMAND_DELIMITER + \ - '-pubout' + TST_COMMAND_DELIMITER + \ - '-out' + TST_COMMAND_DELIMITER + \ - '{1}' - -# UserKey Placement destination -KEY_NAME_PRIVATE = 'pvt' -KEY_NAME_PUBLIC = 'pub' -KEY_BIT_VALUE = '3072' -KEY_EXTENSION = '.pem' -KEY_SAVE_PATH = '/user_key_info/' -KEY_NAME_FORMAT = '{0}_{1}_{2}{3}' -PRIVATE_KEY_VALUE = 1 -PUBLIC_KEY_VALUE = 2 -# FreeTSA openation commands -SSL_CREATE_TIMESTAMP_REQUEST = 'openssl' + TST_COMMAND_DELIMITER + \ - 'ts' + TST_COMMAND_DELIMITER + \ - '-query' + TST_COMMAND_DELIMITER + \ - '-data' + TST_COMMAND_DELIMITER + \ - '{0}' + TST_COMMAND_DELIMITER + \ - '-cert' + TST_COMMAND_DELIMITER + \ - '-sha512' -SSL_GET_TIMESTAMP_RESPONSE = 'openssl' + TST_COMMAND_DELIMITER + \ - 'ts' + TST_COMMAND_DELIMITER + \ - '-verify' + TST_COMMAND_DELIMITER + \ - '-data' + TST_COMMAND_DELIMITER + \ - '{0}' + TST_COMMAND_DELIMITER + \ - '-in' + TST_COMMAND_DELIMITER + \ - '{1}' + TST_COMMAND_DELIMITER + \ - '-CAfile' + TST_COMMAND_DELIMITER + \ - '{2}' - -SSL_CREATE_TIMESTAMP_HASH_REQUEST = 'openssl ts -query -digest {digest} {digest_type} -cert' -SSL_GET_TIMESTAMP_HASH_RESPONSE = 'openssl ts -verify {digest_type} -digest {digest} -in {input} -CAfile {ca}' - -# openssl ts verify check value -OPENSSL_VERIFY_RESULT_OK = 'OK' -# timestamp verify rootKey -VERIFY_ROOT_CERTIFICATE = 'root_cert_verifycate.pem' -# timestamp request const -REQUEST_HEADER = {'Content-Type': 'application/timestamp-query'} -TIME_STAMP_AUTHORITY_URL = 'http://eswg.jnsa.org/freetsa' -ERROR_HTTP_STATUS = [400, 401, 402, 403, 500, 502, 503, 504] -REQUEST_TIME_OUT = 5 -RETRY_COUNT = 3 - -# UPKI flag -USE_UPKI = False - -#uPKI operation commands -UPKI_TIMESTAMP_URL = '' -UPKI_CREATE_TIMESTAMP = '' # {0}=target, {1}=out -UPKI_VERIFY_TIMESTAMP = '' # {0}=target, {1}=in -UPKI_CREATE_TIMESTAMP_HASH = '' # {digest_type}, {digest}, {output} -UPKI_VERIFY_TIMESTAMP_HASH = '' # {digest}, {input} -UPKI_VERIFY_INVALID_MSG = 'LPC_ERR_VERIFY_INVALID' - -# TimeStamp Inspection Status -TIME_STAMP_TOKEN_UNCHECKED = 0 -TIME_STAMP_TOKEN_CHECK_SUCCESS = 1 -TIME_STAMP_TOKEN_CHECK_SUCCESS_MSG = 'OK' -TIME_STAMP_TOKEN_CHECK_NG = 2 -TIME_STAMP_TOKEN_CHECK_NG_MSG = 'Fail: file modified.' -TIME_STAMP_TOKEN_CHECK_FILE_NOT_FOUND = 3 -TIME_STAMP_TOKEN_CHECK_FILE_NOT_FOUND_MSG = 'Fail: not inspected.' -TIME_STAMP_TOKEN_NO_DATA = 4 -TIME_STAMP_TOKEN_NO_DATA_MSG = 'Error: some errors has occurred in processing.' -FILE_NOT_EXISTS = 5 -FILE_NOT_EXISTS_MSG = 'Fail: deleted file.' -FILE_NOT_FOUND = 6 -FILE_NOT_FOUND_MSG = 'Fail: file was gone.' -TIME_STAMP_VERIFICATION_ERR = 7 -TIME_STAMP_VERIFICATION_ERR_MSG = 'Error: some errors has occurred in verification.' -TIME_STAMP_STORAGE_DISCONNECTED = 8 -TIME_STAMP_STORAGE_DISCONNECTED_MSG = 'Error: storage disconnected.' -TIME_STAMP_STORAGE_NOT_ACCESSIBLE = 9 -TIME_STAMP_STORAGE_NOT_ACCESSIBLE_MSG = 'Error: storage service connection error occurred.' - -# Quota settings -DEFAULT_MAX_QUOTA = 100 -WARNING_THRESHOLD = 0.9 -BASE_FOR_METRIC_PREFIX = 1000 -SIZE_UNIT_GB = BASE_FOR_METRIC_PREFIX ** 3 -NII_STORAGE_REGION_ID = 1 diff --git a/StorageAddon/osf.io/config/framework/addons/data/addons.json b/StorageAddon/osf.io/config/framework/addons/data/addons.json deleted file mode 100644 index 2a80564..0000000 --- a/StorageAddon/osf.io/config/framework/addons/data/addons.json +++ /dev/null @@ -1,628 +0,0 @@ -{ - "addons": { - "GitHub": { - "Permissions": { - "status": "partial", - "text": "Making a GakuNin RDM project public or private is independent of making a GitHub repo public or private. The GakuNin RDM does not alter the permissions of linked GitHub repos." - }, - "View / download file versions": { - "status": "full", - "text": "GitHub files and their versions can be viewed/downloaded via GakuNin RDM." - }, - "Add / update files": { - "status": "full", - "text": "Adding/updating files in the project via GakuNin RDM will be reflected in GitHub." - }, - "Delete files": { - "status": "full", - "text": "Files deleted via GakuNin RDM will be deleted in GitHub." - }, - "Logs": { - "status": "full", - "text": "GitHub dynamically updates GakuNin RDM logs when files are modified outside the GakuNin RDM. Changes to GitHub repos made before the repo is linked to the GakuNin RDM will not be reflected in GakuNin RDM logs." - }, - "Forking": { - "status": "partial", - "text": "Forking a project or component does not copy Github authorization unless the user forking the project is the same user who authorized the Github add-on in the source project being forked." - }, - "Registering": { - "status": "partial", - "text": "GitHub content will be registered, but version history will not be copied to the registration." - } - }, - "GitLab": { - "Permissions": { - "status": "partial", - "text": "Making a GakuNin RDM project public or private is independent of making a GitLab repo public or private. The GakuNin RDM does not alter the permissions of linked GitLab repos." - }, - "View / download file versions": { - "status": "full", - "text": "GitLab files and their versions can be viewed/downloaded via GakuNin RDM." - }, - "Add / update files": { - "status": "none", - "text": "Adding/updating files in the project via GakuNin RDM is not implemented yet." - }, - "Delete files": { - "status": "none", - "text": "Deleting files via GakuNin RDM is not implemented yet." - }, - "Logs": { - "status": "none", - "text": "GakuNin RDM does not keep track of changes made using Gitlab directly." - }, - "Forking": { - "status": "partial", - "text": "Forking a project or component does not copy GitLab authorization unless the user forking the project is the same user who authorized the GitLab add-on in the source project being forked." - }, - "Registering": { - "status": "partial", - "text": "GitLab content will be registered, but version history will not be copied to the registration." - } - }, - "Amazon S3": { - "Permissions": { - "status": "partial", - "text": "Making a GakuNin RDM project public or private is independent of making an S3 bucket public or private. The GakuNin RDM does not alter the permissions of linked S3 buckets." - }, - "View / download file versions": { - "status": "partial", - "text": "The S3 add-on supports file versions if versioning is enabled for your S3 buckets." - }, - "Add / update files": { - "status": "full", - "text": "Adding/updating files in the project via GakuNin RDM will be reflected in Amazon S3." - }, - "Delete files": { - "status": "full", - "text": "Files deleted via GakuNin RDM will be deleted in Amazon S3." - }, - "Logs": { - "status": "partial", - "text": "The GakuNin RDM keeps track of changes you make to your S3 buckets through the GakuNin RDM, but not for changes made using S3 directly." - }, - "Forking": { - "status": "partial", - "text": "Forking a project or component does not copy S3 authorization unless the user forking the project is the same user who authorized the S3 add-on in the source project being forked." - }, - "Registering": { - "status": "partial", - "text": "S3 content will be registered, but version history will not be copied to the registration." - } - }, - "figshare": { - "Permissions": { - "status": "partial", - "text": " Making a GakuNin RDM project public or private is independent of making figshare content public or private. The GakuNin RDM does not alter the permissions of linked figshare content." - }, - "View / download file versions": { - "status": "partial", - "text": "figshare files can be viewed/downloaded via GakuNin RDM, but version history is not supported." - }, - "Add / update files": { - "status": "partial", - "text": "Files can be added but not updated." - }, - "Delete files": { - "status": "partial", - "text": "Private files and filesets can be deleted via GakuNin RDM." - }, - "Logs": { - "status": "partial", - "text": "GakuNin RDM keeps track of changes you make to your figshare content through GakuNin RDM, but not for changes made using figshare directly." - }, - "Forking": { - "status": "partial", - "text": "Forking a project or component does not copy figshare authorization unless the user forking the project is the same user who authorized the figshare add-on in the source project being forked." - }, - "Registering": { - "status": "partial", - "text": "figshare content will be registered, but version history will not be copied to the registration." - } - }, - "Dropbox": { - "Permissions": { - "status": "partial", - "text": "Making a GakuNin RDM project public or private is independent of Dropbox privacy. The GakuNin RDM does not alter the permissions of linked Dropbox folders." - }, - "View / download file versions": { - "status": "full", - "text": "Dropbox files and their versions can be viewed/downloaded via GakuNin RDM." - }, - "Add / update files": { - "status": "full", - "text": "Adding/updating files in the project via GakuNin RDM will be reflected in Dropbox." - }, - "Delete files": { - "status": "full", - "text": "Files deleted via GakuNin RDM will be deleted in Dropbox." - }, - "Logs": { - "status": "partial", - "text": "GakuNin RDM keeps track of changes you make to your Dropbox content through GakuNin RDM, but not for changes made using Dropbox directly." - }, - "Forking": { - "status": "partial", - "text": "Forking a project or component does not copy Dropbox authorization unless the user forking the project is the same user who authorized the Dropbox add-on in the source project being forked." - }, - "Registering": { - "status": "partial", - "text": "Dropbox content will be registered, but version history will not be copied to the registration." - } - }, - "OneDrive": { - "Permissions": { - "status": "partial", - "text": "Making a GakuNin RDM project public or private is independent of OneDrive privacy. The GakuNin RDM does not alter the permissions of linked OneDrive folders." - }, - "View / download file versions": { - "status": "full", - "text": "OneDrive files and their versions can be viewed/downloaded via GakuNin RDM. OneNote files are unexportable and cannot be downloaded or viewed." - }, - "Add / update files": { - "status": "none", - "text": "The OneDrive add-on is read-only." - }, - "Delete files": { - "status": "none", - "text": "The OneDrive add-on is read-only." - }, - "Logs": { - "status": "partial", - "text": "GakuNin RDM keeps track of changes you make to your OneDrive add-on configuration. It does not track changes to OneDrive content." - }, - "Forking": { - "status": "partial", - "text": "Forking a project or component does not copy OneDrive authorization unless the user forking the project is the same user who authorized the OneDrive add-on in the source project being forked." - }, - "Registering": { - "status": "partial", - "text": "OneDrive content will be registered, but version history will not be copied to the registration. OneNote files are unexportable and will not be archived." - } - }, - "Dataverse": { - "Permissions": { - "status": "partial", - "text": "Making a GakuNin RDM project public or private is independent of making a Dataverse study public or private. The GakuNin RDM allows you to release the latest draft version of a Dataverse dataset." - }, - "View / download file versions": { - "status": "partial", - "text": "Files from the latest release of the selected Dataverse study can be viewed/downloaded. GakuNin RDM users with write permissions can view/download draft files as well." - }, - "Add / update files": { - "status": "full", - "text": "Adding/updating files in the project via GakuNin RDM will be reflected in Dataverse." - }, - "Delete files": { - "status": "full", - "text": "Files deleted via GakuNin RDM will be deleted in Dataverse." - }, - "Logs": { - "status": "partial", - "text": "The GakuNin RDM keeps track of changes you make to your Dataverse studies through the GakuNin RDM, but not for changes made using Dataverse directly." - }, - "Forking": { - "status": "partial", - "text": "Forking a project or component does not copy Dataverse authorization unless the user forking the project is the same user who authorized the Dataverse add-on in the source project being forked." - }, - "Registering": { - "status": "partial", - "text": "Dataverse content will be registered, but version history will not be copied to the registration." - } - }, - "Google Drive": { - "Permissions": { - "status": "partial", - "text": "Making a GakuNin RDM project public or private is independent of Google Drive privacy. The GakuNin RDM does not alter the permissions of linked Google Drive folders." - }, - "View / download file versions": { - "status": "full", - "text": "Google Drive files and their versions can be viewed/downloaded via GakuNin RDM." - }, - "Add / update files": { - "status": "full", - "text": "Adding/updating files in the project via GakuNin RDM will be reflected in Google Drive." - }, - "Delete files": { - "status": "full", - "text": "Files deleted via GakuNin RDM will be deleted in Google Drive." - }, - "Logs": { - "status": "partial", - "text": "The GakuNin RDM keeps track of changes you make to your Google Drive content through the GakuNin RDM, but not for changes made using Google Drive directly." - }, - "Forking": { - "status": "partial", - "text": "Forking a project or component does not copy Google Drive authorization unless the user forking the project is the same user who authorized the Google Drive add-on in the source project being forked." - }, - "Registering": { - "status": "partial", - "text": "Google Drive content will be registered, but version history will not be copied to the registration." - } - }, - "Box": { - "Permissions": { - "status": "partial", - "text": "Making a GakuNin RDM project public or private is independent of Box privacy. The GakuNin RDM does not alter the permissions of linked Box folders." - }, - "View / download file versions": { - "status": "full", - "text": "Box files and their versions can be viewed/downloaded via GakuNin RDM." - }, - "Add / update files": { - "status": "full", - "text": "Adding/updating files in the project via GakuNin RDM will be reflected in Box." - }, - "Delete files": { - "status": "full", - "text": "Files deleted via GakuNin RDM will be deleted in Box." - }, - "Logs": { - "status": "partial", - "text": "The GakuNin RDM keeps track of changes you make to your Box content through the GakuNin RDM, but not for changes made using Box directly." - }, - "Forking": { - "status": "partial", - "text": "Forking a project or component does not copy Box authorization unless the user forking the project is the same user who authorized the Box add-on in the source project being forked." - }, - "Registering": { - "status": "partial", - "text": "Box content will be registered, but version history will not be copied to the registration." - } - }, - "Mendeley": { - "Permissions": { - "status": "partial", - "text": "Making a GakuNin RDM project public or private is independent of making a Mendeley folder public or private. The GakuNin RDM does not alter the permissions of a linked Mendeley folder." - }, - "View / download file versions": { - "status": "NA" - }, - "Add / update files": { - "status": "NA" - }, - "Delete files": { - "status": "NA" - }, - "Logs": { - "status": "NA" - }, - "Forking": { - "status": "partial", - "text": "Forking a project or component does not copy Mendeley authorization unless the user forking the project is the same user who authorized the Mendeley add-on in the source project being forked." - }, - "Registering": { - "status": "none", - "text": "Mendeley content will not be registered." - } - }, - "ownCloud": { - "Permissions": { - "status": "partial", - "text": "Making a GakuNin RDM project public or private is independent of ownCloud privacy. The GakuNin RDM does not alter the permissions of linked ownCloud folders." - }, - "View / download file versions": { - "status": "partial", - "text": "ownCloud files can be viewed/downloaded via GakuNin RDM, but version history is not supported by the ownCloud WebDAV API." - }, - "Add / update files": { - "status": "full", - "text": "Adding/updating files in the project via GakuNin RDM will be reflected in ownCloud." - }, - "Delete files": { - "status": "full", - "text": "Files deleted via GakuNin RDM will be deleted in ownCloud." - }, - "Logs": { - "status": "partial", - "text": "GakuNin RDM keeps track of changes you make to your ownCloud content through GakuNin RDM, but not for changes made using ownCloud directly." - }, - "Forking": { - "status": "partial", - "text": "Forking a project or component does not copy ownCloud authorization unless the user forking the project is the same user who authorized the ownCloud add-on in the source project being forked." - }, - "Registering": { - "status": "partial", - "text": "ownCloud content will be registered, but version history will not be copied to the registration." - } - }, - "Zotero": { - "Permissions": { - "status": "partial", - "text": "Making a GakuNin RDM project public or private is independent of making a Zotero folder public or private. The GakuNin RDM does not alter the permissions of a linked Zotero folder." - }, - "View / download file versions": { - "status": "NA" - }, - "Add / update files": { - "status": "NA" - }, - "Delete files": { - "status": "NA" - }, - "Logs": { - "status": "NA" - }, - "Forking": { - "status": "partial", - "text": "Forking a project or component does not copy Zotero authorization unless the user forking the project is the same user who authorized the Zotero add-on in the source project being forked." - }, - "Registering": { - "status": "none", - "text": "Zotero content will not be registered." - } - }, - "Bitbucket": { - "Permissions": { - "status": "partial", - "text": "Making a GakuNin RDM project public or private is independent of making a Bitbucket repo public or private. The GakuNin RDM does not alter the permissions of linked Bitbucket repos." - }, - "View / download file versions": { - "status": "full", - "text": "Bitbucket files and their versions can be viewed/downloaded via GakuNin RDM." - }, - "Add / update files": { - "status": "none", - "text": "Bitbucket does not support adding or updating files via their API." - }, - "Delete files": { - "status": "none", - "text": "Bitbucket does not support deleting files via their API." - }, - "Logs": { - "status": "full", - "text": "GakuNin RDM keeps track of changes you make to your Bitbucket content through GakuNin RDM, but not for changes made using Bitbucket directly." - }, - "Forking": { - "status": "partial", - "text": "Forking a project or component does not copy Bitbucket authorization unless the user forking the project is the same user who authorized the Bitbucket add-on in the source project being forked." - }, - "Registering": { - "status": "partial", - "text": "Bitbucket content will be registered, but version history will not be copied to the registration." - } - }, - "OpenStack Swift": { - "Permissions": { - "status": "partial", - "text": "Making a GakuNin RDM project public or private is independent of making an Swift container public or private." - }, - "View / download file versions": { - "status": "partial", - "text": "The Swift add-on does not support file versions." - }, - "Add / update files": { - "status": "full", - "text": "Adding/updating files in the project via GakuNin RDM will be reflected in Swift." - }, - "Delete files": { - "status": "full", - "text": "Files deleted via GakuNin RDM will be deleted in Swift." - }, - "Logs": { - "status": "partial", - "text": "The GakuNin RDM keeps track of changes you make to your Swift containers through the GakuNin RDM, but not for changes made using Swift directly." - }, - "Forking": { - "status": "partial", - "text": "Forking a project or component does not copy Swift authorization unless the user forking the project is the same user who authorized the Swift add-on in the source project being forked." - }, - "Registering": { - "status": "partial", - "text": "Swift object will be registered, but version history will not be copied to the registration." - } - }, - "Azure Blob Storage": { - "Permissions": { - "status": "partial", - "text": "Making a GakuNin RDM project public or private is independent of making an Azure Blob Storage container public or private." - }, - "View / download file versions": { - "status": "partial", - "text": "The Azure Blob Storage add-on supports only Block Blobs, and does not support file versions." - }, - "Add / update files": { - "status": "full", - "text": "Adding/updating files in the project via GakuNin RDM will be reflected in Azure Blob Storage." - }, - "Delete files": { - "status": "full", - "text": "Files deleted via GakuNin RDM will be deleted in Azure Blob Storage." - }, - "Logs": { - "status": "partial", - "text": "The GakuNin RDM keeps track of changes you make to your Azure Blob Storage containers through the GakuNin RDM, but not for changes made using Azure Blob Storage directly." - }, - "Forking": { - "status": "partial", - "text": "Forking a project or component does not copy Azure Blob Storage authorization unless the user forking the project is the same user who authorized the Azure Blob Storage add-on in the source project being forked." - }, - "Registering": { - "status": "none", - "text": "Azure Blob Storage content will not be registered." - } - }, - "WEKO": { - "Permissions": { - "status": "NA" - }, - "View / download file versions": { - "status": "NA" - }, - "Add / update files": { - "status": "partial", - "text": "Adding/updating indices/items in the project via GakuNin RDM will be reflected in WEKO." - }, - "Delete files": { - "status": "partial", - "text": "Items deleted via GakuNin RDM will be deleted in WEKO." - }, - "Logs": { - "status": "partial", - "text": "The GakuNin RDM keeps track of changes you make to your WEKO index through the GakuNin RDM, but not for changes made using WEKO directly." - }, - "Forking": { - "status": "partial", - "text": "Forking a project or component does not copy WEKO authorization unless the user forking the project is the same user who authorized the WEKO add-on in the source project being forked." - }, - "Registering": { - "status": "none", - "text": "WEKO content will not be registered." - } - }, - "S3 Compatible Storage": { - "Forking": { - "status": "partial", - "text": "Forking a project or component does not copy S3 Compatible Storage authorization unless the user forking the project is the same user who authorized the S3 Compatible Storage add-on in the source project being forked." - }, - "Logs": { - "status": "partial", - "text": "The GakuNin RDM keeps track of changes you make to your S3 Compatible Storage buckets through the GakuNin RDM, but not for changes made using S3 Compatible Storage directly." - }, - "Registering": { - "status": "partial", - "text": "S3 Compatible Storage content will be registered, but version history will not be copied to the registration." - }, - "Add / update files": { - "status": "full", - "text": "Adding/updating files in the project via GakuNin RDM will be reflected in S3 Compatible Storage." - }, - "View / download file versions": { - "status": "partial", - "text": "The S3 add-on supports file versions if versioning is enabled for your S3 Compatible Storage buckets." - }, - "Delete files": { - "status": "full", - "text": "Files deleted via GakuNin RDM will be deleted in S3 Compatible Storage." - }, - "Permissions": { - "status": "partial", - "text": "Making a GakuNin RDM project public or private is independent of making an S3 Compatible Storage bucket public or private. The GakuNin RDM does not alter the permissions of linked S3 Compatible Storage buckets." - } - }, - "My MinIO": { - "Forking": { - "status": "partial", - "text": "Forking a project or component does not copy My MinIO authorization unless the user forking the project is the same user who authorized the My MinIO add-on in the source project being forked." - }, - "Logs": { - "status": "partial", - "text": "The GakuNin RDM keeps track of changes you make to your My MinIO buckets through the GakuNin RDM, but not for changes made using My MinIO directly." - }, - "Registering": { - "status": "partial", - "text": "My MinIO content will be registered, but version history will not be copied to the registration." - }, - "Add / update files": { - "status": "full", - "text": "Adding/updating files in the project via GakuNin RDM will be reflected in My MinIO." - }, - "View / download file versions": { - "status": "partial", - "text": "The S3 add-on supports file versions if versioning is enabled for your My MinIO buckets." - }, - "Delete files": { - "status": "full", - "text": "Files deleted via GakuNin RDM will be deleted in My MinIO." - }, - "Permissions": { - "status": "partial", - "text": "Making a GakuNin RDM project public or private is independent of making an My MinIO bucket public or private. The GakuNin RDM does not alter the permissions of linked My MinIO buckets." - } - }, - "JupyterHub": { - "Permissions": { - "status": "none", - "text": "The GakuNin RDM does not affect the permissions of JupyterHub." - }, - "View / download file versions": { - "status": "none", - "text": "The JupyterHub add-on does not provide Storage Features." - }, - "Add / update files": { - "status": "none", - "text": "The JupyterHub add-on does not provide Storage Features." - }, - "Delete files": { - "status": "none", - "text": "The JupyterHub add-on does not provide Storage Features." - }, - "Logs": { - "status": "none", - "text": "The JupyterHub add-on does not provide Storage Features." - }, - "Forking": { - "status": "partial", - "text": "Forking a project or component copies information about linked JupyterHub but the GakuNin RDM does not affect authentication of JupyterHub." - }, - "Registering": { - "status": "none", - "text": "JupyterHub information will not be registered." - } - }, - "Nextcloud": { - "Forking": { - "status": "partial", - "text": "Forking a project or component does not copy Nextcloud authorization unless the user forking the project is the same user who authorized the Nextcloud add-on in the source project being forked." - }, - "Logs": { - "status": "partial", - "text": "GakuNin RDM keeps track of changes you make to your Nextcloud content through GakuNin RDM, but not for changes made using Nextcloud directly." - }, - "Registering": { - "status": "partial", - "text": "Nextcloud content will be registered, but version history will not be copied to the registration." - }, - "Add / update files": { - "status": "full", - "text": "Adding/updating files in the project via GakuNin RDM will be reflected in Nextcloud." - }, - "View / download file versions": { - "status": "partial", - "text": "Nextcloud files can be viewed/downloaded via GakuNin RDM, but version history is not supported by the Nextcloud WebDAV API." - }, - "Delete files": { - "status": "full", - "text": "Files deleted via GakuNin RDM will be deleted in Nextcloud." - }, - "Permissions": { - "status": "partial", - "text": "Making a GakuNin RDM project public or private is independent of Nextcloud privacy. The GakuNin RDM does not alter the permissions of linked Nextcloud folders." - } - }, - "IQB-RIMS": { - "Permissions": { - "status": "partial", - "text": "Making an GakuNin RDM project public or private is independent of Google Drive privacy. The GakuNin RDM does not alter the permissions of linked Google Drive folders." - }, - "View / download file versions": { - "status": "full", - "text": "IQB-RIMS files and their versions can be viewed/downloaded via GakuNin RDM." - }, - "Add / update files": { - "status": "full", - "text": "Adding/updating files in the project via GakuNin RDM will be reflected in Google Drive." - }, - "Delete files": { - "status": "full", - "text": "Files deleted via GakuNin RDM will be deleted in Google Drive." - }, - "Logs": { - "status": "partial", - "text": "The GakuNin RDM keeps track of changes you make to your Google Drive content through the GakuNin RDM, but not for changes made using Google Drive directly." - }, - "Forking": { - "status": "partial", - "text": "Forking a project or component does not copy Google Drive authorization unless the user forking the project is the same user who authorized the IQB-RIMS add-on in the source project being forked." - }, - "Registering": { - "status": "partial", - "text": "IQB-RIMS content will be registered, but version history will not be copied to the registration." - } - } - }, - "disclaimers": [ - "This add-on connects your GakuNin RDM project to an external service. Use of this service is bound by its terms and conditions. The GakuNin RDM is not responsible for the service or for your use thereof.", - "This add-on allows you to store files using an external service. Files added to this add-on are not stored within the GakuNin RDM." - ] -} diff --git a/StorageAddon/osf.io/config/website/static/storageAddons.json b/StorageAddon/osf.io/config/website/static/storageAddons.json deleted file mode 100644 index 02c7156..0000000 --- a/StorageAddon/osf.io/config/website/static/storageAddons.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "bitbucket": { - "fullName": "Bitbucket", - "externalView": true - }, - "box": { - "fullName": "Box", - "externalView": false - }, - "dataverse": { - "fullName": "Dataverse", - "externalView": false - }, - "dropbox": { - "fullName": "Dropbox", - "externalView": false - }, - "figshare": { - "fullName": "figshare", - "externalView": true - }, - "github": { - "fullName": "GitHub", - "externalView": true - }, - "gitlab": { - "fullName": "GitLab", - "externalView": true - }, - "googledrive": { - "fullName": "Google Drive", - "externalView": true - }, - "osfstorage": { - "fullName": "NII Storage", - "externalView": false - }, - "owncloud": { - "fullName": "ownCloud", - "externalView": false - }, - "s3": { - "fullName": "Amazon S3", - "externalView": false - }, - "onedrive": { - "fullName": "OneDrive", - "externalView": true - }, - "swift": { - "fullName": "OpenStack Swift", - "externalView": false - }, - "azureblobstorage": { - "fullName": "Azure Blob Storage", - "externalView": false - }, - "s3compat": { - "fullName": "S3 Compatible Storage", - "externalView": false - }, - "myminio": { - "fullName": "My MinIO", - "externalView": false - }, - "weko": { - "fullName": "WEKO", - "externalView": false - }, - "nextcloud": { - "fullName": "Nextcloud", - "externalView": false - }, - "iqbrims": { - "fullName": "IQB-RIMS", - "externalView": false - }, - "nextcloudinstitutions": { - "fullName": "Nextcloud for Institutions", - "externalView": false - }, - "dropboxbusiness": { - "fullName": "Dropbox Business", - "externalView": false - } -} diff --git a/StorageAddon/osf.io/config/website/translations/ja/LC_MESSAGES/js_messages.po b/StorageAddon/osf.io/config/website/translations/ja/LC_MESSAGES/js_messages.po deleted file mode 100644 index 7c0b988..0000000 --- a/StorageAddon/osf.io/config/website/translations/ja/LC_MESSAGES/js_messages.po +++ /dev/null @@ -1,8982 +0,0 @@ -# Japanese translations for . -# Copyright (C) 2020 ORGANIZATION -# This file is distributed under the same license as the project. -# FIRST AUTHOR , 2020. -# -msgid "" -msgstr "" -"Project-Id-Version: 0.6.0\n" -"Report-Msgid-Bugs-To: rocs-office@nii.ac.jp\n" -"POT-Creation-Date: 2021-03-13 05:48+0000\n" -"PO-Revision-Date: 2020-09-03 12:45+0900\n" -"Last-Translator: Shunta Nishikawa\n" -"Language: ja\n" -"Language-Team: RCOS \n" -"Plural-Forms: nplurals=1; plural=0\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.5.1\n" - -#: addons/twofactor/static/twoFactorUserConfig.js:148 -#: addons/twofactor/static/twoFactorUserConfig.js:190 -#: admin/static/js/rdm_addons/rdm-addons-page.js:71 -#: website/static/js/accountSettings.js:286 -#: website/static/js/accountSettings.js:351 -#: website/static/js/accountSettings.js:477 -#: website/static/js/accountSettings.js:549 -#: website/static/js/addProjectPlugin.js:347 -#: website/static/js/addonPermissions.js:55 -#: website/static/js/addonSettings.js:71 website/static/js/addonSettings.js:134 -#: website/static/js/apiApplication.js:249 -#: website/static/js/apiApplication.js:420 -#: website/static/js/apiApplication.js:487 -#: website/static/js/apiPersonalToken.js:240 -#: website/static/js/apiPersonalToken.js:411 -#: website/static/js/apiPersonalToken.js:438 -#: website/static/js/citationsNodeConfig.js:169 -#: website/static/js/citationsNodeConfig.js:187 -#: website/static/js/contribManager.js:433 website/static/js/fangorn.js:546 -#: website/static/js/fangorn.js:551 website/static/js/fangorn.js:1215 -#: website/static/js/fangorn.js:1238 website/static/js/fangorn.js:1291 -#: website/static/js/fangorn.js:1310 website/static/js/fangorn.js:2009 -#: website/static/js/filepage/index.js:208 -#: website/static/js/folderPickerNodeConfig.js:510 -#: website/static/js/folderPickerNodeConfig.js:566 -#: website/static/js/institutionProjectSettings.js:102 -#: website/static/js/licensePicker.js:243 website/static/js/myProjects.js:1560 -#: website/static/js/myProjects.js:1608 website/static/js/myProjects.js:1632 -#: website/static/js/nodeControl.js:227 -#: website/static/js/oauthAddonNodeConfig.js:156 -#: website/static/js/oauthAddonNodeConfig.js:174 -#: website/static/js/osfHelpers.js:796 website/static/js/osfHelpers.js:897 -#: website/static/js/pages/profile-settings-addons-page.js:35 -#: website/static/js/pages/profile-settings-addons-page.js:101 -#: website/static/js/pages/project-addons-page.js:41 -#: website/static/js/pages/project-addons-page.js:66 -#: website/static/js/privateLinkTable.js:119 website/static/js/profile.js:373 -#: website/static/js/profile.js:743 website/static/js/profile.js:975 -#: website/static/js/project.js:39 website/static/js/project.js:143 -#: website/static/js/project.js:253 -#: website/static/js/wikiSettingsTreebeard.js:31 -msgid "Cancel" -msgstr "キャンセル" - -#: addons/twofactor/static/twoFactorUserConfig.js:178 -msgid "Enable Two-factor Authentication" -msgstr "2要素認証を有効にする" - -#: addons/twofactor/static/twoFactorUserConfig.js:179 -msgid "" -"Enabling two-factor authentication will not immediately activate this " -"feature for your account. You will need to follow the steps that appear " -"below to complete the activation of two-factor authentication for your " -"account." -msgstr "" -"2要素認証を有効にしても、アカウントのこの機能はすぐには有効になりません。 " -"アカウントの2要素認証のアクティベーションを完了するには、以下に表示される手順に従う必要があります。" - -#: addons/twofactor/static/twoFactorUserConfig.js:187 -msgid "Enable" -msgstr "有効にする" - -#: addons/wiki/static/WikiEditor.js:86 -msgid "Live editing mode" -msgstr "ライブ編集モード" - -#: addons/wiki/static/WikiEditor.js:88 -msgid "Attempting to connect" -msgstr "接続試行中" - -#: addons/wiki/static/WikiEditor.js:90 -msgid "Unsupported browser" -msgstr "サポートされていないブラウザ" - -#: addons/wiki/static/WikiEditor.js:92 -msgid "Unavailable: Live editing" -msgstr "利用不可:ライブ編集" - -#: addons/wiki/static/WikiEditor.js:153 -msgid "The wiki content could not be loaded." -msgstr "Wikiコンテンツをロードできませんでした。" - -#: addons/wiki/static/WikiEditor.js:155 -msgid "Could not GET wiki contents." -msgstr "Wikiコンテンツを取得できませんでした。" - -#: addons/wiki/static/WikiEditor.js:176 -msgid "There are unsaved changes to your wiki. If you exit " -msgstr "wikiに未保存の変更があります。" - -#: addons/wiki/static/WikiEditor.js:177 -msgid "the page now, those changes may be lost." -msgstr "ここでページを終了すると、これらの変更が失われる可能性があります。" - -#: addons/wiki/static/wikiPage.js:94 -#: website/static/js/pages/project-dashboard-page.js:733 -msgid "" -"*Add important information, links, or images here to describe your " -"project.*" -msgstr "*重要な情報、リンク、または画像をここに追加して、プロジェクトを説明してください。*" - -#: addons/wiki/static/wikiPage.js:96 -#: website/static/js/pages/project-dashboard-page.js:735 -msgid "*No wiki content.*" -msgstr "* Wikiコンテンツはありません。*" - -#: addons/wiki/static/wikiPage.js:220 -msgid "Live preview" -msgstr "ライブプレビュー" - -#: addons/wiki/static/wikiPage.js:222 -msgid "Current version" -msgstr "現在のバージョン" - -#: addons/wiki/static/wikiPage.js:224 -msgid "Previous version" -msgstr "前のバージョン" - -#: addons/wiki/static/wikiPage.js:226 -msgid "Version " -msgstr "バージョン" - -#: addons/wiki/static/pagedown-ace/Markdown.Editor.js:48 -msgid "Strong " -msgstr "強調構文 " - -#: addons/wiki/static/pagedown-ace/Markdown.Editor.js:51 -msgid "Emphasis " -msgstr "強調構文 " - -#: addons/wiki/static/pagedown-ace/Markdown.Editor.js:54 -msgid "Spellcheck: Toggle spellcheck on and off" -msgstr "スペルチェック:スペルチェックのオンとオフを切り替えます" - -#: addons/wiki/static/pagedown-ace/Markdown.Editor.js:56 -msgid "Hyperlink " -msgstr "ハイパーリンク " - -#: addons/wiki/static/pagedown-ace/Markdown.Editor.js:60 -msgid "Blockquote
" -msgstr "引用構文
" - -#: addons/wiki/static/pagedown-ace/Markdown.Editor.js:63 -msgid "Code Sample
"
-msgstr "コードサンプル 
"
-
-#: addons/wiki/static/pagedown-ace/Markdown.Editor.js:66
-msgid "Image "
-msgstr "画像 "
-
-#: addons/wiki/static/pagedown-ace/Markdown.Editor.js:70
-msgid "Numbered List 
    " -msgstr "段落番号
      " - -#: addons/wiki/static/pagedown-ace/Markdown.Editor.js:71 -msgid "Bulleted List