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())}
42 elif locks[arg]['hard']:
43 con.sock.send("HARD") # Hard lock - you can go get a cup of tea
45 con.sock.send("SOFT") # Soft lock - try in a second or two
47 def cmd_unlock(con, arg):
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("BLOB:%d" % len(res))
73 cmd_log(con, "No locks found.");
74 con.sock.send("NLCK");
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')
91 for line in f.xreadlines():
92 x=line.strip().split(':')
96 if not common.fileexists(common.ftpadmdir+'/var/cookies'):
99 f=open(common.ftpadmdir+'/var/cookies', 'r')
100 for line in f.xreadlines():
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=md5.new(passwd).hexdigest()
119 if login in users and users[login]==md5pass:
120 cookie=`time.time()`.split('.')[0]+'_'+md5.new(md5pass+salt).hexdigest()
121 cookies[cookie]=login
125 con.sock.send('OK '+cookie)
128 con.sock.send('FAIL')
131 def cmd_login_cookie(con, cookie):
132 if cookie in cookies:
135 con.username=cookies[cookie]
136 con.sock.send('OK '+cookies[cookie])
138 # TODO: log this (or not)
139 con.sock.send('FAIL')
142 if con.cookie in cookies:
143 del cookies[con.cookie]
147 global srctree, pkglist
148 srctree=ftptree.FtpTree(config.value['default_to'], loadall=True)
149 pkglist=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('%.6d' % (len(buf)-1))
169 con.sock.send(buf[1:])
171 con.sock.send('000000')
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=md5.new(`time.time()`).hexdigest()