#!/usr/bin/perl

use Lemonldap::NG::Portal::SharedConf;

my $self = Lemonldap::NG::Portal::SharedConf->new( {} );

unless ( $self->{Soap} ) {
    print STDERR "Lemonldap::NG Portal SOAP capability is disabled.\n"
      . "Set 'Soap' option to 1 in manager or lemonldap-ng.ini to enable it.\n";
    exit;
}

my $portal = $self->{portal};
$portal .= "index.pl" if ( $portal =~ /\/$/ );

my @cookies = ( $self->{cookieName} );
push @cookies, "$self->{cookieName}http"
  if ( $self->{securedCookie} >= 2 );
my $cookieList = join "\n",
  map { "<element name='$_' type='xsd:string'></element>" } @cookies;

my $attrList = join "\n",
  map { "<element name='$_' type='xsd:string' nillable='true'></element>" }
  $self->exportedAttr;

print <<EOT;
<?xml version="1.0" encoding="UTF-8"?>

<wsdl:definitions
    targetNamespace="urn:Lemonldap/NG/Common/CGI/SOAPService"
    xmlns:impl="urn:Lemonldap/NG/Common/CGI/SOAPService"
    xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:tns1="urn:Lemonldap/NG/Common/CGI/SOAPService">

  <!-- types definitions -->

  <wsdl:types>
    <schema targetNamespace="urn:Lemonldap/NG/Common/CGI/SOAPService" xmlns="http://www.w3.org/2001/XMLSchema">
      <import namespace="http://schemas.xmlsoap.org/soap/encoding/" />

      <complexType name="CookiesSequence">
        <sequence>
$cookieList
        </sequence>
      </complexType>
      <complexType name="AttributesSequence">
        <sequence>
