Mercurial > libervia-web
view src/browser/sat_browser/register.py @ 571:f0c8a4d51890
browser_side: print a warning when trying to access a non existing contact box:
This occurs when you receive updatePresence of a MUC occupant before
Libervia knows that this is a MUC. Actually you shouldn't receive presence
update for the occupant before the MUC widget is displayed, this means a
loss of information. One way to fix it is to modify (un)availableReceived
in sat.core.xmpp: check for the entity data "type" or make a disco request
if it doesn't exist, and an attribute to presenceUpdate to tell the
frontend if we have a MUC occupant or a roster contact.
author | souliane <souliane@mailoo.org> |
---|---|
date | Fri, 17 Oct 2014 10:42:10 +0200 |
parents | e588335b6aa8 |
children | a5019e62c3e9 |
line wrap: on
line source
#!/usr/bin/python # -*- coding: utf-8 -*- # Libervia: a Salut à Toi frontend # Copyright (C) 2011, 2012, 2013, 2014 Jérôme Poisson <goffi@goffi.org> # Copyright (C) 2011, 2012 Adrien Vigneron <adrienvigneron@mailoo.org> # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program 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 Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. #This page manage subscription and new account creation import pyjd # this is dummy in pyjs from sat.core.i18n import _ from pyjamas.ui.SimplePanel import SimplePanel from pyjamas.ui.VerticalPanel import VerticalPanel from pyjamas.ui.HorizontalPanel import HorizontalPanel from pyjamas.ui.TabPanel import TabPanel from pyjamas.ui.TabBar import TabBar from pyjamas.ui.PasswordTextBox import PasswordTextBox from pyjamas.ui.TextBox import TextBox from pyjamas.ui.FormPanel import FormPanel from pyjamas.ui.Button import Button from pyjamas.ui.Label import Label from pyjamas.ui.HTML import HTML from pyjamas.ui.PopupPanel import PopupPanel from pyjamas.ui.Image import Image from pyjamas.ui.Hidden import Hidden from pyjamas import Window from pyjamas.ui.KeyboardListener import KEY_ENTER from pyjamas.Timer import Timer import re from constants import Const as C class RegisterPanel(FormPanel): def __init__(self, callback): """ @param callback: method to call if login successful """ FormPanel.__init__(self) self.setSize('600px', '350px') self.callback = callback self.setMethod(FormPanel.METHOD_POST) main_panel = HorizontalPanel() main_panel.setStyleName('registerPanel_main') left_side = Image("media/libervia/register_left.png") main_panel.add(left_side) ##TabPanel## tab_bar = TabBar() tab_bar.setStyleName('registerPanel_tabs') self.right_side = TabPanel(tab_bar) self.right_side.setStyleName('registerPanel_right_side') main_panel.add(self.right_side) main_panel.setCellWidth(self.right_side, '100%') ##Login tab## login_tab = SimplePanel() login_tab.setStyleName('registerPanel_content') login_vpanel = VerticalPanel() login_tab.setWidget(login_vpanel) self.login_warning_msg = Label('') self.login_warning_msg.setVisible(False) self.login_warning_msg.setStyleName('formWarning') login_vpanel.add(self.login_warning_msg) login_label = Label('Login:') self.login_box = TextBox() self.login_box.setName("login") self.login_box.addKeyboardListener(self) login_pass_label = Label('Password:') self.login_pass_box = PasswordTextBox() self.login_pass_box.setName("login_password") self.login_pass_box.addKeyboardListener(self) login_vpanel.add(login_label) login_vpanel.add(self.login_box) login_vpanel.add(login_pass_label) login_vpanel.add(self.login_pass_box) login_but = Button("Log in", getattr(self, "onLogin")) login_but.setStyleName('button') login_but.addStyleName('red') login_vpanel.add(login_but) #The hidden submit_type field self.submit_type = Hidden('submit_type') login_vpanel.add(self.submit_type) ##Register tab## register_tab = SimplePanel() register_tab.setStyleName('registerPanel_content') register_vpanel = VerticalPanel() register_tab.setWidget(register_vpanel) self.register_warning_msg = HTML('') self.register_warning_msg.setVisible(False) self.register_warning_msg.setStyleName('formWarning') register_vpanel.add(self.register_warning_msg) register_login_label = Label('Login:') self.register_login_box = TextBox() self.register_login_box.setName("register_login") self.register_login_box.addKeyboardListener(self) email_label = Label('E-mail:') self.email_box = TextBox() self.email_box.setName("email") self.email_box.addKeyboardListener(self) register_pass_label = Label('Password:') self.register_pass_box = PasswordTextBox() self.register_pass_box.setName("register_password") self.register_pass_box.addKeyboardListener(self) register_vpanel.add(register_login_label) register_vpanel.add(self.register_login_box) register_vpanel.add(email_label) register_vpanel.add(self.email_box) register_vpanel.add(register_pass_label) register_vpanel.add(self.register_pass_box) register_but = Button("Register", getattr(self, "onRegister")) register_but.setStyleName('button') register_but.addStyleName('red') register_vpanel.add(register_but) self.right_side.add(login_tab, 'Login') self.right_side.add(register_tab, 'Register') self.right_side.addTabListener(self) self.right_side.selectTab(1) login_tab.setWidth(None) register_tab.setWidth(None) self.add(main_panel) self.addFormHandler(self) self.setAction('register_api/login') def onBeforeTabSelected(self, sender, tabIndex): return True def onTabSelected(self, sender, tabIndex): if tabIndex == 0: self.login_box.setFocus(True) elif tabIndex == 1: self.register_login_box.setFocus(True) def onKeyPress(self, sender, keycode, modifiers): if keycode == KEY_ENTER: # Browsers offer an auto-completion feature to any # text box, but the selected value is not set when # the widget looses the focus. Using a timer with # any delay value > 0 would do the trick. if sender == self.login_box: Timer(5, lambda timer: self.login_pass_box.setFocus(True)) elif sender == self.login_pass_box: self.onLogin(None) elif sender == self.register_login_box: Timer(5, lambda timer: self.email_box.setFocus(True)) elif sender == self.email_box: Timer(5, lambda timer: self.register_pass_box.setFocus(True)) elif sender == self.register_pass_box: self.onRegister(None) def onKeyUp(self, sender, keycode, modifiers): pass def onKeyDown(self, sender, keycode, modifiers): pass def onLogin(self, button): if not re.match(r'^[a-z0-9_-]+$', self.login_box.getText(), re.IGNORECASE): self.login_warning_msg.setText('Invalid login, valid characters are a-z A-Z 0-9 _ -') self.login_warning_msg.setVisible(True) else: self.submit_type.setValue('login') self.submit() def onRegister(self, button): # XXX: for now libervia forces the creation to lower case self.register_login_box.setText(self.register_login_box.getText().lower()) if not re.match(r'^[a-z0-9_-]+$', self.register_login_box.getText(), re.IGNORECASE): self.register_warning_msg.setHTML(_('Invalid login, valid characters<br>are a-z A-Z 0-9 _ -')) self.register_warning_msg.setVisible(True) elif not re.match(r'^.+@.+\..+', self.email_box.getText(), re.IGNORECASE): self.register_warning_msg.setHTML(_('Invalid email address')) self.register_warning_msg.setVisible(True) elif len(self.register_pass_box.getText()) < C.PASSWORD_MIN_LENGTH: self.register_warning_msg.setHTML(_('Your password must contain<br>at least %d characters') % C.PASSWORD_MIN_LENGTH) self.register_warning_msg.setVisible(True) else: self.register_warning_msg.setVisible(False) self.submit_type.setValue('register') self.submit() def onSubmit(self, event): pass def onSubmitComplete(self, event): result = event.getResults() if result == C.PROFILE_AUTH_ERROR: Window.alert(_('Your login and/or password is incorrect. Please try again')) elif result == C.XMPP_AUTH_ERROR: # TODO: call stdui action CHANGE_XMPP_PASSWD_ID as it's done in primitivus Window.alert(_(u'Your SàT profile has been authenticated but the associated XMPP account failed to connect. Please use another SàT frontend to set another XMPP password.')) elif result == C.PROFILE_LOGGED: self.callback() elif result == C.SESSION_ACTIVE: Window.alert(_('Session already active, this should not happen, please contact the author to fix it')) elif result == C.NO_REPLY: Window.alert(_("Did not receive a reply (the timeout expired or the connection is broken)")) elif result == C.ALREADY_EXISTS: self.register_warning_msg.setHTML(_('This login already exists,<br>please choose another one')) self.register_warning_msg.setVisible(True) elif result == C.INTERNAL_ERROR: self.register_warning_msg.setHTML(_('SERVER ERROR: something went wrong during registration process, please contact the server administrator')) self.register_warning_msg.setVisible(True) elif result == C.REGISTRATION_SUCCEED: self.login_warning_msg.setVisible(False) self.register_warning_msg.setVisible(False) self.login_box.setText(self.register_login_box.getText()) self.login_pass_box.setText('') self.register_login_box.setText('') self.register_pass_box.setText('') self.email_box.setText('') self.right_side.selectTab(0) self.login_pass_box.setFocus(True) Window.alert(_('An email has been sent to you with your login informations\nPlease remember that this is ONLY A TECHNICAL DEMO')) else: Window.alert(_('Submit error: %s' % result)) class RegisterBox(PopupPanel): def __init__(self, callback, *args, **kwargs): PopupPanel.__init__(self, *args, **kwargs) self._form = RegisterPanel(callback) self.setWidget(self._form) def onWindowResized(self, width, height): super(RegisterBox, self).onWindowResized(width, height) self.centerBox() def show(self): super(RegisterBox, self).show() self.centerBox() self._form.login_box.setFocus(True)