Example #1
0
    def make_form(self, html_class="settings_form"):
        """
        Create the FORM, and the DIVs with the input fields
        """
        if config.use_ssl:
            action = self.request.getScriptname() + self.request.getPathinfo()
            if config.wiki_farm:
                action = "%s%s" % (farm.getBaseFarmURL(
                                       self.request, force_ssl=config.use_ssl),
                                   wikiutil.quoteWikiname(
                                        config.page_user_preferences))
            else:
                action = '%s/%s' % (self.request.getQualifiedURL(
                                        self.request.getScriptname(),
                                        force_ssl=config.use_ssl),
                                    wikiutil.quoteWikiname(
                                        config.page_user_preferences))
        else:
            action = self.request.getScriptname() + self.request.getPathinfo()
        self._form = html.FORM(action=action)
        self._inner = html.DIV(html_class=html_class)

        # Use the user interface language and direction
        lang_attr = self.request.theme.ui_lang_attr()
        self._form.append(html.Raw("<div %s>" % lang_attr))

        self._form.append(html.INPUT(type="hidden", name="action",
                                     value="userform"))
        if self.from_wiki:
            self._form.append(html.INPUT(type="hidden", name="from_wiki",
                                       value=self.from_wiki))
        self._form.append(self._inner)
        self._form.append(html.Raw("</div>"))
Example #2
0
def send_validation_email(wikiname, request):
    if not config.mail_smarthost:
        msg = ("This wiki is not enabled for mail processing. "
               "Contact the owner of the wiki, who can enable email.")
    elif not request.isPOST():
        msg = "Use the interactive interface to change settings!"
    # check whether the user has an email address
    elif not request.user.email:
        msg = ("You didn't enter an email address in your profile. "
               "Select settings in the upper right corner and enter a "
               "valid email address.")
    else:
        code = _createCode(request)
        text = ("To create your wiki, %s, follow go to this URL: "
                "%s?action=new_wiki&wikiname=%s&code=%s . "
                "Note that this magic wiki-creating URL will expire in "
                "30 minutes." % (wikiname, farm.getBaseFarmURL(request),
                                 wikiname, code))
        mailok, msg = mail.sendmail(request, [request.user.email], 
                                    "Creating your wiki..", text,
                                    mail_from=config.mail_from)
        msg = ("An email with instructions has been sent to your email "
               "address, %s.  Check your mail!" % request.user.email)

    return msg
Example #3
0
    def html_head(self, d):
        """
        Assemble html head
        
        @param d: parameter dictionary
        @rtype: string
        @return: html head
        """
        dict = {
            'stylesheets_html': self.html_stylesheets(d),
        }
        dict.update(d)

        dict['theme_last_modified'] = self.last_modified
        dict['newtitle'] = None
        dict['newtitle'] = dict['title']
        if dict['title'] == 'Front Page':
            dict['newtitle'] = wikiutil.escape(self.request.config.catchphrase)
        
        dict['web_dir'] = config.web_dir

        if d['page'].hasMapPoints():
            dict['wiki_name'] = self.request.config.wiki_name
            if config.wiki_farm:
                dict['map_base'] = farm.getBaseFarmURL(self.request)
            else:
                dict['map_base'] = self.request.getBaseURL()
            dict['gmaps_api_key'] = (self.request.config.gmaps_api_key or
                                     config.gmaps_api_key)
            dict['map_html'] = (
                '<script type="text/javascript">'
                'var gmaps_src="http://maps.google.com/maps?file=api&v=2&'
                               'key=%(gmaps_api_key)s";'
                '</script>'
                '<script src="%(web_dir)s/wiki/gmap.js?tm=%(theme_last_modified)s" '
                        'type="text/javascript">'
                '</script>'
                '<script type="text/javascript">'
                'var map_url="%(map_base)s?action=gmaps&wiki=%(wiki_name)s";'
                'var point_count=1;</script>' % dict)
        else:
            dict['map_html']  = ''

        if dict['newtitle'] is self.request.config.catchphrase: 
            if self.request.config.catchphrase:
                html = ('<title>%(sitename)s - %(newtitle)s</title>\n'
                        '%(map_html)s\n'
                        '%(stylesheets_html)s\n' % dict)
            else:
                html = ('<title>%(sitename)s</title>\n'
                        '%(map_html)s\n'
                        '%(stylesheets_html)s\n' % dict)
        else:
            html = ('<title>%(newtitle)s - %(sitename)s</title>'
                    '%(map_html)s\n'
                    '%(stylesheets_html)s\n' % dict)

        return html
