mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-20 19:08:21 +00:00
Add role permissions
This commit is contained in:
@@ -6,10 +6,10 @@ from rest_framework.exceptions import APIException
|
|||||||
|
|
||||||
import seaserv
|
import seaserv
|
||||||
from seahub.base.accounts import User
|
from seahub.base.accounts import User
|
||||||
from seahub.constants import GUEST_USER
|
|
||||||
from seahub.api2.models import Token, TokenV2
|
from seahub.api2.models import Token, TokenV2
|
||||||
from seahub.api2.utils import get_client_ip
|
from seahub.api2.utils import get_client_ip
|
||||||
from seahub.utils import within_time_range
|
from seahub.utils import within_time_range
|
||||||
|
from seahub.utils.user_permissions import populate_user_permissions
|
||||||
try:
|
try:
|
||||||
from seahub.settings import MULTI_TENANCY
|
from seahub.settings import MULTI_TENANCY
|
||||||
except ImportError:
|
except ImportError:
|
||||||
@@ -65,16 +65,6 @@ class TokenAuthentication(BaseAuthentication):
|
|||||||
|
|
||||||
return self.authenticate_v1(request, key)
|
return self.authenticate_v1(request, key)
|
||||||
|
|
||||||
def _populate_user_permissions(self, user):
|
|
||||||
"""Disable some operations if ``user`` is a guest.
|
|
||||||
"""
|
|
||||||
if user.role == GUEST_USER:
|
|
||||||
user.permissions.can_add_repo = lambda: False
|
|
||||||
user.permissions.can_add_group = lambda: False
|
|
||||||
user.permissions.can_view_org = lambda: False
|
|
||||||
user.permissions.can_use_global_address_book = lambda: False
|
|
||||||
user.permissions.can_generate_shared_link = lambda: False
|
|
||||||
|
|
||||||
def authenticate_v1(self, request, key):
|
def authenticate_v1(self, request, key):
|
||||||
try:
|
try:
|
||||||
token = Token.objects.get(key=key)
|
token = Token.objects.get(key=key)
|
||||||
@@ -91,7 +81,7 @@ class TokenAuthentication(BaseAuthentication):
|
|||||||
if orgs:
|
if orgs:
|
||||||
user.org = orgs[0]
|
user.org = orgs[0]
|
||||||
|
|
||||||
self._populate_user_permissions(user)
|
populate_user_permissions(user)
|
||||||
|
|
||||||
if user.is_active:
|
if user.is_active:
|
||||||
return (user, token)
|
return (user, token)
|
||||||
@@ -116,7 +106,7 @@ class TokenAuthentication(BaseAuthentication):
|
|||||||
if orgs:
|
if orgs:
|
||||||
user.org = orgs[0]
|
user.org = orgs[0]
|
||||||
|
|
||||||
self._populate_user_permissions(user)
|
populate_user_permissions(user)
|
||||||
|
|
||||||
if user.is_active:
|
if user.is_active:
|
||||||
need_save = False
|
need_save = False
|
||||||
|
@@ -6,14 +6,16 @@ from django.utils.translation import ugettext_lazy as _
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.sites.models import RequestSite
|
from django.contrib.sites.models import RequestSite
|
||||||
from django.contrib.sites.models import Site
|
from django.contrib.sites.models import Site
|
||||||
|
|
||||||
from seahub.auth import login
|
|
||||||
from registration import signals
|
|
||||||
import seaserv
|
import seaserv
|
||||||
from seaserv import ccnet_threaded_rpc, unset_repo_passwd, is_passwd_set, \
|
from seaserv import ccnet_threaded_rpc, unset_repo_passwd, is_passwd_set, \
|
||||||
seafile_api
|
seafile_api
|
||||||
|
from constance import config
|
||||||
|
from registration import signals
|
||||||
|
|
||||||
|
from seahub.auth import login
|
||||||
|
from seahub.constants import DEFAULT_USER
|
||||||
from seahub.profile.models import Profile, DetailedProfile
|
from seahub.profile.models import Profile, DetailedProfile
|
||||||
|
from seahub.role_permissions.utils import get_enabled_role_permissions_by_role
|
||||||
from seahub.utils import is_valid_username, is_user_password_strong, \
|
from seahub.utils import is_valid_username, is_user_password_strong, \
|
||||||
clear_token, get_system_admins
|
clear_token, get_system_admins
|
||||||
from seahub.utils.mail import send_html_email_with_dj_template, MAIL_PRIORITY
|
from seahub.utils.mail import send_html_email_with_dj_template, MAIL_PRIORITY
|
||||||
@@ -27,8 +29,6 @@ try:
|
|||||||
except ImportError:
|
except ImportError:
|
||||||
MULTI_TENANCY = False
|
MULTI_TENANCY = False
|
||||||
|
|
||||||
from constance import config
|
|
||||||
|
|
||||||
UNUSABLE_PASSWORD = '!' # This will never be a valid hash
|
UNUSABLE_PASSWORD = '!' # This will never be a valid hash
|
||||||
|
|
||||||
class UserManager(object):
|
class UserManager(object):
|
||||||
@@ -102,22 +102,44 @@ class UserPermissions(object):
|
|||||||
self.user = user
|
self.user = user
|
||||||
|
|
||||||
def can_add_repo(self):
|
def can_add_repo(self):
|
||||||
return True
|
return get_enabled_role_permissions_by_role(DEFAULT_USER)['can_add_repo']
|
||||||
|
|
||||||
def can_add_group(self):
|
def can_add_group(self):
|
||||||
return True
|
return get_enabled_role_permissions_by_role(DEFAULT_USER)['can_add_group']
|
||||||
|
|
||||||
def can_generate_shared_link(self):
|
def can_generate_shared_link(self):
|
||||||
return True
|
return get_enabled_role_permissions_by_role(DEFAULT_USER)['can_generate_shared_link']
|
||||||
|
|
||||||
def can_use_global_address_book(self):
|
def can_use_global_address_book(self):
|
||||||
return True
|
return get_enabled_role_permissions_by_role(DEFAULT_USER)['can_use_global_address_book']
|
||||||
|
|
||||||
def can_view_org(self):
|
def can_view_org(self):
|
||||||
if MULTI_TENANCY:
|
if MULTI_TENANCY:
|
||||||
return True if self.user.org is not None else False
|
return True if self.user.org is not None else False
|
||||||
|
|
||||||
return False if CLOUD_MODE else True
|
if CLOUD_MODE:
|
||||||
|
return False
|
||||||
|
|
||||||
|
return get_enabled_role_permissions_by_role(DEFAULT_USER)['can_view_org']
|
||||||
|
|
||||||
|
def can_drag_drop_folder_to_sync(self):
|
||||||
|
return get_enabled_role_permissions_by_role(DEFAULT_USER)['can_drag_drop_folder_to_sync']
|
||||||
|
|
||||||
|
def can_connect_with_android_clients(self):
|
||||||
|
return get_enabled_role_permissions_by_role(DEFAULT_USER)['can_connect_with_android_clients']
|
||||||
|
|
||||||
|
def can_connect_with_ios_clients(self):
|
||||||
|
return get_enabled_role_permissions_by_role(DEFAULT_USER)['can_connect_with_ios_clients']
|
||||||
|
|
||||||
|
def can_connect_with_desktop_clients(self):
|
||||||
|
return get_enabled_role_permissions_by_role(DEFAULT_USER)['can_connect_with_desktop_clients']
|
||||||
|
|
||||||
|
def can_invite_guest(self):
|
||||||
|
return get_enabled_role_permissions_by_role(DEFAULT_USER)['can_invite_guest']
|
||||||
|
|
||||||
|
def can_export_files_via_mobile_client(self):
|
||||||
|
return get_enabled_role_permissions_by_role(DEFAULT_USER)['can_export_files_via_mobile_client']
|
||||||
|
|
||||||
|
|
||||||
class User(object):
|
class User(object):
|
||||||
is_staff = False
|
is_staff = False
|
||||||
|
0
seahub/role_permissions/__init__.py
Normal file
0
seahub/role_permissions/__init__.py
Normal file
3
seahub/role_permissions/admin.py
Normal file
3
seahub/role_permissions/admin.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
0
seahub/role_permissions/migrations/__init__.py
Normal file
0
seahub/role_permissions/migrations/__init__.py
Normal file
3
seahub/role_permissions/models.py
Normal file
3
seahub/role_permissions/models.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.db import models
|
||||||
|
|
||||||
|
# Create your models here.
|
45
seahub/role_permissions/settings.py
Normal file
45
seahub/role_permissions/settings.py
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
import logging
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
from seahub.constants import DEFAULT_USER
|
||||||
|
|
||||||
|
# Get an instance of a logger
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
DEFAULT_ENABLED_ROLE_PERMISSIONS = {
|
||||||
|
DEFAULT_USER: {
|
||||||
|
'can_add_repo': True,
|
||||||
|
'can_add_group': True,
|
||||||
|
'can_view_org': True,
|
||||||
|
'can_use_global_address_book': True,
|
||||||
|
'can_generate_shared_link': True,
|
||||||
|
'can_invite_guest': False,
|
||||||
|
# followings are not implemented yet
|
||||||
|
'can_drag_drop_folder_to_sync': True,
|
||||||
|
'can_connect_with_android_clients': True,
|
||||||
|
'can_connect_with_ios_clients': True,
|
||||||
|
'can_connect_with_desktop_clients': True,
|
||||||
|
'can_export_files_via_mobile_client': True,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
_default_role_perms = DEFAULT_ENABLED_ROLE_PERMISSIONS.copy()
|
||||||
|
_default_role_perms.update(settings.ENABLED_ROLE_PERMISSIONS) # merge outter dict
|
||||||
|
|
||||||
|
def get_enabled_role_permissions():
|
||||||
|
ret = {}
|
||||||
|
for role, perms in _default_role_perms.iteritems():
|
||||||
|
default_perms = _default_role_perms['default'].copy()
|
||||||
|
default_perms.update(perms) # merge inner dict
|
||||||
|
ret[role] = default_perms
|
||||||
|
|
||||||
|
# check role permission syntax
|
||||||
|
for k in default_perms.keys():
|
||||||
|
if k not in DEFAULT_ENABLED_ROLE_PERMISSIONS[DEFAULT_USER].keys():
|
||||||
|
print '"%s" is not valid permission, please review the ENABLED_ROLE_PERMISSIONS setting.' % k
|
||||||
|
logger.warn('"%s" is not valid permission, please review the ENABLED_ROLE_PERMISSIONS setting.' % k)
|
||||||
|
|
||||||
|
return ret
|
||||||
|
|
||||||
|
ENABLED_ROLE_PERMISSIONS = get_enabled_role_permissions()
|
18
seahub/role_permissions/utils.py
Normal file
18
seahub/role_permissions/utils.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
from .settings import ENABLED_ROLE_PERMISSIONS
|
||||||
|
from seahub.constants import DEFAULT_USER
|
||||||
|
|
||||||
|
def get_available_roles():
|
||||||
|
"""Get available roles defined in `ENABLED_ROLE_PERMISSIONS`.
|
||||||
|
"""
|
||||||
|
return ENABLED_ROLE_PERMISSIONS.keys()
|
||||||
|
|
||||||
|
def get_enabled_role_permissions_by_role(role):
|
||||||
|
"""Get permissions dict(perm_name: bool) of a role.
|
||||||
|
"""
|
||||||
|
if not role:
|
||||||
|
role = DEFAULT_USER
|
||||||
|
|
||||||
|
if role not in ENABLED_ROLE_PERMISSIONS.keys():
|
||||||
|
assert False, '%s is not a valid role' % role
|
||||||
|
|
||||||
|
return ENABLED_ROLE_PERMISSIONS[role]
|
3
seahub/role_permissions/views.py
Normal file
3
seahub/role_permissions/views.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.shortcuts import render
|
||||||
|
|
||||||
|
# Create your views here.
|
@@ -503,6 +503,30 @@ ENABLE_GLOBAL_ADDRESSBOOK = True
|
|||||||
#####################
|
#####################
|
||||||
ENABLE_FOLDER_PERM = False
|
ENABLE_FOLDER_PERM = False
|
||||||
|
|
||||||
|
####################
|
||||||
|
# Role permissions #
|
||||||
|
####################
|
||||||
|
# default permissions:
|
||||||
|
# 'default': {
|
||||||
|
# 'can_add_repo': True,
|
||||||
|
# 'can_add_group': True,
|
||||||
|
# 'can_view_org': True,
|
||||||
|
# 'can_user_global_address_book': True,
|
||||||
|
# 'can_generate_shared_link': True,
|
||||||
|
# 'can_invite_guest': False,
|
||||||
|
# }
|
||||||
|
from seahub.constants import GUEST_USER
|
||||||
|
ENABLED_ROLE_PERMISSIONS = {
|
||||||
|
GUEST_USER: {
|
||||||
|
'can_add_repo': False,
|
||||||
|
'can_add_group': False,
|
||||||
|
'can_view_org': False,
|
||||||
|
'can_use_global_address_book': False,
|
||||||
|
'can_generate_shared_link': False,
|
||||||
|
'can_invite_guest': False,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
#####################
|
#####################
|
||||||
# Sudo Mode #
|
# Sudo Mode #
|
||||||
#####################
|
#####################
|
||||||
|
@@ -46,14 +46,19 @@
|
|||||||
<div class="user-role">
|
<div class="user-role">
|
||||||
{% if user.is_guest %}
|
{% if user.is_guest %}
|
||||||
<span class="user-role-cur-value">{% trans "Guest" %}</span>
|
<span class="user-role-cur-value">{% trans "Guest" %}</span>
|
||||||
{% else %}
|
{% elif user.is_default %}
|
||||||
<span class="user-role-cur-value">{% trans "Default" %}</span>
|
<span class="user-role-cur-value">{% trans "Default" %}</span>
|
||||||
|
{% else %}
|
||||||
|
<span class="user-role-cur-value">{{user.role}}</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<span title="{% trans "Edit"%}" class="user-role-edit-icon sf2-icon-edit op-icon vh"></span>
|
<span title="{% trans "Edit"%}" class="user-role-edit-icon sf2-icon-edit op-icon vh"></span>
|
||||||
</div>
|
</div>
|
||||||
<select name="role" class="user-role-select hide">
|
<select name="role" class="user-role-select hide">
|
||||||
<option value={{default_user}} {%if not user.is_guest %}selected="selected"{% endif %}>{% trans "Default" %}</option>
|
<option value={{default_user}} {%if user.is_default %}selected="selected"{% endif %}>{% trans "Default" %}</option>
|
||||||
<option value={{guest_user}} {%if user.is_guest %}selected="selected"{% endif %}>{% trans "Guest"%}</option>
|
<option value={{guest_user}} {%if user.is_guest %}selected="selected"{% endif %}>{% trans "Guest"%}</option>
|
||||||
|
{% for role in extra_user_roles %}
|
||||||
|
<option value={{role}} {%if user.role == role %}selected="selected"{% endif %}>{{ role }}</option>
|
||||||
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
{% else %}
|
{% else %}
|
||||||
--
|
--
|
||||||
|
26
seahub/utils/user_permissions.py
Normal file
26
seahub/utils/user_permissions.py
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
from seahub.constants import DEFAULT_USER, GUEST_USER
|
||||||
|
from seahub.utils import is_pro_version
|
||||||
|
|
||||||
|
def populate_user_permissions(user):
|
||||||
|
if is_pro_version():
|
||||||
|
from seahub_extra.auth_extra.utils import populate_user_permissions
|
||||||
|
populate_user_permissions(user)
|
||||||
|
else:
|
||||||
|
# use default user permissions
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_basic_user_roles():
|
||||||
|
"""Get predefined user roles.
|
||||||
|
"""
|
||||||
|
return [DEFAULT_USER, GUEST_USER]
|
||||||
|
|
||||||
|
def get_user_role(user):
|
||||||
|
"""Get a user's role.
|
||||||
|
"""
|
||||||
|
if user.role is None or user.role == '' or user.role == DEFAULT_USER:
|
||||||
|
return DEFAULT_USER
|
||||||
|
|
||||||
|
if user.role == GUEST_USER:
|
||||||
|
return GUEST_USER
|
||||||
|
|
||||||
|
return user.role # custom user role
|
@@ -34,6 +34,7 @@ from seahub.auth import authenticate
|
|||||||
from seahub.auth.decorators import login_required, login_required_ajax
|
from seahub.auth.decorators import login_required, login_required_ajax
|
||||||
from seahub.constants import GUEST_USER, DEFAULT_USER
|
from seahub.constants import GUEST_USER, DEFAULT_USER
|
||||||
from seahub.institutions.models import Institution, InstitutionAdmin
|
from seahub.institutions.models import Institution, InstitutionAdmin
|
||||||
|
from seahub.role_permissions.utils import get_available_roles
|
||||||
from seahub.utils import IS_EMAIL_CONFIGURED, string2list, is_valid_username, \
|
from seahub.utils import IS_EMAIL_CONFIGURED, string2list, is_valid_username, \
|
||||||
is_pro_version, send_html_email, get_user_traffic_list, get_server_id, \
|
is_pro_version, send_html_email, get_user_traffic_list, get_server_id, \
|
||||||
clear_token, gen_file_get_url, is_org_context, handle_virus_record, \
|
clear_token, gen_file_get_url, is_org_context, handle_virus_record, \
|
||||||
@@ -45,6 +46,8 @@ from seahub.utils.licenseparse import parse_license
|
|||||||
from seahub.utils.sysinfo import get_platform_name
|
from seahub.utils.sysinfo import get_platform_name
|
||||||
from seahub.utils.mail import send_html_email_with_dj_template
|
from seahub.utils.mail import send_html_email_with_dj_template
|
||||||
from seahub.utils.ms_excel import write_xls
|
from seahub.utils.ms_excel import write_xls
|
||||||
|
from seahub.utils.user_permissions import (get_basic_user_roles,
|
||||||
|
get_user_role)
|
||||||
from seahub.views.ajax import (get_related_users_by_org_repo,
|
from seahub.views.ajax import (get_related_users_by_org_repo,
|
||||||
get_related_users_by_repo)
|
get_related_users_by_repo)
|
||||||
from seahub.views import get_system_default_repo_id, gen_path_link
|
from seahub.views import get_system_default_repo_id, gen_path_link
|
||||||
@@ -267,10 +270,8 @@ def sys_user_admin(request):
|
|||||||
_populate_user_quota_usage(user)
|
_populate_user_quota_usage(user)
|
||||||
|
|
||||||
# check user's role
|
# check user's role
|
||||||
if user.role == GUEST_USER:
|
user.is_guest = True if get_user_role(user) == GUEST_USER else False
|
||||||
user.is_guest = True
|
user.is_default = True if get_user_role(user) == DEFAULT_USER else False
|
||||||
else:
|
|
||||||
user.is_guest = False
|
|
||||||
|
|
||||||
# populate user last login time
|
# populate user last login time
|
||||||
user.last_login = None
|
user.last_login = None
|
||||||
@@ -288,6 +289,8 @@ def sys_user_admin(request):
|
|||||||
platform = get_platform_name()
|
platform = get_platform_name()
|
||||||
server_id = get_server_id()
|
server_id = get_server_id()
|
||||||
pro_server = 1 if is_pro_version() else 0
|
pro_server = 1 if is_pro_version() else 0
|
||||||
|
extra_user_roles = [x for x in get_available_roles()
|
||||||
|
if x not in get_basic_user_roles()]
|
||||||
|
|
||||||
return render_to_response(
|
return render_to_response(
|
||||||
'sysadmin/sys_useradmin.html', {
|
'sysadmin/sys_useradmin.html', {
|
||||||
@@ -305,6 +308,7 @@ def sys_user_admin(request):
|
|||||||
'is_pro': is_pro_version(),
|
'is_pro': is_pro_version(),
|
||||||
'pro_server': pro_server,
|
'pro_server': pro_server,
|
||||||
'enable_user_plan': enable_user_plan,
|
'enable_user_plan': enable_user_plan,
|
||||||
|
'extra_user_roles': extra_user_roles,
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
|
@@ -15,3 +15,19 @@ class UserTest(BaseTestCase):
|
|||||||
assert len(Email.objects.all()) > 0
|
assert len(Email.objects.all()) > 0
|
||||||
# email = Email.objects.all()[0]
|
# email = Email.objects.all()[0]
|
||||||
# print email.html_message
|
# print email.html_message
|
||||||
|
|
||||||
|
|
||||||
|
class UserPermissionsTest(BaseTestCase):
|
||||||
|
def test_permissions(self):
|
||||||
|
assert self.user.permissions.can_add_repo() is True
|
||||||
|
assert self.user.permissions.can_add_group() is True
|
||||||
|
assert self.user.permissions.can_generate_shared_link() is True
|
||||||
|
assert self.user.permissions.can_use_global_address_book() is True
|
||||||
|
assert self.user.permissions.can_view_org() is True
|
||||||
|
assert self.user.permissions.can_drag_drop_folder_to_sync() is True
|
||||||
|
assert self.user.permissions.can_connect_with_android_clients() is True
|
||||||
|
assert self.user.permissions.can_connect_with_ios_clients() is True
|
||||||
|
assert self.user.permissions.can_connect_with_desktop_clients() is True
|
||||||
|
assert self.user.permissions.can_invite_guest() is False
|
||||||
|
|
||||||
|
assert self.user.permissions.can_export_files_via_mobile_client() is True
|
||||||
|
Reference in New Issue
Block a user