Fix in sessions, datetime, etc

This commit is contained in:
Antonio de la Rosa 2019-01-07 00:46:32 +01:00
parent 63e091221e
commit dff9269695
13 changed files with 2831 additions and 646 deletions

View file

@ -4,6 +4,10 @@ from collections import OrderedDict
from paramecio.citoplasma.sessions import get_session from paramecio.citoplasma.sessions import get_session
from paramecio.citoplasma.urls import make_url from paramecio.citoplasma.urls import make_url
from paramecio.citoplasma.i18n import I18n from paramecio.citoplasma.i18n import I18n
from paramecio.citoplasma.httputils import GetPostFiles
from paramecio.citoplasma.keyutils import create_key_encrypt, create_key_encrypt_256, create_key
from bottle import response,request
from paramecio.cromosoma.webmodel import WebModel
try: try:
@ -130,3 +134,116 @@ def check_login():
return False return False
def login_model(ModelLogin, session=''):
""" Function for standard login
"""
connection=WebModel.connection()
user_admin=ModelLogin(connection)
getpostfiles=GetPostFiles()
getpostfiles.obtain_post()
getpostfiles.post['username']=getpostfiles.post.get('username', '')
getpostfiles.post['password']=getpostfiles.post.get('password', '')
username=user_admin.fields['username'].check(getpostfiles.post['username'])
password=getpostfiles.post['password'].strip()
user_admin.conditions=['WHERE username=%s', [username]]
arr_user=user_admin.select_a_row_where(['id', 'password', 'privileges', 'lang', 'num_tries', 'email'])
if arr_user==False:
s=get_session()
s['csrf_token']=create_key_encrypt()
s.save()
connection.close()
return {'error': 1, 'csrf_token': s['csrf_token']}
else:
num_tries=int(arr_user['num_tries'])
if arr_user['num_tries']<3:
if user_admin.fields['password'].verify(password, arr_user['password']):
s=get_session()
s[session+'id']=arr_user['id']
s[session+'login']=1
s[session+'privileges']=arr_user['privileges']
s[session+'lang']=arr_user['lang']
s[session+'email']=arr_user['email']
if s['lang']=='':
s['lang']=I18n.default_lang
remember_login=getpostfiles.post.get(session+'remember_login', '0')
if remember_login=='1':
timestamp=time()+315360000
random_text=create_key_encrypt()
#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(session+'remember_login', random_text, path=config.session_opts['session.path'], expires=timestamp, secret=key_encrypt)
#else:
#print(user_admin.query_error)
s.save()
connection.close()
return {'error': 0}
else:
user_admin.check_user=False
user_admin.conditions=['WHERE username=%s', [username]]
user_admin.valid_fields=['num_tries']
user_admin.reset_require()
user_admin.update({'num_tries': arr_user['num_tries']+1})
s=get_session()
s['csrf_token']=create_key_encrypt()
s.save()
connection.close()
return {'error': 1, 'csrf_token': s['csrf_token']}
else:
s=get_session()
s['csrf_token']=create_key_encrypt()
s.save()
connection.close()
return {'error': 1, 'csrf_token': s['csrf_token']}

View file

@ -290,7 +290,7 @@ def no_utc(timestamp):
class TimeClass: class TimeClass:
def __init__(self, timestamp=0, tz=''): def __init__(self, timestamp=None, tz=''):
self.utc=False self.utc=False
@ -307,17 +307,23 @@ class TimeClass:
self.tz=tz self.tz=tz
if type(timestamp).__name__=='int': if type(timestamp).__name__=='int':
"""
if self.utc: if self.utc:
self.datetime=utcnow() self.datetime=utcnow()
else: else:
self.datetime=timestamp_to_datetime(timestamp) """
self.datetime=timestamp_to_datetime(timestamp)
else: else:
self.datetime=timestamp if not timestamp:
self.datetime=now(self.utc, tz)
else:
self.datetime=timestamp
y, m, d, h, mi, s=format_timedata(self.datetime) y, m, d, h, mi, s=format_timedata(self.datetime)
@ -358,6 +364,18 @@ class TimeClass:
m=self.t.shift(years=-num_years) m=self.t.shift(years=-num_years)
return m.format(self.format_time) return m.format(self.format_time)
def add_hour(self, num_hours):
m=self.t.shift(hours=+num_hours)
return m.format(self.format_time)
def substract_hour(self, num_hours):
m=self.t.shift(hours=-num_hours)
return m.format(self.format_time)
def format(self): def format(self):

