Added forgot password

This commit is contained in:
Koshin S Hegde 2024-09-03 09:56:53 +05:30
parent b5bf60d4d2
commit 9618ffffd2
5 changed files with 365 additions and 24 deletions

View File

@ -0,0 +1,282 @@
[Desktop Entry]
Name=Steam (Runtime)
Comment=Application for managing and playing games on Steam
Comment[pt_BR]=Aplicativo para jogar e gerenciar jogos no Steam
Comment[bg]=Приложение за ръководене и пускане на игри в Steam
Comment[cs]=Aplikace pro spravování a hraní her ve službě Steam
Comment[da]=Applikation til at håndtere og spille spil på Steam
Comment[nl]=Applicatie voor het beheer en het spelen van games op Steam
Comment[fi]=Steamin pelien hallintaan ja pelaamiseen tarkoitettu sovellus
Comment[fr]=Application de gestion et d'utilisation des jeux sur Steam
Comment[de]=Anwendung zum Verwalten und Spielen von Spielen auf Steam
Comment[el]=Εφαρμογή διαχείρισης παιχνιδιών στο Steam
Comment[hu]=Alkalmazás a Steames játékok futtatásához és kezeléséhez
Comment[it]=Applicazione per la gestione e l'esecuzione di giochi su Steam
Comment[ja]=Steam
Comment[ko]=Steam
Comment[no]=Program for å administrere og spille spill på Steam
Comment[pt_PT]=Aplicação para organizar e executar jogos no Steam
Comment[pl]=Aplikacja do zarządzania i uruchamiania gier na platformie Steam
Comment[ro]=Aplicație pentru administrarea și jucatul jocurilor pe Steam
Comment[ru]=Приложение для игр и управления играми в Steam
Comment[es]=Aplicación para administrar y ejecutar juegos en Steam
Comment[sv]=Ett program för att hantera samt spela spel på Steam
Comment[zh_CN]= Steam
Comment[zh_TW]= Steam
Comment[th]= Steam
Comment[tr]=Steam üzerinden oyun oynama ve düzenleme uygulaması
Comment[uk]=Програма для керування іграми та запуску ігор у Steam
Comment[vi]=ng dng đ qun lý và chơi trò chơi trên Steam
Exec=/usr/bin/steam-runtime %U
Icon=steam
Terminal=false
Type=Application
Categories=Network;FileTransfer;Game;
MimeType=x-scheme-handler/steam;x-scheme-handler/steamlink;
Actions=Store;Community;Library;Servers;Screenshots;News;Settings;BigPicture;Friends;
PrefersNonDefaultGPU=true
X-KDE-RunOnDiscreteGpu=true
[Desktop Action Store]
Name=Store
Name[pt_BR]=Loja
Name[bg]=Магазин
Name[cs]=Obchod
Name[da]=Butik
Name[nl]=Winkel
Name[fi]=Kauppa
Name[fr]=Magasin
Name[de]=Shop
Name[el]=ΚΑΤΑΣΤΗΜΑ
Name[hu]=Áruház
Name[it]=Negozio
Name[ja]=
Name[ko]=
Name[no]=Butikk
Name[pt_PT]=Loja
Name[pl]=Sklep
Name[ro]=Magazin
Name[ru]=Магазин
Name[es]=Tienda
Name[sv]=Butik
Name[zh_CN]=
Name[zh_TW]=
Name[th]=
Name[tr]=Mağaza
Name[uk]=Крамниця
Name[vi]=Ca hàng
Exec=steam steam://store
[Desktop Action Community]
Name=Community
Name[pt_BR]=Comunidade
Name[bg]=Общност
Name[cs]=Komunita
Name[da]=Fællesskab
Name[nl]=Community
Name[fi]=Yhteisö
Name[fr]=Communauté
Name[de]=Community
Name[el]=Κοινότητα
Name[hu]=Közösség
Name[it]=Comunità
Name[ja]=
Name[ko]=
Name[no]=Samfunn
Name[pt_PT]=Comunidade
Name[pl]=Społeczność
Name[ro]=Comunitate
Name[ru]=Сообщество
Name[es]=Comunidad
Name[sv]=Gemenskap
Name[zh_CN]=
Name[zh_TW]=
Name[th]=
Name[tr]=Topluluk
Name[uk]=Спільнота
Name[vi]=Cng đng
Exec=steam steam://url/SteamIDControlPage
[Desktop Action Library]
Name=Library
Name[pt_BR]=Biblioteca
Name[bg]=Библиотека
Name[cs]=Knihovna
Name[da]=Bibliotek
Name[nl]=Bibliotheek
Name[fi]=Kokoelma
Name[fr]=Bibliothèque
Name[de]=Bibliothek
Name[el]=Συλλογή
Name[hu]=Könyvtár
Name[it]=Libreria
Name[ja]=
Name[ko]=
Name[no]=Bibliotek
Name[pt_PT]=Biblioteca
Name[pl]=Biblioteka
Name[ro]=Colecţie
Name[ru]=Библиотека
Name[es]=Biblioteca
Name[sv]=Bibliotek
Name[zh_CN]=
Name[zh_TW]=
Name[th]=
Name[tr]=Kütüphane
Name[uk]=Бібліотека
Name[vi]=Thư vin
Exec=steam steam://open/games
[Desktop Action Servers]
Name=Servers
Name[pt_BR]=Servidores
Name[bg]=Сървъри
Name[cs]=Servery
Name[da]=Servere
Name[nl]=Servers
Name[fi]=Palvelimet
Name[fr]=Serveurs
Name[de]=Server
Name[el]=Διακομιστές
Name[hu]=Szerverek
Name[it]=Server
Name[ja]=
Name[ko]=
Name[no]=Tjenere
Name[pt_PT]=Servidores
Name[pl]=Serwery
Name[ro]=Servere
Name[ru]=Серверы
Name[es]=Servidores
Name[sv]=Servrar
Name[zh_CN]=
Name[zh_TW]=
Name[th]=
Name[tr]=Sunucular
Name[uk]=Сервери
Name[vi]=Máy ch
Exec=steam steam://open/servers
[Desktop Action Screenshots]
Name=Screenshots
Name[pt_BR]=Capturas de tela
Name[bg]=Снимки
Name[cs]=Snímky obrazovky
Name[da]=Skærmbilleder
Name[nl]=Screenshots
Name[fi]=Kuvankaappaukset
Name[fr]=Captures d'écran
Name[de]=Screenshots
Name[el]=Φωτογραφίες
Name[hu]=Képernyőmentések
Name[it]=Screenshot
Name[ja]=
Name[ko]=
Name[no]=Skjermbilder
Name[pt_PT]=Capturas de ecrã
Name[pl]=Zrzuty ekranu
Name[ro]=Capturi de ecran
Name[ru]=Скриншоты
Name[es]=Capturas
Name[sv]=Skärmdumpar
Name[zh_CN]=
Name[zh_TW]=
Name[th]=
Name[tr]=Ekran Görüntüleri
Name[uk]=Скріншоти
Name[vi]=nh chp
Exec=steam steam://open/screenshots
[Desktop Action News]
Name=News
Name[pt_BR]=Notícias
Name[bg]=Новини
Name[cs]=Zprávy
Name[da]=Nyheder
Name[nl]=Nieuws
Name[fi]=Uutiset
Name[fr]=Actualités
Name[de]=Neuigkeiten
Name[el]=Νέα
Name[hu]=Hírek
Name[it]=Notizie
Name[ja]=
Name[ko]=
Name[no]=Nyheter
Name[pt_PT]=Novidades
Name[pl]=Aktualności
Name[ro]=Știri
Name[ru]=Новости
Name[es]=Noticias
Name[sv]=Nyheter
Name[zh_CN]=
Name[zh_TW]=
Name[th]=
Name[tr]=Haberler
Name[uk]=Новини
Name[vi]=Tin tc
Exec=steam steam://open/news
[Desktop Action Settings]
Name=Settings
Name[pt_BR]=Configurações
Name[bg]=Настройки
Name[cs]=Nastavení
Name[da]=Indstillinger
Name[nl]=Instellingen
Name[fi]=Asetukset
Name[fr]=Paramètres
Name[de]=Einstellungen
Name[el]=Ρυθμίσεις
Name[hu]=Beállítások
Name[it]=Impostazioni
Name[ja]=
Name[ko]=
Name[no]=Innstillinger
Name[pt_PT]=Definições
Name[pl]=Ustawienia
Name[ro]=Setări
Name[ru]=Настройки
Name[es]=Parámetros
Name[sv]=Inställningar
Name[zh_CN]=
Name[zh_TW]=
Name[th]=
Name[tr]=Ayarlar
Name[uk]=Налаштування
Name[vi]=Thiết lp
Exec=steam steam://open/settings
[Desktop Action BigPicture]
Name=Big Picture
Exec=steam steam://open/bigpicture
[Desktop Action Friends]
Name=Friends
Name[pt_BR]=Amigos
Name[bg]=Приятели
Name[cs]=Přátelé
Name[da]=Venner
Name[nl]=Vrienden
Name[fi]=Kaverit
Name[fr]=Amis
Name[de]=Freunde
Name[el]=Φίλοι
Name[hu]=Barátok
Name[it]=Amici
Name[ja]=
Name[ko]=
Name[no]=Venner
Name[pt_PT]=Amigos
Name[pl]=Znajomi
Name[ro]=Prieteni
Name[ru]=Друзья
Name[es]=Amigos
Name[sv]=Vänner
Name[zh_CN]=
Name[zh_TW]=
Name[th]=
Name[tr]=Arkadaşlar
Name[uk]=Друзі
Name[vi]=Bn bè
Exec=steam steam://open/friends

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

