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

Disable share encrypt repo to unregistered email. Move out repo decrypt form.

This commit is contained in:
xiez
2012-09-17 18:01:51 +08:00
parent b005709194
commit fd0dad1c7c
5 changed files with 85 additions and 58 deletions

View File

@@ -40,7 +40,13 @@ def share_repo(request):
repo_id = form.cleaned_data['repo_id'] repo_id = form.cleaned_data['repo_id']
from_email = request.user.username from_email = request.user.username
# Test whether user is the repo owner repo = get_repo(repo_id)
if not repo:
raise Http404
is_encrypted = True if repo.encrypted else False
# Test whether user is the repo owner.
if not validate_owner(request, repo_id): if not validate_owner(request, repo_id):
return render_permission_error(request, u'只有目录拥有者有权共享目录') return render_permission_error(request, u'只有目录拥有者有权共享目录')
@@ -97,7 +103,8 @@ def share_repo(request):
# Generate shared link and send mail if user has not registered. # Generate shared link and send mail if user has not registered.
kwargs = {'repo_id': repo_id, kwargs = {'repo_id': repo_id,
'repo_owner': from_email, 'repo_owner': from_email,
'anon_email': to_email 'anon_email': to_email,
'is_encrypted': is_encrypted,
} }
anonymous_share(request, **kwargs) anonymous_share(request, **kwargs)
else: else:
@@ -169,6 +176,14 @@ def anonymous_share(request, email_template_name='repo/anonymous_share_email.htm
repo_id = kwargs['repo_id'] repo_id = kwargs['repo_id']
repo_owner = kwargs['repo_owner'] repo_owner = kwargs['repo_owner']
anon_email = kwargs['anon_email'] anon_email = kwargs['anon_email']
is_encrypted = kwargs['is_encrypted']
# Encrypt repo can not be shared to unregistered user.
if is_encrypted:
msg = u'共享给 %s 失败,加密目录无法共享给站外邮箱。' % anon_email
messages.error(request, msg)
return
token = anon_share_token_generator.make_token() token = anon_share_token_generator.make_token()
anon_share = AnonymousShare() anon_share = AnonymousShare()

View File

@@ -0,0 +1,26 @@
{% extends base_template %}
{% load url from future %}
{% block main_panel %}
<div class="repo-file-list-outer-container">
<div class="repo-file-list-inner-container">
<div class="repo-file-list-not-show">
<p class="access-notice">该目录已加密。如需在线查看里面的内容请输入解密密码。密码只会在服务器上暂存1小时。</p>
<form action="{{ SITE_ROOT }}repo/{{ repo.id }}/" method="post">
<label>密码:</label>
<input type="hidden" name="repo_id" value="{{ repo.id }}" />
<input type="hidden" name="username" value="{{ request.user.username }}" />
<input id="id_password" type="password" name="password" maxlength="64" />
{% for error in form.errors.values %}
<p class="error">{{ error|escape }}</p>
{% endfor %}
<input type="submit" value="提交" />
</form>
</div>
</div>
</div>
{% endblock %}
{% block extra_script %}
{% endblock %}

View File

@@ -16,26 +16,22 @@
{% block main_panel %} {% block main_panel %}
<div class="w100 ovhd"> <div class="w100 ovhd">
<h2 class="fleft">{{repo.props.name}}</h2> <h2 class="fleft">{{repo.props.name}}</h2>
{% if not repo.props.encrypted or password_set %} {% if user_perm == 'rw' %}
{% if can_access %}
<button id="repo-download-btn" class="fright">同步到本地</button> <button id="repo-download-btn" class="fright">同步到本地</button>
{% endif %} {% endif %}
{% endif %}
</div> </div>
<div id="repo-basic-info"> <div id="repo-basic-info">
<p class="desc">{{repo.props.desc}}</p> <p class="desc">{{repo.props.desc}}</p>
<p class="size">大小:{{ repo_size|filesizeformat }}</p> <p class="size">大小:{{ repo_size|filesizeformat }}</p>
</div> </div>
{% if not repo.props.encrypted or password_set %}
{% if can_access %}
<div id="repo-latest-commit"> <div id="repo-latest-commit">
<p class="commit-msg ovhd"> <p class="commit-msg ovhd">
<span class="fleft"> <span class="fleft">
{{ current_commit.props.desc|translate_commit_desc }} {{ current_commit.props.desc|translate_commit_desc }}
<a class="lsch" href="{{ SITE_ROOT }}repo/history/changes/{{ repo.id }}/?commit_id={{ current_commit.id }}" data="{{ current_commit.props.ctime|tsstr_sec }}">详情</a> <a class="lsch" href="{{ SITE_ROOT }}repo/history/changes/{{ repo.id }}/?commit_id={{ current_commit.id }}" data="{{ current_commit.props.ctime|tsstr_sec }}">详情</a>
</span> </span>
{% if request.user.is_authenticated %} {% if user_perm == 'rw' %}
<a href="{% url 'seahub.views.repo_history' repo.id %}" class="more fright">更多历史</a> <a href="{% url 'seahub.views.repo_history' repo.id %}" class="more fright">更多历史</a>
{% endif %} {% endif %}
</p> </p>
@@ -52,28 +48,10 @@
</p> </p>
<div id="ls-ch" class="hide"></div><!--list modification details of a commit--> <div id="ls-ch" class="hide"></div><!--list modification details of a commit-->
</div> </div>
{% endif %}
{% endif %}
<div class="repo-file-list-outer-container"> <div class="repo-file-list-outer-container">
<div class="repo-file-list-inner-container"> <div class="repo-file-list-inner-container">
{% if repo.props.encrypted and not password_set %} {% if not user_perm %}
<div class="repo-file-list-not-show">
<p class="access-notice">该目录已加密。如需在线查看里面的内容请输入解密密码。密码只会在服务器上暂存1小时。</p>
<form action="{{ SITE_ROOT }}repo/{{ repo.id }}/" method="post">
<label>密码:</label>
<input type="hidden" name="repo_id" value="{{ repo.id }}" />
<input type="hidden" name="username" value="{{ request.user.username }}" />
<input id="id_password" type="password" name="password" maxlength="64" />
{% for error in form.errors.values %}
<p class="error">{{ error|escape }}</p>
{% endfor %}
<input type="submit" value="提交" />
</form>
</div>
{% else %}
{% if not can_access %}
<div class="repo-file-list-not-show"> <div class="repo-file-list-not-show">
<p class="access-notice">无法在线查看该同步目录。</p> <p class="access-notice">无法在线查看该同步目录。</p>
</div> </div>
@@ -89,7 +67,7 @@
{% endif %} {% endif %}
{% endfor %} {% endfor %}
</p> </p>
{% if request.user.is_authenticated %} {% if user_perm == 'rw' %}
<div class="repo-op fright"> <div class="repo-op fright">
<button data="{{ SITE_ROOT }}repo/upload_file/{{repo.id}}/?p={{ path|urlencode }}" id="upload-file" class="op-btn">上传</button> <button data="{{ SITE_ROOT }}repo/upload_file/{{repo.id}}/?p={{ path|urlencode }}" id="upload-file" class="op-btn">上传</button>
<button id="add-new-dir" class="op-btn">新建目录</button> <button id="add-new-dir" class="op-btn">新建目录</button>
@@ -97,6 +75,7 @@
</div> </div>
{% endif %} {% endif %}
</div> </div>
<!-- /.repo-file-list-topbar -->
<table class="repo-file-list"> <table class="repo-file-list">
<tr> <tr>
<th width="5%"></th> <th width="5%"></th>
@@ -114,7 +93,7 @@
<td></td> <td></td>
<td> <td>
{% if request.user.is_authenticated %} {% if user_perm == 'rw' %}
<div class="repo-file-op vh"> <div class="repo-file-op vh">
<div class="displayed-op"> <div class="displayed-op">
<a class="op dir-rename" href="#" data="{{ dirent.obj_name }}">重命名</a> <a class="op dir-rename" href="#" data="{{ dirent.obj_name }}">重命名</a>
@@ -127,7 +106,7 @@
<li><a class="op dir-cp" href="#" data="{{ dirent.obj_name }}">复制</a></li> <li><a class="op dir-cp" href="#" data="{{ dirent.obj_name }}">复制</a></li>
</ul> </ul>
</div> </div>
{% endif %} {% endif %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
@@ -141,6 +120,7 @@
<td>{{ dirent.file_size|filesizeformat }}</td> <td>{{ dirent.file_size|filesizeformat }}</td>
<td> <td>
{% if user_perm == 'rw' %}
<div class="repo-file-op vh"> <div class="repo-file-op vh">
<div class="displayed-op"> <div class="displayed-op">
<a class="op" href="{{ SITE_ROOT }}repo/{{ repo.props.id }}/{{ dirent.props.obj_id }}/?file_name={{ dirent.props.obj_name }}&op=download">下载</a> <a class="op" href="{{ SITE_ROOT }}repo/{{ repo.props.id }}/{{ dirent.props.obj_id }}/?file_name={{ dirent.props.obj_name }}&op=download">下载</a>
@@ -150,21 +130,20 @@
<img src="{{ MEDIA_URL }}img/dropdown-arrow.png" title="更多操作" alt="更多操作" class="more-op-icon" data="no-popup" /> <img src="{{ MEDIA_URL }}img/dropdown-arrow.png" title="更多操作" alt="更多操作" class="more-op-icon" data="no-popup" />
<ul class="hidden-op hide"> <ul class="hidden-op hide">
<!--li><a class="op" href="{{ SITE_ROOT }}repo/{{ repo.props.id }}/{{ dirent.props.obj_id }}/?file_name={{ dirent.props.obj_name }}&op=download">下载</a></li--> <!--li><a class="op" href="{{ SITE_ROOT }}repo/{{ repo.props.id }}/{{ dirent.props.obj_id }}/?file_name={{ dirent.props.obj_name }}&op=download">下载</a></li-->
{% if request.user.is_authenticated %}
<li><a class="op" href="{{ SITE_ROOT }}repo/{{ repo.props.id }}/{{ dirent.props.obj_id }}/?p={{ path|urlencode }}&file_name={{ dirent.props.obj_name|urlencode }}&op=del">删除</a></li> <li><a class="op" href="{{ SITE_ROOT }}repo/{{ repo.props.id }}/{{ dirent.props.obj_id }}/?p={{ path|urlencode }}&file_name={{ dirent.props.obj_name|urlencode }}&op=del">删除</a></li>
<!--li><a class="op file-rename" href="#" data="{{ dirent.obj_name }}">重命名</a></li--> <!--li><a class="op file-rename" href="#" data="{{ dirent.obj_name }}">重命名</a></li-->
<li><a class="op file-mv" href="#" data="{{ dirent.obj_name }}">移动</a></li> <li><a class="op file-mv" href="#" data="{{ dirent.obj_name }}">移动</a></li>
<li><a class="op file-cp" href="#" data="{{ dirent.obj_name }}">复制</a></li> <li><a class="op file-cp" href="#" data="{{ dirent.obj_name }}">复制</a></li>
<!--li><a class="op file-update" href="{{ SITE_ROOT }}repo/update_file/{{repo.id}}/?p={{ path|urlencode }}{{dirent.obj_name|urlencode}}">更新</a></li--> <!--li><a class="op file-update" href="{{ SITE_ROOT }}repo/update_file/{{repo.id}}/?p={{ path|urlencode }}{{dirent.obj_name|urlencode}}">更新</a></li-->
<li><a href="{{ SITE_ROOT }}repo/revert_file/{{ repo.id }}/?commit={{ current_commit.id }}&p={{path|urlencode}}{{ dirent.obj_name|urlencode }}&from=repo_history" class="op file-revert">还原</a></li> <li><a href="{{ SITE_ROOT }}repo/revert_file/{{ repo.id }}/?commit={{ current_commit.id }}&p={{path|urlencode}}{{ dirent.obj_name|urlencode }}&from=repo_history" class="op file-revert">还原</a></li>
{% endif %}
</ul> </ul>
</div> </div>
{% endif %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
{% endif %} <!-- /.repo-file-list -->
{% endif %} {% endif %}
</div> </div>
</div> </div>

View File

@@ -9,7 +9,6 @@
<button data="{{ SITE_ROOT }}repo/history/{{ repo.id }}/" class="fright" id="back-to-history-list">返回历史列表</button> <button data="{{ SITE_ROOT }}repo/history/{{ repo.id }}/" class="fright" id="back-to-history-list">返回历史列表</button>
</div> </div>
{% if can_access %}
<div id="repo-latest-commit"> <div id="repo-latest-commit">
<p class="commit-msg">{{ current_commit.props.desc|translate_commit_desc }}</p> <p class="commit-msg">{{ current_commit.props.desc|translate_commit_desc }}</p>
<p class="meta-info"> <p class="meta-info">
@@ -24,25 +23,10 @@
<span class="time">{{ current_commit.props.ctime|translate_commit_time }}</span> <span class="time">{{ current_commit.props.ctime|translate_commit_time }}</span>
</p> </p>
</div> </div>
{% endif %}
<div class="repo-file-list-outer-container"> <div class="repo-file-list-outer-container">
<div class="repo-file-list-inner-container"> <div class="repo-file-list-inner-container">
{% if repo.props.encrypted and not password_set %} {% if not user_perm %}
<div class="repo-file-list-not-show">
<p class="access-notice">该目录已加密。如需在线查看里面的内容请输入解密密码。密码只会在服务器上暂存1小时。</p>
<form action="{{ SITE_ROOT }}repo/{{ repo.id }}/" method="post">
<label>密码:</label>
<input id="id_password" type="password" name="password" maxlength="64" /><br />
{% if error %}
<p class="error">{{ error }}</p>
{% endif %}
<input type="submit" value="提交" />
</form>
</div>
{% else %}
{% if not can_access %}
<div class="repo-file-list-not-show"> <div class="repo-file-list-not-show">
<p class="access-notice">无法在线查看该同步目录。</p> <p class="access-notice">无法在线查看该同步目录。</p>
</div> </div>
@@ -59,6 +43,7 @@
{% endfor %} {% endfor %}
</p> </p>
</div> </div>
<!-- /.repo-file-list-topbar -->
<table class="repo-file-list"> <table class="repo-file-list">
<tr> <tr>
<th width="5%"></th> <th width="5%"></th>
@@ -93,7 +78,7 @@
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
{% endif %} <!-- /.repo-file-list -->
{% endif %} {% endif %}
</div> </div>
</div> </div>

View File

@@ -110,6 +110,14 @@ def access_to_repo(request, repo_id, repo_ap=None):
else: else:
return check_permission(repo_id, request.user.username) return check_permission(repo_id, request.user.username)
def get_user_permission(request, repo_id):
if request.user.is_authenticated():
return 'rw' if check_permission(repo_id, request.user.username) else \
''
else:
token = request.COOKIES.get('anontoken', None)
return 'r' if token else ''
def gen_path_link(path, repo_name): def gen_path_link(path, repo_name):
""" """
Generate navigate paths and links in repo page. Generate navigate paths and links in repo page.
@@ -210,7 +218,8 @@ class RepoMixin(object):
self.path = self.get_path() self.path = self.get_path()
self.repo = self.get_repo(self.repo_id) self.repo = self.get_repo(self.repo_id)
self.repo_size = self.get_repo_size() self.repo_size = self.get_repo_size()
self.can_access = access_to_repo(self.request, self.repo_id) # self.can_access = access_to_repo(self.request, self.repo_id)
self.user_perm = get_user_permission(self.request, self.repo_id)
self.current_commit = self.get_current_commit() self.current_commit = self.get_current_commit()
self.password_set = self.is_password_set() self.password_set = self.is_password_set()
@@ -239,7 +248,13 @@ class RepoView(CtxSwitchRequiredMixin, RepoMixin, TemplateResponseMixin,
View to show repo page and handle post request to decrypt repo. View to show repo page and handle post request to decrypt repo.
""" """
form_class = RepoPassowrdForm form_class = RepoPassowrdForm
template_name = 'repo.html'
def get_template_names(self):
if self.repo.encrypted and not self.password_set:
template_name = 'decrypt_repo_form.html'
else:
template_name = 'repo.html'
return template_name
def get_accessible_repos(self): def get_accessible_repos(self):
if self.user.is_authenticated(): if self.user.is_authenticated():
@@ -266,7 +281,8 @@ class RepoView(CtxSwitchRequiredMixin, RepoMixin, TemplateResponseMixin,
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
kwargs['repo'] = self.repo kwargs['repo'] = self.repo
kwargs['can_access'] = self.can_access # kwargs['can_access'] = self.can_access
kwargs['user_perm'] = self.user_perm
kwargs['current_commit'] = self.get_current_commit() kwargs['current_commit'] = self.get_current_commit()
kwargs['password_set'] = self.password_set kwargs['password_set'] = self.password_set
kwargs['repo_size'] = self.repo_size kwargs['repo_size'] = self.repo_size
@@ -284,7 +300,12 @@ class RepoHistoryView(LoginRequiredMixin, CtxSwitchRequiredMixin, RepoMixin,
""" """
View to show repo page in history. View to show repo page in history.
""" """
template_name = 'repo_history_view.html' def get_template_names(self):
if self.repo.encrypted and not self.password_set:
template_name = 'decrypt_repo_form.html'
else:
template_name = 'repo_history_view.html'
return template_name
def get_current_commit(self): def get_current_commit(self):
commit_id = self.request.GET.get('commit_id', '') commit_id = self.request.GET.get('commit_id', '')
@@ -297,7 +318,8 @@ class RepoHistoryView(LoginRequiredMixin, CtxSwitchRequiredMixin, RepoMixin,
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
kwargs['repo'] = self.repo kwargs['repo'] = self.repo
kwargs['can_access'] = self.can_access # kwargs['can_access'] = self.can_access
kwargs['user_perm'] = self.user_perm
kwargs['current_commit'] = self.get_current_commit() kwargs['current_commit'] = self.get_current_commit()
kwargs['password_set'] = self.password_set kwargs['password_set'] = self.password_set
kwargs['repo_size'] = self.repo_size kwargs['repo_size'] = self.repo_size