e197952cdf304a64191ebe850effbf5849d56a8a
[citadel.git] / ctdlphp / ctdlprotocol.php
1 <?PHP
2
3 // $Id$
4 // 
5 // Implements various Citadel server commands.
6 //
7 // Copyright (c) 2003 by Art Cancro <ajc@uncensored.citadel.org>
8 // This program is released under the terms of the GNU General Public License.
9 //
10
11
12 //
13 // serv_gets() -- generic function to read one line of text from the server
14 //
15 function serv_gets() {
16         global $clientsocket;
17
18         $buf = fgets($clientsocket, 4096);              // Read line
19         $buf = substr($buf, 0, (strlen($buf)-1) );      // strip trailing LF
20         return $buf;
21 }
22
23
24 //
25 // serv_puts() -- generic function to write one line of text to the server
26 //
27 function serv_puts($buf) {
28         global $clientsocket;
29         
30         fwrite($clientsocket, $buf . "\n", (strlen($buf)+1) );
31 }
32
33
34
35 //
36 // Identify this client, and the hostname where the user is, to Citadel.
37 //
38 function ctdl_iden() {
39         global $clientsocket;
40
41         serv_puts("IDEN 0|8|001|PHP web client|" . $_SERVER['REMOTE_ADDR'] );
42         $buf = serv_gets();
43 }
44
45
46
47 //
48 // login_existing_user() -- attempt to login using a supplied username/password
49 // Returns an array with two variables:
50 // 0. TRUE or FALSE to determine success or failure
51 // 1. String error message (if relevant)
52 //
53 function login_existing_user($user, $pass) {
54         global $clientsocket;
55
56         serv_puts("USER " . $user);
57         $resp = serv_gets();
58         if (substr($resp, 0, 1) != "3") {
59                 return array(FALSE, substr($resp, 4));
60         }
61
62         serv_puts("PASS " . $pass);
63         $resp = serv_gets();
64         if (substr($resp, 0, 1) != "2") {
65                 return array(FALSE, substr($resp, 4));
66         }
67
68         $_SESSION["username"] = $user;
69         $_SESSION["password"] = $pass;
70         become_logged_in(substr($resp, 4));
71
72         return array(TRUE, "Login successful.  Have fun.");
73 }
74
75
76 //
77 // create_new_user() -- attempt to create a new user 
78 //                      using a supplied username/password
79 // Returns an array with two variables:
80 // 0. TRUE or FALSE to determine success or failure
81 // 1. String error message (if relevant)
82 //
83 function create_new_user($user, $pass) {
84         global $clientsocket;
85
86         serv_puts("NEWU " . $user);
87         $resp = serv_gets();
88         if (substr($resp, 0, 1) != "2") {
89                 return array(FALSE, substr($resp, 4));
90         }
91
92         serv_puts("SETP " . $pass);
93         $resp = serv_gets();
94         if (substr($resp, 0, 1) != "2") {
95                 return array(FALSE, substr($resp, 4));
96         }
97
98         $_SESSION["username"] = $user;
99         $_SESSION["password"] = $pass;
100         become_logged_in(substr($resp, 4));
101
102         return array(TRUE, "Login successful.  Have fun.");
103 }
104
105
106 //
107 // Code common to both existing-user and new-user logins
108 //
109 function become_logged_in($server_parms) {
110         $_SESSION["logged_in"] = 1;
111 }
112
113
114
115 //
116 // Learn all sorts of interesting things about the Citadel server to
117 // which we are connected.
118 //
119 function ctdl_get_serv_info() {
120         serv_puts("INFO");
121         $buf = serv_gets();
122         if (substr($buf, 0, 1) == "1") {
123                 $i = 0;
124                 do {
125                         $buf = serv_gets();
126                         if ($i == 2) $_SESSION["serv_humannode"] = $buf;
127                         if ($i == 4) $_SESSION["serv_software"] = $buf;
128                         $i = $i + 1;
129                 } while (strcasecmp($buf, "000"));
130         }
131
132 }
133
134
135 //
136 // Temporary function to verify communication with the Citadel server.
137 //
138 function test_for_echo() {
139         global $clientsocket, $session;
140
141         $command = "ECHO Video vertigo ... test for echo.";
142         serv_puts($command);
143         $response = serv_gets();
144         echo $response, "<BR>";
145         flush();
146 }
147
148
149 //
150 // Display a system banner.
151 // (This is probably temporary because it outputs more or less finalized
152 // markup.  For now it's just usable.)
153 //
154 function ctdl_mesg($msgname) {
155         global $clientsocket;
156
157         serv_puts("MESG " . $msgname);
158         $response = serv_gets();
159         
160         if (substr($response, 0, 1) == "1") {
161                 echo "<DIV ALIGN=CENTER>\n";
162                 while (strcmp($buf = serv_gets(), "000")) {
163                         echo "<TT>", $buf, "</TT><BR>\n" ;
164                 }
165                 echo "</DIV>\n";
166         }
167         else {
168                 echo "<B><I>", substr($response, 4), "</I></B><BR>\n";
169         }
170 }
171
172
173 //
174 // Fetch the list of users currently logged in.
175 //
176 function ctdl_rwho() {
177         global $clientsocket;
178
179         serv_puts("RWHO");
180         $response = serv_gets();
181
182         if (substr($response, 0, 1) != "1") {
183                 return array(0, NULL);
184         }
185         
186         $all_lines = array();
187         $num_lines = 0;
188
189         while (strcmp($buf = serv_gets(), "000")) {
190
191                 $thisline = array();
192
193                 $tok = strtok($buf, "|");
194                 if ($tok) $thisline["session"] = $tok;
195
196                 $tok = strtok("|");
197                 if ($tok) $thisline["user"] = $tok;
198                 
199                 $tok = strtok("|");
200                 if ($tok) $thisline["room"] = $tok;
201                 
202                 $tok = strtok("|");
203                 if ($tok) $thisline["host"] = $tok;
204                 
205                 $tok = strtok("|");
206                 if ($tok) $thisline["client"] = $tok;
207
208                 // IGnore the rest of the fields for now.
209
210                 $num_lines = array_push($all_lines, $thisline);
211         }
212
213         return array($num_lines, $all_lines);
214
215 }
216
217
218
219 ?>