Fixes in dateform

This commit is contained in:
Antonio de la Rosa 2025-01-10 01:42:20 +01:00
parent 8c6f9252c7
commit a63ab64876
2 changed files with 61 additions and 8 deletions

View file

@ -1,7 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from parameciofast.libraries.db.coreforms import BaseForm from parameciofast.libraries.db.coreforms import BaseForm
from parameciofast.libraries.mtemplates import standard_t #from parameciofast.libraries.mtemplates import standard_t
from parameciofast.libraries.datetime import format_timedata from parameciofast.libraries.datetime import format_timedata
class DateForm(BaseForm): class DateForm(BaseForm):
@ -11,7 +11,7 @@ class DateForm(BaseForm):
super().__init__(name, value) super().__init__(name, value)
self.yes_time=False self.yes_time=False
self.t=standard_t #self.t=standard_t
def form(self): def form(self):

View file

@ -1,4 +1,4 @@
from fastapi import FastAPI, Cookie, Request, Response, Body from fastapi import FastAPI, Cookie, Request, Response, Body, Header
from fastapi.responses import HTMLResponse, RedirectResponse from fastapi.responses import HTMLResponse, RedirectResponse
from parameciofast.modules.fastadmin import admin_app from parameciofast.modules.fastadmin import admin_app
from typing import Annotated from typing import Annotated
@ -6,21 +6,29 @@ from parameciofast.fast import app
from parameciofast.libraries.i18n import I18n from parameciofast.libraries.i18n import I18n
from parameciofast.libraries.mtemplates import env_theme, PTemplate from parameciofast.libraries.mtemplates import env_theme, PTemplate
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from parameciofast.modules.fastadmin.models.admin import UserAdmin from parameciofast.modules.fastadmin.models.admin import UserAdmin, LoginTries
from parameciofast.libraries.db.webmodel import WebModel from parameciofast.libraries.db.webmodel import WebModel
from parameciofast.libraries.fastutils import ResponseData from parameciofast.libraries.fastutils import ResponseData
from parameciofast.libraries.db import simplequery from parameciofast.libraries.db import simplequery
from settings import config
from parameciofast.libraries.datetime import now, format_local_strtime, timestamp_to_datetime, obtain_timestamp
env=env_theme(__file__) env=env_theme(__file__)
t=PTemplate(env, app.url_path_for) t=PTemplate(env, app.url_path_for)
usermodel=UserAdmin() usermodel=UserAdmin()
login_tries=5
if hasattr(config, 'login_tries'):
login_tries=config.login_tries
#useradmin.create_forms() #useradmin.create_forms()
#useradmin.safe_query=True #useradmin.safe_query=True
@admin_app.get('/', response_class=HTMLResponse) @admin_app.get('/', response_class=HTMLResponse)
def home_admin(request: Request, paramecio_session: Annotated[str | None, Cookie(description='Cookie for validate into the admin site. The cookie name can change in you settings/config.py')] = None): def home_admin(request: Request, paramecio_session: Annotated[str | None, Cookie(description='Cookie for validate into the admin site. The cookie name can change in you settings/config.py')] = None, remote_address: Annotated[str | None, Header()] = None):
if not request.session.get('login_admin', None): if not request.session.get('login_admin', None):
return RedirectResponse(app.url_path_for('login_admin')) return RedirectResponse(app.url_path_for('login_admin'))
@ -67,8 +75,11 @@ class UserAdmin(BaseModel):
password: str = Field(description="The password of user") password: str = Field(description="The password of user")
remember_login: bool | None = None remember_login: bool | None = None
class ResponseDataLogin(ResponseData):
login_tries: bool
@admin_app.post('/login') @admin_app.post('/login')
def check_login_admin(user: UserAdmin, request: Request) -> ResponseData: def check_login_admin(user: UserAdmin, request: Request) -> ResponseDataLogin:
db=WebModel.connection() db=WebModel.connection()
@ -78,7 +89,9 @@ def check_login_admin(user: UserAdmin, request: Request) -> ResponseData:
message=i18n.tlang('Invalid user and password') message=i18n.tlang('Invalid user and password')
if user.username!='' and user.password!='': no_login=check_login_tries(request, db)
if user.username!='' and user.password!='' and not no_login:
with db.query('select * from useradmin WHERE username=%s', [user.username]) as cursor: with db.query('select * from useradmin WHERE username=%s', [user.username]) as cursor:
result=cursor.fetchone() result=cursor.fetchone()
@ -93,7 +106,7 @@ def check_login_admin(user: UserAdmin, request: Request) -> ResponseData:
db.close() db.close()
return {'error': error, 'message': message} return {'error': error, 'message': message, 'login_tries': no_login}
class UserSignup(BaseModel): class UserSignup(BaseModel):
username: str = Field(description="The username of new user", min_length=4, pattern=r"\w+") username: str = Field(description="The username of new user", min_length=4, pattern=r"\w+")
@ -154,3 +167,43 @@ def logout_admin(request: Request) -> RedirectResponse:
return RedirectResponse(app.url_path_for('login_admin')) return RedirectResponse(app.url_path_for('login_admin'))
def check_login_tries(request, db):
logintries=LoginTries(db)
logintries.safe_query()
if 'x-real-ip' in request.headers:
ip=request.headers['x-real-ip']
elif 'x-forwarded-for' in request.headers:
ip=request.headers['x-forwarded-for']
else:
ip=request.client.host
you_cannot_login=0
arr_try=logintries.set_conditions('WHERE ip=%s', [ip]).select_a_row_where()
now_str=now()
date_now=format_local_strtime('YYYY-MM-DD HH:mm:ss', now_str)
date_check=format_local_strtime('YYYY-MM-DD HH:mm:ss', timestamp_to_datetime(obtain_timestamp(now_str)-300))
logintries.query('delete from logintries where last_login<%s', [date_check])
if arr_try:
if arr_try['num_tries']<login_tries:
logintries.query('update logintries set num_tries=num_tries+1, last_login=%s WHERE ip=%s', [date_now, ip])
else:
you_cannot_login=1
else:
logintries.query('insert into logintries (`ip`, `num_tries`, `last_login`) VALUES (%s, %s, %s)', [ip, 1, date_now])
return you_cannot_login