blob: 749cf03dbd36f09edb92230b5a1d228a378f5620 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001/**************************************************************************
2** ftpd.c
3** Rumata@mg
4** 13.6.1999
5**
6** Ermittlung der Zugriffsrechte aus den Userdaten.
7**
8** Dieses Objekt wird vom ftpimp aus aufgerufen, der wiederum vom master
9** aufgerufen wird, um die Zugriffsrechte zu pruefen.
10**
11** Fuktionsweise:
12** + Im Master wird vom UNIX-ftpd aus FtpAccess (/secure/master/network)
13** aufgerufen.
14** + Dieses ruft dann, sobald ein Zugriff erkannt wird
15** QueryRead, QueryWrite oder QueryDir auf.
16** + Diese fragen den Master, ob der Zugriff legal ist.
17** + QueryDir liefert auch gleich das Ergebnis mit.
18**
19** Um ftp-zugriffe überwachen zu können, kann der ftpd eine liste der
20** ueberwachten spieler liefern und deren Zugriffe auf dem FTP Kanal ausgeben.
21**
22** add( name, zeit ) - FTP Zugriffe des Spielers 'name' werden protokolliert.
23** Nach 'zeit' wird dieser Zugriff automatisch beendet.
24** Ist 'zeit' <= 0, wir auf ewig ueberwacht.
25** sub( name ) - FTP Snoop fuer Spieler 'name' direkt aufheben.
26** list() - Mapping der ueberwachten Spieler zurueckgeben.
27**
28** FILES:
29** /secure/master/network.c
30** /secure/ftpd.c
31** /std/shells/filesys/ftpimp.c
32** /secure/ARCH/ftpd.o
33** /p/daemon/channeld.init
34**
35***************************************************************************/
36
37#include "/secure/wizlevels.h"
38#include "/sys/daemon.h"
39
40#define FTPDSAVE "/secure/ARCH/ftpd"
41#define FTPD_CH "FTP"
42#define BBMASTER "/secure/bbmaster"
43
44mapping monitored;
45// Zu jedem Spielernamen wird vermerkt, wie lange die Ueberwachung dauern soll.
46// Zahlen <= 0 bedeuten fuer immer.
47
48nomask void create() {
49 if( clonep(this_object()) ) {
50 destruct( this_object() );
51 return;
52 }
53 seteuid( getuid() );
54 if( !restore_object(FTPDSAVE) )
55 monitored = ([]);
56}
57
58nomask int player_exists( string user ) {
59 user = lower_case(user);
60 if( !stringp( user ) || sizeof( user ) < 1 ) return 0;
61 return file_size( "/save/"+user[0..0]+"/"+user+".o" ) > 0;
62}
63
64nomask varargs int add( string user, int timeout ) {
65 if( !ARCH_SECURITY ) return -1;
66 if( !player_exists(user) ) return -2;
67 monitored[user] = timeout;
68 save_object( FTPDSAVE );
69 return 0;
70}
71
72nomask int sub( string user ) {
73 if( !ARCH_SECURITY ) return -1;
74 if( !player_exists(user) ) return -2;
75 monitored -= ([ user ]);
76 save_object( FTPDSAVE );
77 return 0;
78}
79
80nomask mixed list() {
81 if( !ARCH_SECURITY ) return -1;
82 return deep_copy(monitored);
83}
84
85#define NEWIMP "yes"
86
87private object findFtpImpFor( string user ) {
88#ifdef NEWIMP
89 return "/secure/impfetch"->impFor( lower_case(user) );
90#else
91 object imp;
92 string fname;
93
94 user = lower_case( user );
95 fname = "/ftpimp:" + user;
96 imp = find_object( fname );
97 if( !objectp(imp) ) {
98 imp = clone_object( "secure/ftpimp" );
99 imp->SetUser(user);
100 rename_object( imp, fname );
101 }
102 return imp;
103#endif
104}
105
106private nomask void msg( string user, string m ) {
107 int timeout;
108 object r;
109
110 if( !stringp(user) ) return;
111 m += "\n";
112 if( (r=find_player("rumata")) && user=="atamur" ) {
113 timeout = CHMASTER->send(FTPD_CH,findFtpImpFor(user), m );
114 tell_object( r, sprintf("%O\n", findFtpImpFor(user) ) );
115 }
116 BBMASTER->ftpbb(user,m);
117 if( !member(monitored,user) ) return;
118 timeout = monitored[user];
119 if( timeout > 0 && timeout < time() ) {
120 sub( user );
121 return;
122 }
123 CHMASTER->send(FTPD_CH,findFtpImpFor(user), m );
124}
125
126nomask int secure() {
127 return previous_object()==find_object(MASTER);
128}
129
130nomask mixed QueryRead( string user, string file ) {
131 if( !secure() ) return -1;
132 if( (IS_WIZARD(user) || file[0..4]=="/open")
133 && file[0] == '/'
134 && MASTER->valid_read(file, user, "read_file", 0)
135 ) {
136 msg( user, "read " + file );
137 return "OK";
138 } else {
139 return "FAIL";
140 }
141}
142
143nomask mixed QueryWrite( string user, string file ) {
144 if( !secure() ) return -1;
145 if( file[0] == '/'
146 && MASTER->valid_write( file, user, "write_file", 0)
147 ) {
148 msg( user, "write " + file );
149 return "OK";
150 } else {
151 return "FAIL";
152 }
153}
154
155#define DBG(x) if(find_player("rumata")){tell_object(find_player("rumata"),"FTPD:"+x+"\n");}
156
157//nomask mixed QueryDir( string user, string file ) {
158// string reply;
159// object imp;
160//
161// if( !secure() ) return -1;
162// reply = QueryRead( user, file );
163// if( reply=="FAIL" ) return -1;
164//
165// imp = findFtpImpFor( user );
166// if( !objectp(imp) ) return -1; // should never happen
167//
168// return imp->GetDir( file );
169//}
170
171nomask mixed QueryDir( string user, string file ) {
172 if( !secure() ) return -1;
173 if( file[0] == '/'
174 && MASTER->valid_read( file+"/*", user, "get_dir", 0))
175 return "OK";
176 else
177 return "FAIL";
178}