1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-08-01 15:23:05 +00:00

Refactor auth and rename CcnetUser to User

This commit is contained in:
xiez 2012-08-07 16:48:26 +08:00
parent 8349e5f9c7
commit 85fb879c74
17 changed files with 188 additions and 186 deletions

View File

@ -10,7 +10,7 @@ from auth.decorators import login_required, api_login_required
from seaserv import ccnet_rpc, ccnet_threaded_rpc, get_repos, \
get_repo, get_commits, get_branches, \
seafserv_threaded_rpc, seafserv_rpc, get_binding_peerids, get_ccnetuser, \
seafserv_threaded_rpc, seafserv_rpc, get_binding_peerids, \
get_group_repoids, check_group_staff
from seahub.utils import list_to_string, \

View File

@ -9,7 +9,7 @@ from django.utils.hashcompat import md5_constructor
from django.utils.encoding import smart_str
from django.db.models import signals
from seahub.base.accounts import CcnetUser
from seahub.base.accounts import User
try:
from cStringIO import StringIO

View File

@ -5,8 +5,7 @@ from django.utils.translation import ugettext as _
from django.utils.hashcompat import md5_constructor
from django.core.urlresolvers import reverse
from seahub.base.accounts import CcnetUser
from seaserv import get_ccnetuser
from seahub.base.accounts import User
from avatar.settings import (AVATAR_GRAVATAR_BACKUP, AVATAR_GRAVATAR_DEFAULT,
AVATAR_DEFAULT_SIZE)
@ -35,12 +34,12 @@ def avatar_url(user, size=AVATAR_DEFAULT_SIZE):
@cache_result
@register.simple_tag
def avatar(user, size=AVATAR_DEFAULT_SIZE):
if not isinstance(user, CcnetUser):
if not isinstance(user, User):
try:
user = get_ccnetuser(username=user)
user = User.objects.get(email=user)
alt = unicode(user)
url = avatar_url(user, size)
except:
except User.DoesNotExist:
url = get_default_avatar_url()
alt = _("Default Avatar")
else:

View File

@ -1,9 +1,7 @@
from django.conf import settings
from django.core.cache import cache
from seahub.base.accounts import CcnetUser
from seaserv import get_ccnetuser
from seahub.base.accounts import User
from avatar.settings import (AVATAR_DEFAULT_URL, AVATAR_CACHE_TIMEOUT,
AUTO_GENERATE_AVATAR_SIZES, AVATAR_DEFAULT_SIZE)
@ -14,7 +12,7 @@ def get_cache_key(user_or_username, size, prefix):
"""
Returns a cache key consisten of a username and image size.
"""
if isinstance(user_or_username, CcnetUser):
if isinstance(user_or_username, User):
user_or_username = user_or_username.username
return '%s_%s_%s' % (prefix, user_or_username, size)
@ -62,10 +60,10 @@ def get_default_avatar_url():
return '%s%s' % (base_url, AVATAR_DEFAULT_URL)
def get_primary_avatar(user, size=AVATAR_DEFAULT_SIZE):
if not isinstance(user, CcnetUser):
if not isinstance(user, User):
try:
user = get_ccnetuser(username=user)
except:
user = User.objects.get(email=user)
except User.DoesNotExist:
return None
try:
# Order by -primary first; this means if a primary=True avatar exists

View File

