web/lib/Zend/Service/DeveloperGarden/Client/Soap.php
changeset 64 162c1de6545a
parent 19 1c2f13fd785c
child 68 ecaf28ffe26e
equal deleted inserted replaced
63:5b37998e522e 64:162c1de6545a
       
     1 <?php
       
     2 /**
       
     3  * Zend Framework
       
     4  *
       
     5  * LICENSE
       
     6  *
       
     7  * This source file is subject to the new BSD license that is bundled
       
     8  * with this package in the file LICENSE.txt.
       
     9  * It is also available through the world-wide-web at this URL:
       
    10  * http://framework.zend.com/license/new-bsd
       
    11  * If you did not receive a copy of the license and are unable to
       
    12  * obtain it through the world-wide-web, please send an email
       
    13  * to license@zend.com so we can send you a copy immediately.
       
    14  *
       
    15  * @category   Zend
       
    16  * @package    Zend_Service
       
    17  * @subpackage DeveloperGarden
       
    18  * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
       
    19  * @license    http://framework.zend.com/license/new-bsd     New BSD License
       
    20  * @version    $Id: Soap.php 22662 2010-07-24 17:37:36Z mabe $
       
    21  */
       
    22 
       
    23 /**
       
    24  * @see Zend_Soap_Client
       
    25  */
       
    26 require_once 'Zend/Soap/Client.php';
       
    27 
       
    28 /**
       
    29  * @category   Zend
       
    30  * @package    Zend_Service
       
    31  * @subpackage DeveloperGarden
       
    32  * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
       
    33  * @author     Marco Kaiser
       
    34  * @license    http://framework.zend.com/license/new-bsd     New BSD License
       
    35  */
       
    36 class Zend_Service_DeveloperGarden_Client_Soap extends Zend_Soap_Client
       
    37 {
       
    38     /**
       
    39      * class with credential interface
       
    40      *
       
    41      * @var Zend_Service_DeveloperGarden_Credential
       
    42      */
       
    43     private $_credential = null;
       
    44 
       
    45     /**
       
    46      * WSSE Security Ext Namespace
       
    47      *
       
    48      * @var string
       
    49      */
       
    50     const WSSE_NAMESPACE_SECEXT = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';
       
    51 
       
    52     /**
       
    53      * WSSE Saml Namespace
       
    54      *
       
    55      * @var string
       
    56      */
       
    57     const WSSE_NAMESPACE_SAML = 'urn:oasis:names:tc:SAML:2.0:assertion';
       
    58 
       
    59     /**
       
    60      * Security Element
       
    61      *
       
    62      * @var string
       
    63      */
       
    64     const WSSE_SECURITY_ELEMENT = 'Security';
       
    65 
       
    66     /**
       
    67      * UsernameToken Element
       
    68      *
       
    69      * @var string
       
    70      */
       
    71     const WSSE_ELEMENT_USERNAMETOKEN = 'UsernameToken';
       
    72 
       
    73     /**
       
    74      * Usernae Element
       
    75      *
       
    76      * @var string
       
    77      */
       
    78     const WSSE_ELEMENT_USERNAME = 'Username';
       
    79 
       
    80     /**
       
    81      * Password Element
       
    82      *
       
    83      * @var string
       
    84      */
       
    85     const WSSE_ELEMENT_PASSWORD = 'Password';
       
    86 
       
    87     /**
       
    88      * Password Element WSSE Type
       
    89      *
       
    90      */
       
    91     const WSSE_ELEMENT_PASSWORD_TYPE = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText';
       
    92 
       
    93     /**
       
    94      * is this client used by the token service
       
    95      *
       
    96      * @var Zend_Service_DeveloperGarden_SecurityTokenServer
       
    97      */
       
    98     protected $_tokenService = null;
       
    99 
       
   100     /**
       
   101      * Perform a SOAP call but first check for adding STS Token or fetch one
       
   102      *
       
   103      * @param string $name
       
   104      * @param array  $arguments
       
   105      * @return mixed
       
   106      */
       
   107     public function __call($name, $arguments)
       
   108     {
       
   109         /**
       
   110          * add WSSE Security header
       
   111          */
       
   112         if ($this->_tokenService !== null) {
       
   113             // if login method we addWsseLoginHeader
       
   114             if (in_array('login', $arguments)) {
       
   115                 $this->addWsseLoginHeader();
       
   116             } elseif ($name == 'getTokens') {
       
   117                 $this->addWsseTokenHeader($this->_tokenService->getLoginToken());
       
   118             } else {
       
   119                 $this->addWsseSecurityTokenHeader($this->_tokenService->getTokens());
       
   120             }
       
   121         }
       
   122         return parent::__call($name, $arguments);
       
   123     }
       
   124 
       
   125     /**
       
   126      * sets the internal handling for handle token service
       
   127      *
       
   128      * @param Zend_Service_DeveloperGarden_SecurityTokenServer $isTokenService
       
   129      * @return Zend_Service_DeveloperGarden_Client_Soap
       
   130      */
       
   131     public function setTokenService(Zend_Service_DeveloperGarden_SecurityTokenServer $tokenService)
       
   132     {
       
   133         $this->_tokenService = $tokenService;
       
   134         return $this;
       
   135     }
       
   136 
       
   137     /**
       
   138      * returns the currently configured tokenService object
       
   139      *
       
   140      * @return Zend_Service_DeveloperGarden_SecurityTokenServer
       
   141      */
       
   142     public function getTokenService()
       
   143     {
       
   144         return $this->_tokenService;
       
   145     }
       
   146 
       
   147     /**
       
   148      * Sets new credential callback object
       
   149      *
       
   150      * @param Zend_Service_DeveloperGarden_Credential $credential
       
   151      * @return Zend_Service_DeveloperGarden_Client_Soap
       
   152      */
       
   153     public function setCredential(Zend_Service_DeveloperGarden_Credential $credential)
       
   154     {
       
   155         $this->_credential = $credential;
       
   156         return $this;
       
   157     }
       
   158 
       
   159     /**
       
   160      * returns the internal credential callback object
       
   161      *
       
   162      * @return Zend_Service_DeveloperGarden_Credential
       
   163      */
       
   164     public function getCredential()
       
   165     {
       
   166         return $this->_credential;
       
   167     }
       
   168 
       
   169     /**
       
   170      * creates the login header and add
       
   171      *
       
   172      * @return SoapHeader
       
   173      */
       
   174     public function getWsseLoginHeader()
       
   175     {
       
   176         $dom = new DOMDocument();
       
   177 
       
   178         /**
       
   179          * Security Element
       
   180          */
       
   181         $securityElement = $dom->createElementNS(
       
   182             self::WSSE_NAMESPACE_SECEXT,
       
   183             'wsse:' . self::WSSE_SECURITY_ELEMENT
       
   184         );
       
   185         $securityElement->setAttribute('mustUnderstand', true);
       
   186 
       
   187         /**
       
   188          * Username Token Element
       
   189          */
       
   190         $usernameTokenElement = $dom->createElementNS(
       
   191             self::WSSE_NAMESPACE_SECEXT,
       
   192             self::WSSE_ELEMENT_USERNAMETOKEN
       
   193         );
       
   194 
       
   195         /**
       
   196          * Username Element
       
   197          */
       
   198         $usernameElement = $dom->createElementNS(
       
   199             self::WSSE_NAMESPACE_SECEXT,
       
   200             self::WSSE_ELEMENT_USERNAME,
       
   201             $this->_credential->getUsername(true)
       
   202         );
       
   203 
       
   204         /**
       
   205          * Password Element
       
   206          */
       
   207         $passwordElement = $dom->createElementNS(
       
   208             self::WSSE_NAMESPACE_SECEXT,
       
   209             self::WSSE_ELEMENT_PASSWORD,
       
   210             $this->_credential->getPassword()
       
   211         );
       
   212         $passwordElement->setAttribute('Type', self::WSSE_ELEMENT_PASSWORD_TYPE);
       
   213 
       
   214         $usernameTokenElement->appendChild($usernameElement);
       
   215         $usernameTokenElement->appendChild($passwordElement);
       
   216 
       
   217         $securityElement->appendChild($usernameTokenElement);
       
   218         $dom->appendChild($securityElement);
       
   219 
       
   220         $authSoapVar = new SoapVar(
       
   221             $dom->saveXML($securityElement),
       
   222             XSD_ANYXML,
       
   223             self::WSSE_NAMESPACE_SECEXT,
       
   224             self::WSSE_SECURITY_ELEMENT
       
   225         );
       
   226 
       
   227         $authSoapHeader = new SoapHeader(
       
   228             self::WSSE_NAMESPACE_SECEXT,
       
   229             self::WSSE_SECURITY_ELEMENT,
       
   230             $authSoapVar,
       
   231             true
       
   232         );
       
   233 
       
   234         return $authSoapHeader;
       
   235     }
       
   236 
       
   237     /**
       
   238      * creates the token auth header for direct calls
       
   239      *
       
   240      * @param Zend_Service_DeveloperGarden_Response_SecurityTokenServer_SecurityTokenResponse $token
       
   241      * @return SoapHeader
       
   242      */
       
   243     public function getWsseTokenHeader(
       
   244         Zend_Service_DeveloperGarden_Response_SecurityTokenServer_SecurityTokenResponse $token
       
   245     ) {
       
   246         $format = '<wsse:%s xmlns:wsse="%s" SOAP-ENV:mustUnderstand="1">%s</wsse:%s>';
       
   247         $securityHeader = sprintf(
       
   248             $format,
       
   249             self::WSSE_SECURITY_ELEMENT,
       
   250             self::WSSE_NAMESPACE_SECEXT,
       
   251             $token->getTokenData(),
       
   252             self::WSSE_SECURITY_ELEMENT
       
   253         );
       
   254 
       
   255         $authSoapVar = new SoapVar(
       
   256             $securityHeader,
       
   257             XSD_ANYXML,
       
   258             self::WSSE_NAMESPACE_SECEXT,
       
   259             self::WSSE_SECURITY_ELEMENT
       
   260         );
       
   261 
       
   262         $authSoapHeader = new SoapHeader(
       
   263             self::WSSE_NAMESPACE_SECEXT,
       
   264             self::WSSE_SECURITY_ELEMENT,
       
   265             $authSoapVar,
       
   266             true
       
   267         );
       
   268 
       
   269         return $authSoapHeader;
       
   270     }
       
   271 
       
   272     /**
       
   273      * creates the security token auth header for direct calls
       
   274      *
       
   275      * @param Zend_Service_DeveloperGarden_Response_SecurityTokenServer_SecurityTokenResponse $token
       
   276      * @return SoapHeader
       
   277      */
       
   278     public function getWsseSecurityTokenHeader(
       
   279         Zend_Service_DeveloperGarden_Response_SecurityTokenServer_GetTokensResponse $token
       
   280     ) {
       
   281         $format = '<wsse:%s xmlns:wsse="%s" SOAP-ENV:mustUnderstand="1">%s</wsse:%s>';
       
   282         $securityHeader = sprintf(
       
   283             $format,
       
   284             self::WSSE_SECURITY_ELEMENT,
       
   285             self::WSSE_NAMESPACE_SECEXT,
       
   286             $token->getTokenData(),
       
   287             self::WSSE_SECURITY_ELEMENT
       
   288         );
       
   289 
       
   290         $authSoapVar = new SoapVar(
       
   291             $securityHeader,
       
   292             XSD_ANYXML,
       
   293             self::WSSE_NAMESPACE_SECEXT,
       
   294             self::WSSE_SECURITY_ELEMENT
       
   295         );
       
   296 
       
   297         $authSoapHeader = new SoapHeader(
       
   298             self::WSSE_NAMESPACE_SECEXT,
       
   299             self::WSSE_SECURITY_ELEMENT,
       
   300             $authSoapVar,
       
   301             true
       
   302         );
       
   303 
       
   304         return $authSoapHeader;
       
   305     }
       
   306 
       
   307     /**
       
   308      * adds the login specific header to the client
       
   309      *
       
   310      * @return Zend_Service_DeveloperGarden_Client_Soap
       
   311      */
       
   312     public function addWsseLoginHeader()
       
   313     {
       
   314         return $this->addSoapInputHeader($this->getWsseLoginHeader());
       
   315     }
       
   316 
       
   317     /**
       
   318      * adds the earlier fetched token to the header
       
   319      *
       
   320      * @param Zend_Service_DeveloperGarden_Response_SecurityTokenServer_SecurityTokenResponse $token
       
   321      * @return Zend_Service_DeveloperGarden_Client_Soap
       
   322      */
       
   323     public function addWsseTokenHeader(
       
   324         Zend_Service_DeveloperGarden_Response_SecurityTokenServer_SecurityTokenResponse $token
       
   325     ) {
       
   326         return $this->addSoapInputHeader($this->getWsseTokenHeader($token));
       
   327     }
       
   328 
       
   329     /**
       
   330      * adds the earlier fetched token to the header
       
   331      *
       
   332      * @param Zend_Service_DeveloperGarden_Response_SecurityTokenServer_SecurityTokenResponse $token
       
   333      * @return Zend_Service_DeveloperGarden_Client_Soap
       
   334      */
       
   335     public function addWsseSecurityTokenHeader(
       
   336         Zend_Service_DeveloperGarden_Response_SecurityTokenServer_GetTokensResponse $token
       
   337     ) {
       
   338         return $this->addSoapInputHeader($this->getWsseSecurityTokenHeader($token));
       
   339     }
       
   340 }