View File

@ -1,8 +1,9 @@
import os import os
import secrets import secrets
import sqlite3 import mariadb
import flask import flask
import utils import utils
from utils.mail import MailHandler
app = flask.Flask(__name__) app = flask.Flask(__name__)
@ -46,6 +47,35 @@ def confirm_mail_code() -> flask.Response:
return flask.Response("Wrong code", 400) return flask.Response("Wrong code", 400)
@app.post("/send-mail-code-for-reset-password")
def send_mail_code_for_reset_password() -> flask.Response:
try:
mail = flask.request.form["mail"]
except KeyError:
return flask.Response("Mail missing", 422)
try:
MailHandler.send_code(mail)
utils.UserHandler.get_user_by_mail(mail)
except:
return flask.Response("Wrong mail/ mail doesn't exist", 404)
respose = flask.Response()
respose.set_cookie("mail", mail)
return respose
@app.post("/reset-password")
def reset_password() -> flask.Response:
try:
mail = flask.session["mail"]
except KeyError:
return flask.Response("mail not registered", 428)
try:
utils.UserHandler.reset_password(mail, flask.request.form["password"])
except KeyError:
return flask.Response("password missing", 422)
return flask.Response()
@app.post("/register-leader") @app.post("/register-leader")
def register_leader() -> flask.Response: def register_leader() -> flask.Response:
try: try:
@ -70,10 +100,14 @@ def register_leader() -> flask.Response:
flask.session["user_id"] = user_id flask.session["user_id"] = user_id
except (TypeError, KeyError): except (TypeError, KeyError):
return flask.Response("Something is missing", 422) return flask.Response("Something is missing", 422)
except sqlite3.IntegrityError: except mariadb.DataError:
return flask.Response("Mail or phone number already registered or phone number or pin code is not correct", 428) return flask.Response("phone number or pin code is not correct", 428)
except ValueError: except ValueError:
return flask.Response("There is text where number is supposed to be there", 400) return flask.Response("There is text where number is supposed to be there", 400)
except mariadb.InterfaceError:
return flask.Response("Mail or phone taken", 428)
except mariadb.ProgrammingError:
pass
try: try:
utils.MailHandler.send_success_mail(mail) utils.MailHandler.send_success_mail(mail)
except: except:
@ -92,7 +126,8 @@ def login() -> flask.Response:
assert utils.UserHandler.verify_password_by_mail(mail, password) assert utils.UserHandler.verify_password_by_mail(mail, password)
flask.session["user_id"] = utils.UserHandler.get_user_by_mail(mail).user_id flask.session["user_id"] = utils.UserHandler.get_user_by_mail(mail).user_id
return flask.Response() return flask.Response()
except KeyError: except KeyError as e:
print(e)
return flask.Response("Mail doesn't exist", 404) return flask.Response("Mail doesn't exist", 404)
except AssertionError: except AssertionError:
return flask.Response("Wrong password", 400) return flask.Response("Wrong password", 400)
@ -102,7 +137,7 @@ def login() -> flask.Response:
def get_id() -> flask.Response: def get_id() -> flask.Response:
try: try:
return flask.Response(utils.UserHandler.get_user_by_id(flask.session["user_id"]).mail) return flask.Response(utils.UserHandler.get_user_by_id(flask.session["user_id"]).mail)
except KeyError: except (KeyError, AssertionError):
return flask.Response("Not logged in", 428) return flask.Response("Not logged in", 428)
@ -134,7 +169,7 @@ def register() -> flask.Response:
return flask.Response("Not all details provided", 422) return flask.Response("Not all details provided", 422)
except AssertionError: except AssertionError:
return flask.Response("Max 4 members", 400) return flask.Response("Max 4 members", 400)
except sqlite3.IntegrityError as error: except mariadb.DataError as error:
error_message = str(error) error_message = str(error)
if error_message == "UNIQUE constraint failed: users.phone_number": if error_message == "UNIQUE constraint failed: users.phone_number":
return flask.Response("Phone number taken", 400) return flask.Response("Phone number taken", 400)
@ -171,7 +206,7 @@ def update_ideas() -> flask.Response:
team_id=team_id, team_id=team_id,
**flask.request.form, **flask.request.form,
)) ))
except KeyError: except (KeyError, AssertionError):
return flask.Response("Something is missing", 422) return flask.Response("Something is missing", 422)
return flask.Response() return flask.Response()

