diff --git a/modules/installed/services/templates/xmpp_configure.html b/modules/installed/services/templates/xmpp_configure.html new file mode 100644 index 000000000..fe37b5440 --- /dev/null +++ b/modules/installed/services/templates/xmpp_configure.html @@ -0,0 +1,19 @@ +{% extends "login_nav.html" %} +{% load bootstrap %} + +{% block main_block %} + + {% for severity, message in messages %} +
XMPP Server Accounts and Configuration
" @@ -45,58 +47,60 @@ class xmpp(PagePlugin): return util.render_template(title="XMPP Server", main=main, sidebar_right=sidebar_right) -class configure(FormPlugin, PagePlugin): - url = ["/services/xmpp/configure"] + +class ConfigureForm(forms.Form): # pylint: disable-msg=W0232 + """Configuration form""" + inband_enabled = forms.BooleanField( + label=_('Allow In-Band Registration'), required=False, + help_text=_('When enabled, anyone who can reach this server will be \ +allowed to register an account through an XMPP client')) + + # XXX: Only present due to issue with submitting empty form + dummy = forms.CharField(label='Dummy', initial='dummy', + widget=forms.HiddenInput()) + + +class Configure(PagePlugin): + """Configuration page""" + + def __init__(self, *args, **kwargs): + PagePlugin.__init__(self, *args, **kwargs) + self.register_page("services.xmpp.configure") + + @cherrypy.expose + @require() + def index(self, **kwargs): + """Serve the configuration form""" + status = self.get_status() + + form = None + messages = [] + + if kwargs: + form = ConfigureForm(kwargs, prefix='xmpp') + # pylint: disable-msg=E1101 + if form.is_valid(): + self._apply_changes(status, form.cleaned_data, messages) + status = self.get_status() + form = ConfigureForm(initial=status, prefix='xmpp') + else: + form = ConfigureForm(initial=status, prefix='xmpp') + + sidebar_right = util.render_template(template='menu_block', + menu=SIDE_MENU) + return util.render_template(template='xmpp_configure', + title=_('Configure XMPP Server'), + form=form, messages=messages, + sidebar_right=sidebar_right) @staticmethod - def sidebar_right(**kwargs): - """Return rendered string for sidebar on the right""" - del kwargs # Unused - - return util.render_template(template='menu_block', menu=SIDE_MENU) - - def main(self, xmpp_inband_enable=False, message=None, *args, **kwargs): - output, error = actions.superuser_run("xmpp-setup", 'status') + def get_status(): + """Return the current status""" + output, error = actions.run('xmpp-setup', 'status') if error: - raise Exception("something is wrong: " + error) - if "inband_enable" in output.split(): - xmpp_inband_enable = True + raise Exception('Error getting status: %s' % error) - form = Form(title="Configure XMPP Server", - action=cfg.server_dir + "/services/xmpp/configure/index", - name="configure_xmpp_form", - message=message) - form.checkbox(_("Allow In-Band Registration"), name="xmpp_inband_enable", - id="xmpp_inband_enable", checked=xmpp_inband_enable) - # hidden field is needed because checkbox doesn't post if not checked - form.hidden(name="submitted", value="True") - form.html(_("When enabled, anyone who can reach this server will be allowed to register an account through an XMPP client.
")) - form.submit(_("Update setup")) - return form.render() - - def process_form(self, **kwargs): - checkedinfo = { - 'inband_enable' : False, - } - - opts = [] - for k in kwargs.keys(): - if 'on' == kwargs[k]: - shortk = k.split("xmpp_").pop() - checkedinfo[shortk] = True - - for key in checkedinfo.keys(): - if checkedinfo[key]: - opts.append(key) - else: - opts.append('no'+key) - actions.run("xmpp-setup", opts) - - return '' - - -class register(FormPlugin, PagePlugin): - url = ["/services/xmpp/register"] + return {'inband_enabled': 'inband_enable' in output.split()} @staticmethod def sidebar_right(**kwargs): @@ -105,36 +109,81 @@ class register(FormPlugin, PagePlugin): return util.render_template(template='menu_block', menu=SIDE_MENU) - def main(self, username='', message=None, *args, **kwargs): - form = Form(title="Register XMPP Account", - action=cfg.server_dir + "/services/xmpp/register/index", - name="register_xmpp_form", - message=message) - form.text_input(_("Username"), name="username", value=username) - form.text_input(_("Password"), name="password", type="password") - form.submit(label=_("Register XMPP Account"), name="register") - return form.render() + @staticmethod + def _apply_changes(old_status, new_status, messages): + """Apply the form changes""" + cfg.log.info('Status - %s, %s' % (old_status, new_status)) - def process_form(self, username=None, password=None, **kwargs): - msg = util.Message() + if old_status['inband_enabled'] == new_status['inband_enabled']: + messages.append(('info', _('Setting unchanged'))) + return - if not username: - msg.add(_("Must specify a username!")) + if new_status['inband_enabled']: + messages.append(('success', _('Inband registration enabled'))) + option = 'inband_enable' + else: + messages.append(('success', _('Inband registration disabled'))) + option = 'noinband_enable' - if not password: - msg.add(_("Must specify a password!")) + cfg.log.info('Option - %s' % option) - if username and password: - output, error = actions.superuser_run( - "xmpp-register", [username, password]) - if error: - raise Exception("something is wrong: " + error) + _output, error = actions.superuser_run('xmpp-setup', [option]) + del _output + if error: + raise Exception('Error running command - %s' % error) - if "successfully registered" in output: - msg.add(_("Registered account for %s." % username)) - else: - msg.add(_("Failed to register account for %s: %s" % (username, output))) - cfg.log(msg.text) +class RegisterForm(forms.Form): # pylint: disable-msg=W0232 + """Configuration form""" + username = forms.CharField(label=_('Username')) - return msg.text + password = forms.CharField( + label=_('Password'), widget=forms.PasswordInput()) + + +class Register(PagePlugin): + """User registration page""" + + def __init__(self, *args, **kwargs): + PagePlugin.__init__(self, *args, **kwargs) + self.register_page('services.xmpp.register') + + @cherrypy.expose + @require() + def index(self, **kwargs): + """Serve the registration form""" + form = None + messages = [] + + if kwargs: + form = RegisterForm(kwargs, prefix='xmpp') + # pylint: disable-msg=E1101 + if form.is_valid(): + self._register_user(form.cleaned_data, messages) + form = RegisterForm(prefix='xmpp') + else: + form = RegisterForm(prefix='xmpp') + + sidebar_right = util.render_template(template='menu_block', + menu=SIDE_MENU) + return util.render_template(template='xmpp_register', + title=_('Register XMPP Account'), + form=form, messages=messages, + sidebar_right=sidebar_right) + + @staticmethod + def _register_user(data, messages): + """Register a new XMPP user""" + output, error = actions.superuser_run( + 'xmpp-register', [data['username'], data['password']]) + if error: + raise Exception('Error registering user - %s' % error) + + if 'successfully registered' in output: + messages.append(('success', + _('Registered account for %s' % + data['username']))) + else: + messages.append(('error', + _('Failed to register account for %s: %s') % + (data['username'], output)))