Skip to content

Commit

Permalink
Add support for SAML Assertion Encryption (#6)
Browse files Browse the repository at this point in the history
  • Loading branch information
spwitt authored Jun 30, 2023
1 parent 5434246 commit 3278e94
Show file tree
Hide file tree
Showing 23 changed files with 1,965 additions and 140 deletions.
12 changes: 6 additions & 6 deletions build.savant
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jakartaXMLBindVersion = "3.0.1"
slf4jVersion = "2.0.3"
testngVersion = "7.3.0"

project(group: "io.fusionauth", name: "fusionauth-samlv2", version: "0.8.6", licenses: ["ApacheV2_0"]) {
project(group: "io.fusionauth", name: "fusionauth-samlv2", version: "0.9.0", licenses: ["ApacheV2_0"]) {
workflow {
fetch {
cache()
Expand Down Expand Up @@ -53,11 +53,11 @@ project(group: "io.fusionauth", name: "fusionauth-samlv2", version: "0.8.6", lic
}

// Plugins
dependency = loadPlugin(id: "org.savantbuild.plugin:dependency:2.0.0-RC.2")
java = loadPlugin(id: "org.savantbuild.plugin:java:2.0.0-RC.2")
javaTestNG = loadPlugin(id: "org.savantbuild.plugin:java-testng:2.0.0-RC.2")
idea = loadPlugin(id: "org.savantbuild.plugin:idea:2.0.0-RC.2")
release = loadPlugin(id: "org.savantbuild.plugin:release-git:2.0.0-RC.2")
dependency = loadPlugin(id: "org.savantbuild.plugin:dependency:2.0.0-RC.6")
java = loadPlugin(id: "org.savantbuild.plugin:java:2.0.0-RC.6")
javaTestNG = loadPlugin(id: "org.savantbuild.plugin:java-testng:2.0.0-RC.6")
idea = loadPlugin(id: "org.savantbuild.plugin:idea:2.0.0-RC.7")
release = loadPlugin(id: "org.savantbuild.plugin:release-git:2.0.0-RC.6")

java.settings.javaVersion = "17"
javaTestNG.settings.javaVersion = "17"
Expand Down
90 changes: 45 additions & 45 deletions fusionauth-samlv2.iml
Original file line number Diff line number Diff line change
Expand Up @@ -17,51 +17,51 @@
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/org/slf4j/slf4j-api/2.0.3/slf4j-api-2.0.3.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/slf4j/slf4j-api/2.0.3/slf4j-api-2.0.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.savant/cache/org/slf4j/slf4j-api/2.0.3/slf4j-api-2.0.3-src.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/slf4j/slf4j-api/2.0.3/slf4j-api-2.0.3-src.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/jakarta/xml/bind/jakarta.xml.bind-api/3.0.1/jakarta.xml.bind-api-3.0.1.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/jakarta/xml/bind/jakarta.xml.bind-api/3.0.1/jakarta.xml.bind-api-3.0.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.savant/cache/jakarta/xml/bind/jakarta.xml.bind-api/3.0.1/jakarta.xml.bind-api-3.0.1-src.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/jakarta/xml/bind/jakarta.xml.bind-api/3.0.1/jakarta.xml.bind-api-3.0.1-src.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/org/testng/testng/7.3.0/testng-7.3.0.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/testng/testng/7.3.0/testng-7.3.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.savant/cache/org/testng/testng/7.3.0/testng-7.3.0-src.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/testng/testng/7.3.0/testng-7.3.0-src.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/com/beust/jcommander/1.78.0/jcommander-1.78.0.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/com/beust/jcommander/1.78.0/jcommander-1.78.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.savant/cache/com/beust/jcommander/1.78.0/jcommander-1.78.0-src.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/com/beust/jcommander/1.78.0/jcommander-1.78.0-src.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/com/google/inject/guice/4.2.2/guice-no_aop-4.2.2.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/com/google/inject/guice/4.2.2/guice-no_aop-4.2.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
Expand All @@ -70,198 +70,198 @@
<orderEntry type="module-library" scope="TEST">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/javax/inject/javax.inject/1.0.0/javax.inject-1.0.0.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/javax/inject/javax.inject/1.0.0/javax.inject-1.0.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.savant/cache/javax/inject/javax.inject/1.0.0/javax.inject-1.0.0-src.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/javax/inject/javax.inject/1.0.0/javax.inject-1.0.0-src.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/org/aopalliance/aopalliance/1.0.0/aopalliance-1.0.0.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/aopalliance/aopalliance/1.0.0/aopalliance-1.0.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.savant/cache/org/aopalliance/aopalliance/1.0.0/aopalliance-1.0.0-src.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/aopalliance/aopalliance/1.0.0/aopalliance-1.0.0-src.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/com/google/guava/guava/25.1.0-android/guava-25.1.0-android.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/com/google/guava/guava/25.1.0-android/guava-25.1.0-android.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.savant/cache/com/google/guava/guava/25.1.0-android/guava-25.1.0-android-src.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/com/google/guava/guava/25.1.0-android/guava-25.1.0-android-src.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/org/checkerframework/checker-compat-qual/2.0.0/checker-compat-qual-2.0.0.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/checkerframework/checker-compat-qual/2.0.0/checker-compat-qual-2.0.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.savant/cache/org/checkerframework/checker-compat-qual/2.0.0/checker-compat-qual-2.0.0-src.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/checkerframework/checker-compat-qual/2.0.0/checker-compat-qual-2.0.0-src.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/com/google/j2objc/j2objc-annotations/1.1.0/j2objc-annotations-1.1.0.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/com/google/j2objc/j2objc-annotations/1.1.0/j2objc-annotations-1.1.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.savant/cache/com/google/j2objc/j2objc-annotations/1.1.0/j2objc-annotations-1.1.0-src.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/com/google/j2objc/j2objc-annotations/1.1.0/j2objc-annotations-1.1.0-src.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.savant/cache/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-src.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-src.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/com/google/errorprone/error_prone_annotations/2.1.3/error_prone_annotations-2.1.3.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/com/google/errorprone/error_prone_annotations/2.1.3/error_prone_annotations-2.1.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.savant/cache/com/google/errorprone/error_prone_annotations/2.1.3/error_prone_annotations-2.1.3-src.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/com/google/errorprone/error_prone_annotations/2.1.3/error_prone_annotations-2.1.3-src.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/org/codehaus/mojo/animal-sniffer-annotations/1.14.0/animal-sniffer-annotations-1.14.0.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/codehaus/mojo/animal-sniffer-annotations/1.14.0/animal-sniffer-annotations-1.14.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.savant/cache/org/codehaus/mojo/animal-sniffer-annotations/1.14.0/animal-sniffer-annotations-1.14.0-src.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/codehaus/mojo/animal-sniffer-annotations/1.14.0/animal-sniffer-annotations-1.14.0-src.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/org/yaml/snakeyaml/1.21.0/snakeyaml-1.21.0.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/yaml/snakeyaml/1.21.0/snakeyaml-1.21.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.savant/cache/org/yaml/snakeyaml/1.21.0/snakeyaml-1.21.0-src.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/yaml/snakeyaml/1.21.0/snakeyaml-1.21.0-src.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/org/junit/junit/4.12.0/junit-4.12.0.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/junit/junit/4.12.0/junit-4.12.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.savant/cache/org/junit/junit/4.12.0/junit-4.12.0-src.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/junit/junit/4.12.0/junit-4.12.0-src.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/org/hamcrest/hamcrest-core/1.3.0/hamcrest-core-1.3.0.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/hamcrest/hamcrest-core/1.3.0/hamcrest-core-1.3.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.savant/cache/org/hamcrest/hamcrest-core/1.3.0/hamcrest-core-1.3.0-src.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/hamcrest/hamcrest-core/1.3.0/hamcrest-core-1.3.0-src.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/org/apache/ant/ant/1.10.3/ant-1.10.3.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/apache/ant/ant/1.10.3/ant-1.10.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.savant/cache/org/apache/ant/ant/1.10.3/ant-1.10.3-src.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/apache/ant/ant/1.10.3/ant-1.10.3-src.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/org/apache/ant/ant-launcher/1.10.3/ant-launcher-1.10.3.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/apache/ant/ant-launcher/1.10.3/ant-launcher-1.10.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.savant/cache/org/apache/ant/ant-launcher/1.10.3/ant-launcher-1.10.3-src.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/apache/ant/ant-launcher/1.10.3/ant-launcher-1.10.3-src.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/org/glassfish/jaxb/jaxb-runtime/3.0.2/jaxb-runtime-3.0.2.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/glassfish/jaxb/jaxb-runtime/3.0.2/jaxb-runtime-3.0.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.savant/cache/org/glassfish/jaxb/jaxb-runtime/3.0.2/jaxb-runtime-3.0.2-src.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/glassfish/jaxb/jaxb-runtime/3.0.2/jaxb-runtime-3.0.2-src.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/org/glassfish/jaxb/jaxb-core/3.0.2/jaxb-core-3.0.2.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/glassfish/jaxb/jaxb-core/3.0.2/jaxb-core-3.0.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.savant/cache/org/glassfish/jaxb/jaxb-core/3.0.2/jaxb-core-3.0.2-src.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/glassfish/jaxb/jaxb-core/3.0.2/jaxb-core-3.0.2-src.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/com/sun/activation/jakarta.activation/2.0.1/jakarta.activation-2.0.1.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/com/sun/activation/jakarta.activation/2.0.1/jakarta.activation-2.0.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.savant/cache/com/sun/activation/jakarta.activation/2.0.1/jakarta.activation-2.0.1-src.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/com/sun/activation/jakarta.activation/2.0.1/jakarta.activation-2.0.1-src.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/org/glassfish/jaxb/txw2/3.0.2/txw2-3.0.2.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/glassfish/jaxb/txw2/3.0.2/txw2-3.0.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.savant/cache/org/glassfish/jaxb/txw2/3.0.2/txw2-3.0.2-src.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/org/glassfish/jaxb/txw2/3.0.2/txw2-3.0.2-src.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/.savant/cache/com/sun/istack/istack-commons-runtime/4.0.1/istack-commons-runtime-4.0.1.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/com/sun/istack/istack-commons-runtime/4.0.1/istack-commons-runtime-4.0.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.savant/cache/com/sun/istack/istack-commons-runtime/4.0.1/istack-commons-runtime-4.0.1-src.jar!/" />
<root url="jar://$MODULE_DIR$/.savant/cache/com/sun/istack/istack-commons-runtime/4.0.1/istack-commons-runtime-4.0.1-src.jar!/" />
</SOURCES>
</library>
</orderEntry>
Expand Down
38 changes: 1 addition & 37 deletions fusionauth-samlv2.ipr
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,7 @@
<fileSet type="globPattern" pattern="*.css" />
<fileSet type="globPattern" pattern="*.ftl" />
<fileSet type="globPattern" pattern="*.sql" />
<fileSet type="globPattern" pattern="*.xsd" />
<fileSet type="globPattern" pattern="build.savant" />
</list>
</option>
Expand Down Expand Up @@ -472,43 +473,6 @@
<option name="EXPR_CASE_THEN_WRAP" value="true" />
<option name="PRIMARY_KEY_NAME_TEMPLATE" value="{table}_{columns}_pk" />
</H2CodeStyleSettings>
<H2CodeStyleSettings version="6">
<option name="USE_GENERAL_STYLE" value="false" />
<option name="TYPE_CASE" value="3" />
<option name="CUSTOM_TYPE_CASE" value="3" />
<option name="ALIAS_CASE" value="4" />
<option name="BUILT_IN_CASE" value="0" />
<option name="QUERY_TRUE_INDENT" value="false" />
<option name="QUERY_ALIGN_ELEMENTS" value="false" />
<option name="QUERY_ALIGN_LINE_COMMENTS" value="false" />
<option name="INSERT_EL_COMMA" value="2" />
<option name="SET_EL_WRAP" value="0" />
<option name="SET_EL_COMMA" value="0" />
<option name="WITH_EL_WRAP" value="0" />
<option name="WITH_EL_COMMA" value="0" />
<option name="SELECT_EL_WRAP" value="3" />
<option name="SELECT_EL_COMMA" value="2" />
<option name="FROM_EL_WRAP" value="2" />
<option name="FROM_EL_COMMA" value="2" />
<option name="FROM_PLACE_ON" value="10" />
<option name="WHERE_EL_WRAP" value="3" />
<option name="WHERE_EL_BOUND" value="2" />
<option name="ORDER_EL_COMMA" value="2" />
<option name="TABLE_OPENING" value="1" />
<option name="TABLE_CONTENT" value="2" />
<option name="TABLE_CLOSING" value="3" />
<option name="TABLE_ALTER_INSTRUCTION_ALIGN" value="false" />
<option name="POST_OPT_WRAP_1" value="true" />
<option name="POST_OPT_ALIGN" value="false" />
<option name="ROUTINE_ARG_COMMA" value="2" />
<option name="ROUTINE_ARG_ALIGN_TYPES" value="true" />
<option name="IMP_DECLARE_EL_WRAP" value="1" />
<option name="IMP_IF_THEN_WRAP_THEN" value="true" />
<option name="CORTEGE_SPACE_BEFORE_L_PAREN" value="false" />
<option name="EXPR_CASE_WHEN_WRAP" value="false" />
<option name="EXPR_CASE_THEN_WRAP" value="true" />
<option name="PRIMARY_KEY_NAME_TEMPLATE" value="{table}_{columns}_pk" />
</H2CodeStyleSettings>
<HSQLCodeStyleSettings version="6">
<option name="USE_GENERAL_STYLE" value="false" />
<option name="TYPE_CASE" value="3" />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2019, Inversoft Inc., All Rights Reserved
* Copyright (c) 2019-2023, Inversoft Inc., All Rights Reserved
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -16,7 +16,7 @@
package io.fusionauth.samlv2.domain;

/**
* The SAML v2.0 authentication response object that is sent back from the IDP.
* The SAML v2.0 authentication request object that is sent from the SP.
*
* @author Brian Pontarelli
*/
Expand Down
Loading

0 comments on commit 3278e94

Please sign in to comment.