xpra icon
Bug tracker and wiki

Ticket #1488: sql_auth_new_up1.py

File sql_auth_new_up1.py, 4.6 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
9#import xpra_lb.py
10from xpra.server.auth.sys_auth_base import SysAuthenticator, init, log
11from xpra.util import xor, parse_simple_dict
12assert init and log #tests will disable logging from here
13
14def init(opts):
15    global password_file
16    password_file = opts.password_file
17
18class Authenticator(SysAuthenticator):
19
20    def __init__(self, username, **kwargs):
21        SysAuthenticator.__init__(self, username)
22        filename = kwargs.get("filename", password_file)       
23        if filename and not os.path.isabs(filename):
24            exec_cwd = kwargs.get("exec_cwd", os.getcwd())
25            filename = os.path.join(exec_cwd, filename)
26        self.sql_file_name = filename           
27        self.password_query = kwargs.get("password_query", "SELECT password FROM users WHERE username=(?)")
28        self.sessions_query = kwargs.get("sessions_query", "SELECT user_conn_str, uid, gid, displays, env_options, session_options from users WHERE username=(?)")
29        self.authenticate = self.authenticate_hmac
30
31    def __repr__(self):
32        return "sql"
33
34    def get_password(self):
35                if os.path.exists(self.sql_file_name):
36                        log("Sqlauth. Database found: '%s'", self.sql_file_name)
37                else:
38                        log.error("Error: sqlauth cannot find the database file '%s'", self.sql_file_name)
39                        return None             
40                try:
41                        conn = sqlite3.connect(self.sql_file_name)
42                except sqlite3.DatabaseError as err:
43                        log.error("Error: sqlauth. DB problem:'%s'", err)
44                        return None             
45                cursor = conn.cursor()
46                try:
47                        cursor.execute(self.password_query, [self.username])
48                        data=cursor.fetchone()
49                except sqlite3.DatabaseError as err:
50                        log.error("Error: sqlauth. DB problem:'%s'", err)
51                        return None
52                else: 
53                        conn.commit()
54                if data:
55                        entry=str(data[0])
56                        return entry
57                else:
58                        log.error("Error: sqlauth. No user in Database")
59                        return None
60
61    def get_sessions(self):
62                try:
63                        conn = sqlite3.connect(self.sql_file_name)
64                except sqlite3.DatabaseError as err:
65                        log.error("Error: sqlauth. DB problem:'%s'", err)
66                        return None     
67                cursor = conn.cursor()
68                try:
69                        cursor.execute(self.sessions_query, [self.username])
70                        data=cursor.fetchone()
71                except sqlite3.DatabaseError as err:
72                        log.error("Error: sqlauth. DB is corrupted:'%s'", err)
73                        return None
74                else: 
75                        conn.commit()
76                if data[3]: #displays field check. Static host and port for user session
77                        self.uid=int(data[1])
78                        self.gid=int(data[2])
79                        self.displays=[str(data[3])]
80                        self.env_options={}
81                        self.session_options={}
82                        if data[4]:
83                                self.env_options = parse_simple_dict(str(data[4]), ";")
84                        if data[5]:
85                                self.session_options=parse_simple_dict(str(data[5]), ";")
86                        sessions = self.uid, self.gid, self.displays, self.env_options, self.session_options
87                if data[0]: #dynamic session call
88                                #a=[]
89                                #a=xpra_lb.find_port(self.sql_file_name, self.username)
90                                #sessions = xpra_lb.create_session(self.sql_file_name, self.username, a[0], a[1])
91                                pass                   
92                if not data[0] and not data[3]:
93                        log.error("Error: sqlauth. No session type is identified")
94                        return None                     
95                return sessions
96
97def main():
98    def usage(msg="invalid number of arguments"):
99        print(msg)
100        print("usage: %s create|..." % sys.argv[0])
101        return 1
102    from xpra.platform import program_context
103    with program_context("SQL Auth", "SQL Auth"):
104        if len(sys.argv)!=3:
105                        return usage()
106                        cmd = sys.argv[1]
107                        if cmd=="create":
108                                #create new DB
109                                db_file_name = sys.argv[2]
110                                if os.path.exists(db_file_name):
111                                        log.error("Error: sqlauth. Can't create DB with such name. File exists")
112                                        return None     
113                                conn = sqlite3.connect(db_file_name)
114                                cursor = conn.cursor()
115                                sql_script=("""
116                                CREATE TABLE users (username CHAR UNIQUE, user_conn_str TEXT, password VARCHAR, user_name VARCHAR, user_surname VARCHAR, uid INTEGER, gid INTEGER, displays VARCHAR, env_options VARCHAR, session_options VARCHAR);   
117                                """)
118                                try:
119                                        cursor.executescript(sql_script)
120                                except sqlite3.DatabaseError as err:       
121                                        log.error("Error: DB creation problem:'%s'", err)
122                                        return
123                                else:
124                                        conn.commit()
125                                        conn.close
126                                        log("DB is created succesfully: ", db_file_name)                                                               
127
128                                pass
129                        elif cmd=="update":
130                                print("update")
131                                #for future needs
132                                #SELECT * from sqlite_master - local DB structure before update to new version
133                        else:
134                                return usage("invalid command '%s'" % cmd)
135    return 0
136
137if __name__ == "__main__":
138    r = main()
139    sys.exit(r)