user_control.py 11.9 KB
Newer Older
C
cpwu 已提交
1 2
import taos
import sys
C
cpwu 已提交
3
import inspect
C
cpwu 已提交
4
import traceback
C
cpwu 已提交
5 6 7 8

from util.log import *
from util.sql import *
from util.cases import *
C
cpwu 已提交
9
from util.dnodes import *
C
cpwu 已提交
10

C
cpwu 已提交
11

C
cpwu 已提交
12 13 14 15
PRIVILEGES_ALL      = "ALL"
PRIVILEGES_READ     = "READ"
PRIVILEGES_WRITE    = "WRITE"

C
cpwu 已提交
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
class TDconnect:
    def __init__(self,
                 host       = None,
                 port       = None,
                 user       = None,
                 password   = None,
                 database   = None,
                 config     = None,
        ) -> None:
        self._conn      = None
        self._host      = host
        self._user      = user
        self._password  = password
        self._database  = database
        self._port      = port
        self._config    = config

    def __enter__(self):
        self._conn = taos.connect(
            host    =self._host,
            port    =self._port,
            user    =self._user,
            password=self._password,
            database=self._database,
            config  =self._config
        )

        self.cursor = self._conn.cursor()
C
cpwu 已提交
44
        return self
C
cpwu 已提交
45

C
cpwu 已提交
46 47 48 49 50 51
    def error(self, sql):
        expectErrNotOccured = True
        try:
            self.cursor.execute(sql)
        except BaseException:
            expectErrNotOccured = False
C
cpwu 已提交
52

C
cpwu 已提交
53 54
        if expectErrNotOccured:
            caller = inspect.getframeinfo(inspect.stack()[1][0])
C
cpwu 已提交
55
            tdLog.exit(f"{caller.filename}({caller.lineno}) failed: sql:{sql}, expect error not occured" )
C
cpwu 已提交
56 57 58 59 60
        else:
            self.queryRows = 0
            self.queryCols = 0
            self.queryResult = None
            tdLog.info(f"sql:{sql}, expect error occured")
C
cpwu 已提交
61

C
cpwu 已提交
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
    def query(self, sql, row_tag=None):
        # sourcery skip: raise-from-previous-error, raise-specific-error
        self.sql = sql
        try:
            self.cursor.execute(sql)
            self.queryResult = self.cursor.fetchall()
            self.queryRows = len(self.queryResult)
            self.queryCols = len(self.cursor.description)
        except Exception as e:
            caller = inspect.getframeinfo(inspect.stack()[1][0])
            tdLog.notice(f"{caller.filename}({caller.lineno}) failed: sql:{sql}, {repr(e)}")
            traceback.print_exc()
            raise Exception(repr(e))
        if row_tag:
            return self.queryResult
        return self.queryRows

C
cpwu 已提交
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
    def __exit__(self, types, values, trace):
        if self._conn:
            self.cursor.close()
            self._conn.close()

def taos_connect(
    host    = "127.0.0.1",
    port    = 6030,
    user    = "root",
    passwd  = "taosdata",
    database= None,
    config  = None
):
    return TDconnect(
        host = host,
        port=port,
        user=user,
        password=passwd,
        database=database,
        config=config
    )

C
cpwu 已提交
101 102 103 104 105 106
class TDTestCase:

    def init(self, conn, logSql):
        tdLog.debug(f"start to excute {__file__}")
        tdSql.init(conn.cursor())

C
cpwu 已提交
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
    @property
    def __user_list(self):
        return  [f"user_test{i}" for i in range(self.users_count) ]

    @property
    def __passwd_list(self):
        return  [f"taosdata{i}" for i in range(self.users_count) ]

    @property
    def __privilege(self):
        return [ PRIVILEGES_ALL, PRIVILEGES_READ, PRIVILEGES_WRITE ]

    def __priv_level(self, dbname=None):
        return f"{dbname}.*" if dbname else "*.*"


