Created
May 9, 2015 07:53
-
-
Save aleayr/9f2e46d050ce4c9761eb to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
test.php | |
Proof of concept testing to see if we can get | |
PHP/SOAP talking to EWS. Thanks to Thomas Rabaix | |
for his documentation on NTLM auth in SOAP and to | |
Erik Cederstrand for his article on SOAP/Exchange. | |
Written: 03/06/2012 - Nicholas Kreidberg | |
Revised: 03/08/2012 - Nicholas Kreidberg | |
*/ | |
// NTLMSoapClient class definition | |
class NTLMSoapClient extends SoapClient | |
{ | |
function __doRequest($request, $location, $action, $version, $one_way = 0) | |
{ | |
$headers = array( | |
'Method: POST', | |
'Connection: Keep-Alive', | |
'User-Agent: PHP-SOAP-CURL', | |
'Content-Type: text/xml; charset=utf-8', | |
'SOAPAction: "'.$action.'"', | |
); | |
$this->__last_request_headers = $headers; | |
$this->__last_request = $request; | |
$ch = curl_init($location); | |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); | |
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); | |
curl_setopt($ch, CURLOPT_POST, true ); | |
curl_setopt($ch, CURLOPT_POSTFIELDS, $request); | |
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); | |
// the next option may or may not cause issues with non-XML documents | |
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM); | |
curl_setopt($ch, CURLOPT_USERPWD, $this->user.':'.$this->password); | |
// optional SSL verification | |
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); | |
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); | |
$response = curl_exec($ch); | |
// Next lines are for debugging only | |
printf("Request Array:\n"); | |
echo '<pre>' . htmlentities(print_r($request,true)) . '</pre>'; | |
printf("\n<br />Response Array:\n"); | |
echo '<pre>' . htmlentities(print_r($response,true)) . '</pre>'; | |
return $response; | |
} | |
function __getLastRequestHeaders() | |
{ | |
return implode("n", $this->__last_request_headers)."n"; | |
} | |
} | |
class ExchangeNTLMSoapClient extends NTLMSoapClient | |
{ | |
protected $user = 'user'; | |
protected $password = 'pass'; | |
} | |
// NTLMStream class definition | |
class NTLMStream | |
{ | |
private $path; | |
private $mode; | |
private $options; | |
private $opened_path; | |
private $buffer; | |
private $pos; | |
public function stream_open($path, $mode, $options, $opened_path) { | |
echo "[NTLMStream::stream_open] $path , mode=$mode n"; | |
$this->path = $path; | |
$this->mode = $mode; | |
$this->options = $options; | |
$this->opened_path = $opened_path; | |
$this->createBuffer($path); | |
return true; | |
} | |
public function stream_close() { | |
echo "[NTLMStream::stream_close] n"; | |
curl_close($this->ch); | |
} | |
public function stream_read($count) { | |
echo "[NTLMStream::stream_read] $count n"; | |
if(strlen($this->buffer) == 0) { | |
return false; | |
} | |
$read = substr($this->buffer,$this->pos, $count); | |
$this->pos += $count; | |
return $read; | |
} | |
public function stream_write($data) { | |
echo "[NTLMStream::stream_write] n"; | |
if(strlen($this->buffer) == 0) { | |
return false; | |
} | |
return true; | |
} | |
public function stream_eof() { | |
echo "[NTLMStream::stream_eof] "; | |
if($this->pos > strlen($this->buffer)) { | |
echo "true n"; | |
return true; | |
} | |
echo "false n"; | |
return false; | |
} | |
/* return the position of the current read pointer */ | |
public function stream_tell() { | |
echo "[NTLMStream::stream_tell] n"; | |
return $this->pos; | |
} | |
public function stream_flush() { | |
echo "[NTLMStream::stream_flush] n"; | |
$this->buffer = null; | |
$this->pos = null; | |
} | |
public function stream_stat() { | |
echo "[NTLMStream::stream_stat] n"; | |
$this->createBuffer($this->path); | |
$stat = array( | |
'size' => strlen($this->buffer), | |
); | |
return $stat; | |
} | |
public function url_stat($path, $flags) { | |
echo "[NTLMStream::url_stat] n"; | |
$this->createBuffer($path); | |
$stat = array( | |
'size' => strlen($this->buffer), | |
); | |
return $stat; | |
} | |
/* Create the buffer by requesting the url through cURL */ | |
private function createBuffer($path) { | |
if($this->buffer) { | |
return; | |
} | |
echo "[NTLMStream::createBuffer] create buffer from : $pathn"; | |
$this->ch = curl_init($path); | |
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true); | |
curl_setopt($this->ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); | |
curl_setopt($this->ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM); | |
curl_setopt($this->ch, CURLOPT_USERPWD, $this->user.':'.$this->password); | |
echo $this->buffer = curl_exec($this->ch); | |
echo "[NTLMStream::createBuffer] buffer size : ".strlen($this->buffer)."bytesn"; | |
$this->pos = 0; | |
} | |
} | |
// ExchangeNTLMStream class definition | |
class ExchangeNTLMStream extends NTLMStream | |
{ | |
protected $user = 'user'; | |
protected $password = 'pass'; | |
} | |
stream_wrapper_unregister('http'); | |
stream_wrapper_register('http', 'ExchangeNTLMStream') or die ("Failed to register NTLM protocol.\n"); | |
$wsdl = "http://internal/address/ServiceManager.svc?wsdl"; | |
$client = new ExchangeNTLMSoapClient($wsdl); | |
stream_wrapper_restore('http'); | |
$login = '<LoginRequest xmlns="urn:emc.com:Ionix:ServiceManager:API:v9.0"> | |
<sUserID>serweb</sUserID> | |
<sPassword>serweb</sPassword> | |
<sDatabase>Jupiter01</sDatabase> | |
</LoginRequest>'; | |
$var = new SoapVar($login, XSD_ANYXML); | |
$result = $client->Login($var); | |
printf("\n<br />\Login Result:<br />\n"); | |
print_r($result); | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment