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

Remove users' repo decrypt passwords from server when log out

This commit is contained in:
zhengxie
2012-11-22 14:26:39 +08:00
parent 8dc8e158ee
commit 047ccae72d
5 changed files with 88 additions and 27 deletions

View File

@@ -11,7 +11,9 @@ from auth.models import get_hexdigest, check_password
from auth import authenticate, login from auth import authenticate, login
from registration import signals from registration import signals
#from registration.forms import RegistrationForm #from registration.forms import RegistrationForm
from seaserv import ccnet_threaded_rpc from seaserv import ccnet_threaded_rpc, unset_repo_passwd, is_passwd_set
from seahub.utils import get_user_repos
class UserManager(object): class UserManager(object):
def create_user(self, email, password=None, is_staff=False, is_active=False): def create_user(self, email, password=None, is_staff=False, is_active=False):
@@ -141,7 +143,38 @@ class User(object):
"Sends an e-mail to this User." "Sends an e-mail to this User."
from django.core.mail import send_mail from django.core.mail import send_mail
send_mail(subject, message, from_email, [self.email]) send_mail(subject, message, from_email, [self.email])
def remove_repo_passwds(self):
"""
Remove all repo decryption passwords stored on server.
"""
owned_repos, shared_repos, groups_repos = get_user_repos(self)
def has_repo(repos, repo):
for r in repos:
if repo.id == r.id:
return True
return False
passwd_setted_repos = []
for r in owned_repos + groups_repos:
if not has_repo(passwd_setted_repos, r) and r.encrypted and \
is_passwd_set(r.id, self.email):
passwd_setted_repos.append(r)
for r in shared_repos:
# For compatibility with diffrent fields names in Repo and
# SharedRepo objects.
r.id = r.repo_id
r.name = r.repo_name
r.desc = r.repo_desc
if not has_repo(passwd_setted_repos, r) and r.encrypted and \
is_passwd_set(r.id, self.email):
passwd_setted_repos.append(r)
for r in passwd_setted_repos:
unset_repo_passwd(r.id, self.email)
class RegistrationBackend(object): class RegistrationBackend(object):
""" """
A registration backend which follows a simple workflow: A registration backend which follows a simple workflow:

View File

@@ -85,9 +85,14 @@ def logout(request):
""" """
Removes the authenticated user's ID from the request and flushes their Removes the authenticated user's ID from the request and flushes their
session data. session data.
Also remove all passwords used to decrypt repos.
""" """
request.session.flush() request.session.flush()
if hasattr(request, 'user'): if hasattr(request, 'user'):
# NOTE: must include `seahub` before `base`
from seahub.base.accounts import User
if isinstance(request.user, User):
request.user.remove_repo_passwds()
from auth.models import AnonymousUser from auth.models import AnonymousUser
request.user = AnonymousUser() request.user = AnonymousUser()

View File

@@ -2,7 +2,7 @@
import service import service
from service import ccnet_rpc, monitor_rpc, seafserv_rpc, \ from service import ccnet_rpc, monitor_rpc, seafserv_rpc, \
seafserv_threaded_rpc, ccnet_threaded_rpc seafserv_threaded_rpc, ccnet_threaded_rpc
from service import send_command, check_quota, web_get_access_token from service import send_command, check_quota, web_get_access_token, unset_repo_passwd
from service import get_emailusers from service import get_emailusers
from service import get_org_groups, get_personal_groups_by_user, \ from service import get_org_groups, get_personal_groups_by_user, \
get_group_repoids, get_personal_groups, \ get_group_repoids, get_personal_groups, \

View File

@@ -590,13 +590,6 @@ def check_permission(repo_id, user):
ret = "" ret = ""
return ret return ret
def is_passwd_set(repo_id, user):
try:
ret = seafserv_rpc.is_passwd_set(repo_id, user)
except SearpcError, e:
ret = -1
return True if ret == 1 else False
def is_personal_repo(repo_id): def is_personal_repo(repo_id):
""" """
Check whether repo is personal repo. Check whether repo is personal repo.
@@ -738,3 +731,24 @@ def web_get_access_token(repo_id, obj_id, op, username):
ret = '' ret = ''
return ret return ret
# password management
def unset_repo_passwd(repo_id, user):
"""
Remove user password of a encrypt repo.
Arguments:
- `repo_id`: encrypt repo id
- `user`: username
"""
try:
ret = seafserv_threaded_rpc.unset_passwd(repo_id, user)
except SearpcError, e:
ret = -1
return ret
def is_passwd_set(repo_id, user):
try:
ret = seafserv_rpc.is_passwd_set(repo_id, user)
except SearpcError, e:
ret = -1
return True if ret == 1 else False

View File

@@ -175,7 +175,32 @@ def check_filename_with_rename(repo_id, parent_dir, filename):
else: else:
i += 1 i += 1
def get_user_repos(user):
"""
Get all repos that user can access, including owns, shared, and repo in
groups.
NOTE: collumn names in shared_repo struct are not same as owned or group
repos.
"""
email = user.username
if user.org:
# org context
org_id = user.org['org_id']
owned_repos = list_org_repos_by_owner(org_id, email)
shared_repos = list_personal_shared_repos(email, 'to_email', -1, -1)
groups_repos = []
for group in get_org_groups_by_user(org_id, email):
groups_repos += get_org_group_repos(org_id, group.id, email)
else:
# personal context
owned_repos = list_personal_repos_by_owner(email)
shared_repos = list_personal_shared_repos(email, 'to_email', -1, -1)
groups_repos = []
for group in get_personal_groups_by_user(email):
groups_repos += get_group_repos(group.id, email)
return (owned_repos, shared_repos, groups_repos)
def get_accessible_repos(request, repo): def get_accessible_repos(request, repo):
"""Get all repos the current user can access when coping/moving files """Get all repos the current user can access when coping/moving files
online. If the repo is encrypted, then files can only be copied/moved online. If the repo is encrypted, then files can only be copied/moved
@@ -200,23 +225,7 @@ def get_accessible_repos(request, repo):
accessible_repos = [repo] accessible_repos = [repo]
return accessible_repos return accessible_repos
email = request.user.username owned_repos, shared_repos, groups_repos = get_user_repos(request.user)
if request.user.org:
# org context
org_id = request.user.org['org_id']
owned_repos = list_org_repos_by_owner(org_id, email)
shared_repos = list_personal_shared_repos(email, 'to_email', -1, -1)
groups_repos = []
for group in get_org_groups_by_user(org_id, email):
groups_repos += get_org_group_repos(org_id, group.id, email)
else:
# personal context
owned_repos = list_personal_repos_by_owner(email)
shared_repos = list_personal_shared_repos(email, 'to_email', -1, -1)
groups_repos = []
for group in get_personal_groups_by_user(email):
groups_repos += get_group_repos(group.id, email)
def has_repo(repos, repo): def has_repo(repos, repo):
for r in repos: for r in repos: