Package ldaptor :: Package apps :: Package webui :: Module mass_change_password
[hide private]
[frames] | no frames]

Source Code for Module ldaptor.apps.webui.mass_change_password

  1  from zope.interface import implements 
  2  from twisted.internet import defer 
  3  from webut.skin import iskin 
  4  from ldaptor.protocols.ldap import ldapsyntax 
  5  from ldaptor import generate_password 
  6  from ldaptor.apps.webui.uriquote import uriUnquote 
  7  from twisted.internet import reactor 
  8  from ldaptor.apps.webui.i18n import _ 
  9  from ldaptor.apps.webui import i18n 
 10   
 11  import os 
 12  from nevow import rend, inevow, loaders, url, tags 
 13  from formless import annotate, webform, configurable 
 14   
15 -class MassPasswordChangeStatus(object):
16 - def __init__(self, deferlist):
17 super(MassPasswordChangeStatus, self).__init__() 18 self.deferlist = deferlist
19
20 -class MassPasswordChangeForm(configurable.Configurable):
21 - def __init__(self, ldapObjects):
22 super(MassPasswordChangeForm, self).__init__(None) 23 self.ldapObjects = {} 24 for o in ldapObjects: 25 assert o.dn not in self.ldapObjects 26 self.ldapObjects[o.dn] = o 27 28 self.formFields=self._getFormFields()
29
30 - def _getFormFields(self):
31 r=[] 32 r.append(annotate.Argument('request', 33 annotate.Request())) 34 for dn, e in self.ldapObjects.items(): 35 r.append(annotate.Argument('dn_%s' % dn, 36 annotate.Boolean(label=dn, 37 description=e))) 38 return r
39
40 - def getBindingNames(self, ctx):
41 return ['generate']
42
43 - def bind_generate(self, ctx):
44 return annotate.MethodBinding( 45 'generatePasswords', 46 annotate.Method(arguments=self.formFields, 47 label=_('Generate passwords')), 48 action=_('Generate passwords'))
49
50 - def generatePasswords(self, request, **kw):
51 entries = [] 52 for k,v in kw.items(): 53 if not k.startswith('dn_'): 54 continue 55 k = k[len('dn_'):] 56 if not v: 57 continue 58 assert k in self.ldapObjects 59 entries.append(self.ldapObjects[k]) 60 61 if not entries: 62 return _('No passwords to change.') 63 d=generate_password.generate(reactor, len(entries)) 64 65 def _gotPasswords(passwords, entries): 66 assert len(passwords)==len(entries) 67 l=[] 68 for entry, pwd in zip(entries, passwords): 69 d=entry.setPassword(newPasswd=pwd) 70 def _cb(entry, pwd): 71 return (entry, pwd)
72 d.addCallback(_cb, pwd) 73 l.append(d) 74 return defer.DeferredList(l, 75 consumeErrors=True)
76 d.addCallback(_gotPasswords, entries) 77 d.addCallback(MassPasswordChangeStatus) 78 return d 79 80
81 -class ReallyMassPasswordChangePage(rend.Page):
82 implements(iskin.ISkinnable) 83 84 title = _('Ldaptor Mass Password Change Page') 85 86 addSlash = True 87 docFactory = loaders.xmlfile( 88 'mass_change_password-really.xhtml', 89 templateDir=os.path.split(os.path.abspath(__file__))[0]) 90
91 - def __init__(self, entries):
92 super(ReallyMassPasswordChangePage, self).__init__() 93 self.entries = entries
94
95 - def data_header(self, ctx, data):
96 u=url.URL.fromContext(ctx) 97 u=u.parentdir().parentdir().clear() 98 l=[] 99 l.append(tags.a(href=u.sibling("search"))[_("Search")]) 100 l.append(tags.a(href=u.sibling("add"))[_("add new entry")]) 101 return l
102
103 - def configurable_(self, context):
104 request = context.locate(inevow.IRequest) 105 return MassPasswordChangeForm(self.entries)
106
107 - def render_form(self, context, data):
108 return webform.renderForms()[context.tag]
109
110 - def render_passthrough(self, context, data):
111 return context.tag.clear()[data]
112
113 - def render_status(self, context, data):
114 try: 115 obj = context.locate(inevow.IHand) 116 except KeyError: 117 return context.tag.clear() 118 119 if not isinstance(obj, MassPasswordChangeStatus): 120 return context.tag.clear()[obj] 121 122 dl = tags.dl(compact="compact") 123 context.tag.clear()[dl] 124 for success, x in obj.deferlist: 125 if success: 126 entry, pwd = x 127 dl[tags.dt[entry.dn], 128 tags.dd[pwd]] 129 else: 130 context.tag[_('Failed: '), x.getErrorMessage()] 131 132 return context.tag
133 134 render_i18n = i18n.render()
135
136 -class MassPasswordChangePage(rend.Page):
137 implements(iskin.ISkinnable) 138 139 title = _('Ldaptor Mass Password Change Page') 140 141 addSlash = True 142 docFactory = loaders.xmlfile( 143 'mass_change_password.xhtml', 144 templateDir=os.path.split(os.path.abspath(__file__))[0]) 145
146 - def __init__(self, baseObject):
147 super(MassPasswordChangePage, self).__init__() 148 self.baseObject = baseObject
149
150 - def render_url(self, context, data):
151 u = url.URL.fromContext(context) 152 return context.tag(href=u.parentdir().child('search'))
153
154 - def childFactory(self, context, name):
155 entry = inevow.ISession(context).getLoggedInRoot().loggedIn 156 157 filt = uriUnquote(name) 158 159 e=ldapsyntax.LDAPEntry(client=entry.client, 160 dn=self.baseObject) 161 d=e.search(filterText=filt, sizeLimit=20) 162 d.addCallback(ReallyMassPasswordChangePage) 163 return d
164 165 render_i18n = i18n.render()
166