C
cpwu 已提交
123
    def create_user_current(self):
C
cpwu 已提交
124 125
        users  = self.__user_list
        passwds = self.__passwd_list
C
cpwu 已提交
126
        for i in range(self.users_count):
C
cpwu 已提交
127
            tdSql.execute(f"create user {users[i]} pass '{passwds[i]}' ")
C
cpwu 已提交
128

C
cpwu 已提交
129 130
        tdSql.query("show users")
        tdSql.checkRows(self.users_count + 1)
C
cpwu 已提交
131

C
cpwu 已提交
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
    def create_user_err(self):
        sqls = [
            "create users u1 pass 'u1passwd' ",
            "create user '' pass 'u1passwd' ",
            "create user  pass 'u1passwd' ",
            "create user u1 pass u1passwd ",
            "create user u1 password 'u1passwd' ",
            "create user u1 pass u1passwd ",
            "create user u1 pass '' ",
            "create user u1 pass '   ' ",
            "create user u1 pass  ",
            "create user u1 u2 pass 'u1passwd' 'u2passwd' ",
            "create user u1 u2 pass 'u1passwd', 'u2passwd' ",
            "create user u1, u2 pass 'u1passwd', 'u2passwd' ",
            "create user u1, u2 pass 'u1passwd'  'u2passwd' ",
            # length of user_name must <= 23
            "create user u12345678901234567890123 pass 'u1passwd' " ,
C
cpwu 已提交
149 150
            # length of passwd must <= 128
            "create user u1 pass 'u12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678' " ,
C
cpwu 已提交
151 152 153 154 155 156 157 158 159 160 161 162 163 164
            # password must have not " ' ~ ` \
            "create user u1 pass 'u1passwd\\' " ,
            "create user u1 pass 'u1passwd~' " ,
            "create user u1 pass 'u1passwd\"' " ,
            "create user u1 pass 'u1passwd\'' " ,
            "create user u1 pass 'u1passwd`' " ,
            # must after create a user named u1
            "create user u1 pass 'u1passwd' " ,
        ]

        tdSql.execute("create user u1 pass 'u1passwd' ")
        for sql in sqls:
            tdSql.error(sql)

C
cpwu 已提交
165 166
        tdSql.execute("DROP USER u1")

C
cpwu 已提交
167 168
    def __alter_pass_sql(self, user, passwd):
        return f'''ALTER USER {user} PASS '{passwd}' '''
C
cpwu 已提交
169 170 171

    def alter_pass_current(self):
        self.__init_pass = True
C
cpwu 已提交
172
        for count, i in enumerate(range(self.users_count)):
C
cpwu 已提交
173 174
            if self.__init_pass:
                tdSql.query(self.__alter_pass_sql(self.__user_list[i], f"new{self.__passwd_list[i]}"))
C
cpwu 已提交
175
                self.__init_pass = count != self.users_count - 1
C
cpwu 已提交
176 177
            else:
                tdSql.query(self.__alter_pass_sql(self.__user_list[i], self.__passwd_list[i] ) )
C
cpwu 已提交
178
                self.__init_pass = count == self.users_count - 1
C
cpwu 已提交
179

C
cpwu 已提交
180
    def alter_pass_err(self):  # sourcery skip: remove-redundant-fstring
C
cpwu 已提交
181
        sqls = [
C
cpwu 已提交
182 183 184 185 186 187
            f"alter users {self.__user_list[0]} pass 'newpass' " ,
            f"alter user {self.__user_list[0]} pass '' " ,
            f"alter user {self.__user_list[0]} pass '  ' " ,
            f"alter user anyuser pass 'newpass' " ,
            f"alter user {self.__user_list[0]} pass  " ,
            f"alter user {self.__user_list[0]} password 'newpass'  " ,
C
cpwu 已提交
188 189 190 191 192
        ]
        for sql in sqls:
            tdSql.error(sql)


