예제 #1
0
 def test_get_users_duplicate_uids(self):
     """
     Get users should return data for all users found on the system,
     including users with duplicated uids.
     """
     data = [("joe1", "x", 1000, 1000, "JD,,,,", "/home/joe1", "/bin/zsh"),
             ("joe2", "x", 1000, 1000, "JD,,,,", "/home/joe2", "/bin/zsh")]
     provider = FakeUserProvider(users=data, shadow_file=self.shadow_file)
     users = provider.get_users()
     self.assertEqual(users, [{
         "username": "******",
         "name": u"JD",
         "uid": 1000,
         "enabled": True,
         "location": None,
         "home-phone": None,
         "work-phone": None,
         "primary-gid": 1000
     }, {
         "username": "******",
         "name": u"JD",
         "uid": 1000,
         "enabled": True,
         "location": None,
         "home-phone": None,
         "work-phone": None,
         "primary-gid": 1000
     }])
예제 #2
0
 def test_get_gid(self):
     """
     Given a username L{UserProvider.get_gid} returns the GID or
     raises a L{UserProviderError} if a match isn't found.
     """
     provider = FakeUserProvider(groups=[("jdoe", "x", 1000, [])])
     self.assertEqual(provider.get_gid("jdoe"), 1000)
     self.assertRaises(GroupNotFoundError, provider.get_gid, "john")
예제 #3
0
 def test_get_uid(self):
     """
     Given a username L{UserProvider.get_uid} returns the UID or
     raises a L{UserProviderError} if a match isn't found.
     """
     data = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/zsh")]
     provider = FakeUserProvider(users=data, shadow_file=self.shadow_file)
     self.assertEqual(provider.get_uid("jdoe"), 1000)
     self.assertRaises(UserNotFoundError, provider.get_uid, "john")
예제 #4
0
 def test_group_without_members(self):
     """
     L{UserProvider.get_groups} should include groups without
     members.
     """
     provider = FakeUserProvider(groups=[("jdoe", "x", 1000, [])])
     self.assertEqual(provider.get_groups(), [{
         "name": "jdoe",
         "gid": 1000,
         "members": []
     }])
예제 #5
0
 def test_group_with_members(self):
     """L{UserProvider.get_groups} should include groups with members."""
     users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/zsh")]
     groups = [("sales", "x", 50, ["jdoe"])]
     provider = FakeUserProvider(users=users,
                                 shadow_file=self.shadow_file,
                                 groups=groups)
     self.assertEqual(provider.get_groups(), [{
         "name": "sales",
         "gid": 50,
         "members": ["jdoe"]
     }])
예제 #6
0
 def test_user_not_in_shadow_file(self):
     """
     Given a username that doesn't exist in the shadow file, we should get a
     UserProvider error rather than a KeyError.
     raises a L{UserProviderError} if a match isn't found.
     """
     data = [("johndoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe",
              "/bin/zsh")]
     provider = FakeUserProvider(users=data, shadow_file=self.shadow_file)
     users = provider.get_users()
     self.assertEqual(len(users), 1)
     self.assertEqual(sorted([x[0] for x in data]), ["johndoe"])
예제 #7
0
    def test_group_with_unknown_members(self):
        """L{UserProvider.get_groups} should include groups with members.

        If a member's userid isn't known to the system, it shouldn't be
        returned.
        """
        users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/zsh")]
        groups = [("sales", "x", 50, ["jdoe", "kevin"])]
        provider = FakeUserProvider(users=users,
                                    shadow_file=self.shadow_file,
                                    groups=groups)
        self.assertEqual(provider.get_groups(), [{
            "name": "sales",
            "gid": 50,
            "members": ["jdoe"]
        }])
예제 #8
0
    def test_add_user(self):
        """
        L{UserChanges.create_diff} should report new users created
        externally with C{adduser} or similar tools.
        """
        users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/sh")]
        provider = FakeUserProvider(users=users)
        FakeUserInfo(provider=provider)

        changes = UserChanges(self.persist, provider)
        changes.create_diff()
        changes.snapshot()
        users.append(("bo", "x", 1001, 1001, "Bo,,,,", "/home/bo", "/bin/sh"))
        self.assertEqual(
            changes.create_diff(), {
                "create-users": [{
                    "username": "******",
                    "home-phone": None,
                    "name": u"Bo",
                    "enabled": True,
                    "location": None,
                    "work-phone": None,
                    "uid": 1001,
                    "primary-gid": 1001
                }]
            })
