<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright © 2019 COZYROC LLC. All rights reserved. -->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:include schemaLocation="now-service-config-1.0.xsd" />

  <xs:element name="WebBridge" type="WebBridgeConfiguration" />

  <xs:complexType name="WebBridgeConfiguration">
    <xs:all>
      <xs:element name="Queues" type="Queues" />
      <xs:element name="Profiles" type="Profiles" />
      <xs:element name="Services" type="Services" />
      <xs:element name="Routing" type="Routing" />
      <xs:element name="Authentication" type="Authentication" minOccurs="0" />
    </xs:all>
    <xs:attribute name="XSDVersion" type="BridgeConfigXSDVersion" use="required" />
    <xs:anyAttribute />
  </xs:complexType>

  <xs:complexType name="Authentication">
    <xs:choice>
      <xs:element name="AspNetCoreIdentity" type="AspNetCoreIdentity" minOccurs="0" />
      <xs:element name="OAuth2" type="OAuth2BridgeAuthService" minOccurs="0" />
      <xs:element name="Custom" type="CustomBridgeAuthService" minOccurs="0" />
    </xs:choice>
    <xs:attribute name="AutoChallengeOnAuthFailure" type="xs:boolean" />
  </xs:complexType>

  <xs:complexType name="OAuth2BridgeAuthService">
    <xs:all>
      <xs:element name="AccessToken" type="AccessToken" />
      <xs:element name="Login" type="Login" />
    </xs:all>
    <xs:attribute name="Secret" type="xs:string" />
  </xs:complexType>

  <xs:complexType name="Login">
    <xs:all>
      <xs:element name="AuthRequest" type="ExternalValidationRequest" />
      <xs:element name="AuthResponse" type="ExternalAuthResponse" />
    </xs:all>
    <xs:attribute name="Path" type="xs:string" />
    <xs:attribute name="Method" type="RequestMethod" use="optional" default="post" />
    <xs:attribute name="ResponseFormat" type="OutputFormat" use="optional" default="json" />
  </xs:complexType>

  <xs:complexType name="ExternalValidationRequest">
    <xs:sequence>
      <xs:element name="Parameter" type="AuthRequestParameter" maxOccurs="unbounded" />
      <xs:element name="BodyTemplate" minOccurs="0" />
    </xs:sequence>
    <xs:attribute name="Url" type="xs:string" />
    <xs:attribute name="Method" type="RequestMethod" use="optional" default="post" />
  </xs:complexType>

  <xs:complexType name="ExternalAuthResponse">
    <xs:sequence>
      <xs:element name="RequiredProperty" type="AuthResponseProperty" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="Format" type="OutputFormat" default="json" />
    <xs:attribute name="UserIdPropertyName" type="xs:string" />
    <xs:attribute name="UserIdSource" type="AuthResponseValueSource" />
  </xs:complexType>

  <xs:complexType name="AuthRequestParameter">
    <xs:attribute name="Name" type="xs:string" />
    <xs:attribute name="ReadFrom" type="ParameterSource" use="optional" default="anywhere" />
    <xs:attribute name="WriteTo" type="AuthRequestParameterValueSource"  use="optional" default="querystring" />
    <xs:attribute name="Value" type="xs:string" use="optional" />
    <xs:attribute name="AuthParameterName" type="xs:string" use="optional" />
  </xs:complexType>

  <xs:complexType name="AuthResponseProperty">
    <xs:attribute name="Name" type="xs:string" />
    <xs:attribute name="ReadFrom" type="AuthResponseValueSource" />
    <xs:attribute name="ExpectedValue" type="xs:string" use="optional" />
  </xs:complexType>

  <xs:complexType name="AccessToken">
    <xs:attribute name="PropertyName" type="xs:string" />
    <xs:attribute name="Source" type="AccessTokenValueSource" use="optional" default="cookies" />
    <xs:attribute name="SigningAlgorithm" type="xs:string" use="optional" default="HS256"/>
    <xs:attribute name="Lifetime" type="xs:int" use="optional" default="3000"/>
  </xs:complexType>

  <xs:simpleType name="AuthRequestParameterValueSource">
    <xs:restriction base="xs:string">
      <xs:enumeration value="querystring" />
      <xs:enumeration value="http-header" />
      <xs:enumeration value="body-template" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="AuthResponseValueSource">
    <xs:restriction base="xs:string">
      <xs:enumeration value="http-header" />
      <xs:enumeration value="body" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="AccessTokenValueSource">
    <xs:restriction base="xs:string">
      <xs:enumeration value="querystring" />
      <xs:enumeration value="http-header" />
      <xs:enumeration value="cookies" />
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="CustomBridgeAuthService">
    <xs:sequence>
      <xs:element name="Settings" type="CustomSetting" maxOccurs="unbounded" minOccurs="0" />
    </xs:sequence>
    <xs:attribute name="AuthAssemblyName" type="xs:string" />
    <xs:attribute name="AuthImplementationType" type="xs:string" />
  </xs:complexType>

  <xs:complexType name="CustomSetting">
    <xs:attribute name="Name" type="xs:string" />
    <xs:attribute name="Value" type="xs:string" />
  </xs:complexType>

  <xs:complexType name="AspNetCoreIdentity">
    <xs:all>
      <xs:element name="User" type="UserOptions" minOccurs="0" />
      <xs:element name="Password" type="PasswordOptions" minOccurs="0" />
      <xs:element name="Lockout" type="LockoutOptions" minOccurs="0" />
      <xs:element name="SignIn" type="SignInOptions" minOccurs="0" />
      <xs:element name="Tokens" type="TokensOptions" minOccurs="0" />
      <xs:element name="Stores" type="StoresOptions" minOccurs="0" />
      <xs:element name="AuthCookies" type="AuthCookiesOptions" minOccurs="0" />
    </xs:all>
    <xs:attribute name="ConnectionString" type="xs:string" />
  </xs:complexType>

  <xs:complexType name="AuthCookiesOptions">
    <xs:attribute name="SlidingExpiration" type="xs:boolean" use="optional" />
    <xs:attribute name="LoginPath" type="xs:string" use="optional" />
    <xs:attribute name="LogoutPath" type="xs:string" use="optional" />
    <xs:attribute name="AccessDeniedPath" type="xs:string" use="optional" />
    <xs:attribute name="ReturnUrlParameter" type="xs:string" use="optional" />
    <xs:attribute name="ExpireTime" type="xs:int" use="optional" />
  </xs:complexType>

  <xs:complexType name="UserOptions">
    <xs:attribute name="AllowedUserNameCharacters" type="xs:string" use="optional"/>
  </xs:complexType>

  <xs:complexType name="PasswordOptions">
    <xs:attribute name="RequiredLength" type="xs:int" use="optional" />
    <xs:attribute name="RequiredUniqueChars" type="xs:int" use="optional" />
    <xs:attribute name="RequireNonAlphanumeric" type="xs:boolean" use="optional" />
    <xs:attribute name="RequireLowercase" type="xs:boolean" use="optional" />
    <xs:attribute name="RequireUppercase" type="xs:boolean" use="optional" />
    <xs:attribute name="RequireDigit" type="xs:boolean" use="optional" />
  </xs:complexType>

  <xs:complexType name="LockoutOptions">
    <xs:attribute name="AllowedForNewUsers" type="xs:boolean" use="optional" />
    <xs:attribute name="MaxFailedAccessAttempts" type="xs:int" use="optional" />
    <xs:attribute name="DefaultLockoutTime" type="xs:int" use="optional" />
  </xs:complexType>

  <xs:complexType name="SignInOptions">
    <xs:attribute name="RequireConfirmedEmail" type="xs:boolean" use="optional" />
    <xs:attribute name="RequireConfirmedPhoneNumber" type="xs:boolean" use="optional" />
  </xs:complexType>

  <xs:complexType name="TokensOptions">
    <xs:attribute name="EmailConfirmationTokenProvider" type="xs:string" use="optional" />
    <xs:attribute name="PasswordResetTokenProvider" type="xs:string" use="optional" />
    <xs:attribute name="ChangeEmailTokenProvider" type="xs:string" use="optional" />
    <xs:attribute name="ChangePhoneNumberTokenProvider" type="xs:string" use="optional" />
    <xs:attribute name="AuthenticatorTokenProvider" type="xs:string" use="optional" />
  </xs:complexType>

  <xs:complexType name="StoresOptions">
    <xs:attribute name="MaxLengthForKeys" type="xs:int" use="optional" />
  </xs:complexType>

  <xs:complexType name="Routing">
    <xs:sequence>
      <xs:element name="Route" type="Route" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="Route">
    <xs:all>
      <xs:element name="Parameters" type="Parameters" minOccurs="0" />
      <xs:element name="RequestBody" type="RequestBody" minOccurs="0" />
      <xs:element name="Response" type="Response" minOccurs="0" />
    </xs:all>
    <xs:attribute name="Path" type="xs:string" />
    <xs:attribute name="Service" type="xs:string" use="optional" />
    <xs:attribute name="Method" type="RequestMethod" use="optional" default="get" />
    <xs:attribute name="WaitResult" type="xs:boolean" use="optional" default="false" />
    <xs:attribute name="WaitResultTimeout" type="xs:int" use="optional" default="60" />
    <xs:attribute name="InheritFromService" type="xs:boolean" use="optional" default="false" />
    <xs:attribute name="GenerateWebPreview" type="xs:boolean" use="optional" default="false" />
    <xs:attribute name="AuthRequired" type="xs:boolean" use="optional" default="false" />
  </xs:complexType>

  <xs:complexType name="Parameters">
    <xs:sequence>
      <xs:element name="Parameter" type="Parameter" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="RequestBody">
    <xs:attribute name="ServiceParameterName" type="xs:string" />
    <xs:attribute name="ParameterType" type="BodyParameterType" />
  </xs:complexType>

  <xs:complexType name="StreamOutput">
    <xs:attribute name="OutputServiceParameterName" type="xs:string" />
    <xs:attribute name="ContentType" type="xs:string" use="optional" default="application/octet-stream" />
    <xs:attribute name="ContentDisposition" type="xs:string" use="optional" />
  </xs:complexType>

  <xs:complexType name="Response">
    <xs:choice>
      <xs:element name="StreamOutput" type="StreamOutput" />
      <xs:element name="Properties" type="Properties" />
    </xs:choice>
  </xs:complexType>

  <xs:complexType name="Properties">
    <xs:sequence>
      <xs:element name="Property" type="Property" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="Format" type="OutputFormat" use="optional" default="json" />
  </xs:complexType>

  <xs:complexType name="Property">
    <xs:sequence>
      <xs:element name="CSV" type="CsvPresentationType" minOccurs="0" />
    </xs:sequence>
    <xs:attribute name="Name" type="xs:string" />
  </xs:complexType>

  <xs:complexType name="Parameter">
    <xs:choice>
      <xs:element name="File" type="FilePresentationType" minOccurs="0" />
    </xs:choice>
    <xs:attribute name="Name" type="xs:string" />
    <xs:attribute name="ReadFrom" type="ParameterSource" use="optional" default="anywhere" />
    <xs:attribute name="DefaultValue" type="xs:string" use="optional" />
    <xs:attribute name="ServiceParameterName" type="xs:string" use="optional" />
  </xs:complexType>

  <xs:complexType name="CsvPresentationType">
    <xs:attribute name="Separator" type="xs:byte" />
  </xs:complexType>

  <xs:complexType name="FilePresentationType">
    <xs:attribute name="Name" type="xs:string" />
  </xs:complexType>

  <xs:simpleType name="BridgeConfigXSDVersion">
    <xs:restriction base="ConfigVersion">
      <xs:minInclusive value="1.00" />
      <xs:maxExclusive value="1.01" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="RequestMethod">
    <xs:restriction base="xs:string">
      <xs:enumeration value="get" />
      <xs:enumeration value="post" />
      <xs:enumeration value="head" />
      <xs:enumeration value="put" />
      <xs:enumeration value="delete" />
      <xs:enumeration value="connect" />
      <xs:enumeration value="options" />
      <xs:enumeration value="trace" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="OutputFormat">
    <xs:restriction base="xs:string">
      <xs:enumeration value="xml" />
      <xs:enumeration value="json" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="ParameterSource">
    <xs:restriction base="xs:string">
      <xs:enumeration value="querystring" />
      <xs:enumeration value="form-data" />
      <xs:enumeration value="url-path" />
      <xs:enumeration value="http-header" />
      <xs:enumeration value="cookies" />
      <xs:enumeration value="anywhere" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="BodyParameterType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="text" />
      <xs:enumeration value="stream" />
    </xs:restriction>
  </xs:simpleType>

</xs:schema>