Example #4
0
def execute(macro, args, formatter=None):
    request = macro.request
    before_form, after_form = '', ''
    if args and len(args.split(',')) == 2:
        before_form, after_form = args.split(',')
    if not formatter:
        formatter = macro.formatter
    if not config.allow_web_based_wiki_creation:
        return ('<i>This wiki farm does not have web-based wiki creation '
                'enabled.</i>')
    if request.user.valid:
            d = {'form_action': formatter.page.url(),
                'wikiname_length': farm.WIKINAME_MAX_LENGTH,
                'create_wiki_button': 'send_email',
                'after_form': after_form,
                'before_form': before_form,
            }
            wiki_create_form = (
                '<form action="%(form_action)s" method="POST">\n'
                '<span class="wikiNameArea">'
                '<input type="hidden" name="action" value="new_wiki">\n'
                '%(before_form)s'
                '<input type="text" class="wikiname" name="wikiname" '
                       'size="15" value="shortname" '
                       'maxlength="%(wikiname_length)s" '
                       'onFocus="this.value=\'\';this.style.color=\'black\';return false;">\n'
                '<input type="hidden" name="%(create_wiki_button)s" '
                       'value="1">\n'
                '<span class="description">%(after_form)s</span>'
                '</span>'
                '<span class="submit"><input type="submit" value="Create wiki"></span>\n'
                '</form>\n' % d)
    else:
        new_user_link = ('%s%s?new_user=1' %
                         (farm.getBaseFarmURL(request),
                          wikiutil.quoteWikiname(
                              config.page_user_preferences)))
        wiki_create_form = ('You must be logged in to create a wiki!  '
                            'To create an account, go '
                            '<a href="%s">here</a>.' % new_user_link)
    return formatter.rawHTML('<span id="wikiCreateForm">%s</span>' %
                             wiki_create_form) 
Example #5
0
    def html_head(self, d):
        """
        Assemble html head
        
        @param d: parameter dictionary
        @rtype: string
        @return: html head
        """
        dict = {
            'stylesheets_html': self.html_stylesheets(d),
        }
        dict.update(d)

        dict['theme_last_modified'] = self.last_modified
        dict['newtitle'] = None
        dict['newtitle'] = dict['title']
        if dict['title'] == 'Front Page':
            dict['newtitle'] = wikiutil.escape(self.request.config.catchphrase)
        
        dict['web_dir'] = config.web_dir

        if d['page'].hasMapPoints():
            dict['wiki_name'] = self.request.config.wiki_name
            if config.wiki_farm:
                dict['map_base'] = farm.getBaseFarmURL(self.request)
            else:
                dict['map_base'] = self.request.getBaseURL()
            dict['gmaps_api_key'] = (self.request.config.gmaps_api_key or
                                     config.gmaps_api_key)
            dict['map_html'] = (
                '<script type="text/javascript">'
                'var gmaps_src="http://maps.google.com/maps?file=api&v=2&'
                               'key=%(gmaps_api_key)s";'
                '</script>'
                '<script src="%(web_dir)s/wiki/gmap.js?tm=%(theme_last_modified)s" '
                        'type="text/javascript">'
                '</script>'
                '<script type="text/javascript">'
                'var map_url="%(map_base)s?action=gmaps&wiki=%(wiki_name)s";'
                'var point_count=1;</script>' % dict)
        else:
            dict['map_html']  = ''

        dict['searchsuggest_html'] = ''
        dict['searchsuggest_html'] += '<script type="text/javascript" src="/wiki/jquery.js"></script>'
        dict['searchsuggest_html'] += '<script type="text/javascript" src="/wiki/jquery.qtip-1.0.0-rc3.min.js"></script>'

        if config.opensearch_suggest_url:
            dict['searchsuggest_html'] += '<script type="text/javascript" src="/wiki/suggest/dimensions.js"></script>'
            dict['searchsuggest_html'] += '<script type="text/javascript" src="/wiki/suggest/autocomplete.js"></script>'
            dict['stylesheets_html'] += '<link rel="stylesheet" type="text/css" charset="iso-8859-1" media="all" href="/wiki/suggest/autocomplete.css">\n'

        if dict['newtitle'] is self.request.config.catchphrase: 
            if self.request.config.catchphrase:
                html = ('<title>%(sitename)s - %(newtitle)s</title>\n'
                        '%(map_html)s\n'
                        '%(stylesheets_html)s\n' 
                        '%(searchsuggest_html)s\n' % dict)
            else:
                html = ('<title>%(sitename)s</title>\n'
                        '%(map_html)s\n'
                        '%(stylesheets_html)s\n'
                        '%(searchsuggest_html)s\n' % dict)
        else:
            html = ('<title>%(newtitle)s - %(sitename)s</title>'
                    '%(map_html)s\n'
                    '%(stylesheets_html)s\n'
                    '%(searchsuggest_html)s\n' % dict)

        return html
