435 lines
17 KiB
Python
435 lines
17 KiB
Python
# coding: utf-8
|
||
|
||
import validators
|
||
from flask import Blueprint, g, render_template, session, redirect, url_for
|
||
from flask import request, flash
|
||
from sshpubkeys import SSHKey
|
||
from SWSCloudCore.controllers.billing import ControllerBilling
|
||
from SWSCloudCore.controllers.common import ControllerMessagesEmail
|
||
from SWSCloudCore.controllers.users import ControllerAPI
|
||
from SWSCloudCore.controllers.users import ControllerSSHKey
|
||
from SWSCloudCore.controllers.users import ControllerUsers
|
||
from SWSCloudCore.controllers.users import ControllerUsersDetails
|
||
from SWSCloudCore.controllers.users import ControllerUsersRecoveryCodes
|
||
from SWSCloudCore import models
|
||
|
||
viewAccount = Blueprint('account', __name__, url_prefix='/account')
|
||
|
||
|
||
@viewAccount.route('/', methods=['GET', 'POST'])
|
||
def index():
|
||
# check session
|
||
if not ControllerUsers().check_session():
|
||
return redirect(url_for("account.logout"))
|
||
# auth user
|
||
if not ControllerUsers().auth(session['email'], session['password']):
|
||
return redirect(url_for("account.logout"))
|
||
|
||
cud = ControllerUsersDetails(session['user_id'])
|
||
|
||
# проверяем, есть ли запись в таблице usersdetails, чтобы небыло ошибок
|
||
if not cud.details_exists():
|
||
# если нет, то делаем запись в таблицу, чтобы небыло ошибок
|
||
cud.details_create()
|
||
|
||
return render_template(
|
||
'default/id/index.html',
|
||
user=cud.details_get(),
|
||
user_details=cud.details_get()
|
||
)
|
||
|
||
|
||
@viewAccount.route('/edit.html', methods=['GET', 'POST'])
|
||
def edit():
|
||
cu = ControllerUsers()
|
||
# check session
|
||
if not cu.check_session():
|
||
return redirect(url_for("account.logout"))
|
||
# auth user
|
||
if not cu.auth(session['email'], session['password']):
|
||
return redirect(url_for("account.logout"))
|
||
|
||
cud = ControllerUsersDetails(session['user_id'])
|
||
|
||
# Проверяем есть ли детали пользователя.
|
||
if not cud.details_exists():
|
||
# Если нет, то создаём
|
||
cud.details_create()
|
||
|
||
if request.method == "POST":
|
||
if not request.form['zipcode'].isdigit():
|
||
flash(u'Индекс должен содержать только цифры')
|
||
return redirect(url_for('account.edit'))
|
||
|
||
cud.details_update(
|
||
fname=request.form['fname'],
|
||
lname=request.form['lname'],
|
||
address=request.form['address'],
|
||
city=request.form['city'],
|
||
country=request.form['country'],
|
||
state=request.form['state'],
|
||
zipcode=request.form['zipcode']
|
||
)
|
||
return redirect(url_for('account.edit'))
|
||
|
||
return render_template(
|
||
'default/id/edit.html',
|
||
user=cud.details_get(),
|
||
user_details=cud.details_get()
|
||
)
|
||
|
||
|
||
@viewAccount.route('/settings', methods=['GET', 'POST'])
|
||
def settings():
|
||
# check session
|
||
if not ControllerUsers().check_session():
|
||
return redirect(url_for("account.logout"))
|
||
# auth user
|
||
if not ControllerUsers().auth(session['email'], session['password']):
|
||
return redirect(url_for("account.logout"))
|
||
|
||
return render_template(
|
||
'default/id/index.html',
|
||
user_details=ControllerUsers(session['user_id']).get()
|
||
)
|
||
|
||
|
||
@viewAccount.route('/billing', methods=['GET', 'POST'])
|
||
def billing():
|
||
# check session
|
||
if not ControllerUsers().check_session():
|
||
return redirect(url_for("account.logout"))
|
||
# auth user
|
||
if not ControllerUsers().auth(session['email'], session['password']):
|
||
return redirect(url_for("account.logout"))
|
||
|
||
user_id = session['user_id']
|
||
cub = ControllerBilling()
|
||
|
||
if not cub.exists(user_id):
|
||
cub.create(user_id, balance=0)
|
||
|
||
# TODO: move to function
|
||
user_details = models.Users.select().where(
|
||
models.Users.id == session['user_id']
|
||
).get()
|
||
|
||
return render_template(
|
||
'default/id/balance.html',
|
||
user_details=user_details,
|
||
user_balance=cub.get(user_id),
|
||
history=cub.transactions_get(user_id)
|
||
)
|
||
|
||
|
||
@viewAccount.route('/registration.html', methods=['GET', 'POST'])
|
||
def registration():
|
||
cu = ControllerUsers()
|
||
# Проверяем сессию, если все данные на месте,
|
||
# то перенаправляем пользователя на страницу со списком контейнеров
|
||
if cu.check_session():
|
||
return redirect(url_for("containers.index"))
|
||
|
||
if request.method == 'POST':
|
||
email = request.form.get('email')
|
||
password = request.form.get('password')
|
||
password2 = request.form.get('password2')
|
||
|
||
# Проверка введён ли проверочный пароль одинаково
|
||
if password != password2:
|
||
flash(u'Пароли не совпадают', 'error')
|
||
|
||
# Проверяем правильность адреса е-почты и
|
||
if not validators.email(email):
|
||
flash(u'Неправильный адрес електронной почты', 'error')
|
||
return redirect(url_for('account.registration'))
|
||
|
||
# Проверяем зарегистрирован ли указанный адрес електронной почты
|
||
if cu.user_exists_by_email(email):
|
||
flash(u'Польщователь с указанным адресом уже зарегистрирован')
|
||
return redirect(url_for('account.registration'))
|
||
|
||
# Регистрируем пользователя в системе
|
||
if ControllerUsers().registration(email, password):
|
||
user_id = ControllerUsers().get_id_by_email(email)
|
||
|
||
ControllerUsersDetails(user_id).details_create()
|
||
ControllerBilling().create(user_id, g.settings['bonus'])
|
||
# ControllerU
|
||
# send mail message with recovery code
|
||
message = u"""
|
||
Е-почта: %s
|
||
Пароль: %s
|
||
""" % (request.form['email'], request.form['password'])
|
||
subject = u'GoCloud.ru: Успешная регистрация'
|
||
lead = u"""
|
||
Поздравляем с успешной зарегистрацией.
|
||
"""
|
||
callout = u"""
|
||
Для входа в личный кабинет воспользуйтесь
|
||
<a href="https://gocloud.ru/account/login">страницей авторизации</a>.
|
||
"""
|
||
|
||
email = ControllerMessagesEmail()
|
||
email.send(title=subject, to=request.form['email'], lead=lead, message=message, callout=callout)
|
||
|
||
# redirect to login page
|
||
flash(u'Учетная запись успешно зарегистрирована.', 'success')
|
||
return redirect(url_for('account.login'))
|
||
else:
|
||
flash('Ошибка при регистрации, попробуйте снова', 'error')
|
||
return redirect(url_for('account.registration'))
|
||
return render_template('default/id/registration.html')
|
||
|
||
|
||
@viewAccount.route('/login.html', methods=['GET', 'POST'])
|
||
def login():
|
||
cu = ControllerUsers()
|
||
if request.method == 'POST':
|
||
email = request.form['email']
|
||
password = request.form['password']
|
||
|
||
# validation entered data
|
||
if not validators.email(email):
|
||
flash(u'Неправильный адрес електронной почты', 'error')
|
||
return redirect(url_for('account.login'))
|
||
|
||
# try auth only active users (with status code 1)
|
||
if cu.auth(email, password, 1):
|
||
# get user_id
|
||
user_id = cu.get_id_by_email(email)
|
||
# save user data to session
|
||
session['user_id'] = user_id
|
||
session['email'] = email
|
||
session['password'] = password
|
||
# redirect to rules list
|
||
return redirect(url_for('containers.index'))
|
||
else:
|
||
flash(u'Не авторизованы', 'error')
|
||
return redirect(url_for('account.login'))
|
||
return render_template("default/id/login.html")
|
||
|
||
|
||
@viewAccount.route('/logout.html')
|
||
def logout():
|
||
session.pop('user_id', None)
|
||
session.pop('email', None)
|
||
session.pop('password', None)
|
||
return redirect(url_for('account.login'))
|
||
|
||
|
||
@viewAccount.route("/password_reset.html", methods=['GET', 'POST'])
|
||
def password_reset():
|
||
if request.method == "POST":
|
||
cu = ControllerUsers()
|
||
curc = ControllerUsersRecoveryCodes()
|
||
email = request.form['email']
|
||
|
||
if not validators.email(email):
|
||
flash(u'Произошла ошибка. Введите корректный адрес е.почты.')
|
||
return redirect(url_for('account.password_reset'))
|
||
|
||
# check exists email
|
||
if not cu.user_exists_by_email(email):
|
||
flash(u'Произошла ошибка. Введите корректный адрес е.почты.')
|
||
return redirect(url_for('account.password_reset'))
|
||
|
||
# get user_id by email
|
||
user_id = str(cu.user_id_by_email(email))
|
||
|
||
# create recovery code
|
||
recovery_code = curc.code_generate()
|
||
|
||
# remove old recovery codes for user
|
||
curc.delete(user_id)
|
||
# write new recovery code to database
|
||
curc.create(user_id, recovery_code)
|
||
|
||
# send mail message with recovery code
|
||
subject = u'GoCloud.ru: Код восстановления доступа'
|
||
message = u'Код восстановления: %s' % recovery_code
|
||
lead = u"""
|
||
Данный код необходимо ввести на странице подтверждения
|
||
<a href="https://gocloud.ru/account/password_reset_step2">сброса пароля</a>.
|
||
"""
|
||
callout = u'Если вы не хотите сбрасывать пароль, то просто проигнорируйте (или удалите) данное письмо.'
|
||
# controllers.Mail().send(request.form['email'], subject, message)
|
||
|
||
email = ControllerMessagesEmail()
|
||
email.send(title=subject, to=request.form['email'], lead=lead, message=message, callout=callout)
|
||
|
||
# redirect to step 2
|
||
flash(u'На указанный адрес был отправлен код подтверждения', 'info')
|
||
return redirect(url_for('account.password_reset_step2'))
|
||
return render_template('default/id/password_reset_step1.html')
|
||
|
||
|
||
@viewAccount.route("/password_reset_step2.html", methods=['GET', 'POST'])
|
||
def password_reset_step2():
|
||
if request.method == "POST":
|
||
# check exists email
|
||
if ControllerUsers().user_exists_by_email(request.form['email']):
|
||
# get user_id by email
|
||
user_id = ControllerUsers().user_id_by_email(request.form['email'])
|
||
recovery_code = request.form['recovery_code']
|
||
|
||
# check valid recovery codes
|
||
if ControllerUsersRecoveryCodes().check(user_id, recovery_code):
|
||
# remove old recovery codes for user
|
||
ControllerUsersRecoveryCodes().delete(user_id)
|
||
|
||
# generate new password
|
||
new_password = ControllerUsers().generate_password()
|
||
|
||
# save password
|
||
ControllerUsers().update(user_id, password=new_password)
|
||
|
||
# send mail message with new password
|
||
message = u"""Новый пароль: %s""" % new_password
|
||
subject = u"""GoCloud.ru: Новый пароль"""
|
||
lead = u"""
|
||
Пароль для доступа в <a href="https://gocloud.ru/account/login">личный кабинет</a> был сброшен.
|
||
"""
|
||
callout = u"""Запомните новый пароль и удалите данное сообщение."""
|
||
# controllers.Mail().send(request.form['email'], subject, message)
|
||
|
||
email = ControllerMessagesEmail()
|
||
email.send(title=subject, to=request.form.GET('email'), lead=lead, message=message, callout=callout)
|
||
|
||
# redirect to login page
|
||
return redirect(url_for('account.login'))
|
||
# redirect to step 2
|
||
g.errors['items'].append(u'Ошибочный код')
|
||
g.errors['total'] += 1
|
||
return redirect(url_for('account.password_reset_step2'))
|
||
else:
|
||
g.errors['items'].append(u'Произошла ошибка. Введите корректный адрес е.почты.')
|
||
g.errors['total'] += 1
|
||
return render_template('default/id/password_reset_step2.html')
|
||
|
||
|
||
@viewAccount.route("/password_update", methods=['GET', 'POST'])
|
||
def password_update():
|
||
"""
|
||
Обновление пароля из личного кабинета с уведомлением владельца по ел.почте
|
||
:return:
|
||
"""
|
||
# check session
|
||
if not ControllerUsers().check_session():
|
||
return redirect(url_for("account.logout"))
|
||
# auth user
|
||
if not ControllerUsers().auth(session['email'], session['password']):
|
||
return redirect(url_for("account.logout"))
|
||
|
||
if request.method == "POST":
|
||
# Проверка старого пароля
|
||
check_old = ControllerUsers().auth(session['email'], request.form['old_password'])
|
||
|
||
if check_old and request.form['new_password'] == request.form['new_password_confirm']:
|
||
# Обновляем пароль
|
||
ControllerUsers().update(session['user_id'], password=request.form['new_password'])
|
||
|
||
# send mail message with recovery code
|
||
lead = u"""
|
||
Пароль для достуна в личный кабинет был успешно изменён.
|
||
"""
|
||
message = u"""Пароль: %s""" % request.form['new_password']
|
||
callout = u"""
|
||
"""
|
||
subject = u'GoCloud.ru: Смена пароля'
|
||
|
||
email = ControllerMessagesEmail()
|
||
email.send(
|
||
title=subject,
|
||
to=session['email'],
|
||
lead=lead,
|
||
message=message,
|
||
callout=callout
|
||
)
|
||
|
||
return redirect(url_for('account.password_update'))
|
||
return render_template('default/id/password_update.html')
|
||
|
||
|
||
@viewAccount.route('/sshkey', methods=['GET', 'POST'])
|
||
def sshkey():
|
||
# check session
|
||
if not ControllerUsers().check_session():
|
||
return redirect(url_for("account.logout"))
|
||
# auth user
|
||
if not ControllerUsers().auth(session['email'], session['password']):
|
||
return redirect(url_for("account.logout"))
|
||
|
||
controllersshkey = ControllerSSHKey(session['user_id'])
|
||
|
||
if request.method == "POST":
|
||
try:
|
||
ssh = SSHKey(request.form['sshkey'])
|
||
except Exception as e:
|
||
g.errors['items'].append(u"Не корректный ssh-ключ.")
|
||
g.errors['total'] += 1
|
||
else:
|
||
print(ssh.bits)
|
||
print(ssh.hash())
|
||
|
||
controllersshkey.set(request.form['sshkey'])
|
||
|
||
sshkey = {
|
||
"exists": controllersshkey.check(),
|
||
"sshkey": controllersshkey.get()
|
||
}
|
||
|
||
return render_template('default/id/sshkey.html', sshkey=sshkey)
|
||
|
||
|
||
@viewAccount.route('/sshkey_delete', methods=['POST'])
|
||
def sshkey_delete():
|
||
# check session
|
||
if not ControllerUsers().check_session():
|
||
return redirect(url_for("account.logout"))
|
||
# auth user
|
||
if not ControllerUsers().auth(session['email'], session['password']):
|
||
return redirect(url_for("account.logout"))
|
||
|
||
controllersshkey = ControllerSSHKey(session['user_id'])
|
||
controllersshkey.delete()
|
||
|
||
return redirect(url_for('account.sshkey'))
|
||
|
||
|
||
@viewAccount.route('/api', methods=['GET', 'POST'])
|
||
def api():
|
||
# check session
|
||
if not ControllerUsers().check_session():
|
||
return redirect(url_for("account.logout"))
|
||
# auth user
|
||
if not ControllerUsers().auth(session['email'], session['password']):
|
||
return redirect(url_for("account.logout"))
|
||
#
|
||
if not ControllerAPI().check(session['user_id']):
|
||
ControllerAPI().set(session['user_id'], '', '', 0)
|
||
#
|
||
user_secret = ControllerAPI().get(session['user_id'])[0]
|
||
return render_template(
|
||
'default/id/api.html',
|
||
user_secret=user_secret
|
||
)
|
||
|
||
|
||
@viewAccount.route('/api_update', methods=['POST'])
|
||
def api_update():
|
||
# check session
|
||
if not ControllerUsers().check_session():
|
||
return redirect(url_for("account.logout"))
|
||
# auth user
|
||
if not ControllerUsers().auth(session['email'], session['password']):
|
||
return redirect(url_for("account.logout"))
|
||
#
|
||
ControllerAPI().set(
|
||
session['user_id'],
|
||
request.form['secret'],
|
||
request.form['acl'],
|
||
request.form['status']
|
||
)
|
||
#
|
||
return redirect(url_for('account.api'))
|