View File

@ -66,14 +66,15 @@ class TeamHandler:
@classmethod @classmethod
def create_team(cls, team_name: str) -> int: def create_team(cls, team_name: str) -> int:
cls.init() cls.init()
team = cls.__cursor.execute( cls.__cursor.execute(
""" """
INSERT INTO teams(team_name) VALUES(?) INSERT INTO teams(team_name) VALUES(?)
""", """,
(team_name, ) (team_name, )
) )
team_id = cls.__cursor.lastrowid
cls.close() cls.close()
return team.lastrowid if team.lastrowid else -1 return team_id
@classmethod @classmethod
def get_team_members(cls, team_id: int) -> list[int]: def get_team_members(cls, team_id: int) -> list[int]:
@ -84,7 +85,8 @@ class TeamHandler:
FROM users WHERE team_id = ?; FROM users WHERE team_id = ?;
""", """,
(team_id, ) (team_id, )
).fetchall() )
users = users.fetchall() if users else []
cls.close() cls.close()
return [user[0] for user in users] return [user[0] for user in users]
@ -128,11 +130,13 @@ class TeamHandler:
@classmethod @classmethod
def get_project(cls, team_id: int) -> Team: def get_project(cls, team_id: int) -> Team:
cls.init() cls.init()
teams = cls.__cursor.execute( cls.__cursor.execute(
f""" f"""
SELECT * FROM teams WHERE team_id = ? SELECT * FROM teams WHERE team_id = ?
""", (team_id, ) """, (team_id, )
).fetchall()[0] )
teams = cls.__cursor
teams = teams.fetchall()[0] if teams else []
cls.close() cls.close()
return Team( return Team(
teams[0], teams[0],

View File

@ -1,6 +1,6 @@
import mariadb
import bcrypt import bcrypt
from dataclasses import dataclass from dataclasses import dataclass
import mariadb
import utils import utils
@ -17,7 +17,7 @@ class User:
country: str country: str
taluk: str taluk: str
pin_code: int pin_code: int
phone_number: int phone_number: str
name: str name: str
team_id: int team_id: int
team_leader: int team_leader: int
@ -35,7 +35,7 @@ class User:
country: str, country: str,
taluk: str, taluk: str,
pin_code: int|str, pin_code: int|str,
phone_number: int|str, phone_number: str,
name: str, name: str,
team_leader: bool|int|str, team_leader: bool|int|str,
team_id: int|str, team_id: int|str,
@ -51,7 +51,7 @@ class User:
self.country: str = country self.country: str = country
self.taluk: str = taluk self.taluk: str = taluk
self.pin_code: int = int(pin_code) self.pin_code: int = int(pin_code)
self.phone_number: int = int(phone_number) self.phone_number = phone_number
self.name = name self.name = name
self.team_id = int(team_id) self.team_id = int(team_id)
self.team_leader = int(team_leader) self.team_leader = int(team_leader)
@ -134,7 +134,8 @@ class UserHandler:
FROM users WHERE user_id = ?; FROM users WHERE user_id = ?;
""", """,
(user_id, ) (user_id, )
).fetchall() )
users = cls.__cursor.fetchall()
assert users, f"{user_id} does not exist!" assert users, f"{user_id} does not exist!"
user = users[0] user = users[0]
cls.close() cls.close()
@ -158,13 +159,15 @@ class UserHandler:
@classmethod @classmethod
def get_user_by_mail(cls, mail: str) -> User: def get_user_by_mail(cls, mail: str) -> User:
cls.init()
users = cls.__cursor.execute( users = cls.__cursor.execute(
f""" f"""
SELECT * SELECT *
FROM users WHERE mail = ?; FROM users WHERE mail = ?;
""", """,
(mail, ) (mail, )
).fetchall() )
users = cls.__cursor.fetchall()
if not users: if not users:
raise KeyError(f"{mail} does not exist!") raise KeyError(f"{mail} does not exist!")
user = users[0] user = users[0]
@ -190,19 +193,20 @@ class UserHandler:
@classmethod @classmethod
def verify_password_by_mail(cls, mail: str, password: str) -> bool: def verify_password_by_mail(cls, mail: str, password: str) -> bool:
cls.init() cls.init()
users = cls.__cursor.execute( cls.__cursor.execute(
f""" f"""
SELECT password SELECT password FROM users WHERE mail='koshinhegde@gmail.com'
FROM users WHERE mail = ?;
""", """,
(mail, ) (mail, )
).fetchall() )
users = cls.__cursor.fetchall()
if not users: if not users:
raise KeyError(f"{mail} does not exist!") raise KeyError(f"{mail} does not exist!")
real_password: str = users[0][0]
cls.close() cls.close()
return bcrypt.checkpw( return bcrypt.checkpw(
password.encode("utf-8"), password.encode("utf-8"),
users[0][0] real_password.encode()
) )
@classmethod @classmethod
@ -212,6 +216,22 @@ class UserHandler:
cls.__cursor.execute( cls.__cursor.execute(
f""" f"""
DELETE FROM users WHERE mail=? DELETE FROM users WHERE mail=?
""", (mail, ) """,
(mail, )
)
cls.close()
@classmethod
def reset_password(cls, mail: int, password: str) -> None:
cls.init()
salt = bcrypt.gensalt()
encrypted_password = bcrypt.hashpw(password.encode("utf-8"), salt)
cls.__cursor.execute(
f"""
UPDATE users
SET password=?
WHERE mail=?
""",
(encrypted_password, mail, )
) )
cls.close() cls.close()