Example #6
0
    def username(self, d):
        """
        Assemble the username / userprefs link
        
        @param d: parameter dictionary
        @rtype: string
        @return: username html
        """
        _ = self.request.getText
        if self.request.user.valid:
            watch_wiki = ''
            if config.wiki_farm:
                if not self.request.user.isWatchingWiki(
                    self.request.config.wiki_name):
                    watch_wiki = ('| %s ' %
                        Page(d['page_name'],self.request).link_to(
                            know_status=True, know_status_exists=True,
                            text='watch this wiki',
                            querystr='action=watch_wiki&wikiname=%s' %
                                self.request.config.wiki_name))

            if config.wiki_farm:
                wiki_base_url = farm.getBaseFarmURL(self.request)
            else:
                wiki_base_url = '%s/' % self.request.getScriptname()

            if self.request.user.name in wikiacl.Group("Admin", self.request):
                wiki_settings_pagelink = \
                    Page(config.wiki_settings_page, self.request).link_to(
                            text=config.wiki_settings_page.lower())
                admin_settings = ('%s | ' % wiki_settings_pagelink)
            else:
                admin_settings = ''

            html = (
                '<div class="user_area">'
                '<div class="welcome">Welcome, %s</div>'
                '%s'
                '<div class="user_items">'
                '(%s<a href="%s%s?from_wiki=%s">settings</a> %s| '
                '<a href="%s/%s?action=userform&amp;logout=Logout">logout</a>)'
                '</div></div>' %
                (user.getUserLink(self.request, self.request.user),
                 self.userNotificationLink(self.request.user),
                 admin_settings, wiki_base_url,
                 wikiutil.quoteWikiname(config.page_user_preferences),
                 self.request.config.wiki_name, watch_wiki,
                 self.request.getScriptname(), d['q_page_name']))
        else:
            if config.wiki_farm:
                post_url = "%s%s" % (
                    farm.getBaseFarmURL(self.request,
                                        force_ssl=config.use_ssl),
                    wikiutil.quoteWikiname(config.page_user_preferences))
                our_wiki_url = '%s/%s' % (self.request.getBaseURL(),
                                          d['q_page_name'])
                base_wiki = farm.getBaseFarmURL(self.request)
                farm_params = (
                    '<input type="hidden" name="backto_wiki" value="%s">'
                    '<input type="hidden" name="backto_page" value="%s">'
                    '<input type="hidden" name="qs" value="%s">' %
                    (self.request.config.wiki_name,
                     urllib.quote(our_wiki_url),
                     urllib.quote(self.request.query_string)))
            else:
                farm_params = ''
                post_url = '%s/%s' % (
                    self.request.getQualifiedURL(self.request.getScriptname(),
                                                 force_ssl=config.use_ssl),
                    wikiutil.quoteWikiname(config.page_user_preferences))
                base_wiki = '%s/' % self.request.getScriptname()
            html = (
                '<form action="%s" method="POST" '
                      'onsubmit="if (!canSetCookies()) { alert(\'You need '
                                    'cookies enabled to log in.\'); '
                                    'return false;}">'
                '<input type="hidden" name="action" value="userform">'
                '<div class="login_area">'
                '<table>'
                '<tr><td width="50%%" align="right" nowrap>User name:</td>'
                '<td colspan="2" align="left" nowrap>'
                '<input class="formfields" size="22" name="username" '
                       'type="text"></td> </tr> <tr>'
                '<td align="right">Password:</td>'
                '<td colspan="2" align="left" nowrap> '
                '<input class="formfields" size="22" type="password" '
                       'name="password"> '
                '<input type="hidden" name="login" value="Login">%s'
                '</td></tr><tr><td></td>'
                '<td align="left" nowrap>'
                '(<a href="%s%s?new_user=1&amp;from_wiki=%s">new user</a>)'
                '</td><td align="right">'
                '<input type="submit" name="login" value="Login" alt="login">'
                '</td></tr></table></div></form>' %
                (post_url, farm_params, base_wiki,
                 wikiutil.quoteWikiname(config.page_user_preferences),
                 self.request.config.wiki_name))
            
        return html
