summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobThree <rob@devcorner.nl>2017-02-17 12:15:17 +0100
committerRobThree <rob@devcorner.nl>2017-02-17 12:15:17 +0100
commit178c60d94742f26853aeb79443dbb2e5b1d5aaa2 (patch)
tree098e6f37669ae7cf0abcfc079f7e5baeb354ab2c
parentb3bb9685eaa8317c15715d35f0f86b251c2dc756 (diff)
downloadTwoFactorAuth-178c60d94742f26853aeb79443dbb2e5b1d5aaa2.zip
TwoFactorAuth-178c60d94742f26853aeb79443dbb2e5b1d5aaa2.tar.gz
TwoFactorAuth-178c60d94742f26853aeb79443dbb2e5b1d5aaa2.tar.bz2
* Redo #15 which somehow didn't merge...
-rw-r--r--.gitignore3
-rw-r--r--.vs/config/applicationhost.config1031
-rw-r--r--TwoFactorAuth.phpproj2
-rw-r--r--composer.lock980
-rw-r--r--lib/Providers/Qr/QRException.php10
-rw-r--r--lib/Providers/Rng/RNGException.php10
-rw-r--r--lib/TwoFactorAuth.php159
-rw-r--r--lib/TwoFactorAuthException.php10
-rw-r--r--tests/TwoFactorAuthTest.php16
9 files changed, 2107 insertions, 114 deletions
diff --git a/.gitignore b/.gitignore
index fd5204b..1a31666 100644
--- a/.gitignore
+++ b/.gitignore
@@ -181,3 +181,6 @@ UpgradeLog*.htm
# Microsoft Fakes
FakesAssemblies/
+
+# Composer
+/vendor \ No newline at end of file
diff --git a/.vs/config/applicationhost.config b/.vs/config/applicationhost.config
new file mode 100644
index 0000000..4b9bf47
--- /dev/null
+++ b/.vs/config/applicationhost.config
@@ -0,0 +1,1031 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ IIS configuration sections.
+
+ For schema documentation, see
+ %IIS_BIN%\config\schema\IIS_schema.xml.
+
+ Please make a backup of this file before making any changes to it.
+
+ NOTE: The following environment variables are available to be used
+ within this file and are understood by the IIS Express.
+
+ %IIS_USER_HOME% - The IIS Express home directory for the user
+ %IIS_SITES_HOME% - The default home directory for sites
+ %IIS_BIN% - The location of the IIS Express binaries
+ %SYSTEMDRIVE% - The drive letter of %IIS_BIN%
+
+-->
+<configuration>
+
+ <!--
+
+ The <configSections> section controls the registration of sections.
+ Section is the basic unit of deployment, locking, searching and
+ containment for configuration settings.
+
+ Every section belongs to one section group.
+ A section group is a container of logically-related sections.
+
+ Sections cannot be nested.
+ Section groups may be nested.
+
+ <section
+ name="" [Required, Collection Key] [XML name of the section]
+ allowDefinition="Everywhere" [MachineOnly|MachineToApplication|AppHostOnly|Everywhere] [Level where it can be set]
+ overrideModeDefault="Allow" [Allow|Deny] [Default delegation mode]
+ allowLocation="true" [true|false] [Allowed in location tags]
+ />
+
+ The recommended way to unlock sections is by using a location tag:
+ <location path="Default Web Site" overrideMode="Allow">
+ <system.webServer>
+ <asp />
+ </system.webServer>
+ </location>
+
+ -->
+ <configSections>
+ <sectionGroup name="system.applicationHost">
+ <section name="applicationPools" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="configHistory" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="customMetadata" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="listenerAdapters" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="log" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="serviceAutoStartProviders" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="sites" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="webLimits" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ </sectionGroup>
+
+ <sectionGroup name="system.webServer">
+ <section name="asp" overrideModeDefault="Deny" />
+ <section name="caching" overrideModeDefault="Allow" />
+ <section name="cgi" overrideModeDefault="Deny" />
+ <section name="defaultDocument" overrideModeDefault="Allow" />
+ <section name="directoryBrowse" overrideModeDefault="Allow" />
+ <section name="fastCgi" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="globalModules" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="handlers" overrideModeDefault="Deny" />
+ <section name="httpCompression" overrideModeDefault="Allow" />
+ <section name="httpErrors" overrideModeDefault="Allow" />
+ <section name="httpLogging" overrideModeDefault="Deny" />
+ <section name="httpProtocol" overrideModeDefault="Allow" />
+ <section name="httpRedirect" overrideModeDefault="Allow" />
+ <section name="httpTracing" overrideModeDefault="Deny" />
+ <section name="isapiFilters" allowDefinition="MachineToApplication" overrideModeDefault="Deny" />
+ <section name="modules" allowDefinition="MachineToApplication" overrideModeDefault="Deny" />
+ <section name="applicationInitialization" allowDefinition="MachineToApplication" overrideModeDefault="Allow" />
+ <section name="odbcLogging" overrideModeDefault="Deny" />
+ <sectionGroup name="security">
+ <section name="access" overrideModeDefault="Deny" />
+ <section name="applicationDependencies" overrideModeDefault="Deny" />
+ <sectionGroup name="authentication">
+ <section name="anonymousAuthentication" overrideModeDefault="Deny" />
+ <section name="basicAuthentication" overrideModeDefault="Deny" />
+ <section name="clientCertificateMappingAuthentication" overrideModeDefault="Deny" />
+ <section name="digestAuthentication" overrideModeDefault="Deny" />
+ <section name="iisClientCertificateMappingAuthentication" overrideModeDefault="Deny" />
+ <section name="windowsAuthentication" overrideModeDefault="Deny" />
+ </sectionGroup>
+ <section name="authorization" overrideModeDefault="Allow" />
+ <section name="ipSecurity" overrideModeDefault="Deny" />
+ <section name="dynamicIpSecurity" overrideModeDefault="Deny" />
+ <section name="isapiCgiRestriction" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="requestFiltering" overrideModeDefault="Allow" />
+ </sectionGroup>
+ <section name="serverRuntime" overrideModeDefault="Deny" />
+ <section name="serverSideInclude" overrideModeDefault="Deny" />
+ <section name="staticContent" overrideModeDefault="Allow" />
+ <sectionGroup name="tracing">
+ <section name="traceFailedRequests" overrideModeDefault="Allow" />
+ <section name="traceProviderDefinitions" overrideModeDefault="Deny" />
+ </sectionGroup>
+ <section name="urlCompression" overrideModeDefault="Allow" />
+ <section name="validation" overrideModeDefault="Allow" />
+ <sectionGroup name="webdav">
+ <section name="globalSettings" overrideModeDefault="Deny" />
+ <section name="authoring" overrideModeDefault="Deny" />
+ <section name="authoringRules" overrideModeDefault="Deny" />
+ </sectionGroup>
+ <sectionGroup name="rewrite">
+ <section name="allowedServerVariables" overrideModeDefault="Deny" />
+ <section name="rules" overrideModeDefault="Allow" />
+ <section name="outboundRules" overrideModeDefault="Allow" />
+ <section name="globalRules" overrideModeDefault="Deny" allowDefinition="AppHostOnly" />
+ <section name="providers" overrideModeDefault="Allow" />
+ <section name="rewriteMaps" overrideModeDefault="Allow" />
+ </sectionGroup>
+ <section name="webSocket" overrideModeDefault="Deny" />
+ <section name="aspNetCore" overrideModeDefault="Allow" /></sectionGroup>
+ </configSections>
+
+ <configProtectedData>
+ <providers>
+ <add name="IISWASOnlyRsaProvider" type="" description="Uses RsaCryptoServiceProvider to encrypt and decrypt" keyContainerName="iisWasKey" cspProviderName="" useMachineContainer="true" useOAEP="false" />
+ <add name="AesProvider" type="Microsoft.ApplicationHost.AesProtectedConfigurationProvider" description="Uses an AES session key to encrypt and decrypt" keyContainerName="iisConfigurationKey" cspProviderName="" useOAEP="false" useMachineContainer="true" sessionKey="AQIAAA5mAAAApAAAKmFQvWHDEETRz8l2bjZlRxIkwcqTFaCUnCLljn3Q1OkesrhEO9YyLyx4bUhsj1/DyShAv7OAFFhXlrlomaornnk5PLeyO4lIXxaiT33yOFUUgxDx4GSaygkqghVV0tO5yQ/XguUBp2juMfZyztnsNa4pLcz7ZNZQ6p4yn9hxwNs=" />
+ <add name="IISWASOnlyAesProvider" type="Microsoft.ApplicationHost.AesProtectedConfigurationProvider" description="Uses an AES session key to encrypt and decrypt" keyContainerName="iisWasKey" cspProviderName="" useOAEP="false" useMachineContainer="true" sessionKey="AQIAAA5mAAAApAAA4WoiRJ8KHwzAG8AgejPxEOO4/2Vhkolbwo/8gZeNdUDSD36m55hWv4uC9tr/MlKdnwRLL0NhT50Gccyftqz5xTZ0dg5FtvQhTw/he1NwexTKbV+I4Zrd+sZUqHZTsr7JiEr6OHGXL70qoISW5G2m9U8wKT3caPiDPNj2aAaYPLo=" />
+ </providers>
+ </configProtectedData>
+
+ <system.applicationHost>
+
+ <applicationPools>
+ <add name="Clr4IntegratedAppPool" managedRuntimeVersion="v4.0" managedPipelineMode="Integrated" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" />
+ <add name="Clr4ClassicAppPool" managedRuntimeVersion="v4.0" managedPipelineMode="Classic" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" />
+ <add name="Clr2IntegratedAppPool" managedRuntimeVersion="v2.0" managedPipelineMode="Integrated" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" />
+ <add name="Clr2ClassicAppPool" managedRuntimeVersion="v2.0" managedPipelineMode="Classic" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" />
+ <add name="UnmanagedClassicAppPool" managedRuntimeVersion="" managedPipelineMode="Classic" autoStart="true" />
+ <applicationPoolDefaults managedRuntimeLoader="v4.0">
+ <processModel />
+ </applicationPoolDefaults>
+ </applicationPools>
+
+ <!--
+
+ The <listenerAdapters> section defines the protocols with which the
+ Windows Process Activation Service (WAS) binds.
+
+ -->
+ <listenerAdapters>
+ <add name="http" />
+ </listenerAdapters>
+
+ <sites>
+ <site name="WebSite1" id="1" serverAutoStart="true">
+ <application path="/">
+ <virtualDirectory path="/" physicalPath="%IIS_SITES_HOME%\WebSite1" />
+ </application>
+ <bindings>
+ <binding protocol="http" bindingInformation=":8080:localhost" />
+ </bindings>
+ </site>
+ <siteDefaults>
+ <logFile logFormat="W3C" directory="%IIS_USER_HOME%\Logs" />
+ <traceFailedRequestsLogging directory="%IIS_USER_HOME%\TraceLogFiles" enabled="true" maxLogFileSizeKB="1024" />
+ </siteDefaults>
+ <applicationDefaults applicationPool="Clr4IntegratedAppPool" />
+ <virtualDirectoryDefaults allowSubDirConfig="true" />
+ </sites>
+
+ <webLimits />
+
+ </system.applicationHost>
+
+ <system.webServer>
+
+ <serverRuntime />
+
+ <asp scriptErrorSentToBrowser="true">
+ <cache diskTemplateCacheDirectory="%TEMP%\iisexpress\ASP Compiled Templates" />
+ <limits />
+ </asp>
+
+ <caching enabled="true" enableKernelCache="true">
+ </caching>
+
+ <cgi />
+
+ <defaultDocument enabled="true">
+ <files>
+ <add value="Default.htm" />
+ <add value="Default.asp" />
+ <add value="index.htm" />
+ <add value="index.html" />
+ <add value="iisstart.htm" />
+ <add value="default.aspx" />
+ </files>
+ </defaultDocument>
+
+ <directoryBrowse enabled="false" />
+
+ <fastCgi />
+
+ <!--
+
+ The <globalModules> section defines all native-code modules.
+ To enable a module, specify it in the <modules> section.
+
+ -->
+ <globalModules>
+ <add name="HttpLoggingModule" image="%IIS_BIN%\loghttp.dll" />
+ <add name="UriCacheModule" image="%IIS_BIN%\cachuri.dll" />
+<!-- <add name="FileCacheModule" image="%IIS_BIN%\cachfile.dll" /> -->
+ <add name="TokenCacheModule" image="%IIS_BIN%\cachtokn.dll" />
+<!-- <add name="HttpCacheModule" image="%IIS_BIN%\cachhttp.dll" /> -->
+ <add name="DynamicCompressionModule" image="%IIS_BIN%\compdyn.dll" />
+ <add name="StaticCompressionModule" image="%IIS_BIN%\compstat.dll" />
+ <add name="DefaultDocumentModule" image="%IIS_BIN%\defdoc.dll" />
+ <add name="DirectoryListingModule" image="%IIS_BIN%\dirlist.dll" />
+ <add name="ProtocolSupportModule" image="%IIS_BIN%\protsup.dll" />
+ <add name="HttpRedirectionModule" image="%IIS_BIN%\redirect.dll" />
+ <add name="ServerSideIncludeModule" image="%IIS_BIN%\iis_ssi.dll" />
+ <add name="StaticFileModule" image="%IIS_BIN%\static.dll" />
+ <add name="AnonymousAuthenticationModule" image="%IIS_BIN%\authanon.dll" />
+ <add name="CertificateMappingAuthenticationModule" image="%IIS_BIN%\authcert.dll" />
+ <add name="UrlAuthorizationModule" image="%IIS_BIN%\urlauthz.dll" />
+ <add name="BasicAuthenticationModule" image="%IIS_BIN%\authbas.dll" />
+ <add name="WindowsAuthenticationModule" image="%IIS_BIN%\authsspi.dll" />
+<!-- <add name="DigestAuthenticationModule" image="%IIS_BIN%\authmd5.dll" /> -->
+ <add name="IISCertificateMappingAuthenticationModule" image="%IIS_BIN%\authmap.dll" />
+ <add name="IpRestrictionModule" image="%IIS_BIN%\iprestr.dll" />
+ <add name="DynamicIpRestrictionModule" image="%IIS_BIN%\diprestr.dll" />
+ <add name="RequestFilteringModule" image="%IIS_BIN%\modrqflt.dll" />
+ <add name="CustomLoggingModule" image="%IIS_BIN%\logcust.dll" />
+ <add name="CustomErrorModule" image="%IIS_BIN%\custerr.dll" />
+<!-- <add name="TracingModule" image="%IIS_BIN%\iisetw.dll" /> -->
+ <add name="FailedRequestsTracingModule" image="%IIS_BIN%\iisfreb.dll" />
+ <add name="RequestMonitorModule" image="%IIS_BIN%\iisreqs.dll" />
+ <add name="IsapiModule" image="%IIS_BIN%\isapi.dll" />
+ <add name="IsapiFilterModule" image="%IIS_BIN%\filter.dll" />
+ <add name="CgiModule" image="%IIS_BIN%\cgi.dll" />
+ <add name="FastCgiModule" image="%IIS_BIN%\iisfcgi.dll" />
+<!-- <add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" /> -->
+ <add name="RewriteModule" image="%IIS_BIN%\rewrite.dll" />
+ <add name="ConfigurationValidationModule" image="%IIS_BIN%\validcfg.dll" />
+ <add name="WebSocketModule" image="%IIS_BIN%\iiswsock.dll" />
+ <add name="WebMatrixSupportModule" image="%IIS_BIN%\webmatrixsup.dll" />
+ <add name="ManagedEngine" image="%windir%\Microsoft.NET\Framework\v2.0.50727\webengine.dll" preCondition="integratedMode,runtimeVersionv2.0,bitness32" />
+ <add name="ManagedEngine64" image="%windir%\Microsoft.NET\Framework64\v2.0.50727\webengine.dll" preCondition="integratedMode,runtimeVersionv2.0,bitness64" />
+ <add name="ManagedEngineV4.0_32bit" image="%windir%\Microsoft.NET\Framework\v4.0.30319\webengine4.dll" preCondition="integratedMode,runtimeVersionv4.0,bitness32" />
+ <add name="ManagedEngineV4.0_64bit" image="%windir%\Microsoft.NET\Framework64\v4.0.30319\webengine4.dll" preCondition="integratedMode,runtimeVersionv4.0,bitness64" />
+ <add name="ApplicationInitializationModule" image="%IIS_BIN%\warmup.dll" />
+ <add name="AspNetCoreModule" image="%IIS_BIN%\aspnetcore.dll" />
+ </globalModules>
+
+ <httpCompression directory="%TEMP%\iisexpress\IIS Temporary Compressed Files">
+ <scheme name="gzip" dll="%IIS_BIN%\gzip.dll" />
+ <dynamicTypes>
+ <add mimeType="text/*" enabled="true" />
+ <add mimeType="message/*" enabled="true" />
+ <add mimeType="application/javascript" enabled="true" />
+ <add mimeType="application/atom+xml" enabled="true" />
+ <add mimeType="application/xaml+xml" enabled="true" />
+ <add mimeType="*/*" enabled="false" />
+ </dynamicTypes>
+ <staticTypes>
+ <add mimeType="text/*" enabled="true" />
+ <add mimeType="message/*" enabled="true" />
+ <add mimeType="image/svg+xml" enabled="true" />
+ <add mimeType="application/javascript" enabled="true" />
+ <add mimeType="application/atom+xml" enabled="true" />
+ <add mimeType="application/xaml+xml" enabled="true" />
+ <add mimeType="*/*" enabled="false" />
+ </staticTypes>
+ </httpCompression>
+
+ <httpErrors lockAttributes="allowAbsolutePathsWhenDelegated,defaultPath">
+ <error statusCode="401" prefixLanguageFilePath="%IIS_BIN%\custerr" path="401.htm" />
+ <error statusCode="403" prefixLanguageFilePath="%IIS_BIN%\custerr" path="403.htm" />
+ <error statusCode="404" prefixLanguageFilePath="%IIS_BIN%\custerr" path="404.htm" />
+ <error statusCode="405" prefixLanguageFilePath="%IIS_BIN%\custerr" path="405.htm" />
+ <error statusCode="406" prefixLanguageFilePath="%IIS_BIN%\custerr" path="406.htm" />
+ <error statusCode="412" prefixLanguageFilePath="%IIS_BIN%\custerr" path="412.htm" />
+ <error statusCode="500" prefixLanguageFilePath="%IIS_BIN%\custerr" path="500.htm" />
+ <error statusCode="501" prefixLanguageFilePath="%IIS_BIN%\custerr" path="501.htm" />
+ <error statusCode="502" prefixLanguageFilePath="%IIS_BIN%\custerr" path="502.htm" />
+ </httpErrors>
+
+ <httpLogging dontLog="false" />
+
+ <httpProtocol>
+ <customHeaders>
+ <clear />
+ <add name="X-Powered-By" value="ASP.NET" />
+ </customHeaders>
+ <redirectHeaders>
+ <clear />
+ </redirectHeaders>
+ </httpProtocol>
+
+ <httpRedirect enabled="false" />
+
+ <httpTracing>
+ </httpTracing>
+
+ <isapiFilters>
+ <filter name="ASP.Net_2.0.50727-64" path="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_filter.dll" enableCache="true" preCondition="bitness64,runtimeVersionv2.0" />
+ <filter name="ASP.Net_2.0.50727.0" path="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_filter.dll" enableCache="true" preCondition="bitness32,runtimeVersionv2.0" />
+ <filter name="ASP.Net_2.0_for_v1.1" path="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_filter.dll" enableCache="true" preCondition="runtimeVersionv1.1" />
+ <filter name="ASP.Net_4.0_32bit" path="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_filter.dll" enableCache="true" preCondition="bitness32,runtimeVersionv4.0" />
+ <filter name="ASP.Net_4.0_64bit" path="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_filter.dll" enableCache="true" preCondition="bitness64,runtimeVersionv4.0" />
+ </isapiFilters>
+
+ <odbcLogging />
+
+ <security>
+
+ <access sslFlags="None" />
+
+ <applicationDependencies>
+ <application name="Active Server Pages" groupId="ASP" />
+ </applicationDependencies>
+
+ <authentication>
+
+ <anonymousAuthentication enabled="true" userName="" />
+
+ <basicAuthentication enabled="false" />
+
+ <clientCertificateMappingAuthentication enabled="false" />
+
+ <digestAuthentication enabled="false" />
+
+ <iisClientCertificateMappingAuthentication enabled="false">
+ </iisClientCertificateMappingAuthentication>
+
+ <windowsAuthentication enabled="false">
+ <providers>
+ <add value="Negotiate" />
+ <add value="NTLM" />
+ </providers>
+ </windowsAuthentication>
+
+ </authentication>
+
+ <authorization>
+ <add accessType="Allow" users="*" />
+ </authorization>
+
+ <ipSecurity allowUnlisted="true" />
+
+ <isapiCgiRestriction notListedIsapisAllowed="true" notListedCgisAllowed="true">
+ <add path="%windir%\Microsoft.NET\Framework64\v4.0.30319\webengine4.dll" allowed="true" groupId="ASP.NET_v4.0" description="ASP.NET_v4.0" />
+ <add path="%windir%\Microsoft.NET\Framework\v4.0.30319\webengine4.dll" allowed="true" groupId="ASP.NET_v4.0" description="ASP.NET_v4.0" />
+ <add path="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" allowed="true" groupId="ASP.NET v2.0.50727" description="ASP.NET v2.0.50727" />
+ <add path="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" allowed="true" groupId="ASP.NET v2.0.50727" description="ASP.NET v2.0.50727" />
+ </isapiCgiRestriction>
+
+ <requestFiltering>
+ <fileExtensions allowUnlisted="true" applyToWebDAV="true">
+ <add fileExtension=".asa" allowed="false" />
+ <add fileExtension=".asax" allowed="false" />
+ <add fileExtension=".ascx" allowed="false" />
+ <add fileExtension=".master" allowed="false" />
+ <add fileExtension=".skin" allowed="false" />
+ <add fileExtension=".browser" allowed="false" />
+ <add fileExtension=".sitemap" allowed="false" />
+ <add fileExtension=".config" allowed="false" />
+ <add fileExtension=".cs" allowed="false" />
+ <add fileExtension=".csproj" allowed="false" />
+ <add fileExtension=".vb" allowed="false" />
+ <add fileExtension=".vbproj" allowed="false" />
+ <add fileExtension=".webinfo" allowed="false" />
+ <add fileExtension=".licx" allowed="false" />
+ <add fileExtension=".resx" allowed="false" />
+ <add fileExtension=".resources" allowed="false" />
+ <add fileExtension=".mdb" allowed="false" />
+ <add fileExtension=".vjsproj" allowed="false" />
+ <add fileExtension=".java" allowed="false" />
+ <add fileExtension=".jsl" allowed="false" />
+ <add fileExtension=".ldb" allowed="false" />
+ <add fileExtension=".dsdgm" allowed="false" />
+ <add fileExtension=".ssdgm" allowed="false" />
+ <add fileExtension=".lsad" allowed="false" />
+ <add fileExtension=".ssmap" allowed="false" />
+ <add fileExtension=".cd" allowed="false" />
+ <add fileExtension=".dsprototype" allowed="false" />
+ <add fileExtension=".lsaprototype" allowed="false" />
+ <add fileExtension=".sdm" allowed="false" />
+ <add fileExtension=".sdmDocument" allowed="false" />
+ <add fileExtension=".mdf" allowed="false" />
+ <add fileExtension=".ldf" allowed="false" />
+ <add fileExtension=".ad" allowed="false" />
+ <add fileExtension=".dd" allowed="false" />
+ <add fileExtension=".ldd" allowed="false" />
+ <add fileExtension=".sd" allowed="false" />
+ <add fileExtension=".adprototype" allowed="false" />
+ <add fileExtension=".lddprototype" allowed="false" />
+ <add fileExtension=".exclude" allowed="false" />
+ <add fileExtension=".refresh" allowed="false" />
+ <add fileExtension=".compiled" allowed="false" />
+ <add fileExtension=".msgx" allowed="false" />
+ <add fileExtension=".vsdisco" allowed="false" />
+ <add fileExtension=".rules" allowed="false" />
+ </fileExtensions>
+ <verbs allowUnlisted="true" applyToWebDAV="true" />
+ <hiddenSegments applyToWebDAV="true">
+ <add segment="web.config" />
+ <add segment="bin" />
+ <add segment="App_code" />
+ <add segment="App_GlobalResources" />
+ <add segment="App_LocalResources" />
+ <add segment="App_WebReferences" />
+ <add segment="App_Data" />
+ <add segment="App_Browsers" />
+ </hiddenSegments>
+ </requestFiltering>
+
+ </security>
+
+ <serverSideInclude ssiExecDisable="false" />
+
+ <staticContent lockAttributes="isDocFooterFileName">
+ <mimeMap fileExtension=".323" mimeType="text/h323" />
+ <mimeMap fileExtension=".3g2" mimeType="video/3gpp2" />
+ <mimeMap fileExtension=".3gp2" mimeType="video/3gpp2" />
+ <mimeMap fileExtension=".3gp" mimeType="video/3gpp" />
+ <mimeMap fileExtension=".3gpp" mimeType="video/3gpp" />
+ <mimeMap fileExtension=".aac" mimeType="audio/aac" />
+ <mimeMap fileExtension=".aaf" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".aca" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".accdb" mimeType="application/msaccess" />
+ <mimeMap fileExtension=".accde" mimeType="application/msaccess" />
+ <mimeMap fileExtension=".accdt" mimeType="application/msaccess" />
+ <mimeMap fileExtension=".acx" mimeType="application/internet-property-stream" />
+ <mimeMap fileExtension=".adt" mimeType="audio/vnd.dlna.adts" />
+ <mimeMap fileExtension=".adts" mimeType="audio/vnd.dlna.adts" />
+ <mimeMap fileExtension=".afm" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".ai" mimeType="application/postscript" />
+ <mimeMap fileExtension=".aif" mimeType="audio/x-aiff" />
+ <mimeMap fileExtension=".aifc" mimeType="audio/aiff" />
+ <mimeMap fileExtension=".aiff" mimeType="audio/aiff" />
+ <mimeMap fileExtension=".appcache" mimeType="text/cache-manifest" />
+ <mimeMap fileExtension=".application" mimeType="application/x-ms-application" />
+ <mimeMap fileExtension=".art" mimeType="image/x-jg" />
+ <mimeMap fileExtension=".asd" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".asf" mimeType="video/x-ms-asf" />
+ <mimeMap fileExtension=".asi" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".asm" mimeType="text/plain" />
+ <mimeMap fileExtension=".asr" mimeType="video/x-ms-asf" />
+ <mimeMap fileExtension=".asx" mimeType="video/x-ms-asf" />
+ <mimeMap fileExtension=".atom" mimeType="application/atom+xml" />
+ <mimeMap fileExtension=".au" mimeType="audio/basic" />
+ <mimeMap fileExtension=".avi" mimeType="video/msvideo" />
+ <mimeMap fileExtension=".axs" mimeType="application/olescript" />
+ <mimeMap fileExtension=".bas" mimeType="text/plain" />
+ <mimeMap fileExtension=".bcpio" mimeType="application/x-bcpio" />
+ <mimeMap fileExtension=".bin" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".bmp" mimeType="image/bmp" />
+ <mimeMap fileExtension=".c" mimeType="text/plain" />
+ <mimeMap fileExtension=".cab" mimeType="application/vnd.ms-cab-compressed" />
+ <mimeMap fileExtension=".calx" mimeType="application/vnd.ms-office.calx" />
+ <mimeMap fileExtension=".cat" mimeType="application/vnd.ms-pki.seccat" />
+ <mimeMap fileExtension=".cdf" mimeType="application/x-cdf" />
+ <mimeMap fileExtension=".chm" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".class" mimeType="application/x-java-applet" />
+ <mimeMap fileExtension=".clp" mimeType="application/x-msclip" />
+ <mimeMap fileExtension=".cmx" mimeType="image/x-cmx" />
+ <mimeMap fileExtension=".cnf" mimeType="text/plain" />
+ <mimeMap fileExtension=".cod" mimeType="image/cis-cod" />
+ <mimeMap fileExtension=".cpio" mimeType="application/x-cpio" />
+ <mimeMap fileExtension=".cpp" mimeType="text/plain" />
+ <mimeMap fileExtension=".crd" mimeType="application/x-mscardfile" />
+ <mimeMap fileExtension=".crl" mimeType="application/pkix-crl" />
+ <mimeMap fileExtension=".crt" mimeType="application/x-x509-ca-cert" />
+ <mimeMap fileExtension=".csh" mimeType="application/x-csh" />
+ <mimeMap fileExtension=".css" mimeType="text/css" />
+ <mimeMap fileExtension=".csv" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".cur" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".dcr" mimeType="application/x-director" />
+ <mimeMap fileExtension=".deploy" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".der" mimeType="application/x-x509-ca-cert" />
+ <mimeMap fileExtension=".dib" mimeType="image/bmp" />
+ <mimeMap fileExtension=".dir" mimeType="application/x-director" />
+ <mimeMap fileExtension=".disco" mimeType="text/xml" />
+ <mimeMap fileExtension=".dll" mimeType="application/x-msdownload" />
+ <mimeMap fileExtension=".dll.config" mimeType="text/xml" />
+ <mimeMap fileExtension=".dlm" mimeType="text/dlm" />
+ <mimeMap fileExtension=".doc" mimeType="application/msword" />
+ <mimeMap fileExtension=".docm" mimeType="application/vnd.ms-word.document.macroEnabled.12" />
+ <mimeMap fileExtension=".docx" mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" />
+ <mimeMap fileExtension=".dot" mimeType="application/msword" />
+ <mimeMap fileExtension=".dotm" mimeType="application/vnd.ms-word.template.macroEnabled.12" />
+ <mimeMap fileExtension=".dotx" mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.template" />
+ <mimeMap fileExtension=".dsp" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".dtd" mimeType="text/xml" />
+ <mimeMap fileExtension=".dvi" mimeType="application/x-dvi" />
+ <mimeMap fileExtension=".dvr-ms" mimeType="video/x-ms-dvr" />
+ <mimeMap fileExtension=".dwf" mimeType="drawing/x-dwf" />
+ <mimeMap fileExtension=".dwp" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".dxr" mimeType="application/x-director" />
+ <mimeMap fileExtension=".eml" mimeType="message/rfc822" />
+ <mimeMap fileExtension=".emz" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".eot" mimeType="application/vnd.ms-fontobject" />
+ <mimeMap fileExtension=".eps" mimeType="application/postscript" />
+ <mimeMap fileExtension=".etx" mimeType="text/x-setext" />
+ <mimeMap fileExtension=".evy" mimeType="application/envoy" />
+ <mimeMap fileExtension=".exe" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".exe.config" mimeType="text/xml" />
+ <mimeMap fileExtension=".fdf" mimeType="application/vnd.fdf" />
+ <mimeMap fileExtension=".fif" mimeType="application/fractals" />
+ <mimeMap fileExtension=".fla" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".flr" mimeType="x-world/x-vrml" />
+ <mimeMap fileExtension=".flv" mimeType="video/x-flv" />
+ <mimeMap fileExtension=".gif" mimeType="image/gif" />
+ <mimeMap fileExtension=".gtar" mimeType="application/x-gtar" />
+ <mimeMap fileExtension=".gz" mimeType="application/x-gzip" />
+ <mimeMap fileExtension=".h" mimeType="text/plain" />
+ <mimeMap fileExtension=".hdf" mimeType="application/x-hdf" />
+ <mimeMap fileExtension=".hdml" mimeType="text/x-hdml" />
+ <mimeMap fileExtension=".hhc" mimeType="application/x-oleobject" />
+ <mimeMap fileExtension=".hhk" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".hhp" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".hlp" mimeType="application/winhlp" />
+ <mimeMap fileExtension=".hqx" mimeType="application/mac-binhex40" />
+ <mimeMap fileExtension=".hta" mimeType="application/hta" />
+ <mimeMap fileExtension=".htc" mimeType="text/x-component" />
+ <mimeMap fileExtension=".htm" mimeType="text/html" />
+ <mimeMap fileExtension=".html" mimeType="text/html" />
+ <mimeMap fileExtension=".htt" mimeType="text/webviewhtml" />
+ <mimeMap fileExtension=".hxt" mimeType="text/html" />
+ <mimeMap fileExtension=".ico" mimeType="image/x-icon" />
+ <mimeMap fileExtension=".ics" mimeType="text/calendar" />
+ <mimeMap fileExtension=".ief" mimeType="image/ief" />
+ <mimeMap fileExtension=".iii" mimeType="application/x-iphone" />
+ <mimeMap fileExtension=".inf" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".ins" mimeType="application/x-internet-signup" />
+ <mimeMap fileExtension=".isp" mimeType="application/x-internet-signup" />
+ <mimeMap fileExtension=".IVF" mimeType="video/x-ivf" />
+ <mimeMap fileExtension=".jar" mimeType="application/java-archive" />
+ <mimeMap fileExtension=".java" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".jck" mimeType="application/liquidmotion" />
+ <mimeMap fileExtension=".jcz" mimeType="application/liquidmotion" />
+ <mimeMap fileExtension=".jfif" mimeType="image/pjpeg" />
+ <mimeMap fileExtension=".jpb" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".jpe" mimeType="image/jpeg" />
+ <mimeMap fileExtension=".jpeg" mimeType="image/jpeg" />
+ <mimeMap fileExtension=".jpg" mimeType="image/jpeg" />
+ <mimeMap fileExtension=".js" mimeType="application/javascript" />
+ <mimeMap fileExtension=".json" mimeType="application/json" />
+ <mimeMap fileExtension=".jsonld" mimeType="application/ld+json" />
+ <mimeMap fileExtension=".jsx" mimeType="text/jscript" />
+ <mimeMap fileExtension=".latex" mimeType="application/x-latex" />
+ <mimeMap fileExtension=".less" mimeType="text/css" />
+ <mimeMap fileExtension=".lit" mimeType="application/x-ms-reader" />
+ <mimeMap fileExtension=".lpk" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".lsf" mimeType="video/x-la-asf" />
+ <mimeMap fileExtension=".lsx" mimeType="video/x-la-asf" />
+ <mimeMap fileExtension=".lzh" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".m13" mimeType="application/x-msmediaview" />
+ <mimeMap fileExtension=".m14" mimeType="application/x-msmediaview" />
+ <mimeMap fileExtension=".m1v" mimeType="video/mpeg" />
+ <mimeMap fileExtension=".m2ts" mimeType="video/vnd.dlna.mpeg-tts" />
+ <mimeMap fileExtension=".m3u" mimeType="audio/x-mpegurl" />
+ <mimeMap fileExtension=".m4a" mimeType="audio/mp4" />
+ <mimeMap fileExtension=".m4v" mimeType="video/mp4" />
+ <mimeMap fileExtension=".man" mimeType="application/x-troff-man" />
+ <mimeMap fileExtension=".manifest" mimeType="application/x-ms-manifest" />
+ <mimeMap fileExtension=".map" mimeType="text/plain" />
+ <mimeMap fileExtension=".mdb" mimeType="application/x-msaccess" />
+ <mimeMap fileExtension=".mdp" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".me" mimeType="application/x-troff-me" />
+ <mimeMap fileExtension=".mht" mimeType="message/rfc822" />
+ <mimeMap fileExtension=".mhtml" mimeType="message/rfc822" />
+ <mimeMap fileExtension=".mid" mimeType="audio/mid" />
+ <mimeMap fileExtension=".midi" mimeType="audio/mid" />
+ <mimeMap fileExtension=".mix" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".mmf" mimeType="application/x-smaf" />
+ <mimeMap fileExtension=".mno" mimeType="text/xml" />
+ <mimeMap fileExtension=".mny" mimeType="application/x-msmoney" />
+ <mimeMap fileExtension=".mov" mimeType="video/quicktime" />
+ <mimeMap fileExtension=".movie" mimeType="video/x-sgi-movie" />
+ <mimeMap fileExtension=".mp2" mimeType="video/mpeg" />
+ <mimeMap fileExtension=".mp3" mimeType="audio/mpeg" />
+ <mimeMap fileExtension=".mp4" mimeType="video/mp4" />
+ <mimeMap fileExtension=".mp4v" mimeType="video/mp4" />
+ <mimeMap fileExtension=".mpa" mimeType="video/mpeg" />
+ <mimeMap fileExtension=".mpe" mimeType="video/mpeg" />
+ <mimeMap fileExtension=".mpeg" mimeType="video/mpeg" />
+ <mimeMap fileExtension=".mpg" mimeType="video/mpeg" />
+ <mimeMap fileExtension=".mpp" mimeType="application/vnd.ms-project" />
+ <mimeMap fileExtension=".mpv2" mimeType="video/mpeg" />
+ <mimeMap fileExtension=".ms" mimeType="application/x-troff-ms" />
+ <mimeMap fileExtension=".msi" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".mso" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".mvb" mimeType="application/x-msmediaview" />
+ <mimeMap fileExtension=".mvc" mimeType="application/x-miva-compiled" />
+ <mimeMap fileExtension=".nc" mimeType="application/x-netcdf" />
+ <mimeMap fileExtension=".nsc" mimeType="video/x-ms-asf" />
+ <mimeMap fileExtension=".nws" mimeType="message/rfc822" />
+ <mimeMap fileExtension=".ocx" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".oda" mimeType="application/oda" />
+ <mimeMap fileExtension=".odc" mimeType="text/x-ms-odc" />
+ <mimeMap fileExtension=".ods" mimeType="application/oleobject" />
+ <mimeMap fileExtension=".oga" mimeType="audio/ogg" />
+ <mimeMap fileExtension=".ogg" mimeType="video/ogg" />
+ <mimeMap fileExtension=".ogv" mimeType="video/ogg" />
+ <mimeMap fileExtension=".one" mimeType="application/onenote" />
+ <mimeMap fileExtension=".onea" mimeType="application/onenote" />
+ <mimeMap fileExtension=".onetoc" mimeType="application/onenote" />
+ <mimeMap fileExtension=".onetoc2" mimeType="application/onenote" />
+ <mimeMap fileExtension=".onetmp" mimeType="application/onenote" />
+ <mimeMap fileExtension=".onepkg" mimeType="application/onenote" />
+ <mimeMap fileExtension=".osdx" mimeType="application/opensearchdescription+xml" />
+ <mimeMap fileExtension=".otf" mimeType="font/otf" />
+ <mimeMap fileExtension=".p10" mimeType="application/pkcs10" />
+ <mimeMap fileExtension=".p12" mimeType="application/x-pkcs12" />
+ <mimeMap fileExtension=".p7b" mimeType="application/x-pkcs7-certificates" />
+ <mimeMap fileExtension=".p7c" mimeType="application/pkcs7-mime" />
+ <mimeMap fileExtension=".p7m" mimeType="application/pkcs7-mime" />
+ <mimeMap fileExtension=".p7r" mimeType="application/x-pkcs7-certreqresp" />
+ <mimeMap fileExtension=".p7s" mimeType="application/pkcs7-signature" />
+ <mimeMap fileExtension=".pbm" mimeType="image/x-portable-bitmap" />
+ <mimeMap fileExtension=".pcx" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".pcz" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".pdf" mimeType="application/pdf" />
+ <mimeMap fileExtension=".pfb" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".pfm" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".pfx" mimeType="application/x-pkcs12" />
+ <mimeMap fileExtension=".pgm" mimeType="image/x-portable-graymap" />
+ <mimeMap fileExtension=".pko" mimeType="application/vnd.ms-pki.pko" />
+ <mimeMap fileExtension=".pma" mimeType="application/x-perfmon" />
+ <mimeMap fileExtension=".pmc" mimeType="application/x-perfmon" />
+ <mimeMap fileExtension=".pml" mimeType="application/x-perfmon" />
+ <mimeMap fileExtension=".pmr" mimeType="application/x-perfmon" />
+ <mimeMap fileExtension=".pmw" mimeType="application/x-perfmon" />
+ <mimeMap fileExtension=".png" mimeType="image/png" />
+ <mimeMap fileExtension=".pnm" mimeType="image/x-portable-anymap" />
+ <mimeMap fileExtension=".pnz" mimeType="image/png" />
+ <mimeMap fileExtension=".pot" mimeType="application/vnd.ms-powerpoint" />
+ <mimeMap fileExtension=".potm" mimeType="application/vnd.ms-powerpoint.template.macroEnabled.12" />
+ <mimeMap fileExtension=".potx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.template" />
+ <mimeMap fileExtension=".ppam" mimeType="application/vnd.ms-powerpoint.addin.macroEnabled.12" />
+ <mimeMap fileExtension=".ppm" mimeType="image/x-portable-pixmap" />
+ <mimeMap fileExtension=".pps" mimeType="application/vnd.ms-powerpoint" />
+ <mimeMap fileExtension=".ppsm" mimeType="application/vnd.ms-powerpoint.slideshow.macroEnabled.12" />
+ <mimeMap fileExtension=".ppsx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.slideshow" />
+ <mimeMap fileExtension=".ppt" mimeType="application/vnd.ms-powerpoint" />
+ <mimeMap fileExtension=".pptm" mimeType="application/vnd.ms-powerpoint.presentation.macroEnabled.12" />
+ <mimeMap fileExtension=".pptx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" />
+ <mimeMap fileExtension=".prf" mimeType="application/pics-rules" />
+ <mimeMap fileExtension=".prm" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".prx" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".ps" mimeType="application/postscript" />
+ <mimeMap fileExtension=".psd" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".psm" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".psp" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".pub" mimeType="application/x-mspublisher" />
+ <mimeMap fileExtension=".qt" mimeType="video/quicktime" />
+ <mimeMap fileExtension=".qtl" mimeType="application/x-quicktimeplayer" />
+ <mimeMap fileExtension=".qxd" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".ra" mimeType="audio/x-pn-realaudio" />
+ <mimeMap fileExtension=".ram" mimeType="audio/x-pn-realaudio" />
+ <mimeMap fileExtension=".rar" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".ras" mimeType="image/x-cmu-raster" />
+ <mimeMap fileExtension=".rf" mimeType="image/vnd.rn-realflash" />
+ <mimeMap fileExtension=".rgb" mimeType="image/x-rgb" />
+ <mimeMap fileExtension=".rm" mimeType="application/vnd.rn-realmedia" />
+ <mimeMap fileExtension=".rmi" mimeType="audio/mid" />
+ <mimeMap fileExtension=".roff" mimeType="application/x-troff" />
+ <mimeMap fileExtension=".rpm" mimeType="audio/x-pn-realaudio-plugin" />
+ <mimeMap fileExtension=".rtf" mimeType="application/rtf" />
+ <mimeMap fileExtension=".rtx" mimeType="text/richtext" />
+ <mimeMap fileExtension=".scd" mimeType="application/x-msschedule" />
+ <mimeMap fileExtension=".sct" mimeType="text/scriptlet" />
+ <mimeMap fileExtension=".sea" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".setpay" mimeType="application/set-payment-initiation" />
+ <mimeMap fileExtension=".setreg" mimeType="application/set-registration-initiation" />
+ <mimeMap fileExtension=".sgml" mimeType="text/sgml" />
+ <mimeMap fileExtension=".sh" mimeType="application/x-sh" />
+ <mimeMap fileExtension=".shar" mimeType="application/x-shar" />
+ <mimeMap fileExtension=".sit" mimeType="application/x-stuffit" />
+ <mimeMap fileExtension=".sldm" mimeType="application/vnd.ms-powerpoint.slide.macroEnabled.12" />
+ <mimeMap fileExtension=".sldx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.slide" />
+ <mimeMap fileExtension=".smd" mimeType="audio/x-smd" />
+ <mimeMap fileExtension=".smi" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".smx" mimeType="audio/x-smd" />
+ <mimeMap fileExtension=".smz" mimeType="audio/x-smd" />
+ <mimeMap fileExtension=".snd" mimeType="audio/basic" />
+ <mimeMap fileExtension=".snp" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".spc" mimeType="application/x-pkcs7-certificates" />
+ <mimeMap fileExtension=".spl" mimeType="application/futuresplash" />
+ <mimeMap fileExtension=".spx" mimeType="audio/ogg" />
+ <mimeMap fileExtension=".src" mimeType="application/x-wais-source" />
+ <mimeMap fileExtension=".ssm" mimeType="application/streamingmedia" />
+ <mimeMap fileExtension=".sst" mimeType="application/vnd.ms-pki.certstore" />
+ <mimeMap fileExtension=".stl" mimeType="application/vnd.ms-pki.stl" />
+ <mimeMap fileExtension=".sv4cpio" mimeType="application/x-sv4cpio" />
+ <mimeMap fileExtension=".sv4crc" mimeType="application/x-sv4crc" />
+ <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
+ <mimeMap fileExtension=".svgz" mimeType="image/svg+xml" />
+ <mimeMap fileExtension=".swf" mimeType="application/x-shockwave-flash" />
+ <mimeMap fileExtension=".t" mimeType="application/x-troff" />
+ <mimeMap fileExtension=".tar" mimeType="application/x-tar" />
+ <mimeMap fileExtension=".tcl" mimeType="application/x-tcl" />
+ <mimeMap fileExtension=".tex" mimeType="application/x-tex" />
+ <mimeMap fileExtension=".texi" mimeType="application/x-texinfo" />
+ <mimeMap fileExtension=".texinfo" mimeType="application/x-texinfo" />
+ <mimeMap fileExtension=".tgz" mimeType="application/x-compressed" />
+ <mimeMap fileExtension=".thmx" mimeType="application/vnd.ms-officetheme" />
+ <mimeMap fileExtension=".thn" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".tif" mimeType="image/tiff" />
+ <mimeMap fileExtension=".tiff" mimeType="image/tiff" />
+ <mimeMap fileExtension=".toc" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".tr" mimeType="application/x-troff" />
+ <mimeMap fileExtension=".trm" mimeType="application/x-msterminal" />
+ <mimeMap fileExtension=".ts" mimeType="video/vnd.dlna.mpeg-tts" />
+ <mimeMap fileExtension=".tsv" mimeType="text/tab-separated-values" />
+ <mimeMap fileExtension=".ttf" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".tts" mimeType="video/vnd.dlna.mpeg-tts" />
+ <mimeMap fileExtension=".txt" mimeType="text/plain" />
+ <mimeMap fileExtension=".u32" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".uls" mimeType="text/iuls" />
+ <mimeMap fileExtension=".ustar" mimeType="application/x-ustar" />
+ <mimeMap fileExtension=".vbs" mimeType="text/vbscript" />
+ <mimeMap fileExtension=".vcf" mimeType="text/x-vcard" />
+ <mimeMap fileExtension=".vcs" mimeType="text/plain" />
+ <mimeMap fileExtension=".vdx" mimeType="application/vnd.ms-visio.viewer" />
+ <mimeMap fileExtension=".vml" mimeType="text/xml" />
+ <mimeMap fileExtension=".vsd" mimeType="application/vnd.visio" />
+ <mimeMap fileExtension=".vss" mimeType="application/vnd.visio" />
+ <mimeMap fileExtension=".vst" mimeType="application/vnd.visio" />
+ <mimeMap fileExtension=".vsto" mimeType="application/x-ms-vsto" />
+ <mimeMap fileExtension=".vsw" mimeType="application/vnd.visio" />
+ <mimeMap fileExtension=".vsx" mimeType="application/vnd.visio" />
+ <mimeMap fileExtension=".vtx" mimeType="application/vnd.visio" />
+ <mimeMap fileExtension=".wav" mimeType="audio/wav" />
+ <mimeMap fileExtension=".wax" mimeType="audio/x-ms-wax" />
+ <mimeMap fileExtension=".wbmp" mimeType="image/vnd.wap.wbmp" />
+ <mimeMap fileExtension=".wcm" mimeType="application/vnd.ms-works" />
+ <mimeMap fileExtension=".wdb" mimeType="application/vnd.ms-works" />
+ <mimeMap fileExtension=".webm" mimeType="video/webm" />
+ <mimeMap fileExtension=".wks" mimeType="application/vnd.ms-works" />
+ <mimeMap fileExtension=".wm" mimeType="video/x-ms-wm" />
+ <mimeMap fileExtension=".wma" mimeType="audio/x-ms-wma" />
+ <mimeMap fileExtension=".wmd" mimeType="application/x-ms-wmd" />
+ <mimeMap fileExtension=".wmf" mimeType="application/x-msmetafile" />
+ <mimeMap fileExtension=".wml" mimeType="text/vnd.wap.wml" />
+ <mimeMap fileExtension=".wmlc" mimeType="application/vnd.wap.wmlc" />
+ <mimeMap fileExtension=".wmls" mimeType="text/vnd.wap.wmlscript" />
+ <mimeMap fileExtension=".wmlsc" mimeType="application/vnd.wap.wmlscriptc" />
+ <mimeMap fileExtension=".wmp" mimeType="video/x-ms-wmp" />
+ <mimeMap fileExtension=".wmv" mimeType="video/x-ms-wmv" />
+ <mimeMap fileExtension=".wmx" mimeType="video/x-ms-wmx" />
+ <mimeMap fileExtension=".wmz" mimeType="application/x-ms-wmz" />
+ <mimeMap fileExtension=".woff" mimeType="font/x-woff" />
+ <mimeMap fileExtension=".woff2" mimeType="application/font-woff2" />
+ <mimeMap fileExtension=".wps" mimeType="application/vnd.ms-works" />
+ <mimeMap fileExtension=".wri" mimeType="application/x-mswrite" />
+ <mimeMap fileExtension=".wrl" mimeType="x-world/x-vrml" />
+ <mimeMap fileExtension=".wrz" mimeType="x-world/x-vrml" />
+ <mimeMap fileExtension=".wsdl" mimeType="text/xml" />
+ <mimeMap fileExtension=".wtv" mimeType="video/x-ms-wtv" />
+ <mimeMap fileExtension=".wvx" mimeType="video/x-ms-wvx" />
+ <mimeMap fileExtension=".x" mimeType="application/directx" />
+ <mimeMap fileExtension=".xaf" mimeType="x-world/x-vrml" />
+ <mimeMap fileExtension=".xaml" mimeType="application/xaml+xml" />
+ <mimeMap fileExtension=".xap" mimeType="application/x-silverlight-app" />
+ <mimeMap fileExtension=".xbap" mimeType="application/x-ms-xbap" />
+ <mimeMap fileExtension=".xbm" mimeType="image/x-xbitmap" />
+ <mimeMap fileExtension=".xdr" mimeType="text/plain" />
+ <mimeMap fileExtension=".xht" mimeType="application/xhtml+xml" />
+ <mimeMap fileExtension=".xhtml" mimeType="application/xhtml+xml" />
+ <mimeMap fileExtension=".xla" mimeType="application/vnd.ms-excel" />
+ <mimeMap fileExtension=".xlam" mimeType="application/vnd.ms-excel.addin.macroEnabled.12" />
+ <mimeMap fileExtension=".xlc" mimeType="application/vnd.ms-excel" />
+ <mimeMap fileExtension=".xlm" mimeType="application/vnd.ms-excel" />
+ <mimeMap fileExtension=".xls" mimeType="application/vnd.ms-excel" />
+ <mimeMap fileExtension=".xlsb" mimeType="application/vnd.ms-excel.sheet.binary.macroEnabled.12" />
+ <mimeMap fileExtension=".xlsm" mimeType="application/vnd.ms-excel.sheet.macroEnabled.12" />
+ <mimeMap fileExtension=".xlsx" mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />
+ <mimeMap fileExtension=".xlt" mimeType="application/vnd.ms-excel" />
+ <mimeMap fileExtension=".xltm" mimeType="application/vnd.ms-excel.template.macroEnabled.12" />
+ <mimeMap fileExtension=".xltx" mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.template" />
+ <mimeMap fileExtension=".xlw" mimeType="application/vnd.ms-excel" />
+ <mimeMap fileExtension=".xml" mimeType="text/xml" />
+ <mimeMap fileExtension=".xof" mimeType="x-world/x-vrml" />
+ <mimeMap fileExtension=".xpm" mimeType="image/x-xpixmap" />
+ <mimeMap fileExtension=".xps" mimeType="application/vnd.ms-xpsdocument" />
+ <mimeMap fileExtension=".xsd" mimeType="text/xml" />
+ <mimeMap fileExtension=".xsf" mimeType="text/xml" />
+ <mimeMap fileExtension=".xsl" mimeType="text/xml" />
+ <mimeMap fileExtension=".xslt" mimeType="text/xml" />
+ <mimeMap fileExtension=".xsn" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".xtp" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".xwd" mimeType="image/x-xwindowdump" />
+ <mimeMap fileExtension=".z" mimeType="application/x-compress" />
+ <mimeMap fileExtension=".zip" mimeType="application/x-zip-compressed" />
+ </staticContent>
+
+ <tracing>
+
+ <traceProviderDefinitions>
+ <add name="WWW Server" guid="{3a2a4e84-4c21-4981-ae10-3fda0d9b0f83}">
+ <areas>
+ <clear />
+ <add name="Authentication" value="2" />
+ <add name="Security" value="4" />
+ <add name="Filter" value="8" />
+ <add name="StaticFile" value="16" />
+ <add name="CGI" value="32" />
+ <add name="Compression" value="64" />
+ <add name="Cache" value="128" />
+ <add name="RequestNotifications" value="256" />
+ <add name="Module" value="512" />
+ <add name="Rewrite" value="1024" />
+ <add name="FastCGI" value="4096" />
+ <add name="WebSocket" value="16384" />
+ </areas>
+ </add>
+ <add name="ASP" guid="{06b94d9a-b15e-456e-a4ef-37c984a2cb4b}">
+ <areas>
+ <clear />
+ </areas>
+ </add>
+ <add name="ISAPI Extension" guid="{a1c2040e-8840-4c31-ba11-9871031a19ea}">
+ <areas>
+ <clear />
+ </areas>
+ </add>
+ <add name="ASPNET" guid="{AFF081FE-0247-4275-9C4E-021F3DC1DA35}">
+ <areas>
+ <add name="Infrastructure" value="1" />
+ <add name="Module" value="2" />
+ <add name="Page" value="4" />
+ <add name="AppServices" value="8" />
+ </areas>
+ </add>
+ </traceProviderDefinitions>
+
+ <traceFailedRequests>
+ <add path="*">
+ <traceAreas>
+ <add provider="ASP" verbosity="Verbose" />
+ <add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Verbose" />
+ <add provider="ISAPI Extension" verbosity="Verbose" />
+ <add provider="WWW Server" areas="Authentication,Security,Filter,StaticFile,CGI,Compression,Cache,RequestNotifications,Module,Rewrite,WebSocket" verbosity="Verbose" />
+ </traceAreas>
+ <failureDefinitions statusCodes="200-999" />
+ </add>
+ </traceFailedRequests>
+
+ </tracing>
+
+ <urlCompression />
+
+ <validation />
+ <webdav>
+ <globalSettings>
+ <propertyStores>
+ <add name="webdav_simple_prop" image="%IIS_BIN%\webdav_simple_prop.dll" image32="%IIS_BIN%\webdav_simple_prop.dll" />
+ </propertyStores>
+ <lockStores>
+ <add name="webdav_simple_lock" image="%IIS_BIN%\webdav_simple_lock.dll" image32="%IIS_BIN%\webdav_simple_lock.dll" />
+ </lockStores>
+
+ </globalSettings>
+ <authoring>
+ <locks enabled="true" lockStore="webdav_simple_lock" />
+ </authoring>
+ <authoringRules />
+ </webdav>
+ <webSocket />
+ <applicationInitialization />
+
+ </system.webServer>
+ <location path="" overrideMode="Allow">
+ <system.webServer>
+ <modules>
+ <add name="IsapiFilterModule" lockItem="true" />
+ <add name="BasicAuthenticationModule" lockItem="true" />
+ <add name="IsapiModule" lockItem="true" />
+ <add name="HttpLoggingModule" lockItem="true" />
+ <!--
+ <add name="HttpCacheModule" lockItem="true" />
+-->
+ <add name="DynamicCompressionModule" lockItem="true" />
+ <add name="StaticCompressionModule" lockItem="true" />
+ <add name="DefaultDocumentModule" lockItem="true" />
+ <add name="DirectoryListingModule" lockItem="true" />
+
+ <add name="ProtocolSupportModule" lockItem="true" />
+ <add name="HttpRedirectionModule" lockItem="true" />
+ <add name="ServerSideIncludeModule" lockItem="true" />
+ <add name="StaticFileModule" lockItem="true" />
+ <add name="AnonymousAuthenticationModule" lockItem="true" />
+ <add name="CertificateMappingAuthenticationModule" lockItem="true" />
+ <add name="UrlAuthorizationModule" lockItem="true" />
+ <add name="WindowsAuthenticationModule" lockItem="true" />
+ <!--
+ <add name="DigestAuthenticationModule" lockItem="true" />
+-->
+ <add name="IISCertificateMappingAuthenticationModule" lockItem="true" />
+ <add name="WebMatrixSupportModule" lockItem="true" />
+ <add name="IpRestrictionModule" lockItem="true" />
+ <add name="DynamicIpRestrictionModule" lockItem="true" />
+ <add name="RequestFilteringModule" lockItem="true" />
+ <add name="CustomLoggingModule" lockItem="true" />
+ <add name="CustomErrorModule" lockItem="true" />
+ <add name="FailedRequestsTracingModule" lockItem="true" />
+ <add name="CgiModule" lockItem="true" />
+ <add name="FastCgiModule" lockItem="true" />
+ <!-- <add name="WebDAVModule" /> -->
+ <add name="RewriteModule" />
+ <add name="OutputCache" type="System.Web.Caching.OutputCacheModule" preCondition="managedHandler" />
+ <add name="Session" type="System.Web.SessionState.SessionStateModule" preCondition="managedHandler" />
+ <add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule" preCondition="managedHandler" />
+ <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" preCondition="managedHandler" />
+ <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" preCondition="managedHandler" />
+ <add name="RoleManager" type="System.Web.Security.RoleManagerModule" preCondition="managedHandler" />
+ <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" preCondition="managedHandler" />
+ <add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule" preCondition="managedHandler" />
+ <add name="AnonymousIdentification" type="System.Web.Security.AnonymousIdentificationModule" preCondition="managedHandler" />
+ <add name="Profile" type="System.Web.Profile.ProfileModule" preCondition="managedHandler" />
+ <add name="UrlMappingsModule" type="System.Web.UrlMappingsModule" preCondition="managedHandler" />
+ <add name="ConfigurationValidationModule" lockItem="true" />
+ <add name="WebSocketModule" lockItem="true" />
+ <add name="ServiceModel-4.0" type="System.ServiceModel.Activation.ServiceHttpModule,System.ServiceModel.Activation,Version=4.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler,runtimeVersionv4.0" />
+ <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="managedHandler,runtimeVersionv4.0" />
+ <add name="ScriptModule-4.0" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler,runtimeVersionv4.0" />
+ <add name="ServiceModel" type="System.ServiceModel.Activation.HttpModule, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler,runtimeVersionv2.0" />
+ <add name="ApplicationInitializationModule" lockItem="true" />
+ <add name="AspNetCoreModule" lockItem="true" />
+ </modules>
+ <handlers accessPolicy="Read, Script">
+ <!-- <add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" /> -->
+ <add name="AXD-ISAPI-4.0_64bit" path="*.axd" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="PageHandlerFactory-ISAPI-4.0_64bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="SimpleHandlerFactory-ISAPI-4.0_64bit" path="*.ashx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="WebServiceHandlerFactory-ISAPI-4.0_64bit" path="*.asmx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-rem-ISAPI-4.0_64bit" path="*.rem" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-soap-ISAPI-4.0_64bit" path="*.soap" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="svc-ISAPI-4.0_64bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
+ <add name="rules-ISAPI-4.0_64bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
+ <add name="xoml-ISAPI-4.0_64bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
+ <add name="xamlx-ISAPI-4.0_64bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
+ <add name="aspq-ISAPI-4.0_64bit" path="*.aspq" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="cshtm-ISAPI-4.0_64bit" path="*.cshtm" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="cshtml-ISAPI-4.0_64bit" path="*.cshtml" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="vbhtm-ISAPI-4.0_64bit" path="*.vbhtm" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="vbhtml-ISAPI-4.0_64bit" path="*.vbhtml" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="svc-Integrated" path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="svc-ISAPI-2.0" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
+ <add name="xoml-Integrated" path="*.xoml" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="xoml-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
+ <add name="rules-Integrated" path="*.rules" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="rules-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
+ <add name="AXD-ISAPI-4.0_32bit" path="*.axd" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="PageHandlerFactory-ISAPI-4.0_32bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="SimpleHandlerFactory-ISAPI-4.0_32bit" path="*.ashx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="WebServiceHandlerFactory-ISAPI-4.0_32bit" path="*.asmx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-rem-ISAPI-4.0_32bit" path="*.rem" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-soap-ISAPI-4.0_32bit" path="*.soap" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="svc-ISAPI-4.0_32bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
+ <add name="rules-ISAPI-4.0_32bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
+ <add name="xoml-ISAPI-4.0_32bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
+ <add name="xamlx-ISAPI-4.0_32bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
+ <add name="aspq-ISAPI-4.0_32bit" path="*.aspq" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="cshtm-ISAPI-4.0_32bit" path="*.cshtm" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="cshtml-ISAPI-4.0_32bit" path="*.cshtml" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="vbhtm-ISAPI-4.0_32bit" path="*.vbhtm" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="vbhtml-ISAPI-4.0_32bit" path="*.vbhtml" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="TraceHandler-Integrated-4.0" path="trace.axd" verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TraceHandler" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="WebAdminHandler-Integrated-4.0" path="WebAdmin.axd" verb="GET,DEBUG" type="System.Web.Handlers.WebAdminHandler" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="AssemblyResourceLoader-Integrated-4.0" path="WebResource.axd" verb="GET,DEBUG" type="System.Web.Handlers.AssemblyResourceLoader" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="PageHandlerFactory-Integrated-4.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.SimpleHandlerFactory" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="WebServiceHandlerFactory-Integrated-4.0" path="*.asmx" verb="GET,HEAD,POST,DEBUG" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="HttpRemotingHandlerFactory-rem-Integrated-4.0" path="*.rem" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="HttpRemotingHandlerFactory-soap-Integrated-4.0" path="*.soap" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="svc-Integrated-4.0" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="rules-Integrated-4.0" path="*.rules" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="xoml-Integrated-4.0" path="*.xoml" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="xamlx-Integrated-4.0" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" type="System.Xaml.Hosting.XamlHttpHandlerFactory, System.Xaml.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="aspq-Integrated-4.0" path="*.aspq" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="cshtm-Integrated-4.0" path="*.cshtm" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="cshtml-Integrated-4.0" path="*.cshtml" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="vbhtm-Integrated-4.0" path="*.vbhtm" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="vbhtml-Integrated-4.0" path="*.vbhtml" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="ScriptHandlerFactoryAppServices-Integrated-4.0" path="*_AppService.axd" verb="*" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="ScriptResourceIntegrated-4.0" path="*ScriptResource.axd" verb="GET,HEAD" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="ASPClassic" path="*.asp" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="%IIS_BIN%\asp.dll" resourceType="File" />
+ <add name="SecurityCertificate" path="*.cer" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="%IIS_BIN%\asp.dll" resourceType="File" />
+ <add name="ISAPI-dll" path="*.dll" verb="*" modules="IsapiModule" resourceType="File" requireAccess="Execute" allowPathInfo="true" />
+ <add name="TraceHandler-Integrated" path="trace.axd" verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TraceHandler" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="WebAdminHandler-Integrated" path="WebAdmin.axd" verb="GET,DEBUG" type="System.Web.Handlers.WebAdminHandler" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="AssemblyResourceLoader-Integrated" path="WebResource.axd" verb="GET,DEBUG" type="System.Web.Handlers.AssemblyResourceLoader" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="PageHandlerFactory-Integrated" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="SimpleHandlerFactory-Integrated" path="*.ashx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.SimpleHandlerFactory" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="WebServiceHandlerFactory-Integrated" path="*.asmx" verb="GET,HEAD,POST,DEBUG" type="System.Web.Services.Protocols.WebServiceHandlerFactory,System.Web.Services,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="HttpRemotingHandlerFactory-rem-Integrated" path="*.rem" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory,System.Runtime.Remoting,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="HttpRemotingHandlerFactory-soap-Integrated" path="*.soap" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory,System.Runtime.Remoting,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="AXD-ISAPI-2.0" path="*.axd" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
+ <add name="PageHandlerFactory-ISAPI-2.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
+ <add name="SimpleHandlerFactory-ISAPI-2.0" path="*.ashx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
+ <add name="WebServiceHandlerFactory-ISAPI-2.0" path="*.asmx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-rem-ISAPI-2.0" path="*.rem" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-soap-ISAPI-2.0" path="*.soap" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
+ <add name="svc-ISAPI-2.0-64" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
+ <add name="AXD-ISAPI-2.0-64" path="*.axd" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
+ <add name="PageHandlerFactory-ISAPI-2.0-64" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
+ <add name="SimpleHandlerFactory-ISAPI-2.0-64" path="*.ashx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
+ <add name="WebServiceHandlerFactory-ISAPI-2.0-64" path="*.asmx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-rem-ISAPI-2.0-64" path="*.rem" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-soap-ISAPI-2.0-64" path="*.soap" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
+ <add name="rules-64-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
+ <add name="xoml-64-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
+ <add name="CGI-exe" path="*.exe" verb="*" modules="CgiModule" resourceType="File" requireAccess="Execute" allowPathInfo="true" />
+ <add name="SSINC-stm" path="*.stm" verb="GET,HEAD,POST" modules="ServerSideIncludeModule" resourceType="File" />
+ <add name="SSINC-shtm" path="*.shtm" verb="GET,HEAD,POST" modules="ServerSideIncludeModule" resourceType="File" />
+ <add name="SSINC-shtml" path="*.shtml" verb="GET,HEAD,POST" modules="ServerSideIncludeModule" resourceType="File" />
+ <add name="TRACEVerbHandler" path="*" verb="TRACE" modules="ProtocolSupportModule" requireAccess="None" />
+ <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="ProtocolSupportModule" requireAccess="None" />
+ <add name="ExtensionlessUrl-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />
+ <add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
+ </handlers>
+ </system.webServer>
+ </location>
+</configuration>
diff --git a/TwoFactorAuth.phpproj b/TwoFactorAuth.phpproj
index 76a1830..8300517 100644
--- a/TwoFactorAuth.phpproj
+++ b/TwoFactorAuth.phpproj
@@ -14,6 +14,8 @@
<PHPDevPort>41315</PHPDevPort>
<PHPDevHostName>localhost</PHPDevHostName>
<IISProjectUrl>http://localhost:41315/</IISProjectUrl>
+ <Runtime>PHP</Runtime>
+ <RuntimeVersion>7.0</RuntimeVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<IncludeDebugInformation>true</IncludeDebugInformation>
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 0000000..63df937
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,980 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "9647de85f54ba6db237f5ff42ff85a1f",
+ "packages": [],
+ "packages-dev": [
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3,<8.0-DEV"
+ },
+ "require-dev": {
+ "athletic/athletic": "~0.1.8",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "http://ocramius.github.com/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://github.com/doctrine/instantiator",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "time": "2015-06-14T21:17:01+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8",
+ "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "suggest": {
+ "dflydev/markdown": "~1.0",
+ "erusev/parsedown": "~1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "phpDocumentor": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "mike.vanriel@naenius.com"
+ }
+ ],
+ "time": "2015-02-03T12:10:50+00:00"
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "v1.6.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "6c52c2722f8460122f96f86346600e1077ce22cb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/6c52c2722f8460122f96f86346600e1077ce22cb",
+ "reference": "6c52c2722f8460122f96f86346600e1077ce22cb",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^5.3|^7.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
+ "sebastian/comparator": "^1.1",
+ "sebastian/recursion-context": "^1.0|^2.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^2.0",
+ "phpunit/phpunit": "^4.8 || ^5.6.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Prophecy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ],
+ "time": "2016-11-21T14:58:47+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "2.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979",
+ "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "phpunit/php-file-iterator": "~1.3",
+ "phpunit/php-text-template": "~1.2",
+ "phpunit/php-token-stream": "~1.3",
+ "sebastian/environment": "^1.3.2",
+ "sebastian/version": "~1.0"
+ },
+ "require-dev": {
+ "ext-xdebug": ">=2.1.4",
+ "phpunit/phpunit": "~4"
+ },
+ "suggest": {
+ "ext-dom": "*",
+ "ext-xdebug": ">=2.2.1",
+ "ext-xmlwriter": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.2.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "time": "2015-10-06T15:47:00+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "1.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
+ "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "time": "2016-10-03T07:40:28+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "time": "2015-06-21T13:50:34+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "1.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260",
+ "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4|~5"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "time": "2016-05-12T18:03:57+00:00"
+ },
+ {
+ "name": "phpunit/php-token-stream",
+ "version": "1.4.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+ "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3b402f65a4cc90abf6e1104e388b896ce209631b",
+ "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Wrapper around PHP's tokenizer extension.",
+ "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+ "keywords": [
+ "tokenizer"
+ ],
+ "time": "2016-11-15T14:06:22+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "4.8.35",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "791b1a67c25af50e230f841ee7a9c6eba507dc87"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/791b1a67c25af50e230f841ee7a9c6eba507dc87",
+ "reference": "791b1a67c25af50e230f841ee7a9c6eba507dc87",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-pcre": "*",
+ "ext-reflection": "*",
+ "ext-spl": "*",
+ "php": ">=5.3.3",
+ "phpspec/prophecy": "^1.3.1",
+ "phpunit/php-code-coverage": "~2.1",
+ "phpunit/php-file-iterator": "~1.4",
+ "phpunit/php-text-template": "~1.2",
+ "phpunit/php-timer": "^1.0.6",
+ "phpunit/phpunit-mock-objects": "~2.3",
+ "sebastian/comparator": "~1.2.2",
+ "sebastian/diff": "~1.2",
+ "sebastian/environment": "~1.3",
+ "sebastian/exporter": "~1.2",
+ "sebastian/global-state": "~1.0",
+ "sebastian/version": "~1.0",
+ "symfony/yaml": "~2.1|~3.0"
+ },
+ "suggest": {
+ "phpunit/php-invoker": "~1.1"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.8.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "time": "2017-02-06T05:18:07+00:00"
+ },
+ {
+ "name": "phpunit/phpunit-mock-objects",
+ "version": "2.3.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+ "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983",
+ "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": ">=5.3.3",
+ "phpunit/php-text-template": "~1.2",
+ "sebastian/exporter": "~1.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "suggest": {
+ "ext-soap": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Mock Object library for PHPUnit",
+ "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+ "keywords": [
+ "mock",
+ "xunit"
+ ],
+ "time": "2015-10-02T06:51:40+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "1.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
+ "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/diff": "~1.2",
+ "sebastian/exporter": "~1.2 || ~2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "http://www.github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "time": "2017-01-29T09:50:25+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff"
+ ],
+ "time": "2015-12-08T07:14:41+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "1.3.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea",
+ "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8 || ^5.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "time": "2016-08-18T05:49:44+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "1.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4",
+ "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/recursion-context": "~1.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "time": "2016-06-17T09:04:28+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "time": "2015-10-12T03:26:01+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "913401df809e99e4f47b27cdd781f4a258d58791"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791",
+ "reference": "913401df809e99e4f47b27cdd781f4a258d58791",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "time": "2015-11-11T19:50:13+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "1.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
+ "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
+ "shasum": ""
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "time": "2015-06-21T13:59:46+00:00"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v2.8.17",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "322a8c2dfbca15ad6b1b27e182899f98ec0e0153"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/322a8c2dfbca15ad6b1b27e182899f98ec0e0153",
+ "reference": "322a8c2dfbca15ad6b1b27e182899f98ec0e0153",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.8-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Yaml Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-01-21T16:40:50+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {
+ "phpunit/phpunit": 0
+ },
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=5.3.0"
+ },
+ "platform-dev": []
+}
diff --git a/lib/Providers/Qr/QRException.php b/lib/Providers/Qr/QRException.php
index 1eba26d..c28e829 100644
--- a/lib/Providers/Qr/QRException.php
+++ b/lib/Providers/Qr/QRException.php
@@ -1,11 +1,5 @@
<?php
-namespace RobThree\Auth\Providers\Qr;
+use RobThree\Auth\TwoFactorAuthException;
-class QRException extends \Exception
-{
- function __construct($message = "", $code = 0, $exception = null)
- {
- parent::__construct($message, $code, $exception);
- }
-} \ No newline at end of file
+class QRException extends TwoFactorAuthException {} \ No newline at end of file
diff --git a/lib/Providers/Rng/RNGException.php b/lib/Providers/Rng/RNGException.php
index 48ecdd8..eb5e913 100644
--- a/lib/Providers/Rng/RNGException.php
+++ b/lib/Providers/Rng/RNGException.php
@@ -1,11 +1,5 @@
<?php
-namespace RobThree\Auth\Providers\Rng;
+use RobThree\Auth\TwoFactorAuthException;
-class RNGException extends \Exception
-{
- function __construct($message = "", $code = 0, $exception = null)
- {
- parent::__construct($message, $code, $exception);
- }
-} \ No newline at end of file
+class RNGException extends TwoFactorAuthException {} \ No newline at end of file
diff --git a/lib/TwoFactorAuth.php b/lib/TwoFactorAuth.php
index e30b711..410e61c 100644
--- a/lib/TwoFactorAuth.php
+++ b/lib/TwoFactorAuth.php
@@ -1,103 +1,78 @@
<?php
-
namespace RobThree\Auth;
+use RobThree\Auth\Providers\Qr\IQRCodeProvider;
+use RobThree\Auth\Providers\Rng\IRNGProvider;
+
// Based on / inspired by: https://github.com/PHPGangsta/GoogleAuthenticator
// Algorithms, digits, period etc. explained: https://github.com/google/google-authenticator/wiki/Key-Uri-Format
-class TwoFactorAuth
+class TwoFactorAuth
{
private $algorithm;
private $period;
private $digits;
private $issuer;
- private $qrcodeprovider;
- private $rngprovider;
+ private $qrcodeprovider = null;
+ private $rngprovider = null;
private static $_base32dict = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=';
private static $_base32;
private static $_base32lookup = array();
private static $_supportedalgos = array('sha1', 'sha256', 'sha512', 'md5');
-
- function __construct($issuer = null, $digits = 6, $period = 30, $algorithm = 'sha1', $qrcodeprovider = null, $rngprovider = null)
+
+ function __construct($issuer = null, $digits = 6, $period = 30, $algorithm = 'sha1', IQRCodeProvider $qrcodeprovider = null, IRNGProvider $rngprovider = null)
{
$this->issuer = $issuer;
-
if (!is_int($digits) || $digits <= 0)
throw new TwoFactorAuthException('Digits must be int > 0');
$this->digits = $digits;
-
+
if (!is_int($period) || $period <= 0)
throw new TwoFactorAuthException('Period must be int > 0');
$this->period = $period;
-
+
$algorithm = strtolower(trim($algorithm));
if (!in_array($algorithm, self::$_supportedalgos))
throw new TwoFactorAuthException('Unsupported algorithm: ' . $algorithm);
$this->algorithm = $algorithm;
-
- // Set default QR Code provider if none was specified
- if ($qrcodeprovider==null)
- $qrcodeprovider = new Providers\Qr\GoogleQRCodeProvider();
-
- if (!($qrcodeprovider instanceof Providers\Qr\IQRCodeProvider))
- throw new TwoFactorAuthException('QRCodeProvider must implement IQRCodeProvider');
-
$this->qrcodeprovider = $qrcodeprovider;
-
- // Try to find best available RNG provider if none was specified
- if ($rngprovider==null) {
- if (function_exists('random_bytes')) {
- $rngprovider = new Providers\Rng\CSRNGProvider();
- } elseif (function_exists('mcrypt_create_iv')) {
- $rngprovider = new Providers\Rng\MCryptRNGProvider();
- } elseif (function_exists('openssl_random_pseudo_bytes')) {
- $rngprovider = new Providers\Rng\OpenSSLRNGProvider();
- } elseif (function_exists('hash')) {
- $rngprovider = new Providers\Rng\HashRNGProvider();
- } else {
- throw new TwoFactorAuthException('Unable to find a suited RNGProvider');
- }
- }
-
- if (!($rngprovider instanceof Providers\Rng\IRNGProvider))
- throw new TwoFactorAuthException('RNGProvider must implement IRNGProvider');
-
$this->rngprovider = $rngprovider;
-
+
self::$_base32 = str_split(self::$_base32dict);
self::$_base32lookup = array_flip(self::$_base32);
}
-
+
/**
* Create a new secret
*/
- public function createSecret($bits = 80, $requirecryptosecure = true)
+ public function createSecret($bits = 80, $requirecryptosecure = true)
{
$secret = '';
$bytes = ceil($bits / 5); //We use 5 bits of each byte (since we have a 32-character 'alphabet' / BASE32)
- if ($requirecryptosecure && !$this->rngprovider->isCryptographicallySecure())
+ $rngprovider = $this->getRngprovider();
+ if ($requirecryptosecure && !$rngprovider->isCryptographicallySecure())
throw new TwoFactorAuthException('RNG provider is not cryptographically secure');
- $rnd = $this->rngprovider->getRandomBytes($bytes);
+ $rnd = $rngprovider->getRandomBytes($bytes);
for ($i = 0; $i < $bytes; $i++)
$secret .= self::$_base32[ord($rnd[$i]) & 31]; //Mask out left 3 bits for 0-31 values
return $secret;
}
-
+
/**
* Calculate the code with given secret and point in time
*/
public function getCode($secret, $time = null)
{
$secretkey = $this->base32Decode($secret);
-
+
$timestamp = "\0\0\0\0" . pack('N*', $this->getTimeSlice($this->getTime($time))); // Pack time into binary string
$hashhmac = hash_hmac($this->algorithm, $timestamp, $secretkey, true); // Hash it with users secret key
$hashpart = substr($hashhmac, ord(substr($hashhmac, -1)) & 0x0F, 4); // Use last nibble of result as index/offset and grab 4 bytes of the result
$value = unpack('N', $hashpart); // Unpack binary value
$value = $value[1] & 0x7FFFFFFF; // Drop MSB, keep only 31 bits
-
+
return str_pad($value % pow(10, $this->digits), $this->digits, '0', STR_PAD_LEFT);
}
-
+
/**
* Check if the code is correct. This will accept codes starting from ($discrepancy * $period) sec ago to ($discrepancy * period) sec from now
*/
@@ -105,57 +80,57 @@ class TwoFactorAuth
{
$result = false;
$timetamp = $this->getTime($time);
-
+
// To keep safe from timing-attachs we iterate *all* possible codes even though we already may have verified a code is correct
- for ($i = -$discrepancy; $i <= $discrepancy; $i++)
+ for ($i = -$discrepancy; $i <= $discrepancy; $i++)
$result |= $this->codeEquals($this->getCode($secret, $timetamp + ($i * $this->period)), $code);
-
+
return (bool)$result;
}
-
+
/**
* Timing-attack safe comparison of 2 codes (see http://blog.ircmaxell.com/2014/11/its-all-about-time.html)
*/
private function codeEquals($safe, $user) {
if (function_exists('hash_equals')) {
return hash_equals($safe, $user);
- } else {
- // In general, it's not possible to prevent length leaks. So it's OK to leak the length. The important part is that
- // we don't leak information about the difference of the two strings.
- if (strlen($safe)===strlen($user)) {
- $result = 0;
- for ($i = 0; $i < strlen($safe); $i++)
- $result |= (ord($safe[$i]) ^ ord($user[$i]));
- return $result === 0;
- }
+ }
+ // In general, it's not possible to prevent length leaks. So it's OK to leak the length. The important part is that
+ // we don't leak information about the difference of the two strings.
+ if (strlen($safe)===strlen($user)) {
+ $result = 0;
+ for ($i = 0; $i < strlen($safe); $i++)
+ $result |= (ord($safe[$i]) ^ ord($user[$i]));
+ return $result === 0;
}
return false;
}
-
+
/**
* Get data-uri of QRCode
*/
- public function getQRCodeImageAsDataUri($label, $secret, $size = 200)
+ public function getQRCodeImageAsDataUri($label, $secret, $size = 200)
{
if (!is_int($size) || $size <= 0)
throw new TwoFactorAuthException('Size must be int > 0');
-
+
+ $qrcodeprovider = $this->getQrCodeProvider();
return 'data:'
- . $this->qrcodeprovider->getMimeType()
+ . $qrcodeprovider->getMimeType()
. ';base64,'
- . base64_encode($this->qrcodeprovider->getQRCodeImage($this->getQRText($label, $secret), $size));
+ . base64_encode($qrcodeprovider->getQRCodeImage($this->getQRText($label, $secret), $size));
}
-
- private function getTime($time)
+
+ private function getTime($time)
{
return ($time === null) ? time() : $time;
}
-
- private function getTimeSlice($time = null, $offset = 0)
+
+ private function getTimeSlice($time = null, $offset = 0)
{
return (int)floor($time / $this->period) + ($offset * $this->period);
}
-
+
/**
* Builds a string to be encoded in a QR code
*/
@@ -168,27 +143,61 @@ class TwoFactorAuth
. '&algorithm=' . rawurlencode(strtoupper($this->algorithm))
. '&digits=' . intval($this->digits);
}
-
+
private function base32Decode($value)
{
if (strlen($value)==0) return '';
-
+
if (preg_match('/[^'.preg_quote(self::$_base32dict).']/', $value) !== 0)
throw new TwoFactorAuthException('Invalid base32 string');
-
+
$buffer = '';
- foreach (str_split($value) as $char)
+ foreach (str_split($value) as $char)
{
if ($char !== '=')
$buffer .= str_pad(decbin(self::$_base32lookup[$char]), 5, 0, STR_PAD_LEFT);
}
$length = strlen($buffer);
$blocks = trim(chunk_split(substr($buffer, 0, $length - ($length % 8)), 8, ' '));
-
+
$output = '';
foreach (explode(' ', $blocks) as $block)
$output .= chr(bindec(str_pad($block, 8, 0, STR_PAD_RIGHT)));
-
return $output;
}
-}
+ /**
+ * @return IQRCodeProvider
+ * @throws TwoFactorAuthException
+ */
+ public function getQrCodeProvider()
+ {
+ // Set default QR Code provider if none was specified
+ if (null === $this->qrcodeprovider) {
+ return $this->qrcodeprovider = new Providers\Qr\GoogleQRCodeProvider();
+ }
+ return $this->qrcodeprovider;
+ }
+ /**
+ * @return IRNGProvider
+ * @throws TwoFactorAuthException
+ */
+ public function getRngprovider()
+ {
+ if (null !== $this->rngprovider) {
+ return $this->rngprovider;
+ }
+ if (function_exists('random_bytes')) {
+ return $this->rngprovider = new Providers\Rng\CSRNGProvider();
+ }
+ if (function_exists('mcrypt_create_iv')) {
+ return $this->rngprovider = new Providers\Rng\MCryptRNGProvider();
+ }
+ if (function_exists('openssl_random_pseudo_bytes')) {
+ return $this->rngprovider = new Providers\Rng\OpenSSLRNGProvider();
+ }
+ if (function_exists('hash')) {
+ return $this->rngprovider = new Providers\Rng\HashRNGProvider();
+ }
+ throw new TwoFactorAuthException('Unable to find a suited RNGProvider');
+ }
+} \ No newline at end of file
diff --git a/lib/TwoFactorAuthException.php b/lib/TwoFactorAuthException.php
index 2d46d4e..af51b74 100644
--- a/lib/TwoFactorAuthException.php
+++ b/lib/TwoFactorAuthException.php
@@ -2,10 +2,6 @@
namespace RobThree\Auth;
-class TwoFactorAuthException extends \Exception
-{
- function __construct($message = "", $code = 0, $exception = null)
- {
- parent::__construct($message, $code, $exception);
- }
-} \ No newline at end of file
+use Exception;
+
+class TwoFactorAuthException extends \Exception {} \ No newline at end of file
diff --git a/tests/TwoFactorAuthTest.php b/tests/TwoFactorAuthTest.php
index a133dd1..c631d04 100644
--- a/tests/TwoFactorAuthTest.php
+++ b/tests/TwoFactorAuthTest.php
@@ -44,22 +44,6 @@ class TwoFactorAuthTest extends PHPUnit_Framework_TestCase
new TwoFactorAuth('Test', 6, 30, 'xxx');
}
- /**
- * @expectedException \RobThree\Auth\TwoFactorAuthException
- */
- public function testConstructorThrowsOnQrProviderNotImplementingInterface() {
-
- new TwoFactorAuth('Test', 6, 30, 'sha1', new stdClass());
- }
-
- /**
- * @expectedException \RobThree\Auth\TwoFactorAuthException
- */
- public function testConstructorThrowsOnRngProviderNotImplementingInterface() {
-
- new TwoFactorAuth('Test', 6, 30, 'sha1', null, new stdClass());
- }
-
public function testGetCodeReturnsCorrectResults() {
$tfa = new TwoFactorAuth('Test');