diff --git a/paramecio/citoplasma/templates/admin/login.phtml b/paramecio/citoplasma/templates/admin/login.phtml index d27d2b2..f96e949 100644 --- a/paramecio/citoplasma/templates/admin/login.phtml +++ b/paramecio/citoplasma/templates/admin/login.phtml @@ -21,7 +21,7 @@ url: "${make_url('admin/login')}", method: "POST", dataType: "json", - data: {'username': $('#username_form').val(), 'password': $('#password_form').val()} + data: {'username': $('#username_form').val(), 'password': $('#password_form').val(), 'remember_login': $('#remember_login').val()} }).done(function(data) { if(data.error==0) @@ -56,6 +56,7 @@ ${lang('admin', 'login', 'Paramecio Login')} ${forms|n} +
${lang('admin', 'remember_login', 'Remember login?')}
  diff --git a/paramecio/cromosoma/usermodel.py b/paramecio/cromosoma/usermodel.py index b78555d..89f8518 100644 --- a/paramecio/cromosoma/usermodel.py +++ b/paramecio/cromosoma/usermodel.py @@ -15,6 +15,7 @@ class UserModel(WebModel): self.email_field='email' self.username_field='username' self.yes_repeat_password=True + self.check_user=True def create_forms(self, arr_fields={}): @@ -56,77 +57,81 @@ class UserModel(WebModel): return False - # Check if passwords matches + if self.check_user==True: - if self.password_field in dict_values: + # Check if passwords matches - dict_values['repeat_password']=dict_values.get('repeat_password', '') - - if dict_values['repeat_password']!=dict_values[self.password_field]: + if self.password_field in dict_values: - if dict_values[self.password_field].strip()!="": + dict_values['repeat_password']=dict_values.get('repeat_password', '') + + if dict_values['repeat_password']!=dict_values[self.password_field]: - self.fields[self.password_field].error=True - self.fields[self.password_field].txt_error=I18n.lang('common', 'error_passwords_no_match', 'Error: passwords doesn\'t match') + if dict_values[self.password_field].strip()!="": + + self.fields[self.password_field].error=True + self.fields[self.password_field].txt_error=I18n.lang('common', 'error_passwords_no_match', 'Error: passwords doesn\'t match') + + return False + + # Check if exists user with same email or password + + get_id=0 + + if self.updated: + # Need the id + GetPostFiles.obtain_get() + GetPostFiles.obtain_post() + + get_id=GetPostFiles.get.get(self.name_field_id, '0') + + post_id=GetPostFiles.post.get(self.name_field_id, '0') + + if get_id!='0': + get_id=int(get_id) + + if post_id!='0': + get_id=int(post_id) + + pass + + get_id=int(get_id) + + sql_id='' + + original_conditions=self.conditions + + self.reset_conditions() + + if self.username_field in dict_values: + + self.conditions=['WHERE (username=%s', [dict_values[self.username_field]]] + + + if self.email_field in dict_values: + + if len(self.conditions[1])>0: + + self.conditions[0]+=' OR email=%s)' + else: + self.conditions[0]='WHERE (email=%s)' + self.conditions[1]=[] + + self.conditions[1].append([dict_values[self.email_field]]) + + if get_id>0: + self.conditions[0]+=' AND '+self.name_field_id+'!=%s' + self.conditions[1].append(get_id) + + + if self.select_count()>0: + + self.fields[self.username_field].error=True + self.fields[self.username_field].txt_error=I18n.lang('common', 'error_username_or_password_exists', 'Error: username or email exists in database') return False - - # Check if exists user with same email or password - - get_id=0 - - if self.updated: - # Need the id - GetPostFiles.obtain_get() - GetPostFiles.obtain_post() - get_id=GetPostFiles.get.get(self.name_field_id, '0') - - post_id=GetPostFiles.post.get(self.name_field_id, '0') - - if get_id!='0': - get_id=int(get_id) - - if post_id!='0': - get_id=int(post_id) - - pass - - sql_id='' - - original_conditions=self.conditions - - self.reset_conditions() - - if self.username_field in dict_values: - - self.conditions=['WHERE (username=%s', [dict_values[self.username_field]]] - - - if self.email_field in dict_values: - - if len(self.conditions[1])>0: - - self.conditions[0]+=' OR email=%s)' - else: - self.conditions[0]='WHERE (email=%s)' - self.conditions[1]=[] - - self.conditions[1].append([dict_values[self.email_field]]) - - if get_id>0: - self.conditions[0]+=' AND '+self.name_field_id+'!=%s' - self.conditions[1].append(get_id) - - - if self.select_count()>0: - - self.fields[self.username_field].error=True - self.fields[self.username_field].txt_error=I18n.lang('common', 'error_username_or_password_exists', 'Error: username or email exists in database') - - return False - - self.conditions=original_conditions + self.conditions=original_conditions return fields, values, update_values diff --git a/paramecio/cromosoma/webmodel.py b/paramecio/cromosoma/webmodel.py index 6940049..0e4ad10 100644 --- a/paramecio/cromosoma/webmodel.py +++ b/paramecio/cromosoma/webmodel.py @@ -632,35 +632,44 @@ class WebModel: self.fields[k].error=False - if (self.fields[k].protected==None or self.fields[k].protected==False or external_agent==False) and k in self.valid_fields: + if (self.fields[k].protected==None or self.fields[k].protected==False or external_agent==False): - self.fields[k].update=updated_field[errors_set] - - value=self.fields[k].check(value) - - if self.fields[k].check_blank==False or self.updated==False: + if k in self.valid_fields: - # If error checking, value=False + self.fields[k].update=updated_field[errors_set] - if self.fields[k].error==True and self.fields[k].required==True: + value=self.fields[k].check(value) + + if self.fields[k].check_blank==False or self.updated==False: - #Error, need this fields. - self.num_errors+=1 + # If error checking, value=False - self.fields_errors[k].append("Error: "+v.label+" field required") - - error=True - - else: + if self.fields[k].error==True and self.fields[k].required==True: + + #Error, need this fields. + self.num_errors+=1 + + self.fields_errors[k].append("Error: "+v.label+" field required") + + error=True + + else: - fields.append(k) - - final_value=self.fields[k].quot_open+value+self.fields[k].quot_close - - values.append(final_value) - - update_values.append(f_update(k, final_value)) - + fields.append(k) + + final_value=self.fields[k].quot_open+value+self.fields[k].quot_close + + values.append(final_value) + + update_values.append(f_update(k, final_value)) + else: + self.num_errors+=1 + + self.fields_errors[k].append("Error: "+self.fields[k].label+" is not in valid fields") + self.fields[k].error=True + self.fields[k].txt_error="Error: "+self.fields[k].label+" is not in valid fields" + error=True + else: self.num_errors+=1 @@ -702,7 +711,7 @@ class WebModel: for k, v in self.fields.items(): self.required_save[k]=self.fields[k].required - self.fields[k].required=0 + self.fields[k].required=False #Reload the require field in fields @@ -777,9 +786,9 @@ class PhangoField: self.size=size - # Protected, if this value != None, cannot use it in insert or update. + # Protected, if this value != False, cannot use it in insert or update. - self.protected=None + self.protected=False # $quote_open is used if you need a more flexible sql sentence, # @warning USE THIS FUNCTION IF YOU KNOW WHAT YOU ARE DOING diff --git a/paramecio/i18n/en-US/admin.py b/paramecio/i18n/en-US/admin.py index ac713a2..a37ecaf 100644 --- a/paramecio/i18n/en-US/admin.py +++ b/paramecio/i18n/en-US/admin.py @@ -2,19 +2,19 @@ from paramecio.citoplasma.i18n import I18n +I18n.l['admin']['users_admin']='User's Admin' + I18n.l['admin']['applications']='Applications' I18n.l['admin']['administrator']='Administrator' -I18n.l['admin']['selected_privileges']='Selected privileges' - -I18n.l['admin']['users_admin']='User\'s Admin' +I18n.l['admin']['login']='Paramecio Login' I18n.l['admin']['sign_up']='Paramecio Sign up' -I18n.l['admin']['welcome_to_paramecio']='Welcome to Paramecio Admin!!!' - -I18n.l['admin']['login']='Paramecio Login' - I18n.l['admin']['without_privileges']='Without privileges' +I18n.l['admin']['welcome_to_paramecio']='Welcome to Paramecio Admin!!!' + +I18n.l['admin']['selected_privileges']='Selected privileges' + diff --git a/paramecio/i18n/en-US/common.py b/paramecio/i18n/en-US/common.py index 32f4f18..5d7b797 100644 --- a/paramecio/i18n/en-US/common.py +++ b/paramecio/i18n/en-US/common.py @@ -2,41 +2,41 @@ from paramecio.citoplasma.i18n import I18n -I18n.l['common']['edit']='Edit' - I18n.l['common']['search']='Search' -I18n.l['common']['error_username_or_password_exists']='Error: username or email exists in database' - -I18n.l['common']['repeat_password']='Repeat Password' - -I18n.l['common']['error_passwords_no_match']='Error: passwords doesn\'t match' - -I18n.l['common']['add_new_item']='Add new item' - -I18n.l['common']['home']='Home' - -I18n.l['common']['login']='Login' - -I18n.l['common']['no']='No' - -I18n.l['common']['edit_new_item']='Edit item' - -I18n.l['common']['password_no_match']='Passwords doesn\'t match' - -I18n.l['common']['sign_up']='Sign up' - -I18n.l['common']['yes']='Yes' - -I18n.l['common']['error_login']='Error, wrong username or password' - -I18n.l['common']['task_successful']='Task successful' - I18n.l['common']['delete']='Delete' +I18n.l['common']['error_login']='Error, wrong username or password' + I18n.l['common']['add_item']='Add new item' +I18n.l['common']['edit']='Edit' + +I18n.l['common']['edit_new_item']='Edit item' + +I18n.l['common']['error_username_or_password_exists']='Error: username or email exists in database' + I18n.l['common']['last']='Last' +I18n.l['common']['no']='No' + +I18n.l['common']['add_new_item']='Add new item' + +I18n.l['common']['yes']='Yes' + I18n.l['common']['options']='Options' +I18n.l['common']['password_no_match']='Passwords doesn't match' + +I18n.l['common']['login']='Login' + +I18n.l['common']['error_passwords_no_match']='Error: passwords doesn't match' + +I18n.l['common']['sign_up']='Sign up' + +I18n.l['common']['task_successful']='Task successful' + +I18n.l['common']['repeat_password']='Repeat Password' + +I18n.l['common']['home']='Home' + diff --git a/paramecio/i18n/es-ES/admin.py b/paramecio/i18n/es-ES/admin.py index aaf6e07..0648695 100644 --- a/paramecio/i18n/es-ES/admin.py +++ b/paramecio/i18n/es-ES/admin.py @@ -2,19 +2,19 @@ from paramecio.citoplasma.i18n import I18n +I18n.l['admin']['users_admin']='Usuarios de administración' + I18n.l['admin']['applications']='Applications' I18n.l['admin']['administrator']='Administrador' -I18n.l['admin']['selected_privileges']='Selected privileges' - -I18n.l['admin']['users_admin']='Usuarios de administración' +I18n.l['admin']['login']='Entrar en Paramecio' I18n.l['admin']['sign_up']='Entrar en Paramecio' -I18n.l['admin']['welcome_to_paramecio']='Bienvenido a la administración de este site!!' - -I18n.l['admin']['login']='Entrar en Paramecio' - I18n.l['admin']['without_privileges']='Without privileges' +I18n.l['admin']['welcome_to_paramecio']='Bienvenido a la administración de este site!!' + +I18n.l['admin']['selected_privileges']='Selected privileges' + diff --git a/paramecio/i18n/es-ES/common.py b/paramecio/i18n/es-ES/common.py index 32f4f18..5d7b797 100644 --- a/paramecio/i18n/es-ES/common.py +++ b/paramecio/i18n/es-ES/common.py @@ -2,41 +2,41 @@ from paramecio.citoplasma.i18n import I18n -I18n.l['common']['edit']='Edit' - I18n.l['common']['search']='Search' -I18n.l['common']['error_username_or_password_exists']='Error: username or email exists in database' - -I18n.l['common']['repeat_password']='Repeat Password' - -I18n.l['common']['error_passwords_no_match']='Error: passwords doesn\'t match' - -I18n.l['common']['add_new_item']='Add new item' - -I18n.l['common']['home']='Home' - -I18n.l['common']['login']='Login' - -I18n.l['common']['no']='No' - -I18n.l['common']['edit_new_item']='Edit item' - -I18n.l['common']['password_no_match']='Passwords doesn\'t match' - -I18n.l['common']['sign_up']='Sign up' - -I18n.l['common']['yes']='Yes' - -I18n.l['common']['error_login']='Error, wrong username or password' - -I18n.l['common']['task_successful']='Task successful' - I18n.l['common']['delete']='Delete' +I18n.l['common']['error_login']='Error, wrong username or password' + I18n.l['common']['add_item']='Add new item' +I18n.l['common']['edit']='Edit' + +I18n.l['common']['edit_new_item']='Edit item' + +I18n.l['common']['error_username_or_password_exists']='Error: username or email exists in database' + I18n.l['common']['last']='Last' +I18n.l['common']['no']='No' + +I18n.l['common']['add_new_item']='Add new item' + +I18n.l['common']['yes']='Yes' + I18n.l['common']['options']='Options' +I18n.l['common']['password_no_match']='Passwords doesn't match' + +I18n.l['common']['login']='Login' + +I18n.l['common']['error_passwords_no_match']='Error: passwords doesn't match' + +I18n.l['common']['sign_up']='Sign up' + +I18n.l['common']['task_successful']='Task successful' + +I18n.l['common']['repeat_password']='Repeat Password' + +I18n.l['common']['home']='Home' + diff --git a/paramecio/modules/admin/index.py b/paramecio/modules/admin/index.py index c17b49d..507e385 100644 --- a/paramecio/modules/admin/index.py +++ b/paramecio/modules/admin/index.py @@ -5,7 +5,7 @@ from paramecio.modules.admin.models.admin import UserAdmin from paramecio.citoplasma.i18n import load_lang, I18n from paramecio.citoplasma.urls import make_url, add_get_parameters from paramecio.citoplasma.sessions import get_session -from bottle import get,post +from bottle import get,post,response from settings import config from settings import config_admin from paramecio.citoplasma.lists import SimpleList @@ -16,6 +16,9 @@ from paramecio.cromosoma.coreforms import PasswordForm from importlib import import_module, reload from bottle import redirect from collections import OrderedDict +from time import time +from hashlib import sha512 +from os import urandom #from citoplasma.login import LoginClass # Check login @@ -118,8 +121,8 @@ def login(): GetPostFiles.obtain_post() - GetPostFiles.post.get('username', '') - GetPostFiles.post.get('password', '') + GetPostFiles.post['username']=GetPostFiles.post.get('username', '') + GetPostFiles.post['password']=GetPostFiles.post.get('password', '') username=user_admin.fields['username'].check(GetPostFiles.post['username']) @@ -142,6 +145,31 @@ def login(): s['login']=1 s['privileges']=arr_user['privileges'] + remember_login=GetPostFiles.post.get('remember_login', '0') + + if remember_login=='1': + + timestamp=time()+315360000 + + random_text=sha512(urandom(10)).hexdigest() + + #Update user with autologin token + + user_admin.check_user=False + + user_admin.conditions=['WHERE username=%s', [username]] + + user_admin.valid_fields=['token_login'] + + user_admin.reset_require() + + if user_admin.update({'token_login': random_text}): + + response.set_cookie('remember_login', random_text, expires=timestamp) + else: + print(user_admin.query_error) + + return {'error': 0} else: return {'error': 1} diff --git a/paramecio/modules/admin/media/css/login.css b/paramecio/modules/admin/media/css/login.css index 6c975eb..1d0ed3f 100644 --- a/paramecio/modules/admin/media/css/login.css +++ b/paramecio/modules/admin/media/css/login.css @@ -23,7 +23,7 @@ body { } -input { +input[type="text"], input[type="password"] { width:100%; border: solid #bcbcbc 1px; diff --git a/paramecio/modules/admin/models/admin.py b/paramecio/modules/admin/models/admin.py index 34527a9..f6f008a 100644 --- a/paramecio/modules/admin/models/admin.py +++ b/paramecio/modules/admin/models/admin.py @@ -40,6 +40,8 @@ class UserAdmin(UserModel): self.register(corefields.CharField('token_recovery')) + self.register(corefields.CharField('token_login')) + self.register(PrivilegesField('privileges')) """