Example #7
0
    def handleData(self, new_user=None):
        from Sycamore.Page import MAX_PAGENAME_LENGTH as MAX_USERNAME_LENGTH
        _ = self._
        form = self.request.form
        msg = ''
    
        isdisabled = False
        if form.get('disabled', [0])[0] == '1':
                isdisabled = True

        self.from_wiki = None
        if self.request.form.has_key('from_wiki'):
          self.from_wiki = self.request.form['from_wiki'][0].lower().strip()
          if not wikiutil.isInFarm(self.from_wiki, self.request):
            self.from_wiki = None

        new_user = int(form.get('new_user', [0])[0])
        # wiki farm authentication

        # we want them to be able to sign back in right after they
        # click the 'logout' GET link, hence this test
        is_form_logout = (form.has_key('qs') and 
                          urllib.unquote(form['qs'][0]) == 
                            'action=userform&logout=Logout')

        if (self.request.form.has_key('badlogin') and
            self.request.form['badlogin'][0]):
            _create_nologin_cookie(self.request)
            if config.wiki_farm:
                wiki_base_url = farm.getBaseFarmURL(self.request)
            else:
                wiki_base_url = '%s/' % self.request.getScriptname()
    
            return_string = ('Unknown username or wrong password.<br/><br/>'
                             'New user?  <a href="%s%s?new_user=1">Click here '
                             'to create an account!</a><br/><br/>'
                             'Forgot your password?  We\'ll email it to you.'
                             '<form action="%s" method="POST">'
                             '<input type="hidden" name="action" '
                                     'value="userform">'
                             'Email address: <input class="formfields" '
                                                    'type="text" name="email">'
                             '&nbsp;<input type="submit" class="formbutton" '
                                           'name="login_sendmail" '
                                           'value="Mail me my account data">'
                             '</form>' % (
                             wiki_base_url,
                             wikiutil.quoteWikiname(
                                config.page_user_preferences),
                             wiki_base_url))
            return return_string


        if (form.has_key('login_check') and form['login_check'][0] and
            form.has_key('backto_wiki') and form.has_key('backto_page')):
            backto_wiki = form['backto_wiki'][0]
            backto_page = form['backto_page'][0].encode(config.charset)
            if form.has_key('qs') and not is_form_logout:
                q_query_string = form['qs'][0]
            else:
                q_query_string = ''

            if self.request.user.valid:
                secret, stored_expire_time, session = \
                    self.request.user.cookie_dough
                if q_query_string:
                    url = ('%s?action=userform&backto_page=%s&qs=%s'
                           '&secret=%s&expire_time=%s&uid=%s&session=%s' % (
                            backto_page, urllib.quote(backto_page),
                            urllib.quote(q_query_string), urllib.quote(secret),
                            stored_expire_time, self.request.user.id,
                            urllib.quote(session)))
                else:
                     url = ('%s?action=userform&backto_page=%s&secret=%s'
                            '&expire_time=%s&uid=%s&session=%s' % (
                            backto_page, urllib.quote(backto_page),
                            urllib.quote(secret), stored_expire_time,
                            self.request.user.id, urllib.quote(session)))
            else:
                if q_query_string:
                    url = ('%s?action=userform&backto_page=%s&not_logged_in=1'
                           '&qs=%s' % (backto_page, urllib.quote(backto_page),
                                       urllib.quote(q_query_string)))
                else:
                     url = ('%s?action=userform&backto_page=%s&not_logged_in=1'
                            % (backto_page, urllib.quote(backto_page)))

            self.request.http_redirect(url) 
            return 

        # bounce-back wiki farm authentication
        if form.has_key('not_logged_in') and form.has_key('backto_page'):
            backto = urllib.unquote(form['backto_page'][0].encode(
                config.charset))
            if form.has_key('qs') and not is_form_logout:
                query_string = '?%s' % (urllib.unquote(form['qs'][0]
                                         ).encode(config.charset))
            else:
                query_string = ''
            url = '%s%s' % (backto, query_string)
            _create_nologin_cookie(self.request)
            self.request.http_redirect(url)
            return
        # bounce-back wiki farm authentication
        elif (form.has_key('uid') and form.has_key('secret') and
              form.has_key('session') and form.has_key('expire_time')):
            uid = form['uid'][0]
            secret = urllib.unquote(form['secret'][0])
            session = form['session'][0]
            expire_time = float(form['expire_time'][0])
            if form.has_key('backto_page'):
                backto_page = form['backto_page'][0]
            else:
                backto_page = '/' 
            if form.has_key('qs') and not is_form_logout:
                query_string = '?%s' % urllib.unquote(form['qs'][0])
            else:
                query_string = ''
            url = '%s%s' % (backto_page, query_string)
    
            self.request.http_redirect(url)
            self.request.user.sendCookie(self.request, expire=expire_time,
                                         sessionid=session, secret=secret,
                                         id=uid) 
            self.request.user.clearNologinCookie(self.request)
            return 

        if form.has_key('logout') or isdisabled:
            msg = ''
            if isdisabled:
                if not self.request.isPOST():
                    return "Use the interactive interface to change settings!"
                # disable the account
                self.request.user.disabled = 1
                # save user's profile
                self.request.user.save()
                msg = '<p>%s</p>' % _("Your account has been disabled.")

            # clear the cookie in the browser and locally
            try:
                cookie = Cookie.SimpleCookie(self.request.saved_cookie)
            except Cookie.CookieError:
                # ignore invalid cookies
                cookie = None
            else:
                if config.wiki_farm:
                    cookie_id = wikiutil.quoteCookiename(
                        config.wiki_base_domain + ',ID')
                else:
                    cookie_id = wikiutil.quoteCookiename(
                        config.sitename + ',ID')

                if cookie.has_key(cookie_id):
                    self.removeSession(cookie[cookie_id].value)
                    cookie_dir = config.web_dir
                    if not cookie_dir: cookie_dir = '/'
                    domain = wikiutil.getCookieDomain(self.request)
                    expirestr = time.strftime("%A, %d-%b-%Y %H:%M:%S GMT",
                                              time.gmtime(0))
                    self.request.setHttpHeader(('Set-Cookie',
                        ('%s="%s"; domain=%s; path=%s; '
                         'expires=%s' % (
                         (cookie_id, cookie[cookie_id].value,
                          domain, cookie_dir, expirestr)))))

            self.request.saved_cookie = ''
            self.request.auth_username = ''
            self.request.user = user.User(self.request)
            return msg + _("Cookie deleted. You are now logged out.")
    
        if form.has_key('login_sendmail'):
            if not self.request.isPOST():
                return "Use the interactive interface to change settings!"
            if not config.mail_smarthost:
                return _('This wiki is not enabled for mail processing. '
                        'Contact the owner of the wiki, who can either enable '
                        'email, or remove the "Subscribe" icon.')
            try:
                email = form['email'][0]
            except KeyError:
                return _("Please provide a valid email address!")
    
            text = ''
            uid = user.getUserIdByEmail(email, self.request)
            if uid:
                theuser = user.User(self.request, uid)
                if theuser.valid:
                    code = self.createCode(theuser.id)
                    sitename = farm.getBaseWikiFullName(self.request)
                    if config.wiki_farm:
                        url = farm.getBaseFarmURL(self.request)
                    else:
                        url = '%s/' % self.request.getBaseURL()
                    text = ("Go here to automatically log into %s: "
                            "%s%s?action=userform&uid=%s&code=%s\n"
                            "Once you're logged in, you should change your "
                            "password in your settings "
                            "(you forgot your password, right?).\n\n"
                            "(The link in this email is good for "
                            "one use only.)" % (
                            sitename, url,
                            wikiutil.quoteWikiname(
                                config.page_user_preferences),
                            theuser.id, code))

            if not text:
                return _("Found no account matching the given email address "
                         "'%(email)s'!") % {'email': email}


            mailok, msg = util.mail.sendmail(self.request, [email], 
                'Your wiki account data', text, mail_from=config.mail_from)
            return wikiutil.escape(msg)

        if form.has_key('login') or form.has_key('uid'):
            uid = None

            if form.has_key('code') and form.has_key('uid'):
               given_uid = form['uid'][0].strip()
               given_code = form['code'][0].strip()
        
               given_code
               if self.isValidCode(given_uid, given_code):
                  uid = given_uid

            if uid:
                # we were given account information so let's
                # create an account -> log them in
                theuser = user.User(self.request, id=uid)
                msg = _("You are now logged in!  "
                        "Please change your password below!")
                # send the cookie
                theuser.sendCookie(self.request)
                self.request.user = theuser
                return msg
            else:
                # we weren't given information, so let's see
                # if they gave us a login/password

                # try to get the user name
                try:
                    name = form['username'][0].replace('\t', ' ').strip()
                except KeyError:
                    name = ''

                # try to get the password
                password = form.get('password',[''])[0]

                # load the user data and check for validness
                if name:
                    theuser = user.User(self.request, name=name,
                                        password=password, is_login=True)
                else:
                    theuser = user.User(self.request, id=uid, name=name,
                                        password=password, is_login=True)

                if config.wiki_farm:
                    wiki_base_url = farm.getBaseFarmURL(self.request)
                else:
                    wiki_base_url = '%s/' % self.request.getScriptname()

                if not theuser.valid:
                    if (not self.request.form.has_key('backto_wiki') or not
                        self.request.form['backto_wiki'][0]):
                        return_string = ('Unknown username or wrong password.'
                                         '<br/><br/>New user?  '
                                         '<a href="%s%s?new_user=1">'
                                         'Click here to create an account!</a>'
                                         '<br/><br/>Forgot your password?  '
                                         'We\'ll email it to you.'
                                         '<form action="%s" method="POST">'
                                         '<input type="hidden" name="action" '
                                                 'value="userform">'
                                         'Email address: '
                                         '<input class="formfields" '
                                                 'type="text" name="email">'
                                         '&nbsp;'
                                         '<input type="submit" '
                                                 'class="formbutton" '
                                                 'name="login_sendmail" '
                                                 'value="Mail me my account '
                                                         'data">'
                                         '</form>' % (
                                         wiki_base_url,
                                         wikiutil.quoteWikiname(
                                            config.page_user_preferences),
                                         wiki_base_url))

                        return return_string
                    else:
                        self.request.http_redirect(
                            urllib.unquote(
                                self.request.form['backto_page'][0].encode(
                                    config.charset)) +
                            '?action=userform&badlogin=1')
                        return

            # send the cookie
            theuser.sendCookie(self.request)
            self.request.user = theuser
            send_back_home(self.request, msg="You are now logged in!")
        else:
            if not self.request.isPOST():
                return """Use the interactive interface to change settings!"""
            # save user's profile, first get user instance
            theuser = user.User(self.request)
    
            # try to get the name
            # if name is empty or missing, return an error msg
            if (form.has_key('username') and
                form['username'][0].replace('\t', '').strip()):
                theuser.propercased_name = \
                    form['username'][0].replace('\t', ' ').strip()
                theuser.name = theuser.propercased_name.lower()
            elif form.has_key('username'):
                raise BadData, (_("Please enter a user name!"), new_user)
    
            if (self.request.user.name and
                (self.request.user.name != theuser.name)):
              # they are still logged on and are trying to make a new account
              raise BadData, (_("Please log out before creating an account."),
                              new_user)
            if user.getUserId(theuser.name, self.request):
                if theuser.name != self.request.user.name:
                    raise BadData, (_("User name already exists!"), new_user)
                else:
                    new_user = False

            if form.has_key('save') and form['save'][0] == 'Change password':
                # change password setting 

                # try to get the password and pw repeat
                password = form.get('password', [''])[0]
                password2 = form.get('password2',[''])[0]

                # Check if password is given and matches with password repeat
                if password != password2:
                    raise BadData, (_("Passwords don't match!"), new_user)
                if not password and new_user:
                    raise BadData, (_("Please specify a password!"), new_user)
                if password:
                    theuser.enc_password = user.generate_hash(password)

                self._clear_all_sessions_except_current()

                msg = _("Password changed!")
            else:
                # process general settings

                # tr to get the email
                theuser.email = form.get('email', [''])[0]

                if theuser.email:
                    email_user_id = user.getUserIdByEmail(theuser.email,
                                                          self.request)
                else:
                    email_user_id = None
                if not theuser.email or not re.match(".+@.+\..{2,}",
                                                     theuser.email):
                    raise BadData, (_("Please provide your email address - "
                                      "without that you could not "
                                      "get your login data via email just in "
                                      "case you lose it."), new_user)
                elif email_user_id and email_user_id != theuser.id:
                    raise BadData, (_("Somebody else has already registered "
                                      "with the email address \"%s\", please "
                                      "pick something else." % theuser.email),
                                    new_user)
        
                # editor size
                theuser.edit_rows = util.web.getIntegerInput(self.request,
                    'edit_rows', theuser.edit_rows, 10, 60)
                theuser.edit_cols = util.web.getIntegerInput(self.request,
                    'edit_cols', theuser.edit_cols, 30, 100)
        
                # time zone
                tz = form.get('tz', theuser.tz)[0]
                if tz not in pytz.common_timezones:
                    tz = theuser.tz
                theuser.tz = tz
        
                wiki_for_userpage = form.get('wiki_for_userpage',
                                             [''])[0].lower()
                if (wiki_for_userpage and not
                    wikiutil.isInFarm(wiki_for_userpage, self.request)):
                    raise BadData, (_('"%s" is not the name of a wiki.' % (
                                      wiki_for_userpage)), new_user)
                if wiki_for_userpage != theuser.wiki_for_userpage:
                    # they have changed the wiki! time to do
                    # something differently
                    msg = _("<p>User preferences saved!</p>"
                            "<p><strong>Note:</strong> It may take a bit for "
                            "all links to your name to point to the "
                            "new wiki.</p>")
                    theuser.wiki_for_userpage = wiki_for_userpage

                # User CSS URL
                theuser.css_url = form.get('css_url', [''])[0]
        
                # try to get the (optional) preferred language
                #theuser.language = form.get('language', [''])[0]
    
                # checkbox options
                keys = []
                for key in user_checkbox_fields:
                    value = form.get(key, [0])[0]
                    try:
                        value = int(value)
                    except ValueError:
                        pass
                    setattr(theuser, key, value)
        
            if new_user:
                # strip spaces, we don't allow them anyway
                theuser.propercased_name = theuser.propercased_name.strip() 
                theuser.name = theuser.propercased_name.lower()
                if not theuser.name.strip():
                    raise BadData, (_("Please provide a user name!"), new_user)
                elif theuser.propercased_name.find(' ') != -1:
                    raise BadData, (_("Invalid username: spaces are not "
                                      "allowed in user names"), new_user)
                elif re.search('[%s]' % re.escape(USER_NOT_ALLOWED_CHARS),
                               theuser.propercased_name):
                    raise BadData, (_("Invalid username: the characters "
                                      "%s are not allowed in usernames." % (
                                      wikiutil.escape(
                                        USER_NOT_ALLOWED_CHARS))),
                                    new_user)
                # messes up subpages. 
                # '/' isn't allowed, so we just disallow this and we're cool.
                elif theuser.name == '..' or theuser.name == '.': 
                    raise BadData, (_("Invalid username: okay, seriously, "
                                      "that's a pretty lame name.  "
                                      "Pick something better!"), new_user)
                elif len(theuser.propercased_name) > MAX_USERNAME_LENGTH:
                    raise BadData, (_("Invalid username: a username can be "
                                      "at most %s characters long." % (
                                      MAX_USERNAME_LEGNTH)), new_user)
                elif (not theuser.email or not
                      re.match(".+@.+\..{2,}", theuser.email)):
                    raise BadData, (_("Please provide your email address - "
                                      "without that you could not get your " 
                                      "login data via email just in case you "
                                      "lose it."), new_user)
                name_exists = user.getUserId(theuser.name, self.request)
                if name_exists:
                    raise BadData, (_("This user name already belongs to "
                                      "somebody else."), new_user)
                email_exists = user.getUserIdByEmail(theuser.email,
                                                     self.request)
                if email_exists:
                    raise BadData, (_("This email already belongs to somebody "
                                      "else."), new_user)

                # try to get the password and pw repeat
                password = form.get('password', [''])[0]
                password2 = form.get('password2',[''])[0]

                # Check if password is given and matches with password repeat
                if password != password2:
                    raise BadData, (_("Passwords don't match!"), new_user)
                if not password and new_user:
                    raise BadData, (_("Please specify a password!"), new_user)
                if password:
                    theuser.enc_password = user.generate_hash(password)

                theuser.anonymous = False


            # save data and send cookie
            theuser.save(new_user=new_user)
            theuser.sendCookie(self.request)
            self.request.user = theuser
    

            from Sycamore.formatter.text_html import Formatter
            formatter = Formatter(self.request)

            if not new_user:
              if not msg:
                msg = _("User preferences saved!")
              if self.from_wiki:
                go_back_to_wiki = farm.link_to_wiki(self.from_wiki, formatter)
                msg = ('%s<br/><br/>Wanna go '
                       'back to %s?' % (msg, go_back_to_wiki))
            else:
              msg = _("Account created!  You are now logged in.")
              self.request.user.valid = 1
              if (self.from_wiki and self.from_wiki.lower() !=
                                     farm.getBaseWikiName()):
                go_back_to_wiki = farm.link_to_wiki(self.from_wiki, formatter)
                msg = ('%s<br/><br/>Head back over to %s and your new account '
                      'should work there!' % (msg, go_back_to_wiki))
            if _debug:
                msg = msg + util.dumpFormData(form)
            return msg