View file

@ -176,7 +176,12 @@ else:
s={'token': token} s={'token': token}
response.set_cookie(config.cookie_name, token, path=config.session_opts['session.path']) # Bug in python 3.6, if you put max_age how None, is passed to header cookie.
if not max_age:
response.set_cookie(config.cookie_name, token, path=config.session_opts['session.path'])
else:
response.set_cookie(config.cookie_name, token, path=config.session_opts['session.path'], max_age=max_age)
#Set-Cookie: phango_session=n2ro4lghim75p8vjseb5v3lhap; path=/experiment2/ #Set-Cookie: phango_session=n2ro4lghim75p8vjseb5v3lhap; path=/experiment2/
#response.set_header('Set-Cookie', '%s=%s; path=%s' % (config.cookie_name, token, config.session_opts['session.path']) ) #response.set_header('Set-Cookie', '%s=%s; path=%s' % (config.cookie_name, token, config.session_opts['session.path']) )

View file

@ -15,6 +15,7 @@ class IntegerField(PhangoField):
def __init__(self, name, size=11, required=False): def __init__(self, name, size=11, required=False):
super(IntegerField, self).__init__(name, size, required) super(IntegerField, self).__init__(name, size, required)
self.default_value=0
def check(self, value): def check(self, value):
@ -83,6 +84,7 @@ class FloatField(PhangoField):
super(FloatField, self).__init__(name, size, required) super(FloatField, self).__init__(name, size, required)
self.error_default="The value is zero" self.error_default="The value is zero"
self.default_value=0
def check(self, value): def check(self, value):
@ -207,6 +209,7 @@ class BooleanField(IntegerField):
super(IntegerField, self).__init__(name, size, required) super(IntegerField, self).__init__(name, size, required)
self.default_error="Need 0 or 1 value" self.default_error="Need 0 or 1 value"
self.default_value=0
def check(self, value): def check(self, value):

View file

@ -1188,6 +1188,14 @@ class WebModel:
self.fields_errors[k].append("Error: "+v.label+" field required") self.fields_errors[k].append("Error: "+v.label+" field required")
error=True error=True
elif v.required==False and k!=self.name_field_id and not yes_update:
fields.append(k)
values.append(self.fields[k].default_value)
update_values.append(f_update(k, self.fields[k].default_value))
if len(fields)==0: if len(fields)==0:

View file

@ -9,7 +9,7 @@ from paramecio.citoplasma.sessions import get_session, generate_session
from bottle import get,post,response,request from bottle import get,post,response,request
from settings import config from settings import config
from settings import config_admin from settings import config_admin
from paramecio.citoplasma.adminutils import get_menu, get_language, make_admin_url, check_login from paramecio.citoplasma.adminutils import get_menu, get_language, make_admin_url, check_login, login_model
from paramecio.citoplasma.httputils import GetPostFiles from paramecio.citoplasma.httputils import GetPostFiles
from paramecio.cromosoma.formsutils import show_form, pass_values_to_form, set_extra_forms_user from paramecio.cromosoma.formsutils import show_form, pass_values_to_form, set_extra_forms_user
from paramecio.cromosoma.coreforms import PasswordForm from paramecio.cromosoma.coreforms import PasswordForm
@ -251,6 +251,9 @@ def home(module='', submodule='', t=t):
@app.post('/'+config.admin_folder+'/login') @app.post('/'+config.admin_folder+'/login')
def login(): def login():
return login_model(UserAdmin)
"""
connection=WebModel.connection() connection=WebModel.connection()
user_admin=UserAdmin(connection) user_admin=UserAdmin(connection)
@ -357,7 +360,7 @@ def login():
connection.close() connection.close()
return {'error': 1, 'csrf_token': s['csrf_token']} return {'error': 1, 'csrf_token': s['csrf_token']}
"""
@app.post('/'+config.admin_folder+'/register') @app.post('/'+config.admin_folder+'/register')
def register(): def register():

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

Before

Width:  |  Height:  |  Size: 348 KiB

After

Width:  |  Height:  |  Size: 434 KiB

Before After
Before After