diff --git a/seahub/api2/endpoints/internal_api.py b/seahub/api2/endpoints/internal_api.py index bdcb7bdc467..7f5fe35c56a 100644 --- a/seahub/api2/endpoints/internal_api.py +++ b/seahub/api2/endpoints/internal_api.py @@ -14,6 +14,9 @@ from seaserv import seafile_api from seahub.utils.repo import parse_repo_perm from seahub.views.file import send_file_access_msg +from seahub.utils.user_permissions import get_user_role +from seahub.role_permissions.settings import DEFAULT_ENABLED_ROLE_PERMISSIONS +from seahub.utils.file_size import get_quota_from_string logger = logging.getLogger(__name__) @@ -198,3 +201,26 @@ def post(self, request, repo_id): return api_error(status.HTTP_403_FORBIDDEN, error_msg) return Response({'user': rat.app_name}) + + +class InternalDownloadRateLimitView(APIView): + authentication_classes = (SessionCRSFCheckFreeAuthentication, ) + + def post(self, request): + auth = request.META.get('HTTP_AUTHORIZATION', '').split() + is_valid = is_valid_internal_jwt(auth) + if not is_valid: + error_msg = 'Permission denied.' + return api_error(status.HTTP_403_FORBIDDEN, error_msg) + + traffic_info_dict = {} + for role, v in DEFAULT_ENABLED_ROLE_PERMISSIONS.items(): + rate_limit = {} + if 'monthly_rate_limit' in v: + monthly_rate_limit = get_quota_from_string(v['monthly_rate_limit']) + rate_limit['monthly_rate_limit'] = monthly_rate_limit + if 'monthly_rate_limit_per_user' in v: + monthly_rate_limit_per_user = get_quota_from_string(v['monthly_rate_limit_per_user']) + rate_limit['monthly_rate_limit_per_user'] = monthly_rate_limit_per_user + traffic_info_dict[role] = rate_limit + return Response(traffic_info_dict) diff --git a/seahub/role_permissions/settings.py b/seahub/role_permissions/settings.py index 479ea6fd371..358d4b10930 100644 --- a/seahub/role_permissions/settings.py +++ b/seahub/role_permissions/settings.py @@ -46,6 +46,8 @@ def merge_roles(default, custom): 'can_publish_repo': True, 'upload_rate_limit': 0, 'download_rate_limit': 0, + 'monthly_rate_limit': '', + 'monthly_rate_limit_per_user': '' }, GUEST_USER: { 'can_add_repo': False, @@ -68,6 +70,8 @@ def merge_roles(default, custom): 'can_publish_repo': False, 'upload_rate_limit': 0, 'download_rate_limit': 0, + 'monthly_rate_limit': '', + 'monthly_rate_limit_per_user': '' }, } diff --git a/seahub/urls.py b/seahub/urls.py index 508a7fb9a4f..f4f7f5ae7b7 100644 --- a/seahub/urls.py +++ b/seahub/urls.py @@ -5,7 +5,7 @@ from seahub.ai.apis import ImageCaption, GenerateSummary, ImageTags from seahub.api2.endpoints.share_link_auth import ShareLinkUserAuthView, ShareLinkEmailAuthView from seahub.api2.endpoints.internal_api import InternalUserListView, InternalCheckShareLinkAccess, \ - InternalCheckFileOperationAccess + InternalCheckFileOperationAccess, InternalDownloadRateLimitView from seahub.auth.views import multi_adfs_sso, login_simple_check from seahub.views import * from seahub.views.mobile import mobile_login @@ -791,6 +791,7 @@ re_path(r'^api/v2.1/internal/user-list/$', InternalUserListView.as_view(), name="api-v2.1-internal-user-list"), re_path(r'^api/v2.1/internal/check-share-link-access/$', InternalCheckShareLinkAccess.as_view(), name="api-v2.1-internal-share-link-info"), re_path(r'^api/v2.1/internal/repos/(?P[-0-9a-f]{36})/check-access/$', InternalCheckFileOperationAccess.as_view(), name="api-v2.1-internal-check-file-op-access"), + re_path(r'^api/v2.1/internal/download-limit/$', InternalDownloadRateLimitView.as_view(), name='api-v2.1-internal-download-limit'), ### system admin ### re_path(r'^sys/seafadmin/delete/(?P[-0-9a-f]{36})/$', sys_repo_delete, name='sys_repo_delete'), diff --git a/seahub/utils/file_size.py b/seahub/utils/file_size.py index 89061e1e0f5..8e09f416514 100644 --- a/seahub/utils/file_size.py +++ b/seahub/utils/file_size.py @@ -48,6 +48,8 @@ def get_quota_from_string(quota_str): quota = int(quota_str[:-1]) * get_file_size_unit('gb') elif quota_str.endswith('m'): quota = int(quota_str[:-1]) * get_file_size_unit('mb') + elif quota_str.endswith('k'): + quota = int(quota_str[:-1]) * get_file_size_unit('kb') else: return None diff --git a/tests/seahub/role_permissions/test_utils.py b/tests/seahub/role_permissions/test_utils.py index 4f0a03a780b..2b0fd748e6d 100644 --- a/tests/seahub/role_permissions/test_utils.py +++ b/tests/seahub/role_permissions/test_utils.py @@ -11,4 +11,4 @@ def test_get_available_role(self): assert DEFAULT_USER in get_available_roles() def test_get_enabled_role_permissions_by_role(self): - assert len(list(get_enabled_role_permissions_by_role(DEFAULT_USER).keys())) == 20 + assert len(list(get_enabled_role_permissions_by_role(DEFAULT_USER).keys())) == 22