Example #8
0
def execute(pagename, request):
    from Sycamore.PageEditor import PageEditor
    _ = request.getText
    actname = __name__.split('.')[-1]
    page = Page(pagename, request)
    msg = None
    form = request.form
    wikiname = None
    
    if not config.wiki_farm or not config.allow_web_based_wiki_creation:
        return page.send_page(msg='You are not allowed to create new wikis.')
    if not request.user.valid:
        return page.send_page(msg='You must be logged in to create new wikis.')

    if do_email_auth:
        if request.form.has_key('send_email') and request.form['send_email'][0]:
            if (not request.form.has_key('wikiname') or not
                request.form['wikiname'][0]):
                return page.send_page(msg='Missing wiki name.')
            wikiname = request.form['wikiname'][0].lower()
            if not farm.isValidWikiName(wikiname):
                msg = ('Wiki creation failed because the wiki name "%s" is '
                       'invalid.  You may only use the numbers 0-9, the '
                       'letters a-z, and the dash "-" in a wiki name.' %
                       wikiname)
            elif wikiutil.isInFarm(wikiname, request):
                msg = 'Wiki "%s" already exists!' % wikiname 
            else:
                msg = send_validation_email(wikiname, request)
            return page.send_page(msg=msg)
        email_code = has_valid_email_link(request)
        if not email_code:
            return page.send_page(msg=("Invalid email link. "
                                       "To create a wiki you must follow the link send to your email account."))
        
    if form.has_key('wikiname') and form['wikiname'][0]:
        can_create_wiki = False
        wikiname = form['wikiname'][0].lower()
        if do_email_auth:
            if not config.captcha_support:
                can_create_wiki = True
            elif form.has_key('captcha_id') and form.has_key('captcha_code'):
                this_captcha = captcha.Captcha(page, id=form['captcha_id'][0])
                if this_captcha.check(form['captcha_code'][0]):
                    can_create_wiki = True
                else:
                    msg = ('Human verification was incorrect.  '
                           'Please try again!')
            else:
                if form.has_key('audio'):
                    type = 'wav'
                else:
                    type = 'png'
                captcha.send_captcha(page, wikiname, actname, email_code, type)
                return
        else:
            can_create_wiki = True

        if can_create_wiki:
            msg = farm.create_wiki(wikiname, request.user.name, request)
            if do_email_auth:
                _clearAuthCode(request, wikiname, email_code)
            if msg:
                # there was a problem
                return page.send_page(msg=msg)

            farm.add_wiki_to_watch(wikiname, request) 

            formatter = Formatter(request)
            wiki_location = farm.link_to_wiki(wikiname, formatter)
            msg = (
                'Wiki "%s" created successfully! '
                'Follow this link to get to your wiki:\n'
                '<p>\n'
                '%s\n'
                '</p>\n'
                '<p>\n'
                'The wiki was added to your list of watched wikis '
                '(change in '
                    '<a href="%sUser_Settings">your account settings</a>).\n'
                '</p>' %
                (wikiname, wiki_location, farm.getBaseFarmURL(request)))

    return page.send_page(msg=msg)