1 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et
12 if '\0' not in con.data:
14 cmds=con.data.split('\0')[:-1]
17 con.data=con.data[len(cmd)+1:]
19 if not con.authorized and cmdname not in ('linp', 'linc', 'name'):
21 # TODO: log unauthorized access
22 if cmdname in cmdlist_noargs:
24 cmdlist_noargs[cmdname](con)
27 # TODO: log malicious msg
28 elif cmdname in cmdlist_args:
30 cmdlist_args[cmdname](con, cmd[5:])
33 # TODO: log malicious msg
38 def lock(con, arg, hard):
40 locks[arg]={'hard': hard, 'name': con.name, 'time': int(time.time())}
41 con.sock.send(bytearray("OK", encoding='utf-8'))
42 elif locks[arg]['hard']:
43 con.sock.send(bytearray("HARD", encoding='utf-8')) # Hard lock - you can go get a cup of tea
45 con.sock.send(bytearray("SOFT", encoding='utf-8')) # Soft lock - try in a second or two
47 def cmd_unlock(con, arg):
50 con.sock.send(bytearray("OK", encoding='utf-8'))
52 con.sock.send(bytearray("FAIL", encoding='utf-8'))
54 def cmd_lock_soft(con, arg):
57 def cmd_lock_hard(con, arg):
60 def cmd_show_locks(con):
61 cmd_log(con, "Dumping locks data:");
64 for lockdata in locks.items():
66 msg = "Tree: %s, Conn name: %s, Hard Lock: %s, Time: %s" % (
67 tree, data['name'], data['hard'], time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(data['time'])))
70 # con.sock.send(bytearray("BLOB:%d" % len(res), encoding='utf-8')))
71 con.sock.send(bytearray(res, encoding='utf-8'))
73 cmd_log(con, "No locks found.")
74 con.sock.send(bytearray("NLCK", encoding='utf-8'))
76 def cmd_log(con, msg):
77 logfile.write('%s [%s] -- %s\n' % (time.strftime('%Y-%m-%d %H:%M:%S'), con.name, msg))
80 def cmd_name(con, name):
87 if not common.fileexists(common.ftpadmdir+'/var/passwd'):
90 f=open(common.ftpadmdir+'/var/passwd', 'r')
92 x=line.strip().split(':')
96 if not common.fileexists(common.ftpadmdir+'/var/cookies'):
99 f=open(common.ftpadmdir+'/var/cookies', 'r')
101 x=line.strip().split(':')
107 f=open(common.ftpadmdir+'/var/cookies', 'w')
108 for key in cookies.keys():
109 f.write('%s:%s\n' % (key, cookies[key]))
112 def cmd_login_passwd(con, data):
118 md5pass=hashlib.md5(passwd.encode('utf-8')).hexdigest()
119 if login in users and users[login] == md5pass:
120 fullpass = md5pass+salt
121 cookie=repr(time.time()).split('.')[0]+'_'+hashlib.md5(fullpass.encode('utf-8')).hexdigest()
122 cookies[cookie]=login
126 con.sock.send(bytearray('OK '+cookie, encoding='utf-8'))
129 con.sock.send(bytearray('FAIL', encoding='utf-8'))
132 def cmd_login_cookie(con, cookie):
133 if cookie in cookies:
136 con.username=cookies[cookie]
137 con.sock.send(bytearray('OK '+cookies[cookie], encoding='utf-8'))
139 # TODO: log this (or not)
140 con.sock.send(bytearray('FAIL'))
143 if con.cookie in cookies:
144 del cookies[con.cookie]
148 global srctree, pkglist
149 srctree=ftptree.FtpTree(config.value['default_to'], loadall=True)
150 pkglist=sorted(srctree.keys())
152 def cmd_gettree(con):
154 for pkgnvr in pkglist:
155 # TODO: show only user's own pkgs
158 if pkg.marked4moving:
162 if pkg.marked4removal:
168 con.sock.send(bytearray('%.6d' % (len(buf)-1), encoding='utf-8'))
169 con.sock.send(bytearray(buf[1:], encoding='utf-8'))
171 con.sock.send(bytearray('000000', encoding='utf-8'))
174 cmdlist_args={'lcks':cmd_lock_soft, 'lckh':cmd_lock_hard, 'ulck':cmd_unlock,
175 'log1':cmd_log, 'name':cmd_name, 'linp':cmd_login_passwd,
176 'linc':cmd_login_cookie}
178 cmdlist_noargs={'lout':cmd_logout, 'gett':cmd_gettree, 'slck':cmd_show_locks}
180 # Global stuff and initializations
184 logfile=open(common.ftpadmdir+'/var/log', 'a')
187 salt=hashlib.md5(repr(time.time()).encode('utf-8')).hexdigest()