diff --git a/info.textgrid.middleware.tgauth.rbac/rbacSoap/TgExtra.class.php b/info.textgrid.middleware.tgauth.rbac/rbacSoap/TgExtra.class.php index 9df27c66f34fdede14bff2c686d638b64fb4d836..95e08deeb45336c0a953a6192830d76fbfe40c28 100755 --- a/info.textgrid.middleware.tgauth.rbac/rbacSoap/TgExtra.class.php +++ b/info.textgrid.middleware.tgauth.rbac/rbacSoap/TgExtra.class.php @@ -1,9 +1,9 @@ <?php // ####################################################### -// Author: Markus Widmer +// Author: Markus Widmer & Martin Haase, DAASI International GmbH // Creation date: 17.07.2007 -// Modification date: 08.04.2008 -// Version: 0.2.0 +// Modification date: 15.10.2010 +// Version: 0.3.0 // ####################################################### @@ -15,8 +15,6 @@ class TgExtra { protected $config; protected $connection; - - // ----------------------------------------------------- // Constructor // Input: none @@ -385,7 +383,7 @@ class TgExtra { // ----------------------------------------------------- - // Function: createSessionID + // Function: getSid // Input: none // Output: sid / xsd:string // Description @@ -404,6 +402,172 @@ class TgExtra { } + // ----------------------------------------------------- + // Function: getSupportedUserAttributes + // Input: none + // Output: attribute[] / tns:userAttribute + // Description + // describe User Attributes this RBAC understands + // ----------------------------------------------------- + public function getSupportedUserAttributes() { + + $result = new stdClass(); + + $attrlist = explode ( " ", $this->config->getValue( "userdetails", "00order" )); + foreach ($attrlist as $attr) { + $det = explode ("|", $this->config->getValue( "userdetails", $attr )); + $result->attribute[] = new userAttribute( + $attr, // name + null, // no value here + $det[4], // description + $det[0] ==="mandatory"? TRUE:FALSE , + $det[1], // ldapname (attrNameInLDAP) + $det[2], // inclass (schemaNameInLDAP) + $det[3] // displayname + ); + } + return $result; + + } + + // ----------------------------------------------------- + // Function: getMyUserAttributes + // Input: auth / xsd:string + // Output: attribute[] / tns:userAttribute + // Description + // get User Attributes + // ----------------------------------------------------- + public function getMyUserAttributes($inRequest) { + + $result = new stdClass(); + + // Search for Session entry + $filter = "(" . $this->rbac->getConfiguration()->getValue( "session", "namingattribute" ) . + "=" . $inRequest->auth . ")"; + $arrSessionEntry = $this->connection['user']->search( + $this->rbac->getConfiguration()->getValue( "session", "base" ), + $filter, "sub", Array( "rbacSessionUser" ) ); + + // retrieve rbacSessionUser attribute (ePPN) + if( isset( $arrSessionEntry[0] ) && isset( $arrSessionEntry[0]['dn'] ) ) { + $eppn = $arrSessionEntry[0]['rbacsessionuser'][0]; + } else { + // echo ("Could not find Session entry"); + return new SoapFault( "authenticationFault", + $this->config->getValue( "errorCode", "AUTHENTICATION_ERROR" ), + get_class( $this ), + $this->config->getValue( "errorDescription", "AUTHENTICATION_ERROR" ) ); + + } + + // Search for user entry + $filter = "(" . $this->config->getValue( "authentication", "namingattribute" ) . "=" . $eppn . ")"; + $arrUserEntry = $this->connection['user']->search( + $this->config->getValue( "authentication", "base" ), $filter, "sub", Array( ) ); + + // Retrieve attributes + $entry = $arrUserEntry[0]; + + $attrlist = explode ( " ", $this->config->getValue( "userdetails", "00order" )); + + foreach ($attrlist as $attr) { + + $det = explode ("|", $this->config->getValue( "userdetails", $attr )); + + $result->attribute[] = new userAttribute( + $attr, // name + $entry[strtolower($det[1])][0], // value + $det[4], // description + $det[0] ==="mandatory"? TRUE:FALSE , + null, // do not need this in the client ldapname (attrNameInLDAP) + null, // do not need this in the client inclass (schemaNameInLDAP) + $det[3] // displayname + ); + + } + + return $result; + + } + + + // ----------------------------------------------------- + // Function: setMyUserAttributes + // Input: auth / xsd:string + // Input: webAuthSecret / xsd:string + // Input: attribute[] / tns:userAttribute + // Output: result / xsd:boolean + // Description + // set User Attributes + // ----------------------------------------------------- + public function setMyUserAttributes($inRequest) { + + +//// TODO all this stuff was copied from setName, need to adapt but keep the logic + $arrModify = Array(); + $filter = ""; + $result = new booleanResponse(); // The return-result + + $ePPN = $this->rbac->sessionUser( $inRequest->auth ); + + $filter = "(" . $this->config->getValue( "authentication", "namingattribute" ) . "=" . $ePPN . ")"; + + $arrUserEntry = $this->connection['user']->search( $this->config->getValue( "authentication", "base" ), $filter, "sub" ); + + if( sizeof( $arrUserEntry ) == 1 && isset( $arrUserEntry[0]) && isset( $arrUserEntry[0]['dn']) ) { + + $entry = $arrUserEntry[0]; + + if (!in_array ("TextGridUser", $entry['objectclass'])) { + $arrModify['objectclass'][] = "TextGridUser"; + ldap_mod_add ($this->connection['user']->getConnection(), $entry['dn'], $arrModify); + unset ( $arrModify ); + } + + + // only assert that these data are correct if they came from the IdP AND the IdP had sent at least the name (cn or (sn and givenname)) and one mail address + if( $inRequest->webAuthSecret === $this->config->getValue( "webAuth", "secret" ) && strlen($inRequest->name) > 0 && strlen ($inRequest->mail) > 0 ) { + $arrModify['tgusersupplieddata'][] = "FALSE"; + + // only set the agreesearch flag automatically if it was not there before, i.e. on very first login + if (! isset ($entry['tgagreesearch'] )) { + $arrModify['tgagreesearch'][] = "TRUE"; + } + } elseif (isset ($entry['tgusersupplieddata']) && $entry['tgusersupplieddata'][0] === "FALSE") { + + // once data came from the IdP, the flag will always remain on FALSE and only the agreesearch Flag can be set + if ( $inRequest->agreeSearch ) { $arrModify['tgagreesearch'][] = "TRUE"; } else { $arrModify['tgagreesearch'][] = "FALSE"; } + $this->connection['user']->modify( $entry['dn'], $arrModify); + $result->result = true; + return $result; + + } else { + $arrModify['tgusersupplieddata'][] = "TRUE"; + + // only set the agreesearch flag if it came from the user + if ( $inRequest->agreeSearch ) { $arrModify['tgagreesearch'][] = "TRUE"; } else { $arrModify['tgagreesearch'][] = "FALSE"; } + } + + if ( strlen($inRequest->name) > 0 ) { $arrModify['cn'][] = $inRequest->name; } + if ( strlen($inRequest->organisation) > 0 ) { $arrModify['o'][] = $inRequest->organisation; } + if ( strlen($inRequest->mail) > 0 ) { $arrModify['mail'][] = $inRequest->mail; } + + $this->connection['user']->modify( $entry['dn'], $arrModify); + + $result->result = true; + + } else { + // no unique user found + $result->result = false; + } + + return $result; + + + } + + + // ----------------------------------------------------- @@ -1295,7 +1459,7 @@ class TgExtra { // ----------------------------------------------------- - // Function: setName + // Function: setName ... deprecated, see setMyUserAttributes // Input: auth / xsd:string // log / xsd:string // webAuthSecret / xsd:string diff --git a/info.textgrid.middleware.tgauth.rbac/rbacSoap/examples/getMyUserAttributes.php b/info.textgrid.middleware.tgauth.rbac/rbacSoap/examples/getMyUserAttributes.php new file mode 100755 index 0000000000000000000000000000000000000000..3918a6f590c5189b874c5e9413a58590fba3735b --- /dev/null +++ b/info.textgrid.middleware.tgauth.rbac/rbacSoap/examples/getMyUserAttributes.php @@ -0,0 +1,60 @@ +<?php +// ####################################################### +// Author: Martin Haase +// Creation date: 15.10.2010 +// Modification date: XX +// Version: 0.1.0 +// ####################################################### + + +require_once( "../soapTypes.inc.php" ); + + + +// ----------------------------------------------------- +// You'll need these services +// ----------------------------------------------------- +$soapExtra = new SoapClient( "../wsdl/tgextra.wsdl" ); + + +echo "<BODY><HTML>"; + + +if( isset( $_POST['auth'] ) ) { + + +$x = new StdClass(); +$x->auth=$_POST['auth']; +echo "<HR/>"; +echo "asking for my attributes...<BR/>"; + + +try { + + $getMyUserAttributesResponse = $soapExtra->getMyUserAttributes($x); + + $attrs = $getMyUserAttributesResponse->attribute; + + echo "<table>\n"; + foreach ($attrs as $a) { + echo "<tr><td>".$a->name."</td><td>".$a->value."</td></tr>\n"; + } + echo "</table>\n"; + +} +catch( SoapFault $f ) { + + echo "SOAP FAULT!: " . $f->faultcode . " / " . $f->faultstring . " / " . $f->detail; + +} + +} +echo "<FORM action=\"getMyUserAttributes.php\" method=\"post\" enctype=\"multipart/form-data\">\n"; +echo "Auth: <INPUT type=\"text\" name=\"auth\" value=\"\"><BR>\n"; +echo "<INPUT type=\"submit\" value=\"Commit...\">\n"; +echo "</FORM>\n"; + + +echo "</BODY></HTML>"; + +?> diff --git a/info.textgrid.middleware.tgauth.rbac/rbacSoap/examples/getSupportedUserAttributes.php b/info.textgrid.middleware.tgauth.rbac/rbacSoap/examples/getSupportedUserAttributes.php new file mode 100755 index 0000000000000000000000000000000000000000..a1a21696f98a83a03f6f38c25962cf5645cae678 --- /dev/null +++ b/info.textgrid.middleware.tgauth.rbac/rbacSoap/examples/getSupportedUserAttributes.php @@ -0,0 +1,47 @@ +<?php +// ####################################################### +// Author: Martin Haase +// Creation date: 15.10.2010 +// Modification date: XX +// Version: 0.1.0 +// ####################################################### + + +require_once( "../soapTypes.inc.php" ); + + + +// ----------------------------------------------------- +// You'll need these services +// ----------------------------------------------------- +$soapExtra = new SoapClient( "../wsdl/tgextra.wsdl" ); + + +echo "<BODY><HTML>"; + + + +// ----------------------------------------------------- +// How to get a session-ID from the RBAC-system +// ----------------------------------------------------- +echo "<HR/>"; +echo "Asking for attributes...<BR/>"; + +try { + + $getSupportedUserAttributesResponse = $soapExtra->getSupportedUserAttributes(); + + $a = $getSupportedUserAttributesResponse->attribute; + + echo serialize ($a); +} +catch( SoapFault $f ) { + + echo "SOAP FAULT!: " . $f->faultcode . " / " . $f->faultstring . " / " . $f->detail; + +} + + +echo "</BODY></HTML>"; + +?> diff --git a/info.textgrid.middleware.tgauth.rbac/rbacSoap/soapTypes.inc.php b/info.textgrid.middleware.tgauth.rbac/rbacSoap/soapTypes.inc.php index acda70bc5dc0a351de3158b86c6297f1b26b11e0..c13bed00f1287851a57cb1325882f91f918315e0 100755 --- a/info.textgrid.middleware.tgauth.rbac/rbacSoap/soapTypes.inc.php +++ b/info.textgrid.middleware.tgauth.rbac/rbacSoap/soapTypes.inc.php @@ -666,6 +666,26 @@ class friend { } } +class userAttribute { + public $name; + public $value; + public $description; + public $mandatory; + public $ldapname; + public $inclass; + public $displayname; + + public function __construct ( $inname, $invalue, $indescription, $inmandatory, $inldapname, $ininclass, $indisplayname) { + $this->name = $inname; + $this->value = $invalue; + $this->description = $indescription; + $this->mandatory = $inmandatory; + $this->ldapname = $inldapname; + $this->inclass = $ininclass; + $this->displayname = $indisplayname; + } +} + class userDetail { public $ePPN; public $name; diff --git a/info.textgrid.middleware.tgauth.rbac/rbacSoap/wsdl-8081/tgextra.wsdl b/info.textgrid.middleware.tgauth.rbac/rbacSoap/wsdl-8081/tgextra.wsdl index 1f06a1f8bb443a19cf727e3aee9baa91957d85fc..6186670b31c5a58bbfc203dfca3fb589960b72ea 100644 --- a/info.textgrid.middleware.tgauth.rbac/rbacSoap/wsdl-8081/tgextra.wsdl +++ b/info.textgrid.middleware.tgauth.rbac/rbacSoap/wsdl-8081/tgextra.wsdl @@ -88,7 +88,7 @@ <xsd:element name="getSidRequest"> <xsd:complexType> <xsd:sequence> - </xsd:sequence> + </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="getSidResponse"> @@ -98,6 +98,45 @@ </xsd:sequence> </xsd:complexType> </xsd:element> +<!-- #### getSupportedUserAttributes #### //--> + <xsd:element name="getSupportedUserAttributesRequest"> + <xsd:complexType> + <xsd:sequence> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + <xsd:element name="getSupportedUserAttributesResponse"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="attribute" type="tns:userAttribute" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> +<!-- #### getMyUserAttributes #### //--> + <xsd:element name="getMyUserAttributesRequest"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="auth" type="xsd:string" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + <xsd:element name="getMyUserAttributesResponse"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="attribute" type="tns:userAttribute" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> +<!-- #### setMyUserAttributes #### //--> + <xsd:element name="getMyUserAttributesRequest"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="auth" type="xsd:string" minOccurs="1" maxOccurs="1"/> + <xsd:element name="webAuthSecret" type="xsd:string" minOccurs="1" maxOccurs="1"/> + <xsd:element name="attribute" type="tns:userAttribute" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> <!-- #### registerResource #### //--> <xsd:element name="registerResourceRequest"> <xsd:complexType> @@ -421,7 +460,6 @@ <xsd:element name="name" type="xsd:string" minOccurs="0" maxOccurs="1"/> <xsd:element name="mail" type="xsd:string" minOccurs="0" maxOccurs="1"/> <xsd:element name="organisation" type="xsd:string" minOccurs="0" maxOccurs="1"/> - </xsd:sequence> </xsd:complexType> </xsd:element> @@ -544,6 +582,17 @@ <xsd:element name="roles" type="xsd:string" minOccurs="1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> + <xsd:complexType name="userAttribute"> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" maxOccurs="1"/> + <xsd:element name="description" type="xsd:string" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + <xsd:attribute name="mandatory" type="xsd:boolean" /> + <xsd:attribute name="ldapname" type="xsd:string" /> + <xsd:attribute name="inclass" type="xsd:string" /> + <xsd:attribute name="displayname" type="xsd:string" /> + </xsd:complexType> <xsd:element name="getFriendsResponse"> <xsd:complexType> <xsd:sequence> @@ -590,9 +639,9 @@ <!-- #### TextGridFaultType #### //--> <xsd:complexType name="TextGridFaultType"> <xsd:sequence> - <xsd:element name="faultNo" type="xsd:int" minoccurs="0" maxoccurs="1"/> - <xsd:element name="faultMessage" type="xsd:string" minoccurs="0" maxoccurs="1"/> - <xsd:element name="cause" type="xsd:string" minoccurs="0" maxoccurs="1"/> + <xsd:element name="faultNo" type="xsd:int" minOccurs="0" maxOccurs="1"/> + <xsd:element name="faultMessage" type="xsd:string" minOccurs="0" maxOccurs="1"/> + <xsd:element name="cause" type="xsd:string" minOccurs="0" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:schema> @@ -868,6 +917,27 @@ <wsdl:message name="getSidResponse"> <wsdl:part element="tns:getSidResponse" name="getSidOutput"/> </wsdl:message> +<!-- #### getSupportedUserAttributes #### //--> + <wsdl:message name="getSupportedUserAttributesRequest"> + <wsdl:part element="tns:getSupportedUserAttributesRequest" name="getSupportedUserAttributesInput"/> + </wsdl:message> + <wsdl:message name="getSupportedUserAttributesResponse"> + <wsdl:part element="tns:getSupportedUserAttributesResponse" name="getSupportedUserAttributesOutput"/> + </wsdl:message> +<!-- #### getMyUserAttributes #### //--> + <wsdl:message name="getMyUserAttributesRequest"> + <wsdl:part element="tns:getMyUserAttributesRequest" name="getMyUserAttributesInput"/> + </wsdl:message> + <wsdl:message name="getMyUserAttributesResponse"> + <wsdl:part element="tns:getMyUserAttributesResponse" name="getMyUserAttributesOutput"/> + </wsdl:message> +<!-- #### setMyUserAttributes #### //--> + <wsdl:message name="setMyUserAttributesRequest"> + <wsdl:part element="tns:setMyUserAttributesRequest" name="setMyUserAttributesInput"/> + </wsdl:message> + <wsdl:message name="setMyUserAttributesResponse"> + <wsdl:part element="tns:booleanResponse" name="setMyUserAttributesOutput"/> + </wsdl:message> <!-- #### authenticationFault #### //--> <wsdl:message name="authenticationFault"> <wsdl:part element="tns:authenticationFaultResponse" name="authenticationFault"/> @@ -1000,13 +1070,19 @@ <!-- #### provideUserDetails #### //--> <wsdl:operation name="provideUserDetails"> <wsdl:documentation> - Supply further user-specific information - <ul><li><b>Input Parameters</b> provideUserDetailsRequest, with elements - <ul><li>auth - String, SessionID of User who wants to set their name</li><li>log - String for log information, optional</li><li>citizenship - mandatory 2-letter String with code for Country Of Citizenship of the User</li><li>personid - optional, an URI or PND reference for the person</li><li>interest - optional, Users can list their TextGrid-related research interests</li><li>organisationalunit - optional, finer-grained unit of a larger organisation</li></ul></li><li><b>Output Parameters</b> booleanResponse, with element - <ul><li>result - boolean, true if operation was successful, - false otherwise</li></ul></li><li><b>Faults</b><ul> - </ul></li></ul> - </wsdl:documentation> + Supply further user-specific information + <ul><li><b>Input Parameters</b> + provideUserDetailsRequest, with elements + <ul><li>auth - String, SessionID of User who wants to set their name</li><li>log - String for log information, optional</li><li>citizenship - mandatory 2-letter String with code for Country + Of Citizenship of the User</li><li>personid - optional, an URI or PND reference for the person</li><li>interest - optional, Users can list their TextGrid-related + research interests</li><li>organisationalunit - optional, finer-grained unit of a larger + organisation</li></ul></li><li><b>Output Parameters</b> + booleanResponse, with element + <ul><li>result - boolean, true if operation was successful, + false + otherwise</li></ul></li><li><b>Faults</b><ul> + </ul></li></ul> + </wsdl:documentation> <wsdl:input message="tns:provideUserDetailsRequest"/> <wsdl:output message="tns:provideUserDetailsResponse"/> </wsdl:operation> @@ -1163,7 +1239,8 @@ <wsdl:operation name="tgCheckAccess"> <wsdl:documentation> Returns access decision for given operation on given resource - for session. + for + session. <ul><li><b>Input Parameters</b> tgCheckAccessRequest, with elements <ul><li>auth - String, SessionID of user (or service) that @@ -1190,8 +1267,10 @@ <wsdl:operation name="tgCrudCheckAccess"> <wsdl:documentation> Returns access decision for given operation on given resource - for session. In addition the owner of the session and informations - on the project is returned. + for + session. In addition the owner of the session and informations + on the + project is returned. <ul><li><b>Input Parameters</b> tgCrudCheckAccessRequest, with elements <ul><li>auth - String, SessionID of user (or service) that @@ -1379,7 +1458,8 @@ registered in RBAC</li><li>secret - String known by TG-crud to authenticate itself</li></ul></li><li><b>Output Parameters</b> operationsSetResponse, with element - <ul><li>operation (0..n) Strings with permissible operations on the newly created resource</li></ul></li><li><b>Faults</b><ul><li>authenticationFault</li></ul></li></ul> + <ul><li>operation (0..n) Strings with permissible operations on the + newly created resource</li></ul></li><li><b>Faults</b><ul><li>authenticationFault</li></ul></li></ul> </wsdl:documentation> <wsdl:input message="tns:registerResourceRequest"/> <wsdl:output message="tns:registerResourceResponse"/> @@ -1635,16 +1715,15 @@ <!-- #### getNumberOfResources #### //--> <wsdl:operation name="getNumberOfResources"> <wsdl:documentation> - Returns the total number of resources and the number of public ones in this project. Can be called by anyone. + Returns the total number of resources and the number of public ones + in this project. Can be called by anyone. <ul><li><b>Input Parameters</b> getNumberOfResourcesRequest, with elements <ul><li>auth - String, SessionID of user that wants to query. Can be empty.</li><li>log - String for log information, optional</li><li>project - String</li></ul></li><li><b>Output Parameters</b> getNumberOfResourcesResponse, with elements - <ul><li>allresources - integer</li><li>publicresources - integer</li> - </ul> - </li></ul> + <ul><li>allresources - integer</li><li>publicresources - integer</li></ul></li></ul> </wsdl:documentation> <wsdl:input message="tns:getNumberOfResourcesRequest"/> <wsdl:output message="tns:getNumberOfResourcesResponse"/> @@ -1749,6 +1828,32 @@ <wsdl:input message="tns:getSidRequest"/> <wsdl:output message="tns:getSidResponse"/> </wsdl:operation> + + +<!-- #### getSupportedUserAttributes #### //--> + <wsdl:operation name="getSupportedUserAttributes"> + <wsdl:documentation>TODO</wsdl:documentation> + <wsdl:input message="tns:getSupportedUserAttributesRequest"/> + <wsdl:output message="tns:getSupportedUserAttributesResponse"/> + </wsdl:operation> + +<!-- #### getMyUserAttributes #### //--> + <wsdl:operation name="getMyUserAttributes"> + <wsdl:documentation>TODO</wsdl:documentation> + <wsdl:input message="tns:getMyUserAttributesRequest"/> + <wsdl:output message="tns:getMyUserAttributesResponse"/> + <wsdl:fault name="authenticationFault" message="tns:authenticationFault"/> + </wsdl:operation> + +<!-- #### setMyUserAttributes #### //--> + <wsdl:operation name="setMyUserAttributes"> + <wsdl:documentation>TODO</wsdl:documentation> + <wsdl:input message="tns:setMyUserAttributesRequest"/> + <wsdl:output message="tns:setMyUserAttributesResponse"/> + <wsdl:fault name="authenticationFault" message="tns:authenticationFault"/> + </wsdl:operation> + + </wsdl:portType> <!-- ########### @@ -2199,6 +2304,36 @@ <soap:fault use="literal" name="notEmptyFault"/> </wsdl:fault> </wsdl:operation> +<!-- #### getSupportedUserAttributes #### //--> + <wsdl:operation name="getSupportedUserAttributes"> + <soap:operation soapAction="http://textgrid.info/namespaces/middleware/tgauth/getSupportedUserAttributes"/> + <wsdl:input> + <soap:body use="literal"/> + </wsdl:input> + <wsdl:output> + <soap:body use="literal"/> + </wsdl:output> + </wsdl:operation> +<!-- #### getMyUserAttributes #### //--> + <wsdl:operation name="getMyUserAttributes"> + <soap:operation soapAction="http://textgrid.info/namespaces/middleware/tgauth/getMyUserAttributes"/> + <wsdl:input> + <soap:body use="literal"/> + </wsdl:input> + <wsdl:output> + <soap:body use="literal"/> + </wsdl:output> + </wsdl:operation> +<!-- #### setMyUserAttributes #### //--> + <wsdl:operation name="setMyUserAttributes"> + <soap:operation soapAction="http://textgrid.info/namespaces/middleware/tgauth/setMyUserAttributes"/> + <wsdl:input> + <soap:body use="literal"/> + </wsdl:input> + <wsdl:output> + <soap:body use="literal"/> + </wsdl:output> + </wsdl:operation> <!-- #### getSid #### //--> <wsdl:operation name="getSid"> <soap:operation soapAction="http://textgrid.info/namespaces/middleware/tgauth/getSid"/>