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
39 def lock(con, arg, hard):
41 locks[arg]={'hard': hard, 'name': con.name, 'time': int(time.time())}
43 elif locks[arg]['hard']:
44 con.sock.send("HARD") # Hard lock - you can go get a cup of tea
46 con.sock.send("SOFT") # Soft lock - try in a second or two
49 def cmd_unlock(con, arg):
56 def cmd_lock_soft(con, arg):
59 def cmd_lock_hard(con, arg):
62 def cmd_show_locks(con):
63 cmd_log(con, "Dumping locks data:");
65 for lockdata in locks.iteritems():
67 cmd_log(con, "Tree: %s, Conn name: %s, Hard Lock: %s, Time: %s"
68 % (tree, data['name'], data['hard'], time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(data['time']))))
70 cmd_log(con, "No locks found.");
72 def cmd_log(con, msg):
73 logfile.write('%s [%s] -- %s\n' % (time.strftime('%Y-%m-%d %H:%M:%S'),
77 def cmd_name(con, name):
84 if not common.fileexists(common.ftpadmdir+'var/passwd'):
87 f=open(common.ftpadmdir+'var/passwd', 'r')
88 for line in f.xreadlines():
89 x=line.strip().split(':')
93 if not common.fileexists(common.ftpadmdir+'var/cookies'):
96 f=open(common.ftpadmdir+'var/cookies', 'r')
97 for line in f.xreadlines():
98 x=line.strip().split(':')
104 f=open(common.ftpadmdir+'var/cookies', 'w')
105 for key in cookies.keys():
106 f.write('%s:%s\n' % (key, cookies[key]))
109 def cmd_login_passwd(con, data):
115 md5pass=md5.new(passwd).hexdigest()
116 if login in users and users[login]==md5pass:
117 cookie=`time.time()`.split('.')[0]+'_'+md5.new(md5pass+salt).hexdigest()
118 cookies[cookie]=login
122 con.sock.send('OK '+cookie)
125 con.sock.send('FAIL')
128 def cmd_login_cookie(con, cookie):
129 if cookie in cookies:
132 con.username=cookies[cookie]
133 con.sock.send('OK '+cookies[cookie])
135 # TODO: log this (or not)
136 con.sock.send('FAIL')
139 if con.cookie in cookies:
140 del cookies[con.cookie]
144 global srctree, pkglist
145 srctree=ftptree.FtpTree(config.value['default_to'], loadall=True)
146 pkglist=srctree.keys()
149 def cmd_gettree(con):
151 for pkgnvr in pkglist:
152 # TODO: show only user's own pkgs
155 if pkg.marked4moving:
159 if pkg.marked4removal:
165 con.sock.send('%.6d' % (len(buf)-1))
166 con.sock.send(buf[1:])
168 con.sock.send('000000')
171 cmdlist_args={'lcks':cmd_lock_soft, 'lckh':cmd_lock_hard, 'ulck':cmd_unlock,
172 'log1':cmd_log, 'name':cmd_name, 'linp':cmd_login_passwd,
173 'linc':cmd_login_cookie}
175 cmdlist_noargs={'lout':cmd_logout, 'gett':cmd_gettree, 'slck':cmd_show_locks}
177 # Global stuff and initializations
181 logfile=open(common.ftpadmdir+'var/log', 'a')
184 salt=md5.new(`time.time()`).hexdigest()