Skip to content

Settings.xml

The SIPIS configuration file is an XML file defined by the following schema.

<xs:element name="Sipis">
  <xs:complexType>
    <xs:all>
      <xs:element name="Server" minOccurs="1" maxOccurs="1">…</xs:element>
      <xs:element name="HttpServer" minOccurs="1" maxOccurs="1">…</xs:element>
      <xs:element name="Administrator" minOccurs="1" maxOccurs="1">…</xs:element>
      <xs:element name="Database" minOccurs="1" maxOccurs="1">…</xs:element>
      <xs:element name="Lock" minOccurs="1" maxOccurs="1">…</xs:element>
      <xs:element name="Log" minOccurs="1" maxOccurs="1">…</xs:element>
      <xs:element name="NotificationServers" minOccurs="1" maxOccurs="1">…</xs:element>
      <xs:element name="AllowedAppIds" minOccurs="0" maxOccurs="1">…</xs:element>
      <xs:element name="IgnoredAppIds" minOccurs="0" maxOccurs="1">…</xs:element>
      <xs:element name="TlsClientCertificates" minOccurs="0" maxOccurs="1">…</xs:element>
      <xs:element name="TlsServerOptions" minOccurs="0" maxOccurs="1">…</xs:element>
      <xs:element name="TrustedCertificates" minOccurs="0" maxOccurs="1">…</xs:element>
      <xs:element name="Instance" minOccurs="1" maxOccurs="1">…</xs:element>
      <xs:element name="UnknownRemoteHostPolicy" minOccurs="0" maxOccurs="1">…</xs:element>
      <xs:element name="KnownRemoteHosts" minOccurs="0" maxOccurs="1">…</xs:element>
      <xs:element name="Call" minOccurs="0" maxOccurs="1">…</xs:element>
      <xs:element name="OutgoingCall" minOccurs="0" maxOccurs="1">…</xs:element>
      <xs:element name="IncomingCall" minOccurs="0" maxOccurs="1">…</xs:element>
      <xs:element name="IncomingTextMessage" minOccurs="0" maxOccurs="1">…</xs:element>
      <xs:element name="PushTest" minOccurs="0" maxOccurs="1">…</xs:element>
      <xs:element name="DataProtection" minOccurs="0" maxOccurs="1">…</xs:element>
      <xs:element name="Restart" minOccurs="0" maxOccurs="1">…</xs:element>
      <xs:element name="UptimeRobot" minOccurs="0" maxOccurs="1">…</xs:element>
      <xs:element name="Overrides" minOccurs="0" maxOccurs="1">…</xs:element>
    </xs:all>
    <xs:attribute name="Defaults" type="xs:string" use="optional" />
  </xs:complexType>
</xs:element>

Duration elements accept nonnegative integer Days, Hours, Minutes, Seconds and Milliseconds attributes. The supplied components are added together. Specify at least one of these attributes for a duration. The sections below state the precision used by each setting. Rounding up to whole seconds applies to the combined duration; for example, Milliseconds="1500" becomes two seconds for such settings.

Sipis[Defaults] (Since 3.50)

This attribute specifies a path to another settings file. SIPIS first loads that file, including any Defaults it references, then merges the current file into the inherited settings.

Relative paths are resolved relative to the settings file containing the Defaults attribute.

Attributes in the current file replace inherited attributes with the same name; other inherited attributes remain. Child elements are merged recursively by name and occurrence: the first element of a given name merges with the first inherited element of that name, the second with the second, and so on. Additional occurrences are appended, and unmatched inherited entries remain. Attributes such as Name, Host and Selector do not select which list entry to override. Omitting an inherited entry does not delete it.

The merge copies attributes and child structure. Element text from the current file, such as a whitespace-separated TLS identifier list, is not copied by this merge.

For example, if Defaults.xml supplies complete settings with two NotificationServer entries, this override file changes only the first entry's port:

<Sipis Defaults="Defaults.xml">
  <NotificationServers>
    <NotificationServer Port="443" />
  </NotificationServers>
</Sipis>

The first entry retains its inherited Name and Host, and the second entry remains unchanged.

Sipis/Server

This element configures the SIPIS listener used by LoadBalancer2 and common properties of the SIP client instances running inside SIPIS.

<xs:element name="Server" minOccurs="1" maxOccurs="1">
  <xs:complexType>
    <xs:attribute name="Name" type="xs:string" use="required" />
    <xs:attribute name="Address" type="xs:string" use="required" />
    <xs:attribute name="Port" type="PortType" use="required" />
    <xs:attribute name="Transport" type="ServerTransportType" use="optional" default="Tcp" />
    <xs:attribute name="PublicAddress" type="xs:string" use="optional" default="" />
    <xs:attribute name="PrivateAddress" type="xs:string" use="optional" default="" />
    <xs:attribute name="Realm" type="xs:string" use="optional" default="" />
    <xs:attribute name="FilterInstancesAccordingToLoadBalancer2BackendSection" type="YesNoType" use="optional" default="No" />
  </xs:complexType>
</xs:element>

Sipis/Server[Name]

Each SIPIS must be assigned a unique name. This name is used in a few SQL queries.

Sipis/Server[Address, Port]

These attributes specify address and port where SIPIS will accept connections from LoadBalancer2. Use 0.0.0.0 as a "don't care" value.

Sipis/Server[Transport] (Since 4.1)

This attribute selects the transport used between SIPIS and LoadBalancer2. Possible values are Udp (legacy), Tcp and Tls. LoadBalancer2 selects its backend transport independently of its frontend transports: traffic received on a UDP frontend can be forwarded to SIPIS over UDP, TCP or TLS. SIPIS also keeps its UDP transport active for monitoring and testing reasons, even when a TCP or TLS listener is enabled.

Default value: Tcp.

Sipis/Server[PublicAddress]

When specified, this address is used instead of a socket's local address in the Via and Contact SIP headers if a VoIP provider prohibits local addresses in those headers (DiscoverGlobalIP=Yes).

Sipis/Server[PrivateAddress]

When specified, this address is used instead of a socket's local address in the Via and Contact SIP headers if a VoIP provider permits local addresses in those headers (DiscoverGlobalIP=No).

Note

In case SIPIS is hosted on a machine with only a public interface it is advisable to specify an arbitrary private address in the Sipis/Server[PrivateAddress] attribute. This allows sipis to properly simulate being behind NAT, which helps interoperability with certain service providers.

Sipis/Server[Realm] (Since 3.50)

This attribute specifies the realm parameter of the digest authentication mechanism. If not specified Sipis/Server[Name] is used instead.

Sipis/Server[FilterInstancesAccordingToLoadBalancer2BackendSection] (Since 3.50)

If this attribute is set to Yes, then, during restart, SIPIS will load from the restart table only instances whose selector matches the corresponding LoadBalancer2/Backend/Sipis entry from the /etc/acrobits/LoadBalancer2/Settings.xml file. The corresponding entry is found by matching the Sipis/Server[Name] and LoadBalancer2/Backend/Sipis[Name] attributes.

Sipis/HttpServer

The HTTP server, built into SIPIS, can be used to display various server statistics in a web browser.

Use http://<SIPIS Host Name>:<SIPIS HTTP Server Port>/stats URI to access these statistics.

<xs:element name="HttpServer" minOccurs="1" maxOccurs="1">
  <xs:complexType>
    <xs:attribute name="Address" type="xs:string" use="required" />
    <xs:attribute name="Port" type="PortType" use="required" />
    <xs:attribute name="Transport" type="HttpServerTransportType" use="optional" default="Tcp" />
    <xs:attribute name="AuthenticationMethod" type="HttpAuthenticationMethodType" use="optional" default="Digest" />
  </xs:complexType>
</xs:element>

Sipis/HttpServer[Address]

This attribute specifies an IPv4 address the HTTP server binds to. Use 0.0.0.0 as a "don't care" value.

Sipis/HttpServer[Port]

This attribute specifies a port number the HTTP server binds to.

Sipis/HttpServer[Transport] (Since 4.4)

This attribute specifies a transport the HTTP server uses for communication. Possible values are Tcp and Tls.

Default value: Tcp.

Sipis/HttpServer[AuthenticationMethod] (Since 3.59)

This attribute specifies authentication method used to restrict access to server statistics. Possible values are None, Basic and Digest.

Default value: Digest.

Sipis/Administrator

This element specifies administrator's credentials required to perform actions via the built-in HTTP server.

Note that some (most) web browsers will cache the entered credentials and will use these cached values whenever a server issues another challenge — in other words, they will not ask the user for the credentials ever again. It is therefore advisable not to leave the administrator's workstation unattended.

<xs:element name="Administrator" minOccurs="1" maxOccurs="1">
  <xs:complexType>
    <xs:attribute name="UserName" type="xs:string" use="required" />
    <xs:attribute name="Password" type="xs:string" use="required" />
  </xs:complexType>
</xs:element>

Sipis/Administrator[UserName]

This attribute specifies administrator's user name.

Sipis/Administrator[Password]

This attribute specifies administrator's password in plain text.

Sipis/Database

This element provides information about the backend PostgreSQL database.

During startup, SIPIS connects to the global database using Sipis/Database[OpenString] and to each configured selector database using its own OpenString. Startup fails if any required database connection cannot be established.

If an established connection is lost, SIPIS reconnects on a background thread. Reconnection continues until the connection is restored or SIPIS is stopped. Subsequent database operations on that connection fail while reconnection is pending. During recovery, a new round starts only after more than four seconds have passed since the previous round began; connection attempts can make the interval longer.

<xs:element name="Database" minOccurs="1" maxOccurs="1">
  <xs:complexType>
    <xs:all>
      <xs:element name="Alternatives" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Alternative" minOccurs="0" maxOccurs="unbounded">
              <xs:complexType>
                <xs:attribute name="OpenString" type="xs:string" use="required" />
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="LoadBalancing" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Database" minOccurs="1" maxOccurs="unbounded">
              <xs:complexType>
                <xs:attribute name="SelectorPrefix" type="xs:string" use="required" />
                <xs:attribute name="OpenString" type="xs:string" use="required" />
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:all>
    <xs:attribute name="OpenString" type="xs:string" use="required" />
  </xs:complexType>
</xs:element>

Sipis/Database[OpenString]

This attribute specifies connection string for the global sipis database. This string is passed directly to the PQconnectdb function.

Sipis/Database/Alternatives/Alternative[OpenString] (Up to 3.59)

This attribute specifies an alternative database connection string which is passed directly to the PQconnectdb function.

Sipis/Database/LoadBalancing/Database[SelectorPrefix] (Since 4.0)

This attribute specifies selector prefix of the selector sipis database. The prefix specification consists of a string of hexadecimal characters followed by slash followed by decimal number specifying the actual number of bits in the prefix. E.g. "A/3" specifies 3-bit binary prefix "101".

Sipis/Database/LoadBalancing/Database[OpenString] (Since 4.0)

This attribute specifies the connection string for a selector database and is passed directly to PQconnectdb.

Sipis/Lock

<xs:element name="Lock" minOccurs="1" maxOccurs="1">
  <xs:complexType>
    <xs:attribute name="FileName" type="xs:string" use="required" />
  </xs:complexType>
</xs:element>

Sipis/Lock[FileName]

This attribute specifies a path and a file name of the lock file which is used to prevent multiple SIPIS binaries running with the same settings on the same machine. For easy identification, the file name should include the server's name as specified in Sipis/Server[Name].

Sipis/Log

This element specifies where SIPIS is supposed to store its diagnostic logs and what to include in them.

<xs:element name="Log" minOccurs="1" maxOccurs="1">
  <xs:complexType>
    <!-- Children follow the declared order. Only Instance may repeat. -->
    <xs:sequence>
      <xs:element name="Filter" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
              <xs:element name="Include" type="LogFilterEntryType" />
              <xs:element name="Exclude" type="LogFilterEntryType" />
            </xs:choice>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="Offences" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:attribute name="Enabled" type="YesNoType" use="optional" default="Yes" />
          <xs:attribute name="FileName" type="NonEmptyStringType" use="required" />
        </xs:complexType>
      </xs:element>
      <xs:element name="Email" minOccurs="0" maxOccurs="1">…</xs:element>
      <xs:element name="Http" minOccurs="0" maxOccurs="1">…</xs:element>
      <xs:element name="Instance" minOccurs="0" maxOccurs="unbounded">…</xs:element>
      <xs:element name="InstancesFile" minOccurs="0" maxOccurs="1">…</xs:element>
    </xs:sequence>
    <xs:attribute name="Level" type="LogLevelType" use="optional" default="Warning" />
    <xs:attribute name="Stdio" type="StdioType" use="optional" default="Stdout" />
    <xs:attribute name="Format" type="LogFormatType" use="optional" default="PlainText" />
    <xs:attribute name="FileName" type="xs:string" use="optional" default="" />
    <xs:attribute name="MaxFileSize" type="NonNegativeIntType" use="optional" default="0" />
    <xs:attribute name="InstanceFormat" type="LogFormatType" use="optional" default="PlainText" />
    <xs:attribute name="InstanceFileName" type="xs:string" use="required" />
    <xs:attribute name="InstanceMaxFileSize" type="NonNegativeIntType" use="optional" default="0" />
    <xs:attribute name="ProblematicInstancesAutomatically" type="YesNoType" use="optional" default="No">
      <!-- This option has no effect since version 3.42 -->
    </xs:attribute>
    <xs:attribute name="TraceCallsAndTextMessages" type="YesNoType" use="optional" default="No" />
  </xs:complexType>
</xs:element>

Sipis/Log[Level] (Since 3.20)

This attribute specifies the verbosity of the diagnostic log. There are three levels defined: Info, Warning and Error.

Default value: Warning.

Sipis/Log[Stdio] (Since 3.20)

This attribute specifies the standard stream to write the diagnostic log to. Supported values are: None, Stdout and Stderr.

Default value: Stdout.

Sipis/Log[Format] (Since 3.55)