C
cpwu 已提交
193 194 195 196 197 198
    def grant_user_privileges(self, privilege,  dbname=None, user_name="root"):
        return f"GRANT {privilege} ON {self.__priv_level(dbname)} TO {user_name} "

    def test_user_create(self):
        self.create_user_current()
        self.create_user_err()
C
cpwu 已提交
199

C
cpwu 已提交
200 201 202 203 204 205 206
    def test_alter_pass(self):
        self.alter_pass_current()
        self.alter_pass_err()

    def user_login(self, user, passwd):
        login_except = False
        try:
C
cpwu 已提交
207
            with taos_connect(user=user, passwd=passwd) as conn:
C
cpwu 已提交
208
                cursor = conn.cursor
C
cpwu 已提交
209 210 211 212 213 214 215 216
        except BaseException:
            login_except = True
            cursor = None
        return login_except, cursor

    def login_currrent(self, user, passwd):
        login_except, _ = self.user_login(user, passwd)
        if login_except:
C
cpwu 已提交
217
            tdLog.exit(f"connect failed, user: {user} and pass: {passwd} do not match!")
C
cpwu 已提交
218 219 220
        else:
            tdLog.info("connect successfully, user and pass matched!")

C
cpwu 已提交
221 222 223 224 225

    def login_err(self, user, passwd):
        login_except, _ = self.user_login(user, passwd)
        if login_except:
            tdLog.info("connect failed, except error occured!")
C
cpwu 已提交
226 227
        else:
            tdLog.exit("connect successfully, except error not occrued!")
C
cpwu 已提交
228

C
cpwu 已提交
229 230 231 232 233 234 235 236 237 238 239 240 241 242
    def __drop_user(self, user):
        return f"DROP USER {user}"

    def drop_user_current(self):
        for user in self.__user_list:
            tdSql.query(self.__drop_user(user))

    def drop_user_error(self):
        sqls = [
            f"DROP {self.__user_list[0]}",
            f"DROP user {self.__user_list[0]}  {self.__user_list[1]}",
            f"DROP user {self.__user_list[0]} , {self.__user_list[1]}",
            f"DROP users {self.__user_list[0]}  {self.__user_list[1]}",
            f"DROP users {self.__user_list[0]} , {self.__user_list[1]}",
C
cpwu 已提交
243
            # "DROP user root",
C
cpwu 已提交
244 245 246 247 248 249
            "DROP user abcde",
            "DROP user ALL",
        ]

        for sql in sqls:
            tdSql.error(sql)
C
cpwu 已提交
250

C
cpwu 已提交
251 252 253 254
    def test_drop_user(self):
        # must drop err first
        self.drop_user_error()
        self.drop_user_current()
C
cpwu 已提交
255

C
cpwu 已提交
256
    def run(self):
C
cpwu 已提交
257 258 259 260 261 262 263 264 265 266

        # 默认只有 root 用户
        tdLog.printNoPrefix("==========step0: init, user list only has root account")
        tdSql.query("show users")
        tdSql.checkData(0, 0, "root")
        tdSql.checkData(0, 1, "super")

        # root用户权限
        # 创建用户测试
        tdLog.printNoPrefix("==========step1: create user test")
C
cpwu 已提交
267
        self.users_count = 5
C
cpwu 已提交
268 269 270 271 272
        self.test_user_create()

        # 查看用户
        tdLog.printNoPrefix("==========step2: show user test")
        tdSql.query("show users")
C
cpwu 已提交
273
        tdSql.checkRows(self.users_count + 1)
C
cpwu 已提交
274

C
cpwu 已提交
275 276 277 278
        # 密码登录认证
        self.login_currrent(self.__user_list[0], self.__passwd_list[0])
        self.login_err(self.__user_list[0], f"new{self.__passwd_list[0]}")

C
cpwu 已提交
279
        # 修改密码
