diff --git a/README.md b/README.md index 80b4750..b200df8 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,69 @@ -# The Python module for Symantec VIP Services SDK Integration -under construction! +# Securitas + +Securitas is a Python library for integrating Symantec VIP two factor authentication into any application. + +## Installation + +< Temporary, could be wrong, need to test! > + +Install: + + $ pip install securitas + +## Obtaining a certificate + +To use Securitas in your project you first need a certificate from [Symantec VIP manager](https://manager.vip.symantec.com). +To obtain a certificate login and go to Account -> Manage VIP Certificates -> Request a Certificate. From there follow +the directions to create a new certificate. On the download screen select the PKCS#12 format and enter the password you +would like to use to secure the certificate. + +After downloading the PKCS#12 certificate, you must split it into a public and private key. To do so run the following two +commands. + +Extract the private key: + + $ openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem + +Extract the public certificate: + + $ openssl pkcs12 -in yourP12File.pfx -clcerts -nokeys -out publicCert.pem + +You may also want to remove the passphrase from the key: + + $ openssl.exe rsa -in privateKey.pem -out privateKey_nopass.pem + +## Usage + +Once the certificate is split, Securitas is simple to start using. + +```python +from suds.client import Client +from symantec_package.lib.userService.SymantecUserServices import SymantecUserServices + +userservices_url = 'http://somelocation.io/vipuserservices-auth-1.7.wsdl' +user_services_client = Client(userservices_url, + transport = HTTPSClientCertTransport( '../privateKey_nopass.pem', '../publicCert.pem')) + +test_user_services_object = SymantecUserServices(user_services_client) +send_push_to_phone_result = test_user_services_object.authenticateUserWithPush("push_123", "my_mobile_device") +# (reply){ +# requestId = "push_123" +# status = "6040" +# statusMessage = "Mobile push request sent" +# transactionId = "" +# pushDetail = +# (PushDetailType){ +# pushCredentialId = "" +# pushSent = True +# } +# } + +``` + +## Documentation + +< Need to provide link once published! > + +## Contributing + +Bug reports and pull requests are welcome on GitHub at https://github.com/ryanrampage1/Securitas. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..abe502b --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,19 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SPHINXPROJ = SymantecVIPPython +SOURCEDIR = source +BUILDDIR = build + +help: + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/build/doctrees/VIP_Python/modules.doctree b/docs/build/doctrees/VIP_Python/modules.doctree new file mode 100644 index 0000000..3c991a7 Binary files /dev/null and b/docs/build/doctrees/VIP_Python/modules.doctree differ diff --git a/docs/build/doctrees/VIP_Python/symantec_package.doctree b/docs/build/doctrees/VIP_Python/symantec_package.doctree new file mode 100644 index 0000000..af9a2d7 Binary files /dev/null and b/docs/build/doctrees/VIP_Python/symantec_package.doctree differ diff --git a/docs/build/doctrees/VIP_Python/symantec_package.lib.allServices.doctree b/docs/build/doctrees/VIP_Python/symantec_package.lib.allServices.doctree new file mode 100644 index 0000000..76754bf Binary files /dev/null and b/docs/build/doctrees/VIP_Python/symantec_package.lib.allServices.doctree differ diff --git a/docs/build/doctrees/VIP_Python/symantec_package.lib.doctree b/docs/build/doctrees/VIP_Python/symantec_package.lib.doctree new file mode 100644 index 0000000..e299c9d Binary files /dev/null and b/docs/build/doctrees/VIP_Python/symantec_package.lib.doctree differ diff --git a/docs/build/doctrees/VIP_Python/symantec_package.lib.managementService.doctree b/docs/build/doctrees/VIP_Python/symantec_package.lib.managementService.doctree new file mode 100644 index 0000000..d130282 Binary files /dev/null and b/docs/build/doctrees/VIP_Python/symantec_package.lib.managementService.doctree differ diff --git a/docs/build/doctrees/VIP_Python/symantec_package.lib.queryService.doctree b/docs/build/doctrees/VIP_Python/symantec_package.lib.queryService.doctree new file mode 100644 index 0000000..79a5d4b Binary files /dev/null and b/docs/build/doctrees/VIP_Python/symantec_package.lib.queryService.doctree differ diff --git a/docs/build/doctrees/VIP_Python/symantec_package.lib.userService.doctree b/docs/build/doctrees/VIP_Python/symantec_package.lib.userService.doctree new file mode 100644 index 0000000..d8eb19e Binary files /dev/null and b/docs/build/doctrees/VIP_Python/symantec_package.lib.userService.doctree differ diff --git a/docs/build/doctrees/environment.pickle b/docs/build/doctrees/environment.pickle new file mode 100644 index 0000000..b2bbfce Binary files /dev/null and b/docs/build/doctrees/environment.pickle differ diff --git a/docs/build/doctrees/index.doctree b/docs/build/doctrees/index.doctree new file mode 100644 index 0000000..7de7a76 Binary files /dev/null and b/docs/build/doctrees/index.doctree differ diff --git a/docs/build/html/.buildinfo b/docs/build/html/.buildinfo new file mode 100644 index 0000000..1c9c188 --- /dev/null +++ b/docs/build/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 740e7d3e3c725e0d31cbebdaaa287ee2 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/build/html/VIP_Python/modules.html b/docs/build/html/VIP_Python/modules.html new file mode 100644 index 0000000..97ce57a --- /dev/null +++ b/docs/build/html/VIP_Python/modules.html @@ -0,0 +1,117 @@ + + + + + + + + symantec_package — Symantec VIP Python documentation + + + + + + + + + + + + + + + +
+ + +
+
+ + + + \ No newline at end of file diff --git a/docs/build/html/VIP_Python/symantec_package.html b/docs/build/html/VIP_Python/symantec_package.html new file mode 100644 index 0000000..d75a761 --- /dev/null +++ b/docs/build/html/VIP_Python/symantec_package.html @@ -0,0 +1,197 @@ + + + + + + + + symantec_package package — Symantec VIP Python documentation + + + + + + + + + + + + + + + +
+
+
+
+ +
+

symantec_package package

+ +
+

Submodules

+
+
+

symantec_package.HTTPHandler module

+
+
+class symantec_package.HTTPHandler.HTTPSClientAuthHandler(key, cert)
+

Bases: urllib.request.HTTPSHandler

+
+
+getConnection(host, timeout=300)
+
+ +
+
+https_open(req)
+
+ +
+ +
+
+class symantec_package.HTTPHandler.HTTPSClientCertTransport(key, cert, *args, **kwargs)
+

Bases: suds.transport.http.HttpTransport

+
+
+u2open(u2request)
+

Open a connection. +@param u2request: A urllib2 request. +@type u2request: urllib2.Requet. +@return: The opened file-like urllib2 object. +@rtype: fp

+
+ +
+ +
+
+symantec_package.HTTPHandler.setConnection(url)
+
+ +
+
+

symantec_package.soap-play module

+
+
+

Module contents

+
+
+ + +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/build/html/VIP_Python/symantec_package.lib.allServices.html b/docs/build/html/VIP_Python/symantec_package.lib.allServices.html new file mode 100644 index 0000000..1d4a050 --- /dev/null +++ b/docs/build/html/VIP_Python/symantec_package.lib.allServices.html @@ -0,0 +1,1487 @@ + + + + + + + + symantec_package.lib.allServices package — Symantec VIP Python documentation + + + + + + + + + + + + + + + +
+
+
+
+ +
+

symantec_package.lib.allServices package

+
+

Submodules

+
+
+

symantec_package.lib.allServices.SymantecServices module

+
+
+class symantec_package.lib.allServices.SymantecServices.SymantecServices(queryClient, managementClient, userClient)
+

Bases: object

+
+
+class SymantecManagementServices(client)
+

Bases: object

+

This class acts as a layer of abstraction to handling all management Symantec VIP SOAP calls in Python.

+

You call this class to handle anything that is related to managing users and credentials.

+
+
Example:
+
>>> client = Client("http://../vipuserservices-mgmt-1.7.wsdl", transport = HTTPSClientCertTransport('vip_certificate.crt','vip_certificate.crt'))
+>>> service = SymantecManagementServices(client)
+>>> response = service.sendOtpSMS(<parameters here>)
+>>> print (response)
+
+
+
+
+
+

Note

+

Reference HTTPHandler for further information on how to setup the client.

