1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-20 19:08:21 +00:00

Refactor user role

This commit is contained in:
zhengxie
2014-07-14 17:48:05 +08:00
parent 11ec432f84
commit a787705fa2
24 changed files with 178 additions and 96 deletions

View File

@@ -4,6 +4,7 @@ from rest_framework.authentication import BaseAuthentication
import seaserv
from seahub.base.accounts import User
from seahub.constants import GUEST_USER
from seahub.api2.models import Token, TokenV2
from seahub.api2.utils import get_client_ip
try:
@@ -54,6 +55,14 @@ class TokenAuthentication(BaseAuthentication):
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
def authenticate_v1(self, request, key):
try:
token = Token.objects.get(key=key)
@@ -70,6 +79,8 @@ class TokenAuthentication(BaseAuthentication):
if orgs:
user.org = orgs[0]
self._populate_user_permissions(user)
if user.is_active:
return (user, token)
@@ -89,6 +100,8 @@ class TokenAuthentication(BaseAuthentication):
if orgs:
user.org = orgs[0]
self._populate_user_permissions(user)
if user.is_active:
need_save = False

View File

@@ -478,6 +478,7 @@ class Repos(APIView):
repo["random_key"] = r.random_key
repos_json.append(repo)
if request.user.permissions.can_view_org():
public_repos = list_inner_pub_repos(request)
for r in public_repos:
commit = get_commits(r.repo_id, 0, 1)[0]
@@ -506,6 +507,10 @@ class Repos(APIView):
return Response(repos_json)
def post(self, request, format=None):
if not request.user.permissions.can_add_repo():
return api_error(status.HTTP_403_FORBIDDEN,
'You do not have permission to create library.')
username = request.user.username
repo_name = request.POST.get("name", None)
repo_desc = request.POST.get("desc", 'new repo')
@@ -1853,6 +1858,10 @@ class DirSubRepoView(APIView):
if sub_repo:
result['sub_repo_id'] = sub_repo.id
else:
if not request.user.permissions.can_add_repo():
return api_error(status.HTTP_403_FORBIDDEN,
'You do not have permission to create library.')
# create a sub-lib
try:
# use name as 'repo_name' & 'repo_desc' for sub_repo
@@ -2262,6 +2271,10 @@ class DefaultRepoView(APIView):
return Response(repo_json)
def post(self, request):
if not request.user.permissions.can_add_repo():
return api_error(status.HTTP_403_FORBIDDEN,
'You do not have permission to create library.')
username = request.user.username
repo_id = UserOptions.objects.get_default_repo(username)
@@ -2541,6 +2554,10 @@ class Groups(APIView):
result = {}
content_type = 'application/json; charset=utf-8'
if not request.user.permissions.can_add_group():
return api_error(status.HTTP_403_FORBIDDEN,
'You do not have permission to create group.')
# check plan
num_of_groups = getattr(request.user, 'num_of_groups', -1)
if num_of_groups > 0:

View File

@@ -14,6 +14,10 @@ from seaserv import ccnet_threaded_rpc, unset_repo_passwd, is_passwd_set
from seahub.profile.models import Profile, DetailedProfile
from seahub.utils import is_valid_username
try:
from seahub.settings import CLOUD_MODE
except ImportError:
CLOUD_MODE = False
UNUSABLE_PASSWORD = '!' # This will never be a valid hash
@@ -83,6 +87,22 @@ class UserManager(object):
return user
class UserPermissions(object):
def can_add_repo(self):
"""
"""
return True
def can_add_group(self):
"""
"""
return True
def can_view_org(self):
"""
"""
return False if CLOUD_MODE else True
class User(object):
is_staff = False
is_active = False
@@ -97,6 +117,7 @@ class User(object):
def __init__(self, email):
self.username = email
self.email = email
self.permissions = UserPermissions()
def __unicode__(self):
return self.username

View File

