Mercurial > public > src > rhodecode
changeset 1185:716911af91e1 beta
Added api_key into user, api key get's generated again after password change
updated ini files
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Sun, 06 Mar 2011 00:06:28 +0100 |
parents | fcb5054937f6 |
children | 6eb5bb24a948 |
files | development.ini production.ini rhodecode/lib/__init__.py rhodecode/lib/auth.py rhodecode/lib/celerylib/tasks.py rhodecode/lib/db_manage.py rhodecode/model/user.py rhodecode/public/css/style.css rhodecode/templates/admin/users/user_edit.html rhodecode/templates/admin/users/user_edit_my_account.html |
diffstat | 10 files changed, 84 insertions(+), 150 deletions(-) [+] |
line wrap: on
line diff
--- a/development.ini Sat Mar 05 23:02:15 2011 +0100 +++ b/development.ini Sun Mar 06 00:06:28 2011 +0100 @@ -32,7 +32,7 @@ threadpool_max_requests = 6 ##option to use threads of process -use_threadpool = false +use_threadpool = true use = egg:Paste#http host = 0.0.0.0
--- a/production.ini Sat Mar 05 23:02:15 2011 +0100 +++ b/production.ini Sun Mar 06 00:06:28 2011 +0100 @@ -29,7 +29,7 @@ threadpool_workers = 5 ##max request before thread respawn -threadpool_max_requests = 2 +threadpool_max_requests = 6 ##option to use threads of process use_threadpool = true @@ -47,7 +47,7 @@ index_dir = %(here)s/data/index cut_off_limit = 256000 force_https = false -commit_parse_limit = 250 +commit_parse_limit = 25 use_gravatar = true #################################### @@ -94,7 +94,6 @@ beaker.cache.long_term.type=memory beaker.cache.long_term.expire=36000 - beaker.cache.sql_cache_short.type=memory beaker.cache.sql_cache_short.expire=10 @@ -141,7 +140,8 @@ ######################################################### ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ### ######################################################### -sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db +#sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db +sqlalchemy.db1.url = postgresql://postgres:qwe@localhost/rhodecode #sqlalchemy.db1.echo = False #sqlalchemy.db1.pool_recycle = 3600 sqlalchemy.convert_unicode = true
--- a/rhodecode/lib/__init__.py Sat Mar 05 23:02:15 2011 +0100 +++ b/rhodecode/lib/__init__.py Sun Mar 06 00:06:28 2011 +0100 @@ -27,3 +27,12 @@ def str2bool(v): return v.lower() in ["yes", "true", "t", "1"] if v else None + +def generate_api_key(username, salt=None): + from tempfile import _RandomNameSequence + import hashlib + + if salt is None: + salt = _RandomNameSequence().next() + + return hashlib.sha1(username + salt).hexdigest()
--- a/rhodecode/lib/auth.py Sat Mar 05 23:02:15 2011 +0100 +++ b/rhodecode/lib/auth.py Sun Mar 06 00:06:28 2011 +0100 @@ -28,7 +28,8 @@ import random import logging import traceback - +import hashlib +from tempfile import _RandomNameSequence from decorator import decorator from pylons import config, session, url, request @@ -87,6 +88,12 @@ """ return bcrypt.hashpw(password, bcrypt.gensalt(10)) +def generate_api_key(username, salt=None): + if salt is None: + salt = _RandomNameSequence().next() + + return hashlib.sha1(username + salt).hexdigest() + def check_password(password, hashed): return bcrypt.hashpw(password, hashed) == hashed
--- a/rhodecode/lib/celerylib/tasks.py Sat Mar 05 23:02:15 2011 +0100 +++ b/rhodecode/lib/celerylib/tasks.py Sun Mar 06 00:06:28 2011 +0100 @@ -245,6 +245,7 @@ auth.PasswordGenerator.ALPHABETS_BIG_SMALL) if user: user.password = auth.get_crypt_password(new_passwd) + user.api_key = auth.generate_api_key(user.username) sa.add(user) sa.commit() log.info('change password for %s', user_email)
--- a/rhodecode/lib/db_manage.py Sat Mar 05 23:02:15 2011 +0100 +++ b/rhodecode/lib/db_manage.py Sun Mar 06 00:06:28 2011 +0100 @@ -35,7 +35,7 @@ from rhodecode import __dbversion__ from rhodecode.model import meta -from rhodecode.lib.auth import get_crypt_password +from rhodecode.lib.auth import get_crypt_password, generate_api_key from rhodecode.lib.utils import ask_ok from rhodecode.model import init_model from rhodecode.model.db import User, Permission, RhodeCodeUi, RhodeCodeSettings, \ @@ -442,6 +442,7 @@ new_user = User() new_user.username = username new_user.password = get_crypt_password(password) + new_user.api_key = generate_api_key(username) new_user.name = 'RhodeCode' new_user.lastname = 'Admin' new_user.email = email @@ -461,6 +462,7 @@ def_user = User() def_user.username = 'default' def_user.password = get_crypt_password(str(uuid.uuid1())[:8]) + def_user.api_key = generate_api_key('default') def_user.name = 'Anonymous' def_user.lastname = 'User' def_user.email = 'anonymous@rhodecode.org' @@ -484,8 +486,8 @@ ('hg.create.repository', 'Repository create'), ('hg.create.none', 'Repository creation disabled'), ('hg.register.none', 'Register disabled'), - ('hg.register.manual_activate', 'Register new user with rhodecode without manual activation'), - ('hg.register.auto_activate', 'Register new user with rhodecode without auto activation'), + ('hg.register.manual_activate', 'Register new user with RhodeCode without manual activation'), + ('hg.register.auto_activate', 'Register new user with RhodeCode without auto activation'), ] for p in perms:
--- a/rhodecode/model/user.py Sat Mar 05 23:02:15 2011 +0100 +++ b/rhodecode/model/user.py Sun Mar 06 00:06:28 2011 +0100 @@ -37,6 +37,7 @@ from rhodecode.lib.exceptions import DefaultUserException, UserOwnsReposException from sqlalchemy.exc import DatabaseError +from rhodecode.lib import generate_api_key log = logging.getLogger(__name__) @@ -68,6 +69,7 @@ for k, v in form_data.items(): setattr(new_user, k, v) + new_user.api_key = generate_api_key(form_data['username']) self.sa.add(new_user) self.sa.commit() except: @@ -91,6 +93,7 @@ new_user = User() new_user.username = username.lower() # add ldap account always lowercase new_user.password = get_crypt_password(password) + new_user.api_key = generate_api_key(username) new_user.email = attrs['email'] new_user.active = True new_user.ldap_dn = user_dn @@ -134,19 +137,20 @@ def update(self, user_id, form_data): try: - new_user = self.get(user_id, cache=False) - if new_user.username == 'default': + user = self.get(user_id, cache=False) + if user.username == 'default': raise DefaultUserException( _("You can't Edit this user since it's" " crucial for entire application")) for k, v in form_data.items(): if k == 'new_password' and v != '': - new_user.password = v + user.password = v + user.api_key = generate_api_key(user.username) else: - setattr(new_user, k, v) + setattr(user, k, v) - self.sa.add(new_user) + self.sa.add(user) self.sa.commit() except: log.error(traceback.format_exc()) @@ -155,19 +159,20 @@ def update_my_account(self, user_id, form_data): try: - new_user = self.get(user_id, cache=False) - if new_user.username == 'default': + user = self.get(user_id, cache=False) + if user.username == 'default': raise DefaultUserException( _("You can't Edit this user since it's" " crucial for entire application")) for k, v in form_data.items(): if k == 'new_password' and v != '': - new_user.password = v + user.password = v + user.api_key = generate_api_key(user.username) else: if k not in ['admin', 'active']: - setattr(new_user, k, v) + setattr(user, k, v) - self.sa.add(new_user) + self.sa.add(user) self.sa.commit() except: log.error(traceback.format_exc())
--- a/rhodecode/public/css/style.css Sat Mar 05 23:02:15 2011 +0100 +++ b/rhodecode/public/css/style.css Sun Mar 06 00:06:28 2011 +0100 @@ -858,7 +858,7 @@ padding:0 0 8px !important; } -#content div.box div.form div.fields div.field div.label label { +#content div.box div.form div.fields div.field div.label label, div.label label{ color:#393939; font-weight:700; }
--- a/rhodecode/templates/admin/users/user_edit.html Sat Mar 05 23:02:15 2011 +0100 +++ b/rhodecode/templates/admin/users/user_edit.html Sun Mar 06 00:06:28 2011 +0100 @@ -26,19 +26,23 @@ <!-- end box / title --> ${h.form(url('user', id=c.user.user_id),method='put')} <div class="form"> - <!-- fields --> + <div class="field"> + <div class="gravatar_box"> + <div class="gravatar"><img alt="gravatar" src="${h.gravatar_url(c.user.email)}"/></div> + <p> + <strong>Change your avatar at <a href="http://gravatar.com">gravatar.com</a></strong><br/> + ${_('Using')} ${c.user.email} + </p> + </div> + </div> + <div class="field"> + <div class="label"> + <label>${_('API key')}</label> ${c.user.api_key} + </div> + </div> + <div class="fields"> <div class="field"> - <div class="gravatar_box"> - <div class="gravatar"><img alt="gravatar" src="${h.gravatar_url(c.user.email)}"/></div> - <p> - <strong>Change your avatar at <a href="http://gravatar.com">gravatar.com</a></strong><br/> - ${_('Using')} ${c.user.email} - </p> - </div> - </div> - - <div class="field"> <div class="label"> <label for="username">${_('Username')}:</label> </div> @@ -52,7 +56,7 @@ <label for="ldap_dn">${_('LDAP DN')}:</label> </div> <div class="input"> - ${h.text('ldap_dn',class_='small')} + ${h.text('ldap_dn',class_='medium')} </div> </div> @@ -122,122 +126,24 @@ <div class="title"> <h5>${_('Permissions')}</h5> </div> - <form id="map_form" method="post" action="{%url update_permissions %}"> - <div class="form"> - <div class="fields"> - - - - <table> - <tr> - <td class="label">${_('Permissions')}:</td> - <td> - <div> - <div style="float:left"> - <div class="text">${_('Granted permissions')}</div> - ${h.select('granted_permissions',[],c.granted_permissions,multiple=True,size=8,style="min-width:210px")} - </div> - <div style="float:left;width:20px;padding-top:50px"> - <img alt="add" id="add_element" - style="padding:2px;cursor:pointer" - src="${h.url("/images/icons/arrow_left.png")}"> - <br /> - <img alt="remove" id="remove_element" - style="padding:2px;cursor:pointer" - src="${h.url("/images/icons/arrow_right.png")}"> - </div> - <div style="float:left"> - <div class="text">${_('Available permissions')}</div> - ${h.select('available_permissions',[],c.available_permissions,multiple=True,size=8,style="min-width:210px")} - </div> - </div> - </td> - </tr> - - </table> - <div class="buttons"> - ${h.submit('Save','Save',class_="ui-button")} - </div> - </div> - </div> - </form> - - -<script type="text/javascript"> - YAHOO.util.Event.onDOMReady(function(){ - - var D = YAHOO.util.Dom; - var E = YAHOO.util.Event; - - //temp container for storage. - var cache = new Array(); - var c = D.get('id_granted_permissions'); - - //get only selected options for further fullfilment - for(var i = 0;node =c.options[i];i++){ - if(node.selected){ - //push selected to my temp storage left overs :) - cache.push(node); - } - } - - //clear select - c.options.length = 0; - - //fill it with remembered options - for(var i = 0;node = cache[i];i++){ - c.options[i]=new Option(node.text, node.value, false, false); - } - - function target_callback(e){ - window.location='/admin/t4?g='+e.target.value; - } - - function prompts_action_callback(e){ - - var choosen = D.get('id_granted_permissions'); - var availible = D.get('id_available_permissions'); - - if (this.id=='add_element'){ - for(var i=0; node = availible.options[i];i++){ - if(node.selected){ - choosen.appendChild(new Option(node.text, node.value, false, false)); - } - } - } - else if (this.id=='remove_element'){ - - //temp container for storage. - cache = new Array(); - - for(var i = 0;node = choosen.options[i];i++){ - if(!node.selected){ - //push left overs :) - cache.push(node); - } - } - //clear select - choosen.options.length = 0; - for(var i = 0;node = cache[i];i++){ - choosen.options[i]=new Option(node.text, node.value, false, false); - } - } - else{ - - } - } - - E.addListener('id_groups','change',target_callback); - - E.addListener(['add_element','remove_element'],'click',prompts_action_callback) - - E.addListener('map_form','submit',function(){ - var choosen = D.get('id_granted_permissions'); - for (var i = 0; i < choosen.options.length; i++) { - choosen.options[i].selected = 'selected'; - } - }) - }); -</script> + ${h.form(url('user', id=c.user.user_id),method='put')} + <div class="form"> + <!-- fields --> + <div class="fields"> + <div class="field"> + <div class="label label-checkbox"> + <label for="">${_('Create repositories')}:</label> + </div> + <div class="checkboxes"> + ${h.checkbox('create',value=True)} + </div> + </div> + <div class="buttons"> + ${h.submit('save','Save',class_="ui-button")} + ${h.reset('reset','Reset',class_="ui-button")} + </div> + </div> + </div> + ${h.end_form()} </div> </%def>
--- a/rhodecode/templates/admin/users/user_edit_my_account.html Sat Mar 05 23:02:15 2011 +0100 +++ b/rhodecode/templates/admin/users/user_edit_my_account.html Sun Mar 06 00:06:28 2011 +0100 @@ -34,7 +34,11 @@ </p> </div> </div> - + <div class="field"> + <div class="label"> + <label>${_('API key')}</label> ${c.user.api_key} + </div> + </div> <div class="fields"> <div class="field"> <div class="label">