]>
Commit | Line | Data |
---|---|---|
1 | # vi: encoding=utf-8 ts=8 sts=4 sw=4 et | |
2 | ||
3 | import os | |
4 | import time | |
5 | ||
6 | BailOut="BailOut" | |
7 | ||
8 | def parse(con): | |
9 | if '\0' not in con.data: | |
10 | return | |
11 | cmds=con.data.split('\0')[:-1] | |
12 | ||
13 | for cmd in cmds: | |
14 | con.data=con.data[len(cmd)+1:] | |
15 | cmdname=cmd[:4] | |
16 | if not con.authorized and not (cmdname=='linp' or cmdname=='linc'): | |
17 | raise BailOut | |
18 | # TODO: log unauthorized access | |
19 | if cmdname in cmdlist_noargs: | |
20 | if len(cmd)==4: | |
21 | cmdlist_noargs[cmdname](con) | |
22 | else: | |
23 | pass | |
24 | # TODO: log malicious msg | |
25 | elif cmdname in cmdlist_args: | |
26 | if len(cmd)>5: | |
27 | cmdlist_args[cmdname](con, cmd[5:]) | |
28 | else: | |
29 | pass | |
30 | # TODO: log malicious msg | |
31 | else: | |
32 | raise BailOut | |
33 | # TODO: log this | |
34 | ||
35 | locks={} | |
36 | ||
37 | def lock(con, arg, hard): | |
38 | if arg not in locks: | |
39 | locks[arg]=hard | |
40 | con.sock.send("OK") | |
41 | elif locks[arg]: | |
42 | con.sock.send("HARD") # Hard lock - you can go get a cup of tea | |
43 | else: | |
44 | con.sock.send("SOFT") # Soft lock - try in a second or two | |
45 | ||
46 | ||
47 | def cmd_unlock(con, arg): | |
48 | if arg in locks: | |
49 | del locks[arg] | |
50 | ||
51 | def cmd_lock_soft(con, arg): | |
52 | lock(con, arg, False) | |
53 | ||
54 | def cmd_lock_hard(con, arg): | |
55 | lock(con, arg, True) | |
56 | ||
57 | logfile=open(os.environ['HOME']+'/pld-ftp-admin/var/log', 'a') | |
58 | ||
59 | def cmd_log(con, msg): | |
60 | logfile.write('%s [%s] -- %s\n' % (time.strftime('%Y-%m-%d %H:%M:%S'), | |
61 | con.name, msg)) | |
62 | logfile.flush() | |
63 | ||
64 | def cmd_name(con, name): | |
65 | con.name=name | |
66 | ||
67 | def cmd_login_passwd(con, data): | |
68 | tmp=data.split('\n') | |
69 | if len(tmp)!=2: | |
70 | raise BailOut | |
71 | login=tmp[0] | |
72 | passwd=tmp[1] | |
73 | if login=='mmazur' and passwd=='ziew': | |
74 | con.sock.send('OK ciasteczko') | |
75 | else: | |
76 | # TODO: log this | |
77 | con.sock.send('FAIL') | |
78 | raise BailOut | |
79 | ||
80 | def cmd_login_cookie(con, cookie): | |
81 | if cookie=='ciasteczko': | |
82 | con.sock.send('OK mmazur') | |
83 | else: | |
84 | # TODO: log this (or not) | |
85 | con.sock.send('FAIL') | |
86 | ||
87 | def cmd_logout(con): | |
88 | # TODO: remove cookie | |
89 | pass | |
90 | ||
91 | cmdlist_args={'lcks':cmd_lock_soft, 'lckh':cmd_lock_hard, 'ulck':cmd_unlock, | |
92 | 'log1':cmd_log, 'name':cmd_name, 'linp':cmd_login_passwd, | |
93 | 'linc':cmd_login_cookie} | |
94 | ||
95 | cmdlist_noargs={'lout':cmd_logout} | |
96 | ||
97 |