/* * Copyright (C) 2018 Emeric Poupon * * This file is part of LMS. * * LMS is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * LMS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with LMS. If not, see . */ #include #include #include #include #include "utils/Logger.hpp" #include "common/Validators.hpp" #include "LmsApplication.hpp" #include "FirstConnectionView.hpp" namespace UserInterface { namespace Settings { class FirstConnectionModel : public Wt::WFormModel { public: // Associate each field with a unique string literal. static const Field AdminLoginField; static const Field PasswordField; static const Field PasswordConfirmField; FirstConnectionModel(Wt::WObject *parent = 0) : Wt::WFormModel(parent) { addField(AdminLoginField); addField(PasswordField); addField(PasswordConfirmField); setValidator(AdminLoginField, createNameValidator()); setValidator(PasswordField, createMandatoryValidator()); setValidator(PasswordConfirmField, createMandatoryValidator()); } void saveData() { Wt::Dbo::Transaction transaction(DboSession()); // Check if a user already exist // If it's the case, just do nothing if (!Database::User::getAll(DboSession()).empty()) throw std::runtime_error("Admin user already created"); // Create user Wt::Auth::User authUser = DbHandler().getUserDatabase().registerNew(); Database::User::pointer user = DbHandler().getUser(authUser); // Account authUser.setIdentity(Wt::Auth::Identity::LoginName, valueText(AdminLoginField)); Database::Handler::getPasswordService().updatePassword(authUser, valueText(PasswordField)); user.modify()->setAdmin( true ); } bool validateField(Field field) { Wt::WString error; if (field == PasswordField) { // Password is mandatory if we create the user if (!valueText(PasswordField).empty()) { // Evaluate the strength of the password Wt::Auth::AbstractPasswordService::StrengthValidatorResult res = Database::Handler::getPasswordService().strengthValidator()->evaluateStrength(valueText(PasswordField), valueText(AdminLoginField), ""); if (!res.isValid()) error = res.message(); } else return Wt::WFormModel::validateField(field); } else if (field == PasswordConfirmField) { if (validation(PasswordField).state() == Wt::WValidator::Valid) { if (valueText(PasswordField) != valueText(PasswordConfirmField)) error = Wt::WString::tr("Wt.Auth.passwords-dont-match"); } } else { return Wt::WFormModel::validateField(field); } setValidation(field, Wt::WValidator::Result( error.empty() ? Wt::WValidator::Valid : Wt::WValidator::Invalid, error)); return (validation(field).state() == Wt::WValidator::Valid); } }; const Wt::WFormModel::Field FirstConnectionModel::AdminLoginField = "admin-login"; const Wt::WFormModel::Field FirstConnectionModel::PasswordField = "password"; const Wt::WFormModel::Field FirstConnectionModel::PasswordConfirmField = "password-confirm"; FirstConnectionView::FirstConnectionView(Wt::WContainerWidget *parent) : Wt::WTemplateFormView(parent) { auto model = new FirstConnectionModel(this); setTemplateText(Wt::WString::tr("template-settings-first-connection")); addFunction("tr", &WTemplate::Functions::tr); addFunction("id", &WTemplate::Functions::id); // AdminLogin Wt::WLineEdit* accountEdit = new Wt::WLineEdit(); setFormWidget(FirstConnectionModel::AdminLoginField, accountEdit); // Password Wt::WLineEdit* passwordEdit = new Wt::WLineEdit(); setFormWidget(FirstConnectionModel::PasswordField, passwordEdit ); passwordEdit->setEchoMode(Wt::WLineEdit::Password); // Password confirmation Wt::WLineEdit* passwordConfirmEdit = new Wt::WLineEdit(); setFormWidget(FirstConnectionModel::PasswordConfirmField, passwordConfirmEdit); passwordConfirmEdit->setEchoMode(Wt::WLineEdit::Password); auto saveButton = new Wt::WPushButton(Wt::WString::tr("msg-create")); bindWidget("create-btn", saveButton); saveButton->clicked().connect(std::bind([=] { updateModel(model); if (model->validate()) { model->saveData(); notify(Wt::WString::tr("msg-settings-first-connection-done")); saveButton->setEnabled(false); } updateView(model); })); updateView(model); } } // namespace Settings } // namespace UserInterface