$attrList
        </sequence>
      </complexType>
      <complexType name="GetCookieResponse">
        <sequence>
          <element name="errorCode" type="xsd:int"></element>
          <element name="cookies" minOccurs="0" type="tns1:CookiesSequence"></element>
        </sequence>
      </complexType>
      <complexType name="GetAttributesResponse">
        <sequence>
          <element name="error" type="xsd:int"></element>
          <element name="attributes" type="tns1:AttributesSequence"></element>
        </sequence>
      </complexType>

    </schema>
  </wsdl:types>

  <!-- authentication service -->

  <wsdl:message name="errorRequest">
    <wsdl:part name="code" type="xsd:int" />
    <wsdl:part name="lang" type="xsd:string" />
  </wsdl:message>
  <wsdl:message name="errorResponse">
    <wsdl:part name="result" type="xsd:string" />
  </wsdl:message>

  <wsdl:message name="getCookiesRequest">
    <wsdl:part name="user" type="xsd:string" />
    <wsdl:part name="password" type="xsd:string" />
  </wsdl:message>
  <wsdl:message name="getCookiesResponse">
    <wsdl:part name="session" type="tns1:GetCookieResponse" />
  </wsdl:message>

  <wsdl:portType name="authenticationPortType">
    <wsdl:operation name="error" parameterOrder="code lang">
      <wsdl:input message="impl:errorRequest" name="errorRequest" />
      <wsdl:output message="impl:errorResponse" name="errorResponse" />
    </wsdl:operation>
    <wsdl:operation name="getCookies" parameterOrder="user password">
      <wsdl:input message="impl:getCookiesRequest" name="getCookiesRequest" />
      <wsdl:output message="impl:getCookiesResponse" name="getCookiesResponse" />
    </wsdl:operation>
  </wsdl:portType>

  <wsdl:binding name="authenticationBinding" type="impl:authenticationPortType">
    <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="error">
      <wsdlsoap:operation soapAction="" />
      <wsdl:input name="errorRequest">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Lemonldap/NG/Common/CGI/SOAPService" use="encoded" />
      </wsdl:input>
      <wsdl:output name="errorResponse">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Lemonldap/NG/Common/CGI/SOAPService" use="encoded" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="getCookies">
      <wsdlsoap:operation soapAction="" />
      <wsdl:input name="getCookiesRequest">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Lemonldap/NG/Common/CGI/SOAPService" use="encoded" />
      </wsdl:input>
      <wsdl:output name="getCookiesResponse">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Lemonldap/NG/Common/CGI/SOAPService" use="encoded" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>

  <wsdl:service name="authenticationService">
    <wsdl:port binding="impl:authenticationBinding" name="authenticationPort">
      <wsdlsoap:address location="$portal" />
    </wsdl:port>
  </wsdl:service>

  <!-- notification service -->

  <wsdl:message name="newNotificationRequest">
    <wsdl:part name="notification" type="xsd:string" />
  </wsdl:message>
  <wsdl:message name="newNotificationResponse">
    <wsdl:part name="result" type="xsd:int" />
  </wsdl:message>
  <wsdl:message name="deleteNotificationRequest">
    <wsdl:part name="uid" type="xsd:string" />
    <wsdl:part name="myref" type="xsd:string" />
  </wsdl:message>
  <wsdl:message name="deleteNotificationResponse">
    <wsdl:part name="result" type="xsd:int" />
  </wsdl:message>

  <wsdl:portType name="notificationPortType">
    <wsdl:operation name="newNotification" parameterOrder="notification">
      <wsdl:input message="impl:newNotificationRequest" name="newNotificationRequest" />
      <wsdl:output message="impl:newNotificationResponse" name="newNotificationResponse" />
    </wsdl:operation>
    <wsdl:operation name="deleteNotification" parameterOrder="uid myref">
      <wsdl:input message="impl:deleteNotificationRequest" name="deleteNotificationRequest" />
      <wsdl:output message="impl:deleteNotificationResponse" name="deleteNotificationResponse" />
    </wsdl:operation>
  </wsdl:portType>

  <wsdl:binding name="notificationBinding" type="impl:notificationPortType">
    <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="newNotification">
      <wsdlsoap:operation soapAction="" />
      <wsdl:input name="newNotificationRequest">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Lemonldap/NG/Common/CGI/SOAPService" use="encoded" />
      </wsdl:input>
      <wsdl:output name="newNotificationResponse">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Lemonldap/NG/Common/CGI/SOAPService" use="encoded" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="deleteNotification">
      <wsdlsoap:operation soapAction="" />
      <wsdl:input name="deleteNotificationRequest">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Lemonldap/NG/Common/CGI/SOAPService" use="encoded" />
      </wsdl:input>
      <wsdl:output name="deleteNotificationResponse">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Lemonldap/NG/Common/CGI/SOAPService" use="encoded" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>

  <wsdl:service name="notificationService">
    <wsdl:port binding="impl:notificationBinding" name="notificationPort">
      <wsdlsoap:address location="$portal/notification" />
    </wsdl:port>
  </wsdl:service>

  <!-- sessions service -->

  <wsdl:message name="getAttributesRequest">
    <wsdl:part name="id" type="xsd:string" />
  </wsdl:message>
  <wsdl:message name="getAttributesResponse">
    <wsdl:part name="session" type="tns1:GetAttributesResponse" />
  </wsdl:message>

  <wsdl:message name="isAuthorizedURIRequest">
    <wsdl:part name="id" type="xsd:string" />
    <wsdl:part name="uri" type="xsd:string" />
  </wsdl:message>
  <wsdl:message name="isAuthorizedURIResponse">
    <wsdl:part name="result" type="xsd:int" />
  </wsdl:message>

  <wsdl:message name="getMenuApplicationsRequest">
    <wsdl:part name="id" type="xsd:string" />
  </wsdl:message>
  <wsdl:message name="getMenuApplicationsResponse">
    <wsdl:part name="result" type="xsd:anyType" />
  </wsdl:message>

  <wsdl:portType name="sessionsPortType">
    <wsdl:operation name="getAttributes" parameterOrder="id">
      <wsdl:input message="impl:getAttributesRequest" name="getAttributesRequest" />
      <wsdl:output message="impl:getAttributesResponse" name="getAttributesResponse" />
    </wsdl:operation>
    <wsdl:operation name="isAuthorizedURI" parameterOrder="id uri">
      <wsdl:input message="impl:isAuthorizedURIRequest" name="isAuthorizedURIRequest" />
      <wsdl:output message="impl:isAuthorizedURIResponse" name="isAuthorizedURIResponse" />
    </wsdl:operation>
    <wsdl:operation name="getMenuApplications" parameterOrder="id">
      <wsdl:input message="impl:getMenuApplicationsRequest" name="getMenuApplicationsRequest" />
      <wsdl:output message="impl:getMenuApplicationsResponse" name="getMenuApplicationsResponse" />
    </wsdl:operation>
  </wsdl:portType>

  <wsdl:binding name="sessionsBinding" type="impl:sessionsPortType">
    <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="getAttributes">
      <wsdlsoap:operation soapAction="" />
      <wsdl:input name="getAttributesRequest">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Lemonldap/NG/Common/CGI/SOAPService" use="encoded" />
      </wsdl:input>
      <wsdl:output name="getAttributesResponse">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Lemonldap/NG/Common/CGI/SOAPService" use="encoded" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="isAuthorizedURI">
      <wsdlsoap:operation soapAction="" />
      <wsdl:input name="isAuthorizedURIRequest">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Lemonldap/NG/Common/CGI/SOAPService" use="encoded" />
      </wsdl:input>
      <wsdl:output name="isAuthorizedURIResponse">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Lemonldap/NG/Common/CGI/SOAPService" use="encoded" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="getMenuApplications">
      <wsdlsoap:operation soapAction="" />
      <wsdl:input name="getMenuApplicationsRequest">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Lemonldap/NG/Common/CGI/SOAPService" use="encoded" />
      </wsdl:input>
      <wsdl:output name="getMenuApplicationsResponse">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Lemonldap/NG/Common/CGI/SOAPService" use="encoded" />
      </wsdl:output>
    </wsdl:operation>

  </wsdl:binding>

  <wsdl:service name="sessionsService">
    <wsdl:port binding="impl:sessionsBinding" name="sessionsPort">
      <wsdlsoap:address location="$portal/sessions" />
    </wsdl:port>
  </wsdl:service>

</wsdl:definitions>
EOT

