diff --git a/seahub/api2/endpoints/file.py b/seahub/api2/endpoints/file.py
index b223b8c204..c7a59f4798 100644
--- a/seahub/api2/endpoints/file.py
+++ b/seahub/api2/endpoints/file.py
@@ -1,5 +1,6 @@
# Copyright (c) 2012-2016 Seafile Ltd.
import os
+import time
import logging
import posixpath
import requests
@@ -27,8 +28,7 @@ from seahub.constants import PERMISSION_READ_WRITE
from seahub.utils.repo import parse_repo_perm, is_repo_admin, is_repo_owner
from seahub.utils.file_types import MARKDOWN, TEXT
-from seahub.settings import MAX_UPLOAD_FILE_NAME_LEN, \
- FILE_LOCK_EXPIRATION_DAYS, OFFICE_TEMPLATE_ROOT
+from seahub.settings import MAX_UPLOAD_FILE_NAME_LEN, OFFICE_TEMPLATE_ROOT
from seahub.drafts.models import Draft
from seahub.drafts.utils import is_draft_file, get_file_draft
@@ -569,10 +569,24 @@ class FileView(APIView):
error_msg = _("File is locked")
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
- # lock file
- expire = request.data.get('expire', FILE_LOCK_EXPIRATION_DAYS)
+ expire = request.data.get('expire', 0)
try:
- seafile_api.lock_file(repo_id, path, username, expire)
+ expire = int(expire)
+ except ValueError:
+ error_msg = 'expire invalid.'
+ return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
+
+ if expire < 0:
+ error_msg = 'expire invalid.'
+ return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
+
+ # lock file
+ try:
+ if expire > 0:
+ seafile_api.lock_file(repo_id, path, username,
+ int(time.time()) + expire)
+ else:
+ seafile_api.lock_file(repo_id, path, username)
except SearpcError as e:
logger.error(e)
error_msg = 'Internal Server Error'
@@ -604,10 +618,25 @@ class FileView(APIView):
error_msg = _("File is not locked.")
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
+ expire = request.data.get('expire', 0)
+ try:
+ expire = int(expire)
+ except ValueError:
+ error_msg = 'expire invalid.'
+ return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
+
+ if expire < 0:
+ error_msg = 'expire invalid.'
+ return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
+
if locked_by_me or locked_by_online_office:
# refresh lock file
try:
- seafile_api.refresh_file_lock(repo_id, path)
+ if expire > 0:
+ seafile_api.refresh_file_lock(repo_id, path,
+ int(time.time()) + expire)
+ else:
+ seafile_api.refresh_file_lock(repo_id, path)
except SearpcError as e:
logger.error(e)
error_msg = 'Internal Server Error'
diff --git a/seahub/api2/endpoints/search_user.py b/seahub/api2/endpoints/search_user.py
index 32314af6df..b904617cb4 100644
--- a/seahub/api2/endpoints/search_user.py
+++ b/seahub/api2/endpoints/search_user.py
@@ -117,7 +117,7 @@ class SearchUser(APIView):
# search user from user's contacts
email_list += search_user_when_global_address_book_disabled(request, q)
- ## search finished, now filter out some users
+ # search finished, now filter out some users
# remove duplicate emails
# get_emailusers_in_list can only accept 20 users at most
@@ -128,7 +128,8 @@ class SearchUser(APIView):
# remove nonexistent or inactive user
email_list_json = json.dumps(email_list)
user_obj_list = ccnet_api.get_emailusers_in_list('DB', email_list_json) + \
- ccnet_api.get_emailusers_in_list('LDAP', email_list_json)
+ ccnet_api.get_emailusers_in_list('LDAP', email_list_json)
+
for user_obj in user_obj_list:
if user_obj.is_active:
email_result.append(user_obj.email)
@@ -136,7 +137,7 @@ class SearchUser(APIView):
if django_settings.ENABLE_ADDRESSBOOK_OPT_IN:
# get users who has setted to show in address book
listed_users = Profile.objects.filter(list_in_address_book=True).values('user')
- listed_user_list = [ u['user'] for u in listed_users ]
+ listed_user_list = [u['user'] for u in listed_users]
email_result = list(set(email_result) & set(listed_user_list))
@@ -164,6 +165,7 @@ class SearchUser(APIView):
return Response({"users": formated_result})
+
def format_searched_user_result(request, users, size):
results = []
@@ -178,6 +180,7 @@ def format_searched_user_result(request, users, size):
return results
+
def search_user_from_ccnet(q):
""" Return 10 items at most.
"""
@@ -204,13 +207,15 @@ def search_user_from_ccnet(q):
return email_list
+
def search_user_from_profile(q):
""" Return 10 items at most.
"""
# 'nickname__icontains' for search by nickname
# 'contact_email__icontains' for search by contact email
users = Profile.objects.filter(Q(nickname__icontains=q) | \
- Q(contact_email__icontains=q)).values('user')[:10]
+ Q(contact_email__icontains=q) | \
+ Q(login_id__icontains=q)).values('user')[:10]
email_list = []
for user in users:
@@ -218,12 +223,14 @@ def search_user_from_profile(q):
return email_list
+
def search_user_from_profile_with_limits(q, limited_emails):
""" Return 10 items at most.
"""
# search within limited_emails
- users = Profile.objects.filter(Q(user__in=limited_emails) &
- (Q(nickname__icontains=q) | Q(contact_email__icontains=q))).values('user')[:10]
+ users = Profile.objects.filter(Q(user__in=limited_emails) & (Q(nickname__icontains=q) | \
+ Q(contact_email__icontains=q) | \
+ Q(login_id__icontains=q))).values('user')[:10]
email_list = []
for user in users:
@@ -231,7 +238,9 @@ def search_user_from_profile_with_limits(q, limited_emails):
return email_list
+
def search_user_when_global_address_book_disabled(request, q):
+
""" Return 10 items at most.
"""
@@ -242,6 +251,7 @@ def search_user_when_global_address_book_disabled(request, q):
# get user's contact list
contacts = Contact.objects.get_contacts_by_user(username)
for contact in contacts:
+
# search user from contact list
if q in contact.contact_email:
email_list.append(contact.contact_email)
@@ -254,13 +264,21 @@ def search_user_when_global_address_book_disabled(request, q):
email_list += search_user_from_profile_with_limits(q, limited_emails)
current_user = User.objects.get(email=username)
- if is_valid_email(q) and current_user.role.lower() != 'guest':
- # if `q` is a valid email and current is not a guest user
- email_list.append(q)
+ if current_user.role.lower() != 'guest':
- # get user whose `contact_email` is `q`
- users = Profile.objects.filter(contact_email=q).values('user')
- for user in users:
- email_list.append(user['user'])
+ if is_valid_email(q):
+
+ # if `q` is a valid email
+ email_list.append(q)
+
+ # get user whose `contact_email` is `q`
+ users = Profile.objects.filter(contact_email=q).values('user')
+ for user in users:
+ email_list.append(user['user'])
+
+ # get user whose `login_id` is `q`
+ username_by_login_id = Profile.objects.get_username_by_login_id(q)
+ if username_by_login_id:
+ email_list.append(username_by_login_id)
return email_list
diff --git a/seahub/api2/endpoints/share_links.py b/seahub/api2/endpoints/share_links.py
index 91b3fd792b..df4bfb6faf 100644
--- a/seahub/api2/endpoints/share_links.py
+++ b/seahub/api2/endpoints/share_links.py
@@ -2,6 +2,7 @@
import os
import stat
import json
+import time
import logging
import posixpath
from constance import config
@@ -112,6 +113,7 @@ def get_share_link_info(fileshare):
return data
+
def check_permissions_arg(request):
permissions = request.data.get('permissions', '')
@@ -144,6 +146,7 @@ def check_permissions_arg(request):
return perm
+
class ShareLinks(APIView):
authentication_classes = (TokenAuthentication, SessionAuthentication)
@@ -213,7 +216,8 @@ class ShareLinks(APIView):
try:
permission = seafile_api.check_permission_by_path(repo_id,
- folder_path, fileshare.username)
+ folder_path,
+ fileshare.username)
except Exception as e:
logger.error(e)
permission = ''
@@ -223,8 +227,7 @@ class ShareLinks(APIView):
links_info = []
for fs in fileshares:
link_info = get_share_link_info(fs)
- link_info['repo_folder_permission'] = \
- repo_folder_permission_dict.get(link_info['repo_id'], '')
+ link_info['repo_folder_permission'] = repo_folder_permission_dict.get(link_info['repo_id'], '')
links_info.append(link_info)
if len(links_info) == 1:
@@ -401,12 +404,13 @@ class ShareLinks(APIView):
error_msg = _('Share link %s already exists.' % fs.token)
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
fs = FileShare.objects.create_dir_link(username, repo_id, path,
- password, expire_date,
- permission=perm, org_id=org_id)
+ password, expire_date,
+ permission=perm, org_id=org_id)
link_info = get_share_link_info(fs)
return Response(link_info)
+
class ShareLink(APIView):
authentication_classes = (TokenAuthentication, SessionAuthentication)
@@ -477,7 +481,8 @@ class ShareLink(APIView):
username = request.user.username
repo_folder_permission = seafile_api.check_permission_by_path(repo_id,
- folder_path, username)
+ folder_path,
+ username)
if not repo_folder_permission:
error_msg = 'Permission denied.'
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
@@ -561,6 +566,17 @@ class ShareLinkOnlineOfficeLock(APIView):
3, File must have been locked by OnlineOffice.
"""
+ expire = request.data.get('expire', 0)
+ try:
+ expire = int(expire)
+ except ValueError:
+ error_msg = 'expire invalid.'
+ return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
+
+ if expire < 0:
+ error_msg = 'expire invalid.'
+ return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
+
if SHARE_LINK_LOGIN_REQUIRED and \
not request.user.is_authenticated():
error_msg = 'Permission denied.'
@@ -581,7 +597,8 @@ class ShareLinkOnlineOfficeLock(APIView):
path = normalize_file_path(share_link.path)
parent_dir = os.path.dirname(path)
if seafile_api.check_permission_by_path(repo_id,
- parent_dir, shared_by) != PERMISSION_READ_WRITE:
+ parent_dir,
+ shared_by) != PERMISSION_READ_WRITE:
error_msg = 'Permission denied.'
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
@@ -593,9 +610,11 @@ class ShareLinkOnlineOfficeLock(APIView):
locked_by_online_office = if_locked_by_online_office(repo_id, path)
if locked_by_online_office:
+
# refresh lock file
try:
- seafile_api.refresh_file_lock(repo_id, path)
+ seafile_api.refresh_file_lock(repo_id, path,
+ int(time.time()) + expire)
except SearpcError as e:
logger.error(e)
error_msg = 'Internal Server Error'
@@ -681,7 +700,8 @@ class ShareLinkDirents(APIView):
try:
current_commit = seafile_api.get_commit_list(repo_id, 0, 1)[0]
dirent_list = seafile_api.list_dir_by_commit_and_path(repo_id,
- current_commit.id, path, -1, -1)
+ current_commit.id,
+ path, -1, -1)
except Exception as e:
logger.error(e)
error_msg = 'Internal Server Error'
diff --git a/seahub/auth/forms.py b/seahub/auth/forms.py
index 3c639da8b0..52817b1757 100644
--- a/seahub/auth/forms.py
+++ b/seahub/auth/forms.py
@@ -7,6 +7,7 @@ from django.utils.http import int_to_base36
from seaserv import ccnet_api
from seahub.base.accounts import User
+from seahub.base.templatetags.seahub_tags import email2contact_email
from seahub.auth import authenticate
from seahub.auth.tokens import default_token_generator
from seahub.options.models import UserOptions
@@ -152,7 +153,8 @@ class PasswordResetForm(forms.Form):
}
send_html_email(_("Reset Password on %s") % site_name,
- email_template_name, c, None, [user.username])
+ email_template_name, c, None,
+ [email2contact_email(user.username)])
class SetPasswordForm(forms.Form):
"""
diff --git a/seahub/templates/snippets/wopi_onlyoffice_js.html b/seahub/templates/snippets/wopi_onlyoffice_js.html
deleted file mode 100644
index 95330ed847..0000000000
--- a/seahub/templates/snippets/wopi_onlyoffice_js.html
+++ /dev/null
@@ -1,59 +0,0 @@
-{% load i18n %}
-
-{% if enable_watermark %}
-
-
-{% endif %}
diff --git a/seahub/templates/view_file_onlyoffice.html b/seahub/templates/view_file_onlyoffice.html
index d90f20ea19..d498351be9 100644
--- a/seahub/templates/view_file_onlyoffice.html
+++ b/seahub/templates/view_file_onlyoffice.html
@@ -53,6 +53,67 @@ html, body { padding:0; margin:0; height:100%; }
};
var docEditor = new DocsAPI.DocEditor("placeholder", config);
-{% include 'snippets/wopi_onlyoffice_js.html' %}
+
+{% if enable_watermark %}
+
+
+{% endif %}