diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 988ee0c8aa..8429323e8b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -25,8 +25,8 @@ jobs: - name: clone and build run: | - git clone --depth=1 --branch=master git://github.com/haiwen/seafile-test-deploy /tmp/seafile-test-deploy - cd /tmp/seafile-test-deploy && git fetch origin python3:python3 && git checkout python3 + git clone --depth=1 --branch=8.0 git://github.com/haiwen/seafile-test-deploy /tmp/seafile-test-deploy + cd /tmp/seafile-test-deploy && git fetch origin 8.0:8.0 && git checkout 8.0 ./bootstrap.sh - name: pip install diff --git a/frontend/src/components/dialog/share-to-other-server.js b/frontend/src/components/dialog/share-to-other-server.js index 9d3abe6301..becf89dfe0 100644 --- a/frontend/src/components/dialog/share-to-other-server.js +++ b/frontend/src/components/dialog/share-to-other-server.js @@ -1,6 +1,7 @@ import React, { Fragment } from 'react'; +import Select from 'react-select'; import PropTypes from 'prop-types'; -import { gettext } from '../../utils/constants'; +import { gettext, ocmRemoteServers } from '../../utils/constants'; import { Input } from 'reactstrap'; import { Button } from 'reactstrap'; import { seafileAPI } from '../../utils/seafile-api.js'; @@ -34,7 +35,7 @@ class ShareItem extends React.Component { let item = this.props.item; return ( - {item.to_sever_url} + {item.to_server_name} {item.to_user} {Utils.sharePerms(item.permission)} {/* @@ -67,9 +68,9 @@ class ShareList extends React.Component { - + - + @@ -155,7 +156,7 @@ class ShareToOtherServer extends React.Component { handleURLChange = (e) => { this.setState({ - toServerURL: e.target.value, + toServerURL: e.value, }); } @@ -185,17 +186,17 @@ class ShareToOtherServer extends React.Component {
{gettext('Server URL')}{gettext('Server')} {gettext('User Email')}{gettext('Permission')}{gettext('Permission')}
- + - + diff --git a/frontend/src/pages/share-with-ocm/shared-with-ocm.js b/frontend/src/pages/share-with-ocm/shared-with-ocm.js index 83756190c5..bb88449c7e 100644 --- a/frontend/src/pages/share-with-ocm/shared-with-ocm.js +++ b/frontend/src/pages/share-with-ocm/shared-with-ocm.js @@ -17,7 +17,7 @@ class Content extends Component { const emptyTip = (

{gettext('No libraries have been shared with you')}

-

{gettext('No libraries have been shared directly with you. You can find more shared libraries at "Shared with groups".')}

+

{gettext('No libraries have been shared with you from other servers.')}

); diff --git a/frontend/src/utils/constants.js b/frontend/src/utils/constants.js index b87a89ea9a..ba2e79cc63 100644 --- a/frontend/src/utils/constants.js +++ b/frontend/src/utils/constants.js @@ -68,6 +68,7 @@ export const enableShowContactEmailWhenSearchUser = window.app.pageOptions.enabl export const maxUploadFileSize = window.app.pageOptions.maxUploadFileSize; export const maxNumberOfFilesForFileupload = window.app.pageOptions.maxNumberOfFilesForFileupload; export const enableOCM = window.app.pageOptions.enableOCM; +export const ocmRemoteServers = window.app.pageOptions.ocmRemoteServers; export const curNoteMsg = window.app.pageOptions.curNoteMsg; export const curNoteID = window.app.pageOptions.curNoteID; diff --git a/seahub/api2/endpoints/ocm.py b/seahub/api2/endpoints/ocm.py index 9536b1c562..443f5098c7 100644 --- a/seahub/api2/endpoints/ocm.py +++ b/seahub/api2/endpoints/ocm.py @@ -15,7 +15,7 @@ from seahub.api2.authentication import TokenAuthentication from seahub.api2.throttling import UserRateThrottle from seahub.api2.utils import api_error -from seaserv import seafile_api, ccnet_api +from seaserv import seafile_api from seahub.utils.repo import get_available_repo_perms, get_repo_owner from seahub.base.templatetags.seahub_tags import email2nickname @@ -25,7 +25,7 @@ from seahub.ocm.settings import ENABLE_OCM, SUPPORTED_OCM_PROTOCOLS, \ OCM_SEAFILE_PROTOCOL, OCM_RESOURCE_TYPE_LIBRARY, OCM_API_VERSION, \ OCM_SHARE_TYPES, OCM_ENDPOINT, OCM_PROVIDER_ID, OCM_NOTIFICATION_TYPE_LIST, \ OCM_NOTIFICATION_SHARE_UNSHARED, OCM_NOTIFICATION_SHARE_DECLINED, OCM_PROTOCOL_URL, \ - OCM_NOTIFICATION_URL, OCM_CREATE_SHARE_URL + OCM_NOTIFICATION_URL, OCM_CREATE_SHARE_URL, OCM_REMOTE_SERVERS logger = logging.getLogger(__name__) @@ -36,6 +36,12 @@ SEAFILE_PERMISSION2OCM_PERMISSION = { } +def get_server_name_by_url(url): + for name_domain_dict in OCM_REMOTE_SERVERS: + if name_domain_dict['server_url'] == url: + return name_domain_dict['server_name'] + + def gen_shared_secret(length=23): return ''.join(random.choice(string.ascii_lowercase + string.digits) for i in range(length)) @@ -128,7 +134,6 @@ class OCMSharesView(APIView): error_msg = 'providerId invalid.' return api_error(status.HTTP_400_BAD_REQUEST, error_msg) - """ other ocm protocol fields currently not used @@ -289,7 +294,10 @@ class OCMSharesPrepareView(APIView): ocm_share_list = [] for ocm_share in ocm_shares: - ocm_share_list.append(ocm_share.to_dict()) + ocm_info = ocm_share.to_dict() + ocm_info['to_server_name'] = get_server_name_by_url(ocm_share.to_server_url) + ocm_share_list.append(ocm_info) + return Response({'ocm_share_list': ocm_share_list}) def post(self, request): @@ -366,8 +374,8 @@ class OCMSharesPrepareView(APIView): 'sender': from_user, 'ownerDisplayName': email2nickname(repo_owner), 'senderDisplayName': email2nickname(from_user), - 'shareType': consumer_protocol['resourceTypes']['shareTypes'][0], # currently only support user type - 'resourceType': consumer_protocol['resourceTypes']['name'], # currently only support repo + 'shareType': consumer_protocol['resourceTypes']['shareTypes'][0], # currently only support user type + 'resourceType': consumer_protocol['resourceTypes']['name'], # currently only support repo 'protocol': { 'name': OCM_SEAFILE_PROTOCOL, 'options': { @@ -396,7 +404,10 @@ class OCMSharesPrepareView(APIView): permission=permission, ) - return Response(ocm_share.to_dict()) + ocm_info = ocm_share.to_dict() + ocm_info['to_server_name'] = get_server_name_by_url(ocm_share.to_server_url) + + return Response(ocm_info) class OCMSharePrepareView(APIView): diff --git a/seahub/ocm/models.py b/seahub/ocm/models.py index 6574ae048d..cb98c1df46 100644 --- a/seahub/ocm/models.py +++ b/seahub/ocm/models.py @@ -48,7 +48,7 @@ class OCMShare(models.Model): 'shared_secret': self.shared_secret, 'from_user': self.from_user, 'to_user': self.to_user, - 'to_sever_url': self.to_server_url, + 'to_server_url': self.to_server_url, 'repo_id': self.repo_id, 'repo_name': self.repo_name, 'path': self.path, diff --git a/seahub/ocm/settings.py b/seahub/ocm/settings.py index 7a21b43939..269468eb2a 100644 --- a/seahub/ocm/settings.py +++ b/seahub/ocm/settings.py @@ -32,3 +32,5 @@ VIA_REPO_TOKEN_URL = { 'UPLOAD_LINK': 'api/v2.1/via-repo-token/upload-link/', 'DOWNLOAD_LINK': 'api/v2.1/via-repo-token/download-link/', } + +OCM_REMOTE_SERVERS = getattr(settings, 'OCM_REMOTE_SERVERS', {}) diff --git a/seahub/templates/base_for_react.html b/seahub/templates/base_for_react.html index ef8c04ae1a..24d1434106 100644 --- a/seahub/templates/base_for_react.html +++ b/seahub/templates/base_for_react.html @@ -102,6 +102,16 @@ repoPasswordMinLength: {{repo_password_min_length}}, canAddPublicRepo: {% if can_add_public_repo %} true {% else %} false {% endif %}, enableOCM: {% if enable_ocm %} true {% else %} false {% endif %}, + ocmRemoteServers: (function () { + var servers = []; + {% for server in ocm_remote_servers %} + servers.push({ + 'label': '{{server.server_name|escapejs}}', + 'value': '{{server.server_url|escapejs}}', + }); + {% endfor %} + return servers; + })(), canInvitePeople: {% if enable_guest_invitation and user.permissions.can_invite_guest %} true {% else %} false {% endif %}, customNavItems: {% if custom_nav_items %} JSON.parse('{{ custom_nav_items | escapejs }}') {% else %} {{'[]'}} {% endif %}, enableShowContactEmailWhenSearchUser: {% if enable_show_contact_email_when_search_user %} true {% else %} false {% endif %}, diff --git a/seahub/views/__init__.py b/seahub/views/__init__.py index f0e94448c5..f0bb0de8b2 100644 --- a/seahub/views/__init__.py +++ b/seahub/views/__init__.py @@ -61,7 +61,7 @@ from seahub.settings import AVATAR_FILE_STORAGE, \ from seahub.wopi.settings import ENABLE_OFFICE_WEB_APP from seahub.onlyoffice.settings import ENABLE_ONLYOFFICE -from seahub.ocm.settings import ENABLE_OCM +from seahub.ocm.settings import ENABLE_OCM, OCM_REMOTE_SERVERS from seahub.constants import HASH_URLS, PERMISSION_READ from seahub.weixin.settings import ENABLE_WEIXIN @@ -1210,4 +1210,5 @@ def react_fake_view(request, **kwargs): 'additional_app_bottom_links': ADDITIONAL_APP_BOTTOM_LINKS, 'additional_about_dialog_links': ADDITIONAL_ABOUT_DIALOG_LINKS, 'enable_ocm': ENABLE_OCM, + 'ocm_remote_servers': OCM_REMOTE_SERVERS, })
{gettext('Server URL')}{gettext('Server')} {gettext('User Email')}{gettext('Permission')}{gettext('Permission')}
-