/[docman]/auth_pop3.php
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /auth_pop3.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (hide annotations)
Fri Jan 26 12:39:57 2001 UTC (23 years, 2 months ago) by dpavlin
Branch: MAIN
CVS Tags: v1_3
Changes since 1.1: +40 -487 lines
cleanup of pop3 autorization

1 dpavlin 1.1 <?
2    
3     /*
4     Document manager auth_pop3.php module
5    
6     WARNING: this modules uses e-mail address to check
7     login and password against pop3 server! e-mail must be
8     in following form:
9    
10     login_on_pop3_server@pop3_server.domain
11    
12     That should actually be also a vaild e-mail address
13    
14    
15 dpavlin 1.2 this module is based on class.POP3.php3 by cdi@thewebmasters.net
16 dpavlin 1.1 */
17    
18     function auth_pop3($user) {
19     $email = explode("@",$user[3]);
20     $pop3 = new POP3();
21     $pop3->connect($email[1]);
22 dpavlin 1.2 if ($pop3->checklogin($email[0],$GLOBALS[PHP_AUTH_PW])) {
23     $pop3->quit();
24     return true;
25     }
26 dpavlin 1.1 $pop3->quit();
27 dpavlin 1.2 return false;
28 dpavlin 1.1 }
29    
30     //--------------------------------------------------------------------------
31    
32     /*
33 dpavlin 1.2 This is just a part of class.POP3.php3 which is needed for
34     auth_pop3.php module. Please look at original location for
35     whole class!
36    
37 dpavlin 1.1 class.POP3.php3 v1.0 99/03/24 CDI cdi@thewebmasters.net
38     Copyright (c) 1999 - CDI (cdi@thewebmasters.net) All Rights Reserved
39    
40     An RFC 1939 compliant wrapper class for the POP3 protocol.
41     */
42    
43     class POP3
44     {
45 dpavlin 1.2 var $ERROR = ""; // Error string.
46 dpavlin 1.1
47 dpavlin 1.2 var $TIMEOUT = 60; // Default timeout before giving up on a
48     // network operation.
49 dpavlin 1.1
50 dpavlin 1.2 var $COUNT = -1; // Mailbox msg count
51 dpavlin 1.1
52 dpavlin 1.2 var $BUFFER = 512; // Socket buffer for socket fgets() calls.
53     // Per RFC 1939 the returned line a POP3
54     // server can send is 512 bytes.
55 dpavlin 1.1
56 dpavlin 1.2 var $FP = ""; // The connection to the server's
57     // file descriptor
58 dpavlin 1.1
59 dpavlin 1.2 var $MAILSERVER = ""; // Set this to hard code the server name
60 dpavlin 1.1
61 dpavlin 1.2 var $DEBUG = false;// set to true to echo pop3
62     // commands and responses to error_log
63     // this WILL log passwords!
64 dpavlin 1.1
65 dpavlin 1.2 var $BANNER = ""; // Holds the banner returned by the
66     // pop server - used for apop()
67 dpavlin 1.1
68 dpavlin 1.2 var $RFC1939 = true; // Set by noop(). See rfc1939.txt
69     //
70 dpavlin 1.1
71 dpavlin 1.2 var $ALLOWAPOP = false;// Allow or disallow apop()
72     // This must be set to true
73     // manually.
74 dpavlin 1.1
75     function POP3 ( $server = "", $timeout = "" )
76     {
77     settype($this->BUFFER,"integer");
78     if(!empty($server))
79     {
80     // Do not allow programs to alter MAILSERVER
81     // if it is already specified. They can get around
82     // this if they -really- want to, so don't count on it.
83     if(empty($this->MAILSERVER))
84     {
85     $this->MAILSERVER = $server;
86     }
87     }
88     if(!empty($timeout))
89     {
90     settype($timeout,"integer");
91     $this->TIMEOUT = $timeout;
92     set_time_limit($timeout);
93     }
94     return true;
95     }
96    
97     function update_timer ()
98     {
99     set_time_limit($this->TIMEOUT);
100     return true;
101     }
102    
103     function connect ($server, $port = 110)
104     {
105 dpavlin 1.2 // Opens a socket to the specified server. Unless overridden,
106     // port defaults to 110. Returns true on success, false on fail
107 dpavlin 1.1
108     // If MAILSERVER is set, override $server with it's value
109    
110     if(!empty($this->MAILSERVER))
111     {
112     $server = $this->MAILSERVER;
113     }
114    
115     if(empty($server))
116     {
117     $this->ERROR = "POP3 connect: No server specified";
118     unset($this->FP);
119     return false;
120     }
121    
122     $fp = fsockopen("$server", $port, &$errno, &$errstr);
123    
124     if(!$fp)
125     {
126     $this->ERROR = "POP3 connect: Error [$errno] [$errstr]";
127     unset($this->FP);
128     return false;
129     }
130    
131     set_socket_blocking($fp,-1);
132     $this->update_timer();
133     $reply = fgets($fp,$this->BUFFER);
134     $reply = $this->strip_clf($reply);
135     if($this->DEBUG) { error_log("POP3 SEND [connect: $server] GOT [$reply]",0); }
136     if(!$this->is_ok($reply))
137     {
138     $this->ERROR = "POP3 connect: Error [$reply]";
139     unset($this->FP);
140     return false;
141     }
142     $this->FP = $fp;
143     $this->BANNER = $this->parse_banner($reply);
144     $this->RFC1939 = $this->noop();
145     if($this->RFC1939)
146     {
147     $this->ERROR = "POP3: premature NOOP OK, NOT an RFC 1939 Compliant server";
148     $this->quit();
149     return false;
150     }
151     return true;
152     }
153    
154 dpavlin 1.2 //-----------------------------
155 dpavlin 1.1
156 dpavlin 1.2 function checklogin ($user, $pass) {
157 dpavlin 1.1 $reply = $this->send_cmd("USER $user");
158     if(!$this->is_ok($reply))
159     {
160     $this->ERROR = "POP3 user: Error [$reply]";
161     return false;
162     }
163    
164     $reply = $this->send_cmd("PASS $pass");
165     if(!$this->is_ok($reply))
166     {
167     $this->ERROR = "POP3 pass: authentication failed [$reply]";
168     $this->quit();
169     return false;
170     }
171     // Auth successful.
172 dpavlin 1.2 return true;
173 dpavlin 1.1 }
174    
175 dpavlin 1.2 //-------------------------------------------
176 dpavlin 1.1
177 dpavlin 1.2 function noop ()
178 dpavlin 1.1 {
179     if(!isset($this->FP))
180     {
181 dpavlin 1.2 $this->ERROR = "POP3 noop: No connection to server";
182 dpavlin 1.1 return false;
183     }
184 dpavlin 1.2 $cmd = "NOOP";
185 dpavlin 1.1 $reply = $this->send_cmd($cmd);
186     if(!$this->is_ok($reply))
187     {
188     return false;
189     }
190     return true;
191     }
192    
193     function send_cmd ( $cmd = "" )
194     {
195     // Sends a user defined command string to the
196     // POP server and returns the results. Useful for
197     // non-compliant or custom POP servers.
198     // Do NOT include the \r\n as part of your command
199     // string - it will be appended automatically.
200    
201     // The return value is a standard fgets() call, which
202     // will read up to $this->BUFFER bytes of data, until it
203     // encounters a new line, or EOF, whichever happens first.
204    
205     // This method works best if $cmd responds with only
206     // one line of data.
207    
208     if(!isset($this->FP))
209     {
210     $this->ERROR = "POP3 send_cmd: No connection to server";
211     return false;
212     }
213    
214     if(empty($cmd))
215     {
216     $this->ERROR = "POP3 send_cmd: Empty command string";
217     return "";
218     }
219    
220     $fp = $this->FP;
221     $buffer = $this->BUFFER;
222     $this->update_timer();
223     fwrite($fp,"$cmd\r\n");
224     $reply = fgets($fp,$buffer);
225     $reply = $this->strip_clf($reply);
226     if($this->DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); }
227     return $reply;
228     }
229    
230     function quit ()
231     {
232     // Closes the connection to the POP3 server, deleting
233     // any msgs marked as deleted.
234    
235     if(!isset($this->FP))
236     {
237     $this->ERROR = "POP3 quit: connection does not exist";
238     return false;
239     }
240     $fp = $this->FP;
241     $cmd = "QUIT";
242     fwrite($fp,"$cmd\r\n");
243     $reply = fgets($fp,$this->BUFFER);
244     $reply = $this->strip_clf($reply);
245     if($this->DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); }
246     fclose($fp);
247     unset($this->FP);
248     return true;
249     }
250    
251     // *********************************************************
252    
253     // The following methods are internal to the class.
254    
255     function is_ok ($cmd = "")
256     {
257     // Return true or false on +OK or -ERR
258    
259 dpavlin 1.2 if(empty($cmd)) { return false; }
260 dpavlin 1.1 if ( ereg ("^\+OK", $cmd ) ) { return true; }
261     return false;
262     }
263    
264     function strip_clf ($text = "")
265     {
266     // Strips \r\n from server responses
267    
268     if(empty($text)) { return $text; }
269     $stripped = ereg_replace("\r","",$text);
270     $stripped = ereg_replace("\n","",$stripped);
271     return $stripped;
272     }
273    
274     function parse_banner ( $server_text )
275     {
276     $outside = true;
277     $banner = "";
278     $length = strlen($server_text);
279     for($count =0; $count < $length; $count++)
280     {
281     $digit = substr($server_text,$count,1);
282     if(!empty($digit))
283     {
284     if( (!$outside) and ($digit != '<') and ($digit != '>') )
285     {
286     $banner .= $digit;
287     }
288     if ($digit == '<')
289     {
290     $outside = false;
291     }
292     if($digit == '>')
293     {
294     $outside = true;
295     }
296     }
297     }
298     $banner = $this->strip_clf($banner); // Just in case
299     return "<$banner>";
300     }
301    
302     } // End class
303    
304     ?>

  ViewVC Help
Powered by ViewVC 1.1.26