@ -12,76 +12,98 @@ from auth import authenticate, login
from registration import signals
#from registration.forms import RegistrationForm
from registration.models import RegistrationProfile
from seaserv import ccnet_rpc, ccnet_threaded_rpc, get_ccnetuser
from seaserv import ccnet_threaded_rpc
class UserManager(object):
def create_user(self, username, password=None, is_staff=False, is_active=False):
ccnet_threaded_rpc.add_emailuser(username, password, int(is_staff), int(is_active))
def create_user(self, email, password=None, is_staff=False, is_active=False):
"""
Creates and saves a User with given username and password.
"""
# Normalize the address by lowercasing the domain part of the email
# address.
try:
email_name, domain_part = email.strip().split('@', 1)
except ValueError:
pass
else:
email = '@'.join([email_name, domain_part.lower()])
ccnetuser = get_ccnetuser(username=username)
return ccnetuser
user = User(email=email)
user.password = password
user.is_staff = is_staff
user.is_active = is_active
user.save()
def convert_to_ccnetuser(emailuser):
ccnetuser = CcnetUser(emailuser.props.email,
raw_password='')
ccnetuser.id = emailuser.props.id
ccnetuser.email = emailuser.props.email
ccnetuser.password = emailuser.props.passwd
ccnetuser.is_staff = emailuser.props.is_staff
ccnetuser.is_active = emailuser.props.is_active
ccnetuser.ctime = emailuser.props.ctime
ccnetuser.org = emailuser.org
return self.get(email=email)
def get(self, email=None, id=None):
if email:
emailuser = ccnet_threaded_rpc.get_emailuser(email)
if id:
emailuser = ccnet_threaded_rpc.get_emailuser_by_id(id)
if not emailuser:
raise User.DoesNotExist, 'User matching query does not exits.'
return ccnetuser
user = User(emailuser.email)
user.id = emailuser.id
user.password = emailuser.passwd
user.is_staff = emailuser.is_staff
user.is_active = emailuser.is_active
user.ctime = emailuser.ctime
user.org = emailuser.org
return user
class CcnetUser(object):
class User(object):
is_staff = False
is_active = False
objects = UserManager()
is_superuser = False
groups = []
org = None
objects = UserManager()
class DoesNotExist(Exception):
pass
def __init__(self, username, raw_password):
self.username = username
self.raw_password = raw_password
def __init__(self, email):
self.username = email
self.email = email
def __unicode__(self):
return self.username
def validate_emailuser(self, email, raw_password):
self.set_password(raw_password)
return ccnet_threaded_rpc.validate_emailuser(email, raw_password)
def is_authenticated(self):
"""
Always return True. This is a way to tell if the user has been
authenticated in templates.
"""
return True
def is_anonymous(self):
"""
Always returns False. This is a way of comparing User objects to
anonymous users.
"""
return False
def is_authenticated(self):
"""
Always return True. This is a way to tell if the user has been
authenticated in templates.
"""
return True
def save(self):
emailuser = ccnet_threaded_rpc.get_emailuser(self.username)
if emailuser:
ccnet_threaded_rpc.update_emailuser(self.id, self.password,
int(self.is_staff), int(self.is_active))
ccnet_threaded_rpc.update_emailuser(emailuser.id, self.password,
int(self.is_staff),
int(self.is_active))
else:
self.objects.create_user(username=self.username,
password=self.raw_password,
is_staff=self.is_staff,
is_active=self.is_active)
ccnet_threaded_rpc.add_emailuser(self.username, self.password,
int(self.is_staff),
int(self.is_active))
def delete(self):
"""
Remove from ccnet EmailUser table and Binding table
When delete user, we should also delete group relationships.
"""
# TODO: what about repo and org?
ccnet_threaded_rpc.remove_emailuser(self.username)
ccnet_threaded_rpc.remove_binding(self.username)
ccnet_threaded_rpc.remove_group_user(self.username)
def get_and_delete_messages(self):
messages = []
@ -104,15 +126,15 @@ class CcnetUser(object):
# algorithm or salt.
if '$' not in self.password:
is_correct = (self.password == get_hexdigest('sha1', '', raw_password))
is_correct = (self.password == \
get_hexdigest('sha1', '', raw_password))
return is_correct
return check_password(raw_password, self.password)
def email_user(self, subject, message, from_email=None):
"Sends an e-mail to this User."
from django.core.mail import send_mail
send_mail(subject, message, from_email, [self.username])
send_mail(subject, message, from_email, [self.email])
class RegistrationBackend(object):
"""

View File

@ -1,10 +1,11 @@
# encoding: utf-8
from django import forms
from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _
from seaserv import ccnet_rpc, ccnet_threaded_rpc, is_valid_filename
from seahub.base.accounts import User
class AddUserForm(forms.Form):
"""
Form for adding a user.
@ -16,11 +17,12 @@ class AddUserForm(forms.Form):
def clean_email(self):
email = self.cleaned_data['email']
emailuser = ccnet_threaded_rpc.get_emailuser(email)
if not emailuser:
return self.cleaned_data['email']
else:
raise forms.ValidationError(_("A user with this email already"))
try:
user = User.objects.get(email=email)
raise forms.ValidationError(_("A user with this email already"))
except User.DoesNotExist:
return self.cleaned_data['email']
def clean(self):
"""
Verifiy that the values entered into the two password fields

View File

@ -21,7 +21,7 @@ from seahub.profile.models import Profile
from seahub.settings import SITE_ROOT
from seahub.utils import render_error, render_permission_error, \
validate_group_name, emails2list
from seahub.views import validate_emailuser
from seahub.views import is_registered_user
@login_required
def group_list(request):
@ -397,7 +397,7 @@ def group_members(request, group_id):
mail_sended.send(sender=None, user=request.user.username,
email=member_name)
if not validate_emailuser(member_name):
if not is_registered_user(member_name):
err_msg = u'无法添加成员,用户 %s 不存在' % member_name
return render_error(request, err_msg)
else:

View File

@ -15,7 +15,7 @@ from pysearpc import SearpcError
from seaserv import ccnet_threaded_rpc, seafserv_threaded_rpc, \
get_orgs_by_user, get_org_repos, \
get_org_by_url_prefix, create_org, get_user_current_org, add_org_user, \
get_ccnetuser, remove_org_user, get_org_groups, is_valid_filename, \
remove_org_user, get_org_groups, is_valid_filename, \
create_org_repo, get_org_id_by_group
from decorators import org_staff_required
@ -23,6 +23,7 @@ from forms import OrgCreateForm
from signals import org_user_added
from notifications.models import UserNotification
from registration.models import RegistrationProfile
from seahub.base.accounts import User
from seahub.contacts import Contact
from seahub.forms import RepoCreateForm
import seahub.settings as seahub_settings
@ -160,7 +161,8 @@ def org_useradmin(request, url_prefix):
continue
org_id = request.user.org['org_id']
if get_ccnetuser(username=email):
try:
User.objects.get(email=email)
email = email.strip(' ')
org_id = request.user.org['org_id']
add_org_user(org_id, email, 0)
@ -169,7 +171,7 @@ def org_useradmin(request, url_prefix):
org_user_added.send(sender=None, org_id=org_id,
from_email=request.user.username,
to_email=email)
else:
except User.DoesNotExist:
# User is not registered, just create account and
# add that account to org
password = gen_token(max_length=6)

View File

@ -12,6 +12,7 @@ from pysearpc import SearpcError
from forms import ProfileForm
from models import Profile
from utils import render_error
from seahub.base.accounts import User
from seahub.contacts.models import Contact
#@login_required
@ -74,10 +75,10 @@ def user_profile(request, user):
user_nickname = ''
user_intro = ''
err_msg = ''
try:
user_check = ccnet_threaded_rpc.get_emailuser(user)
except:
user_check = User.objects.get(email=user)
except User.DoesNotExist:
user_check = None
if user_check:
@ -114,10 +115,10 @@ def get_user_profile(request, user):
'new_user': ''
}
content_type = 'application/json; charset=utf-8'
try:
user_check = ccnet_threaded_rpc.get_emailuser(user)
except:
user_check = User.objects.get(email=user)
except User.DoesNotExist:
user_check = None
if user_check:

View File

@ -19,7 +19,7 @@ from settings import ANONYMOUS_SHARE_COOKIE_TIMEOUT
from tokens import anon_share_token_generator
from seahub.contacts.signals import mail_sended
from seahub.share.models import FileShare
from seahub.views import validate_owner, validate_emailuser
from seahub.views import validate_owner, is_registered_user
from seahub.utils import render_permission_error, emails2list
@login_required
@ -86,7 +86,7 @@ def share_repo(request):
messages.add_message(request, messages.ERROR, to_email)
continue
if not validate_emailuser(to_email):
if not is_registered_user(to_email):
# Generate shared link and send mail if user has not registered.
kwargs = {'repo_id': repo_id,
'repo_owner': from_email,

View File

@ -1,8 +1,6 @@
from django.db import connection
from seahub.base.accounts import CcnetUser
from seaserv import ccnet_rpc, get_ccnetuser
from seahub.base.accounts import User
class ModelBackend(object):
"""
@ -14,11 +12,12 @@ class ModelBackend(object):
# TODO: Model, login attribute name and password attribute name should be
# configurable.
def authenticate(self, username=None, password=None):
ccnetuser = get_ccnetuser(username=username)
if ccnetuser and ccnetuser.check_password(password):
return ccnetuser
return None
try:
user = User.objects.get(email=username)
if user.check_password(password):
return user
except User.DoesNotExist:
return None
def get_group_permissions(self, user_obj):
"""
@ -53,5 +52,9 @@ class ModelBackend(object):
return False
def get_user(self, username):
return get_ccnetuser(username=username)
try:
user = User.objects.get(email=username)
except User.DoesNotExist:
user = None
return user

View File

@ -7,8 +7,7 @@ from django import forms
from django.utils.translation import ugettext_lazy as _
from django.utils.http import int_to_base36
from seaserv import get_ccnetuser
from seahub.base.accounts import User
class AuthenticationForm(forms.Form):
"""
@ -64,8 +63,10 @@ class PasswordResetForm(forms.Form):
"""
email = self.cleaned_data["email"]
self.users_cache = get_ccnetuser(username=email)
if not self.users_cache:
# TODO: add filter method to UserManager
try:
self.users_cache = User.objects.get(email=email)
except User.DoesNotExist:
raise forms.ValidationError(_("That e-mail address doesn't have an associated user account. Are you sure you've registered?"))
return email
@ -77,7 +78,7 @@ class PasswordResetForm(forms.Form):
"""
from django.core.mail import send_mail
ccnetuser = self.users_cache
user = self.users_cache
if not domain_override:
current_site = Site.objects.get_current()
site_name = current_site.name
@ -87,16 +88,16 @@ class PasswordResetForm(forms.Form):
t = loader.get_template(email_template_name)
c = {
'email': ccnetuser.username,
'email': user.username,
'domain': domain,
'site_name': site_name,
'uid': int_to_base36(ccnetuser.id),
'user': ccnetuser,
'token': token_generator.make_token(ccnetuser),
'uid': int_to_base36(user.id),
'user': user,
'token': token_generator.make_token(user),
'protocol': use_https and 'https' or 'http',
}
send_mail(_("Password reset on %s") % site_name,
t.render(Context(c)), None, [ccnetuser.username])
t.render(Context(c)), None, [user.username])
class SetPasswordForm(forms.Form):
"""

View File

@ -18,7 +18,7 @@ from auth.forms import AuthenticationForm
from auth.forms import PasswordResetForm, SetPasswordForm, PasswordChangeForm
from auth.tokens import default_token_generator
from seaserv import get_ccnetuser
from seahub.base.accounts import User
@csrf_protect
@never_cache
@ -150,19 +150,16 @@ def password_reset_confirm(request, uidb36=None, token=None, template_name='regi
post_reset_redirect = reverse('auth.views.password_reset_complete')
try:
uid_int = base36_to_int(uidb36)
except ValueError:
raise Http404
user = User.objects.get(id=uid_int)
except (ValueError, User.DoesNotExist):
user = None
ccnetuser = get_ccnetuser(userid=uid_int)
if not ccnetuser:
raise Http404
context_instance = RequestContext(request)
if token_generator.check_token(ccnetuser, token):
if token_generator.check_token(user, token):
context_instance['validlink'] = True
if request.method == 'POST':
form = set_password_form(ccnetuser, request.POST)
form = set_password_form(user, request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(post_reset_redirect)

View File

@ -10,7 +10,6 @@ from django.template.loader import render_to_string
from django.utils.hashcompat import sha_constructor
from django.utils.translation import ugettext_lazy as _
from seaserv import ccnet_rpc, ccnet_threaded_rpc, get_ccnetuser
SHA1_RE = re.compile('^[a-f0-9]{40}$')
@ -52,13 +51,16 @@ class RegistrationManager(models.Manager):
except self.model.DoesNotExist:
return False
if not profile.activation_key_expired():
# Activate emailuser
ccnetuser = get_ccnetuser(userid=profile.emailuser_id)
ccnetuser.is_active = True
ccnetuser.save()
profile.activation_key = self.model.ACTIVATED
profile.save()
return ccnetuser
# Activate user
try:
user = User.objects.get(id=profile.emailuser_id)
user.is_active = True
user.save()
profile.activation_key = self.model.ACTIVATED
profile.save()
return user
except User.DoesNotExist:
return False
return False
def create_email_user(self, username, email, password,
@ -72,19 +74,17 @@ class RegistrationManager(models.Manager):
user. To disable this, pass ``send_email=False``.
"""
from seahub.base.accounts import CcnetUser
ccnetuser = CcnetUser.objects.create_user(username, password, False, False)
#TODO: handle None type
ccnetuser.is_active = is_active
ccnetuser.save()
user = User.objects.create_user(username, password, False, False)
user.is_active = is_active
user.save()
registration_profile = self.create_profile(ccnetuser)
registration_profile = self.create_profile(user)
if send_email:
registration_profile.send_activation_email(site)
return ccnetuser
return user
def create_inactive_user(self, username, email, password,
site, send_email=True):
@ -160,9 +160,13 @@ class RegistrationManager(models.Manager):
"""
for profile in self.all():
if profile.activation_key_expired():
ccnetuser = get_ccnetuser(userid=profile.emailuser_id)
if not ccnetuser.is_active:
ccnet_threaded_rpc.remove_emailuser(ccnetuser.username)
try:
user = User.objects.get(id=profile.emailuser_id)
if not user.is_active:
user.delete()
except User.DoesNotExist:
pass
class RegistrationProfile(models.Model):
"""
@ -218,11 +222,14 @@ class RegistrationProfile(models.Model):
"""
expiration_date = datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS)
ccnetuser = get_ccnetuser(userid=self.emailuser_id)
try:
user = User.objects.get(id=self.emailuser_id)
except User.DoesNotExist:
return False
return self.activation_key == self.ACTIVATED or \
(datetime.datetime.fromtimestamp(ccnetuser.ctime/1000000) + expiration_date <= datetime.datetime.now())
(datetime.datetime.fromtimestamp(user.ctime/1000000) + expiration_date <= datetime.datetime.now())
activation_key_expired.boolean = True
@ -276,6 +283,11 @@ class RegistrationProfile(models.Model):
message = render_to_string('registration/activation_email.txt',
ctx_dict)
ccnetuser = get_ccnetuser(userid=self.emailuser_id)
ccnetuser.email_user(subject, message, settings.DEFAULT_FROM_EMAIL)
try:
user = User.objects.get(id=self.emailuser_id)
user.email_user(subject, message, settings.DEFAULT_FROM_EMAIL)
except User.DoesNotExist:
pass
# We put this import here to prevent circular import
from seahub.base.accounts import User

View File

@ -3,7 +3,7 @@ import service
from service import ccnet_rpc, monitor_rpc, seafserv_rpc, \
seafserv_threaded_rpc, ccnet_threaded_rpc
from service import send_command
from service import get_ccnetuser, get_emailusers
from service import get_emailusers
from service import get_org_groups, get_personal_groups, get_group_repoids, \
check_group_staff, remove_group_user, get_group, get_org_id_by_group
from service import get_repos, get_repo, get_commits, get_branches, \

View File

@ -86,47 +86,12 @@ else:
#### Basic ccnet API ####
def get_ccnetuser(username=None, userid=None):
# Get emailuser from db
if username:
emailuser = ccnet_threaded_rpc.get_emailuser(username)
if userid:
emailuser = ccnet_threaded_rpc.get_emailuser_by_id(userid)
if not emailuser:
return None
# Check whether is business account
# orgs = ccnet_threaded_rpc.get_orgs_by_user(emailuser.email)
# emailuser.org = org
# And convert to ccnetuser
from seahub.base.accounts import convert_to_ccnetuser
ccnetuser = convert_to_ccnetuser(emailuser)
return ccnetuser
def get_emailusers(start, limit):
try:
users = ccnet_threaded_rpc.get_emailusers(start, limit)
except SearpcError:
users = []
return users
# def get_groups():
# """Get group object list. """
# group_ids = ccnet_threaded_rpc.list_groups()
# if not group_ids:
# return []
# groups = []
# for group_id in group_ids.split("\n"):
# # too handle the ending '\n'
# if group_id == '':
# continue
# group = ccnet_threaded_rpc.get_group(group_id)
# groups.append(group)
# return groups
def get_group(group_id):
group_id_int = int(group_id)
@ -138,8 +103,8 @@ def get_group(group_id):
def check_group_staff(group_id_int, user_or_username):
"""Check where user is group staff"""
from seahub.base.accounts import CcnetUser
if isinstance(user_or_username, CcnetUser):
from seahub.base.accounts import User
if isinstance(user_or_username, User):
user_or_username = user_or_username.username
return ccnet_threaded_rpc.check_group_staff(group_id_int, user_or_username)

View File

@ -30,12 +30,12 @@ from auth.tokens import default_token_generator
from share.models import FileShare
from seaserv import ccnet_rpc, ccnet_threaded_rpc, get_repos, get_emailusers, \
get_repo, get_commits, get_branches, is_valid_filename, remove_group_user,\
seafserv_threaded_rpc, seafserv_rpc, get_binding_peerids, get_ccnetuser, \
seafserv_threaded_rpc, seafserv_rpc, get_binding_peerids, \
get_group_repoids, check_group_staff, get_personal_groups, is_repo_owner, \
get_group
from pysearpc import SearpcError
from seahub.base.accounts import CcnetUser
from seahub.base.accounts import User
from seahub.base.models import UuidObjidMap
from seahub.contacts.models import Contact
from seahub.contacts.signals import mail_sended
@ -68,20 +68,17 @@ def validate_owner(request, repo_id):
return True if ret else False
def validate_emailuser(emailuser):
def is_registered_user(email):
"""
Check whether user is registerd.
"""
try:
user = ccnet_threaded_rpc.get_emailuser(emailuser)
except:
user = User.objects.get(email=email)
except User.DoesNotExist:
user = None
if user:
return True
else:
return False
return True if user else False
def check_shared_repo(request, repo_id):
"""
@ -1208,22 +1205,25 @@ def user_remove(request, user_id):
if not request.user.is_staff:
raise Http404
ccnetuser = get_ccnetuser(userid=int(user_id))
remove_group_user(ccnetuser.email)
ccnetuser.delete()
try:
user = User.objects.get(id=int(user_id))
user.delete()
except User.DoesNotExist:
pass
return HttpResponseRedirect(reverse('sys_useradmin'))
@login_required
def activate_user(request, user_id):
"""The user id is emailuser id."""
if not request.user.is_staff:
raise Http404
ccnetuser = get_ccnetuser(userid=int(user_id))
ccnetuser.is_active = True
ccnetuser.save()
try:
user = User.objects.get(id=int(user_id))
user.is_active = True
user.save()
except User.DoesNotExist:
pass
return HttpResponseRedirect(reverse('useradmin'))
@ -1264,9 +1264,9 @@ def user_add(request):
email = form.cleaned_data['email']
password = form.cleaned_data['password1']
ccnetuser = CcnetUser(username=email, raw_password=password)
ccnetuser.is_active = True
ccnetuser.save()
user = User(email=email, raw_password=password)
user.is_active = True
user.save()
if request.user.org:
org_id = request.user.org['org_id']