package controller; import haxe.crypto.Md5; import sugoi.form.elements.Input; import sugoi.form.Form; import sugoi.form.elements.IntInput; import sugoi.form.elements.StringInput; import sugoi.form.validators.EmailValidator; import ufront.mail.*; class User extends Controller { public function new() { super(); } @tpl("user/default.mtt") function doDefault() {} @tpl("user/login.mtt") function doLogin() { if (App.current.user != null) { throw Redirect('/'); } // if its needed to redirect after login if (app.params.exists("redirect")) { view.redirect = app.params.exists("redirect"); } else { view.redirect = "/"; } } /** * Choose which group to connect to. */ @logged @tpl("user/choose.mtt") function doChoose(?args:{amap:db.Amap}) { if (app.user == null) throw t._("You are not connected"); var amaps = db.UserAmap.manager.search($user == app.user, false); if (amaps.length == 1 && !app.params.exists("show")) { // qu'une amap app.session.data.amapId = amaps.first().amap.id; throw Redirect('/'); } else { view.noGroup = true; // force template to not display current group } if (args != null && args.amap != null) { // select a group var which = app.session.data == null ? 0 : app.session.data.whichUser; app.session.data.order = null; app.session.data.newGroup = null; app.session.data.amapId = args.amap.id; app.session.data.whichUser = which; throw Redirect('/'); } view.amaps = amaps; view.wl = db.WaitingList.manager.search($user == app.user, false); #if plugins view.pros = pro.db.PUserCompany.getCompanies(app.user); #end } function doLogout() { App.current.session.delete(); throw Redirect('/'); } /** * Ask for password renewal by mail * when password is forgotten */ @tpl("user/forgottenPassword.mtt") function doForgottenPassword(?key:String, ?u:db.User) { // STEP 1 var step = 1; var error:String = null; var url = "/user/forgottenPassword"; // ask for mail var askmailform = new Form("askemail"); askmailform.addElement(new StringInput("email", t._("Please key-in your E-Mail address"), null, true)); // change pass form var chpassform = new Form("chpass"); var pass1 = new StringInput("pass1", t._("Your new password"), null, true); pass1.password = true; chpassform.addElement(pass1); var pass2 = new StringInput("pass2", t._("Again your new password"), null, true); pass2.password = true; chpassform.addElement(pass2); var uid = new IntInput("uid", "uid", u == null ? null : u.id); uid.inputType = ITHidden; chpassform.addElement(uid); if (askmailform.isValid()) { // STEP 2 // send password renewal email step = 2; var email:String = askmailform.getValueOf("email"); var user = db.User.manager.select(email == $email, false); // could be user 2 if (user == null) user = db.User.manager.select(email == $email2, false); // user not found if (user == null) throw Error(url, t._("This E-mail is not linked to a known account")); // create token var token = haxe.crypto.Md5.encode("chp" + Std.random(1000000000)); sugoi.db.Cache.set(token, user.id, 60 * 60 * 24 * 30); var m = new sugoi.mail.Mail(); m.setSender(App.config.get("default_email"), t._("Cagette.net")); m.setRecipient(email, user.name); m.setSubject("[" + App.config.NAME + "] " + t._("Password change")); m.setHtmlBody(app.processTemplate('mail/forgottenPassword.mtt', {user: user, link: 'http://' + App.config.HOST + '/user/forgottenPassword/' + token + "/" + user.id})); App.sendMail(m); } if (key != null && u != null) { // check key and propose to change pass step = 3; if (u.id == sugoi.db.Cache.get(key)) { view.form = chpassform; } else { error = t._("Invalid request"); } } if (chpassform.isValid()) { // change pass step = 4; if (chpassform.getValueOf("pass1") == chpassform.getValueOf("pass2")) { var uid = Std.parseInt(chpassform.getValueOf("uid")); var user = db.User.manager.get(uid, true); var pass = chpassform.getValueOf("pass1"); user.setPass(pass); user.update(); var m = new sugoi.mail.Mail(); m.setSender(App.config.get("default_email"), t._("Cagette.net")); m.setRecipient(user.email, user.name); if (user.email2 != null) m.setRecipient(user.email2, user.name); m.setSubject("[" + App.config.NAME + "] : " + t._("New password confirmed")); var emails = [user.email]; if (user.email2 != null) emails.push(user.email2); var params = { user: user, emails: emails.join(", "), password: pass, NAME: App.config.NAME } m.setHtmlBody(app.processTemplate('mail/newPasswordConfirmed.mtt', params)); App.sendMail(m); } else { error = t._("You must key-in two times the same password"); } } if (step == 1) { view.form = askmailform; } view.step = step; view.error = error; } /** * generate a custom key for transactionnal emails, valid during the current day */ // function getKey(m:db.User) { // return haxe.crypto.Md5.encode(App.config.get("key")+m.email+(Date.now().getDate())).substr(0,12); // } @logged @tpl("form.mtt") function doDefinePassword(?key:String, ?u:db.User) { if (app.user.isFullyRegistred()) throw Error("/", t._("You already have a password")); var form = new Form("definepass"); var pass1 = new StringInput("pass1", t._("Your new password")); var pass2 = new StringInput("pass2", t._("Again your new password")); pass1.password = true; pass2.password = true; form.addElement(pass1); form.addElement(pass2); if (form.isValid()) { if (form.getValueOf("pass1") == form.getValueOf("pass2")) { app.user.lock(); app.user.setPass(form.getValueOf("pass1")); app.user.update(); throw Ok('/', t._("Congratulations, your account is now protected by a password.")); } else { form.addError(t._("You must key-in two times the same password")); } } view.form = form; view.title = t._("Create a password for your account"); } /** * landing page when coming from an invitation * @param k */ public function doValidate(k:String) { var uid = Std.parseInt(sugoi.db.Cache.get("validation" + k)); if (uid == null || uid == 0) throw Error('/user/login', t._("Your invitation is invalid or expired ($k)")); var user = db.User.manager.get(uid, true); db.User.login(user, user.email); var groups = user.getAmaps(); if (groups.length > 0) app.session.data.amapId = groups.first().id; sugoi.db.Cache.destroy("validation" + k); throw Ok("/user/definePassword", t._("Congratulations ::userName::, your account is validated!", {userName: user.getName()})); } }