| 1 | <?php |
|---|
| 2 | require_once('EDokApiConf.inc'); |
|---|
| 3 | |
|---|
| 4 | /** |
|---|
| 5 | * Klasa rozszerzająca wbudowaną bibliotekę SOAP o |
|---|
| 6 | * uwierzytelnianie WSSSecurity |
|---|
| 7 | * @author Marcin Król |
|---|
| 8 | * (c) BetaSoft Sp. z o.o. |
|---|
| 9 | * @version 1.0 |
|---|
| 10 | */ |
|---|
| 11 | class EDokApiClient extends SoapClient { |
|---|
| 12 | |
|---|
| 13 | protected $username = NULL; |
|---|
| 14 | protected $password = NULL; |
|---|
| 15 | protected $timestamp = NULL; |
|---|
| 16 | protected $ns_env = array( |
|---|
| 17 | SOAP_1_1 => 'http://schemas.xmlsoap.org/soap/envelope', |
|---|
| 18 | SOAP_1_2 => 'http://www.w3.org/2003/05/soap-envelope', |
|---|
| 19 | ); |
|---|
| 20 | protected $envelopeNS = NULL; |
|---|
| 21 | |
|---|
| 22 | |
|---|
| 23 | /** |
|---|
| 24 | * |
|---|
| 25 | * @param $request |
|---|
| 26 | * @param $location |
|---|
| 27 | * @param $action |
|---|
| 28 | * @param $version |
|---|
| 29 | */ |
|---|
| 30 | public function __doRequest($request, $location, $action, $version) { |
|---|
| 31 | |
|---|
| 32 | $this->envelopeNS = isset($this->ns_env[$version]) ? $this->ns_env[$version] : $this->ns_env[SOAP_1_1]; |
|---|
| 33 | |
|---|
| 34 | $dom = new DOMDocument('1.0'); |
|---|
| 35 | try { |
|---|
| 36 | $dom->loadXML($request, LIBXML_PARSEHUGE); |
|---|
| 37 | } catch (DOMException $e) { |
|---|
| 38 | die('Dokument nie jest prawidłowy:' . $e->code); |
|---|
| 39 | } |
|---|
| 40 | |
|---|
| 41 | $this->addWSSEHeader($dom); |
|---|
| 42 | return parent::__doRequest($dom->saveXML(), $location, $action, $version); |
|---|
| 43 | |
|---|
| 44 | } |
|---|
| 45 | |
|---|
| 46 | /** |
|---|
| 47 | * |
|---|
| 48 | * @param $username |
|---|
| 49 | */ |
|---|
| 50 | public function setUser($username) { |
|---|
| 51 | $this->username = $username; |
|---|
| 52 | } |
|---|
| 53 | |
|---|
| 54 | /** |
|---|
| 55 | * |
|---|
| 56 | * @param $password |
|---|
| 57 | */ |
|---|
| 58 | public function setPass($password) { |
|---|
| 59 | $this->password = md5($password.EDokApiConf::$PASS_TOKEN); |
|---|
| 60 | } |
|---|
| 61 | |
|---|
| 62 | |
|---|
| 63 | |
|---|
| 64 | public function setTimeStamp($timestamp) { |
|---|
| 65 | |
|---|
| 66 | $this->timestamp = $timestamp; |
|---|
| 67 | |
|---|
| 68 | } |
|---|
| 69 | |
|---|
| 70 | |
|---|
| 71 | |
|---|
| 72 | /** |
|---|
| 73 | * |
|---|
| 74 | * @param $domDocument |
|---|
| 75 | */ |
|---|
| 76 | private function addWSSEHeader($domDocument) { |
|---|
| 77 | |
|---|
| 78 | $soapEnvelope = $domDocument->documentElement; |
|---|
| 79 | $nodes = $domDocument->getElementsByTagName('Header'); |
|---|
| 80 | if ($nodes->length == 0) { |
|---|
| 81 | $header = $domDocument->createElementNS($this->envelopeNS, 'Header'); |
|---|
| 82 | $body = $domDocument->getElementsByTagName('Body'); |
|---|
| 83 | $body = $body->item(0); |
|---|
| 84 | $header = $soapEnvelope->insertBefore($header, $body); |
|---|
| 85 | } else { |
|---|
| 86 | $header = $nodes->item(0); |
|---|
| 87 | } |
|---|
| 88 | |
|---|
| 89 | $ns_wsu = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'; |
|---|
| 90 | |
|---|
| 91 | $security = $domDocument->createElementNS('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', 'wsse:Security'); |
|---|
| 92 | $usernameToken = $domDocument->createElementNS('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', 'UsernameToken'); |
|---|
| 93 | $username = $domDocument->createElementNS('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd','Username'); |
|---|
| 94 | $usernameText = $domDocument->createTextNode($this->username); |
|---|
| 95 | $password = $domDocument->createElementNS('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd','Password'); |
|---|
| 96 | $passwordText = $domDocument->createTextNode($this->password); |
|---|
| 97 | $type = $domDocument->createAttribute('Type'); |
|---|
| 98 | $type->value = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText'; |
|---|
| 99 | $username->appendChild($usernameText); |
|---|
| 100 | $password->appendChild($type); |
|---|
| 101 | $password->appendChild($passwordText); |
|---|
| 102 | $usernameToken->appendChild($username); |
|---|
| 103 | $usernameToken->appendChild($password); |
|---|
| 104 | $security->appendChild($usernameToken); |
|---|
| 105 | $header->appendChild($security); |
|---|
| 106 | |
|---|
| 107 | if (is_numeric($this->timestamp) AND $this->timestamp) { |
|---|
| 108 | // Creating date using yyyy-mm-ddThh:mm:ssZ format |
|---|
| 109 | $tm_created = gmdate('Y-m-d\TH:i:s\Z'); |
|---|
| 110 | $tm_expires = gmdate('Y-m-d\TH:i:s\Z', gmdate('U') + $this->timestamp); |
|---|
| 111 | |
|---|
| 112 | $timestamp = $domDocument->createElementNS($ns_wsu, 'wsu:Timestamp'); |
|---|
| 113 | $timestamp = $security->appendChild($timestamp); |
|---|
| 114 | |
|---|
| 115 | $wsuTimestampId = $domDocument->createAttribute('wsu:Id'); |
|---|
| 116 | $wsuTimestampId->value = 'TS-6'; |
|---|
| 117 | $timestamp->appendChild($wsuTimestampId); |
|---|
| 118 | |
|---|
| 119 | $createdNode = $domDocument->createElementNS($ns_wsu, 'wsu:Created'); |
|---|
| 120 | $createdNodeText = $domDocument->createTextNode($tm_created); |
|---|
| 121 | $createdNode->appendChild($createdNodeText); |
|---|
| 122 | |
|---|
| 123 | $expireNode = $domDocument->createElementNS($ns_wsu, 'wsu:Expires'); |
|---|
| 124 | $expireNodeText = $domDocument->createTextNode($tm_expires); |
|---|
| 125 | $expireNode->appendChild($expireNodeText); |
|---|
| 126 | |
|---|
| 127 | $timestamp->appendChild($createdNode); |
|---|
| 128 | $timestamp->appendChild($expireNode); |
|---|
| 129 | } |
|---|
| 130 | |
|---|
| 131 | } |
|---|
| 132 | |
|---|
| 133 | } |
|---|
| 134 | |
|---|
| 135 | ?> |
|---|