xpra icon
Bug tracker and wiki

Ticket #1488: sql_auth_new_up3.py

File sql_auth_new_up3.py, 3.9 KB (added by Denis01, 8 months 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                if data[3]: #displays field check. Static host and port for user session
70                        uid = int(data[0])
71                        gid = int(data[1])
72                        displays = [str(data[2])]
73                        env_options = {}
74                        session_options = {}
75                        if data[3]:
76                                env_options = parse_simple_dict(str(data[3]), ";")
77                        if data[4]:
78                                session_options=parse_simple_dict(str(data[4]), ";")
79                        sessions = uid, gid, displays, env_options, session_options             
80                if not data[2]:
81                        log.error("Error: sqlauth. No session type is identified")
82                        return None                     
83                return sessions
84
85
86def create(db_file_name):
87        #create new DB
88        if os.path.exists(db_file_name):
89                log.error("Error: sqlauth. Can't create DB with such name. File exists")
90                return None
91        try:
92                conn = sqlite3.connect(db_file_name)
93                cursor = conn.cursor()
94                sql_script=("CREATE TABLE users (username CHAR UNIQUE, password VARCHAR, user_name VARCHAR, user_surname VARCHAR, uid INTEGER, gid INTEGER, displays VARCHAR, env_options VARCHAR, session_options VARCHAR)")
95                cursor.executescript(sql_script)
96        except sqlite3.DatabaseError as err:
97                log.error("Error: DB creation problem:'%s'", err)
98                return None
99        else:
100                conn.commit()
101                conn.close()
102                log("DB is created succesfully: ", db_file_name)
103        return True                                                     
104
105def main():
106    def usage(msg="invalid number of arguments"):
107        print(msg)
108        print("usage: %s create|..." % sys.argv[0])
109        return 1
110    from xpra.platform import program_context
111    with program_context("SQL Auth", "SQL Auth"):
112                if len(sys.argv)!=3: 
113                        return usage()
114                cmd = sys.argv[1]
115                if cmd=="create":
116                        db_file_name = sys.argv[2]
117                        create(db_file_name)
118                elif cmd=="update":
119                        print("update")
120                        #for future needs
121                        #SELECT * from sqlite_master - local DB structure before update to new version
122                else:
123                        return usage("invalid command '%s'" % cmd)
124    return 0
125
126if __name__ == "__main__":
127    r = main()   
128    sys.exit(r)