예제 #9
0
 def test_update_user(self):
     """
     L{UserChanges.create_diff} should report users modified
     externally with C{usermod} or similar tools.
     """
     users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/sh")]
     provider = FakeUserProvider(users=users)
     FakeUserInfo(provider=provider)
     changes = UserChanges(self.persist, provider)
     changes.create_diff()
     changes.snapshot()
     users[0] = ("jdoe", "x", 1000, 1001, "John Doe,Here,789WORK,321HOME",
                 "/home/john", "/bin/zsh")
     self.assertEqual(
         changes.create_diff(), {
             "update-users": [{
                 "username": "******",
                 "home-phone": u"321HOME",
                 "name": u"John Doe",
                 "enabled": True,
                 "location": "Here",
                 "work-phone": "789WORK",
                 "uid": 1000,
                 "primary-gid": 1001
             }]
         })
예제 #10
0
    def test_no_existing_snapshot(self):
        """
        The diff created by L{UserChanges.create_diff} contains data
        for all users and groups if an existing snapshot isn't
        available.
        """
        users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/sh")]
        groups = [("webdev", "x", 1000, ["jdoe"])]
        provider = FakeUserProvider(users=users, groups=groups)
        FakeUserInfo(provider=provider)

        changes = UserChanges(self.persist, provider)
        self.assertEqual(
            changes.create_diff(), {
                "create-users": [{
                    "username": "******",
                    "home-phone": None,
                    "name": u"JD",
                    "enabled": True,
                    "location": None,
                    "work-phone": None,
                    "uid": 1000,
                    "primary-gid": 1000
                }],
                "create-groups": [{
                    "gid": 1000,
                    "name": "webdev"
                }],
                "create-group-members": {
                    "webdev": ["jdoe"]
                }
            })
    def test_no_fetch_users_in_monitor_only_mode(self):
        """
        If we're in monitor_only mode, then all users are assumed to be
        unlocked.
        """
        self.config.monitor_only = True

        def got_result(result):
            self.assertMessages(
                self.broker_service.message_store.get_pending_messages(),
                [{"create-group-members": {u"webdev": [u"jdoe"]},
                  "create-groups": [{"gid": 1000, "name": u"webdev"}],
                  "create-users": [{"enabled": True, "home-phone": None,
                                    "location": None, "name": u"JD",
                                    "primary-gid": 1000, "uid": 1000,
                                    "username": u"jdoe", "work-phone": None}],
                  "type": "users"}])
            plugin.stop()

        users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/sh")]
        groups = [("webdev", "x", 1000, ["jdoe"])]
        provider = FakeUserProvider(users=users, groups=groups)
        plugin = UserMonitor(provider=provider)
        plugin.register(self.monitor)
        self.broker_service.message_store.set_accepted_types(["users"])
        result = plugin.run()
        result.addCallback(got_result)
        return result
예제 #12
0
 def test_four_gecos_fields(self):
     """If a GECOS field only has four fields it should still work."""
     data = [("jdoe", "x", 1000, 1000, "JD,Everywhere,7654321,123HOME",
              "/home/jdoe", "/bin/zsh")]
     provider = FakeUserProvider(users=data, shadow_file=self.shadow_file)
     users = provider.get_users()
     self.assertEqual(users, [{
         "username": "******",
         "name": u"JD",
         "uid": 1000,
         "enabled": True,
         "location": u"Everywhere",
         "home-phone": u"123HOME",
         "work-phone": u"7654321",
         "primary-gid": 1000
     }])
예제 #13
0
 def test_remove_user_with_unknown_username(self):
     """
     L{UserManagement.remove_user} should raise a
     L{UserManagementError} if the user being removed doesn't exist.
     """
     provider = FakeUserProvider(popen=MockPopen(""))
     management = UserManagement(provider=provider)
     self.assertRaises(UserNotFoundError, management.remove_user, "smith")
