xpra icon
Bug tracker and wiki

Ticket #1488: sql_auth_5.py

File sql_auth_5.py, 3.8 KB (added by Denis01, 3 years ago)
Line 
1# This file is part of Xpra.
2# Copyright (C) 2017 Antoine Martin <antoine@devloop.org.uk>
3# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
4# later version. See the file COPYING for details.
5
6import sys
7import os
8import sqlite3
9from xpra.server.auth.sys_auth_base import SysAuthenticator, init, log
10from xpra.util import xor, parse_simple_dict
11assert init and log #tests will disable logging from here
12
13def init(opts):
14    pass
15
16class Authenticator(SysAuthenticator):
17
18    def __init__(self, username, **kwargs):
19        SysAuthenticator.__init__(self, username)
20        self.filename = kwargs.get("filename", 'sqlite.sdb')       
21        self.password_query = kwargs.get("password_query", "SELECT password FROM users WHERE username=(?)")
22        self.sessions_query = kwargs.get("sessions_query", "SELECT uid, gid, displays, env_options, session_options from users WHERE username=(?)")
23        self.authenticate = self.authenticate_hmac
24
25    def __repr__(self):
26        return "sql"
27
28    def get_password(self):
29                if os.path.exists(self.filename):
30                        log("Sqlauth. Database found: '%s'", self.filename)
31                else:
32                        log.error("Error: sqlauth cannot find the database file '%s'", self.filename)
33                        return None             
34                try:
35                        conn = sqlite3.connect(self.filename)
36                        cursor = conn.cursor()                 
37                except sqlite3.DatabaseError as err:
38                        log.error("Error: sqlauth. DB problem:'%s'", err)
39                        return None
40                try:
41                        cursor.execute(self.password_query, [self.username])
42                        data=cursor.fetchone()
43                except sqlite3.DatabaseError as err:
44                        log.error("Error: sqlauth. DB problem:'%s'", err)
45                        return None
46                else: 
47                        pass
48                if data:
49                        return str(data[0])
50                else:
51                        log.error("Error: sqlauth. No user in Database")
52                        return None
53
54    def get_sessions(self):
55                try:
56                        conn = sqlite3.connect(self.filename)
57                        cursor = conn.cursor()
58                except sqlite3.DatabaseError as err:
59                        log.error("Error: sqlauth. DB problem:'%s'", err)
60                        return None     
61                try:
62                        cursor.execute(self.sessions_query, [self.username])
63                        data=cursor.fetchone()
64                except sqlite3.DatabaseError as err:
65                        log.error("Error: sqlauth. DB is corrupted:'%s'", err)
66                        return None
67                else: 
68                        pass
69                uid = int(data[0])
70                gid = int(data[1])
71                displays = []
72                env_options = {}
73                session_options = {}
74                if data[2]:
75                        displays = [str(data[2])]                       
76                if data[3]:
77                        env_options = parse_simple_dict(str(data[3]), ";")
78                if data[4]:
79                        session_options=parse_simple_dict(str(data[4]), ";")
80                sessions = uid, gid, displays, env_options, session_options     
81                return sessions
82
83def create(db_file_name):
84        #create new DB
85        if os.path.exists(db_file_name):
86                log.error("Error: sqlauth. Can't create DB with such name. File exists")
87                return None
88        try:
89                conn = sqlite3.connect(db_file_name)
90                cursor = conn.cursor()
91                sql_script=("CREATE TABLE users (username CHAR UNIQUE NOT NULL, password VARCHAR, user_name VARCHAR, user_surname VARCHAR, uid INTEGER UNIQUE NOT NULL, gid INTEGER UNIQUE NOT NULL, displays VARCHAR, env_options VARCHAR, session_options VARCHAR)")
92                cursor.executescript(sql_script)
93        except sqlite3.DatabaseError as err:
94                log.error("Error: DB creation problem:'%s'", err)
95                return None
96        else:
97                conn.commit()
98                conn.close()
99                log("DB is created succesfully: ", db_file_name)
100        return True                                                     
101
102def main():
103    def usage(msg="invalid number of arguments"):
104        print(msg)
105        print("usage: %s create|..." % sys.argv[0])
106        return 1
107    from xpra.platform import program_context
108    with program_context("SQL Auth", "SQL Auth"):
109                if len(sys.argv)!=3: 
110                        return usage()
111                cmd = sys.argv[1]
112                if cmd=="create":
113                        db_file_name = sys.argv[2]
114                        create(db_file_name)
115                elif cmd=="update":
116                        print("update")
117                        #for future needs
118                        #SELECT * from sqlite_master - local DB structure before update to new version
119                else:
120                        return usage("invalid command '%s'" % cmd)
121    return 0
122
123if __name__ == "__main__":
124    r = main()   
125    sys.exit(r)