1
2
3
4
5
6
7
8
9
10
11
12
13
14 import types
15
16 from random import choice
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 zExceptions import Unauthorized
25 from DateTime import DateTime
26
27 from Products.ZenEvents.ActionRule import ActionRule
28 from Products.ZenEvents.CustomEventView import CustomEventView
29 from Products.ZenRelations.RelSchema import *
30 from Products.ZenUtils import Time
31 from Products.ZenUtils.Utils import unused
32 from Products.ZenUtils import DotNetCommunication
33 from Products.ZenWidgets import messaging
34
35 from ZenossSecurity import *
36 from ZenModelRM import ZenModelRM
37 from Products.ZenUtils import Utils
38
39 from email.MIMEText import MIMEText
40 import socket
41
42 UserSettingsId = "ZenUsers"
43
50
51
52 -def rolefilter(r): return r not in ("Anonymous", "Authenticated", "Owner")
53
55 """Manage zenoss user folders.
56 """
57 security = ClassSecurityInfo()
58
59 meta_type = "UserSettingsManager"
60
61
62
63 sub_meta_types = ("UserSettings",)
64
65 factory_type_information = (
66 {
67 'id' : 'UserSettingsManager',
68 'meta_type' : 'UserSettingsManager',
69 'description' : """Base class for all devices""",
70 'icon' : 'UserSettingsManager.gif',
71 'product' : 'ZenModel',
72 'factory' : 'manage_addUserSettingsManager',
73 'immediate_view' : 'manageUserFolder',
74 'actions' :
75 (
76 { 'id' : 'settings'
77 , 'name' : 'Settings'
78 , 'action' : '../editSettings'
79 , 'permissions' : ( ZEN_MANAGE_DMD, )
80 },
81 { 'id' : 'manage'
82 , 'name' : 'Commands'
83 , 'action' : '../dataRootManage'
84 , 'permissions' : (ZEN_MANAGE_DMD,)
85 },
86 { 'id' : 'users'
87 , 'name' : 'Users'
88 , 'action' : 'manageUserFolder'
89 , 'permissions' : ( ZEN_MANAGE_DMD, )
90 },
91 { 'id' : 'packs'
92 , 'name' : 'ZenPacks'
93 , 'action' : '../ZenPackManager/viewZenPacks'
94 , 'permissions' : ( ZEN_MANAGE_DMD, )
95 },
96 { 'id' : 'jobs'
97 , 'name' : 'Jobs'
98 , 'action' : '../joblist'
99 , 'permissions' : ( "Manage DMD", )
100 },
101 { 'id' : 'menus'
102 , 'name' : 'Menus'
103 , 'action' : '../editMenus'
104 , 'permissions' : ( ZEN_MANAGE_DMD, )
105 },
106 { 'id' : 'portlets'
107 , 'name' : 'Portlets'
108 , 'action' : '../editPortletPerms'
109 , 'permissions' : ( ZEN_MANAGE_DMD, )
110 },
111 { 'id' : 'daemons'
112 , 'name' : 'Daemons'
113 , 'action' : '../../About/zenossInfo'
114 , 'permissions' : ( ZEN_MANAGE_DMD, )
115 },
116 { 'id' : 'versions'
117 , 'name' : 'Versions'
118 , 'action' : '../../About/zenossVersions'
119 , 'permissions' : ( ZEN_MANAGE_DMD, )
120 },
121 { 'id' : 'backups'
122 , 'name' : 'Backups'
123 , 'action' : '../backupInfo'
124 , 'permissions' : ( ZEN_MANAGE_DMD, )
125 },
126 )
127 },
128 )
129
130
132 """Return list user settings objects.
133 """
134
135
136 users = self.objectValues(spec="UserSettings")
137 users.sort(lambda a,b:cmp(a.id, b.id))
138 return users
139
141 """Return list user settings objects.
142 """
143 groups = self.objectValues(spec="GroupSettings")
144 groups.sort(lambda a,b:cmp(a.id, b.id))
145 return groups
146
148 """Return list of all zenoss usernames.
149 """
150 filt = lambda x: x not in filtNames
151 return [ u.id for u in self.getAllUserSettings() if filt(u.id) ]
152
154 """Return list of all zenoss usernames.
155 """
156 filt = lambda x: x not in filtNames
157 return [ g.id for g in self.getAllGroupSettings() if filt(g.id) ]
158
160 """Return list of Users wrapped in their settings folder.
161 """
162 users = []
163 for uset in self.objectValues(spec="UserSettings"):
164 user = self.acl_users.getUser(uset.id)
165 if user: users.append(user.__of__(uset))
166 return users
167
168
170 """Return a user object. If userid is not passed return current user.
171 """
172 if userid is None:
173 user = getSecurityManager().getUser()
174 else:
175 user = self.acl_users.getUser(userid)
176 if user: return user.__of__(self.acl_users)
177
178
183
185 """Return a user folder. If userid is not passed return current user.
186 """
187 user=None
188 if userid is None:
189 user = getSecurityManager().getUser()
190 userid = user.getId()
191 if not userid: raise Unauthorized
192 folder = self._getOb(userid,None)
193 if not folder and userid:
194 ufolder = UserSettings(userid)
195 self._setObject(ufolder.getId(), ufolder)
196 folder = self._getOb(userid)
197 if not user:
198 user = self.getUser(userid)
199 if user:
200
201 psheets = user.listPropertysheets()
202 psheets.reverse()
203 for ps in map(lambda ps: user.getPropertysheet(ps), psheets):
204 props = {}
205 for id in ps.propertyIds():
206 props[id] = ps.getProperty(id)
207 ufolder.updatePropsFromDict(props)
208 folder.changeOwnership(user)
209 folder.manage_setLocalRoles(userid, ("Owner",))
210 return folder
211
212
218
219
229
236
237
238 security.declareProtected(ZEN_MANAGE_DMD, 'manage_addUser')
239 - def manage_addUser(self, userid, password=None,roles=("ZenUser",),
240 REQUEST=None,**kw):
284
285
287 """ Generate a valid password.
288 """
289
290 chars = 'ABCDEFGHJKLMNPRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789'
291 return ''.join( [ choice(chars) for i in range(6) ] )
292
293
294 security.declareProtected(ZEN_MANAGE_DMD, 'manage_changeUser')
295 - def manage_changeUser(self, userid, password=None, sndpassword=None,
296 roles=None, domains=None, REQUEST=None, **kw):
334
335
336 security.declareProtected(ZEN_MANAGE_DMD, 'manage_deleteUsers')
379
380
381 security.declareProtected(ZEN_MANAGE_DMD, 'manage_addGroup')
383 """Add a zenoss group to the system and set its default properties.
384 """
385 if not groupid: return
386 try:
387 self.acl_users.groupManager.addGroup(groupid)
388 except KeyError: pass
389 self.getGroupSettings(groupid)
390 if REQUEST:
391 messaging.IMessageSender(self).sendToBrowser(
392 'Group Added',
393 'Group "%s" has been created.' % groupid
394 )
395 return self.callZenScreen(REQUEST)
396
397
398 security.declareProtected(ZEN_MANAGE_DMD, 'manage_deleteGroups')
400 """ Delete a zenoss group from the system
401 """
402 gm = self.acl_users.groupManager
403 if type(groupids) in types.StringTypes:
404 groupids = [groupids]
405 for groupid in groupids:
406 if self._getOb(groupid): self._delObject(groupid)
407 try:
408 gm.removeGroup(groupid)
409 except KeyError: pass
410 if REQUEST:
411 messaging.IMessageSender(self).sendToBrowser(
412 'Groups Deleted',
413 "Groups were deleted: %s." % (', '.join(groupids))
414 )
415 return self.callZenScreen(REQUEST)
416
417
418 security.declareProtected(ZEN_MANAGE_DMD, 'manage_addUsersToGroups')
442
443
444 security.declareProtected(ZEN_MANAGE_DMD, 'manage_emailTestAdmin')
454
455
456 security.declareProtected(ZEN_MANAGE_DMD, 'manage_pagerTestAdmin')
458 ''' Do pager test for given user
459 '''
460 userSettings = self.getUserSettings(userid)
461 msg = userSettings.manage_pagerTest()
462 if msg:
463 messaging.IMessageSender(self).sendToBrowser('Pager Test', msg)
464 if REQUEST:
465 return self.callZenScreen(REQUEST)
466
467
469 """Delete orphaned user folders.
470 """
471 userfolders = self._getOb(UserSettingsId)
472 userids = self.acl_users.getUserNames()
473 for fid in userfolders.objectIds():
474 if fid not in userids:
475 userfolders._delObject(fid)
476
477
479 """Get list of all roles without Anonymous and Authenticated.
480 """
481 return filter(rolefilter, self.valid_roles())
482
483
486
487
488
495
496
497 addUserSettings = DTMLFile('dtml/addUserSettings',globals())
498
499
501 """zenoss user folder has users preferences.
502 """
503
504 meta_type = "UserSettings"
505
506 sub_meta_types = ("ActionRule",)
507
508 email = ""
509 pager = ""
510 defaultPageSize = 40
511 defaultEventPageSize = 30
512 defaultAdminRole = "ZenUser"
513 defaultAdminLevel = 1
514 oncallStart = 0
515 oncallEnd = 0
516 escalationMinutes = 0
517 dashboardState = ''
518 netMapStartObject = ''
519 eventConsoleRefresh = True
520 zenossNetUser = ''
521 zenossNetPassword = ''
522
523 _properties = ZenModelRM._properties + (
524 {'id':'email', 'type':'string', 'mode':'w'},
525 {'id':'pager', 'type':'string', 'mode':'w'},
526 {'id':'defaultPageSize', 'type':'int', 'mode':'w'},
527 {'id':'defaultEventPageSize', 'type':'int', 'mode':'w'},
528 {'id':'defaultAdminRole', 'type':'string', 'mode':'w'},
529 {'id':'defaultAdminLevel', 'type':'int', 'mode':'w'},
530 {'id':'oncallStart', 'type':'int', 'mode':'w'},
531 {'id':'oncallEnd', 'type':'int', 'mode':'w'},
532 {'id':'escalationMinutes', 'type':'int', 'mode':'w'},
533 {'id':'dashboardState', 'type':'string', 'mode':'w'},
534 {'id':'netMapStartObject', 'type':'string', 'mode':'w'},
535 {'id':'eventConsoleRefresh', 'type':'boolean', 'mode':'w'},
536 {'id':'zenossNetUser', 'type':'string', 'mode':'w'},
537 {'id':'zenossNetPassword', 'type':'string', 'mode':'w'},
538 )
539
540
541 _relations = (
542 ("adminRoles", ToMany(ToOne, "Products.ZenModel.AdministrativeRole",
543 "userSetting")),
544 ("messages", ToManyCont(ToOne,
545 "Products.ZenWidgets.PersistentMessage.PersistentMessage",
546 "messageQueue")),
547 )
548
549
550 factory_type_information = (
551 {
552 'immediate_view' : 'editUserSettings',
553 'actions' :
554 (
555 {'name' : 'Edit',
556 'action' : 'editUserSettings',
557 'permissions' : (ZEN_CHANGE_SETTINGS,),
558 },
559 {'name' : 'Administered Objects',
560 'action' : 'administeredDevices',
561 'permissions' : (ZEN_CHANGE_ADMIN_OBJECTS,)
562 },
563 {'name' : 'Event Views',
564 'action' : 'editEventViews',
565
566 'permissions' : (ZEN_CHANGE_SETTINGS,),
567 },
568 {'name' : 'Alerting Rules',
569 'action' : 'editActionRules',
570 'permissions' : (ZEN_CHANGE_ALERTING_RULES,),
571 },
572 )
573 },
574 )
575
576 security = ClassSecurityInfo()
577
578 security.declareProtected('View', 'zentinelTabs')
580 """Return a list of hashs that define the screen tabs for this object.
581 [{'name':'Name','action':'template','selected':False},...]
582 """
583 tabs = super(UserSettings, self).zentinelTabs(templateName)
584
585 if self.hasNoGlobalRoles():
586 return tabs[:-1]
587 return tabs
588
590 """This user doesn't have global roles. Used to limit access
591 """
592 return self.id != 'admin' and len(self.getUserRoles()) == 0
593
595 """Get current roles for this user.
596 """
597 user = self.getUser(self.id)
598 if user: return filter(rolefilter, user.getRoles())
599 return []
600
601
603 """Return group settings objects for user
604 """
605 user = self.getUser(self.id)
606 gm = self.zport.acl_users.groupManager
607 if user:
608 return gm.getGroupsForPrincipal(user)
609 return ()
610
611
612 security.declareProtected(ZEN_CHANGE_SETTINGS, 'updatePropsFromDict')
614 props = self.propertyIds()
615 for k, v in propdict.items():
616 if k in props: setattr(self,k,v)
617
618
620 """Can the current user edit this settings object.
621 """
622 owner = self.getOwner()
623 user = getSecurityManager().getUser()
624 if owner.has_role("Manager") and not user.has_role("Manager"):
625 return False
626
627 return user.has_role("Manager") or \
628 user.has_role("ZenManager") or \
629 owner.getUserName() == user.getUserName()
630
631
639
640
641 security.declareProtected(ZEN_CHANGE_SETTINGS, 'manage_editUserSettings')
642 - def manage_editUserSettings(self, password=None, sndpassword=None,
643 roles=None, groups=None, domains=None,
644 REQUEST=None, **kw):
645 """Update user settings.
646 """
647
648 user = self.acl_users.getUser(self.id)
649 if not user:
650 user = self.getPhysicalRoot().acl_users.getUser(self.id)
651 if not user:
652 if REQUEST:
653 messaging.IMessageSender(self).sendToBrowser(
654 'Error',
655 'User %s not found.' % self.id,
656 priority=messaging.WARNING
657 )
658 return self.callZenScreen(REQUEST)
659 else:
660 return
661
662
663 roleManager = self.acl_users.roleManager
664 origRoles = filter(rolefilter, user.getRoles())
665
666 if not self.has_role('Manager') and roles and 'Manager' in roles:
667 if REQUEST:
668 messaging.IMessageSender(self).sendToBrowser(
669 'Error',
670 'Only Managers can make more Managers.',
671 priority=messaging.WARNING
672 )
673 return self.callZenScreen(REQUEST)
674 else:
675 return
676
677 if not self.has_role('Manager') and origRoles and \
678 'Manager' in origRoles:
679
680 if REQUEST:
681 messaging.IMessageSender(self).sendToBrowser(
682 'Error',
683 'Only Managers can modify other Managers.',
684 priority=messaging.WARNING
685 )
686 return self.callZenScreen(REQUEST)
687 else:
688 return
689
690
691 if roles != origRoles and self.isManager():
692 from sets import Set as set
693
694 removeRoles = list(set(origRoles).difference(set(roles)))
695 for role in removeRoles:
696 roleManager.removeRoleFromPrincipal(role, self.id)
697
698 addRoles = list(set(roles).difference(set(origRoles)))
699 for role in addRoles:
700 roleManager.assignRoleToPrincipal(role, self.id)
701
702
703 groupManager = self.acl_users.groupManager
704 origGroups = groupManager.getGroupsForPrincipal(user)
705
706 if groups != origGroups and self.isManager():
707
708 try:
709 set()
710 except NameError:
711 from sets import Set as set
712
713 removeGroups = set(origGroups).difference(set(groups))
714 for groupid in removeGroups:
715 groupManager.removePrincipalFromGroup(user.getId(), groupid)
716
717 addGroups = set(groups).difference(set(origGroups))
718 for groupid in addGroups:
719 groupManager.addPrincipalToGroup(user.getId(), groupid)
720
721
722 if domains:
723 msg = 'Zenoss does not currently manage domains for users.'
724 raise NotImplementedError(msg)
725
726
727 if REQUEST:
728 kw = REQUEST.form
729 self.manage_changeProperties(**kw)
730
731
732 userManager = self.acl_users.userManager
733 if password:
734 if password.find(':') >= 0:
735 if REQUEST:
736 messaging.IMessageSender(self).sendToBrowser(
737 'Error',
738 'Passwords cannot contain a ":". Password not updated.',
739 priority=messaging.WARNING
740 )
741 return self.callZenScreen(REQUEST)
742 else:
743 raise ValueError("Passwords cannot contain a ':' ")
744 elif password != sndpassword:
745 if REQUEST:
746 messaging.IMessageSender(self).sendToBrowser(
747 'Error',
748 'Passwords did not match. Password not updated.',
749 priority=messaging.WARNING
750 )
751 return self.callZenScreen(REQUEST)
752 else:
753 raise ValueError("Passwords don't match")
754 else:
755 try: userManager.updateUserPassword(self.id, password)
756 except KeyError:
757 self.getPhysicalRoot().acl_users.userManager.updateUserPassword(
758 self.id, password)
759 if REQUEST:
760 loggedInUser = REQUEST['AUTHENTICATED_USER']
761
762
763
764 if loggedInUser.getUserName() == self.id:
765 self.acl_users.logout(REQUEST)
766
767
768 if REQUEST:
769 messaging.IMessageSender(self).sendToBrowser(
770 'Settings Saved',
771 Time.SaveMessage()
772 )
773 return self.callZenScreen(REQUEST)
774 else:
775 return user
776
777 security.declareProtected(ZEN_CHANGE_ALERTING_RULES, 'manage_addActionRule')
794
797
798 security.declareProtected(ZEN_CHANGE_EVENT_VIEWS,
799 'manage_addCustomEventView')
816
817
818 security.declareProtected(ZEN_CHANGE_ADMIN_OBJECTS,
819 'manage_addAdministrativeRole')
822 "Add a Admin Role to this device"
823 unused(role)
824 mobj = None
825 if not name:
826 name = REQUEST.deviceName
827 if type == 'device':
828 mobj =self.getDmdRoot("Devices").findDevice(name)
829 else:
830 try:
831 root = type.capitalize()+'s'
832 if type == "deviceClass":
833 mobj = self.getDmdRoot("Devices").getOrganizer(name)
834 else:
835 mobj = self.getDmdRoot(root).getOrganizer(name)
836 except KeyError: pass
837 if not mobj:
838 if REQUEST:
839 messaging.IMessageSender(self).sendToBrowser(
840 'Error',
841 "%s %s not found"%(type.capitalize(),name),
842 priority=messaging.WARNING
843 )
844 return self.callZenScreen(REQUEST)
845 else: return
846 roleNames = [ r.id for r in mobj.adminRoles() ]
847 if self.id in roleNames:
848 if REQUEST:
849 messaging.IMessageSender(self).sendToBrowser(
850 'Error',
851 (("Administrative Role for %s %s "
852 "for user %s already exists.") % (type, name, self.id)),
853 priority=messaging.WARNING
854 )
855 return self.callZenScreen(REQUEST)
856 else: return
857 mobj.manage_addAdministrativeRole(self.id)
858 if REQUEST:
859 messaging.IMessageSender(self).sendToBrowser(
860 'Role Added',
861 ("Administrative Role for %s %s for user %s added" %
862 (type, name, self.id))
863 )
864 return self.callZenScreen(REQUEST)
865
866
867 security.declareProtected(ZEN_CHANGE_ADMIN_OBJECTS,
868 'manage_editAdministrativeRoles')
892
893
894 security.declareProtected(ZEN_CHANGE_ADMIN_OBJECTS,
895 'manage_deleteAdministrativeRole')
912
913
914 security.declareProtected(ZEN_CHANGE_SETTINGS, 'getAllAdminRoles')
916 """Return all admin roles for this user and its groups
917 """
918 ars = self.adminRoles()
919 for group in self.getUser().getGroups():
920 gs = self.getGroupSettings(group)
921 ars.extend(gs.adminRoles())
922 return ars
923
924
925 security.declareProtected(ZEN_CHANGE_SETTINGS, 'manage_emailTest')
927 ''' Send a test email to the given userid.
928 '''
929 destSettings = self.getUserSettings(self.getId())
930 destAddresses = destSettings.getEmailAddresses()
931 msg = None
932 if destAddresses:
933 fqdn = socket.getfqdn()
934 thisUser = self.getUser()
935 srcId = thisUser.getId()
936 self.getUserSettings(srcId)
937 srcAddress = self.dmd.getEmailFrom()
938
939 body = ('This is a test message sent by %s' % srcId +
940 ' from the Zenoss installation on %s.' % fqdn)
941 emsg = MIMEText(body)
942 emsg['Subject'] = 'Zenoss Email Test'
943 emsg['From'] = srcAddress
944 emsg['To'] = ', '.join(destAddresses)
945 emsg['Date'] = DateTime().rfc822()
946 result, errorMsg = Utils.sendEmail(emsg, self.dmd.smtpHost,
947 self.dmd.smtpPort,
948 self.dmd.smtpUseTLS, self.dmd.smtpUser,
949 self.dmd.smtpPass)
950 if result:
951 msg = 'Test email sent to %s' % ', '.join(destAddresses)
952 else:
953 msg = 'Test failed: %s' % errorMsg
954 else:
955 msg = 'Test email not sent, user has no email address.'
956 if REQUEST:
957 messaging.IMessageSender(self).sendToBrowser(
958 'Email Test',
959 msg.replace("'", "\\'")
960 )
961 return self.callZenScreen(REQUEST)
962 else:
963 return msg
964
965
966 security.declareProtected(ZEN_CHANGE_SETTINGS, 'manage_pagerTest')
968 ''' Send a test page
969 '''
970 destSettings = self.getUserSettings(self.getId())
971 destPagers = [ x.strip() for x in
972 (destSettings.getPagerAddresses() or []) ]
973 msg = None
974 fqdn = socket.getfqdn()
975 srcId = self.getUser().getId()
976 testMsg = ('Test sent by %s' % srcId +
977 ' from the Zenoss installation on %s.' % fqdn)
978 for destPager in destPagers:
979 result, errorMsg = Utils.sendPage(destPager, testMsg,
980 self.dmd.pageCommand)
981 if result:
982 msg = 'Test page sent to %s' % ', '.join(destPagers)
983 else:
984 msg = 'Test failed: %s' % errorMsg
985 break
986 if not destPagers:
987 msg = 'Test page not sent, user has no pager number.'
988 if REQUEST:
989 messaging.IMessageSender(self).sendToBrowser(
990 'Pager Test', msg)
991 return self.callZenScreen(REQUEST)
992 else:
993 return msg
994
996 """patch to export all user configuration
997 """
998 for o in self.objectValues():
999 if hasattr(aq_base(o), 'exportXml'):
1000 o.exportXml(ofile, ignorerels)
1001
1003 if self.pager.strip():
1004 return [self.pager.strip()]
1005 return []
1006
1011
1021
1023
1024 meta_type = 'GroupSettings'
1025
1026 factory_type_information = (
1027 {
1028 'immediate_view' : 'editGroupSettings',
1029 'actions' :
1030 (
1031 {'name' : 'Edit',
1032 'action' : 'editGroupSettings',
1033 'permissions' : (ZEN_CHANGE_SETTINGS,),
1034 },
1035 {'name' : 'Administered Objects',
1036 'action' : 'administeredDevices',
1037 'permissions' : (ZEN_CHANGE_ADMIN_OBJECTS,)
1038 },
1039 {'name' : 'Event Views',
1040 'action' : 'editEventViews',
1041
1042 'permissions' : (ZEN_CHANGE_SETTINGS,),
1043 },
1044 {'name' : 'Alerting Rules',
1045 'action' : 'editActionRules',
1046 'permissions' : (ZEN_CHANGE_ALERTING_RULES,),
1047 },
1048 )
1049 },
1050 )
1051
1052 security = ClassSecurityInfo()
1053
1055 return self.zport.acl_users.groupManager
1056
1057
1059 """This is a group we never have roles. This is set to false so that
1060 fuctionality that would normally be taken away for a restricted user is
1061 left in.
1062 """
1063 return False
1064
1065
1066 security.declareProtected(ZEN_MANAGE_DMD, 'manage_addUsersToGroup')
1080
1081 security.declareProtected(ZEN_MANAGE_DMD, 'manage_deleteUserFromGroup')
1083 self._getG().removePrincipalFromGroup( userid, self.id )
1084
1085 security.declareProtected(ZEN_MANAGE_DMD, 'manage_deleteUsersFromGroup')
1097
1101
1103 return [ u[0] for u in self._getG().listAssignedPrincipals(self.id) ]
1104
1107
1113
1119
1120
1121 InitializeClass(UserSettingsManager)
1122 InitializeClass(UserSettings)
1123