예제 #14
0
 def test_add_group_handles_errors(self):
     """
     If the system tool C{addgroup} returns a non-0 exit code,
     L{UserManagement.add_group} should raise an L{UserManagementError}.
     """
     provider = FakeUserProvider(popen=MockPopen("Error Result", [1]))
     management = UserManagement(provider=provider)
     self.assertRaises(UserManagementError, management.add_group, "kaboom")
예제 #15
0
 def test_group_with_duplicate_members(self):
     """
     L{UserProvider.get_groups} should only report groups once.
     If duplicates exist they should be removed.  The problem
     reported in bug #118799 is related to duplicates being
     reported to the server.
     """
     users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/zsh")]
     groups = [("sales", "x", 50, ["jdoe", "jdoe"])]
     provider = FakeUserProvider(users=users,
                                 shadow_file=self.shadow_file,
                                 groups=groups)
     self.assertEqual(provider.get_groups(), [{
         "name": "sales",
         "gid": 50,
         "members": ["jdoe"]
     }])
예제 #16
0
 def test_lock_user(self):
     """L{UserManagement.lock_user} should use C{usermod} to lock users."""
     data = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/zsh")]
     provider = FakeUserProvider(users=data, shadow_file=self.shadow_file,
                                 popen=MockPopen("no output"))
     management = UserManagement(provider=provider)
     management.lock_user("jdoe")
     self.assertEqual(provider.popen.popen_inputs,
                      [["usermod", "-L", "jdoe"]])
예제 #17
0
 def test_set_user_details_with_unknown_username(self):
     """
     L{UserManagement.set_user_details} should raise a
     L{UserManagementError} if the user being edited doesn't exist.
     """
     provider = FakeUserProvider(popen=MockPopen(""))
     management = UserManagement(provider=provider)
     self.assertRaises(UserNotFoundError, management.set_user_details,
                       "kevin", name=u"John Doe")
예제 #18
0
 def test_no_gecos_data(self):
     """
     When no data is provided in the GECOS field we should report
     all optional fields as C{None}.
     """
     data = [("jdoe", "x", 1000, 1000, "", "/home/jdoe", "/bin/zsh")]
     provider = FakeUserProvider(users=data, shadow_file=self.shadow_file)
     users = provider.get_users()
     self.assertEqual(users, [{
         "username": "******",
         "uid": 1000,
         "enabled": True,
         "name": None,
         "location": None,
         "home-phone": None,
         "work-phone": None,
         "primary-gid": 1000
     }])
예제 #19
0
 def test_get_disabled_user(self):
     """The C{enabled} field should be C{False} for disabled users."""
     data = [("psmith", "x", 1000, 1000, "Peter Smith,,,,", "/home/psmith",
              "/bin/bash")]
     provider = FakeUserProvider(users=data,
                                 shadow_file=self.shadow_file,
                                 locked_users=["psmith"])
     users = provider.get_users()
     self.assertEqual(users, [{
         "username": "******",
         "name": u"Peter Smith",
         "uid": 1000,
         "enabled": False,
         "location": None,
         "home-phone": None,
         "work-phone": None,
         "primary-gid": 1000
     }])
예제 #20
0
 def test_remove_group_with_unknown_groupname(self):
     """
     L{UserManagement.remove_group} should raise a
     L{GroupMissingError} if the group being removed doesn't exist.
     """
     provider = FakeUserProvider(popen=MockPopen(""))
     management = UserManagement(provider=provider)
     self.assertRaises(
         GroupNotFoundError, management.remove_group, "ubuntu")
예제 #21
0
 def test_set_group_details_with_unknown_groupname(self):
     """
     L{UserManagement.set_group_details} should raise a
     L{UserManagementError} if the group being updated doesn't exist.
     """
     provider = FakeUserProvider(popen=MockPopen(""))
     management = UserManagement(provider=provider)
     self.assertRaises(GroupNotFoundError, management.set_group_details,
                       "sales", u"newsales")
예제 #22
0
 def test_unlock_user_fails(self):
     """
     L{UserManagement.unlock_user} should raise an
     L{UserManagementError} if a C{usermod} fails.
     """
     data = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/zsh")]
     provider = FakeUserProvider(users=data, shadow_file=self.shadow_file,
                                 popen=MockPopen("", [1]))
     management = UserManagement(provider=provider)
     self.assertRaises(UserNotFoundError, management.unlock_user, 1000)
