|
1 <?php |
|
2 /** |
|
3 * mail_fetch/setup.php |
|
4 * |
|
5 * @package SquirrelMail |
|
6 * |
|
7 * @copyright (c) 1999-2006 The SquirrelMail Project Team |
|
8 * |
|
9 * @copyright (c) 1999 CDI (cdi@thewebmasters.net) All Rights Reserved |
|
10 * Modified by Philippe Mingo 2001 mingo@rotedic.com |
|
11 * An RFC 1939 compliant wrapper class for the POP3 protocol. |
|
12 * |
|
13 * Licensed under the GNU GPL. For full terms see the file COPYING. |
|
14 * |
|
15 * pop3 class |
|
16 * |
|
17 * $Id: class-pop3.php 9503 2008-11-03 23:25:11Z ryan $ |
|
18 */ |
|
19 |
|
20 class POP3 { |
|
21 var $ERROR = ''; // Error string. |
|
22 |
|
23 var $TIMEOUT = 60; // Default timeout before giving up on a |
|
24 // network operation. |
|
25 |
|
26 var $COUNT = -1; // Mailbox msg count |
|
27 |
|
28 var $BUFFER = 512; // Socket buffer for socket fgets() calls. |
|
29 // Per RFC 1939 the returned line a POP3 |
|
30 // server can send is 512 bytes. |
|
31 |
|
32 var $FP = ''; // The connection to the server's |
|
33 // file descriptor |
|
34 |
|
35 var $MAILSERVER = ''; // Set this to hard code the server name |
|
36 |
|
37 var $DEBUG = FALSE; // set to true to echo pop3 |
|
38 // commands and responses to error_log |
|
39 // this WILL log passwords! |
|
40 |
|
41 var $BANNER = ''; // Holds the banner returned by the |
|
42 // pop server - used for apop() |
|
43 |
|
44 var $ALLOWAPOP = FALSE; // Allow or disallow apop() |
|
45 // This must be set to true |
|
46 // manually |
|
47 |
|
48 function POP3 ( $server = '', $timeout = '' ) { |
|
49 settype($this->BUFFER,"integer"); |
|
50 if( !empty($server) ) { |
|
51 // Do not allow programs to alter MAILSERVER |
|
52 // if it is already specified. They can get around |
|
53 // this if they -really- want to, so don't count on it. |
|
54 if(empty($this->MAILSERVER)) |
|
55 $this->MAILSERVER = $server; |
|
56 } |
|
57 if(!empty($timeout)) { |
|
58 settype($timeout,"integer"); |
|
59 $this->TIMEOUT = $timeout; |
|
60 if (!ini_get('safe_mode')) |
|
61 set_time_limit($timeout); |
|
62 } |
|
63 return true; |
|
64 } |
|
65 |
|
66 function update_timer () { |
|
67 if (!ini_get('safe_mode')) |
|
68 set_time_limit($this->TIMEOUT); |
|
69 return true; |
|
70 } |
|
71 |
|
72 function connect ($server, $port = 110) { |
|
73 // Opens a socket to the specified server. Unless overridden, |
|
74 // port defaults to 110. Returns true on success, false on fail |
|
75 |
|
76 // If MAILSERVER is set, override $server with it's value |
|
77 |
|
78 if (!isset($port) || !$port) {$port = 110;} |
|
79 if(!empty($this->MAILSERVER)) |
|
80 $server = $this->MAILSERVER; |
|
81 |
|
82 if(empty($server)){ |
|
83 $this->ERROR = "POP3 connect: " . _("No server specified"); |
|
84 unset($this->FP); |
|
85 return false; |
|
86 } |
|
87 |
|
88 $fp = @fsockopen("$server", $port, $errno, $errstr); |
|
89 |
|
90 if(!$fp) { |
|
91 $this->ERROR = "POP3 connect: " . _("Error ") . "[$errno] [$errstr]"; |
|
92 unset($this->FP); |
|
93 return false; |
|
94 } |
|
95 |
|
96 socket_set_blocking($fp,-1); |
|
97 $this->update_timer(); |
|
98 $reply = fgets($fp,$this->BUFFER); |
|
99 $reply = $this->strip_clf($reply); |
|
100 if($this->DEBUG) |
|
101 error_log("POP3 SEND [connect: $server] GOT [$reply]",0); |
|
102 if(!$this->is_ok($reply)) { |
|
103 $this->ERROR = "POP3 connect: " . _("Error ") . "[$reply]"; |
|
104 unset($this->FP); |
|
105 return false; |
|
106 } |
|
107 $this->FP = $fp; |
|
108 $this->BANNER = $this->parse_banner($reply); |
|
109 return true; |
|
110 } |
|
111 |
|
112 function user ($user = "") { |
|
113 // Sends the USER command, returns true or false |
|
114 |
|
115 if( empty($user) ) { |
|
116 $this->ERROR = "POP3 user: " . _("no login ID submitted"); |
|
117 return false; |
|
118 } elseif(!isset($this->FP)) { |
|
119 $this->ERROR = "POP3 user: " . _("connection not established"); |
|
120 return false; |
|
121 } else { |
|
122 $reply = $this->send_cmd("USER $user"); |
|
123 if(!$this->is_ok($reply)) { |
|
124 $this->ERROR = "POP3 user: " . _("Error ") . "[$reply]"; |
|
125 return false; |
|
126 } else |
|
127 return true; |
|
128 } |
|
129 } |
|
130 |
|
131 function pass ($pass = "") { |
|
132 // Sends the PASS command, returns # of msgs in mailbox, |
|
133 // returns false (undef) on Auth failure |
|
134 |
|
135 if(empty($pass)) { |
|
136 $this->ERROR = "POP3 pass: " . _("No password submitted"); |
|
137 return false; |
|
138 } elseif(!isset($this->FP)) { |
|
139 $this->ERROR = "POP3 pass: " . _("connection not established"); |
|
140 return false; |
|
141 } else { |
|
142 $reply = $this->send_cmd("PASS $pass"); |
|
143 if(!$this->is_ok($reply)) { |
|
144 $this->ERROR = "POP3 pass: " . _("Authentication failed") . " [$reply]"; |
|
145 $this->quit(); |
|
146 return false; |
|
147 } else { |
|
148 // Auth successful. |
|
149 $count = $this->last("count"); |
|
150 $this->COUNT = $count; |
|
151 return $count; |
|
152 } |
|
153 } |
|
154 } |
|
155 |
|
156 function apop ($login,$pass) { |
|
157 // Attempts an APOP login. If this fails, it'll |
|
158 // try a standard login. YOUR SERVER MUST SUPPORT |
|
159 // THE USE OF THE APOP COMMAND! |
|
160 // (apop is optional per rfc1939) |
|
161 |
|
162 if(!isset($this->FP)) { |
|
163 $this->ERROR = "POP3 apop: " . _("No connection to server"); |
|
164 return false; |
|
165 } elseif(!$this->ALLOWAPOP) { |
|
166 $retVal = $this->login($login,$pass); |
|
167 return $retVal; |
|
168 } elseif(empty($login)) { |
|
169 $this->ERROR = "POP3 apop: " . _("No login ID submitted"); |
|
170 return false; |
|
171 } elseif(empty($pass)) { |
|
172 $this->ERROR = "POP3 apop: " . _("No password submitted"); |
|
173 return false; |
|
174 } else { |
|
175 $banner = $this->BANNER; |
|
176 if( (!$banner) or (empty($banner)) ) { |
|
177 $this->ERROR = "POP3 apop: " . _("No server banner") . ' - ' . _("abort"); |
|
178 $retVal = $this->login($login,$pass); |
|
179 return $retVal; |
|
180 } else { |
|
181 $AuthString = $banner; |
|
182 $AuthString .= $pass; |
|
183 $APOPString = md5($AuthString); |
|
184 $cmd = "APOP $login $APOPString"; |
|
185 $reply = $this->send_cmd($cmd); |
|
186 if(!$this->is_ok($reply)) { |
|
187 $this->ERROR = "POP3 apop: " . _("apop authentication failed") . ' - ' . _("abort"); |
|
188 $retVal = $this->login($login,$pass); |
|
189 return $retVal; |
|
190 } else { |
|
191 // Auth successful. |
|
192 $count = $this->last("count"); |
|
193 $this->COUNT = $count; |
|
194 return $count; |
|
195 } |
|
196 } |
|
197 } |
|
198 } |
|
199 |
|
200 function login ($login = "", $pass = "") { |
|
201 // Sends both user and pass. Returns # of msgs in mailbox or |
|
202 // false on failure (or -1, if the error occurs while getting |
|
203 // the number of messages.) |
|
204 |
|
205 if( !isset($this->FP) ) { |
|
206 $this->ERROR = "POP3 login: " . _("No connection to server"); |
|
207 return false; |
|
208 } else { |
|
209 $fp = $this->FP; |
|
210 if( !$this->user( $login ) ) { |
|
211 // Preserve the error generated by user() |
|
212 return false; |
|
213 } else { |
|
214 $count = $this->pass($pass); |
|
215 if( (!$count) || ($count == -1) ) { |
|
216 // Preserve the error generated by last() and pass() |
|
217 return false; |
|
218 } else |
|
219 return $count; |
|
220 } |
|
221 } |
|
222 } |
|
223 |
|
224 function top ($msgNum, $numLines = "0") { |
|
225 // Gets the header and first $numLines of the msg body |
|
226 // returns data in an array with each returned line being |
|
227 // an array element. If $numLines is empty, returns |
|
228 // only the header information, and none of the body. |
|
229 |
|
230 if(!isset($this->FP)) { |
|
231 $this->ERROR = "POP3 top: " . _("No connection to server"); |
|
232 return false; |
|
233 } |
|
234 $this->update_timer(); |
|
235 |
|
236 $fp = $this->FP; |
|
237 $buffer = $this->BUFFER; |
|
238 $cmd = "TOP $msgNum $numLines"; |
|
239 fwrite($fp, "TOP $msgNum $numLines\r\n"); |
|
240 $reply = fgets($fp, $buffer); |
|
241 $reply = $this->strip_clf($reply); |
|
242 if($this->DEBUG) { |
|
243 @error_log("POP3 SEND [$cmd] GOT [$reply]",0); |
|
244 } |
|
245 if(!$this->is_ok($reply)) |
|
246 { |
|
247 $this->ERROR = "POP3 top: " . _("Error ") . "[$reply]"; |
|
248 return false; |
|
249 } |
|
250 |
|
251 $count = 0; |
|
252 $MsgArray = array(); |
|
253 |
|
254 $line = fgets($fp,$buffer); |
|
255 while ( !ereg("^\.\r\n",$line)) |
|
256 { |
|
257 $MsgArray[$count] = $line; |
|
258 $count++; |
|
259 $line = fgets($fp,$buffer); |
|
260 if(empty($line)) { break; } |
|
261 } |
|
262 |
|
263 return $MsgArray; |
|
264 } |
|
265 |
|
266 function pop_list ($msgNum = "") { |
|
267 // If called with an argument, returns that msgs' size in octets |
|
268 // No argument returns an associative array of undeleted |
|
269 // msg numbers and their sizes in octets |
|
270 |
|
271 if(!isset($this->FP)) |
|
272 { |
|
273 $this->ERROR = "POP3 pop_list: " . _("No connection to server"); |
|
274 return false; |
|
275 } |
|
276 $fp = $this->FP; |
|
277 $Total = $this->COUNT; |
|
278 if( (!$Total) or ($Total == -1) ) |
|
279 { |
|
280 return false; |
|
281 } |
|
282 if($Total == 0) |
|
283 { |
|
284 return array("0","0"); |
|
285 // return -1; // mailbox empty |
|
286 } |
|
287 |
|
288 $this->update_timer(); |
|
289 |
|
290 if(!empty($msgNum)) |
|
291 { |
|
292 $cmd = "LIST $msgNum"; |
|
293 fwrite($fp,"$cmd\r\n"); |
|
294 $reply = fgets($fp,$this->BUFFER); |
|
295 $reply = $this->strip_clf($reply); |
|
296 if($this->DEBUG) { |
|
297 @error_log("POP3 SEND [$cmd] GOT [$reply]",0); |
|
298 } |
|
299 if(!$this->is_ok($reply)) |
|
300 { |
|
301 $this->ERROR = "POP3 pop_list: " . _("Error ") . "[$reply]"; |
|
302 return false; |
|
303 } |
|
304 list($junk,$num,$size) = preg_split('/\s+/',$reply); |
|
305 return $size; |
|
306 } |
|
307 $cmd = "LIST"; |
|
308 $reply = $this->send_cmd($cmd); |
|
309 if(!$this->is_ok($reply)) |
|
310 { |
|
311 $reply = $this->strip_clf($reply); |
|
312 $this->ERROR = "POP3 pop_list: " . _("Error ") . "[$reply]"; |
|
313 return false; |
|
314 } |
|
315 $MsgArray = array(); |
|
316 $MsgArray[0] = $Total; |
|
317 for($msgC=1;$msgC <= $Total; $msgC++) |
|
318 { |
|
319 if($msgC > $Total) { break; } |
|
320 $line = fgets($fp,$this->BUFFER); |
|
321 $line = $this->strip_clf($line); |
|
322 if(ereg("^\.",$line)) |
|
323 { |
|
324 $this->ERROR = "POP3 pop_list: " . _("Premature end of list"); |
|
325 return false; |
|
326 } |
|
327 list($thisMsg,$msgSize) = preg_split('/\s+/',$line); |
|
328 settype($thisMsg,"integer"); |
|
329 if($thisMsg != $msgC) |
|
330 { |
|
331 $MsgArray[$msgC] = "deleted"; |
|
332 } |
|
333 else |
|
334 { |
|
335 $MsgArray[$msgC] = $msgSize; |
|
336 } |
|
337 } |
|
338 return $MsgArray; |
|
339 } |
|
340 |
|
341 function get ($msgNum) { |
|
342 // Retrieve the specified msg number. Returns an array |
|
343 // where each line of the msg is an array element. |
|
344 |
|
345 if(!isset($this->FP)) |
|
346 { |
|
347 $this->ERROR = "POP3 get: " . _("No connection to server"); |
|
348 return false; |
|
349 } |
|
350 |
|
351 $this->update_timer(); |
|
352 |
|
353 $fp = $this->FP; |
|
354 $buffer = $this->BUFFER; |
|
355 $cmd = "RETR $msgNum"; |
|
356 $reply = $this->send_cmd($cmd); |
|
357 |
|
358 if(!$this->is_ok($reply)) |
|
359 { |
|
360 $this->ERROR = "POP3 get: " . _("Error ") . "[$reply]"; |
|
361 return false; |
|
362 } |
|
363 |
|
364 $count = 0; |
|
365 $MsgArray = array(); |
|
366 |
|
367 $line = fgets($fp,$buffer); |
|
368 while ( !ereg("^\.\r\n",$line)) |
|
369 { |
|
370 if ( $line{0} == '.' ) { $line = substr($line,1); } |
|
371 $MsgArray[$count] = $line; |
|
372 $count++; |
|
373 $line = fgets($fp,$buffer); |
|
374 if(empty($line)) { break; } |
|
375 } |
|
376 return $MsgArray; |
|
377 } |
|
378 |
|
379 function last ( $type = "count" ) { |
|
380 // Returns the highest msg number in the mailbox. |
|
381 // returns -1 on error, 0+ on success, if type != count |
|
382 // results in a popstat() call (2 element array returned) |
|
383 |
|
384 $last = -1; |
|
385 if(!isset($this->FP)) |
|
386 { |
|
387 $this->ERROR = "POP3 last: " . _("No connection to server"); |
|
388 return $last; |
|
389 } |
|
390 |
|
391 $reply = $this->send_cmd("STAT"); |
|
392 if(!$this->is_ok($reply)) |
|
393 { |
|
394 $this->ERROR = "POP3 last: " . _("Error ") . "[$reply]"; |
|
395 return $last; |
|
396 } |
|
397 |
|
398 $Vars = preg_split('/\s+/',$reply); |
|
399 $count = $Vars[1]; |
|
400 $size = $Vars[2]; |
|
401 settype($count,"integer"); |
|
402 settype($size,"integer"); |
|
403 if($type != "count") |
|
404 { |
|
405 return array($count,$size); |
|
406 } |
|
407 return $count; |
|
408 } |
|
409 |
|
410 function reset () { |
|
411 // Resets the status of the remote server. This includes |
|
412 // resetting the status of ALL msgs to not be deleted. |
|
413 // This method automatically closes the connection to the server. |
|
414 |
|
415 if(!isset($this->FP)) |
|
416 { |
|
417 $this->ERROR = "POP3 reset: " . _("No connection to server"); |
|
418 return false; |
|
419 } |
|
420 $reply = $this->send_cmd("RSET"); |
|
421 if(!$this->is_ok($reply)) |
|
422 { |
|
423 // The POP3 RSET command -never- gives a -ERR |
|
424 // response - if it ever does, something truely |
|
425 // wild is going on. |
|
426 |
|
427 $this->ERROR = "POP3 reset: " . _("Error ") . "[$reply]"; |
|
428 @error_log("POP3 reset: ERROR [$reply]",0); |
|
429 } |
|
430 $this->quit(); |
|
431 return true; |
|
432 } |
|
433 |
|
434 function send_cmd ( $cmd = "" ) |
|
435 { |
|
436 // Sends a user defined command string to the |
|
437 // POP server and returns the results. Useful for |
|
438 // non-compliant or custom POP servers. |
|
439 // Do NOT includ the \r\n as part of your command |
|
440 // string - it will be appended automatically. |
|
441 |
|
442 // The return value is a standard fgets() call, which |
|
443 // will read up to $this->BUFFER bytes of data, until it |
|
444 // encounters a new line, or EOF, whichever happens first. |
|
445 |
|
446 // This method works best if $cmd responds with only |
|
447 // one line of data. |
|
448 |
|
449 if(!isset($this->FP)) |
|
450 { |
|
451 $this->ERROR = "POP3 send_cmd: " . _("No connection to server"); |
|
452 return false; |
|
453 } |
|
454 |
|
455 if(empty($cmd)) |
|
456 { |
|
457 $this->ERROR = "POP3 send_cmd: " . _("Empty command string"); |
|
458 return ""; |
|
459 } |
|
460 |
|
461 $fp = $this->FP; |
|
462 $buffer = $this->BUFFER; |
|
463 $this->update_timer(); |
|
464 fwrite($fp,"$cmd\r\n"); |
|
465 $reply = fgets($fp,$buffer); |
|
466 $reply = $this->strip_clf($reply); |
|
467 if($this->DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); } |
|
468 return $reply; |
|
469 } |
|
470 |
|
471 function quit() { |
|
472 // Closes the connection to the POP3 server, deleting |
|
473 // any msgs marked as deleted. |
|
474 |
|
475 if(!isset($this->FP)) |
|
476 { |
|
477 $this->ERROR = "POP3 quit: " . _("connection does not exist"); |
|
478 return false; |
|
479 } |
|
480 $fp = $this->FP; |
|
481 $cmd = "QUIT"; |
|
482 fwrite($fp,"$cmd\r\n"); |
|
483 $reply = fgets($fp,$this->BUFFER); |
|
484 $reply = $this->strip_clf($reply); |
|
485 if($this->DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); } |
|
486 fclose($fp); |
|
487 unset($this->FP); |
|
488 return true; |
|
489 } |
|
490 |
|
491 function popstat () { |
|
492 // Returns an array of 2 elements. The number of undeleted |
|
493 // msgs in the mailbox, and the size of the mbox in octets. |
|
494 |
|
495 $PopArray = $this->last("array"); |
|
496 |
|
497 if($PopArray == -1) { return false; } |
|
498 |
|
499 if( (!$PopArray) or (empty($PopArray)) ) |
|
500 { |
|
501 return false; |
|
502 } |
|
503 return $PopArray; |
|
504 } |
|
505 |
|
506 function uidl ($msgNum = "") |
|
507 { |
|
508 // Returns the UIDL of the msg specified. If called with |
|
509 // no arguments, returns an associative array where each |
|
510 // undeleted msg num is a key, and the msg's uidl is the element |
|
511 // Array element 0 will contain the total number of msgs |
|
512 |
|
513 if(!isset($this->FP)) { |
|
514 $this->ERROR = "POP3 uidl: " . _("No connection to server"); |
|
515 return false; |
|
516 } |
|
517 |
|
518 $fp = $this->FP; |
|
519 $buffer = $this->BUFFER; |
|
520 |
|
521 if(!empty($msgNum)) { |
|
522 $cmd = "UIDL $msgNum"; |
|
523 $reply = $this->send_cmd($cmd); |
|
524 if(!$this->is_ok($reply)) |
|
525 { |
|
526 $this->ERROR = "POP3 uidl: " . _("Error ") . "[$reply]"; |
|
527 return false; |
|
528 } |
|
529 list ($ok,$num,$myUidl) = preg_split('/\s+/',$reply); |
|
530 return $myUidl; |
|
531 } else { |
|
532 $this->update_timer(); |
|
533 |
|
534 $UIDLArray = array(); |
|
535 $Total = $this->COUNT; |
|
536 $UIDLArray[0] = $Total; |
|
537 |
|
538 if ($Total < 1) |
|
539 { |
|
540 return $UIDLArray; |
|
541 } |
|
542 $cmd = "UIDL"; |
|
543 fwrite($fp, "UIDL\r\n"); |
|
544 $reply = fgets($fp, $buffer); |
|
545 $reply = $this->strip_clf($reply); |
|
546 if($this->DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); } |
|
547 if(!$this->is_ok($reply)) |
|
548 { |
|
549 $this->ERROR = "POP3 uidl: " . _("Error ") . "[$reply]"; |
|
550 return false; |
|
551 } |
|
552 |
|
553 $line = ""; |
|
554 $count = 1; |
|
555 $line = fgets($fp,$buffer); |
|
556 while ( !ereg("^\.\r\n",$line)) { |
|
557 if(ereg("^\.\r\n",$line)) { |
|
558 break; |
|
559 } |
|
560 list ($msg,$msgUidl) = preg_split('/\s+/',$line); |
|
561 $msgUidl = $this->strip_clf($msgUidl); |
|
562 if($count == $msg) { |
|
563 $UIDLArray[$msg] = $msgUidl; |
|
564 } |
|
565 else |
|
566 { |
|
567 $UIDLArray[$count] = 'deleted'; |
|
568 } |
|
569 $count++; |
|
570 $line = fgets($fp,$buffer); |
|
571 } |
|
572 } |
|
573 return $UIDLArray; |
|
574 } |
|
575 |
|
576 function delete ($msgNum = "") { |
|
577 // Flags a specified msg as deleted. The msg will not |
|
578 // be deleted until a quit() method is called. |
|
579 |
|
580 if(!isset($this->FP)) |
|
581 { |
|
582 $this->ERROR = "POP3 delete: " . _("No connection to server"); |
|
583 return false; |
|
584 } |
|
585 if(empty($msgNum)) |
|
586 { |
|
587 $this->ERROR = "POP3 delete: " . _("No msg number submitted"); |
|
588 return false; |
|
589 } |
|
590 $reply = $this->send_cmd("DELE $msgNum"); |
|
591 if(!$this->is_ok($reply)) |
|
592 { |
|
593 $this->ERROR = "POP3 delete: " . _("Command failed ") . "[$reply]"; |
|
594 return false; |
|
595 } |
|
596 return true; |
|
597 } |
|
598 |
|
599 // ********************************************************* |
|
600 |
|
601 // The following methods are internal to the class. |
|
602 |
|
603 function is_ok ($cmd = "") { |
|
604 // Return true or false on +OK or -ERR |
|
605 |
|
606 if( empty($cmd) ) |
|
607 return false; |
|
608 else |
|
609 return( ereg ("^\+OK", $cmd ) ); |
|
610 } |
|
611 |
|
612 function strip_clf ($text = "") { |
|
613 // Strips \r\n from server responses |
|
614 |
|
615 if(empty($text)) |
|
616 return $text; |
|
617 else { |
|
618 $stripped = str_replace("\r",'',$text); |
|
619 $stripped = str_replace("\n",'',$stripped); |
|
620 return $stripped; |
|
621 } |
|
622 } |
|
623 |
|
624 function parse_banner ( $server_text ) { |
|
625 $outside = true; |
|
626 $banner = ""; |
|
627 $length = strlen($server_text); |
|
628 for($count =0; $count < $length; $count++) |
|
629 { |
|
630 $digit = substr($server_text,$count,1); |
|
631 if(!empty($digit)) { |
|
632 if( (!$outside) && ($digit != '<') && ($digit != '>') ) |
|
633 { |
|
634 $banner .= $digit; |
|
635 } |
|
636 if ($digit == '<') |
|
637 { |
|
638 $outside = false; |
|
639 } |
|
640 if($digit == '>') |
|
641 { |
|
642 $outside = true; |
|
643 } |
|
644 } |
|
645 } |
|
646 $banner = $this->strip_clf($banner); // Just in case |
|
647 return "<$banner>"; |
|
648 } |
|
649 |
|
650 } // End class |
|
651 ?> |