def get_data(request): _ = request.getText data = {} users = user.getUserList(request) for userID in users: current_user = user.User(request, userID) if current_user.language == u'': # User is using <Browser setting>, attempting to look up if we've managed to store the real language... try: data[current_user.real_language] = data.get( current_user.real_language, 0) + 1 except AttributeError: # Couldn't find the used language at all... data[u''] = data.get(u'', 0) + 1 else: data[current_user.language] = data.get(current_user.language, 0) + 1 if u'' in data: data[u'browser'] = data.pop( u'') # In case we have users whose languages aren't detectable. data = [(cnt, current_user_language) for current_user_language, cnt in data.items()] data.sort() data.reverse() return data
def mainloop(self): argc = len(self.args) self.init_request() request = self.request if self.options.py_append_file: def logs(request): """ generator for log objects """ # global edit-log yield editlog.EditLog(request) # local edit-log of every page for pn in request.rootpage.getPageList(exists=False): yield editlog.EditLog(request, rootpagename=pn) def uids(log): """ generator for userids found in a log """ for line in log: uid = line.userid if uid: yield uid fn = self.options.py_append_file editlog_uids = set() for log in logs(request): editlog_uids |= set(uids(log)) with open(fn, "a") as f: for uid in editlog_uids: u = User(request, uid) code = u'editlog_uids.add(%r) # %r %r %r\n' % ( uid, u.name, u.email, u.jid) f.write(code.encode('utf-8')) elif self.options.py_exec_file: def check_interactive(u): if self.options.interactive: prompt = "%s %r %r %r disabled=%r (y/N)? " % (u.id, u.name, u.email, u.jid, u.disabled) return raw_input(prompt).strip() in ['y', 'Y', ] else: return True fn = self.options.py_exec_file locs = dict(editlog_uids=set()) execfile(fn, {}, locs) editlog_uids = locs.get('editlog_uids') profile_uids = set(getUserList(request)) inactive_uids = profile_uids - editlog_uids for uid in inactive_uids: u = User(request, uid) if self.options.show: print "%s\t%r\t%r\t%r" % (uid, u.name, u.email, u.disabled) if self.options.disable: if check_interactive(u): u.disabled = 1 u.save() elif self.options.remove: if check_interactive(u): u.remove()
def request(self, request, user_obj, **kw): u = None changed = False env = request.environ if env.get('SSL_CLIENT_VERIFY', 'FAILURE') == 'SUCCESS': # check authority list if given if self.authorities and env.get('SSL_CLIENT_I_DN_OU') in self.authorities: return user_obj, True email_lower = None if self.email_key: email = env.get('SSL_CLIENT_S_DN_Email', '').decode(config.charset) email_lower = email.lower() commonname_lower = None if self.name_key: commonname = env.get('SSL_CLIENT_S_DN_CN', '').decode(config.charset) commonname_lower = commonname.lower() if email_lower or commonname_lower: for uid in user.getUserList(request): u = user.User(request, uid, auth_method=self.name, auth_attribs=()) if self.email_key and email_lower and u.email.lower() == email_lower: u.auth_attribs = ('email', 'password') if self.use_name and commonname_lower != u.name.lower(): u.name = commonname changed = True u.auth_attribs = ('email', 'name', 'password') break if self.name_key and commonname_lower and u.name.lower() == commonname_lower: u.auth_attribs = ('name', 'password') if self.use_email and email_lower != u.email.lower(): u.email = email changed = True u.auth_attribs = ('name', 'email', 'password') break else: u = None if u is None: # user wasn't found, so let's create a new user object u = user.User(request, name=commonname_lower, auth_username=commonname_lower, auth_method=self.name) u.auth_attribs = ('name', 'password') if self.use_email: u.email = email u.auth_attribs = ('name', 'email', 'password') elif user_obj and user_obj.auth_method == self.name: user_obj.valid = False return user_obj, False if u and self.autocreate: u.create_or_update(changed) if u and u.valid: return u, True else: return user_obj, True
def sslclientcert(request, **kw): """ authenticate via SSL client certificate """ from MoinMoin.request import RequestTwisted user_obj = kw.get('user_obj') u = None changed = False # check if we are running Twisted if isinstance(request, RequestTwisted): return user_obj, True # not supported if we run twisted # Addendum: this seems to need quite some twisted insight and coding. # A pointer i got on #twisted: divmod's vertex.sslverify # If you really need this, feel free to implement and test it and # submit a patch if it works. else: env = request.env if env.get('SSL_CLIENT_VERIFY', 'FAILURE') == 'SUCCESS': # if we only want to accept some specific CA, do a check like: # if env.get('SSL_CLIENT_I_DN_OU') == "http://www.cacert.org" email = env.get('SSL_CLIENT_S_DN_Email', '').decode(config.charset) email_lower = email.lower() commonname = env.get('SSL_CLIENT_S_DN_CN', '').decode(config.charset) commonname_lower = commonname.lower() if email_lower or commonname_lower: for uid in user.getUserList(request): u = user.User(request, uid, auth_method='sslclientcert', auth_attribs=()) if email_lower and u.email.lower() == email_lower: u.auth_attribs = ('email', 'password') #this is only useful if same name should be used, as #commonname is likely no CamelCase WikiName #if commonname_lower != u.name.lower(): # u.name = commonname # changed = True #u.auth_attribs = ('email', 'name', 'password') break if commonname_lower and u.name.lower() == commonname_lower: u.auth_attribs = ('name', 'password') #this is only useful if same email should be used as #specified in certificate. #if email_lower != u.email.lower(): # u.email = email # changed = True #u.auth_attribs = ('name', 'email', 'password') break else: u = None if u is None: # user wasn't found, so let's create a new user object u = user.User(request, name=commonname_lower, auth_username=commonname_lower) if u: u.create_or_update(changed) if u and u.valid: return u, True else: return user_obj, True
def mainloop(self): # we don't expect non-option arguments self.init_request() request = self.request # Checks for a template page and sets homepage_default_text if self.options.template_page and Page( self.request, self.options.template_page).exists(): homepage_default_text = Page( self.request, self.options.template_page).get_raw_body() # replace is needed because substitution is done for request.user # see option --user homepage_default_text = homepage_default_text.replace( '@ME@', "%(username)s") homepage_default_text = homepage_default_text.replace( '@EMAIL@', "<<MailTo(%(obfuscated_mail)s)>>") else: homepage_default_text = '''#acl %(username)s:read,write,delete,revert Default == %(username)s == Email: <<MailTo(%(obfuscated_mail)s)>> ## You can even more obfuscate your email address by adding more uppercase letters followed by a leading and trailing blank. ---- CategoryHomepage ''' # Check for user if self.options.homepage_creator: uid = user.getUserId(request, self.options.homepage_creator) request.user = user.User(request, uid) # Check for Group definition members = [] if self.options.user_homepage: members = [ self.options.user_homepage, ] elif self.options.name_of_group_page: members = request.groups.get(self.options.name_of_group_page, []) elif self.options.all_users: uids = user.getUserList(request) members = [user.User(request, uid).name for uid in uids] if not members: print "No user selected!" return # loop through members for creating homepages for name in members: uid = user.getUserId(request, name) account = user.User(request, uid) homepage_text = homepage_default_text % { "username": account.name, "obfuscated_mail": encodeSpamSafeEmail(account.email) } self.write_homepage(account, homepage_text)
def _list_user(request): user_list = [] for uid in user.getUserList(request): # email, disabled, name, id, u = user.User(request, uid) if u.disabled: continue # groups_with_member user_list.append({ "login": u.name, "email": u.email }) _send_json(request, user_list)
def mainloop(self): # we don't expect non-option arguments self.init_request() request = self.request # Checks for a template page and sets homepage_default_text if self.options.template_page and Page(self.request, self.options.template_page).exists(): homepage_default_text = Page(self.request, self.options.template_page).get_raw_body() # replace is needed because substitution is done for request.user # see option --user homepage_default_text = homepage_default_text.replace('@ME@', "%(username)s") homepage_default_text = homepage_default_text.replace('@EMAIL@', "<<MailTo(%(obfuscated_mail)s)>>") else: homepage_default_text = '''#acl %(username)s:read,write,delete,revert Default #format wiki == %(username)s == Email: <<MailTo(%(obfuscated_mail)s)>> ## You can even more obfuscate your email address by adding more uppercase letters followed by a leading and trailing blank. ---- CategoryHomepage ''' # Check for user if self.options.homepage_creator: uid = user.getUserId(request, self.options.homepage_creator) request.user = user.User(request, uid) # Check for Group definition members = [] if self.options.user_homepage: members = [self.options.user_homepage, ] elif self.options.name_of_group_page: members = request.groups.get(self.options.name_of_group_page, []) elif self.options.all_users: uids = user.getUserList(request) members = [user.User(request, uid).name for uid in uids] if not members: print "No user selected!" return # loop through members for creating homepages for name in members: uid = user.getUserId(request, name) account = user.User(request, uid) homepage_text = homepage_default_text % { "username": account.name, "obfuscated_mail": encodeSpamSafeEmail(account.email) } self.write_homepage(account, homepage_text)
def subscribe_users(request, subscribe, unsubscribe, pagename, formatter): _ = request.getText if not Page(request, pagename).exists(): return u"Page does not exist." result = [] did_match = {} # get user object - only with IDs! for userid in user.getUserList(request): userobj = user.User(request, userid) name = userobj.name matched = subscribed = False for name_re in unsubscribe: if re.match(name_re, name, re.U): matched = did_match[name_re] = True if (not userobj.isSubscribedTo([pagename]) or userobj.unsubscribe(pagename)): subscribed = False break for name_re in subscribe: if re.match(name_re, name, re.U): matched = did_match[name_re] = True if (userobj.isSubscribedTo([pagename]) or (userobj.email or userobj.jid) and userobj.subscribe(pagename)): subscribed = True break if matched: result.extend([formatter.smiley(subscribed and '{*}' or '{o}'), formatter.text(" "), formatter.url(1, Page(request, name).url(request)), formatter.text(name), formatter.url(0), formatter.linebreak(preformatted=0), ]) result.extend([''.join([formatter.smiley('{X}'), formatter.text(" " + _("Not a user:"******" " + name_re), formatter.linebreak(preformatted=0)]) for name_re in subscribe + unsubscribe if name_re not in did_match]) return ''.join(result)
def handle_user_created(event): """Handles an event sent when a new user is being created""" request = event.request sitename = request.cfg.sitename event_name = event.name email = event.user.email or u"NOT SET" username = event.user.name user_ids = getUserList(request) for id in user_ids: usr = User(request, id=id) # Currently send this only to super users if usr.isSuperUser() and usr.jid and event_name in usr.jabber_subscribed_events: _ = lambda text: request.getText(text, lang=usr.language or "en") msg = notification.user_created_message(request, _, sitename, username, email) data = {"action": "user_created", "subject": msg["subject"], "text": msg["text"], "url_list": []} send_notification(request, [usr.jid], data)
def mainloop(self): self.init_request() request = self.request # clean page scope cache entries keys = [ 'text_html', 'pagelinks', 'hitcounts', ] pages = request.rootpage.getPageList(user='') for pagename in pages: arena = Page(request, pagename) for key in keys: caching.CacheEntry(request, arena, key, scope='item').remove() # clean wiki scope cache entries arena_key_list = [ ('charts', 'hitcounts'), ('charts', 'pagehits'), ('charts', 'useragents'), ] for arena, key in arena_key_list: caching.CacheEntry(request, arena, key, scope='wiki').remove() # clean dict and groups related cache arena_scope_list = [ ('pagedicts', 'wiki'), ('pagegroups', 'wiki'), ('users', 'userdir'), ] for arena, scope in arena_scope_list: for key in caching.get_cache_list(request, arena, scope): caching.CacheEntry(request, arena, key, scope=scope).remove() # clean drafts of users uids = user.getUserList(request) for key in uids: caching.CacheEntry(request, 'drafts', key, scope='wiki').remove() # clean language cache files caching.CacheEntry(request, 'i18n', 'meta', scope='wiki').remove() wiki_languages = i18n.wikiLanguages().keys() for key in wiki_languages: caching.CacheEntry(request, 'i18n', key, scope='wiki').remove()
def handle_user_created(event): """Sends an email to super users that have subscribed to this event type""" request = event.request sitename = request.cfg.sitename from_address = request.cfg.mail_from event_name = event.name email = event.user.email or u"NOT SET" username = event.user.name user_ids = getUserList(request) for usr_id in user_ids: usr = User(request, id=usr_id) # Currently send this only to super users if usr.isSuperUser() and event_name in usr.email_subscribed_events: _ = lambda text: request.getText(text, lang=usr.language or 'en') data = notification.user_created_message(request, _, sitename, username, email) send_notification(request, from_address, [usr.email], data)
def _user_select(self): options = [] users = user.getUserList(self.request) current_uid = self.request.user.id for uid in users: if uid != current_uid: name = user.User(self.request, id=uid).name options.append((uid, name)) options.sort(lambda x, y: cmp(x[1].lower(), y[1].lower())) if not options: _ = self._ self._only = True return _("You are the only user.") self._only = False size = min(10, len(options)) return util.web.makeSelection("selected_user", options, current_uid, size=size)
def do_user_browser(request): """ Browser for SystemAdmin macro. """ from MoinMoin.util.dataset import TupleDataset, Column from MoinMoin.Page import Page _ = request.getText data = TupleDataset() data.columns = [ #Column('id', label=('ID'), align='right'), Column('name', label=('Username')), Column('email', label=('Email')), #Column('action', label=_('Action')), ] # Iterate over users for uid in user.getUserList(request): account = user.User(request, uid) userhomepage = Page(request, account.name) if userhomepage.exists(): namelink = userhomepage.link_to(request) else: namelink = account.name data.addRow(( #request.formatter.code(1) + uid + request.formatter.code(0), request.formatter.rawHTML(namelink), (request.formatter.url(1, 'mailto:' + account.email, 'external', pretty_url=1, unescaped=1) + request.formatter.text(account.email) + request.formatter.url(0)), #'', )) if data: from MoinMoin.widget.browser import DataBrowserWidget browser = DataBrowserWidget(request) browser.setData(data) return browser.toHTML() # No data return ''
def get_data(request): _ = request.getText data = {} users = user.getUserList(request) for userID in users: current_user = user.User(request, userID) if current_user.language == u'': # User is using <Browser setting>, attempting to look up if we've managed to store the real language... try: data[current_user.real_language] = data.get(current_user.real_language, 0) + 1 except AttributeError: # Couldn't find the used language at all... data[u''] = data.get(u'', 0) + 1 else: data[current_user.language] = data.get(current_user.language, 0) + 1 if u'' in data: data[u'browser'] = data.pop(u'') # In case we have users whose languages aren't detectable. data = [(cnt, current_user_language) for current_user_language, cnt in data.items()] data.sort() data.reverse() return data
def _user_select(self): options = [] users = user.getUserList(self.request) current_uid = self.request.user.id for uid in users: if uid != current_uid: name = user.User(self.request, id=uid).name options.append((uid, name)) options.sort(lambda x, y: cmp(x[1].lower(), y[1].lower())) if not options: _ = self._ self._only = True return _("You are the only user.") self._only = False size = min(10, len(options)) return util.web.makeSelection('selected_user', options, current_uid, size=size)
def mainloop(self): self.init_request() request = self.request # clean page scope cache entries keys = ['text_html', 'pagelinks', 'hitcounts', ] pages = request.rootpage.getPageList(user='') for pagename in pages: arena = Page(request, pagename) for key in keys: caching.CacheEntry(request, arena, key, scope='item').remove() # clean wiki scope cache entries arena_key_list = [ ('charts', 'hitcounts'), ('charts', 'pagehits'), ('charts', 'useragents'), ('user', 'name2id'), ] for arena, key in arena_key_list: caching.CacheEntry(request, arena, key, scope='wiki').remove() # clean dict and groups related cache arena_scope_list = [('pagedicts', 'wiki'), ('pagegroups', 'wiki'), ] for arena, scope in arena_scope_list: for key in caching.get_cache_list(request, arena, scope): caching.CacheEntry(request, arena, key, scope=scope).remove() # clean drafts of users uids = user.getUserList(request) for key in uids: caching.CacheEntry(request, 'drafts', key, scope='wiki').remove() # clean language cache files caching.CacheEntry(request, 'i18n', 'meta', scope='wiki').remove() wiki_languages = i18n.wikiLanguages().keys() for key in wiki_languages: caching.CacheEntry(request, 'i18n', key, scope='wiki').remove()
def mainloop(self): self.init_request() request = self.request # clean page scope cache entries keys = ["text_html", "pagelinks", "hitcounts"] pages = request.rootpage.getPageList(user="") for pagename in pages: arena = Page(request, pagename) for key in keys: caching.CacheEntry(request, arena, key, scope="item").remove() # clean wiki scope cache entries arena_key_list = [ ("charts", "hitcounts"), ("charts", "pagehits"), ("charts", "useragents"), ("user", "name2id"), ] for arena, key in arena_key_list: caching.CacheEntry(request, arena, key, scope="wiki").remove() # clean dict and groups related cache arena_scope_list = [("pagedicts", "wiki"), ("pagegroups", "wiki")] for arena, scope in arena_scope_list: for key in caching.get_cache_list(request, arena, scope): caching.CacheEntry(request, arena, key, scope=scope).remove() # clean drafts of users uids = user.getUserList(request) for key in uids: caching.CacheEntry(request, "drafts", key, scope="wiki").remove() # clean language cache files caching.CacheEntry(request, "i18n", "meta", scope="wiki").remove() wiki_languages = i18n.wikiLanguages().keys() for key in wiki_languages: caching.CacheEntry(request, "i18n", key, scope="wiki").remove()
def collect_data(self): import re request = self.request for uid in user.getUserList(request): u = user.User(request, uid) self.users[uid] = u # collect name duplicates: if u.name in self.names: self.names[u.name].append(uid) else: self.names[u.name] = [uid] # collect email duplicates: if u.email: if u.email in self.emails: self.emails[u.email].append(uid) else: self.emails[u.email] = [uid] # collect account with no or invalid email address set: if not u.email or not re.match(".*@.*\..*", u.email): self.uids_noemail[uid] = u.name
def collect_data(): import re for uid in user.getUserList(): u = user.User(None, uid) users[uid] = u # collect name duplicates: if names.has_key(u.name): names[u.name].append(uid) else: names[u.name] = [uid] # collect email duplicates: if u.email: if emails.has_key(u.email): emails[u.email].append(uid) else: emails[u.email] = [uid] # collect account with no or invalid email address set: if not u.email or not re.match(".*@.*\..*", u.email): uids_noemail[uid] = u.name
def userbrowser(): """ User Account Browser """ # XXX add superuser check groups = flaskg.groups user_accounts = [] for uid in user.getUserList(): u = user.User(uid) user_accounts.append( dict( uid=uid, name=u.name, email=u.email, disabled=u.disabled, groups=[ groupname for groupname in groups if u.name in groups[groupname] ], )) return render_template('admin/userbrowser.html', user_accounts=user_accounts, item_name="+admin/Userbrowser")
def subscribe_users(request, usernamelist, pagename, formatter): _ = request.getText if not Page(request, pagename).exists(): return u"Page does not exist." result = [] realusers = [] # usernames that are really wiki users # get user object - only with IDs! for userid in user.getUserList(request): success = False userobj = user.User(request, userid) if userobj.name in usernamelist: # found a user realusers.append(userobj.name) if userobj.isSubscribedTo([pagename]): success = True elif not userobj.email: success = False elif userobj.subscribe(pagename): success = True if success: result.append(formatter.smiley('{OK}')) result.append(formatter.text(" ")) else: result.append(formatter.smiley('{X}')) result.append(formatter.text(" ")) result.append(formatter.url(1, Page(request, userobj.name).url(request))) result.append(formatter.text(userobj.name)) result.append(formatter.url(0)) result.append(formatter.linebreak(preformatted=0)) result.extend([''.join([formatter.smiley('{X}'), formatter.text(" " + _("Not a user:"******" " + username), formatter.linebreak(preformatted=0)]) for username in usernamelist if username not in realusers]) return ''.join(result)
def handle_user_created(event): """Handles an event sent when a new user is being created""" request = event.request sitename = request.cfg.sitename event_name = event.name email = event.user.email or u"NOT SET" username = event.user.name user_ids = getUserList(request) for id in user_ids: usr = User(request, id=id) # Currently send this only to super users if usr.isSuperUser( ) and usr.jid and event_name in usr.jabber_subscribed_events: _ = lambda text: request.getText(text, lang=usr.language or 'en') msg = notification.user_created_message(request, _, sitename, username, email) data = { 'action': "user_created", 'subject': msg['subject'], 'text': msg['text'], 'url_list': [] } send_notification(request, [usr.jid], data)
def execute(self, modearg): myuser = self.request.user.name active = self.request.cfg.interwikiname path = self.request.cfg.collab_basedir baseurl = self.request.cfg.collab_baseurl collablist = listCollabs(baseurl, myuser, path, active, nocheck=True) userlist = user.getUserList(self.request) domainset = {} for uid in userlist: account = user.User(self.request, uid) nameparts = account.name.split("@", 1) if len(nameparts) > 1: domainset[nameparts[1]] = 1 f = self.formatter if not modearg or len(modearg) == 0: stattext = "Currently hosting " + str(len(collablist)) \ + " collaboration instances" stattext += " for " + str(len(userlist)) + " collaborators" stattext += " from " + str(len(domainset)) + " organisations." else: stattext = "Uknown stat mode: " + modearg divfmt = {'class': 'collab_stats'} result = '' result = f.div(1, **divfmt) result += f.strong(1) result += f.text(stattext) result += f.strong(0) result += f.div(0) return result
def _user_select(self): options = [] users = user.getUserList(self.request) realuid = None if hasattr(self.request, '_setuid_real_user') and self.request._setuid_real_user: realuid = self.request._setuid_real_user.id else: realuid = self.request.user.id for uid in users: if uid != realuid: name = user.User(self.request, id=uid).name options.append((uid, name)) options.sort(lambda x, y: cmp(x[1].lower(), y[1].lower())) size = min(5, len(options)) current_user = self.request.user.id if not options: _ = self._ self._only = True return _("You are the only user.") self._only = False return util.web.makeSelection('selected_user', options, current_user, size=size)
def request(self, request, user_obj, **kw): u = None changed = False # check if we are running Twisted if isinstance(request, request_twisted.Request): return user_obj, True # not supported if we run twisted # Addendum: this seems to need quite some twisted insight and coding. # A pointer i got on #twisted: divmod's vertex.sslverify # If you really need this, feel free to implement and test it and # submit a patch if it works. else: env = request.env if env.get('SSL_CLIENT_VERIFY', 'FAILURE') == 'SUCCESS': # check authority list if given if self.authorities and env.get('SSL_CLIENT_I_DN_OU') in self.authorities: return user_obj, True email_lower = None if self.email_key: email = env.get('SSL_CLIENT_S_DN_Email', '').decode(config.charset) email_lower = email.lower() commonname_lower = None if self.name_key: commonname = env.get('SSL_CLIENT_S_DN_CN', '').decode(config.charset) commonname_lower = commonname.lower() if email_lower or commonname_lower: for uid in user.getUserList(request): u = user.User(request, uid, auth_method=self.name, auth_attribs=()) if self.email_key and email_lower and u.email.lower() == email_lower: u.auth_attribs = ('email', 'password') if self.use_name and commonname_lower != u.name.lower(): u.name = commonname changed = True u.auth_attribs = ('email', 'name', 'password') break if self.name_key and commonname_lower and u.name.lower() == commonname_lower: u.auth_attribs = ('name', 'password') if self.use_email and email_lower != u.email.lower(): u.email = email changed = True u.auth_attribs = ('name', 'email', 'password') break else: u = None if u is None: # user wasn't found, so let's create a new user object u = user.User(request, name=commonname_lower, auth_username=commonname_lower, auth_method=self.name) u.auth_attribs = ('name', 'password') if self.use_email: u.email = email u.auth_attribs = ('name', 'email', 'password') elif user_obj and user_obj.auth_method == self.name: user_obj.valid = False return user_obj, False if u and self.autocreate: u.create_or_update(changed) if u and u.valid: return u, True else: return user_obj, True
text_data = f.read().decode('utf-8') if self.options.uid: try: set_password(request, newpass, uid=self.options.uid, notify=notify, skip_invalid=skip_invalid, subject=subject, text_intro=text_intro, text_msg=text_msg, text_data=text_data) except Fault, err: print str(err) elif self.options.uname: try: set_password(request, newpass, uname=self.options.uname, notify=notify, skip_invalid=skip_invalid, subject=subject, text_intro=text_intro, text_msg=text_msg, text_data=text_data) except Fault, err: print str(err) elif self.options.all_users: uids = sorted(getUserList(request)) total = len(uids) for nr, uid in enumerate(uids, start=1): log("%05d / %05d - processing uid %s" % (nr, total, uid)) try: set_password(request, newpass, uid=uid, notify=notify, skip_invalid=skip_invalid, subject=subject, text_intro=text_intro, text_msg=text_msg, text_data=text_data) except Fault, err: print str(err)
def handleData(self): _ = self._ form = self.request.form if form.has_key('logout'): # clear the cookie in the browser and locally. Does not # check if we have a valid user logged, just make sure we # don't have one after this call. self.request.deleteCookie() return _("Cookie deleted. You are now logged out.") if form.has_key('login_sendmail'): if not self.cfg.mail_smarthost: return _("""This wiki is not enabled for mail processing. Contact the owner of the wiki, who can enable email.""") try: email = form['email'][0].lower() except KeyError: return _("Please provide a valid email address!") text = '' users = user.getUserList(self.request) for uid in users: theuser = user.User(self.request, uid) if theuser.valid and theuser.email.lower() == email: text = "%s\n\nID: %s\nName: %s\nPassword: %s\nLogin URL: %s/?action=userform&uid=%s" % ( text, theuser.id, theuser.name, theuser.enc_password, self.request.getBaseURL(), theuser.id) if not text: return _("Found no account matching the given email address '%(email)s'!") % {'email': wikiutil.escape(email)} mailok, msg = util.mail.sendmail(self.request, [email], 'Your wiki account data', text, mail_from=self.cfg.mail_from) return wikiutil.escape(msg) if form.has_key('login'): # Trying to login with a user name and a password # Require valid user name name = form.get('username', [''])[0] if not user.isValidName(self.request, name): return _("""Invalid user name {{{'%s'}}}. Name may contain any Unicode alpha numeric character, with optional one space between words. Group page name is not allowed.""") % wikiutil.escape(name) # Check that user exists if not user.getUserId(self.request, name): return _('Unknown user name: {{{"%s"}}}. Please enter' ' user name and password.') % name # Require password password = form.get('password',[None])[0] if not password: return _("Missing password. Please enter user name and" " password.") # Load the user data and check for validness theuser = user.User(self.request, name=name, password=password) if not theuser.valid: return _("Sorry, wrong password.") # Save the user and send a cookie self.request.user = theuser self.request.setCookie() elif form.has_key('uid'): # Trying to login with the login URL, soon to be removed! try: uid = form['uid'][0] except KeyError: return _("Bad relogin URL.") # Load the user data and check for validness theuser = user.User(self.request, uid) if not theuser.valid: return _("Unknown user.") # Save the user and send a cookie self.request.user = theuser self.request.setCookie() else: # Save user profile theuser = user.User(self.request) # Require non-empty name try: theuser.name = form['username'][0] except KeyError: return _("Empty user name. Please enter a user name.") # Don't allow users with invalid names if not user.isValidName(self.request, theuser.name): return _("""Invalid user name {{{'%s'}}}. Name may contain any Unicode alpha numeric character, with optional one space between words. Group page name is not allowed.""") % wikiutil.escape(theuser.name) # Is this an existing user trying to change information or a new user? # Name required to be unique. Check if name belong to another user. newuser = 1 if user.getUserId(self.request, theuser.name): if theuser.name != self.request.user.name: return _("This user name already belongs to somebody else.") else: newuser = 0 # 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: return _("Passwords don't match!") if not password and newuser: return _("Please specify a password!") # Encode password if password and not password.startswith('{SHA}'): try: theuser.enc_password = user.encodePassword(password) except UnicodeError, err: # Should never happen return "Can't encode password: %s" % str(err) # try to get the (optional) email email = form.get('email', [''])[0] theuser.email = email.strip() # Require email if acl is enabled if not theuser.email and self.cfg.acl_enabled: return _("Please provide your email address. If you loose your" " login information, you can get it by email.") # Email required to be unique # See also MoinMoin/scripts/moin_usercheck.py if theuser.email: users = user.getUserList(self.request) for uid in users: if uid == theuser.id: continue thisuser = user.User(self.request, uid) if thisuser.email == theuser.email: return _("This email already belongs to somebody else.") # editor size theuser.edit_rows = util.web.getIntegerInput(self.request, 'edit_rows', theuser.edit_rows, 10, 60) # time zone theuser.tz_offset = util.web.getIntegerInput(self.request, 'tz_offset', theuser.tz_offset, -84600, 84600) # datetime format try: dt_d_combined = UserSettings._date_formats.get(form['datetime_fmt'][0], '') theuser.datetime_fmt, theuser.date_fmt = dt_d_combined.split(' & ') except (KeyError, ValueError): pass # try to get the (optional) theme theme_name = form.get('theme_name', [self.cfg.theme_default])[0] if theme_name != theuser.theme_name: # if the theme has changed, load the new theme # so the user has a direct feedback # WARNING: this should be refactored (i.e. theme load # after userform handling), cause currently the # already loaded theme is just replaced (works cause # nothing has been emitted yet) theuser.theme_name = theme_name if self.request.loadTheme(theuser.theme_name) > 0: theme_name = wikiutil.escape(theme_name) return _("The theme '%(theme_name)s' could not be loaded!") % locals() # 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 if not newuser: for key, label in user.User._checkbox_fields: value = form.get(key, ["0"])[0] try: value = int(value) except ValueError: pass else: setattr(theuser, key, value) # quicklinks for navibar theuser.quicklinks = self.decodePageList('quicklinks') # subscription for page change notification theuser.subscribed_pages = self.decodePageList('subscribed_pages') # save data and send cookie theuser.save() self.request.user = theuser self.request.setCookie() result = _("User preferences saved!") if _debug: result = result + util.dumpFormData(form) return result
def request(self, request, user_obj, **kw): u = None changed = False env = request.environ if env.get('SSL_CLIENT_VERIFY', 'FAILURE') == 'SUCCESS': # check authority list if given if self.authorities and env.get( 'SSL_CLIENT_I_DN_OU') in self.authorities: return user_obj, True email_lower = None if self.email_key: email = env.get('SSL_CLIENT_S_DN_Email', '').decode(config.charset) email_lower = email.lower() commonname_lower = None if self.name_key: commonname = env.get('SSL_CLIENT_S_DN_CN', '').decode(config.charset) commonname_lower = commonname.lower() if email_lower or commonname_lower: for uid in user.getUserList(request): u = user.User(request, uid, auth_method=self.name, auth_attribs=()) if self.email_key and email_lower and u.email.lower( ) == email_lower: u.auth_attribs = ('email', 'password') if self.use_name and commonname_lower != u.name.lower( ): u.name = commonname changed = True u.auth_attribs = ('email', 'name', 'password') break if self.name_key and commonname_lower and u.name.lower( ) == commonname_lower: u.auth_attribs = ('name', 'password') if self.use_email and email_lower != u.email.lower(): u.email = email changed = True u.auth_attribs = ('name', 'email', 'password') break else: u = None if u is None: # user wasn't found, so let's create a new user object u = user.User(request, name=commonname_lower, auth_username=commonname_lower, auth_method=self.name) u.auth_attribs = ('name', 'password') if self.use_email: u.email = email u.auth_attribs = ('name', 'email', 'password') elif user_obj and user_obj.auth_method == self.name: user_obj.valid = False return user_obj, False if u and self.autocreate: u.create_or_update(changed) if u and u.valid: return u, True else: return user_obj, True
def do_user_browser(request): """ Browser for SystemAdmin macro. """ _ = request.getText data = TupleDataset() data.columns = [ Column('name', label=_('Username')), Column('groups', label=_('Member of Groups')), Column('email', label=_('Email')), Column('jabber', label=_('Jabber')), Column('action', label=_('Action')), ] isgroup = request.cfg.cache.page_group_regexact.search groupnames = request.rootpage.getPageList(user='', filter=isgroup) # Iterate over users for uid in user.getUserList(request): account = user.User(request, uid) grouppage_links = ', '.join([Page(request, groupname).link_to(request) for groupname in groupnames if request.dicts.has_member(groupname, account.name)]) userhomepage = Page(request, account.name) if userhomepage.exists(): namelink = userhomepage.link_to(request) else: namelink = wikiutil.escape(account.name) # creates the POST data for account disable/enable val = "1" text=_('Disable user') if account.disabled: text=_('Enable user') val = "0" namelink += " (%s)" % _("disabled") url = request.page.url(request) ret = html.FORM(action=url) ret.append(html.INPUT(type='hidden', name='action', value='userprofile')) ret.append(html.INPUT(type='hidden', name='name', value=account.name)) ret.append(html.INPUT(type='hidden', name='key', value="disabled")) ret.append(html.INPUT(type='hidden', name='val', value=val)) ret.append(html.INPUT(type='submit', name='userprofile', value=text)) enable_disable_link = unicode(unicode(ret)) # creates the POST data for recoverpass url = request.page.url(request) ret = html.FORM(action=url) ret.append(html.INPUT(type='hidden', name='action', value='recoverpass')) ret.append(html.INPUT(type='hidden', name='email', value=account.email)) ret.append(html.INPUT(type='hidden', name='account_sendmail', value="1")) ret.append(html.INPUT(type='hidden', name='sysadm', value="users")) ret.append(html.INPUT(type='submit', name='recoverpass', value=_('Mail account data'))) recoverpass_link = unicode(unicode(ret)) if account.email: email_link = (request.formatter.url(1, 'mailto:' + account.email, css='mailto') + request.formatter.text(account.email) + request.formatter.url(0)) else: email_link = '' if account.jid: jabber_link = (request.formatter.url(1, 'xmpp:' + account.jid, css='mailto') + request.formatter.text(account.jid) + request.formatter.url(0)) else: jabber_link = '' data.addRow(( request.formatter.rawHTML(namelink), request.formatter.rawHTML(grouppage_links), email_link, jabber_link, recoverpass_link + enable_disable_link )) if data: from MoinMoin.widget.browser import DataBrowserWidget browser = DataBrowserWidget(request) browser.setData(data) return browser.render() # No data return ''
#Path al desposito de Archivos path = '/home/www-pyar/moin/share/moin/pyar/data/pages' ignore = [u'ReadWriteGroup', u'AdminGroup', u'BadContent'] #Creamos nuestro request de tipo cliente request = Request() #Levantamos todas las paginas existentes en el wiki y las convertimos a wikiname # FIXME hace que las paginas no se levanten del disco y se use la api de moinmoin pages = RootPage(request).getPageList(user='', include_underlay=False) #Quitamos las páginas de usuarios user_pages = [] for uid in user.getUserList(request): name = user.User(request, uid).name if Page(request, name).exists(): user_pages.append(name) ignore += user_pages pages = set(pages) - set(ignore) #creo un diccionario pagina:{hijos} #nodos = {} # #for page in pages: # nodos[page] = Page(request, page).getPageLinks(request) #
def macro_UserList(macro): """ macro to list users. """ request = macro.request _ = request.getText data = TupleDataset() data.columns = [ Column('name', label=_('Username')), Column('email', label=_('Email')), Column('groups', label=_('Member of Groups')), Column('language', label=_('Language')), ] isgroup = request.cfg.cache.page_group_regexact.search groupnames = request.rootpage.getPageList(user='', filter=isgroup) # Iterate over users for uid in user.getUserList(request): account = user.User(request, uid) # don't offer groupnames to users which aren't allowed to read them grouppage_links = ', '.join([Page(request, groupname).link_to(request) for groupname in groupnames if request.dicts.has_member(groupname, account.name) and request.user.may.read(groupname)]) userhomepage = Page(request, account.name) if userhomepage.exists(): namelink = userhomepage.link_to(request) else: namelink = wikiutil.escape(account.name) if account.disabled: enable_disable_link = request.page.link_to( request, text=_('Enable user'), querystr={"action": "userprofile", "name": account.name, "key": "disabled", "val": "0", }, rel='nofollow') namelink += " (%s)" % _("disabled") else: enable_disable_link = request.page.link_to( request, text=_('Disable user'), querystr={"action": "userprofile", "name": account.name, "key": "disabled", "val": "1", }, rel='nofollow') if account.email: email_link = (request.formatter.url(1, 'mailto:' + account.email, css='mailto') + request.formatter.text(account.email) + request.formatter.url(0)) else: email_link = '' # language defined in settings or default language language = account.language or request.cfg.language_default data.addRow(( request.formatter.rawHTML(namelink), email_link, request.formatter.rawHTML(grouppage_links), language, )) if data: from MoinMoin.widget.browser import DataBrowserWidget browser = DataBrowserWidget(request) browser.setData(data) return browser.toHTML() # No data return ''
def do_user_browser(request): """ Browser for SystemAdmin macro. """ _ = request.getText groups = request.groups data = TupleDataset() data.columns = [ Column('name', label=_('Username')), Column('groups', label=_('Member of Groups')), Column('email', label=_('Email')), Column('jabber', label=_('Jabber')), Column('action', label=_('Action')), ] # Iterate over users for uid in user.getUserList(request): account = user.User(request, uid) account_groups = set(groups.groups_with_member(account.name)) wiki_groups = set([group for group in account_groups if isinstance(groups[group], WikiGroup)]) other_groups = list(account_groups - wiki_groups) # First show groups that are defined in wikipages linking to it # after show groups from other backends. grouppage_links = ', '.join([Page(request, group_name).link_to(request) for group_name in wiki_groups] + other_groups) userhomepage = Page(request, account.name) if userhomepage.exists(): namelink = userhomepage.link_to(request) else: namelink = wikiutil.escape(account.name) # creates the POST data for account disable/enable val = "1" text=_('Disable user') if account.disabled: text=_('Enable user') val = "0" namelink += " (%s)" % _("disabled") url = request.page.url(request) ret = html.FORM(action=url) ret.append(html.INPUT(type='hidden', name='action', value='userprofile')) ticket = wikiutil.createTicket(request, action='userprofile') ret.append(html.INPUT(type="hidden", name="ticket", value="%s" % ticket)) ret.append(html.INPUT(type='hidden', name='name', value=account.name)) ret.append(html.INPUT(type='hidden', name='key', value="disabled")) ret.append(html.INPUT(type='hidden', name='val', value=val)) ret.append(html.INPUT(type='submit', name='userprofile', value=text)) enable_disable_link = unicode(unicode(ret)) # creates the POST data for recoverpass url = request.page.url(request) ret = html.FORM(action=url) ret.append(html.INPUT(type='hidden', name='action', value='recoverpass')) ret.append(html.INPUT(type='hidden', name='email', value=account.email)) ret.append(html.INPUT(type='hidden', name='account_sendmail', value="1")) ret.append(html.INPUT(type='hidden', name='sysadm', value="users")) ret.append(html.INPUT(type='submit', name='recoverpass', value=_('Mail account data'))) recoverpass_link = unicode(unicode(ret)) if account.email: email_link = (request.formatter.url(1, 'mailto:' + account.email, css='mailto') + request.formatter.text(account.email) + request.formatter.url(0)) else: email_link = '' if account.jid: jabber_link = (request.formatter.url(1, 'xmpp:' + account.jid, css='mailto') + request.formatter.text(account.jid) + request.formatter.url(0)) else: jabber_link = '' data.addRow(( (request.formatter.rawHTML(namelink), account.name), request.formatter.rawHTML(grouppage_links), email_link, jabber_link, recoverpass_link + enable_disable_link )) if data: from MoinMoin.widget.browser import DataBrowserWidget browser = DataBrowserWidget(request) browser.setData(data, sort_columns=[0]) return browser.render() # No data return ''
def do_user_browser(request): """ Browser for SystemAdmin macro. """ _ = request.getText groups = request.groups data = TupleDataset() data.columns = [ Column('name', label=_('Username')), Column('groups', label=_('Member of Groups')), Column('email', label=_('Email')), Column('jabber', label=_('Jabber')), Column('action', label=_('Action')), ] class UserAccount(object): # namedtuple is >= 2.6 :-( def __init__(self, **kw): for k, v in kw.items(): setattr(self, k, v) def __repr__(self): return "<UserAccount %r>" % self.__dict__ accounts = [] for uid in user.getUserList(request): # be careful and just create a list of what we really need, # not sure if we can keep lots of User objects instantiated # in parallel (open files? too big?) u = user.User(request, uid) accounts.append(UserAccount(name=u.name, email=u.email, jid=u.jid, disabled=u.disabled)) def sortkey(account): # enabled accounts at top, sorted by name return (account.disabled, account.name) # Iterate over user accounts for account in sorted(accounts, key=sortkey): account_groups = set(groups.groups_with_member(account.name)) wiki_groups = set([group for group in account_groups if isinstance(groups[group], WikiGroup)]) other_groups = list(account_groups - wiki_groups) # First show groups that are defined in wikipages linking to it # after show groups from other backends. grouppage_links = ', '.join([Page(request, group_name).link_to(request) for group_name in wiki_groups] + other_groups) userhomepage = Page(request, account.name) if userhomepage.exists(): namelink = userhomepage.link_to(request) else: namelink = wikiutil.escape(account.name) # creates the POST data for account disable/enable val = "1" text=_('Disable user') if account.disabled: text=_('Enable user') val = "0" namelink += " (%s)" % _("disabled") url = request.page.url(request) ret = html.FORM(action=url) ret.append(html.INPUT(type='hidden', name='action', value='userprofile')) ticket = wikiutil.createTicket(request, action='userprofile') ret.append(html.INPUT(type="hidden", name="ticket", value="%s" % ticket)) ret.append(html.INPUT(type='hidden', name='name', value=account.name)) ret.append(html.INPUT(type='hidden', name='key', value="disabled")) ret.append(html.INPUT(type='hidden', name='val', value=val)) ret.append(html.INPUT(type='submit', name='userprofile', value=text)) enable_disable_link = unicode(unicode(ret)) # creates the POST data for recoverpass url = request.page.url(request) ret = html.FORM(action=url) ret.append(html.INPUT(type='hidden', name='action', value='recoverpass')) ret.append(html.INPUT(type='hidden', name='email', value=account.email)) ret.append(html.INPUT(type='hidden', name='account_sendmail', value="1")) ret.append(html.INPUT(type='hidden', name='sysadm', value="users")) ret.append(html.INPUT(type='submit', name='recoverpass', value=_('Mail account data'))) recoverpass_link = unicode(unicode(ret)) if account.email: email_link = (request.formatter.url(1, 'mailto:' + account.email, css='mailto') + request.formatter.text(account.email) + request.formatter.url(0)) else: email_link = '' if account.jid: jabber_link = (request.formatter.url(1, 'xmpp:' + account.jid, css='mailto') + request.formatter.text(account.jid) + request.formatter.url(0)) else: jabber_link = '' data.addRow(( (request.formatter.rawHTML(namelink), account.name), request.formatter.rawHTML(grouppage_links), email_link, jabber_link, recoverpass_link + enable_disable_link )) if data: from MoinMoin.widget.browser import DataBrowserWidget browser = DataBrowserWidget(request) browser.setData(data) return browser.render() # No data return ''
def do_user_browser(request): """ Browser for SystemAdmin macro. """ _ = request.getText groups = request.groups data = TupleDataset() data.columns = [ Column("name", label=_("Username")), Column("groups", label=_("Member of Groups")), Column("email", label=_("Email")), Column("jabber", label=_("Jabber")), Column("action", label=_("Action")), ] class UserAccount(object): # namedtuple is >= 2.6 :-( def __init__(self, **kw): for k, v in kw.items(): setattr(self, k, v) def __repr__(self): return "<UserAccount %r>" % self.__dict__ accounts = [] for uid in user.getUserList(request): # be careful and just create a list of what we really need, # not sure if we can keep lots of User objects instantiated # in parallel (open files? too big?) u = user.User(request, uid) accounts.append(UserAccount(name=u.name, email=u.email, jid=u.jid, disabled=u.disabled)) def sortkey(account): # enabled accounts at top, sorted by name return (account.disabled, account.name) # Iterate over user accounts for account in sorted(accounts, key=sortkey): account_groups = set(groups.groups_with_member(account.name)) wiki_groups = set([group for group in account_groups if isinstance(groups[group], WikiGroup)]) other_groups = list(account_groups - wiki_groups) # First show groups that are defined in wikipages linking to it # after show groups from other backends. grouppage_links = ", ".join( [Page(request, group_name).link_to(request) for group_name in wiki_groups] + other_groups ) userhomepage = Page(request, account.name) if userhomepage.exists(): namelink = userhomepage.link_to(request) else: namelink = wikiutil.escape(account.name) # creates the POST data for account disable/enable val = "1" text = _("Disable user") if account.disabled: text = _("Enable user") val = "0" namelink += " (%s)" % _("disabled") url = request.page.url(request) ret = html.FORM(action=url) ret.append(html.INPUT(type="hidden", name="action", value="userprofile")) ticket = wikiutil.createTicket(request, action="userprofile") ret.append(html.INPUT(type="hidden", name="ticket", value="%s" % ticket)) ret.append(html.INPUT(type="hidden", name="name", value=account.name)) ret.append(html.INPUT(type="hidden", name="key", value="disabled")) ret.append(html.INPUT(type="hidden", name="val", value=val)) ret.append(html.INPUT(type="submit", name="userprofile", value=text)) enable_disable_link = unicode(unicode(ret)) # creates the POST data for recoverpass url = request.page.url(request) ret = html.FORM(action=url) ret.append(html.INPUT(type="hidden", name="action", value="recoverpass")) ret.append(html.INPUT(type="hidden", name="email", value=account.email)) ret.append(html.INPUT(type="hidden", name="account_sendmail", value="1")) ret.append(html.INPUT(type="hidden", name="sysadm", value="users")) ret.append(html.INPUT(type="submit", name="recoverpass", value=_("Mail account data"))) recoverpass_link = unicode(unicode(ret)) if account.email: email_link = ( request.formatter.url(1, "mailto:" + account.email, css="mailto") + request.formatter.text(account.email) + request.formatter.url(0) ) else: email_link = "" if account.jid: jabber_link = ( request.formatter.url(1, "xmpp:" + account.jid, css="mailto") + request.formatter.text(account.jid) + request.formatter.url(0) ) else: jabber_link = "" data.addRow( ( (request.formatter.rawHTML(namelink), account.name), request.formatter.rawHTML(grouppage_links), email_link, jabber_link, recoverpass_link + enable_disable_link, ) ) if data: from MoinMoin.widget.browser import DataBrowserWidget browser = DataBrowserWidget(request) browser.setData(data) return browser.render() # No data return ""
def mainloop(self): argc = len(self.args) self.init_request() request = self.request if self.options.py_append_file: def logs(request): """ generator for log objects """ # global edit-log yield editlog.EditLog(request) # local edit-log of every page for pn in request.rootpage.getPageList(exists=False): yield editlog.EditLog(request, rootpagename=pn) def uids(log): """ generator for userids found in a log """ for line in log: uid = line.userid if uid: yield uid fn = self.options.py_append_file editlog_uids = set() for log in logs(request): editlog_uids |= set(uids(log)) with open(fn, "a") as f: for uid in editlog_uids: u = User(request, uid) code = u'editlog_uids.add(%r) # %r %r %r\n' % ( uid, u.name, u.email, u.jid) f.write(code.encode('utf-8')) elif self.options.py_exec_file: def check_interactive(u): if self.options.interactive: prompt = "%s %r %r %r disabled=%r (y/N)? " % ( u.id, u.name, u.email, u.jid, u.disabled) return raw_input(prompt).strip() in [ 'y', 'Y', ] else: return True fn = self.options.py_exec_file locs = dict(editlog_uids=set()) execfile(fn, {}, locs) editlog_uids = locs.get('editlog_uids') profile_uids = set(getUserList(request)) inactive_uids = profile_uids - editlog_uids for uid in inactive_uids: u = User(request, uid) if self.options.show: print "%s\t%r\t%r\t%r" % (uid, u.name, u.email, u.disabled) if self.options.disable: if check_interactive(u): u.disabled = 1 u.save() elif self.options.remove: if check_interactive(u): u.remove()
print str(err) elif self.options.uname: try: set_password(request, newpass, uname=self.options.uname, notify=notify, skip_invalid=skip_invalid, subject=subject, text_intro=text_intro, text_msg=text_msg, text_data=text_data) except Fault, err: print str(err) elif self.options.all_users: uids = sorted(getUserList(request)) total = len(uids) for nr, uid in enumerate(uids, start=1): log("%05d / %05d - processing uid %s" % (nr, total, uid)) try: set_password(request, newpass, uid=uid, notify=notify, skip_invalid=skip_invalid, subject=subject, text_intro=text_intro, text_msg=text_msg, text_data=text_data) except Fault, err: print str(err)
ignore =[u'ReadWriteGroup',u'AdminGroup',u'BadContent'] #Creamos nuestro request de tipo cliente request = Request() #Levantamos todas las paginas existentes en el wiki y las convertimos a wikiname # FIXME hace que las paginas no se levanten del disco y se use la api de moinmoin pages = RootPage(request).getPageList(user='', include_underlay=False) #Quitamos las páginas de usuarios user_pages = [] for uid in user.getUserList(request): name = user.User(request, uid).name if Page(request, name).exists(): user_pages.append(name) ignore += user_pages pages = set(pages) - set(ignore) #creo un diccionario pagina:{hijos} #nodos = {} # #for page in pages: # nodos[page] = Page(request, page).getPageLinks(request) #