+
+
+
+addCredentialOtp(requestId, userId, credentialId, credentialType, otp1, otp2=None, friendlyName=None, trustedCredentialDevice=None, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Assigns a credential to a user in VIP User Services using one time password(s)

+
Note:

MANDATORY - SMS, voice, and system-generated credentials need to be registered first; Also, you have choice of setting the binding status to Enabled or Disabled upon adding credential to user.

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • credentialId (string) – Unique identifier of the credential
  • +
  • credentialType (string) – Identifies the credential type: STANDARD_OTP (hardware or software VIP credential, including VIP Access for mobile), CERTIFICATE , SMS_OTP , VOICE_OTP , SERVICE_OTP
  • +
  • otp1 (string) – The first one time security code that is generated by the user’s credential.
  • +
  • otp2 (string) – The second one time security code that is generated by the user’s credential.
  • +
  • friendlyName (string) – A user-defined name to identify the credential.
  • +
  • trustedCredentialDevice (boolean) – Allows the device to be remembered in the credential for future easy usage
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+addCredentialTrustedDevice(requestId, userId, credentialId, credentialType, trustedDevice, friendlyName=None, trustedCredentialDevice=None, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Assigns a credential to a user in VIP User Services by setting the device to be remembered

+
Note:

MANDATORY - SMS, voice, and system-generated credentials need to be registered first

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • credentialId (string) – Unique identifier of the credential
  • +
  • credentialType (string) – Identifies the credential type: STANDARD_OTP (hardware or software VIP credential, including VIP Access for mobile), CERTIFICATE , SMS_OTP , VOICE_OTP , SERVICE_OTP
  • +
  • trustedDevice (boolean) – Allows the device to be remembered in the credential for future easy usage
  • +
  • friendlyName (string) – A user-defined name to identify the credential.
  • +
  • trustedCredentialDevice (boolean) – Allows the device to be remembered in the credential for future easy usage
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+clearTemporaryPassword(requestId, userId, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Removes a temporary security code from a user

+
Note:

If the user attempts to use a temporary security that has been cleared, an error will be returned from VIP User Services stating security code is not set.

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+clearUserPin(requestId, userId, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Removes an assigned PIN from an user

+
Note:

If the user attempts to use a PIN that has already been cleared, or has not been enabled by the user PIN policy, VIP User Services will return an error.

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+createUser(requestId, userId, onBehalfOfAccountId=None, pin=None, forcePinChange=None)
+
+++ + + + + + + + + + + + +
Description:

Adds a user to VIP User Services

+
Note:

By default users are created as Enabled. To disable use updateUser().

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
  • pin (string) – Optional user PIN for 1st factor authentication. 4 to 128 characters max, depending on PIN policy restrictions.
  • +
  • forcePinChange (boolean) – Force the PIN to expire after first use.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+deleteUser(requestId, userId, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Delete/remove a user from VIP User Services

+
Note:

Deleting a user is a cascading operation: when deleted, all credentials associated with user are removed and if credential is not associated with any other user, it is also deactivated.

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+getFieldContent(fieldname)
+
+++ + + + + + + + + + +
Description:Get content of items in response message
Note:Works only for one line item
Parameters:fieldname (string) – Item name
Returns:The content of input fieldname
+
+ +
+
+getPreviousResponseFirstPairs()
+
+++ + + + + + + + +
Description:Gets the 1st level of important main response fields from previous VIP SOAP call and tells what fields are accessible
Note:This will not work if there was no previous call in the client.
Returns:list – Containing all the first pair values of each tuple
+
+ +
+
+getPreviousResponseValue(firstPair)
+
+++ + + + + + + + + + +
Description:Gets the 1st level of important main response fields from the VIP SOAP call and tells what fields are accessible
Note:This will not work if there was no previous call in the client.
Parameters:firstPair (string) – The first pair in the tuple field
Returns:The field value at the pair key
+
+ +
+
+getResponseFirstPairs(response)
+
+++ + + + + + + + + + +
Description:Gets the 1st level of important main response fields from the VIP SOAP call and tells what fields are accessible
Note:This requires the SOAP response as a parameter.
Parameters:response (list of tuples) – The SOAP response
Returns:list – Containing all the first pair values of each tuple
+
+ +
+
+getResponseValue(response, firstPair)
+
+++ + + + + + + + + + +
Description:

Gets the 1st level of important main response fields from the VIP SOAP call and tells what fields are accessible

+
Note:

This requires the SOAP response as a parameter.

+
Parameters:
    +
  • response (list of tuples) – The SOAP response
  • +
  • firstPair (string) – The first pair in the tuple field
  • +
+
Returns:

The field value at the pair key

+
+
+ +
+
+registerBySMS(requestId, phoneNumber, smsFrom=None, messageTemplate=None, gatewayId=None, gatewayPassword=None, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Registers the mobile phone credential for usage through SMS

+
Note:

SMS, voice, and system-generated credentials need to be registered first

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • phoneNumber (string) – The phone number credential tied to user (active) for delivering security code. It must range from 5 to 20 digits. Any appended extension must begin with lower-case ‘x’, followed by any combination of the characters: .,# and digits 0 to 9. | example: 488555444x,1112 | **comma* Creates a short delay of approximately 2 seconds. | period Creates a longer delay of approximately 5 seconds. | star Used by some phone systems to access an extension. | pound or hash Used by some phone systems to access an extension.
  • +
  • smsFrom (string) – DEPRECATED - Specifies the FROM number that is used to send an SMS message so that the message from receiver can be mapped back.
  • +
  • messageTemplate (string ???) – The text that is sent to the user’s SMS device along with security code.
  • +
  • gatewayId (string) – The user’s specified gateway Account Id
  • +
  • gatewayPassword (string) – The user’s specified gateway Account password
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+registerByServiceOtp(requestId, serviceOtpId, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Registers the phone credential for usage through a service one time password

+
Note:

SMS, voice, and system-generated credentials need to be registered first

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • serviceOtpId (string) – The id of the service’s Otp
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+registerByVoice(requestId, phoneNumber, language=None, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Registers the phone credential for usage through voice message

+
Note:

SMS, voice, and system-generated credentials need to be registered first

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • phoneNumber (string) – The phone number credential tied to user (active) for delivering security code. It must range from 5 to 20 digits. Any appended extension must begin with lower-case ‘x’, followed by any combination of the characters: .,# and digits 0 to 9. | example: 488555444x,1112 | **comma* Creates a short delay of approximately 2 seconds. | period Creates a longer delay of approximately 5 seconds. | star Used by some phone systems to access an extension. | pound or hash Used by some phone systems to access an extension.
  • +
  • language (string) – The language that the security code message is in. Only supported language is en-us
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+removeCredential(requestId, userId, credentialId, credentialType, trustedDevice=None, onBehalfOfAccountId=None)
+
+++ + + + + + + + +
Description:

Removes a credential from a user

+
Note:

If the credential is not associated with any other user, the credential is also deactivated. Also, if the device deletion policy for Remembered Devices is set to Admin Only, credentials can only be removed through VIP Manager (ERROR code: 6010).

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • credentialId (string) – Unique identifier of the credential
  • +
  • credentialType (string) – Identifies the credential type: STANDARD_OTP (hardware or software VIP credential, including VIP Access for mobile), CERTIFICATE , SMS_OTP , VOICE_OTP , SERVICE_OTP
  • +
  • trustedDevice (boolean) – Allows the device to be remembered in the credential for future easy usage
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
+
+ +
+
+sendOtpSMS(requestId, userId, phoneNumber, isGatewayAcctInfo=False, onBehalfOfAccountId=None, smsFrom=None, messageTemplate=None, gatewayId=None, gatewayPassword=None)
+
+++ + + + + + + + + + + + +
Description:

Sends a one time password to a mobile phone

+
Note:
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • phoneNumber (string) – The phone number credential tied to user (active) for delivering security code. It must range from 5 to 20 digits. Any appended extension must begin with lower-case ‘x’, followed by any combination of the characters: .,# and digits 0 to 9. | example: 488555444x,1112 | **comma* Creates a short delay of approximately 2 seconds. | period Creates a longer delay of approximately 5 seconds. | star Used by some phone systems to access an extension. | pound or hash Used by some phone systems to access an extension.
  • +
  • isGatewayAcctInfo (boolean) – Should we use a gateway?
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
  • smsFrom (string) – DEPRECATED - Specifies the FROM number that is used to send an SMS message so that the message from receiver can be mapped back.
  • +
  • messageTemplate (string ???) – The text that is sent to the user’s SMS device along with security code.
  • +
  • gatewayId (string) – The user’s specified gateway Account Id
  • +
  • gatewayPassword (string) – The user’s specified gateway Account password
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+setTemporaryPasswordAttributes(requestId, userId, expirationTime=None, oneTimeUseOnly=None, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Changes the expiration date for a temporary security code you previously set using the setTemporaryPassword()

+
Note:
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • expirationDate (dateTime) – The temporary security code expiration time (maximum of 30 days) using GMT time zone. If no date is provided, the default expiration period of 1 day is used to calculate the security code expiration.
  • +
  • oneTimeUseOnly (boolean) – If this field is set to “true”, the temporary security code expires after one use, or at the expiration date. The default value is “false”.
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+setTemporaryPasswordSMSDelivery(requestId, userId, phoneNumber, smsFrom=None, messageTemplate=None, gatewayId=None, gatewayPassword=None, temporaryPassword=None, expirationDate=None, oneTimeUseOnly=None, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + + + +
Description:

Sets a temporary security code for a user through SMS text message

+
Note_1:

Can optionally set an expiration date for the security code, or set it for one-time use only. The request requires the user ID and optionally, the temporary security code string. If you do not provide a security code, VIP User Services automatically generates one for you.

+
Note_2:

You can clear the security code with clearTemporaryPassword. Also, if a user is authenticated using a security code generated by a valid credential, VP User Services automatically clears the temporary security code.

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • phoneNumber (string) – The phone number credential tied to user (active) for delivering security code. It must range from 5 to 20 digits. Any appended extension must begin with lower-case ‘x’, followed by any combination of the characters: .,# and digits 0 to 9. | example: 488555444x,1112 | **comma* Creates a short delay of approximately 2 seconds. | period Creates a longer delay of approximately 5 seconds. | star Used by some phone systems to access an extension. | pound or hash Used by some phone systems to access an extension.
  • +
  • smsFrom (string) – DEPRECATED - Specifies the FROM number that is used to send an SMS message so that the message from receiver can be mapped back.
  • +
  • messageTemplate (string ???) – The text that is sent to the user’s SMS device along with security code.
  • +
  • gatewayId (string) – The user’s specified gateway Account Id
  • +
  • gatewayPassword (string) – The user’s specified gateway Account password
  • +
  • temporaryPassword (string) – Temporary security code is either empty or 6 numeric characters. If this field is left empty, a security code will be auto-generated for the user.
  • +
  • expirationDate (dateTime) – The temporary security code expiration time (maximum of 30 days) using GMT time zone. If no date is provided, the default expiration period of 1 day is used to calculate the security code expiration.
  • +
  • oneTimeUseOnly (boolean) – If this field is set to “true”, the temporary security code expires after one use, or at the expiration date. The default value is “false”.
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+setTemporaryPasswordVoiceDelivery(requestId, userId, phoneNumber, language=None, temporaryPassword=None, expirationDate=None, oneTimeUseOnly=None, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + + + +
Description:

Sets a temporary security code for a user through SMS Voice message

+
Note_1:

Can optionally set an expiration date for the security code, or set it for one-time use only. The request requires the user ID and optionally, the temporary security code string. If you do not provide a security code, VIP User Services automatically generates one for you.

+
Note_2:

You can clear the security code with clearTemporaryPassword. Also, if a user is authenticated using a security code generated by a valid credential, VP User Services automatically clears the temporary security code.

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • phoneNumber (string) – The phone number credential tied to user (active) for delivering security code. It must range from 5 to 20 digits. Any appended extension must begin with lower-case ‘x’, followed by any combination of the characters: .,# and digits 0 to 9. | example: 488555444x,1112 | **comma* Creates a short delay of approximately 2 seconds. | period Creates a longer delay of approximately 5 seconds. | star Used by some phone systems to access an extension. | pound or hash Used by some phone systems to access an extension.
  • +
  • language (string) – The language that the security code message is in. Only supported language is en-us
  • +
  • temporaryPassword (string) – Temporary security code is either empty or 6 numeric characters. If this field is left empty, a security code will be auto-generated for the user.
  • +
  • expirationDate (dateTime) – The temporary security code expiration time (maximum of 30 days) using GMT time zone. If no date is provided, the default expiration period of 1 day is used to calculate the security code expiration.
  • +
  • oneTimeUseOnly (boolean) – If this field is set to “true”, the temporary security code expires after one use, or at the expiration date. The default value is “false”.
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+updateCredential(requestId, userId, credentialId, credentialType, friendlyName, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Updates the friendly name of a credential

+
Note:

The updateCredential API includes unique identifiers of the request for the enterprise application, for the user, and for the credential.

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • credentialId (string) – Unique identifier of the credential
  • +
  • credentialType (string) – Identifies the credential type: STANDARD_OTP (hardware or software VIP credential, including VIP Access for mobile), CERTIFICATE , SMS_OTP , VOICE_OTP , SERVICE_OTP
  • +
  • friendlyName (string) – A user-defined name to identify the credential.
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+updateUser(requestId, userId, newUserId=None, newUserStatus=None, oldPin=None, newPin=None, forcePinChange=None, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Update information about an user in VIP User Services

+
Note:

Also, enables or disables a user.

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • newUserId (string) – Case-sensitive unique replacement ID for the user. If element isn’t provided, user ID is not changed.
  • +
  • newUserStatus (string) – New status of user: ACTIVE or DISABLED; If element is not provided, the user status is not changed.
  • +
  • oldPin (string) – The existing user PIN. If value is provided without a newPin value an error is returned. Else if the oldPin is not prvided, but a newPin value is provided, the user is updated with newPin.
  • +
  • newPin (string) – The new user PIN. If value does not meet requirements of the PIN policy, an error is returned. Else if the PIN policy has not been enabled for the user, an error is returned.
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
  • forcePinChange (boolean) – Force the PIN to expire after first use.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+ +
+
+class SymantecServices.SymantecQueryServices(client)
+

Bases: object

+

This class acts as a layer of abstraction to handling all query Symantec VIP SOAP calls in Python.

+

You call this class to handle anything that is related to user info and transaction status

+

Example:

+
>>> client = Client("http://../vipuserservices-query-1.7.wsdl", transport = HTTPSClientCertTransport('vip_certificate.crt','vip_certificate.crt'))
+
+
+
>>> service = SymantecQueryServices(client)
+
+
+
>>> response = service.getUserInfo(<parameters here>)
+
+
+
>>> print (response)
+
+
+
+

Note

+

Reference HTTPHandler for further information on how to setup the client.

+
+
+
+getCredentialInfo(requestId, credentialId, credentialType='STANDARD_OTP', includePushAttributes=None, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Get detail info of a registered credential

+
Note:
Parameters:
    +
  • requestId (string) – A identifier ID of a call, may be useful for troubleshooting
  • +
  • credentialType (string) – Type of this credential
  • +
  • includePushAttributes (string) – Include push attributes in response message
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
CredentialId:

A unique identifier for every credential

+
Returns:

the return SOAP response.

+
+
+ +
+
+getFieldContent(fieldname)
+
+++ + + + + + + + + + +
Description:Get content of items in response message
Note:Works only for one line item
Parameters:fieldname (string) – Item name
Returns:The content of input fieldname
+
+ +
+
+getPreviousResponseFirstPairs()
+
+++ + + + + + + + +
Description:Gets the 1st level of important main response fields from previous VIP SOAP call and tells what fields are accessible
Note:This will not work if there was no previous call in the client.
Returns:list – Containing all the first pair values of each tuple
+
+ +
+
+getPreviousResponseValue(firstPair)
+
+++ + + + + + + + + + +
Description:Gets the 1st level of important main response fields from the VIP SOAP call and tells what fields are accessible
Note:This will not work if there was no previous call in the client.
Parameters:firstPair (string) – The first pair in the tuple field
Returns:The field value at the pair key
+
+ +
+
+getResponseFirstPairs(response)
+
+++ + + + + + + + + + +
Description:Gets the 1st level of important main response fields from the VIP SOAP call and tells what fields are accessible
Note:This requires the SOAP response as a parameter.
Parameters:response (list of tuples) – The SOAP response
Returns:list – Containing all the first pair values of each tuple
+
+ +
+
+getResponseValue(response, firstPair)
+
+++ + + + + + + + + + +
Description:

Gets the 1st level of important main response fields from the VIP SOAP call and tells what fields are accessible

+
Note:

This requires the SOAP response as a parameter.

+
Parameters:
    +
  • response (list of tuples) – The SOAP response
  • +
  • firstPair (string) – The first pair in the tuple field
  • +
+
Returns:

The field value at the pair key

+
+
+ +
+
+getServerTime(requestId, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + +
Description:

Get server time

+
Note:
Parameters:
    +
  • requestId (string) – A identifier ID of a call, may be useful for troubleshooting
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
+
+ +
+
+getTemporaryPasswordAttributes(requestId, userId, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Get associated attributes of a temporary password

+
Note:
Parameters:
    +
  • requestId (string) – A identifier ID of a call, may be useful for troubleshooting
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
UserId:

Unique userid registered in VIP

+
Returns:

the return SOAP response.

+
+
+ +
+
+getUserInfo(requestId, userId, onBehalfOfAccountId=None, iaInfo=True, includePushAttributes=True)
+
+++ + + + + + + + + + + + +
Description:

Get the account info of a VIP user

+
Note:
Parameters:
    +
  • requestId (string) – A identifier ID of a call, may be useful for troubleshooting
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
  • iaInfo (boolean) – Includes iaInfo in response message
  • +
  • includesPushAttributes (bollean) – Includes push attributes in response message
  • +
+
UserId:

Unique user id regisered on VIP

+
Returns:

the return SOAP response.

+
+
+ +
+
+pollPushStatus(requestId, transactionId, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Poll status of a sent push notification

+
Note:

It is associate with a unique transaction ID

+
Parameters:
    +
  • requestId (string) – A identifier ID of a call, may be useful for troubleshooting
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
TransactionId:

A unique identifier for a push transaction

+
Returns:

the return SOAP response.

+
+
+ +
+ +
+
+class SymantecServices.SymantecUserServices(client)
+

Bases: object

+

This class acts as a layer of abstraction to handling all user services Symantec VIP SOAP calls in Python.

+

You call this class to handle anything that is related to authenticating users and credentials.

+
+
Example:
+
>>> client = Client("http://../vipuserservices-auth-1.7.wsdl", transport = HTTPSClientCertTransport('vip_certificate.crt','vip_certificate.crt'))
+>>> service = SymantecUserServices(client)
+>>> response = service.authenticateUser(<parameters here>)
+>>> print (response)
+
+
+
+
+
+

Note

+

Reference HTTPHandler for further information on how to setup the client.

+
+
+
+authenticateCredentialWithPush(requestId, credentialId, pushMessage, displayTitle=None, displayMessage=None, displayProfile=None, activate=None, authContext=None, value=None, timeout=None)
+
+++ + + + + + + + + + + + +
Description:

Authenticates a user via a Push notification using their credential ID.

+
Note:
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • pushMessage (string) – Text of the push notification in Notification Center (iOS) or Notification Drawer (Android). Suggested maximum size 70 characters.
  • +
  • displayTitle (string) – Title of the modal. Suggested maximum size 30 characters.
  • +
  • displayMessage (string) – Text of modal. Suggested maximum size 70 characters.
  • +
  • displayProfile (string) – Indicates the login URL or profile. Suggested maximum size 60 characters.
  • +
  • activate (boolean) – Activates a credential. If otpAuthData is provided, it consumes the OTP to authenticate. If pushAuthData is used, sends a push notification to the credential for authentication.
  • +
  • authContext (string) – A map containing the parameters that control how the authentication is performed. VIP User Services accepts an authentication level for the authContext field. The authentication level defines the credential types that can be validated with this request. This level must match an authentication level configured in VIP Manager. ■ Key: Enter authLevel.level ■ Value: Enter the authentication level value (as an integer from 1 - 10).
  • +
  • value (string) – The user’s specified gateway Account password
  • +
  • timeout (string) – The user’s specified gateway Account password
  • +
+
Returns:

string – the return SOAP response.

+
Raises:
+
+ +
+
+authenticateCredentialWithSMS(requestId, credentialId_phoneNumber, securityCode, activate=None)
+
+ +
+
+authenticateCredentialWithStandard_OTP(requestId, credentialId, securityCode, activate=None)
+
+ +
+
+authenticateCredentials(requestId, credentials, otp1=None, pushAuthData=None, activate=None, authContext=None, onBehalfOfAccountId=None)
+
+ +
+
+authenticateUser(requestId, userId, otp1, otp2=None, value=None, key='authLevel.level', pin=None, onBehalfOfAccountId=None)
+
+ +
+
+authenticateUserWithPush(requestId, userId, pin=None, displayParams=None, requestParams=None, authContext=None)
+
+ +
+
+checkOtp(requestId, userId, otp1, otp2=None, value=None, key='authLevel.level', onBehalfOfAccountId=None)
+
+ +
+
+confirmRisk(requestId, UserId, EventId, VerifyMethod=None, KeyValuePair=None, onBehalfOfAccountId=None)
+
+ +
+
+denyRisk(requestId, UserId, EventId, VerifyMethod=None, IAAuthData=None, isRememberDevice=None, FriendlyName=None, KeyValuePair=None, onBehalfOfAccountId=None)
+
+ +
+
+evaluateRisk(requestId, UserId, IpAddress, UserAgent, IAAuthData=None, KeyValuePair=None, onBehalfOfAccountId=None)
+
+ +
+
+getFieldContent(fieldname)
+
+++ + + + + + + + + + +
Description:Get content of items in response message
Note:Works only for one line item
Parameters:fieldname (string) – Item name
Returns:The content of input fieldname
+
+ +
+
+getPreviousResponseFirstPairs()
+
+++ + + + + + + + +
Description:Gets the 1st level of important main response fields from previous VIP SOAP call and tells what fields are accessible
Note:This will not work if there was no previous call in the client.
Returns:list – Containing all the first pair values of each tuple
+
+ +
+
+getPreviousResponseValue(firstPair)
+
+++ + + + + + + + + + +
Description:Gets the 1st level of important main response fields from the VIP SOAP call and tells what fields are accessible
Note:This will not work if there was no previous call in the client.
Parameters:firstPair (string) – The first pair in the tuple field
Returns:The field value at the pair key
+
+ +
+
+getResponseFirstPairs(response)
+
+++ + + + + + + + + + +
Description:Gets the 1st level of important main response fields from the VIP SOAP call and tells what fields are accessible
Note:This requires the SOAP response as a parameter.
Parameters:response (list of tuples) – The SOAP response
Returns:list – Containing all the first pair values of each tuple
+
+ +
+
+getResponseValue(response, firstPair)
+
+++ + + + + + + + + + +
Description:

Gets the 1st level of important main response fields from the VIP SOAP call and tells what fields are accessible

+
Note:

This requires the SOAP response as a parameter.

+
Parameters:
    +
  • response (list of tuples) – The SOAP response
  • +
  • firstPair (string) – The first pair in the tuple field
  • +
+
Returns:

The field value at the pair key

+
+
+ +
+ +
+
+SymantecServices.addCredentialOtp(requestId, userId, credentialId, credentialType, otp1, otp2=None, friendlyName=None, trustedCredentialDevice=None, onBehalfOfAccountId=None)
+
+ +
+
+SymantecServices.addCredentialTrustedDevice(requestId, userId, credentialId, credentialType, trustedDevice, friendlyName=None, trustedCredentialDevice=None, onBehalfOfAccountId=None)
+
+ +
+
+SymantecServices.authenticateCredentials(requestId, credentials, otpAuthData=None, pushAuthData=None, activate=None)
+
+ +
+
+SymantecServices.authenticateUser(requestId, userId, otp1, otp2=None, value=None, key='authLevel.level', pin=None, onBehalfOfAccountId=None)
+
+ +
+
+SymantecServices.authenticateUserWithPush(requestId, userId, pin=None, displayParams=None, requestParams=None, authContext=None)
+
+ +
+
+SymantecServices.authenticateUserWithPushThenPolling(requestIdPush, requestIdPoll, userId, queryTimeout=60, queryInterval=5, displayParams=None, requestParams=None, authContext=None, onBehalfOfAccountId=None)
+
+ +
+
+SymantecServices.authenticateWithSMS(requestId, credentialId_phoneNumber, securityCode, activate=None)
+
+ +
+
+SymantecServices.authenticateWithStandard_OTP(requestId, credentialId, securityCode, activate=None)
+
+ +
+
+SymantecServices.checkOtp(requestId, userId, otp1, otp2=None, value=None, key='authLevel.level', onBehalfOfAccountId=None)
+
+ +
+
+SymantecServices.clearTemporaryPassword(requestId, userId, onBehalfOfAccountId=None)
+
+ +
+
+SymantecServices.clearUserPin(requestId, userId, onBehalfOfAccountId=None)
+
+ +
+
+SymantecServices.confirmRisk(requestId, UserId, EventId, VerifyMethod=None, KeyValuePair=None, onBehalfOfAccountId=None)
+
+ +
+
+SymantecServices.createUser(requestId, userId, onBehalfOfAccountId=None, pin=None, forcePinChange=None)
+
+ +
+
+SymantecServices.deleteUser(requestId, userId, onBehalfOfAccountId=None)
+
+ +
+
+SymantecServices.denyRisk(requestId, UserId, EventId, VerifyMethod=None, IAAuthData=None, isRememberDevice=None, FriendlyName=None, KeyValuePair=None, onBehalfOfAccountId=None)
+
+ +
+
+SymantecServices.evaluateRisk(requestId, UserId, IpAddress, UserAgent, IAAuthData=None, KeyValuePair=None, onBehalfOfAccountId=None)
+
+ +
+
+SymantecServices.getCredentialInfo(requestId, credentialId, credentialType='STANDARD_OTP', includePushAttributes=None, onBehalfOfAccountId=None)
+
+ +
+
+SymantecServices.getFieldContent(fieldname)
+
+++ + + + + + + + + + +
Description:Get content of items in response message
Note:Works only for one line item
Parameters:fieldname (string) – Item name
Returns:The content of input fieldname
+
+ +
+
+SymantecServices.getPreviousResponseFirstPairs()
+
+++ + + + + + + + +
Description:Gets the 1st level of important main response fields from previous VIP SOAP call and tells what fields are accessible
Note:This will not work if there was no previous call in the client.
Returns:list – Containing all the first pair values of each tuple
+
+ +
+
+SymantecServices.getPreviousResponseValue(firstPair)
+
+++ + + + + + + + + + +
Description:Gets the 1st level of important main response fields from the VIP SOAP call and tells what fields are accessible
Note:This will not work if there was no previous call in the client.
Parameters:firstPair (string) – The first pair in the tuple field
Returns:The field value at the pair key
+
+ +
+
+SymantecServices.getResponseFirstPairs(response)
+
+++ + + + + + + + + + +
Description:Gets the 1st level of important main response fields from the VIP SOAP call and tells what fields are accessible
Note:This requires the SOAP response as a parameter.
Parameters:response (list of tuples) – The SOAP response
Returns:list – Containing all the first pair values of each tuple
+
+ +
+
+SymantecServices.getResponseValue(response, firstPair)
+
+++ + + + + + + + + + +
Description:

Gets the 1st level of important main response fields from the VIP SOAP call and tells what fields are accessible

+
Note:

This requires the SOAP response as a parameter.

+
Parameters:
    +
  • response (list of tuples) – The SOAP response
  • +
  • firstPair (string) – The first pair in the tuple field
  • +
+
Returns:

The field value at the pair key

+
+
+ +
+
+SymantecServices.getServerTime(requestId, onBehalfOfAccountId=None)
+
+ +
+
+SymantecServices.getTemporaryPasswordAttributes(requestId, userId, onBehalfOfAccountId=None)
+
+ +
+
+SymantecServices.getUserInfo(requestId, userId, onBehalfOfAccountId=None, iaInfo=True, includePushAttributes=True)
+
+ +
+
+SymantecServices.pollPushStatus(requestId, transactionId)
+
+ +
+
+SymantecServices.registerBySMS(requestId, phoneNumber, smsFrom=None, messageTemplate=None, gatewayId=None, gatewayPassword=None, onBehalfOfAccountId=None)
+
+ +
+
+SymantecServices.registerByServiceOtp(requestId, serviceOtpId, onBehalfOfAccountId=None)
+
+ +
+
+SymantecServices.registerByVoice(requestId, phoneNumber, language=None, onBehalfOfAccountId=None)
+
+ +
+
+SymantecServices.removeCredential(requestId, userId, credentialId, credentialType, trustedDevice=None, onBehalfOfAccountId=None)
+
+ +
+
+SymantecServices.sendOtpSMS(requestId, userId, phoneNumber, isGatewayAcctInfo=False, onBehalfOfAccountId=None, smsFrom=None, messageTemplate=None, gatewayId=None, gatewayPassword=None)
+
+ +
+
+SymantecServices.setTemporaryPasswordAttributes(requestId, userId, expirationTime=None, oneTimeUseOnly=None, onBehalfOfAccountId=None)
+
+ +
+
+SymantecServices.setTemporaryPasswordSMSDelivery(requestId, userId, phoneNumber, smsFrom=None, messageTemplate=None, gatewayId=None, gatewayPassword=None, temporaryPassword=None, expirationDate=None, oneTimeUseOnly=None, onBehalfOfAccountId=None)
+
+ +
+
+SymantecServices.setTemporaryPasswordVoiceDelivery(requestId, userId, phoneNumber, language=None, temporaryPassword=None, expirationDate=None, oneTimeUseOnly=None, onBehalfOfAccountId=None)
+
+ +
+
+SymantecServices.sys = <module 'sys' (built-in)>
+
+ +
+
+SymantecServices.updateCredential(requestId, userId, credentialId, credentialType, friendlyName, onBehalfOfAccountId=None)
+
+ +
+
+SymantecServices.updateUser(requestId, userId, newUserId=None, newUserStatus=None, oldPin=None, newPin=None, forcePinChange=None, onBehalfOfAccountId=None)
+
+ +
+ +
+
+

Module contents

+
+
+ + +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/build/html/VIP_Python/symantec_package.lib.html b/docs/build/html/VIP_Python/symantec_package.lib.html new file mode 100644 index 0000000..45f2a0a --- /dev/null +++ b/docs/build/html/VIP_Python/symantec_package.lib.html @@ -0,0 +1,141 @@ + + + + + + + + symantec_package.lib package — Symantec VIP Python documentation + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/build/html/VIP_Python/symantec_package.lib.managementService.html b/docs/build/html/VIP_Python/symantec_package.lib.managementService.html new file mode 100644 index 0000000..71ae6f3 --- /dev/null +++ b/docs/build/html/VIP_Python/symantec_package.lib.managementService.html @@ -0,0 +1,753 @@ + + + + + + + + symantec_package.lib.managementService package — Symantec VIP Python documentation + + + + + + + + + + + + + + + +
+
+
+
+ +
+

symantec_package.lib.managementService package

+
+

Submodules

+
+
+

symantec_package.lib.managementService.SymantecManagementServices module

+
+
+class symantec_package.lib.managementService.SymantecManagementServices.SymantecManagementServices(client)
+

Bases: object

+

This class acts as a layer of abstraction to handling all management Symantec VIP SOAP calls in Python.

+

You call this class to handle anything that is related to managing users and credentials.

+
+
Example:
+
>>> client = Client("http://../vipuserservices-mgmt-1.7.wsdl", transport = HTTPSClientCertTransport('vip_certificate.crt','vip_certificate.crt'))
+>>> service = SymantecManagementServices(client)
+>>> response = service.sendOtpSMS(<parameters here>)
+>>> print (response)
+
+
+
+
+
+

Note

+

Reference HTTPHandler for further information on how to setup the client.

+
+
+
+addCredentialOtp(requestId, userId, credentialId, credentialType, otp1, otp2=None, friendlyName=None, trustedCredentialDevice=None, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Assigns a credential to a user in VIP User Services using one time password(s)

+
Note:

MANDATORY - SMS, voice, and system-generated credentials need to be registered first; Also, you have choice of setting the binding status to Enabled or Disabled upon adding credential to user.

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • credentialId (string) – Unique identifier of the credential
  • +
  • credentialType (string) – Identifies the credential type: STANDARD_OTP (hardware or software VIP credential, including VIP Access for mobile), CERTIFICATE , SMS_OTP , VOICE_OTP , SERVICE_OTP
  • +
  • otp1 (string) – The first one time security code that is generated by the user’s credential.
  • +
  • otp2 (string) – The second one time security code that is generated by the user’s credential.
  • +
  • friendlyName (string) – A user-defined name to identify the credential.
  • +
  • trustedCredentialDevice (boolean) – Allows the device to be remembered in the credential for future easy usage
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+addCredentialTrustedDevice(requestId, userId, credentialId, credentialType, trustedDevice, friendlyName=None, trustedCredentialDevice=None, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Assigns a credential to a user in VIP User Services by setting the device to be remembered

+
Note:

MANDATORY - SMS, voice, and system-generated credentials need to be registered first

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • credentialId (string) – Unique identifier of the credential
  • +
  • credentialType (string) – Identifies the credential type: STANDARD_OTP (hardware or software VIP credential, including VIP Access for mobile), CERTIFICATE , SMS_OTP , VOICE_OTP , SERVICE_OTP
  • +
  • trustedDevice (boolean) – Allows the device to be remembered in the credential for future easy usage
  • +
  • friendlyName (string) – A user-defined name to identify the credential.
  • +
  • trustedCredentialDevice (boolean) – Allows the device to be remembered in the credential for future easy usage
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+clearTemporaryPassword(requestId, userId, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Removes a temporary security code from a user

+
Note:

If the user attempts to use a temporary security that has been cleared, an error will be returned from VIP User Services stating security code is not set.

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+clearUserPin(requestId, userId, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Removes an assigned PIN from an user

+
Note:

If the user attempts to use a PIN that has already been cleared, or has not been enabled by the user PIN policy, VIP User Services will return an error.

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+createUser(requestId, userId, onBehalfOfAccountId=None, pin=None, forcePinChange=None)
+
+++ + + + + + + + + + + + +
Description:

Adds a user to VIP User Services

+
Note:

By default users are created as Enabled. To disable use updateUser().

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
  • pin (string) – Optional user PIN for 1st factor authentication. 4 to 128 characters max, depending on PIN policy restrictions.
  • +
  • forcePinChange (boolean) – Force the PIN to expire after first use.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+deleteUser(requestId, userId, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Delete/remove a user from VIP User Services

+
Note:

Deleting a user is a cascading operation: when deleted, all credentials associated with user are removed and if credential is not associated with any other user, it is also deactivated.

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+getFieldContent(fieldname)
+
+++ + + + + + + + + + +
Description:Get content of items in response message
Note:Works only for one line item
Parameters:fieldname (string) – Item name
Returns:The content of input fieldname
+
+ +
+
+getPreviousResponseFirstPairs()
+
+++ + + + + + + + +
Description:Gets the 1st level of important main response fields from previous VIP SOAP call and tells what fields are accessible
Note:This will not work if there was no previous call in the client.
Returns:list – Containing all the first pair values of each tuple
+
+ +
+
+getPreviousResponseValue(firstPair)
+
+++ + + + + + + + + + +
Description:Gets the 1st level of important main response fields from the VIP SOAP call and tells what fields are accessible
Note:This will not work if there was no previous call in the client.
Parameters:firstPair (string) – The first pair in the tuple field
Returns:The field value at the pair key
+
+ +
+
+getResponseFirstPairs(response)
+
+++ + + + + + + + + + +
Description:Gets the 1st level of important main response fields from the VIP SOAP call and tells what fields are accessible
Note:This requires the SOAP response as a parameter.
Parameters:response (list of tuples) – The SOAP response
Returns:list – Containing all the first pair values of each tuple
+
+ +
+
+getResponseValue(response, firstPair)
+
+++ + + + + + + + + + +
Description:

Gets the 1st level of important main response fields from the VIP SOAP call and tells what fields are accessible

+
Note:

This requires the SOAP response as a parameter.

+
Parameters:
    +
  • response (list of tuples) – The SOAP response
  • +
  • firstPair (string) – The first pair in the tuple field
  • +
+
Returns:

The field value at the pair key

+
+
+ +
+
+registerBySMS(requestId, phoneNumber, smsFrom=None, messageTemplate=None, gatewayId=None, gatewayPassword=None, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Registers the mobile phone credential for usage through SMS

+
Note:

SMS, voice, and system-generated credentials need to be registered first

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • phoneNumber (string) – The phone number credential tied to user (active) for delivering security code. It must range from 5 to 20 digits. Any appended extension must begin with lower-case ‘x’, followed by any combination of the characters: .,# and digits 0 to 9. | example: 488555444x,1112 | **comma* Creates a short delay of approximately 2 seconds. | period Creates a longer delay of approximately 5 seconds. | star Used by some phone systems to access an extension. | pound or hash Used by some phone systems to access an extension.
  • +
  • smsFrom (string) – DEPRECATED - Specifies the FROM number that is used to send an SMS message so that the message from receiver can be mapped back.
  • +
  • messageTemplate (string ???) – The text that is sent to the user’s SMS device along with security code.
  • +
  • gatewayId (string) – The user’s specified gateway Account Id
  • +
  • gatewayPassword (string) – The user’s specified gateway Account password
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+registerByServiceOtp(requestId, serviceOtpId, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Registers the phone credential for usage through a service one time password

+
Note:

SMS, voice, and system-generated credentials need to be registered first

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • serviceOtpId (string) – The id of the service’s Otp
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+registerByVoice(requestId, phoneNumber, language=None, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Registers the phone credential for usage through voice message

+
Note:

SMS, voice, and system-generated credentials need to be registered first

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • phoneNumber (string) – The phone number credential tied to user (active) for delivering security code. It must range from 5 to 20 digits. Any appended extension must begin with lower-case ‘x’, followed by any combination of the characters: .,# and digits 0 to 9. | example: 488555444x,1112 | **comma* Creates a short delay of approximately 2 seconds. | period Creates a longer delay of approximately 5 seconds. | star Used by some phone systems to access an extension. | pound or hash Used by some phone systems to access an extension.
  • +
  • language (string) – The language that the security code message is in. Only supported language is en-us
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+removeCredential(requestId, userId, credentialId, credentialType, trustedDevice=None, onBehalfOfAccountId=None)
+
+++ + + + + + + + +
Description:

Removes a credential from a user

+
Note:

If the credential is not associated with any other user, the credential is also deactivated. Also, if the device deletion policy for Remembered Devices is set to Admin Only, credentials can only be removed through VIP Manager (ERROR code: 6010).

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • credentialId (string) – Unique identifier of the credential
  • +
  • credentialType (string) – Identifies the credential type: STANDARD_OTP (hardware or software VIP credential, including VIP Access for mobile), CERTIFICATE , SMS_OTP , VOICE_OTP , SERVICE_OTP
  • +
  • trustedDevice (boolean) – Allows the device to be remembered in the credential for future easy usage
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
+
+ +
+
+sendOtpSMS(requestId, userId, phoneNumber, isGatewayAcctInfo=False, onBehalfOfAccountId=None, smsFrom=None, messageTemplate=None, gatewayId=None, gatewayPassword=None)
+
+++ + + + + + + + + + + + +
Description:

Sends a one time password to a mobile phone

+
Note:
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • phoneNumber (string) – The phone number credential tied to user (active) for delivering security code. It must range from 5 to 20 digits. Any appended extension must begin with lower-case ‘x’, followed by any combination of the characters: .,# and digits 0 to 9. | example: 488555444x,1112 | **comma* Creates a short delay of approximately 2 seconds. | period Creates a longer delay of approximately 5 seconds. | star Used by some phone systems to access an extension. | pound or hash Used by some phone systems to access an extension.
  • +
  • isGatewayAcctInfo (boolean) – Should we use a gateway?
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
  • smsFrom (string) – DEPRECATED - Specifies the FROM number that is used to send an SMS message so that the message from receiver can be mapped back.
  • +
  • messageTemplate (string ???) – The text that is sent to the user’s SMS device along with security code.
  • +
  • gatewayId (string) – The user’s specified gateway Account Id
  • +
  • gatewayPassword (string) – The user’s specified gateway Account password
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+setTemporaryPasswordAttributes(requestId, userId, expirationTime=None, oneTimeUseOnly=None, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Changes the expiration date for a temporary security code you previously set using the setTemporaryPassword()

+
Note:
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • expirationDate (dateTime) – The temporary security code expiration time (maximum of 30 days) using GMT time zone. If no date is provided, the default expiration period of 1 day is used to calculate the security code expiration.
  • +
  • oneTimeUseOnly (boolean) – If this field is set to “true”, the temporary security code expires after one use, or at the expiration date. The default value is “false”.
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+setTemporaryPasswordSMSDelivery(requestId, userId, phoneNumber, smsFrom=None, messageTemplate=None, gatewayId=None, gatewayPassword=None, temporaryPassword=None, expirationDate=None, oneTimeUseOnly=None, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + + + +
Description:

Sets a temporary security code for a user through SMS text message

+
Note_1:

Can optionally set an expiration date for the security code, or set it for one-time use only. The request requires the user ID and optionally, the temporary security code string. If you do not provide a security code, VIP User Services automatically generates one for you.

+
Note_2:

You can clear the security code with clearTemporaryPassword. Also, if a user is authenticated using a security code generated by a valid credential, VP User Services automatically clears the temporary security code.

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • phoneNumber (string) – The phone number credential tied to user (active) for delivering security code. It must range from 5 to 20 digits. Any appended extension must begin with lower-case ‘x’, followed by any combination of the characters: .,# and digits 0 to 9. | example: 488555444x,1112 | **comma* Creates a short delay of approximately 2 seconds. | period Creates a longer delay of approximately 5 seconds. | star Used by some phone systems to access an extension. | pound or hash Used by some phone systems to access an extension.
  • +
  • smsFrom (string) – DEPRECATED - Specifies the FROM number that is used to send an SMS message so that the message from receiver can be mapped back.
  • +
  • messageTemplate (string ???) – The text that is sent to the user’s SMS device along with security code.
  • +
  • gatewayId (string) – The user’s specified gateway Account Id
  • +
  • gatewayPassword (string) – The user’s specified gateway Account password
  • +
  • temporaryPassword (string) – Temporary security code is either empty or 6 numeric characters. If this field is left empty, a security code will be auto-generated for the user.
  • +
  • expirationDate (dateTime) – The temporary security code expiration time (maximum of 30 days) using GMT time zone. If no date is provided, the default expiration period of 1 day is used to calculate the security code expiration.
  • +
  • oneTimeUseOnly (boolean) – If this field is set to “true”, the temporary security code expires after one use, or at the expiration date. The default value is “false”.
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+setTemporaryPasswordVoiceDelivery(requestId, userId, phoneNumber, language=None, temporaryPassword=None, expirationDate=None, oneTimeUseOnly=None, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + + + +
Description:

Sets a temporary security code for a user through SMS Voice message

+
Note_1:

Can optionally set an expiration date for the security code, or set it for one-time use only. The request requires the user ID and optionally, the temporary security code string. If you do not provide a security code, VIP User Services automatically generates one for you.

+
Note_2:

You can clear the security code with clearTemporaryPassword. Also, if a user is authenticated using a security code generated by a valid credential, VP User Services automatically clears the temporary security code.

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • phoneNumber (string) – The phone number credential tied to user (active) for delivering security code. It must range from 5 to 20 digits. Any appended extension must begin with lower-case ‘x’, followed by any combination of the characters: .,# and digits 0 to 9. | example: 488555444x,1112 | **comma* Creates a short delay of approximately 2 seconds. | period Creates a longer delay of approximately 5 seconds. | star Used by some phone systems to access an extension. | pound or hash Used by some phone systems to access an extension.
  • +
  • language (string) – The language that the security code message is in. Only supported language is en-us
  • +
  • temporaryPassword (string) – Temporary security code is either empty or 6 numeric characters. If this field is left empty, a security code will be auto-generated for the user.
  • +
  • expirationDate (dateTime) – The temporary security code expiration time (maximum of 30 days) using GMT time zone. If no date is provided, the default expiration period of 1 day is used to calculate the security code expiration.
  • +
  • oneTimeUseOnly (boolean) – If this field is set to “true”, the temporary security code expires after one use, or at the expiration date. The default value is “false”.
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+updateCredential(requestId, userId, credentialId, credentialType, friendlyName, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Updates the friendly name of a credential

+
Note:

The updateCredential API includes unique identifiers of the request for the enterprise application, for the user, and for the credential.

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • credentialId (string) – Unique identifier of the credential
  • +
  • credentialType (string) – Identifies the credential type: STANDARD_OTP (hardware or software VIP credential, including VIP Access for mobile), CERTIFICATE , SMS_OTP , VOICE_OTP , SERVICE_OTP
  • +
  • friendlyName (string) – A user-defined name to identify the credential.
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+
+updateUser(requestId, userId, newUserId=None, newUserStatus=None, oldPin=None, newPin=None, forcePinChange=None, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Update information about an user in VIP User Services

+
Note:

Also, enables or disables a user.

+
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • newUserId (string) – Case-sensitive unique replacement ID for the user. If element isn’t provided, user ID is not changed.
  • +
  • newUserStatus (string) – New status of user: ACTIVE or DISABLED; If element is not provided, the user status is not changed.
  • +
  • oldPin (string) – The existing user PIN. If value is provided without a newPin value an error is returned. Else if the oldPin is not prvided, but a newPin value is provided, the user is updated with newPin.
  • +
  • newPin (string) – The new user PIN. If value does not meet requirements of the PIN policy, an error is returned. Else if the PIN policy has not been enabled for the user, an error is returned.
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
  • forcePinChange (boolean) – Force the PIN to expire after first use.
  • +
+
Returns:

the return SOAP response.

+
Raises:
+
+ +
+ +
+
+

Module contents

+

The Symantec Python class that handles all the Symantec VIP API SOAP calls for management services.

+
+
+ + +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/build/html/VIP_Python/symantec_package.lib.queryService.html b/docs/build/html/VIP_Python/symantec_package.lib.queryService.html new file mode 100644 index 0000000..bc3da33 --- /dev/null +++ b/docs/build/html/VIP_Python/symantec_package.lib.queryService.html @@ -0,0 +1,384 @@ + + + + + + + + symantec_package.lib.queryService package — Symantec VIP Python documentation + + + + + + + + + + + + + + + +
+
+
+
+ +
+

symantec_package.lib.queryService package

+
+

Submodules

+
+
+

symantec_package.lib.queryService.SymantecQueryServices module

+
+
+class symantec_package.lib.queryService.SymantecQueryServices.SymantecQueryServices(client)
+

Bases: object

+

This class acts as a layer of abstraction to handling all query Symantec VIP SOAP calls in Python.

+

You call this class to handle anything that is related to user info and transaction status

+

Example:

+
>>> client = Client("http://../vipuserservices-query-1.7.wsdl", transport = HTTPSClientCertTransport('vip_certificate.crt','vip_certificate.crt'))
+
+
+
>>> service = SymantecQueryServices(client)
+
+
+
>>> response = service.getUserInfo(<parameters here>)
+
+
+
>>> print (response)
+
+
+
+

Note

+

Reference HTTPHandler for further information on how to setup the client.

+
+
+
+getCredentialInfo(requestId, credentialId, credentialType='STANDARD_OTP', includePushAttributes=None, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Get detail info of a registered credential

+
Note:
Parameters:
    +
  • requestId (string) – A identifier ID of a call, may be useful for troubleshooting
  • +
  • credentialType (string) – Type of this credential
  • +
  • includePushAttributes (string) – Include push attributes in response message
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
CredentialId:

A unique identifier for every credential

+
Returns:

the return SOAP response.

+
+
+ +
+
+getFieldContent(fieldname)
+
+++ + + + + + + + + + +
Description:Get content of items in response message
Note:Works only for one line item
Parameters:fieldname (string) – Item name
Returns:The content of input fieldname
+
+ +
+
+getPreviousResponseFirstPairs()
+
+++ + + + + + + + +
Description:Gets the 1st level of important main response fields from previous VIP SOAP call and tells what fields are accessible
Note:This will not work if there was no previous call in the client.
Returns:list – Containing all the first pair values of each tuple
+
+ +
+
+getPreviousResponseValue(firstPair)
+
+++ + + + + + + + + + +
Description:Gets the 1st level of important main response fields from the VIP SOAP call and tells what fields are accessible
Note:This will not work if there was no previous call in the client.
Parameters:firstPair (string) – The first pair in the tuple field
Returns:The field value at the pair key
+
+ +
+
+getResponseFirstPairs(response)
+
+++ + + + + + + + + + +
Description:Gets the 1st level of important main response fields from the VIP SOAP call and tells what fields are accessible
Note:This requires the SOAP response as a parameter.
Parameters:response (list of tuples) – The SOAP response
Returns:list – Containing all the first pair values of each tuple
+
+ +
+
+getResponseValue(response, firstPair)
+
+++ + + + + + + + + + +
Description:

Gets the 1st level of important main response fields from the VIP SOAP call and tells what fields are accessible

+
Note:

This requires the SOAP response as a parameter.

+
Parameters:
    +
  • response (list of tuples) – The SOAP response
  • +
  • firstPair (string) – The first pair in the tuple field
  • +
+
Returns:

The field value at the pair key

+
+
+ +
+
+getServerTime(requestId, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + +
Description:

Get server time

+
Note:
Parameters:
    +
  • requestId (string) – A identifier ID of a call, may be useful for troubleshooting
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
Returns:

the return SOAP response.

+
+
+ +
+
+getTemporaryPasswordAttributes(requestId, userId, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Get associated attributes of a temporary password

+
Note:
Parameters:
    +
  • requestId (string) – A identifier ID of a call, may be useful for troubleshooting
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
UserId:

Unique userid registered in VIP

+
Returns:

the return SOAP response.

+
+
+ +
+
+getUserInfo(requestId, userId, onBehalfOfAccountId=None, iaInfo=True, includePushAttributes=True)
+
+++ + + + + + + + + + + + +
Description:

Get the account info of a VIP user

+
Note:
Parameters:
    +
  • requestId (string) – A identifier ID of a call, may be useful for troubleshooting
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
  • iaInfo (boolean) – Includes iaInfo in response message
  • +
  • includesPushAttributes (bollean) – Includes push attributes in response message
  • +
+
UserId:

Unique user id regisered on VIP

+
Returns:

the return SOAP response.

+
+
+ +
+
+pollPushStatus(requestId, transactionId, onBehalfOfAccountId=None)
+
+++ + + + + + + + + + + + +
Description:

Poll status of a sent push notification

+
Note:

It is associate with a unique transaction ID

+
Parameters:
    +
  • requestId (string) – A identifier ID of a call, may be useful for troubleshooting
  • +
  • onBehalfOfAccountId (string) – The parent account that this request is done on behalf of a child account. The parent account uses its own certificate to authenticate the request to VIP User Services.
  • +
+
TransactionId:

A unique identifier for a push transaction

+
Returns:

the return SOAP response.

+
+
+ +
+ +
+
+

Module contents

+
+
+ + +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/build/html/VIP_Python/symantec_package.lib.userService.html b/docs/build/html/VIP_Python/symantec_package.lib.userService.html new file mode 100644 index 0000000..6822cff --- /dev/null +++ b/docs/build/html/VIP_Python/symantec_package.lib.userService.html @@ -0,0 +1,319 @@ + + + + + + + + symantec_package.lib.userService package — Symantec VIP Python documentation + + + + + + + + + + + + + + + +
+
+
+
+ +
+

symantec_package.lib.userService package

+
+

Submodules

+
+
+

symantec_package.lib.userService.SymantecUserServices module

+
+
+class symantec_package.lib.userService.SymantecUserServices.SymantecUserServices(client)
+

Bases: object

+

This class acts as a layer of abstraction to handling all user services Symantec VIP SOAP calls in Python.

+

You call this class to handle anything that is related to authenticating users and credentials.

+
+
Example:
+
>>> client = Client("http://../vipuserservices-auth-1.7.wsdl", transport = HTTPSClientCertTransport('vip_certificate.crt','vip_certificate.crt'))
+>>> service = SymantecUserServices(client)
+>>> response = service.authenticateUser(<parameters here>)
+>>> print (response)
+
+
+
+
+
+

Note

+

Reference HTTPHandler for further information on how to setup the client.

+
+
+
+authenticateCredentialWithPush(requestId, credentialId, pushMessage, displayTitle=None, displayMessage=None, displayProfile=None, activate=None, authContext=None, value=None, timeout=None)
+
+++ + + + + + + + + + + + +
Description:

Authenticates a user via a Push notification using their credential ID.

+
Note:
Parameters:
    +
  • requestId (string) – A unique identifier of the request for the enterprise application. This may be useful for troubleshooting
  • +
  • userId (string) – Unique user ID (i.e.- email address, login name). Accepts 1 - 128 characters. Case-sensitive.
  • +
  • pushMessage (string) – Text of the push notification in Notification Center (iOS) or Notification Drawer (Android). Suggested maximum size 70 characters.
  • +
  • displayTitle (string) – Title of the modal. Suggested maximum size 30 characters.
  • +
  • displayMessage (string) – Text of modal. Suggested maximum size 70 characters.
  • +
  • displayProfile (string) – Indicates the login URL or profile. Suggested maximum size 60 characters.
  • +
  • activate (boolean) – Activates a credential. If otpAuthData is provided, it consumes the OTP to authenticate. If pushAuthData is used, sends a push notification to the credential for authentication.
  • +
  • authContext (string) – A map containing the parameters that control how the authentication is performed. VIP User Services accepts an authentication level for the authContext field. The authentication level defines the credential types that can be validated with this request. This level must match an authentication level configured in VIP Manager. ■ Key: Enter authLevel.level ■ Value: Enter the authentication level value (as an integer from 1 - 10).
  • +
  • value (string) – The user’s specified gateway Account password
  • +
  • timeout (string) – The user’s specified gateway Account password
  • +
+
Returns:

string – the return SOAP response.

+
Raises:
+
+ +
+
+authenticateCredentialWithSMS(requestId, credentialId_phoneNumber, securityCode, activate=None)
+
+ +
+
+authenticateCredentialWithStandard_OTP(requestId, credentialId, securityCode, activate=None)
+
+ +
+
+authenticateCredentials(requestId, credentials, otp1=None, pushAuthData=None, activate=None, authContext=None, onBehalfOfAccountId=None)
+
+ +
+
+authenticateUser(requestId, userId, otp1, otp2=None, value=None, key='authLevel.level', pin=None, onBehalfOfAccountId=None)
+
+ +
+
+authenticateUserWithPush(requestId, userId, pin=None, displayParams=None, requestParams=None, authContext=None)
+
+ +
+
+checkOtp(requestId, userId, otp1, otp2=None, value=None, key='authLevel.level', onBehalfOfAccountId=None)
+
+ +
+
+confirmRisk(requestId, UserId, EventId, VerifyMethod=None, KeyValuePair=None, onBehalfOfAccountId=None)
+
+ +
+
+denyRisk(requestId, UserId, EventId, VerifyMethod=None, IAAuthData=None, isRememberDevice=None, FriendlyName=None, KeyValuePair=None, onBehalfOfAccountId=None)
+
+ +
+
+evaluateRisk(requestId, UserId, IpAddress, UserAgent, IAAuthData=None, KeyValuePair=None, onBehalfOfAccountId=None)
+
+ +
+
+getFieldContent(fieldname)
+
+++ + + + + + + + + + +
Description:Get content of items in response message
Note:Works only for one line item
Parameters:fieldname (string) – Item name
Returns:The content of input fieldname
+
+ +
+
+getPreviousResponseFirstPairs()
+
+++ + + + + + + + +
Description:Gets the 1st level of important main response fields from previous VIP SOAP call and tells what fields are accessible
Note:This will not work if there was no previous call in the client.
Returns:list – Containing all the first pair values of each tuple
+
+ +
+
+getPreviousResponseValue(firstPair)
+
+++ + + + + + + + + + +
Description:Gets the 1st level of important main response fields from the VIP SOAP call and tells what fields are accessible
Note:This will not work if there was no previous call in the client.
Parameters:firstPair (string) – The first pair in the tuple field
Returns:The field value at the pair key
+
+ +
+
+getResponseFirstPairs(response)
+
+++ + + + + + + + + + +
Description:Gets the 1st level of important main response fields from the VIP SOAP call and tells what fields are accessible
Note:This requires the SOAP response as a parameter.
Parameters:response (list of tuples) – The SOAP response
Returns:list – Containing all the first pair values of each tuple
+
+ +
+
+getResponseValue(response, firstPair)
+
+++ + + + + + + + + + +
Description:

Gets the 1st level of important main response fields from the VIP SOAP call and tells what fields are accessible

+
Note:

This requires the SOAP response as a parameter.

+
Parameters:
    +
  • response (list of tuples) – The SOAP response
  • +
  • firstPair (string) – The first pair in the tuple field
  • +
+
Returns:

The field value at the pair key

+
+
+ +
+ +
+
+

Module contents

+
+
+ + +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/build/html/_sources/VIP_Python/modules.rst.txt b/docs/build/html/_sources/VIP_Python/modules.rst.txt new file mode 100644 index 0000000..6b315ec --- /dev/null +++ b/docs/build/html/_sources/VIP_Python/modules.rst.txt @@ -0,0 +1,7 @@ +symantec_package +================ + +.. toctree:: + :maxdepth: 4 + + symantec_package diff --git a/docs/build/html/_sources/VIP_Python/symantec_package.lib.allServices.rst.txt b/docs/build/html/_sources/VIP_Python/symantec_package.lib.allServices.rst.txt new file mode 100644 index 0000000..b66a78f --- /dev/null +++ b/docs/build/html/_sources/VIP_Python/symantec_package.lib.allServices.rst.txt @@ -0,0 +1,22 @@ +symantec_package.lib.allServices package +======================================== + +Submodules +---------- + +symantec_package.lib.allServices.SymantecServices module +-------------------------------------------------------- + +.. automodule:: symantec_package.lib.allServices.SymantecServices + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: symantec_package.lib.allServices + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/build/html/_sources/VIP_Python/symantec_package.lib.managementService.rst.txt b/docs/build/html/_sources/VIP_Python/symantec_package.lib.managementService.rst.txt new file mode 100644 index 0000000..b137c9c --- /dev/null +++ b/docs/build/html/_sources/VIP_Python/symantec_package.lib.managementService.rst.txt @@ -0,0 +1,22 @@ +symantec_package.lib.managementService package +============================================== + +Submodules +---------- + +symantec_package.lib.managementService.SymantecManagementServices module +------------------------------------------------------------------------ + +.. automodule:: symantec_package.lib.managementService.SymantecManagementServices + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: symantec_package.lib.managementService + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/build/html/_sources/VIP_Python/symantec_package.lib.queryService.rst.txt b/docs/build/html/_sources/VIP_Python/symantec_package.lib.queryService.rst.txt new file mode 100644 index 0000000..31c0e4f --- /dev/null +++ b/docs/build/html/_sources/VIP_Python/symantec_package.lib.queryService.rst.txt @@ -0,0 +1,22 @@ +symantec_package.lib.queryService package +========================================= + +Submodules +---------- + +symantec_package.lib.queryService.SymantecQueryServices module +-------------------------------------------------------------- + +.. automodule:: symantec_package.lib.queryService.SymantecQueryServices + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: symantec_package.lib.queryService + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/build/html/_sources/VIP_Python/symantec_package.lib.rst.txt b/docs/build/html/_sources/VIP_Python/symantec_package.lib.rst.txt new file mode 100644 index 0000000..ba7d0a0 --- /dev/null +++ b/docs/build/html/_sources/VIP_Python/symantec_package.lib.rst.txt @@ -0,0 +1,20 @@ +symantec_package.lib package +============================ + +Subpackages +----------- + +.. toctree:: + + symantec_package.lib.allServices + symantec_package.lib.managementService + symantec_package.lib.queryService + symantec_package.lib.userService + +Module contents +--------------- + +.. automodule:: symantec_package.lib + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/build/html/_sources/VIP_Python/symantec_package.lib.userService.rst.txt b/docs/build/html/_sources/VIP_Python/symantec_package.lib.userService.rst.txt new file mode 100644 index 0000000..7df277c --- /dev/null +++ b/docs/build/html/_sources/VIP_Python/symantec_package.lib.userService.rst.txt @@ -0,0 +1,22 @@ +symantec_package.lib.userService package +======================================== + +Submodules +---------- + +symantec_package.lib.userService.SymantecUserServices module +------------------------------------------------------------ + +.. automodule:: symantec_package.lib.userService.SymantecUserServices + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: symantec_package.lib.userService + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/build/html/_sources/VIP_Python/symantec_package.rst.txt b/docs/build/html/_sources/VIP_Python/symantec_package.rst.txt new file mode 100644 index 0000000..13d38cc --- /dev/null +++ b/docs/build/html/_sources/VIP_Python/symantec_package.rst.txt @@ -0,0 +1,37 @@ +symantec_package package +======================== + +Subpackages +----------- + +.. toctree:: + + symantec_package.lib + +Submodules +---------- + +symantec_package.HTTPHandler module +----------------------------------- + +.. automodule:: symantec_package.HTTPHandler + :members: + :undoc-members: + :show-inheritance: + +symantec_package.soap-play module +--------------------------------- + +.. automodule:: symantec_package.soap-play + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: symantec_package + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/build/html/_sources/index.rst.txt b/docs/build/html/_sources/index.rst.txt new file mode 100644 index 0000000..c42a037 --- /dev/null +++ b/docs/build/html/_sources/index.rst.txt @@ -0,0 +1,20 @@ +.. Symantec VIP Python documentation master file, created by + sphinx-quickstart on Tue Oct 25 19:34:43 2016. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Symantec VIP Python's documentation! +=============================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/build/html/_static/ajax-loader.gif b/docs/build/html/_static/ajax-loader.gif new file mode 100644 index 0000000..61faf8c Binary files /dev/null and b/docs/build/html/_static/ajax-loader.gif differ diff --git a/docs/build/html/_static/alabaster.css b/docs/build/html/_static/alabaster.css new file mode 100644 index 0000000..a88ce29 --- /dev/null +++ b/docs/build/html/_static/alabaster.css @@ -0,0 +1,693 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro', serif; + font-size: 17px; + background-color: #fff; + color: #000; + margin: 0; + padding: 0; +} + + +div.document { + width: 940px; + margin: 30px auto 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 220px; +} + +div.sphinxsidebar { + width: 220px; + font-size: 14px; + line-height: 1.5; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #fff; + color: #3E4349; + padding: 0 30px 0 30px; +} + +div.body > .section { + text-align: left; +} + +div.footer { + width: 940px; + margin: 20px auto 30px auto; + font-size: 14px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + +p.caption { + font-family: inherit; + font-size: inherit; +} + + +div.relations { + display: none; +} + + +div.sphinxsidebar a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #999; +} + +div.sphinxsidebar a:hover { + border-bottom: 1px solid #999; +} + +div.sphinxsidebarwrapper { + padding: 18px 10px; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0; + margin: -10px 0 0 0px; + text-align: center; +} + +div.sphinxsidebarwrapper h1.logo { + margin-top: -10px; + text-align: center; + margin-bottom: 5px; + text-align: left; +} + +div.sphinxsidebarwrapper h1.logo-name { + margin-top: 0px; +} + +div.sphinxsidebarwrapper p.blurb { + margin-top: 0; + font-style: normal; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: 'Garamond', 'Georgia', serif; + color: #444; + font-size: 24px; + font-weight: normal; + margin: 0 0 5px 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-size: 20px; +} + +div.sphinxsidebar h3 a { + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p { + color: #555; + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; + color: #000; +} + +div.sphinxsidebar ul li.toctree-l1 > a { + font-size: 120%; +} + +div.sphinxsidebar ul li.toctree-l2 > a { + font-size: 110%; +} + +div.sphinxsidebar input { + border: 1px solid #CCC; + font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro', serif; + font-size: 1em; +} + +div.sphinxsidebar hr { + border: none; + height: 1px; + color: #AAA; + background: #AAA; + + text-align: left; + margin-left: 0; + width: 50%; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Garamond', 'Georgia', serif; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #DDD; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #EAEAEA; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + margin: 20px 0px; + padding: 10px 30px; + background-color: #EEE; + border: 1px solid #CCC; +} + +div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { + background-color: ; + border-bottom: 1px solid #fafafa; +} + +dd div.admonition { + margin-left: -60px; + padding-left: 60px; +} + +div.admonition p.admonition-title { + font-family: 'Garamond', 'Georgia', serif; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +div.highlight { + background-color: #fff; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.warning { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.danger { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.error { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.caution { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.attention { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.important { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.note { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.tip { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.hint { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.seealso { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.topic { + background-color: #EEE; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt, code { + font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.9em; +} + +.hll { + background-color: #FFC; + margin: 0 -12px; + padding: 0 12px; + display: block; +} + +img.screenshot { +} + +tt.descname, tt.descclassname, code.descname, code.descclassname { + font-size: 0.95em; +} + +tt.descname, code.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #EEE; + background: #FDFDFD; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.field-list p { + margin-bottom: 0.8em; +} + +table.footnote td.label { + width: .1px; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +dl { + margin: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + /* Matches the 30px from the narrow-screen "li > ul" selector below */ + margin: 10px 0 10px 30px; + padding: 0; +} + +pre { + background: #EEE; + padding: 7px 30px; + margin: 15px 0px; + line-height: 1.3em; +} + +div.viewcode-block:target { + background: #ffd; +} + +dl pre, blockquote pre, li pre { + margin-left: 0; + padding-left: 30px; +} + +dl dl pre { + margin-left: -90px; + padding-left: 90px; +} + +tt, code { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, code.xref, a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fff; +} + +a.reference { + text-decoration: none; + border-bottom: 1px dotted #004B6B; +} + +/* Don't put an underline on images */ +a.image-reference, a.image-reference:hover { + border-bottom: none; +} + +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + +a.footnote-reference { + text-decoration: none; + font-size: 0.7em; + vertical-align: top; + border-bottom: 1px dotted #004B6B; +} + +a.footnote-reference:hover { + border-bottom: 1px solid #6D4100; +} + +a:hover tt, a:hover code { + background: #EEE; +} + + +@media screen and (max-width: 870px) { + + div.sphinxsidebar { + display: none; + } + + div.document { + width: 100%; + + } + + div.documentwrapper { + margin-left: 0; + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + } + + div.bodywrapper { + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + margin-left: 0; + } + + ul { + margin-left: 0; + } + + li > ul { + /* Matches the 30px from the "ul, ol" selector above */ + margin-left: 30px; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .bodywrapper { + margin: 0; + } + + .footer { + width: auto; + } + + .github { + display: none; + } + + + +} + + + +@media screen and (max-width: 875px) { + + body { + margin: 0; + padding: 20px 30px; + } + + div.documentwrapper { + float: none; + background: #fff; + } + + div.sphinxsidebar { + display: block; + float: none; + width: 102.5%; + margin: 50px -30px -20px -30px; + padding: 10px 20px; + background: #333; + color: #FFF; + } + + div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, + div.sphinxsidebar h3 a { + color: #fff; + } + + div.sphinxsidebar a { + color: #AAA; + } + + div.sphinxsidebar p.logo { + display: none; + } + + div.document { + width: 100%; + margin: 0; + } + + div.footer { + display: none; + } + + div.bodywrapper { + margin: 0; + } + + div.body { + min-height: 0; + padding: 0; + } + + .rtd_doc_footer { + display: none; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .footer { + width: auto; + } + + .github { + display: none; + } +} + + +/* misc. */ + +.revsys-inline { + display: none!important; +} + +/* Make nested-list/multi-paragraph items look better in Releases changelog + * pages. Without this, docutils' magical list fuckery causes inconsistent + * formatting between different release sub-lists. + */ +div#changelog > div.section > ul > li > p:only-child { + margin-bottom: 0; +} + +/* Hide fugly table cell borders in ..bibliography:: directive output */ +table.docutils.citation, table.docutils.citation td, table.docutils.citation th { + border: none; + /* Below needed in some edge cases; if not applied, bottom shadows appear */ + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} \ No newline at end of file diff --git a/docs/build/html/_static/basic.css b/docs/build/html/_static/basic.css new file mode 100644 index 0000000..8291f0a --- /dev/null +++ b/docs/build/html/_static/basic.css @@ -0,0 +1,610 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox input[type="text"] { + width: 170px; +} + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px 7px 0 7px; + background-color: #ffe; + width: 40%; + float: right; +} + +p.sidebar-title { + font-weight: bold; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dl { + margin-bottom: 0; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + border: 0; + border-collapse: collapse; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +dl { + margin-bottom: 15px; +} + +dd p { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dt:target, .highlighted { + background-color: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +div.code-block-caption { + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +div.code-block-caption + div > div.highlight > pre { + margin-top: 0; +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + padding: 1em 1em 0; +} + +div.literal-block-wrapper div.highlight { + margin: 0; +} + +code.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +code.descclassname { + background-color: transparent; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: relative; + left: 0px; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/build/html/_static/classic.css b/docs/build/html/_static/classic.css new file mode 100644 index 0000000..9e9d383 --- /dev/null +++ b/docs/build/html/_static/classic.css @@ -0,0 +1,266 @@ +/* + * classic.css_t + * ~~~~~~~~~~~~~ + * + * Sphinx stylesheet -- classic theme. + * + * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: sans-serif; + font-size: 100%; + background-color: #11303d; + color: #000; + margin: 0; + padding: 0; +} + +div.document { + background-color: #1c4e63; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +div.body { + background-color: #ffffff; + color: #000000; + padding: 0 20px 30px 20px; +} + +div.footer { + color: #ffffff; + width: 100%; + padding: 9px 0 9px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: #ffffff; + text-decoration: underline; +} + +div.related { + background-color: black; + line-height: 30px; + color: #ffffff; +} + +div.related a { + color: #ffffff; +} + +div.sphinxsidebar { +} + +div.sphinxsidebar h3 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.4em; + font-weight: normal; + margin: 0; + padding: 0; +} + +div.sphinxsidebar h3 a { + color: #ffffff; +} + +div.sphinxsidebar h4 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.3em; + font-weight: normal; + margin: 5px 0 0 0; + padding: 0; +} + +div.sphinxsidebar p { + color: #ffffff; +} + +div.sphinxsidebar p.topless { + margin: 5px 10px 10px 10px; +} + +div.sphinxsidebar ul { + margin: 10px; + padding: 0; + color: #ffffff; +} + +div.sphinxsidebar a { + color: #98dbcc; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + + +/* for collapsible sidebar */ +div#sidebarbutton { + background-color: #3c6e83; +} + + +/* -- hyperlink styles ------------------------------------------------------ */ + +a { + color: #355f7c; + text-decoration: none; +} + +a:visited { + color: #355f7c; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + + + +/* -- body styles ----------------------------------------------------------- */ + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Trebuchet MS', sans-serif; + background-color: #f2f2f2; + font-weight: normal; + color: #20435c; + border-bottom: 1px solid #ccc; + margin: 20px -20px 10px -20px; + padding: 3px 0 3px 10px; +} + +div.body h1 { margin-top: 0; font-size: 200%; } +div.body h2 { font-size: 160%; } +div.body h3 { font-size: 140%; } +div.body h4 { font-size: 120%; } +div.body h5 { font-size: 110%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + text-align: justify; + line-height: 130%; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.admonition p { + margin-bottom: 5px; +} + +div.admonition pre { + margin-bottom: 5px; +} + +div.admonition ul, div.admonition ol { + margin-bottom: 5px; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre { + padding: 5px; + background-color: #eeffcc; + color: #333333; + line-height: 120%; + border: 1px solid #ac9; + border-left: none; + border-right: none; +} + +code { + background-color: #ecf0f3; + padding: 0 1px 0 1px; + font-size: 0.95em; +} + +th { + background-color: #ede; +} + +.warning code { + background: #efc2c2; +} + +.note code { + background: #d6d6d6; +} + +.viewcode-back { + font-family: sans-serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} + +div.code-block-caption { + color: #efefef; + background-color: #1c4e63; +} \ No newline at end of file diff --git a/docs/build/html/_static/comment-bright.png b/docs/build/html/_static/comment-bright.png new file mode 100644 index 0000000..15e27ed Binary files /dev/null and b/docs/build/html/_static/comment-bright.png differ diff --git a/docs/build/html/_static/comment-close.png b/docs/build/html/_static/comment-close.png new file mode 100644 index 0000000..4d91bcf Binary files /dev/null and b/docs/build/html/_static/comment-close.png differ diff --git a/docs/build/html/_static/comment.png b/docs/build/html/_static/comment.png new file mode 100644 index 0000000..dfbc0cb Binary files /dev/null and b/docs/build/html/_static/comment.png differ diff --git a/docs/build/html/_static/custom.css b/docs/build/html/_static/custom.css new file mode 100644 index 0000000..2a924f1 --- /dev/null +++ b/docs/build/html/_static/custom.css @@ -0,0 +1 @@ +/* This file intentionally left blank. */ diff --git a/docs/build/html/_static/doctools.js b/docs/build/html/_static/doctools.js new file mode 100644 index 0000000..8163495 --- /dev/null +++ b/docs/build/html/_static/doctools.js @@ -0,0 +1,287 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for all documentation. + * + * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", + "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", + "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +} + */ + +/** + * small helper function to urldecode strings + */ +jQuery.urldecode = function(x) { + return decodeURIComponent(x).replace(/\+/g, ' '); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s == 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node) { + if (node.nodeType == 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { + var span = document.createElement("span"); + span.className = className; + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this); + }); + } + } + return this.each(function() { + highlight(this); + }); +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated == 'undefined') + return string; + return (typeof translated == 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated == 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + if (!body.length) { + body = $('body'); + } + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) == 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this == '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + }, + + initOnKeyListeners: function() { + $(document).keyup(function(event) { + var activeElementType = document.activeElement.tagName; + // don't navigate when in search box or textarea + if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { + switch (event.keyCode) { + case 37: // left + var prevHref = $('link[rel="prev"]').prop('href'); + if (prevHref) { + window.location.href = prevHref; + return false; + } + case 39: // right + var nextHref = $('link[rel="next"]').prop('href'); + if (nextHref) { + window.location.href = nextHref; + return false; + } + } + } + }); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); \ No newline at end of file diff --git a/docs/build/html/_static/down-pressed.png b/docs/build/html/_static/down-pressed.png new file mode 100644 index 0000000..5756c8c Binary files /dev/null and b/docs/build/html/_static/down-pressed.png differ diff --git a/docs/build/html/_static/down.png b/docs/build/html/_static/down.png new file mode 100644 index 0000000..1b3bdad Binary files /dev/null and b/docs/build/html/_static/down.png differ diff --git a/docs/build/html/_static/file.png b/docs/build/html/_static/file.png new file mode 100644 index 0000000..a858a41 Binary files /dev/null and b/docs/build/html/_static/file.png differ diff --git a/docs/build/html/_static/jquery-3.1.0.js b/docs/build/html/_static/jquery-3.1.0.js new file mode 100644 index 0000000..f2fc274 --- /dev/null +++ b/docs/build/html/_static/jquery-3.1.0.js @@ -0,0 +1,10074 @@ +/*eslint-disable no-unused-vars*/ +/*! + * jQuery JavaScript Library v3.1.0 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2016-07-07T21:44Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var document = window.document; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var concat = arr.concat; + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + + + + function DOMEval( code, doc ) { + doc = doc || document; + + var script = doc.createElement( "script" ); + + script.text = code; + doc.head.appendChild( script ).parentNode.removeChild( script ); + } +/* global Symbol */ +// Defining this global in .eslintrc would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.1.0", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android <=4.0 only + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = jQuery.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isArray: Array.isArray, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + + // As of jQuery 3.0, isNumeric is limited to + // strings and numbers (primitives or objects) + // that can be coerced to finite numbers (gh-2662) + var type = jQuery.type( obj ); + return ( type === "number" || type === "string" ) && + + // parseFloat NaNs numeric-cast false positives ("") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + !isNaN( obj - parseFloat( obj ) ); + }, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + + /* eslint-disable no-unused-vars */ + // See https://github.com/eslint/eslint/issues/6125 + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + DOMEval( code ); + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE <=9 - 11, Edge 12 - 13 + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android <=4.0 only + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.0 + * https://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-01-04 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + disabledAncestor = addCombinator( + function( elem ) { + return elem.disabled === true; + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[i] = "#" + nid + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement("fieldset"); + + try { + return !!fn( el ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + // Known :disabled false positives: + // IE: *[disabled]:not(button, input, select, textarea, optgroup, option, menuitem, fieldset) + // not IE: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Check form elements and option elements for explicit disabling + return "label" in elem && elem.disabled === disabled || + "form" in elem && elem.disabled === disabled || + + // Check non-disabled form elements for fieldset[disabled] ancestors + "form" in elem && elem.disabled === false && ( + // Support: IE6-11+ + // Ancestry is covered for us + elem.isDisabled === disabled || + + // Otherwise, assume any non-