Advertisement
Guest User

Untitled

a guest
May 28th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 47.23 KB | None | 0 0
  1. #!/usr/bin/python
  2.  
  3. import sys
  4. import os.path
  5. import traceback
  6.  
  7. import gobject
  8. import gtk
  9.  
  10. from samba import credentials
  11. from samba.dcerpc import samr
  12. from samba.dcerpc import security
  13. from samba.dcerpc import lsa
  14.  
  15. from objects import User
  16. from objects import Group
  17.  
  18. from dialogs import SAMConnectDialog
  19. from dialogs import UserEditDialog
  20. from dialogs import GroupEditDialog
  21. from dialogs import AboutDialog
  22.  
  23.  
  24. class SAMPipeManager:
  25.    
  26.     def __init__(self, server_address, transport_type, username, password):
  27.         self.user_list = []
  28.         self.group_list = []
  29.        
  30.         creds = credentials.Credentials()
  31.         if (username.count("\\") > 0):
  32.             creds.set_domain(username.split("\\")[0])
  33.             creds.set_username(username.split("\\")[1])
  34.         elif (username.count("@") > 0):
  35.             creds.set_domain(username.split("@")[1])
  36.             creds.set_username(username.split("@")[0])
  37.         else:
  38.             creds.set_domain("")
  39.             creds.set_username(username)
  40.         creds.set_workstation("")
  41.         creds.set_password(password)
  42.        
  43.         binding = ["ncacn_np:%s", "ncacn_ip_tcp:%s", "ncalrpc:%s"][transport_type]
  44.        
  45.         self.pipe = samr.samr(binding % (server_address), credentials = creds)
  46.         self.connect_handle = self.pipe.Connect2(None, security.SEC_FLAG_MAXIMUM_ALLOWED)
  47.        
  48.         #TODO: remove this, this was only for testing
  49.         self.last = None
  50.        
  51.     def close(self):
  52.         if (self.pipe != None):
  53.             self.pipe.Close(self.connect_handle)
  54.            
  55.     def fetch_and_get_domain_names(self):
  56.         if (self.pipe == None): # not connected
  57.             return None
  58.        
  59.         domain_name_list = []
  60.        
  61.         self.sam_domains = self.toArray(self.pipe.EnumDomains(self.connect_handle, 0, -1))
  62.         for (rid, domain_name) in self.sam_domains:
  63.             domain_name_list.append(self.get_lsa_string(domain_name))
  64.        
  65.         return domain_name_list
  66.    
  67.     def set_current_domain(self, domain_index):
  68.         self.domain = self.sam_domains[domain_index]
  69.        
  70.         self.domain_sid = self.pipe.LookupDomain(self.connect_handle, self.domain[1])
  71.         self.domain_handle = self.pipe.OpenDomain(self.connect_handle, security.SEC_FLAG_MAXIMUM_ALLOWED, self.domain_sid)
  72.        
  73.     def fetch_users_and_groups(self):
  74.         del self.user_list[:]
  75.         del self.group_list[:]
  76.        
  77.         # fetch groups
  78.         self.sam_groups = self.toArray(self.pipe.EnumDomainGroups(self.domain_handle, 0, -1))
  79.        
  80.         for (rid, groupname) in self.sam_groups:
  81.             group = self.fetch_group(rid)
  82.             self.group_list.append(group)
  83.            
  84.         # fetch users
  85.         self.sam_users = self.toArray(self.pipe.EnumDomainUsers(self.domain_handle, 0, 0, -1))
  86.        
  87.         for (rid, username) in self.sam_users:
  88.             user = self.fetch_user(rid)
  89.             self.user_list.append(user)
  90.  
  91.        
  92.     def add_user(self, user):
  93.         """Creates 'user' on the remote computer. This function will update user's RID.
  94.        
  95.        Returns 'user' with updated RID"""
  96.        
  97.         #Creates the new user on the server using default values for everything. Only the username is taken into account here.
  98.         (user_handle, rid) = self.pipe.CreateUser(self.domain_handle, self.set_lsa_string(user.username), security.SEC_FLAG_MAXIMUM_ALLOWED)        
  99.         new_user = self.fetch_user(rid)
  100.        
  101.         user.rid = rid #update the user's RID
  102.         if user.group_list == []: #The user must be part of a group. If the user is not part of any groups, the user is actually part of the "None" group!
  103.             user.group_list = new_user.group_list #use the default values assigned to the user when it was created on the server, which is probably "None"
  104.        
  105.         self.update_user(user) #send the other user information to the server.
  106.         user = self.fetch_user(rid, user) # just to make sure we have the updated user properties
  107.         self.user_list.append(user)
  108.        
  109.         return user
  110.  
  111.     def add_group(self, group):
  112.         (group_handle, rid) = self.pipe.CreateDomainGroup(self.domain_handle, self.set_lsa_string(group.name), security.SEC_FLAG_MAXIMUM_ALLOWED)        
  113.         group.rid = rid
  114.         group = self.fetch_group(rid, group)
  115.        
  116.         self.update_group(group)
  117.         group = self.fetch_group(rid, group) # just to make sure we have the updated group properties
  118.        
  119.        
  120.         self.group_list.append(group)
  121.  
  122.     def update_user(self, user):
  123.         """Submit any changes to 'user' to the server. The User's RID must be correct for this to work.
  124.        
  125.        """
  126.         user_handle = self.pipe.OpenUser(self.domain_handle, security.SEC_FLAG_MAXIMUM_ALLOWED, user.rid)
  127.  
  128.         info = self.pipe.QueryUserInfo(user_handle, samr.UserNameInformation)
  129.         #info.account_name = self.set_lsa_string(user.username) #Account name should never be changed.
  130.         info.full_name = self.set_lsa_string(user.fullname)
  131.         self.pipe.SetUserInfo(user_handle, samr.UserNameInformation, info)
  132.        
  133.         info = self.pipe.QueryUserInfo(user_handle, samr.UserAdminCommentInformation)
  134.         info.description = self.set_lsa_string(user.description)
  135.         self.pipe.SetUserInfo(user_handle, samr.UserAdminCommentInformation, info)
  136.        
  137.         info = self.pipe.QueryUserInfo(user_handle, samr.UserControlInformation)
  138.         if (user.must_change_password):
  139.             info.acct_flags |= 0x00020000
  140.         else:
  141.             info.acct_flags &= ~0x00020000
  142.  
  143.         if (user.password_never_expires):
  144.             info.acct_flags |= 0x00000200
  145.         else:
  146.             info.acct_flags &= ~0x00000200
  147.            
  148.         if (user.account_disabled):
  149.             info.acct_flags |= 0x00000001
  150.         else:
  151.             info.acct_flags &= ~0x00000001
  152.  
  153.         if (user.account_locked_out):
  154.             info.acct_flags |= 0x00000400
  155.         else:
  156.             info.acct_flags &= ~0x00000400
  157.         self.pipe.SetUserInfo(user_handle, samr.UserControlInformation, info)
  158.            
  159.         # TODO: cannot_change_password
  160.  
  161.         info = self.pipe.QueryUserInfo(user_handle, samr.UserProfileInformation)
  162.         info.profile_path = self.set_lsa_string(user.profile_path)
  163.         self.pipe.SetUserInfo(user_handle, samr.UserProfileInformation, info)
  164.        
  165.         info = self.pipe.QueryUserInfo(user_handle, samr.UserScriptInformation)
  166.         info.logon_script = self.set_lsa_string(user.logon_script)
  167.         self.pipe.SetUserInfo(user_handle, samr.UserScriptInformation, info)
  168.  
  169.         info = self.pipe.QueryUserInfo(user_handle, samr.UserHomeInformation)
  170.         info.home_directory = self.set_lsa_string(user.homedir_path)
  171.        
  172.        
  173.         if (user.map_homedir_drive == -1):
  174.             info.home_drive = self.set_lsa_string("")
  175.         else:
  176.             info.home_drive = self.set_lsa_string(chr(user.map_homedir_drive + ord('A')) + ":")
  177.         self.pipe.SetUserInfo(user_handle, samr.UserHomeInformation, info)
  178.        
  179.        
  180.         # get the user's old groups list
  181.         group_list = self.rwa_list_to_group_list(self.pipe.GetGroupsForUser(user_handle).rids)
  182.  
  183.         # remove the user from groups
  184.         for group in group_list:
  185.             if (user.group_list.count(group) == 0):
  186.                 group_handle = self.pipe.OpenGroup(self.domain_handle, security.SEC_FLAG_MAXIMUM_ALLOWED, group.rid)
  187.                 self.pipe.DeleteGroupMember(group_handle, user.rid)
  188.  
  189.         # add the user to groups
  190.         for group in user.group_list:
  191.             if (group_list.count(group) == 0):
  192.                 group_handle = self.pipe.OpenGroup(self.domain_handle, security.SEC_FLAG_MAXIMUM_ALLOWED, group.rid)
  193.                 self.pipe.AddGroupMember(group_handle, user.rid, samr.SE_GROUP_ENABLED)
  194.  
  195.     def update_group(self, group):
  196.         group_handle = self.pipe.OpenGroup(self.domain_handle, security.SEC_FLAG_MAXIMUM_ALLOWED, group.rid)
  197.  
  198.         info = self.set_lsa_string(group.name)
  199.         self.pipe.SetGroupInfo(group_handle, 2, info)
  200.        
  201.         info = self.set_lsa_string(group.description)
  202.         self.pipe.SetGroupInfo(group_handle, 4, info)
  203.        
  204.     def delete_user(self, user):
  205.         user_handle = self.pipe.OpenUser(self.domain_handle, security.SEC_FLAG_MAXIMUM_ALLOWED, user.rid)
  206.         self.pipe.DeleteUser(user_handle)
  207.  
  208.     def delete_group(self, group):
  209.         group_handle = self.pipe.OpenGroup(self.domain_handle, security.SEC_FLAG_MAXIMUM_ALLOWED, group.rid)
  210.         self.pipe.DeleteDomainGroup(group_handle)
  211.    
  212.     def fetch_user(self, rid, user = None):
  213.         """Fetch the User whose RID is 'rid'. A new User is created if the 'user' argument is left out.
  214.        
  215.        Returns a User"""
  216.         user_handle = self.pipe.OpenUser(self.domain_handle, security.SEC_FLAG_MAXIMUM_ALLOWED, rid)
  217.         info = self.pipe.QueryUserInfo(user_handle, samr.UserAllInformation)
  218.         user = self.info_to_user(info, user)
  219.         group_rwa_list = self.pipe.GetGroupsForUser(user_handle).rids
  220.         user.group_list = self.rwa_list_to_group_list(group_rwa_list)
  221.        
  222.         return user
  223.    
  224.     def fetch_group(self, rid, group = None):
  225.         group_handle = self.pipe.OpenGroup(self.domain_handle, security.SEC_FLAG_MAXIMUM_ALLOWED, rid)
  226.         info = self.pipe.QueryGroupInfo(group_handle, 1)
  227.         group = self.info_to_group(info, group)
  228.         group.rid = rid
  229.        
  230.         return group
  231.    
  232.     def info_to_user(self, query_info, user = None):
  233.         """Converts 'query_info' information into a user type. Values in 'user' will be overwriten by this function. If called with 'None' then a new user will be created
  234.        
  235.        returns 'user'"""
  236.         if (user == None):
  237.             user = User(self.get_lsa_string(query_info.account_name),
  238.                         self.get_lsa_string(query_info.full_name),
  239.                         self.get_lsa_string(query_info.description),
  240.                         query_info.rid)
  241.         else:
  242.             user.username = self.get_lsa_string(query_info.account_name)
  243.             user.full_name = self.get_lsa_string(query_info.full_name)
  244.             user.description = self.get_lsa_string(query_info.description)
  245.             user.rid = query_info.rid
  246.        
  247.         user.must_change_password = (query_info.acct_flags & 0x00020000) != 0
  248.         user.password_never_expires = (query_info.acct_flags & 0x00000200) != 0
  249.         user.account_disabled = (query_info.acct_flags & 0x00000001) != 0
  250.         user.account_locked_out = (query_info.acct_flags & 0x00000400) != 0
  251.         user.profile_path = self.get_lsa_string(query_info.profile_path)
  252.         user.logon_script = self.get_lsa_string(query_info.logon_script)
  253.         user.homedir_path = self.get_lsa_string(query_info.home_directory)
  254.        
  255.        
  256.         #TODO: user cannot change password
  257.         if query_info.rid == 1035:
  258.             if self.last != None:
  259.                 changed = False
  260.                 changed |= (self.last.last_logon != query_info.last_logon)
  261.                 changed |= (self.last.last_logoff != query_info.last_logoff)
  262.                 changed |= (self.last.last_password_change != query_info.last_password_change)
  263.                 changed |= (self.last.acct_expiry != query_info.acct_expiry)
  264.                 changed |= (self.last.allow_password_change != query_info.allow_password_change)
  265.                 changed |= (self.last.force_password_change != query_info.force_password_change)
  266.                 changed |= (self.last.comment != query_info.comment)
  267.                 changed |= (False)
  268.                 print str(changed)
  269.             print query_info.unknown3
  270.             self.last = query_info #so we can check if anything is new next time
  271.             pass
  272.            
  273.        
  274.         drive = self.get_lsa_string(query_info.home_drive)
  275.         if (len(drive) == 2):
  276.             user.map_homedir_drive = ord(drive[0]) - ord('A')
  277.         else:
  278.             user.map_homedir_drive = -1
  279.            
  280.         return user
  281.    
  282.     def rwa_list_to_group_list(self, rwa_list):
  283.         group_list = []
  284.        
  285.         for rwa in rwa_list:
  286.             group_rid = rwa.rid
  287.             group_to_add = None
  288.            
  289.             for group in self.group_list:
  290.                 if (group.rid == group_rid):
  291.                     group_to_add = group
  292.                     break
  293.                
  294.             if (group_to_add != None):
  295.                 group_list.append(group_to_add)
  296.             else:
  297.                 raise Exception("group not found for rid = %d" % group_rid)
  298.            
  299.         return group_list
  300.  
  301.     def info_to_group(self, query_info, group = None):
  302.         if (group == None):
  303.             group = Group(self.get_lsa_string(query_info.name),
  304.                           self.get_lsa_string(query_info.description),  
  305.                           0)
  306.         else:
  307.             group.name = self.get_lsa_string(query_info.name)
  308.             group.description = self.get_lsa_string(query_info.description)
  309.        
  310.         return group
  311.  
  312.     @staticmethod
  313.     def toArray((handle, array, num_entries)):
  314.         ret = []
  315.         for x in range(num_entries):
  316.             ret.append((array.entries[x].idx, array.entries[x].name))
  317.         return ret
  318.  
  319.     @staticmethod
  320.     def get_lsa_string(str):
  321.         return str.string
  322.    
  323.     @staticmethod
  324.     def set_lsa_string(str):
  325.         lsa_string = lsa.String()
  326.         lsa_string.string = unicode(str)
  327.         lsa_string.length = len(str)
  328.         lsa_string.size = len(str)
  329.        
  330.         return lsa_string
  331.    
  332.  
  333. class SAMWindow(gtk.Window):
  334.  
  335.     def __init__(self):
  336.         super(SAMWindow, self).__init__()
  337.  
  338.         self.create()
  339.        
  340.         self.pipe_manager = None
  341.         self.users_groups_notebook_page_num = 0
  342.         self.server_address = "192.168.2.100"
  343.         self.transport_type = 0
  344.         self.username = "shatterz"
  345.         self.domain_index = 0;
  346.        
  347.         self.update_captions()
  348.         self.update_sensitivity()
  349.        
  350.         #present the connection dialog first, since that's probably what the user wants to do
  351.         self.on_connect_item_activate(None)
  352.        
  353.        
  354.     def create(self):
  355.        
  356.         # main window        
  357.  
  358.         accel_group = gtk.AccelGroup()
  359.        
  360.         self.set_title("User/Group Management")
  361.         self.set_default_size(800, 600)
  362.         self.connect("delete_event", self.on_self_delete)
  363.         self.icon_filename = os.path.join(sys.path[0], "images", "group.png")
  364.         self.user_icon_filename = os.path.join(sys.path[0], "images", "user.png")
  365.         self.group_icon_filename = os.path.join(sys.path[0], "images", "group.png")
  366.         self.icon_pixbuf = gtk.gdk.pixbuf_new_from_file(self.icon_filename)
  367.         self.set_icon(self.icon_pixbuf)
  368.         self.connect("key-press-event", self.on_key_press) #to handle key presses
  369.        
  370.         vbox = gtk.VBox(False, 0)
  371.         self.add(vbox)
  372.  
  373.  
  374.         # menu
  375.        
  376.         menubar = gtk.MenuBar()
  377.         vbox.pack_start(menubar, False, False, 0)
  378.        
  379.  
  380.         self.file_item = gtk.MenuItem("_File")
  381.         menubar.add(self.file_item)
  382.        
  383.         file_menu = gtk.Menu()
  384.         self.file_item.set_submenu(file_menu)
  385.        
  386.         self.connect_item = gtk.ImageMenuItem(gtk.STOCK_CONNECT, accel_group)
  387.         file_menu.add(self.connect_item)
  388.        
  389.         self.disconnect_item = gtk.ImageMenuItem(gtk.STOCK_DISCONNECT, accel_group)
  390.         self.disconnect_item.set_sensitive(False)
  391.         file_menu.add(self.disconnect_item)
  392.        
  393.         self.sel_domain_item = gtk.MenuItem("_Select Domain", accel_group)
  394.         self.sel_domain_item.set_sensitive(False)
  395.         file_menu.add(self.sel_domain_item)
  396.        
  397.         menu_separator_item = gtk.SeparatorMenuItem()
  398.         menu_separator_item.set_sensitive(False)
  399.         file_menu.add(menu_separator_item)
  400.        
  401.         self.quit_item = gtk.ImageMenuItem(gtk.STOCK_QUIT, accel_group)
  402.         file_menu.add(self.quit_item)
  403.        
  404.        
  405.         self.view_item = gtk.MenuItem("_View")
  406.         menubar.add(self.view_item)
  407.        
  408.         view_menu = gtk.Menu()
  409.         self.view_item.set_submenu(view_menu)
  410.        
  411.         self.refresh_item = gtk.ImageMenuItem(gtk.STOCK_REFRESH, accel_group)
  412.         self.refresh_item.set_sensitive(False)
  413.         view_menu.add(self.refresh_item)
  414.        
  415.        
  416.         self.user_group_item = gtk.MenuItem("_User")
  417.         menubar.add(self.user_group_item)
  418.        
  419.         user_group_menu = gtk.Menu()
  420.         self.user_group_item.set_submenu(user_group_menu)
  421.  
  422.         self.new_item = gtk.ImageMenuItem(gtk.STOCK_NEW, accel_group)
  423.         self.new_item.set_sensitive(False)
  424.         user_group_menu.add(self.new_item)
  425.  
  426.         self.delete_item = gtk.ImageMenuItem(gtk.STOCK_DELETE, accel_group)
  427.         self.delete_item.set_sensitive(False)
  428.         user_group_menu.add(self.delete_item)
  429.  
  430.         self.edit_item = gtk.ImageMenuItem(gtk.STOCK_EDIT, accel_group)
  431.         self.edit_item.set_sensitive(False)
  432.         user_group_menu.add(self.edit_item)
  433.  
  434.        
  435.         self.policies_item = gtk.MenuItem("_Policies")
  436.         # menubar.add(self.policies_item) TODO: implement policies functionality
  437.  
  438.         policies_menu = gtk.Menu()
  439.         self.policies_item.set_submenu(policies_menu)
  440.        
  441.         self.user_rights_item = gtk.MenuItem("_User Rights...", accel_group)
  442.         self.user_rights_item.set_sensitive(False)
  443.         policies_menu.add(self.user_rights_item)
  444.  
  445.         self.audit_item = gtk.MenuItem("A_udit...", accel_group)
  446.         self.audit_item.set_sensitive(False)
  447.         policies_menu.add(self.audit_item)
  448.  
  449.         menu_separator_item = gtk.SeparatorMenuItem()
  450.         menu_separator_item.set_sensitive(False)
  451.         policies_menu.add(menu_separator_item)
  452.        
  453.         self.trust_relations_item = gtk.MenuItem("_Trust relations", accel_group)
  454.         self.trust_relations_item.set_sensitive(False)
  455.         policies_menu.add(self.trust_relations_item)
  456.        
  457.        
  458.         self.help_item = gtk.MenuItem("_Help")
  459.         menubar.add(self.help_item)
  460.  
  461.         help_menu = gtk.Menu()
  462.         self.help_item.set_submenu(help_menu)
  463.  
  464.         self.about_item = gtk.ImageMenuItem(gtk.STOCK_ABOUT, accel_group)
  465.         help_menu.add(self.about_item)
  466.        
  467.        
  468.         # toolbar
  469.        
  470.         toolbar = gtk.Toolbar()
  471.         vbox.pack_start(toolbar, False, False, 0)
  472.        
  473.         self.connect_button = gtk.ToolButton(gtk.STOCK_CONNECT)
  474.         self.connect_button.set_is_important(True)
  475.         self.connect_button.set_tooltip_text("Connect to a server")
  476.         toolbar.insert(self.connect_button, 0)
  477.        
  478.         self.disconnect_button = gtk.ToolButton(gtk.STOCK_DISCONNECT)
  479.         self.disconnect_button.set_is_important(True)
  480.         self.disconnect_button.set_tooltip_text("Disconnect from the server")
  481.         toolbar.insert(self.disconnect_button, 1)
  482.        
  483.         toolbar.insert(gtk.SeparatorToolItem(), 2)
  484.        
  485.         self.new_button = gtk.ToolButton(gtk.STOCK_NEW)
  486.         self.new_button.set_is_important(True)
  487.         toolbar.insert(self.new_button, 3)
  488.                
  489.         self.edit_button = gtk.ToolButton(gtk.STOCK_EDIT)
  490.         self.edit_button.set_is_important(True)
  491.         toolbar.insert(self.edit_button, 4)
  492.                
  493.         self.delete_button = gtk.ToolButton(gtk.STOCK_DELETE)
  494.         self.delete_button.set_is_important(True)
  495.         toolbar.insert(self.delete_button, 5)
  496.                
  497.        
  498.         # user list
  499.        
  500.         self.users_groups_notebook = gtk.Notebook()
  501.         vbox.pack_start(self.users_groups_notebook, True, True, 0)
  502.        
  503.         scrolledwindow = gtk.ScrolledWindow(None, None)
  504.         scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
  505.         scrolledwindow.set_shadow_type(gtk.SHADOW_IN)
  506.         self.users_groups_notebook.append_page(scrolledwindow, gtk.Label("Users"))
  507.        
  508.         self.users_tree_view = gtk.TreeView()        
  509.         scrolledwindow.add(self.users_tree_view)
  510.        
  511.         column = gtk.TreeViewColumn()
  512.         column.set_title("")
  513.         renderer = gtk.CellRendererPixbuf()
  514.         renderer.set_property("pixbuf", gtk.gdk.pixbuf_new_from_file_at_size(self.user_icon_filename, 22, 22))
  515.         column.pack_start(renderer, True)
  516.         self.users_tree_view.append_column(column)
  517.                
  518.         column = gtk.TreeViewColumn()
  519.         column.set_title("Name")
  520.         column.set_resizable(True)
  521.         column.set_sort_column_id(0)
  522.         renderer = gtk.CellRendererText()
  523.         column.pack_start(renderer, True)
  524.         self.users_tree_view.append_column(column)
  525.         column.add_attribute(renderer, "text", 0)
  526.                
  527.         column = gtk.TreeViewColumn()
  528.         column.set_title("Full Name")
  529.         column.set_resizable(True)
  530.         column.set_sort_column_id(1)
  531.         renderer = gtk.CellRendererText()
  532.         column.pack_start(renderer, True)
  533.         self.users_tree_view.append_column(column)
  534.         column.add_attribute(renderer, "text", 1)
  535.        
  536.         column = gtk.TreeViewColumn()
  537.         column.set_title("Description")
  538.         column.set_resizable(True)
  539.         column.set_sort_column_id(2)
  540.         renderer = gtk.CellRendererText()
  541.         column.pack_start(renderer, True)
  542.         self.users_tree_view.append_column(column)
  543.         column.add_attribute(renderer, "text", 2)
  544.        
  545.         column = gtk.TreeViewColumn()
  546.         column.set_title("RID")
  547.         column.set_resizable(True)
  548.         column.set_sort_column_id(3)
  549.         renderer = gtk.CellRendererText()
  550.         column.pack_start(renderer, True)
  551.         self.users_tree_view.append_column(column)
  552.         column.add_attribute(renderer, "text", 3)
  553.        
  554.         self.users_store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_INT)
  555.         self.users_store.set_sort_column_id(0, gtk.SORT_ASCENDING)
  556.         self.users_tree_view.set_model(self.users_store)
  557.  
  558.  
  559.         # group list
  560.  
  561.         scrolledwindow = gtk.ScrolledWindow(None, None)
  562.         scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
  563.         scrolledwindow.set_shadow_type(gtk.SHADOW_IN)
  564.         self.users_groups_notebook.append_page(scrolledwindow, gtk.Label("Groups"))
  565.        
  566.         self.groups_tree_view = gtk.TreeView()
  567.         scrolledwindow.add(self.groups_tree_view)
  568.        
  569.         column = gtk.TreeViewColumn()
  570.         column.set_title("Icon")
  571.         renderer = gtk.CellRendererPixbuf()
  572.         renderer.set_property("pixbuf", gtk.gdk.pixbuf_new_from_file_at_size(self.group_icon_filename, 22, 22))
  573.         column.pack_start(renderer, True)
  574.         self.groups_tree_view.append_column(column)
  575.  
  576.         column = gtk.TreeViewColumn()
  577.         column.set_title("Name")
  578.         column.set_resizable(True)
  579.         column.set_sort_column_id(0)
  580.         renderer = gtk.CellRendererText()
  581.         column.pack_start(renderer, True)
  582.         self.groups_tree_view.append_column(column)
  583.         column.add_attribute(renderer, "text", 0)
  584.                
  585.         column = gtk.TreeViewColumn()
  586.         column.set_title("Description")
  587.         column.set_resizable(True)
  588.         column.set_sort_column_id(1)
  589.         column.set_expand(True)
  590.         renderer = gtk.CellRendererText()
  591.         column.pack_start(renderer, True)
  592.         self.groups_tree_view.append_column(column)
  593.         column.add_attribute(renderer, "text", 1)
  594.        
  595.         column = gtk.TreeViewColumn()
  596.         column.set_title("RID")
  597.         column.set_resizable(True)
  598.         column.set_sort_column_id(2)
  599.         renderer = gtk.CellRendererText()
  600.         column.pack_start(renderer, True)
  601.         self.groups_tree_view.append_column(column)
  602.         column.add_attribute(renderer, "text", 2)
  603.  
  604.         self.groups_store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_INT)
  605.         self.groups_store.set_sort_column_id(0, gtk.SORT_ASCENDING)
  606.         self.groups_tree_view.set_model(self.groups_store)
  607.  
  608.  
  609.         # status bar
  610.  
  611.         self.statusbar = gtk.Statusbar()
  612.         self.statusbar.set_has_resize_grip(True)
  613.         vbox.pack_start(self.statusbar, False, False, 0)
  614.        
  615.        
  616.         # signals/events
  617.        
  618.         self.connect_item.connect("activate", self.on_connect_item_activate)
  619.         self.disconnect_item.connect("activate", self.on_disconnect_item_activate)
  620.         self.sel_domain_item.connect("activate", self.on_sel_domain_item_activate)
  621.         self.quit_item.connect("activate", self.on_quit_item_activate)
  622.         self.refresh_item.connect("activate", self.on_refresh_item_activate)
  623.         self.new_item.connect("activate", self.on_new_item_activate)
  624.         self.delete_item.connect("activate", self.on_delete_item_activate)
  625.         self.edit_item.connect("activate", self.on_edit_item_activate)
  626.         self.user_rights_item.connect("activate", self.on_user_rights_item_activate)
  627.         self.audit_item.connect("activate", self.on_audit_item_activate)
  628.         self.trust_relations_item.connect("activate", self.on_trust_relations_item_activate)        
  629.         self.about_item.connect("activate", self.on_about_item_activate)
  630.        
  631.         self.connect_button.connect("clicked", self.on_connect_item_activate)
  632.         self.disconnect_button.connect("clicked", self.on_disconnect_item_activate)
  633.         self.new_button.connect("clicked", self.on_new_item_activate)
  634.         self.delete_button.connect("clicked", self.on_delete_item_activate)
  635.         self.edit_button.connect("clicked", self.on_edit_item_activate)
  636.        
  637.         self.users_tree_view.get_selection().connect("changed", self.on_update_sensitivity)
  638.         self.users_tree_view.connect("button_press_event", self.on_users_tree_view_button_press)
  639.         self.groups_tree_view.get_selection().connect("changed", self.on_update_sensitivity)
  640.         self.groups_tree_view.connect("button_press_event", self.on_groups_tree_view_button_press)
  641.         self.users_groups_notebook.connect("switch-page", self.on_users_groups_notebook_switch_page)
  642.        
  643.         self.add_accel_group(accel_group)
  644.        
  645.        
  646.        
  647.        
  648.     def on_key_press(self, widget, event):
  649.         if event.keyval == gtk.keysyms.F5:
  650.             self.on_refresh_item_activate(None)
  651.         elif event.keyval == gtk.keysyms.Delete:
  652.             self.on_delete_item_activate(None)
  653.  
  654.     def refresh_user_list_view(self):
  655.         if not self.connected():
  656.             return None
  657.        
  658.         (model, paths) = self.users_tree_view.get_selection().get_selected_rows()
  659.        
  660.         self.users_store.clear()
  661.         for user in self.pipe_manager.user_list:
  662.             self.users_store.append(user.list_view_representation())
  663.  
  664.         if (len(paths) > 0):
  665.             self.users_tree_view.get_selection().select_path(paths[0])
  666.  
  667.     def refresh_group_list_view(self):
  668.         if not self.connected():
  669.             return None
  670.        
  671.         (model, paths) = self.groups_tree_view.get_selection().get_selected_rows()
  672.  
  673.         self.groups_store.clear()
  674.         for group in self.pipe_manager.group_list:
  675.             self.groups_store.append(group.list_view_representation())
  676.            
  677.         if (len(paths) > 0):
  678.             self.groups_tree_view.get_selection().select_path(paths[0])
  679.  
  680.     def get_selected_user(self):
  681.         if not self.connected():
  682.             return None
  683.        
  684.         (model, iter) = self.users_tree_view.get_selection().get_selected()
  685.         if (iter == None): # no selection
  686.             return None
  687.         else:            
  688.             username = model.get_value(iter, 0)
  689.             user_list = [user for user in self.pipe_manager.user_list if user.username == username]
  690.             if (len(user_list) > 0):
  691.                 return user_list[0]
  692.             else:
  693.                 return None
  694.  
  695.     def get_selected_group(self):
  696.         if not self.connected():
  697.             return None
  698.        
  699.         (model, iter) = self.groups_tree_view.get_selection().get_selected()
  700.         if (iter == None): # no selection
  701.             return None
  702.         else:            
  703.             name = model.get_value(iter, 0)
  704.             group_list = [group for group in self.pipe_manager.group_list if group.name == name]
  705.             if (len(group_list) > 0):
  706.                 return group_list[0]
  707.             else:
  708.                 return None
  709.  
  710.     def set_status(self, message):
  711.         self.statusbar.pop(0)
  712.         self.statusbar.push(0, message)
  713.        
  714.     def update_sensitivity(self):
  715.         connected = (self.pipe_manager != None)
  716.         user_selected = (self.get_selected_user() != None)
  717.         group_selected = (self.get_selected_group() != None)
  718.         selected = [user_selected, group_selected][self.users_groups_notebook_page_num]
  719.        
  720.         self.connect_item.set_sensitive(not connected)
  721.         self.disconnect_item.set_sensitive(connected)
  722.         self.sel_domain_item.set_sensitive(connected)
  723.         self.refresh_item.set_sensitive(connected)
  724.         self.new_item.set_sensitive(connected)
  725.         self.delete_item.set_sensitive(connected and selected)
  726.         self.edit_item.set_sensitive(connected and selected)
  727.         self.user_rights_item.set_sensitive(connected)
  728.         self.audit_item.set_sensitive(connected)
  729.         self.trust_relations_item.set_sensitive(connected)
  730.  
  731.         self.connect_button.set_sensitive(not connected)
  732.         self.disconnect_button.set_sensitive(connected)
  733.         self.new_button.set_sensitive(connected)
  734.         self.delete_button.set_sensitive(connected and selected)
  735.         self.edit_button.set_sensitive(connected and selected)
  736.  
  737.     def update_captions(self):
  738.         self.user_group_item.get_child().set_text(["Users", "Groups"][self.users_groups_notebook_page_num > 0])
  739.         self.new_button.set_tooltip_text(["Create a new user", "Create a new group"][self.users_groups_notebook_page_num > 0])
  740.         self.edit_button.set_tooltip_text(["Edit user's properties", "Edit group's properties"][self.users_groups_notebook_page_num > 0])
  741.         self.delete_button.set_tooltip_text(["Delete the user", "Delete the group"][self.users_groups_notebook_page_num > 0])
  742.  
  743.     def run_message_dialog(self, type, buttons, message, parent = None):
  744.         if (parent == None):
  745.             parent = self
  746.        
  747.         message_box = gtk.MessageDialog(parent, gtk.DIALOG_MODAL, type, buttons, message)
  748.         response = message_box.run()
  749.         message_box.hide()
  750.        
  751.         return response
  752.  
  753.     def run_user_edit_dialog(self, user = None, apply_callback = None):
  754.         dialog = UserEditDialog(self.pipe_manager, user)
  755.         dialog.show_all()
  756.        
  757.         # loop to handle the applies
  758.         while True:
  759.             response_id = dialog.run()
  760.            
  761.             if (response_id in [gtk.RESPONSE_OK, gtk.RESPONSE_APPLY]):
  762.                 problem_msg = dialog.check_for_problems()
  763.                
  764.                 if (problem_msg != None):
  765.                     self.run_message_dialog(gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, problem_msg, dialog)
  766.                 else:
  767.                     dialog.values_to_user()
  768.                    
  769.                     if (apply_callback != None): #seems like there's only a callback when a user is modified, never when creating a new user.
  770.                         apply_callback(dialog.user)
  771.                         dialog.user_to_values()
  772.                        
  773.                     if (response_id == gtk.RESPONSE_OK):
  774.                         dialog.hide()
  775.                         break
  776.                        
  777.             else:
  778.                 dialog.hide()
  779.                 return None
  780.        
  781.         return dialog.user
  782.  
  783.     def run_group_edit_dialog(self, group = None, apply_callback = None):
  784.         dialog = GroupEditDialog(self.pipe_manager, group)
  785.         dialog.show_all()
  786.        
  787.         # loop to handle the applies
  788.         while True:
  789.             response_id = dialog.run()
  790.            
  791.             if (response_id in [gtk.RESPONSE_OK, gtk.RESPONSE_APPLY]):
  792.                 problem_msg = dialog.check_for_problems()
  793.                
  794.                 if (problem_msg != None):
  795.                     self.run_message_dialog(gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, problem_msg, dialog)
  796.                 else:
  797.                     dialog.values_to_group()
  798.                    
  799.                     if (apply_callback != None):
  800.                         apply_callback(dialog.thegroup)
  801.                         dialog.group_to_values()
  802.                                          
  803.                     if (response_id == gtk.RESPONSE_OK):
  804.                         dialog.hide()
  805.                         break
  806.            
  807.             else:
  808.                 dialog.hide()
  809.                 return None
  810.        
  811.         return dialog.thegroup
  812.  
  813.     def run_connect_dialog(self, pipe_manager, server_address, transport_type, username, domains = None):
  814.         dialog = SAMConnectDialog(server_address, transport_type, username)
  815.         dialog.show_all()
  816.        
  817.         if (domains == None):
  818.             # loop to handle the failures
  819.             while True:
  820.                 response_id = dialog.run()
  821.                
  822.                 if (response_id != gtk.RESPONSE_OK):
  823.                     dialog.hide()
  824.                     return None
  825.                 else:
  826.                     try:
  827.                         self.server_address = dialog.get_server_address()
  828.                         self.transport_type = dialog.get_transport_type()
  829.                         self.username = dialog.get_username()
  830.                         self.domain_index = 0
  831.                         password = dialog.get_password()
  832.                        
  833.                         pipe_manager = SAMPipeManager(self.server_address, self.transport_type, self.username, password)
  834.                         domains = pipe_manager.fetch_and_get_domain_names()
  835.                        
  836.                         break
  837.                    
  838.                     except RuntimeError, re:
  839.                         msg = "Failed to connect: " + re.args[1] + "."
  840.                         print msg
  841.                         traceback.print_exc()                        
  842.                         self.run_message_dialog(gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, msg, dialog)
  843.                        
  844.                     except Exception, ex:
  845.                         msg = "Failed to connect: " + str(ex) + "."
  846.                         print msg
  847.                         traceback.print_exc()
  848.                         self.run_message_dialog(gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, msg, dialog)
  849.  
  850.         dialog.set_domains(domains, self.domain_index)
  851.         response_id = dialog.run()
  852.         dialog.hide()
  853.        
  854.         if (response_id != gtk.RESPONSE_OK):
  855.             return None
  856.         else:
  857.             self.domain_index = dialog.get_domain_index()
  858.             pipe_manager.set_current_domain(self.domain_index)
  859.        
  860.         return pipe_manager
  861.    
  862.     def connected(self):
  863.         return self.pipe_manager != None
  864.    
  865.     def update_user_callback(self, user):
  866.         try:
  867.             self.pipe_manager.update_user(user)
  868.  
  869.             self.set_status("User '" + user.username + "' updated.")
  870.  
  871.         except RuntimeError, re:
  872.             msg = "Failed to update user: " + re.args[1] + "."
  873.             print msg
  874.             self.set_status(msg)
  875.             traceback.print_exc()
  876.             self.run_message_dialog(gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, msg)
  877.        
  878.         except Exception, ex:
  879.             msg = "Failed to update user: " + str(ex) + "."
  880.             print msg
  881.             self.set_status(msg)
  882.             traceback.print_exc()
  883.             self.run_message_dialog(gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, msg)
  884.        
  885.         finally:
  886.             self.pipe_manager.fetch_user(user.rid, user) # to make sure we have the updated user properties. This has caught bugs already!
  887.             self.refresh_user_list_view()
  888.  
  889.     def update_group_callback(self, group):
  890.         try:
  891.             self.pipe_manager.update_group(group)
  892.  
  893.             self.set_status("Group '" + group.name + "' updated.")
  894.  
  895.         except RuntimeError, re:
  896.             msg = "Failed to update group: " + re.args[1] + "."
  897.             print msg
  898.             self.set_status(msg)
  899.             traceback.print_exc()
  900.             self.run_message_dialog(gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, msg)
  901.        
  902.         except Exception, ex:
  903.             msg = "Failed to update group: " + str(ex) + "."
  904.             print msg
  905.             self.set_status(msg)
  906.             traceback.print_exc()
  907.             self.run_message_dialog(gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, msg)
  908.        
  909.         finally:
  910.             self.pipe_manager.fetch_group(group.rid, group) # just to make sure we have the updated group properties
  911.             self.refresh_group_list_view()
  912.            
  913.     def on_self_delete(self, widget, event):
  914.         if (self.pipe_manager != None):
  915.             self.on_disconnect_item_activate(self.disconnect_item)
  916.        
  917.         gtk.main_quit()
  918.         return False
  919.  
  920.     def on_connect_item_activate(self, widget):
  921.         try:
  922.             self.pipe_manager = self.run_connect_dialog(None, self.server_address, self.transport_type, self.username)
  923.             if (self.pipe_manager != None):
  924.                 self.pipe_manager.fetch_users_and_groups()
  925.                
  926.                 self.set_status("Connected to " + self.server_address + "/" + SAMPipeManager.get_lsa_string(self.pipe_manager.domain[1]) + ".")
  927.            
  928.         except RuntimeError, re:
  929.             msg = "Failed to open the selected domain: " + re.args[1] + "."
  930.             self.set_status(msg)
  931.             print msg
  932.             traceback.print_exc()
  933.             self.run_message_dialog(gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, msg)
  934.        
  935.         except Exception, ex:
  936.             msg = "Failed to open the selected domain: " + str(ex) + "."
  937.             self.set_status(msg)
  938.             print msg
  939.             traceback.print_exc()
  940.             self.run_message_dialog(gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, msg)
  941.        
  942.         self.refresh_user_list_view()
  943.         self.refresh_group_list_view()
  944.         self.update_sensitivity()
  945.        
  946.     def on_disconnect_item_activate(self, widget):
  947.         if (self.pipe_manager != None):
  948.             self.pipe_manager.close()
  949.             self.pipe_manager = None
  950.            
  951.         self.users_store.clear()
  952.         self.groups_store.clear()      
  953.         self.update_sensitivity()
  954.  
  955.         self.set_status("Disconnected.")
  956.    
  957.     def on_sel_domain_item_activate(self, widget):
  958.         try:
  959.             self.pipe_manager = self.run_connect_dialog(self.pipe_manager, self.server_address, self.transport_type, self.username, self.pipe_manager.fetch_and_get_domain_names())
  960.             if (self.pipe_manager != None):
  961.                 self.pipe_manager.fetch_users_and_groups()
  962.                
  963.                 self.set_status("Connected to " + self.server_address + "/" + SAMPipeManager.get_lsa_string(self.pipe_manager.domain[1]) + ".")
  964.        
  965.         except RuntimeError, re:
  966.             msg = "Failed to open the selected domain: " + re.args[1] + "."
  967.             self.set_status(msg)
  968.             print msg
  969.             traceback.print_exc()
  970.             self.run_message_dialog(gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, msg)
  971.        
  972.         except Exception, ex:
  973.             msg = "Failed to open the selected domain: " + str(ex) + "."
  974.             self.set_status(msg)
  975.             print msg
  976.             traceback.print_exc()
  977.             self.run_message_dialog(gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, msg)
  978.        
  979.         self.refresh_user_list_view()
  980.         self.refresh_group_list_view()
  981.         self.update_sensitivity()
  982.  
  983.     def on_quit_item_activate(self, widget):
  984.         self.on_self_delete(None, None)
  985.    
  986.     def on_refresh_item_activate(self, widget):
  987.         try:
  988.             self.pipe_manager.fetch_users_and_groups()
  989.            
  990.             self.set_status("Connected to " + self.server_address + "/" + SAMPipeManager.get_lsa_string(self.pipe_manager.domain[1]) + ".")
  991.            
  992.         except RuntimeError, re:
  993.             msg = "Failed to refresh SAM info: " + re.args[1] + "."
  994.             self.set_status(msg)
  995.             print msg
  996.             traceback.print_exc()
  997.             self.run_message_dialog(gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, msg)
  998.        
  999.         except Exception, ex:
  1000.             msg = "Failed to refresh SAM info: " + str(ex) + "."
  1001.             self.set_status(msg)
  1002.             print msg
  1003.             traceback.print_exc()
  1004.             self.run_message_dialog(gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, msg)
  1005.            
  1006.         self.refresh_user_list_view()
  1007.         self.refresh_group_list_view()
  1008.  
  1009.  
  1010.        
  1011.     def on_new_item_activate(self, widget):
  1012.         if (self.users_groups_notebook_page_num == 0): # users tab
  1013.             new_user = self.run_user_edit_dialog()
  1014.             if (new_user == None):
  1015.                 self.set_status("User creation canceled")
  1016.                 return
  1017.            
  1018.             try:
  1019.                 self.pipe_manager.add_user(new_user)
  1020.                 self.pipe_manager.fetch_users_and_groups()
  1021.                
  1022.                 self.set_status("Successfully created user '" + new_user.username + "'.")
  1023.            
  1024.             except RuntimeError, re:
  1025.                 msg = "Failed to create user: " + re.args[1] + "."
  1026.                 self.set_status(msg)
  1027.                 print msg
  1028.                 traceback.print_exc()
  1029.                 self.run_message_dialog(gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, msg)
  1030.            
  1031.             except Exception, ex:
  1032.                 msg = "Failed to create user: " + str(ex) + "."
  1033.                 self.set_status(msg)
  1034.                 print msg
  1035.                 traceback.print_exc()
  1036.                 self.run_message_dialog(gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, msg)
  1037.            
  1038.             self.refresh_user_list_view()
  1039.  
  1040.         else: # groups tab
  1041.             new_group = self.run_group_edit_dialog()
  1042.             if (new_group == None):
  1043.                 return
  1044.            
  1045.             try:
  1046.                 self.pipe_manager.add_group(new_group)
  1047.                 self.pipe_manager.fetch_users_and_groups()
  1048.                
  1049.                 self.set_status("Successfully created group '" + new_group.name + "'.")
  1050.                
  1051.             except RuntimeError, re:
  1052.                 msg = "Failed to create group: " + re.args[1] + "."
  1053.                 self.set_status(msg)
  1054.                 print msg
  1055.                 traceback.print_exc()
  1056.                 self.run_message_dialog(gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, msg)
  1057.            
  1058.             except Exception, ex:
  1059.                 msg = "Failed to create group: " + str(ex) + "."
  1060.                 self.set_status(msg)
  1061.                 print msg
  1062.                 traceback.print_exc()
  1063.                 self.run_message_dialog(gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, msg)
  1064.                
  1065.             self.refresh_group_list_view()
  1066.            
  1067.     def on_delete_item_activate(self, widget):
  1068.         if (self.users_groups_notebook_page_num == 0): # users tab
  1069.             del_user = self.get_selected_user()
  1070.    
  1071.             if (self.run_message_dialog(gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, "Do you want to delete user '%s'?" % del_user.username) != gtk.RESPONSE_YES):
  1072.                 return
  1073.            
  1074.             try:
  1075.                 self.pipe_manager.delete_user(del_user)
  1076.                 self.pipe_manager.fetch_users_and_groups()
  1077.                
  1078.                 self.set_status("Successfully deleted user '" + del_user.username + "'.")
  1079.            
  1080.             except RuntimeError, re:
  1081.                 msg = "Failed to delete user: " + re.args[1] + "."
  1082.                 self.set_status(msg)
  1083.                 print msg
  1084.                 traceback.print_exc()
  1085.                 self.run_message_dialog(gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, msg)
  1086.            
  1087.             except Exception, ex:
  1088.                 msg = "Failed to delete user: " + str(ex) + "."
  1089.                 self.set_status(msg)
  1090.                 print msg
  1091.                 traceback.print_exc()
  1092.                 self.run_message_dialog(gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, msg)
  1093.            
  1094.             self.refresh_user_list_view()
  1095.  
  1096.         else: # groups tab
  1097.             del_group = self.get_selected_group()
  1098.    
  1099.             if (self.run_message_dialog(gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, "Do you want to delete group '%s'?" % del_group.name) != gtk.RESPONSE_YES):
  1100.                 return
  1101.            
  1102.             try:
  1103.                 self.pipe_manager.delete_group(del_group)
  1104.                 self.pipe_manager.fetch_users_and_groups()
  1105.                
  1106.                 self.set_status("Successfully deleted group '" + del_group.name + "'.")
  1107.  
  1108.             except RuntimeError, re:
  1109.                 msg = "Failed to delete group: " + re.args[1] + "."
  1110.                 self.set_status(msg)
  1111.                 print msg
  1112.                 traceback.print_exc()
  1113.                 self.run_message_dialog(gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, msg)
  1114.            
  1115.             except Exception, ex:
  1116.                 msg = "Failed to delete group: " + str(ex) + "."
  1117.                 self.set_status(msg)
  1118.                 print msg
  1119.                 traceback.print_exc()
  1120.                 self.run_message_dialog(gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, msg)
  1121.                
  1122.             self.refresh_group_list_view()            
  1123.            
  1124.        
  1125.     def on_edit_item_activate(self, widget):
  1126.         if (self.users_groups_notebook_page_num == 0): # users tab
  1127.             edit_user = self.get_selected_user()
  1128.             self.run_user_edit_dialog(edit_user, self.update_user_callback)
  1129.            
  1130.         else: # groups tab
  1131.             edit_group = self.get_selected_group()
  1132.             self.run_group_edit_dialog(edit_group, self.update_group_callback)
  1133.  
  1134.     def on_user_rights_item_activate(self, widget):
  1135.         pass
  1136.    
  1137.     def on_audit_item_activate(self, widget):
  1138.         pass
  1139.    
  1140.     def on_trust_relations_item_activate(self, widget):
  1141.         pass
  1142.    
  1143.     def on_about_item_activate(self, widget):
  1144.         dialog = AboutDialog(
  1145.                              "PyGWSAM",
  1146.                              "A tool to manage accounts on a SAM server.\n Based on Jelmer Vernooij's original Samba-GTK",
  1147.                              self.icon_pixbuf
  1148.                              )
  1149.         dialog.run()
  1150.         dialog.hide()
  1151.  
  1152.     def on_users_tree_view_button_press(self, widget, event):
  1153.         if (self.get_selected_user() == None):
  1154.             return
  1155.        
  1156.         if (event.type == gtk.gdk._2BUTTON_PRESS):
  1157.             self.on_edit_item_activate(self.edit_item)
  1158.  
  1159.     def on_groups_tree_view_button_press(self, widget, event):
  1160.         if (self.get_selected_group() == None):
  1161.             return
  1162.  
  1163.         if (event.type == gtk.gdk._2BUTTON_PRESS):
  1164.             self.on_edit_item_activate(self.edit_item)
  1165.  
  1166.     def on_users_groups_notebook_switch_page(self, widget, page, page_num):
  1167.         self.users_groups_notebook_page_num = page_num # workaround - the signal is emitted before the actual change
  1168.         self.update_captions()
  1169.         self.update_sensitivity()
  1170.        
  1171.     def on_update_sensitivity(self, widget):
  1172.         self.update_sensitivity()
  1173.  
  1174.  
  1175. main_window = SAMWindow()
  1176. main_window.set_status("Disconnected.")
  1177. main_window.show_all()
  1178. gtk.main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement