diff --git a/seahub/settings.py b/seahub/settings.py
index 2077c00f11..125df2a1e2 100644
--- a/seahub/settings.py
+++ b/seahub/settings.py
@@ -222,6 +222,9 @@ LOGIN_REDIRECT_URL = '/profile/'
ACCOUNT_ACTIVATION_DAYS = 7
+# allow seafile amdin view user's repo
+ENABLE_SYS_ADMIN_VIEW_REPO = False
+
# show traffic on the UI
SHOW_TRAFFIC = True
diff --git a/seahub/templates/sysadmin/admin_repo_view.html b/seahub/templates/sysadmin/admin_repo_view.html
new file mode 100644
index 0000000000..77056a8045
--- /dev/null
+++ b/seahub/templates/sysadmin/admin_repo_view.html
@@ -0,0 +1,94 @@
+{% extends "myhome_base.html" %}
+
+{% load seahub_tags avatar_tags i18n upload_tags %}
+
+{% block sub_title %}{{repo.name}} - {% endblock %}
+{% block extra_style %}
+
+{% endblock %}
+
+{% block main_panel %}
+
{% if repo.encrypted %}
 |
+ {{ repo.props.name }} |
{% else %}
 |
+ {% if repo.is_default_repo %}
+ {{ repo.props.name }} |
+ {% elif enable_sys_admin_view_repo %}
+ {{ repo.props.name }} |
+ {% else %}
+ {{ repo.props.name }} |
+ {% endif %}
{% endif %}
- {{ repo.props.name }} |
{{ repo.id }} |
{% if repo.owner %}
diff --git a/seahub/templates/sysadmin/sys_admin_group_info.html b/seahub/templates/sysadmin/sys_admin_group_info.html
index d261b3a725..9499163bd1 100644
--- a/seahub/templates/sysadmin/sys_admin_group_info.html
+++ b/seahub/templates/sysadmin/sys_admin_group_info.html
@@ -52,7 +52,13 @@
{% else %}
|  |
{% endif %}
- {{ repo.name }} |
+ {% if repo.encrypted %}
+ {{ repo.name }} |
+ {% elif enable_sys_admin_view_repo %}
+ {{ repo.name }} |
+ {% else %}
+ {{ repo.name }} |
+ {% endif %}
{{ repo.size|filesizeformat }} |
{{ repo.user }} |
diff --git a/seahub/templates/sysadmin/userinfo.html b/seahub/templates/sysadmin/userinfo.html
index 3bc91cb770..a0cb0fadec 100644
--- a/seahub/templates/sysadmin/userinfo.html
+++ b/seahub/templates/sysadmin/userinfo.html
@@ -89,7 +89,13 @@
{% else %}
|  |
{% endif %}
- {{ repo.props.name }} |
+ {% if repo.encrypted %}
+ {{ repo.name }} |
+ {% elif enable_sys_admin_view_repo %}
+ {{ repo.name }} |
+ {% else %}
+ {{ repo.name }} |
+ {% endif %}
{{ repo.size|filesizeformat }} |
{{ repo.last_modify|translate_seahub_time }} |
@@ -123,7 +129,11 @@
{% else %}
|  |
{% endif %}
- {{ repo.props.repo_name }} |
+ {% if enable_sys_admin_view_repo %}
+ {{ repo.name }} |
+ {% else %}
+ {{ repo.name }} |
+ {% endif %}
{{ repo.props.user }} |
{{ repo.size|filesizeformat }} |
{{ repo.last_modify|translate_seahub_time }} |
diff --git a/seahub/urls.py b/seahub/urls.py
index c8a8c44d7b..1f1a87966c 100644
--- a/seahub/urls.py
+++ b/seahub/urls.py
@@ -207,6 +207,8 @@ urlpatterns = patterns(
url(r'^sys/info/$', sys_info, name='sys_info'),
url(r'^sys/settings/$', sys_settings, name='sys_settings'),
url(r'^sys/seafadmin/$', sys_repo_admin, name='sys_repo_admin'),
+ url(r'^sys/seafadmin/repo/(?P[-0-9a-f]{36})/$', sys_admin_repo, name='sys_admin_repo'),
+ url(r'^sys/seafadmin/repo/(?P[-0-9a-f]{36})/download-file/$', sys_admin_repo_download_file, name='sys_admin_repo_download_file'),
url(r'^sys/seafadmin/system/$', sys_list_system, name='sys_list_system'),
url(r'^sys/seafadmin/repo-trash/$', sys_repo_trash, name='sys_repo_trash'),
url(r'^sys/seafadmin/repo-trash/clear/$', sys_repo_trash_clear, name="sys_repo_trash_clear"),
@@ -255,7 +257,6 @@ urlpatterns = patterns(
url(r'^useradmin/batchadduser/$', batch_add_user, name='batch_add_user'),
url(r'^client-login/$', client_token_login, name='client_token_login'),
-
)
from seahub.utils import EVENTS_ENABLED
diff --git a/seahub/views/sysadmin.py b/seahub/views/sysadmin.py
index ada7d88f26..4d085cad07 100644
--- a/seahub/views/sysadmin.py
+++ b/seahub/views/sysadmin.py
@@ -6,6 +6,7 @@ import logging
import json
import re
import datetime
+import stat
import csv, chardet, StringIO
from constance import config
@@ -18,7 +19,8 @@ from django.utils import timezone
from django.utils.translation import ugettext as _
from seaserv import ccnet_threaded_rpc, seafserv_threaded_rpc, get_emailusers, \
- CALC_SHARE_USAGE, seafile_api, get_group, get_group_members
+ CALC_SHARE_USAGE, seafile_api, get_group, get_group_members, get_repo, \
+ get_file_size
from pysearpc import SearpcError
from seahub.base.accounts import User
@@ -31,21 +33,22 @@ from seahub.constants import GUEST_USER, DEFAULT_USER
from seahub.utils import IS_EMAIL_CONFIGURED, string2list, is_valid_username, \
is_pro_version, send_html_email, get_user_traffic_list, get_server_id, \
- clear_token
+ clear_token, gen_file_get_url, is_org_context
from seahub.utils.rpc import mute_seafile_api
from seahub.utils.licenseparse import parse_license
from seahub.utils.sysinfo import get_platform_name
-from seahub.views import get_system_default_repo_id
from seahub.views.ajax import (get_related_users_by_org_repo,
get_related_users_by_repo)
+from seahub.views import get_system_default_repo_id, gen_path_link
from seahub.forms import SetUserQuotaForm, AddUserForm, BatchAddUserForm
from seahub.profile.models import Profile, DetailedProfile
from seahub.signals import repo_deleted
from seahub.share.models import FileShare, UploadLinkShare
import seahub.settings as settings
-from seahub.settings import INIT_PASSWD, SITE_NAME, CONSTANCE_CONFIG, \
- SEND_EMAIL_ON_ADDING_SYSTEM_MEMBER, SEND_EMAIL_ON_RESETTING_USER_PASSWD
+from seahub.settings import INIT_PASSWD, SITE_NAME, \
+ SEND_EMAIL_ON_ADDING_SYSTEM_MEMBER, SEND_EMAIL_ON_RESETTING_USER_PASSWD, \
+ ENABLE_SYS_ADMIN_VIEW_REPO
try:
from seahub.settings import ENABLE_TRIAL_ACCOUNT
except:
@@ -155,7 +158,9 @@ def sys_repo_admin(request):
else:
page_next = False
+ default_repo_id = get_system_default_repo_id()
for repo in repos:
+ repo.is_default_repo = True if repo.id == default_repo_id else False
try:
repo.owner = seafile_api.get_repo_owner(repo.id)
except:
@@ -163,6 +168,7 @@ def sys_repo_admin(request):
return render_to_response(
'sysadmin/sys_repo_admin.html', {
+ 'enable_sys_admin_view_repo': ENABLE_SYS_ADMIN_VIEW_REPO,
'repos': repos,
'current_page': current_page,
'prev_page': current_page-1,
@@ -172,6 +178,102 @@ def sys_repo_admin(request):
},
context_instance=RequestContext(request))
+@login_required
+@sys_staff_required
+def sys_admin_repo_download_file(request, repo_id):
+ """
+ """
+ repo = get_repo(repo_id)
+ path = request.GET.get('p', '')
+ obj_id = seafile_api.get_file_id_by_path(repo_id, path)
+
+ next = request.META.get('HTTP_REFERER', None)
+ if not next:
+ next = reverse('sys_admin_repo')
+
+ if not repo or repo.encrypted or not is_pro_version() \
+ or not ENABLE_SYS_ADMIN_VIEW_REPO or not obj_id:
+ messages.error(request, _(u'Unable to download file'))
+ return HttpResponseRedirect(next)
+
+ try:
+ token = seafile_api.get_fileserver_access_token(repo_id, obj_id,
+ 'download', request.user.username)
+ except SearpcError as e:
+ logger.error(e)
+ messages.error(request, _(u'Unable to view library'))
+ return HttpResponseRedirect(next)
+
+ file_name = os.path.basename(path.rstrip('/'))
+ redirect_url = gen_file_get_url(token, file_name)
+ return HttpResponseRedirect(redirect_url)
+
+@login_required
+@sys_staff_required
+def sys_admin_repo(request, repo_id):
+ next = request.META.get('HTTP_REFERER', None)
+ if not next:
+ next = reverse('sys_repo_admin')
+
+ if not is_pro_version() or not ENABLE_SYS_ADMIN_VIEW_REPO:
+ messages.error(request, _(u'Unable to view library, this feature is not enabled.'))
+ return HttpResponseRedirect(next)
+
+ repo = get_repo(repo_id)
+ if not repo:
+ messages.error(request, _(u'Library does not exist'))
+ return HttpResponseRedirect(next)
+
+ if repo.encrypted:
+ messages.error(request, _(u'Library is encrypted'))
+ return HttpResponseRedirect(next)
+
+ path = request.GET.get('p', '/')
+ if path[-1] != '/':
+ path = path + '/'
+
+ dir_id = seafile_api.get_dir_id_by_path(repo_id, path)
+ if not dir_id:
+ messages.error(request, _(u'Unable to view library, wrong folder path.'))
+ return HttpResponseRedirect(next)
+
+ if is_org_context(request):
+ repo_owner = seafile_api.get_org_repo_owner(repo_id)
+ else:
+ repo_owner = seafile_api.get_repo_owner(repo_id)
+
+ try:
+ dirs = seafserv_threaded_rpc.list_dir_with_perm(repo_id, path,
+ dir_id, repo_owner,
+ -1, -1)
+ except SearpcError as e:
+ logger.error(e)
+ messages.error(request, _(u'Unable to view library'))
+ return HttpResponseRedirect(next)
+
+ file_list, dir_list = [], []
+ for dirent in dirs:
+ dirent.last_modified = dirent.mtime
+ if stat.S_ISDIR(dirent.props.mode):
+ dir_list.append(dirent)
+ else:
+ if repo.version == 0:
+ dirent.file_size = get_file_size(repo.store_id, repo.version, dirent.obj_id)
+ else:
+ dirent.file_size = dirent.size
+ file_list.append(dirent)
+
+ zipped = gen_path_link(path, repo.name)
+
+ return render_to_response('sysadmin/admin_repo_view.html', {
+ 'repo': repo,
+ 'repo_owner': repo_owner,
+ 'dir_list': dir_list,
+ 'file_list': file_list,
+ 'path': path,
+ 'zipped': zipped,
+ }, context_instance=RequestContext(request))
+
@login_required
@sys_staff_required
def sys_list_system(request):
@@ -332,6 +434,7 @@ def sys_repo_search(request):
'repos': repos,
'name': repo_name,
'owner': owner,
+ 'enable_sys_admin_view_repo': ENABLE_SYS_ADMIN_VIEW_REPO,
}, context_instance=RequestContext(request))
def _populate_user_quota_usage(user):
@@ -723,6 +826,7 @@ def user_info(request, email):
'd_profile': d_profile,
'org_name': org_name,
'user_shared_links': user_shared_links,
+ 'enable_sys_admin_view_repo': ENABLE_SYS_ADMIN_VIEW_REPO,
}, context_instance=RequestContext(request))
@login_required_ajax
@@ -1171,6 +1275,7 @@ def sys_admin_group_info(request, group_id):
'group': group,
'repos': repos,
'members': members,
+ 'enable_sys_admin_view_repo': ENABLE_SYS_ADMIN_VIEW_REPO,
}, context_instance=RequestContext(request))
@login_required