C
cpwu 已提交
280 281 282
        tdLog.printNoPrefix("==========step3: alter user pass test")
        self.test_alter_pass()

C
cpwu 已提交
283
        # 密码修改后的登录认证
C
cpwu 已提交
284
        tdLog.printNoPrefix("==========step4: check login test")
C
cpwu 已提交
285
        self.login_err(self.__user_list[0], self.__passwd_list[0])
C
cpwu 已提交
286
        self.login_currrent(self.__user_list[0], f"new{self.__passwd_list[0]}")
C
cpwu 已提交
287

C
cpwu 已提交
288 289 290
        tdDnodes.stop(1)
        tdDnodes.start(1)

C
cpwu 已提交
291
        tdSql.query("show users")
C
cpwu 已提交
292
        tdSql.checkRows(self.users_count + 1)
C
cpwu 已提交
293

C
cpwu 已提交
294
        # 普通用户权限
C
cpwu 已提交
295
        # 密码登录
C
cpwu 已提交
296
        # _, user = self.user_login(self.__user_list[0], f"new{self.__passwd_list[0]}")
C
cpwu 已提交
297 298 299 300 301 302 303 304
        with taos_connect(user=self.__user_list[0], passwd=f"new{self.__passwd_list[0]}") as user:
            # user = conn
            # 不能创建用户
            tdLog.printNoPrefix("==========step5: normal user can not create user")
            user.error("create use utest1 pass 'utest1pass'")
            # 可以查看用户
            tdLog.printNoPrefix("==========step6: normal user can show user")
            user.query("show users")
C
cpwu 已提交
305
            assert user.queryRows == self.users_count + 1
C
cpwu 已提交
306 307 308
            # 不可以修改其他用户的密码
            tdLog.printNoPrefix("==========step7: normal user can not alter other user pass")
            user.error(self.__alter_pass_sql(self.__user_list[1], self.__passwd_list[1] ))
C
cpwu 已提交
309
            user.error(self.__alter_pass_sql("root", "taosdata_root" ))
C
cpwu 已提交
310 311 312 313 314 315 316 317
            # 可以修改自己的密码
            tdLog.printNoPrefix("==========step8: normal user can alter owner pass")
            user.query(self.__alter_pass_sql(self.__user_list[0], self.__passwd_list[0]))
            # 不可以删除用户,包括自己
            tdLog.printNoPrefix("==========step9: normal user can not drop any user ")
            user.error(f"drop user {self.__user_list[0]}")
            user.error(f"drop user {self.__user_list[1]}")
            user.error("drop user root")
C
cpwu 已提交
318 319 320 321

        # root删除用户测试
        tdLog.printNoPrefix("==========step10: super user drop normal user")
        self.test_drop_user()
C
cpwu 已提交
322

C
cpwu 已提交
323 324 325 326
        tdSql.query("show users")
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, "root")
        tdSql.checkData(0, 1, "super")
C
cpwu 已提交
327

C
cpwu 已提交
328 329 330 331 332
        tdDnodes.stop(1)
        tdDnodes.start(1)

        # 删除后无法登录
        self.login_err(self.__user_list[0], self.__passwd_list[0])
C
cpwu 已提交
333
        self.login_err(self.__user_list[0], f"new{self.__passwd_list[0]}")
C
cpwu 已提交
334
        self.login_err(self.__user_list[1], self.__passwd_list[1])
C
cpwu 已提交
335
        self.login_err(self.__user_list[1], f"new{self.__passwd_list[1]}")
C
cpwu 已提交
336 337 338 339 340 341

        tdSql.query("show users")
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, "root")
        tdSql.checkData(0, 1, "super")

C
cpwu 已提交
342 343 344 345 346 347 348

    def stop(self):
        tdSql.close()
        tdLog.success(f"{__file__} successfully executed")

tdCases.addLinux(__file__, TDTestCase())
tdCases.addWindows(__file__, TDTestCase())