@@ -32,16 +32,6 @@ try:
except ImportError:
MULTI_TENANCY = False
try:
from seahub.constants import DEFAULT_USER
except ImportError:
DEFAULT_USER = 'default'
try:
from seahub.constants import GUEST_USER
except ImportError:
GUEST_USER= 'guest'
def base(request):
"""
Add seahub base configure to the context.
@@ -85,6 +75,4 @@ def base(request):
'sysadmin_extra_enabled': ENABLE_SYSADMIN_EXTRA,
'grps': grps,
'multi_tenancy': MULTI_TENANCY,
'default_user': DEFAULT_USER,
'guest_user': GUEST_USER,
}

View File

@@ -1,8 +1,5 @@
# Default user have common operations,
# like creating group and library.
DEFUALT_USER = 'default'
# Default user have common operations, like creating group and library.
DEFAULT_USER = 'default'
# Guest user have limited operations,
# can not create group and library.
# Guest user have limited operations, can not create group and library.
GUEST_USER = 'guest'

View File

@@ -11,7 +11,7 @@
<li class="tab"><a href="#grp-repos" class="a">{% trans "Libraries" %}</a></li>
<li class="tab long-tab"><a href="#grp-repos-commits" class="a">{% trans "Recent Changes" %}</a></li>
</ul>
{% if request.user.role == default_user or request.user.role == None %}
{% if user.permissions.can_add_repo %}
<button id="repo-create" class="fright"><img src="{{ MEDIA_URL }}img/add.png" alt="" class="add vam" /><span class="vam">{% trans "New Library" %}</span></button>
{% endif %}
</div>
@@ -121,7 +121,7 @@
</div>
</div>
{% if request.user.role == default_user or request.user.role == None %}
{% if user.permissions.can_add_repo %}
{% include "snippets/repo_create_form.html" %}
{% endif %}
@@ -157,7 +157,7 @@ $('.download').click(function() {
window.open('{{ SITE_ROOT }}seafile_access_check/?repo_id=' + e(repo_id));
});
{% if request.user.role == default_user or request.user.role == None %}
{% if user.permissions.can_add_repo %}
function repoCreateSuccessCallback() {
location.reload();
}

View File

@@ -15,7 +15,7 @@
{% block extra_script %}
<script type="text/javascript">
{% if request.user.role == default_user or request.user.role == None %}
{% if user.permissions.can_add_group %}
{% url 'group_add' as group_add_url %}
{% with post_url=group_add_url %}
{% include "snippets/group_add_js.html" %}

View File

@@ -2,7 +2,7 @@
<div class="info-item">
<h3 class="info-item-top">{% trans "Tips" %}</h3>
<div class="info-item-bottom">
{% if request.user.role == default_user or request.user.role == None %}
{% if user.permissions.can_add_group %}
<p class="not-last">{% trans "After creating a group, you can add members and share libraries into it." %}</p>
{% else %}
<p class="not-last">{% trans "Since you are a guest user now, you can not create groups." %}</p>

View File

@@ -2,7 +2,7 @@
{% load url from future %}
<h3>{% trans "My Groups" %}</h3>
{% if request.user.role == default_user or request.user.role == None %}
{% if user.permissions.can_add_group %}
<button id="group-add"><img src="{{ MEDIA_URL }}img/add.png" alt="" class="add vam" /><span class="vam">{% trans "New Group" %}</span></button>
{% endif %}
{% if joined_groups %}
@@ -28,14 +28,14 @@
{% else %}
<div class="empty-tips">
<h2 class="alc">{% trans "You are not in any groups" %}</h2>
{% if request.user.role == default_user or request.user.role == None %}
{% if user.permissions.can_add_group %}
<p>{% blocktrans %}Group is a place for you and your friends leaving messages and collaborating on libraries. You can create a group by clicking "New Group" button.{% endblocktrans %}</p>
{% else %}
<p>{% trans "Group is a place for you and your friends leaving messages and collaborating on libraries. Groups you join will be listed here." %}</p>
{% endif %}
</div>
{% endif %}
{% if request.user.role == default_user or request.user.role == None %}
{% if user.permissions.can_add_group %}
<form id="group-add-form" action="" method="post" name="group-add-form" class="hide">{% csrf_token %}
<h3>{% trans "New Group" %}</h3>
<label>{% trans "Group Name" %}</label><br />

View File

@@ -156,6 +156,12 @@ def group_add(request):
result = {}
content_type = 'application/json; charset=utf-8'
user_can_add_group = request.user.permissions.can_add_group()
if not user_can_add_group:
result['error'] = _(u'You do not have permission to create group.')
return HttpResponse(json.dumps(result), status=403,
content_type=content_type)
# check plan
num_of_groups = getattr(request.user, 'num_of_groups', -1)
if num_of_groups > 0:

View File

@@ -9,7 +9,7 @@
<ul class="side-textnav-tabs">
<li class="tab"><a href="#user-basic-info">{% trans "Profile" %}</a></li>
<li class="tab"><a href="#lang-setting">{% trans "Language" %}</a></li>
{% if request.user.role == default_user or request.user.role == None %}
{% if user.permissions.can_add_repo %}
{% if not force_server_crypto %}
<li class="tab"><a href="#enc-lib-setting">{% trans "Encrypted Libraries" %}</a></li>
{% endif %}
@@ -74,7 +74,7 @@
</ul>
</div>
{% if request.user.role == default_user or request.user.role == None %}
{% if user.permissions.can_add_repo %}
{% if not force_server_crypto %}
<div class="setting-item" id="enc-lib-setting">
@@ -145,7 +145,7 @@ addConfirmTo($('#account-delete-btn'), {
'con' : "{% trans "Really want to delete your account?" %}"
});
{% if request.user.role == default_user or request.user.role == None %}
{% if user.permissions.can_add_repo %}
var all_repos = [];
{% for a_repo in owned_repos %}
all_repos.push({

View File

@@ -425,6 +425,8 @@ ENABLE_PUBFILE = False
ENABLE_SUB_LIBRARY = True
ENABLE_GUEST = False
#####################
# External settings #
#####################

View File

@@ -10,7 +10,7 @@
<div id="tabs" class="tab-tabs">
<ul class="tab-tabs-nav hd w100 ovhd">
<li class="tab"><a href="#priv-share-in" class="a">{% trans "From Others" %}</a></li>
{% if request.user.role == default_user or request.user.role == None %}
{% if user.permissions.can_add_repo %}
<li class="tab long-tab"><a href="#priv-share-out" class="a">{% trans "To Others" %}</a></li>
{% endif %}
</ul>
@@ -47,7 +47,7 @@
{% endif %}
</div>
{% if request.user.role == default_user or request.user.role == None %}
{% if user.permissions.can_add_repo %}
<div id="priv-share-out" class="hide">
{% if priv_share_out %}
<table>

View File

@@ -6,7 +6,7 @@
<div class="side-tabnav">
<div class="hd w100 ovhd">
<h3 class="fleft">{% trans "Personal" %}</h3>
{% if request.user.role == default_user or request.user.role == None %}
{% if user.permissions.can_add_repo %}
<img id="enable-mods" class="fright" title="{% trans "Enable Modules" %}" src="{{MEDIA_URL}}img/setting.png" alt="" />
{% endif %}
</div>
@@ -28,7 +28,7 @@
<h3 class="hd">{% trans "Share Admin" %}</h3>
<ul class="side-tabnav-tabs">
{% if request.user.role == default_user or request.user.role == None %}
{% if user.permissions.can_add_repo %}
<li class="tab {% block cur_share_libs %}{% endblock %}"><a href="{% url 'share_admin' %}" class="lib">{% trans "Libraries" %}</a></li>
<li class="tab {% block cur_share_folders %}{% endblock %}"><a href="{% url 'list_priv_shared_folders' %}" class="folders">{% trans "Folders" %}</a></li>
{% endif %}
@@ -39,7 +39,7 @@
{% endblock %}
{% block main_panel %}
{% if request.user.role == default_user or request.user.role == None %}
{% if user.permissions.can_add_repo %}
<form id="mods-enable-form" method="post" action="{% url 'toggle_modules' %}" class="hide">{% csrf_token%}
<h3>{% trans "Enable Modules"%}</h3>
<ul>
@@ -61,7 +61,7 @@
{% block extra_script %}
<script type="text/javascript">
{% if request.user.role == default_user or request.user.role == None %}
{% if user.permissions.can_add_repo %}
$('#enable-mods').click(function() {
$('#mods-enable-form').modal({appendTo: "#main"});
$('#simplemodal-container').css('height', 'auto');

View File

@@ -38,7 +38,7 @@
<span class="icon-lightbulb fleft"></span>
<div class="txt">
<h3>{% trans "Welcome to Seafile!" %}</h3>
{% if request.user.role == default_user or request.user.role == None %}
{% if user.permissions.can_add_repo %}
<p>{% trans "Seafile organizes files into libraries. Each library can be synced and shared separately. We have created a personal library for you. You can create more libraries later." %}</p>
{% else %}
<p>{% trans "Seafile organizes files into libraries. Each library can be synced and shared separately. Howerver, since you are a guest user now, you can not create libraries." %}</p>

View File

@@ -8,13 +8,11 @@
<li class="nav-item" {% if grps %}style="position:relative;"{% endif %}>
<a href="{% url 'group_list' %}" class="a {% block cur_group %}{% endblock %}" {% if grps %}id="top-nav-grp"{% endif %}>{% trans "Groups" %}{% if grps %} <span class="icon-caret-down"></span>{% endif %}</a>
</li>
{% if request.user.role == default_user or request.user.role == None %}
{% if request.user.org or not cloud_mode %}
{% if user.permissions.can_view_org %}
<li class="nav-item">
<a href="{% url 'pubrepo' %}" class="a {% block cur_pubinfo %}{% endblock %}">{% trans "Organization" %}</a>
</li>
{% endif %}
{% endif %}
<li class="nav-item">
<a href="{{ SITE_ROOT }}help/" class="a {% block cur_help %}{% endblock %}">{% trans "Help" %}</a>
</li>

View File

@@ -3,7 +3,7 @@
<div id="tabs" class="tab-tabs">
<div class="hd ovhd">
<ul class="tab-tabs-nav fleft">
{% if request.user.role == default_user or request.user.role == None %}
{% if user.permissions.can_add_repo %}
<li class="tab"><a href="#my-own-repos" class="a" id="mylib-tab">{% trans "Mine" %}</a></li>
{% if ENABLE_SUB_LIBRARY and sub_lib_enabled %}
<li class="tab"><a href="#my-sub-repos" class="a" id="sublib-tab">{% trans "Sub-libraries" %}</a></li>

View File

@@ -48,7 +48,7 @@
</tr>
{% for user in admin_users %}
<tr>
<tr data-userid="{{user.email}}">
<td data="{{user.id}}"><a href="{{ SITE_ROOT }}useradmin/info/{{ user.props.email }}/">{{ user.email }}</a></td>
<td>
@@ -71,16 +71,16 @@
<td>
{% if user.source != 'LDAP' %}
<div class="user-role">
{% if user.role == default_user or user.role == None %}
<span class="user-role-cur-value">{% trans "Default" %}</span>
{% else %}
{% if user.is_guest %}
<span class="user-role-cur-value">{% trans "Guest" %}</span>
{% else %}
<span class="user-role-cur-value">{% trans "Default" %}</span>
{% endif %}
<img src="{{MEDIA_URL}}img/edit_12.png" alt="{% trans "Edit"%}" title="{% trans "Edit"%}" class="user-role-edit-icon cspt vh" />
</div>
<select name="role" class="user-role-select hide">
<option value={{default_user}} {%if user.role == default_user or user.role == None %}selected="selected"{% endif %}>{% trans "Default" %}</option>
<option value={{guest_user}} {%if user.role == guest_user %}selected="selected"{% endif %}>{% trans "Guest"%}</option>
<option value={{default_user}} {%if not user.is_guest %}selected="selected"{% endif %}>{% trans "Default" %}</option>
<option value={{guest_user}} {%if user.is_guest %}selected="selected"{% endif %}>{% trans "Guest"%}</option>
</select>
{% endif %}
</td>

View File

@@ -10,7 +10,7 @@
</tr>
{% for user in users %}
<tr data-userid="{{user.id}}">
<tr data-userid="{{user.email}}">
<td><a href="{{ SITE_ROOT }}useradmin/info/{{ user.props.email }}/">{{ user.email }}</a></td>
<td>
{% if user.source != 'LDAP' %}
@@ -31,16 +31,16 @@
<td>
{% if user.source != 'LDAP' %}
<div class="user-role">
{% if user.role == default_user or user.role == None %}
<span class="user-role-cur-value">{% trans "Default" %}</span>
{% else %}
{% if user.is_guest %}
<span class="user-role-cur-value">{% trans "Guest" %}</span>
{% else %}
<span class="user-role-cur-value">{% trans "Default" %}</span>
{% endif %}
<img src="{{MEDIA_URL}}img/edit_12.png" alt="{% trans "Edit"%}" title="{% trans "Edit"%}" class="user-role-edit-icon cspt vh" />
</div>
<select name="role" class="user-role-select hide">
<option value={{default_user}} {%if user.role == default_user or user.role == None %}selected="selected"{% endif %}>{% trans "Default" %}</option>
<option value={{guest_user}} {%if user.role == guest_user %}selected="selected"{% endif %}>{% trans "Guest"%}</option>
<option value={{default_user}} {%if not user.is_guest %}selected="selected"{% endif %}>{% trans "Default" %}</option>
<option value={{guest_user}} {%if user.is_guest %}selected="selected"{% endif %}>{% trans "Guest"%}</option>
</select>
{% endif %}
</td>

View File

@@ -193,7 +193,7 @@ urlpatterns = patterns('',
url(r'^useradmin/activate/(?P<user_id>[^/]+)/$', user_activate, name='user_activate'),
url(r'^useradmin/deactivate/(?P<user_id>[^/]+)/$', user_deactivate, name='user_deactivate'),
url(r'^useradmin/toggle_status/(?P<user_id>[^/]+)/$', user_toggle_status, name='user_toggle_status'),
url(r'^useradmin/toggle_role/(?P<user_id>[^/]+)/$', user_toggle_role, name='user_toggle_role'),
url(r'^useradmin/toggle_role/(?P<email>[^/]+)/$', user_toggle_role, name='user_toggle_role'),
url(r'^useradmin/(?P<email>[^/]+)/set_quota/$', user_set_quota, name='user_set_quota'),
url(r'^useradmin/password/reset/(?P<user_id>[^/]+)/$', user_reset, name='user_reset'),

View File

@@ -975,14 +975,13 @@ def myhome(request):
allow_public_share = True
# user guide
from seahub import constants
DEFAULT_USER = getattr(constants, 'DEFAULT_USER', 'default')
user_can_add_repo = request.user.permissions.can_add_repo()
need_guide = False
if len(owned_repos) == 0:
need_guide = UserOptions.objects.is_user_guide_enabled(username)
if need_guide:
UserOptions.objects.disable_user_guide(username)
if request.user.role == DEFAULT_USER or request.user.role == None:
if user_can_add_repo:
# create a default library for user
create_default_library(request)
# refetch owned repos
@@ -1550,6 +1549,9 @@ def pubrepo(request):
"""
Show public libraries.
"""
if not request.user.permissions.can_view_org():
raise Http404
username = request.user.username
if request.cloud_mode and request.user.org is not None:
@@ -1580,6 +1582,9 @@ def pubgrp(request):
"""
Show public groups.
"""
if not request.user.permissions.can_view_org():
raise Http404
if request.cloud_mode and request.user.org is not None:
org_id = request.user.org.org_id
groups = seaserv.get_org_groups(org_id, -1, -1)
@@ -1627,6 +1632,9 @@ def pubuser(request):
"""
Show public users.
"""
if not request.user.permissions.can_view_org():
raise Http404
# Make sure page request is an int. If not, deliver first page.
try:
current_page = int(request.GET.get('page', '1'))

View File

@@ -1670,6 +1670,11 @@ def repo_create(request):
result = {}
content_type = 'application/json; charset=utf-8'
if not request.user.permissions.can_add_repo():
result['error'] = _(u"You do not have permission to create library")
return HttpResponse(json.dumps(result), status=403,
content_type=content_type)
form = RepoCreateForm(request.POST)
if not form.is_valid():
result['error'] = str(form.errors.values()[0])
@@ -1746,6 +1751,11 @@ def public_repo_create(request):
result = {}
content_type = 'application/json; charset=utf-8'
if not request.user.permissions.can_add_repo():
result['error'] = _(u"You do not have permission to create library")
return HttpResponse(json.dumps(result), status=403,
content_type=content_type)
form = SharedRepoCreateForm(request.POST)
if not form.is_valid():
result['error'] = str(form.errors.values()[0])

View File

@@ -23,6 +23,7 @@ from seahub.base.accounts import User
from seahub.base.models import UserLastLogin
from seahub.base.decorators import sys_staff_required
from seahub.auth.decorators import login_required, login_required_ajax
from seahub.constants import GUEST_USER, DEFAULT_USER
from seahub.utils import IS_EMAIL_CONFIGURED, string2list, is_valid_username
from seahub.views import get_system_default_repo_id
from seahub.forms import SetUserQuotaForm, AddUserForm, BatchAddUserForm
@@ -31,7 +32,8 @@ from seahub.share.models import FileShare
import seahub.settings as settings
from seahub.settings import INIT_PASSWD, SITE_NAME, \
SEND_EMAIL_ON_ADDING_SYSTEM_MEMBER, SEND_EMAIL_ON_RESETTING_USER_PASSWD
SEND_EMAIL_ON_ADDING_SYSTEM_MEMBER, SEND_EMAIL_ON_RESETTING_USER_PASSWD, \
ENABLE_GUEST
from seahub.utils import send_html_email, get_user_traffic_list, get_server_id
from seahub.utils.sysinfo import get_platform_name
@@ -179,6 +181,11 @@ def sys_user_admin(request):
user.self_usage = -1
user.share_usage = -1
user.quota = -1
# check user's role
if user.role == GUEST_USER:
user.is_guest = True
else:
user.is_guest = False
# populate user last login time
user.last_login = None
for last_login in last_logins:
@@ -202,8 +209,10 @@ def sys_user_admin(request):
'have_ldap': have_ldap,
'platform': platform,
'server_id': server_id[:8],
},
context_instance=RequestContext(request))
'default_user': DEFAULT_USER,
'guest_user': GUEST_USER,
'enable_guest': ENABLE_GUEST,
}, context_instance=RequestContext(request))
@login_required
@sys_staff_required
@@ -243,7 +252,6 @@ def sys_user_admin_ldap(request):
if last_login.username == user.email:
user.last_login = last_login.last_login
return render_to_response(
'sysadmin/sys_useradmin_ldap.html', {
'users': users,
@@ -284,6 +292,11 @@ def sys_user_admin_admins(request):
user.self_usage = -1
user.share_usage = -1
user.quota = -1
# check user's role
if user.role == GUEST_USER:
user.is_guest = True
else:
user.is_guest = False
# populate user last login time
user.last_login = None
for last_login in last_logins:
@@ -298,8 +311,9 @@ def sys_user_admin_admins(request):
'not_admin_users': not_admin_users,
'CALC_SHARE_USAGE': CALC_SHARE_USAGE,
'have_ldap': have_ldap,
},
context_instance=RequestContext(request))
'default_user': DEFAULT_USER,
'guest_user': GUEST_USER,
}, context_instance=RequestContext(request))
@login_required
@sys_staff_required
@@ -497,11 +511,16 @@ def user_toggle_status(request, user_id):
@login_required_ajax
@sys_staff_required
def user_toggle_role(request, user_id):
def user_toggle_role(request, email):
content_type = 'application/json; charset=utf-8'
from seahub import constants
DEFAULT_USER = getattr(constants, 'DEFAULT_USER', 'default')
if not is_valid_username(email):
return HttpResponse(json.dumps({'success': False}), status=400,
content_type=content_type)
if not ENABLE_GUEST:
return HttpResponse(json.dumps({'success': False}), status=403,
content_type=content_type)
try:
user_role = request.GET.get('r', DEFAULT_USER)
@@ -509,7 +528,7 @@ def user_toggle_role(request, user_id):
user_role = DEFAULT_USER
try:
user = User.objects.get(id=int(user_id))
user = User.objects.get(email)
User.objects.update_role(user.email, user_role)
return HttpResponse(json.dumps({'success': True}),

View File

@@ -130,6 +130,9 @@ def personal_wiki_create(request):
return HttpResponse(json.dumps(result), status=status,
content_type=content_type)
if not request.user.permissons.can_add_repo():
return json_error(_('You do not have permission to create wiki'), 403)
form = WikiCreateForm(request.POST)
if not form.is_valid():
return json_error(str(form.errors.values()[0]))