This attribute specifies the format of the main diagnostic log. Supported values are: PlainText and Json. The Json format follows the JavaScript Object Notation (JSON) Text Sequences specification (https://tools.ietf.org/html/rfc7464).

Default value: PlainText.

Sipis/Log[FileName] (Required upto 3.19; optional since 3.20)

This attribute specifies a path and a file name of the main log file.

Sipis/Log[MaxFileSize] (Since 4.1)

This attribute specifies maximum allowed size of the main log file. Value of zero means unbounded.

Default value: 0.

Note

In case of non-zero max file size value, log entries are written to the log file in a circular fashion and the format of the log file is as follows. The file begins with 8 hexadecimal characters specifying the actual content_end position. This value, together with the actual file_size, can be used to unwrap the rest of the file if necessary.

Example 1 (no unwrapping needed):

xxxxxxxx|------------------|
|0      |8                 |content_end = file_size

content = file[8..content_end)

Example 2 (unwrapping needed):

xxxxxxxx|------------------|---------------------------|
|0      |8                 |content_end                |file_size

content = file[content_end..file_size) + file[8..content_end)

Sipis/Log[InstanceFormat] (Since 3.55)

This attribute specifies the format of the instance diagnostic log. Supported values are: PlainText and Json. The Json format follows the JavaScript Object Notation (JSON) Text Sequences specification (https://tools.ietf.org/html/rfc7464).

Default value: PlainText.

Sipis/Log[InstanceFileName]

This attribute specifies a path and a file name of an instance specific log file. The path or file name should include the $SELECTOR$ placeholder which will be replaced by the actual instance selector.

Sipis/Log[InstanceMaxFileSize] (Since 4.1)

This attribute specifies maximum allowed size of an instance specific log file. Value of zero means unbounded.

Default value: 0.

Note

In case of non-zero max file size value, see note for Sipis/Log[MaxFileSize].

Sipis/Log[ProblematicInstancesAutomatically] (Up to 3.41)

This attribute specifies whether or not SIPIS should turn instance logging on automatically, when it detects problems with a particular instance.

Note

This attribute has no effect since version 3.42.

Sipis/Log[TraceCallsAndTextMessages] (Since 4.7)

This attribute enables call and text-message tracing for all instances, including SIP request/response summaries for INVITE, CANCEL, BYE and MESSAGE, and call/message lifecycle events. Trace entries include the SIP Call-ID so related events can be correlated. Trace entries are generated independently of Log[Level] and whether per-instance logging is enabled. Log/Filter still applies to their inclusion in the main log.

Default value: No.

Sipis/Log/Filter (Since 4.6)

This element specifies sequence of tests all logging events pass through. These tests are performed in the same order as specified here. Each successful test overwrites a boolean variable with either true (Include rule) or false (Exclude rule) value. The starting value of this variable is true and its final value determines whether an event should be included in the main log.

Sipis/Log/Filter/Include and Sipis/Log/Filter/Exclude

These elements define the result of a single test performed by the logging event filter. The test succeeds when all the specified attributes match.

<xs:complexType name="LogFilterEntryType">
  <xs:attribute name="Severity" use="optional" default="*">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:enumeration value="*" />
        <xs:enumeration value="Debug" />
        <xs:enumeration value="Info" />
        <xs:enumeration value="Warning" />
        <xs:enumeration value="Error" />
        <xs:enumeration value="Bug" />
      </xs:restriction>
    </xs:simpleType>
  </xs:attribute>
  <xs:attribute name="Source" type="xs:string" use="optional" default="*" />
  <xs:attribute name="Field" use="optional" default="Message">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:enumeration value="Message" />
        <xs:enumeration value="Detail" />
        <xs:enumeration value="Data" />
      </xs:restriction>
    </xs:simpleType>
  </xs:attribute>
  <xs:attribute name="DetailName" type="xs:string" use="optional" />
  <xs:attribute name="StartsWith" type="xs:string" use="optional" />
  <xs:attribute name="Contains" type="xs:string" use="optional" />
  <xs:attribute name="EndsWith" type="xs:string" use="optional" />
  <xs:attribute name="Equal" type="xs:string" use="optional" />
  <xs:attribute name="NotEqual" type="xs:string" use="optional" />
  <xs:attribute name="Enabled" type="YesNoType" use="required" />
</xs:complexType>

Sipis/Log/Filter/Include[Severity] and Sipis/Log/Filter/Exclude[Severity]

This attribute matches the logging event's severity. Possible values are Debug, Info, Warning, Error, Bug or *.

Sipis/Log/Filter/Include[Source] and Sipis/Log/Filter/Exclude[Source]

This attribute matches the logging event's source. The matching is case insensitive.

Sipis/Log/Filter/Include[Field] and Sipis/Log/Filter/Exclude[Field]

This attribute selects the logging event's field for subsequent matching.

Sipis/Log/Filter/Include[DetailName] and Sipis/Log/Filter/Exclude[DetailName]

This attribute selects the particular logging event's detail (if Field='Detail') for subsequent matching.

Sipis/Log/Filter/Include[StartsWith] and Sipis/Log/Filter/Exclude[StartsWith]

This attribute matches if the selected logging event field starts with the specified string. The matching is case insensitive.

Sipis/Log/Filter/Include[Contains] and Sipis/Log/Filter/Exclude[Contains]

This attribute matches if the selected logging event field contains the specified string. The matching is case insensitive.

Sipis/Log/Filter/Include[EndsWith] and Sipis/Log/Filter/Exclude[EndsWith]

This attribute matches if the selected logging event field ends with the specified string. The matching is case insensitive.

Sipis/Log/Filter/Include[Equal] and Sipis/Log/Filter/Exclude[Equal]

This attribute matches if the selected logging event field is equal to the specified string. The matching is case insensitive.

Sipis/Log/Filter/Include[NotEqual] and Sipis/Log/Filter/Exclude[NotEqual]

This attribute matches if the selected logging event field is not equal to the specified string. The matching is case insensitive.

Sipis/Log/Filter/Include[Enabled] and Sipis/Log/Filter/Exclude[Enabled]

This attribute specifies whether or not this rule is skipped during the filtering process.

Sipis/Log/Offences (Since 4.11)

This element configures a dedicated peer offence log for consumption by fail2ban. If this element is omitted, SIPIS does not write a dedicated offence log.

<xs:element name="Offences" minOccurs="0" maxOccurs="1">
  <xs:complexType>
    <xs:attribute name="Enabled" type="YesNoType" use="optional" default="Yes" />
    <xs:attribute name="FileName" type="NonEmptyStringType" use="required" />
  </xs:complexType>
</xs:element>

This file is independent of Sipis/Log[Level], Sipis/Log/Filter, the main log format and the main log size limit.

Each record occupies one line:

<UTC timestamp> sipis[<ServerName>] offence remote=<IP> kind=<Kind> [remote_port=<port>] [local=<IP>] [local_port=<port>] [detail=<token>]

SIPIS appends to an existing file and does not use circular logging for offences. Rotate this file externally. The bundled logrotate configuration covers /var/log/sipis/sipis*.log; adjust rotation rules for other paths. A settings reload reopens the offence log along with the main log. If the file cannot be opened or reopened, SIPIS reports an error and continues without the dedicated offence log.

Sipis/Log/Offences[Enabled]

This attribute enables writing the dedicated offence log when a file name is configured.

Default value: Yes.

Sipis/Log/Offences[FileName]

This attribute specifies the required, nonempty path and file name of the dedicated offence log, for example /var/log/sipis/sipis_offences.log. Use a separate path for each SIPIS process.

Sipis/Log/Email

SIPIS is able to send e-mails supplying an administrator with a periodically generated summary information about its logging activity or notifying an administrator about predetermined logging events.

<xs:element name="Email" minOccurs="0" maxOccurs="1">
  <xs:complexType>
    <xs:all>
      <xs:element name="Summary" minOccurs="0" maxOccurs="1">…</xs:element>
      <xs:element name="Excerpt" minOccurs="0" maxOccurs="1">…</xs:element>
    </xs:all>
    <xs:attribute name="To" type="xs:string" use="required" />
    <xs:attribute name="From" type="xs:string" use="required" />
  </xs:complexType>
</xs:element>

Sipis/Log/Email[To]

This attribute specifies an e-mail address SIPIS sends its e-mails to.

Sipis/Log/Email[From]

This attribute specifies an e-mail address SIPIS places in the From header field of its e-mail messages.

Sipis/Log/Email/Summary

This element specifies information about periodic summary e-mails.

<xs:element name="Summary" minOccurs="0" maxOccurs="1">
  <xs:complexType>
    <xs:all>
      <xs:element name="Period" type="DurationType" minOccurs="1" maxOccurs="1" />
      <xs:element name="StartingAt" type="DayTimeType" minOccurs="1" maxOccurs="1" />
    </xs:all>
    <xs:attribute name="Enabled" type="YesNoType" use="required" />
  </xs:complexType>
</xs:element>

Sipis/Log/Email/Summary[Enabled]

This attribute specifies whether or not SIPIS generates periodic summary e-mails.

Sipis/Log/Email/Summary/Period[Days, Hours, Minutes, Seconds, Milliseconds]

These attributes specify a period with which SIPIS generates summary e-mails. Values in all specified attributes accumulate.

SIPIS rounds the combined duration up to whole seconds.

Sipis/Log/Email/Summary/StartingAt[Hour, Minute, Second, Millisecond]

These attributes specify at which time of day the period begins. Hour is required; omitted Minute, Second and Millisecond values are zero. Fractional seconds are rounded up to the next whole second, capped at 23:59:59.

Sipis/Log/Email/Excerpt

This element specifies information about specific logging events an administrator is interested in. SIPIS includes log excerpts of these events inside the generated e-mails.

<xs:element name="Excerpt" minOccurs="0" maxOccurs="1">
  <xs:complexType>
    <xs:all>
      <xs:element name="MinPeriod" type="DurationType" minOccurs="1" maxOccurs="1" />
      <xs:element name="MaxSize" type="ByteSizeType" minOccurs="0" maxOccurs="1" />
      <xs:element name="Filter" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
              <xs:element name="Include" type="LogFilterEntryType" />
              <xs:element name="Exclude" type="LogFilterEntryType" />
            </xs:choice>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:all>
    <xs:attribute name="Enabled" type="YesNoType" use="required" />
  </xs:complexType>
</xs:element>

Sipis/Log/Email/Excerpt[Enabled]

This attribute specifies whether or not SIPIS pays attention to particular logging events.

Sipis/Log/Email/Excerpt/MinPeriod[Days, Hours, Minutes, Seconds, Milliseconds]

These attributes specify the minimal period with which SIPIS will send notification e-mails. This period starts automatically whenever a logging event passes the filter for the first time after the previous notification e-mail was sent. Additional desired logging events are accumulated to be sent at once at the end of this period.

SIPIS rounds the combined duration up to whole seconds.

Sipis/Log/Email/Excerpt/MaxSize[MegaBytes, KiloBytes, Bytes]

These attributes specify the maximal size of the generated e-mail message. Values in all specified attributes accumulate.

SIPIS never generates notification e-mail larger than this specified maximum size, truncating the log excerpt if necessary.

Sipis/Log/Email/Excerpt/Filter

This element specifies sequence of tests all logging events pass through. These tests are performed in the same order as specified here. Each successful test overwrites a boolean variable with either true (Include rule) or false (Exclude rule) value. The starting value of this variable is true and its final value determines whether an event should be included in the log excerpt.

Sipis/Log/Email/Excerpt/Filter/Include and Sipis/Log/Email/Excerpt/Filter/Exclude

These elements define the result of a single test performed by the logging event filter. The test succeeds when all the specified attributes match.

<xs:complexType name="LogFilterEntryType">
  <xs:attribute name="Severity" use="optional" default="*">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:enumeration value="*" />
        <xs:enumeration value="Debug" />
        <xs:enumeration value="Info" />
        <xs:enumeration value="Warning" />
        <xs:enumeration value="Error" />
        <xs:enumeration value="Bug" />
      </xs:restriction>
    </xs:simpleType>
  </xs:attribute>
  <xs:attribute name="Source" type="xs:string" use="optional" default="*" />
  <xs:attribute name="Field" use="optional" default="Message">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:enumeration value="Message" />
        <xs:enumeration value="Detail" />
        <xs:enumeration value="Data" />
      </xs:restriction>
    </xs:simpleType>
  </xs:attribute>
  <xs:attribute name="DetailName" type="xs:string" use="optional" />
  <xs:attribute name="StartsWith" type="xs:string" use="optional" />
  <xs:attribute name="Contains" type="xs:string" use="optional" />
  <xs:attribute name="EndsWith" type="xs:string" use="optional" />
  <xs:attribute name="Equal" type="xs:string" use="optional" />
  <xs:attribute name="NotEqual" type="xs:string" use="optional" />
  <xs:attribute name="Enabled" type="YesNoType" use="required" />
</xs:complexType>

Sipis/Log/Email/Excerpt/Filter/Include[Severity] and Sipis/Log/Email/Excerpt/Filter/Exclude[Severity]

This attribute matches the logging event's severity. Possible values are Debug, Info, Warning, Error, Bug or *.

Sipis/Log/Email/Excerpt/Filter/Include[Source] and Sipis/Log/Email/Excerpt/Filter/Exclude[Source]

This attribute matches the logging event's source. The matching is case insensitive.

Sipis/Log/Email/Excerpt/Filter/Include[Field] and Sipis/Log/Email/Excerpt/Filter/Exclude[Field] (Since 3.29)

This attribute selects the logging event's field for subsequent matching.

Sipis/Log/Email/Excerpt/Filter/Include[DetailName] and Sipis/Log/Email/Excerpt/Filter/Exclude[DetailName] (Since 3.29)

This attribute selects the particular logging event's detail (if Field='Detail') for subsequent matching.

Sipis/Log/Email/Excerpt/Filter/Include[StartsWith] and Sipis/Log/Email/Excerpt/Filter/Exclude[StartsWith]

This attribute matches if the selected logging event field starts with the specified string. The matching is case insensitive.

Sipis/Log/Email/Excerpt/Filter/Include[Contains] and Sipis/Log/Email/Excerpt/Filter/Exclude[Contains]

This attribute matches if the selected logging event field contains the specified string. The matching is case insensitive.

Sipis/Log/Email/Excerpt/Filter/Include[EndsWith] and Sipis/Log/Email/Excerpt/Filter/Exclude[EndsWith]

This attribute matches if the selected logging event field ends with the specified string. The matching is case insensitive.

Sipis/Log/Email/Excerpt/Filter/Include[Equal] and Sipis/Log/Email/Excerpt/Filter/Exclude[Equal]

This attribute matches if the selected logging event field is equal to the specified string. The matching is case insensitive.

Sipis/Log/Email/Excerpt/Filter/Include[NotEqual] and Sipis/Log/Email/Excerpt/Filter/Exclude[NotEqual]

This attribute matches if the selected logging event field is not equal to the specified string. The matching is case insensitive.

Sipis/Log/Email/Excerpt/Filter/Include[Enabled] and Sipis/Log/Email/Excerpt/Filter/Exclude[Enabled]

This attribute specifies whether or not this rule is skipped during the filtering process.

Sipis/Log/Http

<xs:element name="Http" minOccurs="0" maxOccurs="1">
  <xs:complexType>
    <xs:all>
      <xs:element name="Filter" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
              <xs:element name="Include" type="LogHttpFilterEntryType" />
              <xs:element name="Exclude" type="LogHttpFilterEntryType" />
            </xs:choice>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:all>
    <xs:attribute name="RequestBody" type="YesNoType" use="optional" default="No" />
  </xs:complexType>
</xs:element>

Sipis/Log/Http[RequestBody]

This attribute specifies whether SIPIS should log HTTP request bodies.

Sipis/Log/Http/Filter

This element specifies sequence of tests all HTTP requests pass through. These tests are performed in the same order as specified here. Each successful test overwrites a boolean variable with either true (Include rule) or false (Exclude rule) value. The starting value of this variable is true and its final value determines whether an HTTP request should be written into the log.

Sipis/Log/Http/Filter/Include and Sipis/Log/Http/Filter/Exclude

These elements define the result of a single test performed by the HTTP request filter. The test succeeds when all the specified attributes match.

<xs:complexType name="LogHttpFilterEntryType">
  <!-- An optional Uri comes first, followed by any number of Header elements. -->
  <xs:sequence>
    <xs:element name="Uri" minOccurs="0" maxOccurs="1">
      <xs:complexType>
        <xs:attribute name="StartsWith" type="xs:string" use="optional" />
        <xs:attribute name="Contains" type="xs:string" use="optional" />
        <xs:attribute name="EndsWith" type="xs:string" use="optional" />
        <xs:attribute name="Equal" type="xs:string" use="optional" />
        <xs:attribute name="NotEqual" type="xs:string" use="optional" />
      </xs:complexType>
    </xs:element>
    <xs:group ref="LogHttpHeader" minOccurs="0" maxOccurs="unbounded" />
  </xs:sequence>
  <xs:attribute name="Method" use="optional" default="*" />
  <xs:attribute name="Response" use="optional" default="*" />
  <xs:attribute name="Enabled" type="YesNoType" use="required" />
</xs:complexType>

Sipis/Log/Http/Filter/Include[Method] and Sipis/Log/Http/Filter/Exclude[Method]

This attribute matches the HTTP request method. The matching is case insensitive. Possible values are GET, POST or *.

Sipis/Log/Http/Filter/Include[Response] and Sipis/Log/Http/Filter/Exclude[Response]

This attribute matches the HTTP response code.

Sipis/Log/Http/Filter/Include[Enabled] and Sipis/Log/Http/Filter/Exclude[Enabled]

This attribute specifies whether or not this rule is skipped during the filtering process.

Sipis/Log/Http/Filter/Include/Header[Name] and Sipis/Log/Http/Filter/Exclude/Header[Name]

This attribute specifies the HTTP request header name whose value is to be tested.

Sipis/Log/Http/Filter/Include/Uri[StartsWith], Sipis/Log/Http/Filter/Exclude/Uri[StartsWith], Sipis/Log/Http/Filter/Include/Header[StartsWith] and Sipis/Log/Http/Filter/Exclude/Header[StartsWith]

This attribute matches if the HTTP request uri or a particular header value starts with the specified string. The matching is case insensitive.

Sipis/Log/Http/Filter/Include/Uri[Contains], Sipis/Log/Http/Filter/Exclude/Uri[Contains], Sipis/Log/Http/Filter/Include/Header[Contains] and Sipis/Log/Http/Filter/Exclude/Header[Contains]

This attribute matches if the HTTP request uri or a particular header value contains the specified string. The matching is case insensitive.

Sipis/Log/Http/Filter/Include/Uri[EndsWith], Sipis/Log/Http/Filter/Exclude/Uri[EndsWith], Sipis/Log/Http/Filter/Include/Header[EndsWith] and Sipis/Log/Http/Filter/Exclude/Header[EndsWith]

This attribute matches if the HTTP request uri or a particular header value ends with the specified string. The matching is case insensitive.

Sipis/Log/Http/Filter/Include/Uri[Equal], Sipis/Log/Http/Filter/Exclude/Uri[Equal], Sipis/Log/Http/Filter/Include/Header[Equal] and Sipis/Log/Http/Filter/Exclude/Header[Equal]

This attribute matches if the HTTP request uri or a particular header value is equal to the specified string. The matching is case insensitive.

Sipis/Log/Http/Filter/Include/Uri[NotEqual], Sipis/Log/Http/Filter/Exclude/Uri[NotEqual], Sipis/Log/Http/Filter/Include/Header[NotEqual] and Sipis/Log/Http/Filter/Exclude/Header[NotEqual]

This attribute matches if the HTTP request uri or a particular header value is not equal to the specified string. The matching is case insensitive.

Sipis/Log/Instance

This element allows you to turn logging on for a specific instance based on its selector.

<xs:element name="Instance" minOccurs="0" maxOccurs="unbounded">
  <xs:complexType>
    <xs:sequence>
      <xs:choice minOccurs="1" maxOccurs="1">
        <xs:element name="DeleteOn" type="DateType" />
        <xs:element name="StopOn" type="DateType" />
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="Selector" type="xs:string" use="required" />
  </xs:complexType>
</xs:element>

Sipis/Log/Instance[Selector]

This attribute selects an instance by its full selector, or by the part before the first colon to select all instances sharing that part. A single * selects all instances. Other wildcard patterns are not supported. Selector comparisons are case insensitive.

SIPIS checks instance-log selections in the following order and uses the first entry found:

  1. Full selector in the main configuration.
  2. Full selector in the external file.
  3. Part before the first colon in the main configuration.
  4. Part before the first colon in the external file.
  5. * in the main configuration.
  6. * in the external file.

An expired entry still takes precedence; SIPIS does not try later entries. If a selector is repeated within one file, the last entry wins.

Sipis/Log/Instance/DeleteOn[Year, Month, Day], Sipis/Log/Instance/StopOn[Year, Month, Day] (Since 3.42)

This element specifies a date on which sipis shall stop logging activity for the specified instance. In case the DeleteOn element is used, sipis will also delete the corresponding instance log file.

Sipis/Log/InstancesFile (Since 4.1)

This element instructs SIPIS to load instance-log selections from a separate XML file, allowing those selections to be changed without editing the main configuration. The external file must have a Sipis root. Place selections in its Log section using Instance entries in the format described above. For example:

<Sipis>
  <Log>
    <Instance Selector="0123456789ABCDEF0123456789ABCDEF01234567">
      <StopOn Year="2099" Month="1" Day="1" />
    </Instance>
  </Log>
</Sipis>

Each successful load replaces the previous external selection list; selections in the main configuration remain in place. An absent or empty Log section clears the external selections. File-read or XML-parsing errors are logged and leave the previously loaded selections in place.

Sipis/Log/InstancesFile[FileName]

This attribute specifies the external XML file. For example, the main configuration can contain:
<InstancesFile FileName="/etc/sipis/LogInstances.xml" ReloadAutomatically="Yes" />

Sipis/Log/InstancesFile[ReloadAutomatically]

This attribute enables reloading the file when its modification time changes, as checked during normal server operation. SIPIS attempts an initial load even when this attribute is No. Reloading the main settings also loads the file again.

Default value: Yes.

Sipis/NotificationServers

This element provides information about all Push Notification Mediator servers that are available to process push notifications generated by SIPIS.

<xs:element name="NotificationServers" minOccurs="1" maxOccurs="1">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="NotificationServer" minOccurs="1" maxOccurs="unbounded">
        <xs:complexType>
          <xs:all>
            <xs:element name="Alternatives" minOccurs="0" maxOccurs="1">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="Alternative" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                      <xs:attribute name="Host" type="xs:string" use="required" />
                      <xs:attribute name="Port" type="PortType" use="required" />
                      <xs:attribute name="RequiresTls" type="YesNoType" use="optional">
                        <!-- The default value is taken from the parent (primary) NotificationServer[RequiresTls]. -->
                      </xs:attribute>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:all>
          <xs:attribute name="Name" type="xs:string" use="required" />
          <xs:attribute name="Host" type="xs:string" use="required" />
          <xs:attribute name="Port" type="PortType" use="required" />
          <xs:attribute name="Premium" type="YesNoType" use="optional" default="No" />
          <xs:attribute name="RequiresTls" type="YesNoType" use="optional" default="No" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Sipis/NotificationServers/NotificationServer[Name]

Each notification server must be assigned a unique name. Moreover, this name must be known to softphone. Note this attribute is also known as AppId.

Sipis/NotificationServers/NotificationServer[Host]

This attribute specifies a host address of the notification server. It can be FQDN.

Sipis/NotificationServers/NotificationServer/Alternatives/Alternative[Host]

This attribute specifies an alternative host address of the notification server. It can be FQDN.

Sipis/NotificationServers/NotificationServer[Port]

This attribute specifies a port number the notification server listens on.

Sipis/NotificationServers/NotificationServer/Alternatives/Alternative[Port]

This attribute specifies a port number the alternative notification server listens on.

Sipis/NotificationServers/NotificationServer[RequiresTls]

This attribute specifies whether SIPIS must use TLS to communicate with this notification server.

Sipis/NotificationServers/NotificationServer/Alternatives/Alternative[RequiresTls]

This attribute specifies whether SIPIS must use TLS to communicate with the alternative notification server. This attribute is optional for the alternative servers — when missing the value from the primary server is assumed.

Sipis/NotificationServers/NotificationServer[Premium]

This attribute specifies whether instances using this notification server should be treated as premium.

Sipis/AllowedAppIds (Since 4.5)

This element provides information about applications whose requests will be allowed by SIPIS. If this section specifies one or more application ids, all other application ids will be ignored. If an application id is listed in both Sipis/AllowedAppIds and Sipis/IgnoredAppIds, it will be ignored.

<xs:element name="AllowedAppIds" minOccurs="0" maxOccurs="1">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="AppId" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:attribute name="Name" type="xs:string" use="required" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Sipis/AllowedAppIds/AppId[Name]

This attribute specifies allowed application identifier (AppId).

Sipis/IgnoredAppIds (Since 3.20)

This element provides information about applications whose requests will be ignored by SIPIS. If an application id is listed in both Sipis/AllowedAppIds and Sipis/IgnoredAppIds, it will be ignored.

<xs:element name="IgnoredAppIds" minOccurs="0" maxOccurs="1">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="AppId" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:attribute name="Name" type="xs:string" use="required" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Sipis/IgnoredAppIds/AppId[Name]

This attribute specifies banned application identifier (AppId).

Sipis/TlsClientCertificates

This element provides information about all installed client certificates used for TLS negotiation.

<xs:element name="TlsClientCertificates" minOccurs="0" maxOccurs="1">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Certificate" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:attribute name="Host" type="xs:string" use="required" />
          <xs:attribute name="FileName" type="xs:string" use="required" />
          <xs:attribute name="RsaPrivateKeyFileName" type="xs:string" use="required" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Sipis/TlsClientCertificates/Certificate[Host]

This attribute specifies FQDN of a server this certificate is intended for.

Sipis/TlsClientCertificates/Certificate[FileName]

This attribute specifies a path and a file name of a DER[+PEM] encoded X.509 certificate.

Sipis/TlsClientCertificates/Certificate[RsaPrivateKeyFileName]

This attribute specifies a path and a file name of a DER[+PEM] encoded RSA private key corresponding to this certificate.

Sipis/TlsServerOptions (Since 4.1)

This element provides information about TLS server parameters.

Note

This element is required if either Sipis/Server[Transport]="Tls" or Sipis/HttpServer[Transport]="Tls". Both listeners use these options. Whenever this element is present, SIPIS requires a usable certificate and private key for every configured host, even if both listeners use TCP.

Configure certificates and private keys through the file-based Certificate and PrivateKey entries below. Use the same Host value on the two entries belonging to a pair; both may point to the same combined PEM file. For schema validation, child elements must appear in this order: CipherSuites, Groups, EllipticCurves, SignatureSchemes, Certificate, then PrivateKey. The lists use whitespace-separated identifiers. Use the spellings listed in the complete schema; the server also accepts case variations.

<xs:element name="TlsServerOptions" minOccurs="0" maxOccurs="1">
  <xs:complexType>
    <xs:sequence>
      <!-- Lists use the declared order and must be nonempty when present.
           Groups takes precedence over the legacy EllipticCurves element. -->
      <xs:element name="CipherSuites" type="TlsCipherSuiteListType" minOccurs="0" maxOccurs="1" />
      <xs:element name="Groups" type="TlsGroupListType" minOccurs="0" maxOccurs="1" />
      <xs:element name="EllipticCurves" type="TlsGroupListType" minOccurs="0" maxOccurs="1" />
      <xs:element name="SignatureSchemes" type="TlsSignatureSchemeListType" minOccurs="0" maxOccurs="1" />
      <xs:element name="Certificate" minOccurs="1" maxOccurs="unbounded">
        <xs:complexType>
          <xs:attribute name="Host" type="xs:string" use="optional" default="*" />
          <xs:attribute name="FileName" type="xs:string" use="required" />
        </xs:complexType>
      </xs:element>
      <xs:element name="PrivateKey" minOccurs="1" maxOccurs="unbounded">
        <xs:complexType>
          <xs:attribute name="Host" type="xs:string" use="optional" default="*" />
          <xs:attribute name="FileName" type="xs:string" use="required" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="MinVersion" type="xs:string" use="optional" default="1.2" />
    <xs:attribute name="MaxVersion" type="xs:string" use="optional" default="1.3" />
    <xs:attribute name="MinRsaModulusSizeInBits" type="PositiveIntType" use="optional" default="2048" />
    <xs:attribute name="MinDhModulusSizeInBits" type="PositiveIntType" use="optional" default="2048" />
    <xs:attribute name="MaxTimeToWaitForClientResponseInMilliSeconds" type="PositiveIntType" use="optional" default="15000" />
  </xs:complexType>
</xs:element>

Sipis/TlsServerOptions[MinVersion, MaxVersion]

These attributes specify the range of acceptable TLS versions. Possible values are 1.0, 1.1, 1.2 and 1.3.

Default values: MinVersion="1.2", MaxVersion="1.3" (Since 4.8).

Default values: MinVersion="1.2", MaxVersion="1.2" (Until 4.7).

Sipis/TlsServerOptions[MinRsaModulusSizeInBits, MinDhModulusSizeInBits]

These attributes specify minimum acceptable modulus size for RSA and Diffie-Hellman calculations, in bits.

Default values: 2048 for both attributes (Since 4.8).

Default values: 1024 for both attributes (Until 4.7).

Sipis/TlsServerOptions[MaxTimeToWaitForClientResponseInMilliSeconds]

This attribute specifies the maximum wait for a client handshake response, in milliseconds. Allowed values are positive integers from 1 to 2147483647.

Default value: 15000 milliseconds.

Sipis/TlsServerOptions/CipherSuites

This element specifies a nonempty, whitespace-separated list of TLS cipher-suite identifiers. For accepted spellings, see TlsCipherSuiteType in the complete schema below.

For TLS 1.3, include at least one TLS 1.2 ECDHE AES-GCM suite, such as TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 or TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384. For the time being, SIPIS always derives the TLS 1.3 cipher suites automatically from the configured TLS 1.2 equivalents.

A TLS listener requires this list.

Default value: no cipher suites.

Sipis/TlsServerOptions/Groups (Since 4.9)

This element specifies a nonempty, whitespace-separated list of key-exchange group identifiers. See TlsGroupType in the complete schema for accepted spellings, including elliptic curves and the mlkem512, mlkem768 and mlkem1024 groups.

Groups takes precedence over EllipticCurves when both are present. An ECDHE cipher suite requires an elliptic-curve group. TLS 1.3 also requires a suitable group: secp256r1, secp384r1, secp521r1, a listed Brainpool group, or a listed ML-KEM group. The server checks these combinations when starting a TLS connection; schema validation does not check them.

Supply Groups or the legacy EllipticCurves list when the selected cipher suites require them.

Default value: no groups.

Sipis/TlsServerOptions/EllipticCurves

Legacy spelling of Groups. The server parses the same identifiers and uses this list only when Groups is absent. If present, the list must be nonempty.

Default value: no groups.

Sipis/TlsServerOptions/SignatureSchemes (Since 4.9)

This element specifies a nonempty, whitespace-separated list of supported signature-scheme identifiers. See TlsSignatureSchemeType in the complete schema for the supported schemes and their spellings. Negotiation also depends on the TLS version and the certificate and private key types.

Default value: all supported signature schemes.

Sipis/TlsServerOptions/Certificate[Host] and Sipis/TlsServerOptions/PrivateKey[Host]

These attributes identify the certificate and private key for the Server Name Indication (SNI) host name. Use the same Host on the corresponding Certificate and PrivateKey entries. Exact names, names with a leading *. wildcard and the catch-all * are supported.

Default values: * for both attributes.

Sipis/TlsServerOptions/Certificate[FileName]

This attribute specifies a path and a file name of a PEM-encoded X.509 certificate or certificate chain. Raw DER files are not decoded by this file-import path.

Sipis/TlsServerOptions/PrivateKey[FileName]

This attribute specifies a path and a file name of the corresponding PEM-encoded private key. It may be stored in the same PEM file as the certificate.

Sipis/TrustedCertificates

This element provides information about trusted certificates. These are primarily used for verifying TLS server certificates.

Note

This element is optional; when absent, SIPIS doesn't verify TLS server certificates.

<xs:element name="TrustedCertificates" minOccurs="0" maxOccurs="1">
  <xs:complexType>
    <xs:attribute name="FileName" type="xs:string" use="required" />
  </xs:complexType>
</xs:element>

Sipis/TrustedCertificates[FileName]

This attribute specifies a path and a file name of a bundle of PEM encoded X.509 certificates. Individual certificates are expected to be delimited by
-----BEGIN CERTIFICATE-----
    â‹®
-----END CERTIFICATE-----

Sipis/Instance

<xs:element name="Instance" minOccurs="1" maxOccurs="1">
  <xs:complexType>
    <xs:all>
      <xs:element name="MaxAge" type="DurationType" minOccurs="1" maxOccurs="1" />
      <xs:element name="PremiumMaxAge" type="DurationType" minOccurs="1" maxOccurs="1" />
      <xs:element name="NotRegisteredMaxAge" type="DurationType" minOccurs="0" maxOccurs="1" />
      <xs:element name="InitialErrorRecoveryMinDelay" type="DurationType" minOccurs="0" maxOccurs="1" />
      <xs:element name="InitialErrorRecoveryMaxDelay" type="DurationType" minOccurs="0" maxOccurs="1" />
      <xs:element name="ErrorRecoveryDelay" type="DurationType" minOccurs="0" maxOccurs="1" />
      <xs:element name="ErrorRecoveryMaxDelay" type="DurationType" minOccurs="0" maxOccurs="1" />
      <xs:element name="UnauthorizedRecoveryDelay" type="DurationType" minOccurs="0" maxOccurs="1" />
      <xs:element name="UnauthorizedRecoveryMaxDelay" type="DurationType" minOccurs="0" maxOccurs="1" />
      <xs:element name="AboutToExpireIn" minOccurs="1" maxOccurs="1">…</xs:element>
      <xs:element name="AboutToExpirePeriod" minOccurs="0" maxOccurs="1">…</xs:element>
      <xs:element name="NotifyBannedPeriod" type="DurationType" minOccurs="0" maxOccurs="1" />
      <xs:element name="KeepAlivePackets" minOccurs="0" maxOccurs="1">…</xs:element>
      <xs:element name="MaxSipClientTransactionsPerTenMinutes" type="SipTransactionLimitsType" minOccurs="0" maxOccurs="1" />
      <xs:element name="MaxSipServerTransactionsPerTenMinutes" type="SipTransactionLimitsType" minOccurs="0" maxOccurs="1" />
    </xs:all>
    <xs:attribute name="UserAgent" type="xs:string" use="optional" />
    <xs:attribute name="EnableToHeaderMismatch" type="YesNoType" use="optional">
      <!-- When omitted, the user's setting is used. -->
    </xs:attribute>
    <xs:attribute name="AllowSipProxiesWithPrivateIpAddresses" type="YesNoType" use="optional" default="Yes" />
    <xs:attribute name="EnableDnsAaaa" type="YesNoType" use="optional">
      <!-- When omitted, the user's setting is used. -->
    </xs:attribute>
    <xs:attribute name="EnableDelayedReleaseOfUdpSockets" type="YesNoType" use="optional" default="Yes" />
    <xs:attribute name="KeepOnlyTheMostRecentDeviceToken" type="YesNoType" use="optional" default="No" />
    <xs:attribute name="LocalAddress" type="xs:string" use="optional" default="" />
    <xs:attribute name="LocalIpv4Address" type="xs:string" use="optional" default="" />
    <xs:attribute name="LocalIpv6Address" type="xs:string" use="optional" default="" />
    <xs:attribute name="MaxSubsequentUnauthorizedCount" type="PositiveIntType" use="optional" default="12" />
    <xs:attribute name="MaxMissedCallCount" type="PositiveIntType" use="optional" default="100" />
    <xs:attribute name="MinExpiresInSeconds" type="PositiveIntType" use="optional" default="600" />
  </xs:complexType>
</xs:element>

Sipis/Instance[UserAgent]

This attribute specifies the string used by SIPIS to populate the SIP User-Agent header.

Default value: "Acrobits SIPIS (www.acrobits.net)".

Sipis/Instance[EnableToHeaderMismatch]

This attribute overrides the user's "enable To header mismatch" setting.

Default value: the user's setting, supplied by the client during registration.

Sipis/Instance[AllowSipProxiesWithPrivateIpAddresses] (Since 3.33)

This attribute specifies whether SIPIS should accept instances whose SIP proxy setting contain private IP address.

Default value: Yes.

Note

Older versions of SIPIS don't accept instances whose SIP proxy setting contain private IP address.

Sipis/Instance[EnableDnsAaaa] (Since 3.43)

This attribute overrides the user's setting for discovering IPv6 addresses of SIP proxies. If omitted, SIPIS uses the user's setting supplied by the client; it defaults to No when the client does not supply it. Explicit Yes enables AAAA discovery; explicit No disables it, even if the client requested it.

Default value: inherit the user's setting (Since 3.45).

Default value: No (Until 3.44).

Sipis/Instance[EnableDelayedReleaseOfUdpSockets] (Since 4.6)

By default, SIPIS will keep released UDP sockets used for SIP traffic in a "mortuary" for a period of time twice as large as the last associated SIP registration period. This mechanism reduces the probability of port reuse collisions where an incoming call gets misrouted to unintended SIPIS instance. This attribute allows the administrator to revert the default behavior and make SIPIS release UDP sockets immediately.

Sipis/Instance[KeepOnlyTheMostRecentDeviceToken] (Since 3.49)

When set to Yes, SIP client instances will store only the most recently received device token and as a consequence will send push notifications only to the single device which communicated with SIPIS most recently.

Sipis/Instance[LocalAddress] (Since 3.53, Deprecated since 4.3)

This attribute allows the administrator to specify IP address of a local interface to be used for SIP traffic.

Sipis/Instance[LocalIpv4Address, LocalIpv6Address] (Since 4.3)

These attributes allow the administrator to specify IPv4 and IPv6 addresses of a local interface to be used for SIP traffic. These attributes should be used instead of the Sipis/Instance[LocalAddress] attribute.

Sipis/Instance[MaxSubsequentUnauthorizedCount] (Since 3.54)

This attribute specifies the maximum allowed number of subsequent registration attempts resulting in "unauthorized" response from the SIP backend. When this number is reached, SIPIS will automatically turn the SIP client instance off.

Default value: 12.

Sipis/Instance[MaxMissedCallCount] (Since 4.1)

This attribute specifies the maximum number of unreported missed calls SIPIS will keep track of. When this number is reached, SIPIS will start discarding records about the oldest missed calls.

Default value: 100.

Sipis/Instance[MinExpiresInSeconds] (Since 4.6)

This attribute specifies the minimum SIP registration expiration period. The larger of this value and the application suggested expiration period will be used in SIP registration requests issued by SIPIS.

Default value: 600.

Sipis/Instance/MaxAge[Days, Hours, Minutes, Seconds, Milliseconds]

These attributes specify a period of softphone's inactivity after which SIPIS will turn the corresponding SIP client instance off. Values in all specified attributes accumulate.

SIPIS rounds the combined duration up to whole seconds.

Debian package default: 30 days.

Sipis/Instance/PremiumMaxAge[Days, Hours, Minutes, Seconds, Milliseconds]

These attributes specify a period of softphone's inactivity for premium instances after which SIPIS will turn the corresponding SIP client instance off. Values in all specified attributes accumulate.

SIPIS rounds the combined duration up to whole seconds.

Debian package default: 30 days.

Sipis/Instance/NotRegisteredMaxAge[Days, Hours, Minutes, Seconds, Milliseconds]

This setting is not usable as a cleanup limit. Use MaxAge, or PremiumMaxAge for premium instances, instead.

SIPIS rounds the combined duration up to whole seconds.

Debian package default: 12 hours.

Sipis/Instance/InitialErrorRecoveryMinDelay[Days, Hours, Minutes, Seconds, Milliseconds] and Sipis/Instance/InitialErrorRecoveryMaxDelay[Days, Hours, Minutes, Seconds, Milliseconds] (Since 4.7)

These durations specify the range from which SIPIS chooses a random delay before the first recovery attempt after a registration error. The minimum must not exceed the maximum. SIPIS preserves millisecond precision. Subsequent failures use ErrorRecoveryDelay and ErrorRecoveryMaxDelay. Unauthorized responses use the separate UnauthorizedRecoveryDelay and UnauthorizedRecoveryMaxDelay backoff from the first failure.

Default values: 0 seconds and 30 seconds (Since 4.7).

Until 4.6, the initial delay ranged from zero to ErrorRecoveryDelay (10 minutes by default) and was not independently configurable.

Sipis/Instance/ErrorRecoveryDelay[Days, Hours, Minutes, Seconds, Milliseconds] and Sipis/Instance/ErrorRecoveryMaxDelay[Days, Hours, Minutes, Seconds, Milliseconds] (Since 3.54)

These durations control the backoff for the second and subsequent recovery attempts after a registration error. InitialErrorRecoveryMinDelay and InitialErrorRecoveryMaxDelay control the first delay. Values in all specified attributes accumulate. The base delay must not exceed the maximum.

Each subsequent failure increases the current delay by a random amount from the interval [(specified delay), 2 * (specified delay)].

The resulting delay is capped at a randomly chosen value between the maximum minus the base delay and the maximum.

SIPIS preserves millisecond precision (Since 4.7). Until 4.6, the combined durations were rounded up to whole seconds.

Default values: 10 minutes and 1 hour.

Sipis/Instance/UnauthorizedRecoveryDelay[Days, Hours, Minutes, Seconds, Milliseconds] and Sipis/Instance/UnauthorizedRecoveryMaxDelay[Days, Hours, Minutes, Seconds, Milliseconds] (Since 3.54)

These durations control the backoff after an unauthorized registration response. Values in all specified attributes accumulate. The base delay must not exceed the maximum. This backoff applies from the first unauthorized response; the initial-error recovery range does not apply.

Each unauthorized response increases the current delay by a random amount from the interval [(specified delay), 2 * (specified delay)].

The resulting delay is capped at a randomly chosen value between the maximum minus the base delay and the maximum.

SIPIS preserves millisecond precision (Since 4.7). Until 4.6, the combined durations were rounded up to whole seconds.

Default values: 10 minutes and 1 hour.

Sipis/Instance/AboutToExpireIn[Days, Hours, Minutes, Seconds, Milliseconds], Sipis/Instance/AboutToExpireIn/Silent[Days, Hours, Minutes, Seconds, Milliseconds] (Since 3.20) and Sipis/Instance/AboutToExpireIn/Intrusive[Days, Hours, Minutes, Seconds, Milliseconds] (Since 3.20)

These attributes specify how long in advance will SIPIS send the "About To Expire" push notification to clients. Values in all specified attributes accumulate.

(Since 3.20) SIPIS sends two versions of the "About To Expire" push notification: silent and intrusive. These can be sent on independent schedule.

SIPIS rounds the combined duration up to whole seconds.

Sipis/Instance/AboutToExpirePeriod[Days, Hours, Minutes, Seconds, Milliseconds], Sipis/Instance/AboutToExpirePeriod/Silent[Days, Hours, Minutes, Seconds, Milliseconds] (Since 3.20) and Sipis/Instance/AboutToExpirePeriod/Intrusive[Days, Hours, Minutes, Seconds, Milliseconds] (Since 3.20)

These attributes specify a period at which SIPIS resends the "About To Expire" push notification. Values in all specified attributes accumulate.

(Since 3.20) SIPIS sends two versions of the "About To Expire" push notification: silent and intrusive. These can be sent on independent schedule.

SIPIS rounds the combined duration up to whole seconds.

Default value: Is equal to AboutToExpireIn. I.e. by default, the "About To Expire" notification is sent just once.

Sipis/Instance/NotifyBannedPeriod[Days, Hours, Minutes, Seconds, Milliseconds] (Since 4.1)

These attributes specify a period at which SIPIS resends push notifications about an instance being banned on the SIPIS server. Values in all specified attributes accumulate.

Banned instance will unregister from the PBX and therefore will not be able to receive incoming calls.

The ban duration is taken uniformly from the range between 3 to 4 hours. Afterwards the banned instance is unbanned automatically to see if things improved. If not, the instance will get banned again.

SIPIS rounds the combined duration up to whole seconds.

Default value: 7 days.

Note

The most common reason for an instance getting banned is too frequent "pings" from PBXes.

Sipis/Instance/MaxSipClientTransactionsPerTenMinutes[Total, Ack, Bye, Cancel, Info, Invite, Message, Notify, Options, Prack, Publish, Refer, Register, Subscribe, Update], Sipis/Instance/MaxSipServerTransactionsPerTenMinutes[Total, Ack, Bye, Cancel, Info, Invite, Message, Notify, Options, Prack, Publish, Refer, Register, Subscribe, Update] (Since 3.51)

These attributes allow the administrator to specify limits on frequency of SIP transactions. When a limit is reached, the offending instance is banned for about three hours. During the ban period the instance doesn't process any SIP transactions.

Sipis/Instance/KeepAlivePackets

<xs:element name="KeepAlivePackets" minOccurs="0" maxOccurs="1">
  <xs:complexType>
    <xs:all>
      <xs:element name="Period" type="DurationType" minOccurs="1" maxOccurs="1" />
    </xs:all>
    <xs:attribute name="Enabled" type="YesNoType" use="required" />
  </xs:complexType>
</xs:element>

Sipis/Instance/KeepAlivePackets[Enabled]

This attribute specifies whether or not SIP client instances running inside SIPIS will send keep alive packets.

Sipis/Instance/KeepAlivePackets/Period[Days, Hours, Minutes, Seconds, Milliseconds]

These attributes specify a period between keep alive packets sent by SIP client instances running inside SIPIS. Values in all specified attributes accumulate.

SIPIS rounds the combined duration up to whole seconds.

Sipis/UnknownRemoteHostPolicy (Since 4.3)

<xs:element name="UnknownRemoteHostPolicy" minOccurs="0" maxOccurs="1">
  <xs:complexType>
    <xs:all>
      <xs:element name="MaxSipClientTransactionsPerTenMinutes" type="SipTransactionLimitsType" minOccurs="0" maxOccurs="1" />
      <xs:element name="MaxSipServerTransactionsPerTenMinutes" type="SipTransactionLimitsType" minOccurs="0" maxOccurs="1" />
    </xs:all>
  </xs:complexType>
</xs:element>

Sipis/UnknownRemoteHostPolicy/MaxSipClientTransactionsPerTenMinutes[Total, Ack, Bye, Cancel, Info, Invite, Message, Notify, Options, Prack, Publish, Refer, Register, Subscribe, Update], Sipis/UnknownRemoteHostPolicy/MaxSipServerTransactionsPerTenMinutes[Total, Ack, Bye, Cancel, Info, Invite, Message, Notify, Options, Prack, Publish, Refer, Register, Subscribe, Update]

These attributes specify transaction limits per remote IP over ten minutes for hosts classified as unknown. Exceeding a limit bans the remote IP for a randomized period of three to four hours. This is a process-level remote-IP ban, not an account-specific ban.

Note

The classification uses the transport's process-global learned-IP flag, populated by DNS discovery and NAT64 handling. Membership in KnownRemoteHosts does not set this flag; allowlist selection and rate-limit classification are separate. These limits do not prevent every initial unwanted call.

Sipis/KnownRemoteHosts (Since 4.6)

Defines UDP source-IP allowlists for accounts selected by SIP domain and proxy. The first entry matching both Domain and Proxy is used; entries are not combined.

A matching nonempty allowlist is enforced regardless of udpFromUnknownAddresses. The UDP channel's configured peer IP is always accepted, even if it is not listed.

Without a matching nonempty allowlist, udpFromUnknownAddresses controls filtering: 0 accepts only learned known addresses; 1 also accepts unknown sources.

SIPIS 4.10 and earlier

Set udpFromUnknownAddresses=0 to enforce the allowlist. Setting it to 1 bypasses the allowlist on these versions.

<xs:element name="KnownRemoteHosts" minOccurs="0" maxOccurs="1">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Entry" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:attribute name="Domain" type="xs:string" use="optional" default="*" />
          <xs:attribute name="Proxy" type="xs:string" use="optional" default="*" />
          <xs:attribute name="IpAddresses" type="xs:string" use="required" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Sipis/KnownRemoteHosts/Entry[Domain]

Case-insensitive SIP domain pattern. Can be a fully-qualified domain name or a wildcard pattern (e.g. "*.myvoice.io"). Defaults to *.

Sipis/KnownRemoteHosts/Entry[Proxy]

Case-insensitive wildcard pattern matched against the formatted first SIP route/proxy address. Defaults to *. The match key uses the first route's host name or IP without the port (outbound proxy when enabled). Neither Domain nor Proxy selects an application ID.

Sipis/KnownRemoteHosts/Entry[IpAddresses]

Comma-separated list of IPv4 or IPv6 addresses corresponding to the domain or wildcarded domain. IPv4 and IPv6 subnets specified using CIDR notation are also accepted.

Sipis/Call (Since 3.57)

Sipis/Call/KeepAliveInfoMessages

This element configures periodic SIP INFO keepalive messages towards the PBX during bridged calls. It applies to incoming calls (Since 3.57) and outgoing calls (Since 4.1). Messages are sent on the PBX call leg when it can send an INFO request, with content type text/plain and a keepalive message body.

<Call>
  <KeepAliveInfoMessages Enabled="Yes">
    <Period Seconds="60" />
    <Domains>
      <Domain Name="example.org" />
    </Domains>
  </KeepAliveInfoMessages>
</Call>

Sipis/Call/KeepAliveInfoMessages[Enabled]

This attribute enables or disables PBX keepalive messages for the selected domains. If KeepAliveInfoMessages is omitted, the feature is disabled.

Sipis/Call/KeepAliveInfoMessages/Period[Days, Hours, Minutes, Seconds, Milliseconds]

This element specifies the interval between keepalive messages, including when Enabled="No". SIPIS rounds the combined duration up to whole seconds.

Sipis/Call/KeepAliveInfoMessages/Domains/Domain[Name]

Each entry selects a SIP domain or the first route's host (the outbound proxy when configured). A match against either enables keepalives for that account's calls. Matching is case insensitive and includes subdomains with a dot boundary: example.org matches both example.org and pbx.example.org, but not otherexample.org. A single * matches all domains; other wildcard patterns are not supported. Omitting Domains or supplying an empty list enables no domains, even with Enabled="Yes".

Sipis/OutgoingCall (Since 4.5)

This section controls whether SIPIS permits outgoing calls for an application ID and SIP domain.

Sipis/OutgoingCall/AccessControl[Default]

This attribute specifies the decision when no Allow or Deny rule matches. Possible values are Allow and Deny.

Default value: Deny.

Sipis/OutgoingCall/AccessControl/Allow, Sipis/OutgoingCall/AccessControl/Deny

These elements allow or deny outgoing calls for the application IDs and domains specified by their optional AppId and Domain attributes. Both attributes support case-insensitive wildcard matching. Rules with neither attribute populated are ignored.

SIPIS checks each attribute independently. A rule matches when either attribute matches, including when the rule specifies both attributes but only one matches. A match on both attributes takes precedence over a domain-only match, which takes precedence over an application-ID-only match. If multiple rules have the same match priority, the last rule wins, regardless of whether it allows or denies the call.

Sipis/IncomingCall

<xs:element name="IncomingCall" minOccurs="0" maxOccurs="1">
  <xs:complexType>
    <xs:all>
      <xs:element name="DeviceNotMakingProgressMaxAge" type="DurationType" minOccurs="0" maxOccurs="1" />
      <xs:element name="NotAnsweredMaxAge" type="DurationType" minOccurs="0" maxOccurs="1" />
      <xs:element name="OnAlertingDevice" type="SipProvisionalResponseType" minOccurs="0" maxOccurs="1" />
      <xs:element name="OnPushNotificationSent" type="SipProvisionalResponseType" minOccurs="0" maxOccurs="1" />
      <xs:element name="OnDeviceMakingProgress" type="SipProvisionalResponseType" minOccurs="0" maxOccurs="1" />
      <xs:element name="OnNoResponseFromDevice" type="SipResponseType" minOccurs="0" maxOccurs="1" />
      <xs:element name="OnNoResponseFromUser" type="SipResponseType" minOccurs="0" maxOccurs="1" />
      <xs:element name="OnDeviceTokenNotFound" type="SipResponseType" minOccurs="0" maxOccurs="1" />
      <xs:element name="OnPushNotificationFailure" type="SipResponseType" minOccurs="0" maxOccurs="1" />
      <xs:element name="OnDoNotDisturb" type="SipResponseType" minOccurs="0" maxOccurs="1" />
    </xs:all>
    <xs:attribute name="PostponeRingingResponseUntilDeviceIsMakingProgress" type="YesNoType" use="optional" default="No" />
  </xs:complexType>
</xs:element>

Sipis/IncomingCall[PostponeRingingResponseUntilDeviceIsMakingProgress] (Since 3.36)

This attribute specifies whether SIPIS should postpone sending the "180 Ringing" provisional response until it receives a positive signal from a device.

Default value: No.

Note

When set to Yes, callers may experience prolonged period of silence before they can hear the ringback tone.

Sipis/IncomingCall/DeviceNotMakingProgressMaxAge[Days, Hours, Minutes, Seconds, Milliseconds] (Since 3.50)

These attributes specify a period after which SIPIS will hang up an incoming call automatically, if no user's device notifies sipis that it is about to answer the call within that period. Values in all specified attributes accumulate.

SIPIS preserves millisecond precision.

Default value: 2 minutes.

Sipis/IncomingCall/NotAnsweredMaxAge[Days, Hours, Minutes, Seconds, Milliseconds]

(Until 3.50) These attributes specify a period after which SIPIS will hang up an incoming call automatically, if the call is not answered within that period. Values in all specified attributes accumulate.

(Since 3.50) These attributes specify a period after which SIPIS will hang up an incoming call automatically, if user's device notified sipis that it is about to answer the call but fails to do so within that period. Values in all specified attributes accumulate.

SIPIS preserves millisecond precision.

Default value: 2 minutes.

Sipis/IncomingCall/OnAlertingDevice (Since 3.54)

This element allows the administrator to specify provisional SIP response SIPIS will send to the SIP proxy immediately after it initiates push notification about the incoming call. Setting the Code attribute to empty string disables provisional response for this event.

Default value: 180 Ringing with X-Sipis-Push-Status: Alerting-Device header.

Sipis/IncomingCall/OnPushNotificationSent (Since 3.54)

This element allows the administrator to specify provisional SIP response SIPIS will send to the SIP proxy when it receives confirmation from pnmediator that its push notification about the incoming call has been accepted by the platform specific push notification service (APNS or FCM).

Setting the Code attribute to empty string disables provisional response for this event.

Default value: 180 Ringing with X-Sipis-Push-Status: Push-Notification-Sent header.

Sipis/IncomingCall/OnDeviceMakingProgress (Since 3.54)

This element allows the administrator to specify provisional SIP response SIPIS will send to the SIP proxy when it receives confirmation from some user's device that it received the push notification about the incoming call and is alerting the user.

Setting the Code attribute to empty string disables provisional response for this event.

Default value: 180 Ringing with X-Sipis-Push-Status: Device-Making-Progress header.

Sipis/IncomingCall/OnNoResponseFromDevice (Since 3.54)

This element allows the administrator to specify final SIP response SIPIS will send to the SIP proxy when it doesn't receive any signal from user's device within DeviceNotMakingProgressMaxAge time period.

Default value: 480 Temporarily Unavailable with X-Sipis-Reason: No-Response-From-Device header.

Sipis/IncomingCall/OnNoResponseFromUser (Since 3.54)

This element allows the administrator to specify final SIP response SIPIS will send to the SIP proxy when it does receive confirmation from some user's device but the user doesn't answer the incoming call within NotAnsweredMaxAge time period.

Default value: 480 Temporarily Unavailable with X-Sipis-Reason: No-Response-From-User header.

Sipis/IncomingCall/OnDeviceTokenNotFound (Since 3.54)

This element allows the administrator to specify final SIP response SIPIS will send to the SIP proxy when it receives information from pnmediator that the device token used for the push notification about the incoming call is not longer valid (this usually signifies that the application has been uninstalled).

Default value: 410 Gone with X-Sipis-Reason: Device-Token-Not-Found header.

Sipis/IncomingCall/OnPushNotificationFailure (Since 3.54)

This element allows the administrator to specify final SIP response SIPIS will send to the SIP proxy when it receives information from pnmediator that it was unable to send push notification about the incoming call.

Default value: 480 Temporarily Unavailable with X-Sipis-Reason: Push-Notification-Failure header.

Sipis/IncomingCall/OnDoNotDisturb (Since 3.59)

This element allows the administrator to specify final SIP response SIPIS will send to the SIP proxy when incoming call is rejected because of Do Not Disturb policy.

Default value: 486 Busy Here with Warning: Sipis: Rejected because of Do Not Disturb policy. header.

Sipis/IncomingTextMessage (Since 3.36)

<xs:element name="IncomingTextMessage" minOccurs="0" maxOccurs="1">
  <xs:complexType>
    <xs:all>
      <xs:element name="Filter" minOccurs="0" maxOccurs="1">…</xs:element>
    </xs:all>
  </xs:complexType>
</xs:element>

Sipis/IncomingTextMessage/Filter (Since 3.36)

This element specifies sequence of tests all incoming SIP text messages pass through. These tests are performed in the same order as specified here. Each successful test overwrites a result variable with the specified action. The initial value of this variable is Accept.

<xs:element name="Filter" minOccurs="0" maxOccurs="1">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Entry" minOccurs="0" maxOccurs="unbounded">…</xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Sipis/IncomingTextMessage/Filter/Entry (Since 3.36)

This element defines the condition and resulting action of the incoming SIP text message filter. The condition succeeds when all the specified attributes in all the Header elements match.

<xs:element name="Entry" minOccurs="0" maxOccurs="unbounded">
  <xs:complexType>
    <!-- Header elements come first, followed by an optional
         RejectWith. Enabled Reject rules require RejectWith. -->
    <xs:sequence>
      <xs:group ref="IncomingTextMessageHeader" minOccurs="0" maxOccurs="unbounded" />
      <xs:element name="RejectWith" type="SipResponseType" minOccurs="0" maxOccurs="1" />
    </xs:sequence>
    <xs:attribute name="Action" type="IncomingTextMessageActionType" use="required" />
    <xs:attribute name="Enabled" type="YesNoType" use="required" />
  </xs:complexType>
</xs:element>

Sipis/IncomingTextMessage/Filter/Entry[Action]

This attribute specifies the resulting action SIPIS should take when the condition succeeds. The last matching rule determines the action; if no rule matches, the action is Accept.

Action Result
Accept Accept and store the message, and send its push notification.
AcceptAndDoNotPush (Since 3.39) Accept and store the message without sending its push notification. The message remains available for later delivery.
AcceptAndDrop Accept the request and discard the message, without storing it or sending a push notification.
Reject Reject the request using RejectWith, without storing the message or sending a push notification.

Sipis/IncomingTextMessage/Filter/Entry[Enabled]

This attribute specifies whether or not this rule is skipped during the filtering process.

Sipis/IncomingTextMessage/Filter/Entry/Header[Name]

This attribute specifies the SIP request header name whose value is to be tested.

Sipis/IncomingTextMessage/Filter/Entry/Header[StartsWith]

This attribute matches if the SIP request header value starts with the specified string. The matching is case insensitive.

Sipis/IncomingTextMessage/Filter/Entry/Header[Contains]

This attribute matches if the SIP request header value contains the specified string. The matching is case insensitive.

Sipis/IncomingTextMessage/Filter/Entry/Header[EndsWith]

This attribute matches if the SIP request header value ends with the specified string. The matching is case insensitive.

Sipis/IncomingTextMessage/Filter/Entry/Header[Equal]

This attribute matches if the SIP request header value is equal to the specified string. The matching is case insensitive.

Sipis/IncomingTextMessage/Filter/Entry/Header[NotEqual]

This attribute matches if the SIP request header value is not equal to the specified string. The matching is case insensitive.

Sipis/IncomingTextMessage/Filter/Entry/Header[UintGt]

This attribute matches if the SIP request header value is an unsigned integer and is greater than the specified value.

Sipis/IncomingTextMessage/Filter/Entry/Header[UintGte]

This attribute matches if the SIP request header value is an unsigned integer and is greater than or equal to the specified value.

Sipis/IncomingTextMessage/Filter/Entry/Header[UintLt]

This attribute matches if the SIP request header value is an unsigned integer and is less than the specified value.

Sipis/IncomingTextMessage/Filter/Entry/Header[UintLte]

This attribute matches if the SIP request header value is an unsigned integer and is less than or equal to the specified value.

Sipis/IncomingTextMessage/Filter/Entry/RejectWith

This element specifies the response SIPIS will send to the SIP proxy when it rejects the text message.

Sipis/PushTest

<xs:element name="PushTest" minOccurs="0" maxOccurs="1">
  <xs:complexType>
    <xs:all>
      <xs:element name="MinAge" type="DurationType" minOccurs="0" maxOccurs="1" />
    </xs:all>
  </xs:complexType>
</xs:element>

Sipis/PushTest/MinAge[Days, Hours, Minutes, Seconds, Milliseconds]

These attributes specify a minimal period for which a push test information will be retained in the database. Values in all specified attributes accumulate.

SIPIS rounds the combined duration up to whole seconds.

Default value: 7 days.

Sipis/DataProtection (Since 3.36)

<xs:element name="DataProtection" minOccurs="0" maxOccurs="1">
  <xs:complexType>
    <xs:attribute name="Algorithm" type="DataProtectionAlgorithmType" use="optional" default="Legacy" />
  </xs:complexType>
</xs:element>

Sipis/DataProtection[Algorithm]

This attribute specifies the data protection algorithm SIPIS will use to protect user data (passwords and text messages). Possible values are Legacy or Argon2WithAes128AeadGcm.

Default value: Legacy.

Sipis/Restart (Since 3.42)

<xs:element name="Restart" minOccurs="0" maxOccurs="1">
  <xs:complexType>
    <xs:attribute name="InstancesPerSecond" type="NonNegativeIntType" use="optional" default="6" />
    <xs:attribute name="RateLimitAppliesPerDomain" type="YesNoType" use="optional" default="Yes" />
  </xs:complexType>
</xs:element>

Sipis/Restart[InstancesPerSecond]

This attribute specifies the rate at which SIPIS initiates first instance SIP registration upon restart, in instances per second. SIPIS applies the rate in five-second scheduling windows rather than spacing registrations evenly within each second.

Default value: 6 (Since 3.50).

Default value: 4 (Until 3.49).

Sipis/Restart[RateLimitAppliesPerDomain]

This attribute specifies whether the above rate limit applies globally or only among instances with the same SIP domain.

Default value: Yes.

Sipis/UptimeRobot (Since 4.1)

This element configures periodic HTTP(S) monitoring requests to the configured URL, which may be an uptimerobot.com URL or another HTTP(S) endpoint.

<xs:element name="UptimeRobot" minOccurs="0" maxOccurs="1">
  <xs:complexType>
    <xs:all>
      <xs:element name="Period" type="DurationType" minOccurs="1" maxOccurs="1" />
    </xs:all>
    <xs:attribute name="Enabled" type="YesNoType" use="optional" default="Yes" />
    <xs:attribute name="Url" type="xs:string" use="required" />
  </xs:complexType>
</xs:element>

Sipis/UptimeRobot[Enabled]

This attribute specifies whether SIPIS sends the periodic monitoring requests.

Default value: Yes.

Sipis/UptimeRobot/Period[Days, Hours, Minutes, Seconds, Milliseconds]

These attributes specify the period between HTTP(S) monitoring requests. Values in all specified attributes accumulate.

SIPIS preserves millisecond precision. When monitoring is enabled, a combined period below two seconds is raised to 2000 milliseconds.

Sipis/UptimeRobot[Url]

This attribute specifies URL for periodic HTTP(S) requests.

Sipis/Overrides (Since 4.6)

This element defines overrides of global Sipis settings for specific tenants or applications. Overrides can be selected by CloudIds and/or AppIds. Typical use is to override the instance UserAgent string per brand/app. The elements inside Sipis/Overrides/OverrideFor use the same format as the corresponding elements in the global Sipis element, however only selected elements and attributes can be currently overridden.

SIPIS checks entries in document order and uses the first match. Later matching entries are not combined with it. Values omitted from that entry retain their global configuration, even if a later matching entry specifies them. When both CloudIds and AppIds contain values, both categories must match. Within each category, matching any listed value is sufficient. An entry with neither list populated does not match any account.

<xs:element name="Overrides" minOccurs="0" maxOccurs="1">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="OverrideFor" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:choice>
              <xs:element name="Instance" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:all>
                    <xs:element name="MaxSipClientTransactionsPerTenMinutes" type="SipTransactionLimitsType" minOccurs="0" maxOccurs="1" />
                    <xs:element name="MaxSipServerTransactionsPerTenMinutes" type="SipTransactionLimitsType" minOccurs="0" maxOccurs="1" />
                  </xs:all>
                  <xs:attribute name="UserAgent" type="xs:string" use="optional" />
                </xs:complexType>
              </xs:element>
            </xs:choice>
          </xs:sequence>
          <xs:attribute name="AppIds" type="xs:string" use="optional" />
          <xs:attribute name="CloudIds" type="xs:string" use="optional" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Sipis/Overrides/OverrideFor[CloudIds]

Comma-separated list of CloudId identifiers, matched against the account's provider code using case-insensitive equality. Wildcards are not supported; * is a literal character in a CloudId.

Sipis/Overrides/OverrideFor[AppIds]

Comma-separated list of application identifier patterns, matched case insensitively against usable device tokens for incoming calls or other notifications. Wildcard patterns such as net.my.app.* are supported.

Overrides are currently supported for these elements and attributes:

  • Instance[UserAgent] (override for Sipis/Instance[UserAgent])
  • Instance/MaxSipClientTransactionsPerTenMinutes (override for Sipis/Instance/MaxSipClientTransactionsPerTenMinutes)
  • Instance/MaxSipServerTransactionsPerTenMinutes (override for Sipis/Instance/MaxSipServerTransactionsPerTenMinutes)

All three overrides are supported since 4.6, as are both selector attributes. Other settings retain their global values even if included inside an OverrideFor entry. Place a rule for a particular cloud and application before broader rules. For example, the first entry below wins for a matching cloud/application pair; otherwise the cloud-only or application-only entry can match:

<Overrides>
  <OverrideFor CloudIds="MY_CLOUD_ID" AppIds="net.my.app.*">
    <Instance UserAgent="My Cloud App SIPIS"/>
  </OverrideFor>

  <OverrideFor CloudIds="MY_CLOUD_ID">
    <Instance UserAgent="MY Cloud ID Mobile SIPIS"/>
  </OverrideFor>

  <OverrideFor AppIds="net.my.app.*">
    <Instance UserAgent="My App Mobile SIPIS"/>
  </OverrideFor>
</Overrides>

Complete XML schema

<?xml version="1.0" encoding="utf-8"?>
<xs:schema
  xmlns="http://acrobits.net/SipisSettings.xsd"
  targetNamespace="http://acrobits.net/SipisSettings.xsd"
  elementFormDefault="qualified"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:simpleType name="YesNoType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Yes" />
      <xs:enumeration value="No" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="AllowDenyType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Allow" />
      <xs:enumeration value="Deny" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="PortType">
    <xs:restriction base="xs:unsignedShort">
      <xs:minInclusive value="1" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="NonNegativeIntType">
    <xs:restriction base="xs:int">
      <xs:minInclusive value="0" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="PositiveIntType">
    <xs:restriction base="xs:int">
      <xs:minInclusive value="1" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="NonEmptyStringType">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="SipFailureResponseCodeType">
    <xs:restriction base="xs:string">
      <xs:length value="3" />
      <!-- Accept non-success final response codes: 300-699. -->
      <xs:pattern value="[3-6][0-9]{2}" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="SipProvisionalResponseCodeType">
    <xs:union>
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:length value="0" />
        </xs:restriction>
      </xs:simpleType>
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:length value="3" />
          <!-- Accept 100-199. The other union member allows an empty
               code to disable the response. -->
          <xs:pattern value="1[0-9]{2}" />
        </xs:restriction>
      </xs:simpleType>
    </xs:union>
  </xs:simpleType>

  <xs:simpleType name="HourType">
    <xs:restriction base="xs:unsignedInt">
      <xs:minInclusive value="0" />
      <xs:maxInclusive value="23" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="MinuteType">
    <xs:restriction base="xs:unsignedInt">
      <xs:minInclusive value="0" />
      <xs:maxInclusive value="59" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="SecondType">
    <xs:restriction base="xs:unsignedInt">
      <xs:minInclusive value="0" />
      <xs:maxInclusive value="59" />
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="DurationType">
    <xs:attribute name="Days" type="xs:unsignedInt" use="optional" />
    <xs:attribute name="Hours" type="xs:unsignedInt" use="optional" />
    <xs:attribute name="Minutes" type="xs:unsignedInt" use="optional" />
    <xs:attribute name="Seconds" type="xs:unsignedInt" use="optional" />
    <xs:attribute name="Milliseconds" type="xs:unsignedInt" use="optional" />
  </xs:complexType>

  <xs:complexType name="DayTimeType">
    <xs:attribute name="Hour" type="HourType" use="optional" />
    <xs:attribute name="Minute" type="MinuteType" use="optional" />
    <xs:attribute name="Second" type="SecondType" use="optional" />
  </xs:complexType>

  <xs:complexType name="DateType">
    <xs:attribute name="Year" type="xs:unsignedInt" use="required" />
    <xs:attribute name="Month" type="xs:unsignedInt" use="required" />
    <xs:attribute name="Day" type="xs:unsignedInt" use="required" />
  </xs:complexType>

  <xs:complexType name="ByteSizeType">
    <xs:attribute name="MegaBytes" type="NonNegativeIntType" use="optional" />
    <xs:attribute name="KiloBytes" type="NonNegativeIntType" use="optional" />
    <xs:attribute name="Bytes" type="NonNegativeIntType" use="optional" />
  </xs:complexType>

  <xs:simpleType name="LogLevelType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Info" />
      <xs:enumeration value="Warning" />
      <xs:enumeration value="Error" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="StdioType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="None" />
      <xs:enumeration value="Stdout" />
      <xs:enumeration value="Stderr" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="LogFormatType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="PlainText" />
      <xs:enumeration value="Json" />
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="LogFilterEntryType">
    <xs:attribute name="Severity" use="optional" default="*">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="*" />
          <xs:enumeration value="Debug" />
          <xs:enumeration value="Info" />
          <xs:enumeration value="Warning" />
          <xs:enumeration value="Error" />
          <xs:enumeration value="Bug" />
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="Source" type="xs:string" use="optional" default="*" />
    <xs:attribute name="Field" use="optional" default="Message" >
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="Message" />
          <xs:enumeration value="Detail" />
          <xs:enumeration value="Data" />
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="DetailName" type="xs:string" use="optional" />
    <xs:attribute name="StartsWith" type="xs:string" use="optional" />
    <xs:attribute name="Contains" type="xs:string" use="optional" />
    <xs:attribute name="EndsWith" type="xs:string" use="optional" />
    <xs:attribute name="Equal" type="xs:string" use="optional" />
    <xs:attribute name="NotEqual" type="xs:string" use="optional" />
    <xs:attribute name="Enabled" type="YesNoType" use="required" />
  </xs:complexType>

  <xs:group name="LogHttpHeader">
    <xs:sequence>
      <xs:element name="Header">
        <xs:complexType>
          <xs:attribute name="Name" type="xs:string" use="required" />
          <xs:attribute name="StartsWith" type="xs:string" use="optional" />
          <xs:attribute name="Contains" type="xs:string" use="optional" />
          <xs:attribute name="EndsWith" type="xs:string" use="optional" />
          <xs:attribute name="Equal" type="xs:string" use="optional" />
          <xs:attribute name="NotEqual" type="xs:string" use="optional" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:group>

  <xs:group name="IncomingTextMessageHeader">
    <xs:sequence>
      <xs:element name="Header">
        <xs:complexType>
          <xs:attribute name="Name" type="xs:string" use="required" />
          <xs:attribute name="StartsWith" type="xs:string" use="optional" />
          <xs:attribute name="Contains" type="xs:string" use="optional" />
          <xs:attribute name="EndsWith" type="xs:string" use="optional" />
          <xs:attribute name="Equal" type="xs:string" use="optional" />
          <xs:attribute name="NotEqual" type="xs:string" use="optional" />
          <xs:attribute name="UintGt" type="xs:unsignedInt" use="optional" />
          <xs:attribute name="UintGte" type="xs:unsignedInt" use="optional" />
          <xs:attribute name="UintLt" type="xs:unsignedInt" use="optional" />
          <xs:attribute name="UintLte" type="xs:unsignedInt" use="optional" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:group>

  <xs:complexType name="LogHttpFilterEntryType">
    <!-- An optional Uri comes first, followed by any number of Header elements. -->
    <xs:sequence>
      <xs:element name="Uri" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:attribute name="StartsWith" type="xs:string" use="optional" />
          <xs:attribute name="Contains" type="xs:string" use="optional" />
          <xs:attribute name="EndsWith" type="xs:string" use="optional" />
          <xs:attribute name="Equal" type="xs:string" use="optional" />
          <xs:attribute name="NotEqual" type="xs:string" use="optional" />
        </xs:complexType>
      </xs:element>
      <xs:group ref="LogHttpHeader" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="Method" use="optional" default="*" />
    <xs:attribute name="Response" use="optional" default="*" />
    <xs:attribute name="Enabled" type="YesNoType" use="required" />
  </xs:complexType>

  <xs:simpleType name="IncomingTextMessageActionType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Accept" />
      <xs:enumeration value="AcceptAndDrop" />
      <xs:enumeration value="AcceptAndDoNotPush" />
      <xs:enumeration value="Reject" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="DataProtectionAlgorithmType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Legacy" />
      <xs:enumeration value="Argon2WithAes128AeadGcm" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="HttpAuthenticationMethodType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="None" />
      <xs:enumeration value="Basic" />
      <xs:enumeration value="Digest" />
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="SipTransactionLimitsType">
    <xs:attribute name="Total" type="NonNegativeIntType" use="optional" />
    <xs:attribute name="Ack" type="NonNegativeIntType" use="optional" />
    <xs:attribute name="Bye" type="NonNegativeIntType" use="optional" />
    <xs:attribute name="Cancel" type="NonNegativeIntType" use="optional" />
    <xs:attribute name="Info" type="NonNegativeIntType" use="optional" />
    <xs:attribute name="Invite" type="NonNegativeIntType" use="optional" />
    <xs:attribute name="Message" type="NonNegativeIntType" use="optional" />
    <xs:attribute name="Notify" type="NonNegativeIntType" use="optional" />
    <xs:attribute name="Options" type="NonNegativeIntType" use="optional" />
    <xs:attribute name="Prack" type="NonNegativeIntType" use="optional" />
    <xs:attribute name="Publish" type="NonNegativeIntType" use="optional" />
    <xs:attribute name="Refer" type="NonNegativeIntType" use="optional" />
    <xs:attribute name="Register" type="NonNegativeIntType" use="optional" />
    <xs:attribute name="Subscribe" type="NonNegativeIntType" use="optional" />
    <xs:attribute name="Update" type="NonNegativeIntType" use="optional" />
  </xs:complexType>

  <xs:complexType name="SipResponseType">
    <xs:sequence>
      <xs:element name="Header" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:attribute name="Name" type="xs:string" use="required" />
          <xs:attribute name="Value" type="xs:string" use="required" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="Code" type="SipFailureResponseCodeType" use="required" />
    <xs:attribute name="Phrase" type="NonEmptyStringType" use="required" />
    <xs:attribute name="Warning" type="xs:string" use="optional" default="" />
  </xs:complexType>

  <xs:complexType name="SipProvisionalResponseType">
    <xs:sequence>
      <xs:element name="Header" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:attribute name="Name" type="xs:string" use="required" />
          <xs:attribute name="Value" type="xs:string" use="required" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <!-- Code and Phrase are required whenever this element is present.
         An empty Code disables the response; Phrase is still required. -->
    <xs:attribute name="Code" type="SipProvisionalResponseCodeType" use="required" />
    <xs:attribute name="Phrase" type="NonEmptyStringType" use="required" />
    <xs:attribute name="Warning" type="xs:string" use="optional" default="" />
  </xs:complexType>

  <xs:simpleType name="ServerTransportType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Udp" />
      <xs:enumeration value="Tcp" />
      <xs:enumeration value="Tls" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="HttpServerTransportType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Tcp" />
      <xs:enumeration value="Tls" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="TlsCipherSuiteType">
    <!-- TLS 1.3 cipher suites are derived automatically from compatible TLS 1.2 suites. -->
    <xs:restriction base="xs:string">
      <xs:enumeration value="TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384" /> <!-- TLS 1.3 compatible -->
      <xs:enumeration value="TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384" /> <!-- TLS 1.3 compatible -->
      <xs:enumeration value="TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256" /> <!-- TLS 1.3 compatible -->
      <xs:enumeration value="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256" /> <!-- TLS 1.3 compatible -->
      <xs:enumeration value="TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384" />
      <xs:enumeration value="TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384" />
      <xs:enumeration value="TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA" />
      <xs:enumeration value="TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA" />
      <xs:enumeration value="TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256" />
      <xs:enumeration value="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256" />
      <xs:enumeration value="TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA" />
      <xs:enumeration value="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA" />
      <xs:enumeration value="TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA" />
      <xs:enumeration value="TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA" />
      <xs:enumeration value="TLS_DHE_RSA_WITH_AES_256_GCM_SHA384" />
      <xs:enumeration value="TLS_DHE_RSA_WITH_AES_256_CBC_SHA256" />
      <xs:enumeration value="TLS_DHE_RSA_WITH_AES_128_GCM_SHA256" />
      <xs:enumeration value="TLS_DHE_RSA_WITH_AES_128_CBC_SHA256" />
      <xs:enumeration value="TLS_DHE_RSA_WITH_AES_256_CBC_SHA" />
      <xs:enumeration value="TLS_DHE_RSA_WITH_AES_128_CBC_SHA" />
      <xs:enumeration value="TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA" />
      <xs:enumeration value="TLS_RSA_WITH_AES_256_GCM_SHA384" />
      <xs:enumeration value="TLS_RSA_WITH_AES_256_CBC_SHA256" />
      <xs:enumeration value="TLS_RSA_WITH_AES_128_GCM_SHA256" />
      <xs:enumeration value="TLS_RSA_WITH_AES_128_CBC_SHA256" />
      <xs:enumeration value="TLS_RSA_WITH_AES_256_CBC_SHA" />
      <xs:enumeration value="TLS_RSA_WITH_AES_128_CBC_SHA" />
      <xs:enumeration value="TLS_RSA_WITH_3DES_EDE_CBC_SHA" />
      <xs:enumeration value="TLS_ECDHE_ECDSA_WITH_RC4_128_SHA" />
      <xs:enumeration value="TLS_ECDHE_RSA_WITH_RC4_128_SHA" />
      <xs:enumeration value="TLS_RSA_WITH_RC4_128_MD5" />
      <xs:enumeration value="TLS_RSA_WITH_RC4_128_SHA" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="TlsGroupType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="mlkem512" />
      <xs:enumeration value="mlkem768" />
      <xs:enumeration value="mlkem1024" />
      <xs:enumeration value="brainpoolp384r1" />
      <xs:enumeration value="brainpoolp512r1" />
      <xs:enumeration value="brainpoolp256r1" />
      <xs:enumeration value="secp384r1" />
      <xs:enumeration value="secp521r1" />
      <xs:enumeration value="secp256k1" />
      <xs:enumeration value="secp256r1" />
      <xs:enumeration value="secp224k1" />
      <xs:enumeration value="secp224r1" />
      <xs:enumeration value="secp192k1" />
      <xs:enumeration value="secp192r1" />
      <xs:enumeration value="secp160k1" />
      <xs:enumeration value="secp160r1" />
      <xs:enumeration value="secp160r2" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="TlsSignatureSchemeType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="rsa_pkcs1_sha256" />
      <xs:enumeration value="rsa_pkcs1_sha384" />
      <xs:enumeration value="rsa_pkcs1_sha512" />
      <xs:enumeration value="ecdsa_secp256r1_sha256" />
      <xs:enumeration value="ecdsa_secp384r1_sha384" />
      <xs:enumeration value="ecdsa_secp521r1_sha512" />
      <xs:enumeration value="ecdsa_brainpoolp256r1_sha256" />
      <xs:enumeration value="ecdsa_brainpoolp384r1_sha384" />
      <xs:enumeration value="ecdsa_brainpoolp512r1_sha512" />
      <xs:enumeration value="rsa_pss_rsae_sha256" />
      <xs:enumeration value="rsa_pss_rsae_sha384" />
      <xs:enumeration value="rsa_pss_rsae_sha512" />
      <xs:enumeration value="mldsa44" />
      <xs:enumeration value="mldsa65" />
      <xs:enumeration value="mldsa87" />
      <xs:enumeration value="rsa_pkcs1_sha1" />
      <xs:enumeration value="ecdsa_sha1" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="TlsCipherSuiteListType">
    <xs:restriction>
      <xs:simpleType>
        <xs:list itemType="TlsCipherSuiteType" />
      </xs:simpleType>
      <xs:minLength value="1" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="TlsGroupListType">
    <xs:restriction>
      <xs:simpleType>
        <xs:list itemType="TlsGroupType" />
      </xs:simpleType>
      <xs:minLength value="1" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="TlsSignatureSchemeListType">
    <xs:restriction>
      <xs:simpleType>
        <xs:list itemType="TlsSignatureSchemeType" />
      </xs:simpleType>
      <xs:minLength value="1" />
    </xs:restriction>
  </xs:simpleType>

  <xs:element name="Sipis">
    <xs:complexType>
      <xs:all>
        <xs:element name="Server" minOccurs="1" maxOccurs="1">
          <xs:complexType>
            <xs:attribute name="Name" type="xs:string" use="required" />
            <xs:attribute name="Address" type="xs:string" use="required" />
            <xs:attribute name="Port" type="PortType" use="required" />
            <xs:attribute name="Transport" type="ServerTransportType" use="optional" default="Tcp" />
            <xs:attribute name="PublicAddress" type="xs:string" use="optional" default="" />
            <xs:attribute name="PrivateAddress" type="xs:string" use="optional" default="" />
            <xs:attribute name="Realm" type="xs:string" use="optional" default="" />
            <xs:attribute name="FilterInstancesAccordingToLoadBalancer2BackendSection" type="YesNoType" use="optional" default="No" />
          </xs:complexType>
        </xs:element>
        <xs:element name="HttpServer" minOccurs="1" maxOccurs="1">
          <xs:complexType>
            <xs:attribute name="Address" type="xs:string" use="required" />
            <xs:attribute name="Port" type="PortType" use="required" />
            <xs:attribute name="Transport" type="HttpServerTransportType" use="optional" default="Tcp" />
            <xs:attribute name="AuthenticationMethod" type="HttpAuthenticationMethodType" use="optional" default="Digest" />
          </xs:complexType>
        </xs:element>
        <xs:element name="Administrator" minOccurs="1" maxOccurs="1">
          <xs:complexType>
            <xs:attribute name="UserName" type="xs:string" use="required" />
            <xs:attribute name="Password" type="xs:string" use="required" />
          </xs:complexType>
        </xs:element>
        <xs:element name="Database" minOccurs="1" maxOccurs="1">
          <xs:complexType>
            <xs:all>
              <xs:element name="Alternatives" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Alternative" minOccurs="0" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:attribute name="OpenString" type="xs:string" use="required" />
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="LoadBalancing" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Database" minOccurs="1" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:attribute name="SelectorPrefix" type="xs:string" use="required" />
                        <xs:attribute name="OpenString" type="xs:string" use="required" />
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:all>
            <xs:attribute name="OpenString" type="xs:string" use="required" />
          </xs:complexType>
        </xs:element>
        <xs:element name="Lock" minOccurs="1" maxOccurs="1">
          <xs:complexType>
            <xs:attribute name="FileName" type="xs:string" use="required" />
          </xs:complexType>
        </xs:element>
        <xs:element name="Log" minOccurs="1" maxOccurs="1">
          <xs:complexType>
            <!-- Children follow the declared order. Only Instance may repeat. -->
            <xs:sequence>
              <xs:element name="Filter" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:sequence>
                    <xs:choice minOccurs="0" maxOccurs="unbounded">
                      <xs:element name="Include" type="LogFilterEntryType" />
                      <xs:element name="Exclude" type="LogFilterEntryType" />
                    </xs:choice>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="Offences" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:attribute name="Enabled" type="YesNoType" use="optional" default="Yes" />
                  <xs:attribute name="FileName" type="NonEmptyStringType" use="required" />
                </xs:complexType>
              </xs:element>
              <xs:element name="Email" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:all>
                    <xs:element name="Summary" minOccurs="0" maxOccurs="1">
                      <xs:complexType>
                        <xs:all>
                          <xs:element name="Period" type="DurationType" minOccurs="1" maxOccurs="1" />
                          <xs:element name="StartingAt" type="DayTimeType" minOccurs="1" maxOccurs="1" />
                        </xs:all>
                        <xs:attribute name="Enabled" type="YesNoType"  use="required"/>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="Excerpt" minOccurs="0" maxOccurs="1">
                      <xs:complexType>
                        <xs:all>
                          <xs:element name="MinPeriod" type="DurationType" minOccurs="1" maxOccurs="1" />
                          <xs:element name="MaxSize" type="ByteSizeType" minOccurs="0" maxOccurs="1" />
                          <xs:element name="Filter" minOccurs="0" maxOccurs="1">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:choice minOccurs="0" maxOccurs="unbounded">
                                  <xs:element name="Include" type="LogFilterEntryType" />
                                  <xs:element name="Exclude" type="LogFilterEntryType" />
                                </xs:choice>
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                        </xs:all>
                        <xs:attribute name="Enabled" type="YesNoType"  use="required"/>
                      </xs:complexType>
                    </xs:element>
                  </xs:all>
                  <xs:attribute name="To" type="xs:string" use="required" />
                  <xs:attribute name="From" type="xs:string" use="required" />
                </xs:complexType>
              </xs:element>
              <xs:element name="Http" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:all>
                    <xs:element name="Filter" minOccurs="0" maxOccurs="1">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:choice minOccurs="0" maxOccurs="unbounded">
                            <xs:element name="Include" type="LogHttpFilterEntryType" />
                            <xs:element name="Exclude" type="LogHttpFilterEntryType" />
                          </xs:choice>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:all>
                  <xs:attribute name="RequestBody" type="YesNoType" use="optional" default="No" />
                </xs:complexType>
              </xs:element>
              <xs:element name="Instance" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:choice minOccurs="1" maxOccurs="1">
                      <xs:element name="DeleteOn" type="DateType" />
                      <xs:element name="StopOn" type="DateType" />
                    </xs:choice>
                  </xs:sequence>
                  <xs:attribute name="Selector" type="xs:string" use="required" />
                </xs:complexType>
              </xs:element>
              <xs:element name="InstancesFile" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:attribute name="FileName" type="xs:string" use="required" />
                  <xs:attribute name="ReloadAutomatically" type="YesNoType" use="optional" default="Yes" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="Level" type="LogLevelType" use="optional" default="Warning" />
            <xs:attribute name="Stdio" type="StdioType" use="optional" default="Stdout" />
            <xs:attribute name="Format" type="LogFormatType" use="optional" default="PlainText" />
            <xs:attribute name="FileName" type="xs:string" use="optional" default="" />
            <xs:attribute name="MaxFileSize" type="NonNegativeIntType" use="optional" default="0" />
            <xs:attribute name="InstanceFormat" type="LogFormatType" use="optional" default="PlainText" />
            <xs:attribute name="InstanceFileName" type="xs:string" use="required" />
            <xs:attribute name="InstanceMaxFileSize" type="NonNegativeIntType" use="optional" default="0" />
            <xs:attribute name="ProblematicInstancesAutomatically" type="YesNoType" use="optional" default="No">
              <!-- This option has no effect since version 3.42 -->
            </xs:attribute>
            <xs:attribute name="TraceCallsAndTextMessages" type="YesNoType" use="optional" default="No" />
          </xs:complexType>
        </xs:element>
        <xs:element name="NotificationServers" minOccurs="1" maxOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="NotificationServer" minOccurs="1" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:all>
                    <xs:element name="Alternatives" minOccurs="0" maxOccurs="1">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="Alternative" minOccurs="0" maxOccurs="unbounded">
                            <xs:complexType>
                              <xs:attribute name="Host" type="xs:string" use="required" />
                              <xs:attribute name="Port" type="PortType" use="required" />
                              <xs:attribute name="RequiresTls" type="YesNoType" use="optional" >
                                <!-- The default value is taken from the parent (primary) NotificationServer[RequiresTls]. -->
                              </xs:attribute>
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:all>
                  <xs:attribute name="Name" type="xs:string" use="required" />
                  <xs:attribute name="Host" type="xs:string" use="required" />
                  <xs:attribute name="Port" type="PortType" use="required" />
                  <xs:attribute name="Premium" type="YesNoType" use="optional" default="No" />
                  <xs:attribute name="RequiresTls" type="YesNoType" use="optional" default="No" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="AllowedAppIds" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="AppId" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:attribute name="Name" type="xs:string" use="required" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="IgnoredAppIds" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="AppId" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:attribute name="Name" type="xs:string" use="required" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="TlsClientCertificates" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Certificate" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:attribute name="Host" type="xs:string" use="required" />
                  <xs:attribute name="FileName" type="xs:string" use="required" />
                  <xs:attribute name="RsaPrivateKeyFileName" type="xs:string" use="required" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="TlsServerOptions" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <!-- Lists use the declared order and must be nonempty when present.
                   Groups takes precedence over the legacy EllipticCurves element. -->
              <xs:element name="CipherSuites" type="TlsCipherSuiteListType" minOccurs="0" maxOccurs="1" />
              <xs:element name="Groups" type="TlsGroupListType" minOccurs="0" maxOccurs="1" />
              <xs:element name="EllipticCurves" type="TlsGroupListType" minOccurs="0" maxOccurs="1" />
              <xs:element name="SignatureSchemes" type="TlsSignatureSchemeListType" minOccurs="0" maxOccurs="1" />
              <xs:element name="Certificate" minOccurs="1" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:attribute name="Host" type="xs:string" use="optional" default="*" />
                  <xs:attribute name="FileName" type="xs:string" use="required" />
                </xs:complexType>
              </xs:element>
              <xs:element name="PrivateKey" minOccurs="1" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:attribute name="Host" type="xs:string" use="optional" default="*" />
                  <xs:attribute name="FileName" type="xs:string" use="required" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="MinVersion" type="xs:string" use="optional" default="1.2" />
            <xs:attribute name="MaxVersion" type="xs:string" use="optional" default="1.3" />
            <xs:attribute name="MinRsaModulusSizeInBits" type="PositiveIntType" use="optional" default="2048" />
            <xs:attribute name="MinDhModulusSizeInBits" type="PositiveIntType" use="optional" default="2048" />
            <xs:attribute name="MaxTimeToWaitForClientResponseInMilliSeconds" type="PositiveIntType" use="optional" default="15000" />
          </xs:complexType>
        </xs:element>
        <xs:element name="TrustedCertificates" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:attribute name="FileName" type="xs:string" use="required" />
          </xs:complexType>
        </xs:element>
        <xs:element name="Instance" minOccurs="1" maxOccurs="1">
          <xs:complexType>
            <xs:all>
              <xs:element name="MaxAge" type="DurationType" minOccurs="1" maxOccurs="1" />
              <xs:element name="PremiumMaxAge" type="DurationType" minOccurs="1" maxOccurs="1" />
              <xs:element name="NotRegisteredMaxAge" type="DurationType" minOccurs="0" maxOccurs="1" />
              <xs:element name="InitialErrorRecoveryMinDelay" type="DurationType" minOccurs="0" maxOccurs="1" />
              <xs:element name="InitialErrorRecoveryMaxDelay" type="DurationType" minOccurs="0" maxOccurs="1" />
              <xs:element name="ErrorRecoveryDelay" type="DurationType" minOccurs="0" maxOccurs="1" />
              <xs:element name="ErrorRecoveryMaxDelay" type="DurationType" minOccurs="0" maxOccurs="1" />
              <xs:element name="UnauthorizedRecoveryDelay" type="DurationType" minOccurs="0" maxOccurs="1" />
              <xs:element name="UnauthorizedRecoveryMaxDelay" type="DurationType" minOccurs="0" maxOccurs="1" />
              <xs:element name="AboutToExpireIn" minOccurs="1" maxOccurs="1">
                <xs:complexType>
                  <xs:complexContent>
                    <xs:extension base="DurationType">
                      <xs:all>
                        <xs:element name="Silent" type="DurationType" minOccurs="0" maxOccurs="1" />
                        <xs:element name="Intrusive" type="DurationType" minOccurs="0" maxOccurs="1" />
                      </xs:all>
                    </xs:extension>
                  </xs:complexContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="AboutToExpirePeriod" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:complexContent>
                    <xs:extension base="DurationType">
                      <xs:all>
                        <xs:element name="Silent" type="DurationType" minOccurs="0" maxOccurs="1" />
                        <xs:element name="Intrusive" type="DurationType" minOccurs="0" maxOccurs="1" />
                      </xs:all>
                    </xs:extension>
                  </xs:complexContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="NotifyBannedPeriod" type="DurationType" minOccurs="0" maxOccurs="1" />
              <xs:element name="KeepAlivePackets" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:all>
                    <xs:element name="Period" type="DurationType" minOccurs="1" maxOccurs="1" />
                  </xs:all>
                  <xs:attribute name="Enabled" type="YesNoType" use="required" />
                </xs:complexType>
              </xs:element>
              <xs:element name="MaxSipClientTransactionsPerTenMinutes" type="SipTransactionLimitsType" minOccurs="0" maxOccurs="1" />
              <xs:element name="MaxSipServerTransactionsPerTenMinutes" type="SipTransactionLimitsType" minOccurs="0" maxOccurs="1" />
            </xs:all>
            <xs:attribute name="UserAgent" type="xs:string" use="optional" />
            <xs:attribute name="EnableToHeaderMismatch" type="YesNoType" use="optional">
              <!-- When omitted, the user's setting is used. -->
            </xs:attribute>
            <xs:attribute name="AllowSipProxiesWithPrivateIpAddresses" type="YesNoType" use="optional" default="Yes" />
            <xs:attribute name="EnableDnsAaaa" type="YesNoType" use="optional">
              <!-- When omitted, the user's setting is used. -->
            </xs:attribute>
            <xs:attribute name="EnableDelayedReleaseOfUdpSockets" type="YesNoType" use="optional" default="Yes" />
            <xs:attribute name="KeepOnlyTheMostRecentDeviceToken" type="YesNoType" use="optional" default="No" />
            <xs:attribute name="LocalAddress" type="xs:string" use="optional" default="" />
            <xs:attribute name="LocalIpv4Address" type="xs:string" use="optional" default="" />
            <xs:attribute name="LocalIpv6Address" type="xs:string" use="optional" default="" />
            <xs:attribute name="MaxSubsequentUnauthorizedCount" type="PositiveIntType" use="optional" default="12" />
            <xs:attribute name="MaxMissedCallCount" type="PositiveIntType" use="optional" default="100" />
            <xs:attribute name="MinExpiresInSeconds" type="PositiveIntType" use="optional" default="600" />
          </xs:complexType>
        </xs:element>
        <xs:element name="UnknownRemoteHostPolicy" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:all>
              <xs:element name="MaxSipClientTransactionsPerTenMinutes" type="SipTransactionLimitsType" minOccurs="0" maxOccurs="1" />
              <xs:element name="MaxSipServerTransactionsPerTenMinutes" type="SipTransactionLimitsType" minOccurs="0" maxOccurs="1" />
            </xs:all>
          </xs:complexType>
        </xs:element>
        <xs:element name="KnownRemoteHosts" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Entry" minOccurs="0" maxOccurs="unbounded" >
                <xs:complexType>
                  <xs:attribute name="Domain" type="xs:string" use="optional" default="*" />
                  <xs:attribute name="Proxy" type="xs:string" use="optional" default="*" />
                  <xs:attribute name="IpAddresses" type="xs:string" use="required" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="Call" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:all>
              <xs:element name="KeepAliveInfoMessages" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:all>
                    <xs:element name="Period" type="DurationType" minOccurs="1" maxOccurs="1" />
                    <xs:element name="Domains" minOccurs="0" maxOccurs="1">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="Domain" minOccurs="0" maxOccurs="unbounded">
                            <xs:complexType>
                              <xs:attribute name="Name" type="xs:string" use="required" />
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:all>
                  <xs:attribute name="Enabled" type="YesNoType" use="required" />
                </xs:complexType>
              </xs:element>
            </xs:all>
          </xs:complexType>
        </xs:element>
        <xs:element name="OutgoingCall" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:all>
              <xs:element name="AccessControl" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:sequence>
                    <xs:choice maxOccurs="unbounded">
                      <xs:element name="Allow" minOccurs="0" maxOccurs="unbounded">
                        <xs:complexType>
                          <xs:attribute name="AppId" type="xs:string" use="optional" />
                          <xs:attribute name="Domain" type="xs:string" use="optional" />
                        </xs:complexType>
                      </xs:element>
                      <xs:element name="Deny" minOccurs="0" maxOccurs="unbounded">
                        <xs:complexType>
                          <xs:attribute name="AppId" type="xs:string" use="optional" />
                          <xs:attribute name="Domain" type="xs:string" use="optional" />
                        </xs:complexType>
                      </xs:element>
                    </xs:choice>
                  </xs:sequence>
                  <xs:attribute name="Default" type="AllowDenyType" use="optional" default="Deny" />
                </xs:complexType>
              </xs:element>
            </xs:all>
          </xs:complexType>
        </xs:element>
        <xs:element name="IncomingCall" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:all>
              <xs:element name="DeviceNotMakingProgressMaxAge" type="DurationType" minOccurs="0" maxOccurs="1" />
              <xs:element name="NotAnsweredMaxAge" type="DurationType" minOccurs="0" maxOccurs="1" />
              <xs:element name="OnAlertingDevice" type="SipProvisionalResponseType" minOccurs="0" maxOccurs="1" />
              <xs:element name="OnPushNotificationSent" type="SipProvisionalResponseType" minOccurs="0" maxOccurs="1" />
              <xs:element name="OnDeviceMakingProgress" type="SipProvisionalResponseType" minOccurs="0" maxOccurs="1" />
              <xs:element name="OnNoResponseFromDevice" type="SipResponseType" minOccurs="0" maxOccurs="1" />
              <xs:element name="OnNoResponseFromUser" type="SipResponseType" minOccurs="0" maxOccurs="1" />
              <xs:element name="OnDeviceTokenNotFound" type="SipResponseType" minOccurs="0" maxOccurs="1" />
              <xs:element name="OnPushNotificationFailure" type="SipResponseType" minOccurs="0" maxOccurs="1" />
              <xs:element name="OnDoNotDisturb" type="SipResponseType" minOccurs="0" maxOccurs="1" />
            </xs:all>
            <xs:attribute name="PostponeRingingResponseUntilDeviceIsMakingProgress" type="YesNoType" use="optional" default="No" />
          </xs:complexType>
        </xs:element>
        <xs:element name="IncomingTextMessage" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:all>
              <xs:element name="Filter" minOccurs="0" maxOccurs="1" >
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Entry" minOccurs="0" maxOccurs="unbounded">
                      <xs:complexType>
                        <!-- Header elements come first, followed by an optional
                             RejectWith. Enabled Reject rules require RejectWith;
                             the loader checks this condition. -->
                        <xs:sequence>
                          <xs:group ref="IncomingTextMessageHeader" minOccurs="0" maxOccurs="unbounded" />
                          <xs:element name="RejectWith" type="SipResponseType" minOccurs="0" maxOccurs="1" />
                        </xs:sequence>
                        <xs:attribute name="Action" type="IncomingTextMessageActionType" use="required" />
                        <xs:attribute name="Enabled" type="YesNoType" use="required" />
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:all>
          </xs:complexType>
        </xs:element>
        <xs:element name="PushTest" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:all>
              <xs:element name="MinAge" type="DurationType" minOccurs="0" maxOccurs="1" />
            </xs:all>
          </xs:complexType>
        </xs:element>
        <xs:element name="DataProtection" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:attribute name="Algorithm" type="DataProtectionAlgorithmType" use="optional" default="Legacy" />
          </xs:complexType>
        </xs:element>
        <xs:element name="Restart" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:attribute name="InstancesPerSecond" type="NonNegativeIntType" use="optional" default="6" />
            <xs:attribute name="RateLimitAppliesPerDomain" type="YesNoType" use="optional" default="Yes" />
          </xs:complexType>
        </xs:element>
        <xs:element name="UptimeRobot" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:all>
              <xs:element name="Period" type="DurationType" minOccurs="1" maxOccurs="1" />
            </xs:all>
            <xs:attribute name="Enabled" type="YesNoType" use="optional" default="Yes" />
            <xs:attribute name="Url" type="xs:string" use="required" />
          </xs:complexType>
        </xs:element>
        <xs:element name="Overrides" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="OverrideFor" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:choice>
                      <xs:element name="Instance" minOccurs="0" maxOccurs="1">
                        <xs:complexType>
                          <xs:all>
                            <xs:element name="MaxSipClientTransactionsPerTenMinutes" type="SipTransactionLimitsType" minOccurs="0" maxOccurs="1" />
                            <xs:element name="MaxSipServerTransactionsPerTenMinutes" type="SipTransactionLimitsType" minOccurs="0" maxOccurs="1" />
                          </xs:all>
                          <xs:attribute name="UserAgent" type="xs:string" use="optional" />
                        </xs:complexType>
                      </xs:element>
                    </xs:choice>
                  </xs:sequence>
                  <xs:attribute name="AppIds" type="xs:string" use="optional" />
                  <xs:attribute name="CloudIds" type="xs:string" use="optional" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:all>
      <xs:attribute name="Defaults" type="xs:string" use="optional" />
    </xs:complexType>
  </xs:element>
</xs:schema>

Sample Settings File

<Sipis>
  <Server
    Name="SipisOne"
    Address="0.0.0.0"
    Port="4999"
    Transport="Tcp" />

  <HttpServer
    Address="0.0.0.0"
    Port="5000"
    Transport="Tcp" />

  <Administrator
    UserName="Admin"
    Password="p9df35d" />

  <Database
    OpenString="host=db.example.com port=5432 dbname=sipis user=sipis password=unbreakable" />

  <Lock
    FileName="/var/lock/LCK..SipisOne"/>

  <Log
    FileName="/var/log/sipis/sipis.log"
    InstanceFileName="/var/log/sipis/$SELECTOR$.log"
    TraceCallsAndTextMessages="No">

    <Offences FileName="/var/log/sipis/sipis_offences.log" />

    <Instance Selector="15798A2A962EC466FBC18C58EBF4AF1372BDB943">
      <DeleteOn Year="2099" Month="1" Day="1" />
    </Instance>

  </Log>

  <NotificationServers>

    <NotificationServer
      Name="own"
      Host="localhost"
      Port="2195"
      RequiresTls="No"
      Premium="Yes" />

  </NotificationServers>

  <KnownRemoteHosts>
    <Entry Domain="*.myvoice.io" IpAddresses="203.0.113.10, 198.51.100.25" />
  </KnownRemoteHosts>

  <Overrides>
    <OverrideFor CloudIds="MY_CLOUD_ID">
      <Instance UserAgent="MY_CLOUD_ID Mobile SIPIS"/>
    </OverrideFor>

    <OverrideFor AppIds="net.my.app.id">
      <Instance UserAgent="My App Mobile SIPIS"/>
    </OverrideFor>
  </Overrides>

  <Instance>
    <MaxAge Days="3" Hours="0" Minutes="0" />
    <PremiumMaxAge Days="7" Hours="0" Minutes="0" />
    <NotRegisteredMaxAge Days="0" Hours="12" Minutes="0" />
    <InitialErrorRecoveryMinDelay Seconds="0" />
    <InitialErrorRecoveryMaxDelay Seconds="30" />
    <AboutToExpireIn Hours="24" />
    <AboutToExpirePeriod Hours="11" />
  </Instance>

  <IncomingCall>
    <NotAnsweredMaxAge Days="0" Hours="0" Minutes="1" />
  </IncomingCall>

  <IncomingTextMessage>

    <Filter>

      <Entry Action="AcceptAndDrop" Enabled="Yes">
        <Header Name="Content-Type" Equal="application/im-iscomposing+xml" />
      </Entry>

      <Entry Action="Reject" Enabled="Yes">
        <Header Name="Content-Length" UintGt="4194304" />
        <RejectWith Code="413" Phrase="Request Entity Too Large" />
      </Entry>

    </Filter>

  </IncomingTextMessage>

</Sipis>