1import os
2
3from infra.basetest import BRTest
4
5
6class TestShadow(BRTest):
7    username = 'user_test'
8    # Need to use a different toolchain than the default due to
9    # shadow package requiring a toolchain w/ headers >= 4.14
10    config = \
11        """
12        BR2_arm=y
13        BR2_TOOLCHAIN_EXTERNAL=y
14        BR2_TOOLCHAIN_EXTERNAL_BOOTLIN=y
15        BR2_TOOLCHAIN_EXTERNAL_BOOTLIN_ARMV5_EABI_GLIBC_BLEEDING_EDGE=y
16        BR2_PACKAGE_SHADOW=y
17        BR2_TARGET_ROOTFS_EXT2=y
18        BR2_TARGET_ROOTFS_EXT2_4=y
19        BR2_TARGET_ROOTFS_EXT2_SIZE="65536"
20        """
21    timeout = 60
22
23    def login(self):
24        img = os.path.join(self.builddir, "images", "rootfs.ext4")
25        self.emulator.boot(arch="armv7",
26                           kernel="builtin",
27                           kernel_cmdline=["root=/dev/mmcblk0",
28                                           "rootfstype=ext4"],
29                           options=["-drive", f"file={img},if=sd,format=raw"])
30        self.emulator.login()
31
32    def test_nologin(self):
33        self.login()
34
35        self.assertRunOk("! nologin")
36        cmd = 'test "$(nologin)" = "This account is currently not available."'
37        self.assertRunOk(cmd)
38
39    def test_useradd_del(self):
40        username = self.username
41        self.login()
42
43        self.assertRunOk(f'userdel {username} || true')
44        self.assertRunOk(f'groupdel {username} || true')
45        self.assertRunOk(f'useradd -s /bin/sh {username}')
46        self.assertRunOk(f'test $(su {username} -c "whoami") = {username}')
47        self.assertRunOk(f'userdel {username}')
48
49    def test_usermod(self):
50        username = self.username
51        new_home = '/tmp'
52        self.login()
53
54        self.assertRunOk(f'userdel {username} || true')
55        self.assertRunOk(f'groupdel {username} || true')
56        self.assertRunOk(f'useradd -s /bin/sh {username}')
57        self.assertRunOk(f'usermod {username} --home {new_home}')
58        self.assertRunOk(f'test $(su {username} -c \'echo $HOME\') = {new_home}')
59        self.assertRunOk(f'userdel {username}')
60