<?php

######################################################################
#     PHPIMP: PHP IMAP and POP Authentication function
#     ================================================
#
# Created March 2001 by Greg Lawler
# The Latest version can be found at
# http://www.zinkwazi.com/scripts
#
# If you find this script useful, feel free to send Starbucks Coffee
# gift certificates to me at
# 801 Alston Road, Santa Barbara, CA 93108 ;)
#
#
# This program is free software. You can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License.
######################################################################

######################################################################
#    INSTALLATION and USE
#    ====================
#
# phpimp.php eliminates the need to maintain/syncronize password lists
# you can just plug right into your organization's existing directory
# pass a username, password and server address to the function and
# phpimp.php will return true if the user is valid or false otherwise.
#
# phpimp.php includes two authentication functions, one for IMAP and 
# one for POP

# phpimp has been tested with Microsoft Exchange Server 5.5 and 
# Redhat 6 and 7 IMAP servers
#
# NOTE: Not tested with PHP >= 4.0 (syntax changed sligtly)
######################################################################

######################################################################
#    QUICK EXAMPLE
#    =============
# Edit and uncomment these examples to test your config...
#
# ( imap_authenticate( "username", "password", "mail.yourdom.com" ) ) ? print "valid" : print "failed";
#
# ( pop_authenticate( "username", "password", "mail.yourdom.com" ) ) ? print "valid" : print "failed";
#
#
######################################################################


function imap_authenticate$username$password$auth_host )
{
   
$tcp_port "143";    // IMAP Server port, usually 143
   
$server_reply "";

   
$fp fsockopen"$auth_host",$tcp_port );  // connect to IMAP port
   
if ( $fp )  // make sure that you get a response...
   
{
    
$server_reply fgets$fp,128 );
    if ( 
ord$server_reply ) == ord"*" ))
    {
        
// print "$server_reply<br>";
        
$user_info=fputs$fp"a999 LOGIN ".$username .$password\r\n" ); //send username and password
        
$server_reply fgets$fp,128 );

        
$foo strncmp($server_reply"a999 OK LOGIN"13); //see if your login was valid
        
if ( $foo == "0")
        {
            
// print "$server_reply!"; //password accepted
            
return true;
        }
        else
        {
            
// print "$server_reply!"; //password accepted
            
return false;
        }
            
        
fputs$fp"a999 LOGOUT""\r\n" );  //say goodbye...
        
$server_reply fgets$fp,128 );
        
// print "$server_reply<br>";
        
fclose$fp );
    }
    else
    {
        
// print "problem conversing with $auth_host!";
        
return false;
    }
   }
   else 
//if you don't get a response, complain...
   
{
       
// print  "<BR>No response from $auth_host! is port $tcp_port open?....";
       
return false;
   }
}

function 
pop_authenticate$username$password$auth_host )
{
   
$tcp_port "110";    // POP Server port, usually 110

   
$fp fsockopen"$auth_host",$tcp_port );  // connect to pop port
   
if ( $fp )  // make sure that you get a response...
   
{
      
$user_info=fputs$fp"USER ".$username"\r\n" ); //send username
      
if ( !$user_info )
      {
        
// print  "problem conversing with $auth_host!";
        
return false;
      }
      else
      {

        
$server_reply fgets$fp,128 );
        if ( 
ord($server_reply) == ord"+" ))
        {
        
// print "$server_reply......<br>";
        
}

        
$server_reply fgets$fp,128 );
    if ( 
ord$server_reply ) == ord"+" ))
        {
        
// print "$server_reply.........<br>";
                
fputs$fp"PASS ".$password"\r\n" );
                
$passwd_attempt fgets$fp,128 );
                if ( 
ord$passwd_attempt ) == ord"+" ))
                {
            
// print "$passwd_attempt!"; //password accepted
            
return true;
                }
                else
                {
            
// print "$passwd_attempt!"; //password failed
            
return false;
                }
        }
        
fputs$fp"QUIT""\r\n" );
        
fclose$fp );
      }
   }
   else 
//if you don't get a response, complain...
   
{
       
// print  "<BR>No response from $auth_host! is port $tcp_port open?....";
       
return false;
   }
}

?>