1
2
3
4
5
6
7
8
9
10
11 from DateTime import DateTime
12 from random import choice
13 from email.MIMEText import MIMEText
14 import socket
15 import logging
16 log = logging.getLogger("zen.UserSettings")
17
18 from Globals import DTMLFile
19 from Globals import InitializeClass
20 from AccessControl import ClassSecurityInfo
21 from AccessControl import getSecurityManager
22 from Acquisition import aq_base
23 from Products.PluggableAuthService import interfaces
24 from Products.PluggableAuthService.PluggableAuthService \
25 import _SWALLOWABLE_PLUGIN_EXCEPTIONS
26 from zExceptions import Unauthorized
27
28 from Products.ZenEvents.ActionRule import ActionRule
29 from Products.ZenEvents.CustomEventView import CustomEventView
30 from Products.ZenRelations.RelSchema import *
31 from Products.ZenUtils import Time
32 from Products.ZenUtils.Utils import unused, prepId
33 from Products.ZenUtils.guid.interfaces import IGUIDManager
34 from Products.ZenUtils import DotNetCommunication
35 from Products.ZenUtils.guid.interfaces import IGloballyIdentifiable
36 from Products.ZenWidgets import messaging
37 from Products.ZenModel.interfaces import IProvidesEmailAddresses, IProvidesPagerAddresses
38 from Products.ZenMessaging.audit import audit
39 from Products.ZenUtils.deprecated import deprecated
40
41 from ZenossSecurity import *
42 from ZenModelRM import ZenModelRM
43 from Products.ZenUtils import Utils
44 from zope.interface import implements
48
49 UserSettingsId = "ZenUsers"
57
58
59 -def rolefilter(r): return r not in ("Anonymous", "Authenticated", "Owner")
60
63 """Manage zenoss user folders.
64 """
65 security = ClassSecurityInfo()
66
67 meta_type = "UserSettingsManager"
68
69
70
71 sub_meta_types = ("UserSettings",)
72
73 factory_type_information = (
74 {
75 'id' : 'UserSettingsManager',
76 'meta_type' : 'UserSettingsManager',
77 'description' : """Base class for all devices""",
78 'icon' : 'UserSettingsManager.gif',
79 'product' : 'ZenModel',
80 'factory' : 'manage_addUserSettingsManager',
81 'immediate_view' : 'manageUserFolder',
82 'actions' :
83 (
84 { 'id' : 'settings'
85 , 'name' : 'Settings'
86 , 'action' : '../editSettings'
87 , 'permissions' : ( ZEN_MANAGE_DMD, )
88 },
89 { 'id' : 'manage'
90 , 'name' : 'Commands'
91 , 'action' : '../dataRootManage'
92 , 'permissions' : (ZEN_MANAGE_DMD,)
93 },
94 { 'id' : 'users'
95 , 'name' : 'Users'
96 , 'action' : 'manageUserFolder'
97 , 'permissions' : ( ZEN_MANAGE_DMD, )
98 },
99 { 'id' : 'packs'
100 , 'name' : 'ZenPacks'
101 , 'action' : '../ZenPackManager/viewZenPacks'
102 , 'permissions' : ( ZEN_MANAGE_DMD, )
103 },
104 { 'id' : 'jobs'
105 , 'name' : 'Jobs'
106 , 'action' : '../joblist'
107 , 'permissions' : ( "Manage DMD", )
108 },
109 { 'id' : 'portlets'
110 , 'name' : 'Portlets'
111 , 'action' : '../editPortletPerms'
112 , 'permissions' : ( ZEN_MANAGE_DMD, )
113 },
114 { 'id' : 'daemons'
115 , 'name' : 'Daemons'
116 , 'action' : '../../About/zenossInfo'
117 , 'permissions' : ( ZEN_MANAGE_DMD, )
118 },
119 { 'id' : 'versions'
120 , 'name' : 'Versions'
121 , 'action' : '../../About/zenossVersions'
122 , 'permissions' : ( ZEN_MANAGE_DMD, )
123 },
124 { 'id' : 'backups'
125 , 'name' : 'Backups'
126 , 'action' : '../backupInfo'
127 , 'permissions' : ( ZEN_MANAGE_DMD, )
128 },
129 { 'id' : 'eventConfig'
130 , 'name' : 'Events'
131 , 'action' : 'eventConfig'
132 , 'permissions' : ( "Manage DMD", )
133 },
134 { 'id' : 'userInterfaceConfig'
135 , 'name' : 'User Interface'
136 , 'action' : '../userInterfaceConfig'
137 , 'permissions' : ( "Manage DMD", )
138 },
139 )
140 },
141 )
142
143
145 """Return list user settings objects.
146 """
147
148
149 return sorted(self.objectValues(spec="UserSettings"),
150 key=lambda a: a.id)
151
153 """Return list group settings objects.
154 """
155 return sorted(self.objectValues(spec="GroupSettings"),
156 key=lambda a: a.id)
157
159 """Return list of all zenoss usernames.
160 """
161 filtNames = set(filtNames)
162 return [ u.id for u in self.getAllUserSettings()
163 if u.id not in filtNames ]
164
166 """Return list of all zenoss groupnames.
167 """
168 filtNames = set(filtNames)
169 return [ g.id for g in self.getAllGroupSettings()
170 if g.id not in filtNames ]
171
173 """Return list of Users wrapped in their settings folder.
174 """
175 users = []
176 for uset in self.objectValues(spec="UserSettings"):
177 user = self.acl_users.getUser(uset.id)
178 if user: users.append(user.__of__(uset))
179 return users
180
181
183 """Return a user object. If userid is not passed return current user.
184 """
185 if userid is None:
186 user = getSecurityManager().getUser()
187 else:
188 user = self.acl_users.getUser(userid)
189 if user: return user.__of__(self.acl_users)
190
191
196
198 """Return a user folder. If userid is not passed return current user.
199 """
200 user=None
201 if userid is None:
202 user = getSecurityManager().getUser()
203 userid = user.getId()
204 if not userid: raise Unauthorized
205 folder = self._getOb(userid,None)
206 if not folder and userid:
207 userid = str(userid)
208 ufolder = UserSettings(userid)
209 self._setObject(ufolder.getId(), ufolder)
210 folder = self._getOb(userid)
211 if not user:
212 user = self.getUser(userid)
213 if user:
214
215 psheets = user.listPropertysheets()
216 psheets.reverse()
217 for ps in map(lambda ps: user.getPropertysheet(ps), psheets):
218 props = {}
219 for id in ps.propertyIds():
220 props[id] = ps.getProperty(id)
221 ufolder.updatePropsFromDict(props)
222 folder.changeOwnership(user)
223 folder.manage_setLocalRoles(userid, ("Owner",))
224 return folder
225
226
233
234
246
253
254
255 security.declareProtected(ZEN_MANAGE_DMD, 'manage_addUser')
256 - def manage_addUser(self, userid, password=None,roles=("ZenUser",),
257 REQUEST=None,**kw):
258 """
259 Add a Zenoss user to the system and set the user's default properties.
260
261 @parameter userid: username to add
262 @parameter password: password for the username
263 @parameter roles: tuple of role names
264 @parameter REQUEST: Zope object containing details about this request
265 """
266 if not userid: return
267
268 userid= userid.strip()
269
270 illegal_usernames= [ 'user', ]
271
272 user_name= userid.lower()
273 if user_name in illegal_usernames:
274 if REQUEST:
275 messaging.IMessageSender(self).sendToBrowser(
276 'Error',
277 'The username "%s" is reserved.' % userid,
278 priority=messaging.WARNING
279 )
280 return self.callZenScreen(REQUEST)
281 else:
282 return None
283
284 if password is None:
285 password = self.generatePassword()
286
287 self.acl_users._doAddUser(userid,password,roles,"")
288 self.acl_users.ZCacheable_invalidate()
289 user = self.acl_users.getUser(userid)
290 ufolder = self.getUserSettings(userid)
291 if REQUEST: kw = REQUEST.form
292 ufolder.updatePropsFromDict(kw)
293
294 if REQUEST:
295 messaging.IMessageSender(self).sendToBrowser(
296 'User Added',
297 'User "%s" has been created.' % userid
298 )
299 audit('UI.User.Add', username=userid, roles=roles)
300 return self.callZenScreen(REQUEST)
301 else:
302 return user
303
304
306 """ Generate a valid password.
307 """
308
309 chars = 'ABCDEFGHJKLMNPRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789'
310 return ''.join(choice(chars) for i in range(6))
311
312
314 """
315 Authenticates a given set of credentials against all configured
316 authentication plugins. Returns True for successful authentication and
317 False otherwise.
318 """
319 if login == 'admin':
320 acl_users = self.getPhysicalRoot().acl_users
321 else:
322 acl_users = self.acl_users
323
324 try:
325 authenticators = acl_users.plugins.listPlugins(
326 interfaces.plugins.IAuthenticationPlugin)
327 except _SWALLOWABLE_PLUGIN_EXCEPTIONS:
328 authenticators = ()
329
330
331 for authenticator_id, auth in authenticators:
332 try:
333 uid_and_info = auth.authenticateCredentials(
334 {'login':login, 'password':password})
335
336 if isinstance(uid_and_info, tuple):
337
338 user_id, info = (uid_and_info + (None,None))[:2]
339
340
341 if user_id is not None:
342 return True
343
344 except _SWALLOWABLE_PLUGIN_EXCEPTIONS:
345 pass
346
347
348 return False
349
350
351 security.declareProtected(ZEN_MANAGE_DMD, 'manage_changeUser')
352 - def manage_changeUser(self, userid, password=None, sndpassword=None,
353 roles=None, domains=None, REQUEST=None, **kw):
354 """Change a zenoss users settings.
355 """
356 user = self.acl_users.getUser(userid)
357 if not user:
358 if REQUEST:
359 messaging.IMessageSender(self).sendToBrowser(
360 'Error',
361 'User "%s" was not found.' % userid,
362 priority=messaging.WARNING
363 )
364 return self.callZenScreen(REQUEST)
365 else:
366 return
367 if password and password != sndpassword:
368 if REQUEST:
369 messaging.IMessageSender(self).sendToBrowser(
370 'Error',
371 "Passwords didn't match. No change.",
372 priority=messaging.WARNING
373 )
374 return self.callZenScreen(REQUEST)
375 else:
376 raise ValueError("passwords don't match")
377 if REQUEST:
378
379
380 updates = {}
381 if password: updates['password'] = '****'
382 if roles: updates['roles': roles]
383 if domains: updates['domains': domains]
384 if password is None: password = user._getPassword()
385 if roles is None: roles = user.roles
386 if domains is None: domains = user.domains
387 self.acl_users._doChangeUser(userid,password,roles,domains)
388 self.acl_users.ZCacheable_invalidate()
389 ufolder = self.getUserSettings(userid)
390 ufolder.updatePropsFromDict(kw)
391 if REQUEST:
392 messaging.IMessageSender(self).sendToBrowser(
393 'Settings Saved',
394 Time.SaveMessage()
395 )
396 audit('UI.User.Edit', username=userid, data_=updates)
397 return self.callZenScreen(REQUEST)
398 else:
399 return user
400
401
402 security.declareProtected(ZEN_MANAGE_DMD, 'manage_deleteUsers')
449
450
451 security.declareProtected(ZEN_MANAGE_DMD, 'manage_addGroup')
453 """Add a zenoss group to the system and set its default properties.
454 """
455 if not groupid: return
456 groupid = prepId(groupid)
457 try:
458 self.acl_users.groupManager.addGroup(groupid)
459 self.acl_users.ZCacheable_invalidate()
460 except KeyError: pass
461 self.getGroupSettings(groupid)
462 if REQUEST:
463 messaging.IMessageSender(self).sendToBrowser(
464 'Group Added',
465 'Group "%s" has been created.' % groupid
466 )
467 audit('UI.Group.Add', groupid)
468 return self.callZenScreen(REQUEST)
469
470
471 security.declareProtected(ZEN_MANAGE_DMD, 'manage_deleteGroups')
473 """ Delete a zenoss group from the system
474 """
475 gm = self.acl_users.groupManager
476 if isinstance(groupids, basestring):
477 groupids = [groupids]
478 for groupid in groupids:
479 if self._getOb(groupid):
480 group = self._getOb(groupid)
481 group.removeAdminRoles()
482 self._delObject(groupid)
483 try:
484 gm.removeGroup(groupid)
485 self.acl_users.ZCacheable_invalidate()
486 except KeyError: pass
487 if REQUEST:
488 messaging.IMessageSender(self).sendToBrowser(
489 'Groups Deleted',
490 "Groups were deleted: %s." % (', '.join(groupids))
491 )
492 for groupid in groupids:
493 audit('UI.Group.Delete', groupid)
494 return self.callZenScreen(REQUEST)
495
496
497 security.declareProtected(ZEN_MANAGE_DMD, 'manage_addUsersToGroups')
499 """ Add users to a group
500 """
501 if isinstance(userids, basestring):
502 userids = [userids]
503 if isinstance(groupids, basestring):
504 groupids = [groupids]
505 for groupid in groupids:
506 self._getOb(groupid).manage_addUsersToGroup(userids)
507 if REQUEST:
508 if not groupids:
509 messaging.IMessageSender(self).sendToBrowser(
510 'Error',
511 'No groups were selected.',
512 priority=messaging.WARNING
513 )
514 else:
515 messaging.IMessageSender(self).sendToBrowser(
516 'Groups Modified',
517 'Users %s were added to group %s.' % (
518 ', '.join(userids), ', '.join(groupids))
519 )
520 for userid in userids:
521 for groupid in groupids:
522 audit('UI.User.AddToGroup', username=userid, group=groupid)
523 return self.callZenScreen(REQUEST)
524
525
526 security.declareProtected(ZEN_MANAGE_DMD, 'manage_emailTestAdmin')
536
537
538 security.declareProtected(ZEN_MANAGE_DMD, 'manage_pagerTestAdmin')
540 ''' Do pager test for given user
541 '''
542 userSettings = self.getUserSettings(userid)
543 msg = userSettings.manage_pagerTest()
544 if msg:
545 messaging.IMessageSender(self).sendToBrowser('Pager Test', msg)
546 if REQUEST:
547 return self.callZenScreen(REQUEST)
548
549
551 """Delete orphaned user folders.
552 """
553 userfolders = self._getOb(UserSettingsId)
554 userids = self.acl_users.getUserNames()
555 for fid in userfolders.objectIds():
556 if fid not in userids:
557 userfolders._delObject(fid)
558 self.acl_users.ZCacheable_invalidate()
559
560
562 """Get list of all roles without Anonymous and Authenticated.
563 """
564 return filter(rolefilter, self.valid_roles())
565
566
569
578
579
580 addUserSettings = DTMLFile('dtml/addUserSettings',globals())
584 """zenoss user folder has users preferences.
585 """
586 implements(IProvidesEmailAddresses, IProvidesPagerAddresses, IGloballyIdentifiable)
587
588 meta_type = "UserSettings"
589
590 sub_meta_types = ("ActionRule",)
591
592 email = ""
593 pager = ""
594 defaultPageSize = 40
595 defaultEventPageSize = 30
596 defaultAdminRole = "ZenUser"
597 oncallStart = 0
598 oncallEnd = 0
599 escalationMinutes = 0
600 dashboardState = ''
601 netMapStartObject = ''
602 eventConsoleRefresh = True
603 zenossNetUser = ''
604 zenossNetPassword = ''
605
606 _properties = ZenModelRM._properties + (
607 {'id':'email', 'type':'string', 'mode':'w'},
608 {'id':'pager', 'type':'string', 'mode':'w'},
609 {'id':'defaultPageSize', 'type':'int', 'mode':'w'},
610 {'id':'defaultEventPageSize', 'type':'int', 'mode':'w'},
611 {'id':'defaultAdminRole', 'type':'string', 'mode':'w'},
612 {'id':'oncallStart', 'type':'int', 'mode':'w'},
613 {'id':'oncallEnd', 'type':'int', 'mode':'w'},
614 {'id':'escalationMinutes', 'type':'int', 'mode':'w'},
615 {'id':'dashboardState', 'type':'string', 'mode':'w'},
616 {'id':'netMapStartObject', 'type':'string', 'mode':'w'},
617 {'id':'eventConsoleRefresh', 'type':'boolean', 'mode':'w'},
618 {'id':'zenossNetUser', 'type':'string', 'mode':'w'},
619 {'id':'zenossNetPassword', 'type':'string', 'mode':'w'},
620 )
621
622
623 _relations = (
624 ("adminRoles", ToMany(ToOne, "Products.ZenModel.AdministrativeRole",
625 "userSetting")),
626 ("messages", ToManyCont(ToOne,
627 "Products.ZenWidgets.PersistentMessage.PersistentMessage",
628 "messageQueue")),
629 )
630
631
632 factory_type_information = (
633 {
634 'immediate_view' : 'editUserSettings',
635 'actions' :
636 (
637 {'name' : 'Edit',
638 'action' : 'editUserSettings',
639 'permissions' : (ZEN_CHANGE_SETTINGS,),
640 },
641 {'name' : 'Administered Objects',
642 'action' : 'administeredDevices',
643 'permissions' : (ZEN_CHANGE_ADMIN_OBJECTS,)
644 },
645 )
646 },
647 )
648
649 security = ClassSecurityInfo()
650
652 """This user doesn't have global roles. Used to limit access
653 """
654 return self.id != 'admin' and len(self.getUserRoles()) == 0
655
666
668 """
669 This is used by the UI to make sure that we are always looking at the
670 latest version of the roles for this user.
671 """
672
673 self.acl_users.ZCacheable_invalidate()
674
675 return self.getUserRoles()
676
678 """Return group settings objects for user
679 """
680 user = self.getUser(self.id)
681 if user:
682 return self.acl_users._getGroupsForPrincipal(user)
683 return ()
684
685
686 security.declareProtected(ZEN_CHANGE_SETTINGS, 'updatePropsFromDict')
688 props = self.propertyIds()
689 for k, v in propdict.items():
690 if k in props: setattr(self,k,v)
691
692
694 """Can the current user edit this settings object.
695 """
696 currentUser = getSecurityManager().getUser()
697
698
699 if currentUser.has_role("Manager"):
700 return True
701
702
703 thisUser = self.acl_users.getUser(self.id)
704 if thisUser is None:
705 return False
706
707
708 if currentUser.has_role("ZenManager") \
709 and not thisUser.has_role("Manager"):
710 return True
711
712
713 if thisUser.getUserName() == currentUser.getUserName():
714 return True
715
716 return False
717
718 security.declareProtected(ZEN_CHANGE_SETTINGS, 'manage_resetPassword')
720 """
721 Reset a password.
722 """
723 email = self.email.strip()
724 if not email:
725 messaging.IMessageSender(self).sendToBrowser(
726 'Password Reset Failed',
727 'Cannot send password reset email; user has no'+
728 ' email address.',
729 priority=messaging.WARNING
730 )
731 return self.callZenScreen(self.REQUEST)
732
733 newpw = self.generatePassword()
734 body = """
735 Your Zenoss password has been reset at %s's request.
736
737 Your new password is: %s
738 """ % (self.getUser().getId(), newpw)
739 msg = MIMEText(body)
740 msg['Subject'] = 'Zenoss Password Reset Request'
741 msg['From'] = self.dmd.getEmailFrom()
742 msg['To'] = email
743 msg['Date'] = DateTime().rfc822()
744 result, errorMsg = Utils.sendEmail(msg, self.dmd.smtpHost,
745 self.dmd.smtpPort,
746 self.dmd.smtpUseTLS, self.dmd.smtpUser,
747 self.dmd.smtpPass)
748 if result:
749 userManager = self.acl_users.userManager
750 try:
751 userManager.updateUserPassword(self.id, newpw)
752 except KeyError:
753 self.getPhysicalRoot().acl_users.userManager.updateUserPassword(
754 self.id, newpw)
755 messaging.IMessageSender(self).sendToBrowser(
756 'Password reset',
757 'An email with a new password has been sent.'
758 )
759 audit('UI.User.ResetPassword', username=self.id)
760 loggedInUser = self.REQUEST['AUTHENTICATED_USER']
761
762
763
764 if loggedInUser.getUserName() == self.id:
765 self.acl_users.logout(self.REQUEST)
766 else:
767 messaging.IMessageSender(self).sendToBrowser(
768 'Password reset failed',
769 'Unable to send password reset email: %s' % errorMsg,
770 priority=messaging.WARNING
771 )
772 return self.callZenScreen(self.REQUEST)
773
774
775 security.declareProtected(ZEN_CHANGE_SETTINGS, 'manage_editUserSettings')
776 - def manage_editUserSettings(self, oldpassword=None, password=None,
777 sndpassword=None, roles=None, groups=None,
778 domains=None, REQUEST=None, **kw):
779 """Update user settings.
780 """
781
782 user = self.acl_users.getUser(self.id)
783 if not user:
784 user = self.getPhysicalRoot().acl_users.getUser(self.id)
785 if not user:
786 if REQUEST:
787 messaging.IMessageSender(self).sendToBrowser(
788 'Error',
789 'User %s not found.' % self.id,
790 priority=messaging.WARNING
791 )
792 return self.callZenScreen(REQUEST)
793 else:
794 return
795
796
797 curuser = self.getUser().getId()
798 if not oldpassword or not self.ZenUsers.authenticateCredentials(
799 curuser, oldpassword):
800 if REQUEST:
801 messaging.IMessageSender(self).sendToBrowser(
802 'Error',
803 'Confirmation password is empty or invalid. Please'+
804 ' confirm your password for security reasons.',
805 priority=messaging.WARNING
806 )
807 return self.callZenScreen(REQUEST)
808 else:
809 raise ValueError("Current password is incorrect.")
810
811
812 roleManager = self.acl_users.roleManager
813 origRoles = filter(rolefilter, user.getRoles())
814
815 if not self.has_role('Manager') and roles and 'Manager' in roles:
816 if REQUEST:
817 messaging.IMessageSender(self).sendToBrowser(
818 'Error',
819 'Only Managers can make more Managers.',
820 priority=messaging.WARNING
821 )
822 return self.callZenScreen(REQUEST)
823 else:
824 return
825
826 if not self.has_role('Manager') and origRoles and \
827 'Manager' in origRoles:
828
829 if REQUEST:
830 messaging.IMessageSender(self).sendToBrowser(
831 'Error',
832 'Only Managers can modify other Managers.',
833 priority=messaging.WARNING
834 )
835 return self.callZenScreen(REQUEST)
836 else:
837 return
838
839
840
841
842 updates = {}
843
844
845 if roles is None:
846 roles = ()
847 origRolesSet = set(origRoles)
848 rolesSet = set(roles)
849 if rolesSet != origRolesSet and self.isManager():
850
851 removeRoles = origRolesSet - rolesSet
852 for role in removeRoles:
853 try:
854 roleManager.removeRoleFromPrincipal(role, self.id)
855 except KeyError:
856
857 pass
858
859 addRoles = rolesSet - origRolesSet
860 for role in addRoles:
861 roleManager.assignRoleToPrincipal(role, self.id)
862 updates['roles'] = roles
863
864
865 if groups is None:
866 groups = ()
867 groupManager = self.acl_users.groupManager
868 origGroupsSet = set(groupManager.getGroupsForPrincipal(user))
869 groupsSet = set(groups)
870
871 if groupsSet != origGroupsSet and self.isManager():
872
873 removeGroups = origGroupsSet - groupsSet
874 for groupid in removeGroups:
875 groupManager.removePrincipalFromGroup(user.getId(), groupid)
876
877 addGroups = groupsSet - origGroupsSet
878 for groupid in addGroups:
879 try:
880 groupManager.addPrincipalToGroup(user.getId(), groupid)
881 except KeyError:
882
883 pass
884 updates['groups'] = groups
885
886
887 if domains:
888 msg = 'Zenoss does not currently manage domains for users.'
889 raise NotImplementedError(msg)
890
891
892 if REQUEST:
893 kw = REQUEST.form
894 self.manage_changeProperties(**kw)
895
896
897 if self.id=='admin':
898 userManager = self.getPhysicalRoot().acl_users.userManager
899 else:
900 userManager = self.acl_users.userManager
901 if password:
902 if password.find(':') >= 0:
903 if REQUEST:
904 messaging.IMessageSender(self).sendToBrowser(
905 'Error',
906 'Passwords cannot contain a ":". Password not updated.',
907 priority=messaging.WARNING
908 )
909 return self.callZenScreen(REQUEST)
910 else:
911 raise ValueError("Passwords cannot contain a ':' ")
912 elif password != sndpassword:
913 if REQUEST:
914 messaging.IMessageSender(self).sendToBrowser(
915 'Error',
916 'Passwords did not match. Password not updated.',
917 priority=messaging.WARNING
918 )
919 return self.callZenScreen(REQUEST)
920 else:
921 raise ValueError("Passwords don't match")
922 else:
923 try:
924 userManager.updateUserPassword(self.id, password)
925 updates['password'] = '****'
926 except KeyError:
927 self.getPhysicalRoot().acl_users.userManager.updateUserPassword(
928 self.id, password)
929 if REQUEST:
930 loggedInUser = REQUEST['AUTHENTICATED_USER']
931
932
933
934 if loggedInUser.getUserName() == self.id:
935 self.acl_users.logout(REQUEST)
936
937 self.acl_users.ZCacheable_invalidate()
938
939
940 if REQUEST:
941 messaging.IMessageSender(self).sendToBrowser(
942 'Settings Saved',
943 Time.SaveMessage()
944 )
945 audit('UI.User.Edit', username=self.id, data_=updates)
946 return self.callZenScreen(REQUEST)
947 else:
948 return user
949
950 security.declareProtected(ZEN_CHANGE_ALERTING_RULES, 'manage_addActionRule')
951 @deprecated
968
971
972 security.declareProtected(ZEN_CHANGE_EVENT_VIEWS,
973 'manage_addCustomEventView')
974 @deprecated
991
992
993 security.declareProtected(ZEN_CHANGE_ADMIN_OBJECTS,
994 'manage_addAdministrativeRole')
997 "Add a Admin Role to the passed object"
998 unused(role)
999 mobj = None
1000 if guid or uid:
1001
1002 if guid:
1003 manager = IGUIDManager(self.dmd)
1004 mobj = manager.getObject(guid)
1005 elif uid:
1006 mobj = self.unrestrictedTraverse(uid)
1007 else:
1008
1009 if not name:
1010 name = REQUEST.deviceName
1011 if type == 'device':
1012 mobj =self.getDmdRoot("Devices").findDevice(name)
1013 else:
1014 try:
1015 root = type.capitalize()+'s'
1016 if type == "deviceClass":
1017 mobj = self.getDmdRoot("Devices").getOrganizer(name)
1018 else:
1019 mobj = self.getDmdRoot(root).getOrganizer(name)
1020 except KeyError: pass
1021 if not mobj:
1022 if REQUEST:
1023 messaging.IMessageSender(self).sendToBrowser(
1024 'Error',
1025 "%s %s not found"%(type.capitalize(),name),
1026 priority=messaging.WARNING
1027 )
1028 return self.callZenScreen(REQUEST)
1029 else: return
1030 roleNames = [ r.id for r in mobj.adminRoles() ]
1031 if self.id in roleNames:
1032 if REQUEST:
1033 messaging.IMessageSender(self).sendToBrowser(
1034 'Error',
1035 (("Administrative Role for %s %s "
1036 "for user %s already exists.") % (type, name, self.id)),
1037 priority=messaging.WARNING
1038 )
1039 return self.callZenScreen(REQUEST)
1040 else: return
1041 mobj.manage_addAdministrativeRole(self.id)
1042 if REQUEST:
1043 messaging.IMessageSender(self).sendToBrowser(
1044 'Role Added',
1045 ("Administrative Role for %s %s for user %s added" %
1046 (type, name, self.id))
1047 )
1048 audit('UI.User.AddAdministrativeRole', username=self.id,
1049 data_={mobj.meta_type:mobj.getPrimaryId()})
1050 return self.callZenScreen(REQUEST)
1051
1052
1053 security.declareProtected(ZEN_CHANGE_ADMIN_OBJECTS,
1054 'manage_editAdministrativeRoles')
1080
1081
1082 security.declareProtected(ZEN_CHANGE_ADMIN_OBJECTS,
1083 'manage_deleteAdministrativeRole')
1103
1104
1105 security.declareProtected(ZEN_CHANGE_SETTINGS, 'getAllAdminRoles')
1107 """Return all admin roles for this user and its groups
1108 """
1109 ars = self.adminRoles()
1110 for group in self.getUser().getGroups():
1111 gs = self.getGroupSettings(group)
1112 ars.extend(gs.adminRoles())
1113 return ars
1114
1115
1116 security.declareProtected(ZEN_CHANGE_SETTINGS, 'manage_emailTest')
1118 ''' Send a test email to the given userid.
1119 '''
1120 destSettings = self.getUserSettings(self.getId())
1121 destAddresses = destSettings.getEmailAddresses()
1122 msg = None
1123 if destAddresses:
1124 fqdn = socket.getfqdn()
1125 thisUser = self.getUser()
1126 srcId = thisUser.getId()
1127 self.getUserSettings(srcId)
1128 srcAddress = self.dmd.getEmailFrom()
1129
1130 body = ('This is a test message sent by %s' % srcId +
1131 ' from the Zenoss installation on %s.' % fqdn)
1132 emsg = MIMEText(body)
1133 emsg['Subject'] = 'Zenoss Email Test'
1134 emsg['From'] = srcAddress
1135 emsg['To'] = ', '.join(destAddresses)
1136 emsg['Date'] = DateTime().rfc822()
1137 result, errorMsg = Utils.sendEmail(emsg, self.dmd.smtpHost,
1138 self.dmd.smtpPort,
1139 self.dmd.smtpUseTLS, self.dmd.smtpUser,
1140 self.dmd.smtpPass)
1141 if result:
1142 msg = 'Test email sent to %s' % ', '.join(destAddresses)
1143 else:
1144 msg = 'Test failed: %s' % errorMsg
1145 else:
1146 msg = 'Test email not sent, user has no email address.'
1147 if REQUEST:
1148 messaging.IMessageSender(self).sendToBrowser(
1149 'Email Test',
1150 msg.replace("'", "\\'")
1151 )
1152 return self.callZenScreen(REQUEST)
1153 else:
1154 return msg
1155
1156
1157 security.declareProtected(ZEN_CHANGE_SETTINGS, 'manage_pagerTest')
1159 ''' Send a test page
1160 '''
1161 destSettings = self.getUserSettings(self.getId())
1162 destPagers = [ x.strip() for x in
1163 (destSettings.getPagerAddresses() or []) ]
1164 msg = None
1165 fqdn = socket.getfqdn()
1166 srcId = self.getUser().getId()
1167 testMsg = ('Test sent by %s' % srcId +
1168 ' from the Zenoss installation on %s.' % fqdn)
1169 for destPager in destPagers:
1170 result, errorMsg = Utils.sendPage(destPager, testMsg,
1171 self.dmd.pageCommand)
1172 if result:
1173 msg = 'Test page sent to %s' % ', '.join(destPagers)
1174 else:
1175 msg = 'Test failed: %s' % errorMsg
1176 break
1177 if not destPagers:
1178 msg = 'Test page not sent, user has no pager number.'
1179 if REQUEST:
1180 messaging.IMessageSender(self).sendToBrowser(
1181 'Pager Test', msg)
1182 return self.callZenScreen(REQUEST)
1183 else:
1184 return msg
1185
1187 """patch to export all user configuration
1188 """
1189 for o in self.objectValues():
1190 if hasattr(aq_base(o), 'exportXml'):
1191 o.exportXml(ofile, ignorerels)
1192
1194 if self.pager.strip():
1195 return [self.pager.strip()]
1196 return []
1197
1202
1206
1216
1218 """
1219 Call before deleting a user or group this will
1220 remove this user/group from the list of admin objects for
1221 everything that the object adminstered before. This
1222 prevents broken relationships
1223 """
1224 for role in self.getAllAdminRoles():
1225 obj = role.managedObject().primaryAq()
1226 obj.manage_deleteAdministrativeRole(self.id)
1227
1229 implements(IProvidesEmailAddresses, IProvidesPagerAddresses)
1230 meta_type = 'GroupSettings'
1231
1232 factory_type_information = (
1233 {
1234 'immediate_view' : 'editGroupSettings',
1235 'actions' :
1236 (
1237 {'name' : 'Edit',
1238 'action' : 'editGroupSettings',
1239 'permissions' : (ZEN_CHANGE_SETTINGS,),
1240 },
1241 {'name' : 'Administered Objects',
1242 'action' : 'administeredDevices',
1243 'permissions' : (ZEN_CHANGE_ADMIN_OBJECTS,)
1244 },
1245 )
1246 },
1247 )
1248
1249 security = ClassSecurityInfo()
1250
1252 """Can the current user edit this settings object.
1253 """
1254 currentUser = getSecurityManager().getUser()
1255 return currentUser.has_role("Manager") or currentUser.has_role("ZenManager")
1256
1258 return self.zport.acl_users.groupManager
1259
1260
1262 """This is a group we never have roles. This is set to false so that
1263 fuctionality that would normally be taken away for a restricted user is
1264 left in.
1265 """
1266 return False
1267
1268
1269 security.declareProtected(ZEN_MANAGE_DMD, 'manage_addUsersToGroup')
1285
1286 security.declareProtected(ZEN_MANAGE_DMD, 'manage_deleteUserFromGroup')
1288 self._getG().removePrincipalFromGroup( userid, self.id )
1289
1290 security.declareProtected(ZEN_MANAGE_DMD, 'manage_deleteUsersFromGroup')
1304
1306 """
1307 Returns a list of UserSetting instances that are members of this group.
1308 """
1309 members = set()
1310
1311
1312
1313 [ members.add(u) for u in self.ZenUsers.getAllUserSettings()
1314 if self.id in u.getUserGroupSettingsNames() ]
1315
1316
1317
1318 [ members.add(self.getUserSettings(u[0]))
1319 for u in self._getG().listAssignedPrincipals(self.id) ]
1320 return members
1321
1323 """
1324 Returns a list of user ids that are members of this group.
1325 """
1326 return [ u.id for u in self.getMemberUserSettings() ]
1327
1335
1346
1348 try:
1349 userIds = self.getMemberUserIds()
1350 except LocalAndLDAPUserEntries, ex:
1351 return []
1352
1353 result = []
1354 for username in userIds:
1355 result.extend(self.getUserSettings(username).getPagerAddresses())
1356 return result
1357
1358
1359 InitializeClass(UserSettingsManager)
1360 InitializeClass(UserSettings)
1361