xpra icon
Bug tracker and wiki

Ticket #1488: sql_auth_NEW.py

File sql_auth_NEW.py, 4.7 KB (added by Denis01, 20 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
13#temp. probably to be modified for sql file location reading. Copied from Multifile
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        #temp. probably to be modified for sql file location reading. Copied from Multifile
23        filename = kwargs.get("filename", password_file)       
24        if filename and not os.path.isabs(filename):
25            exec_cwd = kwargs.get("exec_cwd", os.getcwd())
26            filename = os.path.join(exec_cwd, filename)
27       
28        self.db_name=filename
29               
30        self.password_query = kwargs.get("password_query", "SELECT pass FROM users WHERE user_ipn=(?)")
31        self.sessions_query = kwargs.get("sessions_query", "SELECT user_conn_str, uid, gid, displays, env_options, session_options from users WHERE user_ipn=(?)")
32        self.authenticate = self.authenticate_hmac
33
34    def __repr__(self):
35        return "sql"
36
37    def get_password(self):
38                if os.path.exists(self.db_name):
39                        log("SQL_auth. Database found: '%s'", self.db_name)
40                else:
41                        log.error("SQL_auth. No database: '%s'", self.db_name)
42                        return
43               
44                conn = sqlite3.connect(self.db_name)
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("SQL_auth. DB problem:'%s'", err)
51                        return None
52                else: 
53                        conn.commit()
54               
55                if data:
56                        entry=str(data[0])
57                        return entry
58                else:
59                        log.error("SQL_auth. No user known in Database")
60                        return None
61
62
63    def get_sessions(self):
64                conn = sqlite3.connect(self.db_name)
65                cursor = conn.cursor()
66                try:
67                        cursor.execute(self.sessions_query, ([self.username]))
68                        data=cursor.fetchone()
69                except sqlite3.DatabaseError as err:
70                        log.error("SQL_sessions. DB is corrupted:'%s'", err)
71                        return None
72                else: 
73                        conn.commit()
74               
75                if data[3]: #displays field check. Static host and port for user session
76
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                        self.sessions = self.uid, self.gid, self.displays, self.env_options, self.session_options
87                       
88                else: #dynamic port/session initialisation
89                        pass
90                       
91                return self.sessions
92
93
94def main():
95    def usage(msg="invalid number of arguments"):
96        print(msg)
97        print("usage: %s create|..." % sys.argv[0])
98        return 1
99    from xpra.platform import program_context
100
101    # command line: .... create /root/xpra.sdb
102    # temp. Lately will be moved to "with program_context"     
103       
104    cmd = sys.argv[1]
105    if cmd=="create": 
106                if os.path.exists(sys.argv[2]):
107                        log.error("Can't create DB with such name. File exists")
108                        return None     
109                file_extension = os.path.splitext(sys.argv[2])[1]
110                print(file_extension)   
111                if file_extension!=".sdb":
112                        log.error("Wrong DB file extention required")
113                        return None   
114                conn = sqlite3.connect(sys.argv[2])
115                cursor = conn.cursor()
116                sql_script=("""
117                CREATE TABLE open_sessions (ip_host CHAR, port CHAR, user CHAR);
118                CREATE TABLE busy_ports (ip_host CHAR, port CHAR);
119                CREATE TABLE hosts (host_ip CHAR UNIQUE NOT NULL, port_s CHAR, port_e CHAR, login CHAR, password CHAR, adminserv CHAR, adminport CHAR, nodserver CHAR);
120                CREATE TABLE users (user_ipn CHAR UNIQUE, user_conn_str TEXT, pass VARCHAR, user_name VARCHAR, user_surname VARCHAR, uid INTEGER, gid INTEGER, displays VARCHAR, env_options VARCHAR, session_options VARCHAR);   
121                """)
122                try:
123                        cursor.executescript(sql_script)
124                except sqlite3.DatabaseError as err:       
125                        log.error("SQL_auth. DB creation problem:'%s'", err)
126                        return
127                else:
128                        conn.commit()
129                        conn.close
130                        print("DB is created succesfully: ", sys.argv[2])
131
132    with program_context("SQL Auth", "SQL Auth"):
133        if len(sys.argv)!=3:
134                        return usage()
135                        cmd = sys.argv[1]
136                        if cmd=="create":
137                                #create new DB
138
139                                pass
140                        elif cmd=="update":
141                                print("update")
142                                #for future needs
143                                #SELECT * from sqlite_master - local DB structure before update to new version
144                        else:
145                                return usage("invalid command '%s'" % cmd)
146    return 0
147
148if __name__ == "__main__":
149    r = main()
150    sys.exit(r)