예제 #23
0
 def test_weird_gecos_data(self):
     """
     If GECOS data is malformed in a way that contains less than
     four fields, read as many as are available.
     """
     data = [("jdoe", "x", 1000, 1000, "John Doe,Everywhere", "/home/jdoe",
              "/bin/zsh")]
     provider = FakeUserProvider(users=data, shadow_file=self.shadow_file)
     users = provider.get_users()
     self.assertEqual(users, [{
         "username": "******",
         "uid": 1000,
         "enabled": True,
         "name": "John Doe",
         "location": "Everywhere",
         "home-phone": None,
         "work-phone": None,
         "primary-gid": 1000
     }])
예제 #24
0
 def test_add_user_error(self):
     """
     L{UserManagement.add_user} should raise an L{UserManagementError} if
     C{adduser} fails.
     """
     provider = FakeUserProvider(popen=MockPopen("", return_codes=[1, 0]))
     management = UserManagement(provider=provider)
     self.assertRaises(UserManagementError, management.add_user,
                       "jdoe", u"John Doe", "password", False, None, None,
                       None, None)
예제 #25
0
 def test_add_group(self):
     """
     L{UserManagement.add_group} should use the system tool
     C{addgroup} to create groups.
     """
     provider = FakeUserProvider(popen=MockPopen("Result"))
     management = UserManagement(provider=provider)
     result = management.add_group("webdev")
     self.assertEqual(provider.popen.popen_inputs, [["addgroup", "webdev"]])
     self.assertEqual(result, "Result")
예제 #26
0
 def test_gecos_data(self):
     """
     Location, home phone number, and work phone number should be
     correctly parsed out of the GECOS field, and included in the
     users message.
     """
     data = [("jdoe", "x", 1000, 1000, "JD,Everywhere,7654321,123HOME,",
              "/home/jdoe", "/bin/zsh")]
     provider = FakeUserProvider(users=data, shadow_file=self.shadow_file)
     users = provider.get_users()
     self.assertEqual(users, [{
         "username": "******",
         "name": u"JD",
         "uid": 1000,
         "enabled": True,
         "location": u"Everywhere",
         "home-phone": u"123HOME",
         "work-phone": u"7654321",
         "primary-gid": 1000
     }])
예제 #27
0
 def test_add_member_with_unknown_username(self):
     """
     L{UserManagement.add_group_member} should raise a
     L{UserManagementError} if the user being associated doesn't
     exist.
     """
     groups = [("bizdev", "x", 1001, [])]
     provider = FakeUserProvider(groups=groups, popen=MockPopen(""))
     management = UserManagement(provider=provider)
     self.assertRaises(UserNotFoundError, management.add_group_member,
                       "bizdev", "smith")
예제 #28
0
 def test_set_user_details_fails(self):
     """
     L{UserManagement.set_user_details} should raise an
     L{EditUserError} if C{chfn} fails.
     """
     data = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/zsh")]
     provider = FakeUserProvider(users=data, shadow_file=self.shadow_file,
                                 popen=MockPopen("", return_codes=[1]))
     management = UserManagement(provider=provider)
     self.assertRaises(UserNotFoundError, management.set_user_details, 1000,
                       name="John Doe")
예제 #29
0
 def test_expire_password_error(self):
     """
     L{UserManagement.add_user} should raise an L{UserManagementError} if
     C{passwd} fails.
     """
     provider = FakeUserProvider(
         popen=MockPopen("", return_codes=[0, 0, 1]))
     management = UserManagement(provider=provider)
     self.assertRaises(UserManagementError, management.add_user,
                       "jdoe", u"John Doe", "password", True, None, None,
                       None, None)
예제 #30
0
 def test_old_school_gecos_data(self):
     """
     If C{useradd} is used to add users to a system the GECOS field
     will be written as a comment.  The client must be resilient to
     this situation.
     """
     data = [("jdoe", "x", 1000, 1000, "John Doe", "/home/jdoe", "/bin/zsh")
             ]
     provider = FakeUserProvider(users=data, shadow_file=self.shadow_file)
     users = provider.get_users()
     self.assertEqual(users, [{
         "username": "******",
         "uid": 1000,
         "enabled": True,
         "name": u"John Doe",
         "location": None,
         "home-phone": None,
         "work-phone": None,
         "primary-gid": 1000
     }])