mirror of
				https://github.com/gyurix1968/guacamole-client.git
				synced 2025-10-31 00:53:21 +00:00 
			
		
		
		
	GUACAMOLE-1289: Merge refactor Duo and authentication flow
This commit is contained in:
		| @@ -1,201 +0,0 @@ | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "[]" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright [yyyy] [name of copyright owner] | ||||
|  | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
|  | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| @@ -1,4 +1,4 @@ | ||||
| okhttp logging-interceptor (https://square.github.io/okhttp/) | ||||
| OkHttp Logging Interceptor (https://square.github.io/okhttp/) | ||||
| ------------------------------------------------------------- | ||||
|  | ||||
|     Version: 4.9.1 | ||||
|   | ||||
| @@ -1,201 +0,0 @@ | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "[]" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright [yyyy] [name of copyright owner] | ||||
|  | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
|  | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| @@ -1,13 +0,0 @@ | ||||
| Copyright 2019 Square, Inc. | ||||
|  | ||||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| you may not use this file except in compliance with the License. | ||||
| You may obtain a copy of the License at | ||||
|  | ||||
|    http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
| Unless required by applicable law or agreed to in writing, software | ||||
| distributed under the License is distributed on an "AS IS" BASIS, | ||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| See the License for the specific language governing permissions and | ||||
| limitations under the License. | ||||
| @@ -1,7 +0,0 @@ | ||||
| okhttp (https://square.github.io/okhttp/) | ||||
| --------------------------------------------- | ||||
|  | ||||
|     Version: 3.14.9 | ||||
|     From: 'Square Inc' | ||||
|     License(s): | ||||
|         Apache 2.0 | ||||
| @@ -1 +0,0 @@ | ||||
| com.squareup.okhttp3:okhttp:jar:3.14.9 | ||||
							
								
								
									
										8
									
								
								doc/licenses/okhttp-4.12.0/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								doc/licenses/okhttp-4.12.0/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| OkHttp (https://square.github.io/okhttp/) | ||||
| ----------------------------------------- | ||||
|  | ||||
|     Version: 4.12.0 | ||||
|     From: 'Square Inc' | ||||
|     License(s): | ||||
|         Apache 2.0 | ||||
|  | ||||
							
								
								
									
										2
									
								
								doc/licenses/okhttp-4.12.0/dep-coordinates.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								doc/licenses/okhttp-4.12.0/dep-coordinates.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| com.squareup.okhttp3:okhttp:jar:4.12.0 | ||||
| com.squareup.okhttp3:logging-interceptor:jar:4.12.0 | ||||
| @@ -1,201 +0,0 @@ | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "[]" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright [yyyy] [name of copyright owner] | ||||
|  | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
|  | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| @@ -1,7 +0,0 @@ | ||||
| okhttp (https://square.github.io/okhttp/) | ||||
| --------------------------------------------- | ||||
|  | ||||
|     Version: 4.9.1 | ||||
|     From: 'Square Inc' | ||||
|     License(s): | ||||
|         Apache 2.0 | ||||
| @@ -1 +0,0 @@ | ||||
| com.squareup.okhttp3:okhttp:jar:4.9.1 | ||||
| @@ -1,201 +0,0 @@ | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "[]" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright [yyyy] [name of copyright owner] | ||||
|  | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
|  | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| @@ -1,13 +0,0 @@ | ||||
| Copyright 2013 Square, Inc. | ||||
|  | ||||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| you may not use this file except in compliance with the License. | ||||
| You may obtain a copy of the License at | ||||
|  | ||||
|    http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
| Unless required by applicable law or agreed to in writing, software | ||||
| distributed under the License is distributed on an "AS IS" BASIS, | ||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| See the License for the specific language governing permissions and | ||||
| limitations under the License. | ||||
| @@ -1,7 +0,0 @@ | ||||
| okio (https://square.github.io/okio/) | ||||
| --------------------------------------------- | ||||
|  | ||||
|     Version: 1.17.2 | ||||
|     From: 'Square Inc' | ||||
|     License(s): | ||||
|         Apache 2.0 (bundled/retrofit-2.9.0/LICENSE.txt) | ||||
| @@ -1 +0,0 @@ | ||||
| com.squareup.okio:okio:jar:1.17.2 | ||||
| @@ -1,201 +0,0 @@ | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "[]" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright [yyyy] [name of copyright owner] | ||||
|  | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
|  | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| @@ -1,7 +0,0 @@ | ||||
| okio (https://square.github.io/okio/) | ||||
| --------------------------------------------- | ||||
|  | ||||
|     Version: 2.8.0 | ||||
|     From: 'Square Inc' | ||||
|     License(s): | ||||
|         Apache 2.0 (bundled/retrofit-2.9.0/LICENSE.txt) | ||||
| @@ -1 +0,0 @@ | ||||
| com.squareup.okio:okio:jar:2.8.0 | ||||
							
								
								
									
										8
									
								
								doc/licenses/okio-3.6.0/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								doc/licenses/okio-3.6.0/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| Okio (https://square.github.io/okio/) | ||||
| ------------------------------------- | ||||
|  | ||||
|     Version: 3.6.0 | ||||
|     From: 'Square Inc' | ||||
|     License(s): | ||||
|         Apache 2.0 | ||||
|  | ||||
							
								
								
									
										2
									
								
								doc/licenses/okio-3.6.0/dep-coordinates.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								doc/licenses/okio-3.6.0/dep-coordinates.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| com.squareup.okio:okio:jar:3.6.0 | ||||
| com.squareup.okio:okio-jvm:jar:3.6.0 | ||||
| @@ -1,201 +0,0 @@ | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "[]" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright [yyyy] [name of copyright owner] | ||||
|  | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
|  | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| @@ -1,8 +1,8 @@ | ||||
| retrofit (https://square.github.io/retrofit/) | ||||
| Retrofit (https://square.github.io/retrofit/) | ||||
| --------------------------------------------- | ||||
|  | ||||
|     Version: 2.9.0 | ||||
|     From: 'Square Inc' | ||||
|     License(s): | ||||
|         Apache 2.0 (bundled/retrofit-2.9.0/LICENSE.txt) | ||||
|         Apache 2.0 | ||||
|  | ||||
|   | ||||
| @@ -1,202 +0,0 @@ | ||||
|  | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         https://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "{}" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright {yyyy} {name of copyright owner} | ||||
|  | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
|  | ||||
|        https://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| @@ -1,7 +0,0 @@ | ||||
| Spring Framework (https://spring.io/projects/spring-framework) | ||||
| -------------------------------------------------------------- | ||||
|  | ||||
|     Version: 5.3.25 | ||||
|     From: 'Spring' (https://spring.io/) | ||||
|     License(s): | ||||
|         Apache v2.0 | ||||
| @@ -1,4 +0,0 @@ | ||||
| org.springframework:spring-web:jar:5.3.25 | ||||
| org.springframework:spring-beans:jar:5.3.25 | ||||
| org.springframework:spring-core:jar:5.3.25 | ||||
| org.springframework:spring-jcl:jar:5.3.25 | ||||
| @@ -39,33 +39,10 @@ | ||||
|  | ||||
|     <properties> | ||||
|         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||||
|         <okhttp.version>4.12.0</okhttp.version> | ||||
|         <kotlin.version>1.9.23</kotlin.version> | ||||
|     </properties> | ||||
|  | ||||
|     <dependencyManagement> | ||||
|         <dependencies> | ||||
|             <!-- Define okhttp version to use everywhere to resolve conflict --> | ||||
|             <dependency> | ||||
|                 <groupId>com.squareup.okhttp3</groupId> | ||||
|                 <artifactId>okhttp</artifactId> | ||||
|                 <version>4.9.1</version> <!-- Specify the desired version --> | ||||
|             </dependency> | ||||
|  | ||||
|             <!-- Force the use of a consistent version of Kotlin standard library common --> | ||||
|             <dependency> | ||||
|                 <groupId>org.jetbrains.kotlin</groupId> | ||||
|                 <artifactId>kotlin-stdlib-common</artifactId> | ||||
|                 <version>1.4.10</version> | ||||
|             </dependency> | ||||
|  | ||||
|             <dependency> | ||||
|                 <groupId>org.jetbrains.kotlin</groupId> | ||||
|                 <artifactId>kotlin-stdlib</artifactId> | ||||
|                 <version>1.4.10</version> | ||||
|             </dependency> | ||||
|  | ||||
|         </dependencies> | ||||
|     </dependencyManagement> | ||||
|  | ||||
|     <dependencies> | ||||
|  | ||||
|        <!-- Guacamole Extension API --> | ||||
| @@ -101,13 +78,56 @@ | ||||
|             <groupId>com.duosecurity</groupId> | ||||
|             <artifactId>duo-universal-sdk</artifactId> | ||||
|             <version>1.1.3</version> | ||||
|             <exclusions> | ||||
|                 <exclusion> | ||||
|                     <groupId>com.squareup.okhttp3</groupId> | ||||
|                     <artifactId>okhttp</artifactId> | ||||
|                 </exclusion> | ||||
|                 <exclusion> | ||||
|                     <groupId>com.squareup.okhttp3</groupId> | ||||
|                     <artifactId>logging-interceptor</artifactId> | ||||
|                 </exclusion> | ||||
|             </exclusions> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- spring-web --> | ||||
|         <!-- Force the use of a consistent version of "okhttp" --> | ||||
|         <dependency> | ||||
|             <groupId>org.springframework</groupId> | ||||
|             <artifactId>spring-web</artifactId> | ||||
|             <version>5.3.25</version> | ||||
|             <groupId>com.squareup.okhttp3</groupId> | ||||
|             <artifactId>okhttp</artifactId> | ||||
|             <version>${okhttp.version}</version> | ||||
|             <exclusions> | ||||
|                 <exclusion> | ||||
|                     <groupId>org.jetbrains.kotlin</groupId> | ||||
|                     <artifactId>kotlin-stdlib-common</artifactId> | ||||
|                 </exclusion> | ||||
|                 <exclusion> | ||||
|                     <groupId>org.jetbrains.kotlin</groupId> | ||||
|                     <artifactId>kotlin-stdlib-jdk8</artifactId> | ||||
|                 </exclusion> | ||||
|             </exclusions> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>com.squareup.okhttp3</groupId> | ||||
|             <artifactId>logging-interceptor</artifactId> | ||||
|             <version>${okhttp.version}</version> | ||||
|             <exclusions> | ||||
|                 <exclusion> | ||||
|                     <groupId>org.jetbrains.kotlin</groupId> | ||||
|                     <artifactId>kotlin-stdlib-jdk8</artifactId> | ||||
|                 </exclusion> | ||||
|             </exclusions> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- Force the use of a consistent version of Kotlin standard library common --> | ||||
|         <dependency> | ||||
|             <groupId>org.jetbrains.kotlin</groupId> | ||||
|             <artifactId>kotlin-stdlib-common</artifactId> | ||||
|             <version>${kotlin.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.jetbrains.kotlin</groupId> | ||||
|             <artifactId>kotlin-stdlib-jdk8</artifactId> | ||||
|             <version>${kotlin.version}</version> | ||||
|         </dependency> | ||||
|  | ||||
|     </dependencies> | ||||
|   | ||||
| @@ -21,9 +21,11 @@ package org.apache.guacamole.auth.duo; | ||||
|  | ||||
| import com.google.inject.Guice; | ||||
| import com.google.inject.Injector; | ||||
| import javax.servlet.http.HttpServletRequest; | ||||
| import org.apache.guacamole.GuacamoleException; | ||||
| import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; | ||||
| import org.apache.guacamole.net.auth.AuthenticatedUser; | ||||
| import org.apache.guacamole.net.auth.Credentials; | ||||
| import org.apache.guacamole.net.auth.UserContext; | ||||
|  | ||||
| /** | ||||
| @@ -41,10 +43,16 @@ public class DuoAuthenticationProvider extends AbstractAuthenticationProvider { | ||||
|     public static String PROVIDER_IDENTIFER = "duo"; | ||||
|  | ||||
|     /** | ||||
|      * Injector which will manage the object graph of this authentication | ||||
|      * provider. | ||||
|      * Service for verifying the identity of users that Guacamole has otherwise | ||||
|      * already authenticated. | ||||
|      */ | ||||
|     private final Injector injector; | ||||
|     private final UserVerificationService verificationService; | ||||
|  | ||||
|     /** | ||||
|      * Session manager for storing/retrieving the state of a user's | ||||
|      * authentication attempt while they are redirected to the Duo service. | ||||
|      */ | ||||
|     private final DuoAuthenticationSessionManager sessionManager; | ||||
|  | ||||
|     /** | ||||
|      * Creates a new DuoAuthenticationProvider that verifies users | ||||
| @@ -57,10 +65,13 @@ public class DuoAuthenticationProvider extends AbstractAuthenticationProvider { | ||||
|     public DuoAuthenticationProvider() throws GuacamoleException { | ||||
|  | ||||
|         // Set up Guice injector. | ||||
|         injector = Guice.createInjector( | ||||
|         Injector injector = Guice.createInjector( | ||||
|             new DuoAuthenticationProviderModule(this) | ||||
|         ); | ||||
|  | ||||
|         sessionManager = injector.getInstance(DuoAuthenticationSessionManager.class); | ||||
|         verificationService = injector.getInstance(UserVerificationService.class); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
| @@ -69,11 +80,33 @@ public class DuoAuthenticationProvider extends AbstractAuthenticationProvider { | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public UserContext getUserContext(AuthenticatedUser authenticatedUser) | ||||
|     public Credentials updateCredentials(Credentials credentials) | ||||
|             throws GuacamoleException { | ||||
|  | ||||
|         UserVerificationService verificationService = | ||||
|                 injector.getInstance(UserVerificationService.class); | ||||
|         // Ignore requests with no corresponding authentication session ID, as | ||||
|         // there are no credentials to reconstitute if the user has not yet | ||||
|         // attempted to authenticate | ||||
|         HttpServletRequest request = credentials.getRequest(); | ||||
|         String duoState = request.getParameter(UserVerificationService.DUO_STATE_PARAMETER_NAME); | ||||
|         if (duoState == null) | ||||
|             return credentials; | ||||
|  | ||||
|         // Ignore requests with invalid/expired authentication session IDs | ||||
|         DuoAuthenticationSession session = sessionManager.resume(duoState); | ||||
|         if (session == null) | ||||
|             return credentials; | ||||
|  | ||||
|         // Reconstitute the originally-provided credentials from the users | ||||
|         // authentication attempt prior to being redirected to Duo | ||||
|         Credentials previousCredentials = session.getCredentials(); | ||||
|         previousCredentials.setRequest(request); | ||||
|         return previousCredentials; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public UserContext getUserContext(AuthenticatedUser authenticatedUser) | ||||
|             throws GuacamoleException { | ||||
|  | ||||
|         // Verify user against Duo service | ||||
|         verificationService.verifyAuthenticatedUser(authenticatedUser); | ||||
| @@ -84,4 +117,9 @@ public class DuoAuthenticationProvider extends AbstractAuthenticationProvider { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void shutdown() { | ||||
|         sessionManager.shutdown(); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,65 @@ | ||||
| /* | ||||
|  * Licensed to the Apache Software Foundation (ASF) under one | ||||
|  * or more contributor license agreements.  See the NOTICE file | ||||
|  * distributed with this work for additional information | ||||
|  * regarding copyright ownership.  The ASF licenses this file | ||||
|  * to you under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance | ||||
|  * with the License.  You may obtain a copy of the License at | ||||
|  * | ||||
|  *   http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, | ||||
|  * software distributed under the License is distributed on an | ||||
|  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||||
|  * KIND, either express or implied.  See the License for the | ||||
|  * specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  */ | ||||
|  | ||||
| package org.apache.guacamole.auth.duo; | ||||
|  | ||||
| import org.apache.guacamole.net.auth.AuthenticationSession; | ||||
| import org.apache.guacamole.net.auth.Credentials; | ||||
|  | ||||
| /** | ||||
|  * Representation of an in-progress Duo authentication attempt. | ||||
|  */ | ||||
| public class DuoAuthenticationSession extends AuthenticationSession { | ||||
|  | ||||
|     /** | ||||
|      * The credentials that the user originally provided to Guacamole prior to | ||||
|      * being redirected to the Duo service. | ||||
|      */ | ||||
|     private final Credentials credentials; | ||||
|  | ||||
|     /** | ||||
|      * Creates a new AuthenticationSession representing an in-progress Duo | ||||
|      * authentication attempt. | ||||
|      * | ||||
|      * @param credentials | ||||
|      *     The credentials that the user originally provided to Guacamole prior | ||||
|      *     to being redirected to the Duo service. | ||||
|      * | ||||
|      * @param expires | ||||
|      *     The number of milliseconds that may elapse before this session must | ||||
|      *     be considered invalid. | ||||
|      */ | ||||
|     public DuoAuthenticationSession(Credentials credentials, long expires) { | ||||
|         super(expires); | ||||
|         this.credentials = credentials; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the credentials that the user originally provided to Guacamole | ||||
|      * prior to being redirected to the Duo service. | ||||
|      * | ||||
|      * @return | ||||
|      *     The credentials that the user originally provided to Guacamole prior | ||||
|      *     to being redirected to the Duo service. | ||||
|      */ | ||||
|     public Credentials getCredentials() { | ||||
|         return credentials; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,36 @@ | ||||
| /* | ||||
|  * Licensed to the Apache Software Foundation (ASF) under one | ||||
|  * or more contributor license agreements.  See the NOTICE file | ||||
|  * distributed with this work for additional information | ||||
|  * regarding copyright ownership.  The ASF licenses this file | ||||
|  * to you under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance | ||||
|  * with the License.  You may obtain a copy of the License at | ||||
|  * | ||||
|  *   http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, | ||||
|  * software distributed under the License is distributed on an | ||||
|  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||||
|  * KIND, either express or implied.  See the License for the | ||||
|  * specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  */ | ||||
|  | ||||
| package org.apache.guacamole.auth.duo; | ||||
|  | ||||
| import com.google.inject.Singleton; | ||||
| import org.apache.guacamole.net.auth.AuthenticationSessionManager; | ||||
|  | ||||
| /** | ||||
|  * Manager service that temporarily stores authentication attempts while | ||||
|  * the Duo authentication flow is underway. | ||||
|  */ | ||||
| @Singleton | ||||
| public class DuoAuthenticationSessionManager | ||||
|         extends AuthenticationSessionManager<DuoAuthenticationSession> { | ||||
|  | ||||
|     // Intentionally empty (the default functions inherited from the | ||||
|     // AuthenticationSessionManager base class are sufficient for our needs) | ||||
|  | ||||
| } | ||||
| @@ -26,12 +26,12 @@ import com.google.inject.Inject; | ||||
| import java.net.URI; | ||||
| import java.net.URISyntaxException; | ||||
| import java.util.Collections; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| import javax.servlet.http.HttpServletRequest; | ||||
| import org.apache.guacamole.GuacamoleException; | ||||
| import org.apache.guacamole.GuacamoleServerException; | ||||
| import org.apache.guacamole.auth.duo.conf.ConfigurationService; | ||||
| import org.apache.guacamole.form.RedirectField; | ||||
| import org.apache.guacamole.language.TranslatableGuacamoleClientException; | ||||
| import org.apache.guacamole.language.TranslatableGuacamoleInsufficientCredentialsException; | ||||
| import org.apache.guacamole.language.TranslatableMessage; | ||||
| import org.apache.guacamole.net.auth.AuthenticatedUser; | ||||
| @@ -39,24 +39,34 @@ import org.apache.guacamole.net.auth.Credentials; | ||||
| import org.apache.guacamole.net.auth.credentials.CredentialsInfo; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
| import org.springframework.web.util.UriComponentsBuilder; | ||||
|  | ||||
| /** | ||||
|  * Service for verifying the identity of a user against Duo. | ||||
|  */ | ||||
| public class UserVerificationService { | ||||
|  | ||||
|     /** | ||||
|      * Logger for this class. | ||||
|      */ | ||||
|     private static final Logger logger = LoggerFactory.getLogger(UserVerificationService.class); | ||||
|  | ||||
|     /** | ||||
|      * The name of the parameter which Duo will return in it's GET call-back | ||||
|      * that contains the code that the client will use to generate a token. | ||||
|      * The name of the HTTP parameter that Duo will use to communicate the | ||||
|      * result of the user's attempt to authenticate with their service. This | ||||
|      * parameter is provided in the GET request received when Duo redirects the | ||||
|      * user back to Guacamole. | ||||
|      */ | ||||
|     public static final String DUO_CODE_PARAMETER_NAME = "duo_code"; | ||||
|  | ||||
|     /** | ||||
|      * The name of the parameter that will be used in the GET call-back that | ||||
|      * contains the session state. | ||||
|      * The name of the HTTP parameter that we will be using to hold the opaque | ||||
|      * authentication session ID. This session ID is transmitted to Duo during | ||||
|      * the initial redirect and received back from Duo via this parameter in | ||||
|      * the GET request received when Duo redirects the user back to Guacamole. | ||||
|      * The session ID is ultimately used to reconstitute the original | ||||
|      * credentials received from the user by Guacamole such that parameter | ||||
|      * tokens like GUAC_USERNAME and GUAC_PASSWORD can continue to work as | ||||
|      * expected. | ||||
|      */ | ||||
|     public static final String DUO_STATE_PARAMETER_NAME = "state"; | ||||
|  | ||||
| @@ -66,6 +76,13 @@ public class UserVerificationService { | ||||
|      */ | ||||
|     private static final String DUO_TOKEN_SUCCESS_VALUE = "allow"; | ||||
|  | ||||
|     /** | ||||
|      * Session manager for storing/retrieving the state of a user's | ||||
|      * authentication attempt while they are redirected to the Duo service. | ||||
|      */ | ||||
|     @Inject | ||||
|     private DuoAuthenticationSessionManager sessionManager; | ||||
|  | ||||
|     /** | ||||
|      * Service for retrieving Duo configuration information. | ||||
|      */ | ||||
| @@ -90,79 +107,141 @@ public class UserVerificationService { | ||||
|     public void verifyAuthenticatedUser(AuthenticatedUser authenticatedUser) | ||||
|             throws GuacamoleException { | ||||
|  | ||||
|         // Pull the original HTTP request used to authenticate | ||||
|         Credentials credentials = authenticatedUser.getCredentials(); | ||||
|         HttpServletRequest request = credentials.getRequest(); | ||||
|  | ||||
|         // Ignore anonymous users | ||||
|         if (authenticatedUser.getIdentifier().equals(AuthenticatedUser.ANONYMOUS_IDENTIFIER)) | ||||
|         // Ignore anonymous users (unverifiable) | ||||
|         String username = authenticatedUser.getIdentifier(); | ||||
|         if (username.equals(AuthenticatedUser.ANONYMOUS_IDENTIFIER)) | ||||
|             return; | ||||
|  | ||||
|         String username = authenticatedUser.getIdentifier(); | ||||
|  | ||||
|         // Obtain a Duo client for redirecting the user to the Duo service and | ||||
|         // verifying any received authentication code | ||||
|         Client duoClient; | ||||
|         try { | ||||
|  | ||||
|             String redirectUrl = confService.getRedirectUri().toString(); | ||||
|  | ||||
|             String builtUrl = UriComponentsBuilder | ||||
|                     .fromUriString(redirectUrl) | ||||
|                     .queryParam(Credentials.RESUME_QUERY, DuoAuthenticationProvider.PROVIDER_IDENTIFER) | ||||
|                     .build() | ||||
|                     .toUriString(); | ||||
|  | ||||
|             // Set up the Duo Client | ||||
|             Client duoClient = new Client.Builder( | ||||
|             duoClient = new Client.Builder( | ||||
|                     confService.getClientId(), | ||||
|                     confService.getClientSecret(), | ||||
|                     confService.getAPIHostname(), | ||||
|                     builtUrl) | ||||
|                     confService.getRedirectUri().toString()) | ||||
|                     .build(); | ||||
|         } | ||||
|         catch (DuoException e) { | ||||
|             throw new GuacamoleServerException("Client for communicating with " | ||||
|                     + "the Duo authentication service could not be created.", e); | ||||
|         } | ||||
|  | ||||
|         // Verify that the Duo service is healthy and available | ||||
|         try { | ||||
|             duoClient.healthCheck(); | ||||
|         } | ||||
|         catch (DuoException e) { | ||||
|             throw new GuacamoleServerException("Duo authentication service is " | ||||
|                     + "not currently available (failed health check).", e); | ||||
|         } | ||||
|  | ||||
|             // Retrieve signed Duo Code and State from the request | ||||
|         // Pull the original HTTP request used to authenticate, as well as any | ||||
|         // associated credentials | ||||
|         Credentials credentials = authenticatedUser.getCredentials(); | ||||
|         HttpServletRequest request = credentials.getRequest(); | ||||
|  | ||||
|         // Retrieve signed Duo authentication code and session state from the | ||||
|         // request (these will be absent if this is an initial authentication | ||||
|         // attempt and not a redirect back from Duo) | ||||
|         String duoCode = request.getParameter(DUO_CODE_PARAMETER_NAME); | ||||
|         String duoState = request.getParameter(DUO_STATE_PARAMETER_NAME); | ||||
|  | ||||
|             // If no code or state is received, assume Duo MFA redirect has not occured and do it | ||||
|             if (duoCode == null || duoState == null) { | ||||
|         // Redirect to Duo to obtain an authentication code if that redirect | ||||
|         // has not yet occurred | ||||
|         if (duoCode != null && duoState != null) { | ||||
|  | ||||
|                 // Get a new session state from the Duo client | ||||
|             // Validate that the user has successfully verified their identify with | ||||
|             // the Duo service | ||||
|             try { | ||||
|  | ||||
|                 // Note unexpected behavior (Duo is expected to always return | ||||
|                 // a token) | ||||
|                 Token token = duoClient.exchangeAuthorizationCodeFor2FAResult(duoCode, username); | ||||
|                 if (token == null) { | ||||
|                     logger.warn("Duo did not return an authentication result " | ||||
|                             + "at all for the authentication attempt by user " | ||||
|                             + "\"{}\". This is unexpected behavior and may be " | ||||
|                             + "a bug in the Duo service or the Duo SDK. " | ||||
|                             + "Guacamole will attempt to automatically work " | ||||
|                             + "around the issue by making a fresh Duo " | ||||
|                             + "authentication request.", username); | ||||
|                 } | ||||
|  | ||||
|                 // Warn if Duo explicitly denies authentication | ||||
|                 else if (token.getAuth_result() == null || !DUO_TOKEN_SUCCESS_VALUE.equals(token.getAuth_result().getStatus())) { | ||||
|                     logger.warn("Duo did not return an explicitly successful " | ||||
|                             + "authentication result for the authentication " | ||||
|                             + "attempt by user \"{}\". The user will now be " | ||||
|                             + "redirected back to the Duo service to reattempt" | ||||
|                             + "authentication.", username); | ||||
|                 } | ||||
|  | ||||
|                 // Allow user to continue authenticating with Guacamole only if | ||||
|                 // Duo has validated their identity | ||||
|                 else | ||||
|                     return; | ||||
|  | ||||
|             } | ||||
|             catch (DuoException e) { | ||||
|                 logger.debug("The Duo client failed internally while " | ||||
|                         + "attempting to validate the identity of user " | ||||
|                         + "\"{}\". This is commonly caused by stale query " | ||||
|                         + "parameters from an older Duo request remaining " | ||||
|                         + "present in the Guacamole URL. The user will now be " | ||||
|                         + "redirected back to the Duo service to reattempt " | ||||
|                         + "authentication.", e); | ||||
|             } | ||||
|  | ||||
|         } | ||||
|  | ||||
|         // Store received credentials for later retrieval leveraging Duo's | ||||
|         // opaque session state identifier (we need to maintain these | ||||
|         // credentials so that things like the GUAC_USERNAME and | ||||
|         // GUAC_PASSWORD tokens continue to work as expected despite the | ||||
|         // redirect to/from the external Duo service) | ||||
|         duoState = duoClient.generateState(); | ||||
|                 long expirationTimestamp = System.currentTimeMillis() + (confService.getAuthTimeout() * 1000L); | ||||
|         long expiresAfter = TimeUnit.MINUTES.toMillis(confService.getAuthenticationTimeout()); | ||||
|         sessionManager.defer(new DuoAuthenticationSession(credentials, expiresAfter), duoState); | ||||
|  | ||||
|                 // Request additional credentials | ||||
|         // Obtain authentication URL from Duo client | ||||
|         String duoAuthUrlString; | ||||
|         try { | ||||
|             duoAuthUrlString = duoClient.createAuthUrl(username, duoState); | ||||
|         } | ||||
|         catch (DuoException e) { | ||||
|             throw new GuacamoleServerException("Duo client failed to " | ||||
|                     + "generate the authentication URL necessary to " | ||||
|                     + "redirect the authenticating user to the Duo " | ||||
|                     + "service.", e); | ||||
|         } | ||||
|  | ||||
|         // Parse and validate URL obtained from Duo client | ||||
|         URI duoAuthUrl; | ||||
|         try { | ||||
|             duoAuthUrl = new URI(duoAuthUrlString); | ||||
|         } | ||||
|         catch (URISyntaxException e) { | ||||
|             throw new GuacamoleServerException("Authentication URL " | ||||
|                     + "generated by the Duo client is not actually a " | ||||
|                     + "valid URL and cannot be used to redirect the " | ||||
|                     + "authenticating user to the Duo service.", e); | ||||
|         } | ||||
|  | ||||
|         // Request that user be redirected to the Duo service to obtain | ||||
|         // a Duo authentication code | ||||
|         throw new TranslatableGuacamoleInsufficientCredentialsException( | ||||
|             "Verification using Duo is required before authentication " | ||||
|             + "can continue.", "LOGIN.INFO_DUO_AUTH_REQUIRED", | ||||
|             new CredentialsInfo(Collections.singletonList( | ||||
|                 new RedirectField( | ||||
|                                 DUO_CODE_PARAMETER_NAME, | ||||
|                                 new URI(duoClient.createAuthUrl(username, duoState)), | ||||
|                         DUO_CODE_PARAMETER_NAME, duoAuthUrl, | ||||
|                         new TranslatableMessage("LOGIN.INFO_DUO_REDIRECT_PENDING") | ||||
|                 ) | ||||
|                     )), | ||||
|                     duoState, DuoAuthenticationProvider.PROVIDER_IDENTIFER,  | ||||
|                     DUO_STATE_PARAMETER_NAME, expirationTimestamp | ||||
|             )) | ||||
|         ); | ||||
|  | ||||
|     } | ||||
|  | ||||
|             // Get the token from the DuoClient using the code and username, and check status | ||||
|             Token token = duoClient.exchangeAuthorizationCodeFor2FAResult(duoCode, username); | ||||
|             if (token == null  | ||||
|                     || token.getAuth_result() == null  | ||||
|                     || !DUO_TOKEN_SUCCESS_VALUE.equals(token.getAuth_result().getStatus())) | ||||
|                 throw new TranslatableGuacamoleClientException("Provided Duo " | ||||
|                         + "validation code is incorrect.", | ||||
|                         "LOGIN.INFO_DUO_VALIDATION_CODE_INCORRECT"); | ||||
|         } | ||||
|         catch (DuoException e) { | ||||
|             throw new GuacamoleServerException("Duo Client error.", e); | ||||
|         } | ||||
|         catch (URISyntaxException e) { | ||||
|             throw new GuacamoleServerException("Error creating URI from Duo Authentication URL.", e); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -94,7 +94,7 @@ public class ConfigurationService { | ||||
|     }; | ||||
|      | ||||
|     /** | ||||
|      * The property that configures the timeout, in seconds, of in-progress | ||||
|      * The property that configures the timeout, in minutes, of in-progress | ||||
|      * Duo authentication attempts. Authentication attempts that take longer | ||||
|      * than this period of time will be invalidated. | ||||
|      */ | ||||
| @@ -171,19 +171,22 @@ public class ConfigurationService { | ||||
|         return environment.getRequiredProperty(DUO_REDIRECT_URI); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * Return the number of seconds after which in-progress authentication attempts with | ||||
|      * Duo should be invalidated. The default is 30 seconds. | ||||
|      * Returns the maximum amount of time to allow for an in-progress Duo | ||||
|      * authentication attempt to be completed, in minutes. A user that takes | ||||
|      * longer than this amount of time to complete authentication with Duo | ||||
|      * will need to try again. | ||||
|      * | ||||
|      * @return | ||||
|      *     The number of seconds after which in-progress Duo MFA attempts should | ||||
|      *     be invalidated. | ||||
|      *     The maximum amount of time to allow for an in-progress Duo | ||||
|      *     authentication attempt to be completed, in minutes. | ||||
|      * | ||||
|      * @throws GuacamoleException | ||||
|      *     If guacamole.properties cannot be parsed. | ||||
|      *     If the authentication timeout cannot be parsed. | ||||
|      */ | ||||
|     public int getAuthTimeout() throws GuacamoleException { | ||||
|         return environment.getProperty(DUO_AUTH_TIMEOUT, 30); | ||||
|     public int getAuthenticationTimeout() throws GuacamoleException { | ||||
|         return environment.getProperty(DUO_AUTH_TIMEOUT, 5); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -136,46 +136,6 @@ public class TranslatableGuacamoleInsufficientCredentialsException | ||||
|         this(message, new TranslatableMessage(key), credentialsInfo); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Creates a new TranslatableGuacamoleInsufficientCredentialsException with the specified message, | ||||
|      * translation key, the credential information required for authentication, the state token, and | ||||
|      * an expiration timestamp for the state token. The message is provided in both a non-translatable | ||||
|      * form and as a translatable key which can be used to retrieve the localized message. | ||||
|      * | ||||
|      * @param message | ||||
|      *     A human-readable description of the exception that occurred. This | ||||
|      *     message should be readable on its own and as-written, without | ||||
|      *     requiring a translation service. | ||||
|      * | ||||
|      * @param key | ||||
|      *     The arbitrary key which can be used to look up the message to be | ||||
|      *     displayed in the user's native language. | ||||
|      * | ||||
|      * @param credentialsInfo | ||||
|      *     Information describing the form of valid credentials. | ||||
|      * | ||||
|      * @param state | ||||
|      *     An opaque value that may be used by a client to maintain state across requests which are part | ||||
|      *     of the same authentication transaction. | ||||
|      *  | ||||
|      * @param providerIdentifier | ||||
|      *     The identifier of the authentication provider that this exception pertains to. | ||||
|      * | ||||
|      * @param queryIdentifier | ||||
|      *     The identifier of the specific query parameter within the | ||||
|      *     authentication process that this exception pertains to. | ||||
|      * | ||||
|      * @param expires | ||||
|      *     The timestamp after which the state token associated with the authentication process expires, | ||||
|      *     specified as the number of milliseconds since the UNIX epoch. | ||||
|      */ | ||||
|     public TranslatableGuacamoleInsufficientCredentialsException(String message, | ||||
|             String key, CredentialsInfo credentialsInfo, String state, String providerIdentifier,  | ||||
|             String queryIdentifier, long expires) { | ||||
|         super(message, credentialsInfo, state, providerIdentifier, queryIdentifier, expires); | ||||
|         this.translatableMessage = new TranslatableMessage(key); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public TranslatableMessage getTranslatableMessage() { | ||||
|         return translatableMessage; | ||||
|   | ||||
| @@ -42,6 +42,20 @@ public abstract class AbstractAuthenticationProvider implements AuthenticationPr | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * {@inheritDoc} | ||||
|      * | ||||
|      * <p>This implementation simply returns the provided {@code credentials} | ||||
|      * without performing any updates. Implementations that wish to perform | ||||
|      * credential updates for in-progress authentication requests should | ||||
|      * override this function. | ||||
|      */ | ||||
|     @Override | ||||
|     public Credentials updateCredentials(Credentials credentials) | ||||
|             throws GuacamoleException { | ||||
|         return credentials; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * {@inheritDoc} | ||||
|      * | ||||
|   | ||||
| @@ -62,6 +62,33 @@ public interface AuthenticationProvider { | ||||
|      */ | ||||
|     Object getResource() throws GuacamoleException; | ||||
|  | ||||
|     /** | ||||
|      * Given the set of credentials that a user has submitted during | ||||
|      * authentication but has not yet been provided to the | ||||
|      * {@link #authenticateUser(org.apache.guacamole.net.auth.Credentials)} or | ||||
|      * {@link #updateAuthenticatedUser(org.apache.guacamole.net.auth.AuthenticatedUser, org.apache.guacamole.net.auth.Credentials)} | ||||
|      * functions of installed AuthenticationProviders, returns the set of | ||||
|      * credentials that should be used instead. The returned credentials may | ||||
|      * be the original credentials, with or without modifications, or may be an | ||||
|      * entirely new {@link Credentials} object. | ||||
|      * | ||||
|      * @param credentials | ||||
|      *     The credentials provided by a user during authentication. | ||||
|      * | ||||
|      * @return | ||||
|      *     The set of credentials that should be provided to all | ||||
|      *     AuthenticationProviders, including this AuthenticationProvider. This | ||||
|      *     set of credentials may optionally be entirely new or may have been | ||||
|      *     modified. | ||||
|      * | ||||
|      * @throws GuacamoleException | ||||
|      *     If an error occurs while updating the provided credentials. | ||||
|      */ | ||||
|     default Credentials updateCredentials(Credentials credentials) | ||||
|             throws GuacamoleException { | ||||
|         return credentials; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns an AuthenticatedUser representing the user authenticated by the | ||||
|      * given credentials, if any. | ||||
|   | ||||
| @@ -34,16 +34,6 @@ import javax.servlet.http.HttpSession; | ||||
|  */ | ||||
| public class Credentials implements Serializable { | ||||
|  | ||||
|     /** | ||||
|      * The RESUME_QUERY is a query parameter key used to determine which | ||||
|      * authentication provider's process should be resumed during multi-step | ||||
|      * authentication. The auth provider will set this parameter before  | ||||
|      * redirecting to an external service, and it is checked upon return to  | ||||
|      * Guacamole to ensure the correct authentication state is continued  | ||||
|      * without starting over. | ||||
|      */ | ||||
|     public static final String RESUME_QUERY = "provider_id"; | ||||
|  | ||||
|     /** | ||||
|      * Unique identifier associated with this specific version of Credentials. | ||||
|      */ | ||||
|   | ||||
| @@ -36,6 +36,12 @@ public class IdentifierGenerator { | ||||
|      */ | ||||
|     private static final SecureRandom secureRandom = new SecureRandom(); | ||||
|  | ||||
|     /** | ||||
|      * IdentifierGenerator is a utility class that is not intended to be | ||||
|      * separately instantiated. | ||||
|      */ | ||||
|     private IdentifierGenerator() {} | ||||
|      | ||||
|     /** | ||||
|      * Generates a unique and unpredictable identifier. Each identifier is at | ||||
|      * least 256-bit and produced using a cryptographically-secure random | ||||
|   | ||||
| @@ -28,95 +28,6 @@ package org.apache.guacamole.net.auth.credentials; | ||||
|  */ | ||||
| public class GuacamoleInsufficientCredentialsException extends GuacamoleCredentialsException { | ||||
|  | ||||
|     /** | ||||
|      * The default state token to use when no specific state information is provided. | ||||
|      */ | ||||
|     private static final String DEFAULT_STATE = ""; | ||||
|  | ||||
|     /** | ||||
|      * The default provider identifier to use when no specific provider is identified. | ||||
|      * This serves as a placeholder indicating that either no specific provider is | ||||
|      * responsible for the exception or the responsible provider has not been identified. | ||||
|      */ | ||||
|     private static final String DEFAULT_PROVIDER_IDENTIFIER = ""; | ||||
|  | ||||
|     /** | ||||
|      * The default query identifier to use when no specific query is identified. | ||||
|      * This serves as a placeholder and indicates that the specific query related to | ||||
|      * the provider's state resume operation has not been provided. | ||||
|      */ | ||||
|     private static final String DEFAULT_QUERY_IDENTIFIER = ""; | ||||
|  | ||||
|     /** | ||||
|      * The default expiration timestamp to use when no specific expiration is provided, | ||||
|      * effectively indicating that the state token does not expire. | ||||
|      */ | ||||
|     private static final long DEFAULT_EXPIRES = -1L; | ||||
|  | ||||
|     /** | ||||
|      * An opaque value that may be used by a client to maintain state across requests | ||||
|      * which are part of the same authentication transaction. | ||||
|      */ | ||||
|     protected final String state; | ||||
|  | ||||
|     /** | ||||
|      * The identifier for the authentication provider that threw this exception. | ||||
|      * This is used to link the exception back to the originating source of the | ||||
|      * authentication attempt, allowing clients to determine which provider's | ||||
|      * authentication process should be resumed. | ||||
|      */ | ||||
|     protected final String providerIdentifier; | ||||
|  | ||||
|     /** | ||||
|      * An identifier for the specific query within the URL for this provider that can | ||||
|      * be checked to resume the authentication state. | ||||
|      */ | ||||
|     protected final String queryIdentifier; | ||||
|  | ||||
|     /** | ||||
|      * The timestamp after which the state token associated with the authentication process | ||||
|      * should no longer be considered valid, expressed as the number of milliseconds since | ||||
|      * UNIX epoch. | ||||
|      */ | ||||
|     protected final long expires; | ||||
|  | ||||
|     /** | ||||
|      * Creates a new GuacamoleInsufficientCredentialsException with the specified | ||||
|      * message, the credential information required for authentication, the state | ||||
|      * token associated with the authentication process, and an expiration timestamp. | ||||
|      * | ||||
|      * @param message | ||||
|      *     A human-readable description of the exception that occurred. | ||||
|      * | ||||
|      * @param credentialsInfo | ||||
|      *     Information describing the form of valid credentials. | ||||
|      * | ||||
|      * @param state | ||||
|      *     An opaque value that may be used by a client to maintain state | ||||
|      *     across requests which are part of the same authentication transaction. | ||||
|      * | ||||
|      * @param providerIdentifier | ||||
|      *     The identifier of the authentication provider that this exception pertains to. | ||||
|      * | ||||
|      * @param queryIdentifier | ||||
|      *     The identifier of the specific query parameter within the | ||||
|      *     authentication process that this exception pertains to. | ||||
|      *  | ||||
|      * @param expires | ||||
|      *     The timestamp after which the state token associated with the | ||||
|      *     authentication process should no longer be considered valid, expressed | ||||
|      *     as the number of milliseconds since UNIX epoch. | ||||
|      */ | ||||
|     public GuacamoleInsufficientCredentialsException(String message, | ||||
|             CredentialsInfo credentialsInfo, String state,  | ||||
|             String providerIdentifier, String queryIdentifier, long expires) { | ||||
|         super(message, credentialsInfo); | ||||
|         this.state = state; | ||||
|         this.providerIdentifier = providerIdentifier; | ||||
|         this.queryIdentifier = queryIdentifier; | ||||
|         this.expires = expires; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Creates a new GuacamoleInsufficientCredentialsException with the given | ||||
|      * message, cause, and associated credential information. | ||||
| @@ -133,10 +44,6 @@ public class GuacamoleInsufficientCredentialsException extends GuacamoleCredenti | ||||
|     public GuacamoleInsufficientCredentialsException(String message, Throwable cause, | ||||
|             CredentialsInfo credentialsInfo) { | ||||
|         super(message, cause, credentialsInfo); | ||||
|         this.state = DEFAULT_STATE; | ||||
|         this.providerIdentifier = DEFAULT_PROVIDER_IDENTIFIER; | ||||
|         this.queryIdentifier = DEFAULT_QUERY_IDENTIFIER; | ||||
|         this.expires = DEFAULT_EXPIRES; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -151,10 +58,6 @@ public class GuacamoleInsufficientCredentialsException extends GuacamoleCredenti | ||||
|      */ | ||||
|     public GuacamoleInsufficientCredentialsException(String message, CredentialsInfo credentialsInfo) { | ||||
|         super(message, credentialsInfo); | ||||
|         this.state = DEFAULT_STATE; | ||||
|         this.providerIdentifier = DEFAULT_PROVIDER_IDENTIFIER; | ||||
|         this.queryIdentifier = DEFAULT_QUERY_IDENTIFIER; | ||||
|         this.expires = DEFAULT_EXPIRES; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -169,52 +72,6 @@ public class GuacamoleInsufficientCredentialsException extends GuacamoleCredenti | ||||
|      */ | ||||
|     public GuacamoleInsufficientCredentialsException(Throwable cause, CredentialsInfo credentialsInfo) { | ||||
|         super(cause, credentialsInfo); | ||||
|         this.state = DEFAULT_STATE; | ||||
|         this.providerIdentifier = DEFAULT_PROVIDER_IDENTIFIER; | ||||
|         this.queryIdentifier = DEFAULT_QUERY_IDENTIFIER; | ||||
|         this.expires = DEFAULT_EXPIRES; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Retrieves the state token associated with the authentication process. | ||||
|      * | ||||
|      * @return The opaque state token used to maintain consistency across multiple | ||||
|      *         requests in the same authentication transaction. | ||||
|      */ | ||||
|     public String getState() { | ||||
|         return state; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Retrieves the identifier of the authentication provider responsible for this exception. | ||||
|      * | ||||
|      * @return The identifier of the authentication provider, allowing clients to know | ||||
|      *         which provider's process should be resumed in response to this exception. | ||||
|      */ | ||||
|     public String getProviderIdentifier() { | ||||
|         return providerIdentifier; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Retrieves the specific query identifier associated with the URL for the provider | ||||
|      * that can be checked to resume the authentication state. | ||||
|      * | ||||
|      * @return The query identifier that serves as a reference to a specific point or | ||||
|      *         transaction within the provider's authentication process. | ||||
|      */ | ||||
|     public String getQueryIdentifier() { | ||||
|         return queryIdentifier; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Retrieves the expiration timestamp of the state token, specified as the | ||||
|      * number of milliseconds since the UNIX epoch. | ||||
|      * | ||||
|      * @return The expiration timestamp of the state token, or a negative value if | ||||
|      *         the token does not expire. | ||||
|      */ | ||||
|     public long getExpires() { | ||||
|         return expires; | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -119,6 +119,18 @@ public class AuthenticationProviderFacade implements AuthenticationProvider { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Credentials updateCredentials(Credentials credentials) throws GuacamoleException { | ||||
|  | ||||
|         // Do nothing if underlying auth provider could not be loaded | ||||
|         if (authProvider == null) | ||||
|             return credentials; | ||||
|  | ||||
|         // Delegate to underlying auth provider | ||||
|         return authProvider.updateCredentials(credentials); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns whether this authentication provider should tolerate internal | ||||
|      * failures during the authentication process, allowing other | ||||
|   | ||||
| @@ -21,11 +21,8 @@ package org.apache.guacamole.rest.auth; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.concurrent.ConcurrentHashMap; | ||||
|  | ||||
| import javax.inject.Inject; | ||||
| import javax.servlet.http.HttpServletRequest; | ||||
|  | ||||
| import org.apache.guacamole.GuacamoleException; | ||||
| import org.apache.guacamole.GuacamoleSecurityException; | ||||
| @@ -47,7 +44,6 @@ import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
|  | ||||
| import com.google.inject.Singleton; | ||||
| import java.util.Iterator; | ||||
|  | ||||
| /** | ||||
|  * A service for performing authentication checks in REST endpoints. | ||||
| @@ -103,11 +99,6 @@ public class AuthenticationService { | ||||
|      */ | ||||
|     public static final String TOKEN_PARAMETER_NAME = "token"; | ||||
|  | ||||
|     /**  | ||||
|      * Map to store resumable authentication states with an expiration time. | ||||
|      */  | ||||
|     private Map<String, ResumableAuthenticationState> resumableStateMap = new ConcurrentHashMap<>(); | ||||
|  | ||||
|     /** | ||||
|      * Attempts authentication against all AuthenticationProviders, in order, | ||||
|      * using the provided credentials. The first authentication failure takes | ||||
| @@ -322,20 +313,6 @@ public class AuthenticationService { | ||||
|                 try { | ||||
|                     userContext = authProvider.getUserContext(authenticatedUser); | ||||
|                 } | ||||
|                 catch (GuacamoleInsufficientCredentialsException e) { | ||||
|                     // Store state and expiration | ||||
|                     String state = e.getState(); | ||||
|                     long expiration = e.getExpires(); | ||||
|                     String queryIdentifier = e.getQueryIdentifier(); | ||||
|                     String providerIdentifier = e.getProviderIdentifier(); | ||||
|  | ||||
|                     resumableStateMap.put(state, new ResumableAuthenticationState(providerIdentifier,  | ||||
|                             queryIdentifier, expiration, credentials)); | ||||
|  | ||||
|                     throw new GuacamoleAuthenticationProcessException("User " | ||||
|                             + "authentication aborted during initial " | ||||
|                             + "UserContext creation.", authProvider, e); | ||||
|                 } | ||||
|                 catch (GuacamoleException | RuntimeException | Error e) { | ||||
|                     throw new GuacamoleAuthenticationProcessException("User " | ||||
|                             + "authentication aborted during initial " | ||||
| @@ -355,82 +332,6 @@ public class AuthenticationService { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Resumes authentication using given credentials if a matching resumable  | ||||
|      * state is found. | ||||
|      * | ||||
|      * @param credentials  | ||||
|      *     The initial credentials containing the request object. | ||||
|      * | ||||
|      * @return  | ||||
|      *     Resumed credentials if a valid resumable state is found; otherwise,  | ||||
|      *     returns null. | ||||
|      */ | ||||
|     private Credentials resumeAuthentication(Credentials credentials) { | ||||
|          | ||||
|         Credentials resumedCredentials = null; | ||||
|  | ||||
|         // Retrieve signed State from the request | ||||
|         HttpServletRequest request = credentials.getRequest(); | ||||
|          | ||||
|         // Retrieve the provider id from the query parameters | ||||
|         String resumableProviderId = request.getParameter(Credentials.RESUME_QUERY); | ||||
|         // Check if a provider id is set | ||||
|         if (resumableProviderId == null || resumableProviderId.isEmpty()) { | ||||
|             // Return if a provider id is not set | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
|         // Use an iterator to safely remove entries while iterating | ||||
|         Iterator<Map.Entry<String, ResumableAuthenticationState>> iterator = resumableStateMap.entrySet().iterator(); | ||||
|         while (iterator.hasNext()) { | ||||
|             Map.Entry<String, ResumableAuthenticationState> entry = iterator.next(); | ||||
|             ResumableAuthenticationState resumableState = entry.getValue(); | ||||
|  | ||||
|             // Check if the provider ID from the request matches the one in the map entry | ||||
|             boolean providerMatches = resumableProviderId.equals(resumableState.getProviderIdentifier()); | ||||
|             if (!providerMatches) { | ||||
|                 // If the provider doesn't match, skip to the next entry | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             // Use the query identifier from the entry to retrieve the corresponding state parameter | ||||
|             String stateQueryParameter = resumableState.getQueryIdentifier(); | ||||
|             String stateFromParameter = request.getParameter(stateQueryParameter); | ||||
|  | ||||
|             // Check if a state parameter is set | ||||
|             if (stateFromParameter == null || stateFromParameter.isEmpty()) { | ||||
|                 // Remove and continue if`state is not provided or is empty | ||||
|                 iterator.remove();  | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             // If the key in the entry (state) matches the state parameter provided in the request | ||||
|             if (entry.getKey().equals(stateFromParameter)) { | ||||
|  | ||||
|                 // Remove the current entry from the map | ||||
|                 iterator.remove();                 | ||||
|  | ||||
|                 // Check if the resumableState has expired | ||||
|                 if (!resumableState.isExpired()) { | ||||
|  | ||||
|                     // Set the actualCredentials to the credentials from the matched entry | ||||
|                     resumedCredentials = resumableState.getCredentials(); | ||||
|  | ||||
|                     if (resumedCredentials != null) { | ||||
|                         resumedCredentials.setRequest(request); | ||||
|                     } | ||||
|  | ||||
|                 } | ||||
|  | ||||
|                 // Exit the loop since we've found the matching state and it's unique | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return resumedCredentials; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Authenticates a user using the given credentials and optional | ||||
|      * authentication token, returning the authentication token associated with | ||||
| @@ -456,8 +357,28 @@ public class AuthenticationService { | ||||
|     public String authenticate(Credentials credentials, String token) | ||||
|             throws GuacamoleException { | ||||
|  | ||||
|         String authToken; | ||||
|         try { | ||||
|  | ||||
|             // Allow extensions to make updated to credentials prior to | ||||
|             // actual authentication (NOTE: We do this here instead of in a | ||||
|             // separate function to ensure that failure events accurately | ||||
|             // represent the credentials that failed when a chain of credential | ||||
|             // updates is involved) | ||||
|             for (AuthenticationProvider authProvider : authProviders) { | ||||
|                 try { | ||||
|                     credentials = authProvider.updateCredentials(credentials); | ||||
|                 } | ||||
|                 catch (GuacamoleException | RuntimeException | Error e) { | ||||
|                     throw new GuacamoleAuthenticationProcessException("User " | ||||
|                             + "authentication aborted during credential " | ||||
|                             + "update/revision.", authProvider, e); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             // Fire pre-authentication event before ANY authn/authz occurs at all | ||||
|         listenerService.handleEvent((AuthenticationRequestReceivedEvent) () -> credentials); | ||||
|             final Credentials updatedCredentials = credentials; | ||||
|             listenerService.handleEvent((AuthenticationRequestReceivedEvent) () -> updatedCredentials); | ||||
|  | ||||
|             // Pull existing session if token provided | ||||
|             GuacamoleSession existingSession; | ||||
| @@ -466,19 +387,9 @@ public class AuthenticationService { | ||||
|             else | ||||
|                 existingSession = null; | ||||
|  | ||||
|         AuthenticatedUser authenticatedUser; | ||||
|         String authToken; | ||||
|  | ||||
|         // Retrieve credentials if resuming authentication | ||||
|         Credentials actualCredentials = resumeAuthentication(credentials); | ||||
|         if (actualCredentials == null) | ||||
|             actualCredentials = credentials; | ||||
|  | ||||
|         try { | ||||
|  | ||||
|             // Get up-to-date AuthenticatedUser and associated UserContexts | ||||
|             authenticatedUser = getAuthenticatedUser(existingSession, actualCredentials); | ||||
|             List<DecoratedUserContext> userContexts = getUserContexts(existingSession, authenticatedUser, actualCredentials); | ||||
|             AuthenticatedUser authenticatedUser = getAuthenticatedUser(existingSession, updatedCredentials); | ||||
|             List<DecoratedUserContext> userContexts = getUserContexts(existingSession, authenticatedUser, updatedCredentials); | ||||
|  | ||||
|             // Update existing session, if it exists | ||||
|             if (existingSession != null) { | ||||
| @@ -508,7 +419,12 @@ public class AuthenticationService { | ||||
|         // Log and rethrow any authentication errors | ||||
|         catch (GuacamoleAuthenticationProcessException e) { | ||||
|  | ||||
|             listenerService.handleEvent(new AuthenticationFailureEvent(actualCredentials, | ||||
|             // NOTE: The credentials referenced here are intentionally NOT the | ||||
|             // final updatedCredentials reference (though they may often be | ||||
|             // equivalent) to ensure that failure events accurately represent | ||||
|             // the credentials that failed if that failure occurs in the middle | ||||
|             // of a chain of credential updates via updateCredentials() | ||||
|             listenerService.handleEvent(new AuthenticationFailureEvent(credentials, | ||||
|                     e.getAuthenticationProvider(), e.getCause())); | ||||
|  | ||||
|             // Rethrow exception | ||||
|   | ||||
| @@ -1,128 +0,0 @@ | ||||
| /* | ||||
|  * Licensed to the Apache Software Foundation (ASF) under one | ||||
|  * or more contributor license agreements.  See the NOTICE file | ||||
|  * distributed with this work for additional information | ||||
|  * regarding copyright ownership.  The ASF licenses this file | ||||
|  * to you under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance | ||||
|  * with the License.  You may obtain a copy of the License at | ||||
|  * | ||||
|  *   http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, | ||||
|  * software distributed under the License is distributed on an | ||||
|  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||||
|  * KIND, either express or implied.  See the License for the | ||||
|  * specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  */ | ||||
| package org.apache.guacamole.rest.auth; | ||||
|  | ||||
| import org.apache.guacamole.net.auth.Credentials; | ||||
|  | ||||
| /** | ||||
|  * Encapsulates the state information required for resuming an authentication | ||||
|  * process. This includes an expiration timestamp to determine state validity | ||||
|  * and the original credentials submitted by the user. | ||||
|  */ | ||||
| public class ResumableAuthenticationState { | ||||
|      | ||||
|     /** | ||||
|      * The timestamp at which this state should no longer be considered valid, | ||||
|      * measured in milliseconds since the Unix epoch. | ||||
|      */ | ||||
|     private long expirationTimestamp; | ||||
|      | ||||
|     /** | ||||
|      * The original user credentials that were submitted at the start of the | ||||
|      * authentication process. | ||||
|      */ | ||||
|     private Credentials credentials; | ||||
|  | ||||
|     /** | ||||
|      * A unique string identifying the authentication provider related to the state. | ||||
|      * This field allows the client to know which provider's authentication process | ||||
|      * should be resumed using this state. | ||||
|      */ | ||||
|     private String providerIdentifier; | ||||
|  | ||||
|     /** | ||||
|      * A unique string that can be used to identify a specific query within the | ||||
|      * authentication process for the identified provider. This identifier can | ||||
|      * help the resumption of an authentication process. | ||||
|      */ | ||||
|     private String queryIdentifier; | ||||
|  | ||||
|     /** | ||||
|      * Constructs a new ResumableAuthenticationState object with the specified | ||||
|      * expiration timestamp and user credentials. | ||||
|      * | ||||
|      * @param providerIdentifier | ||||
|      *     The identifier of the authentication provider to which this resumable state pertains. | ||||
|      * | ||||
|      * @param queryIdenifier | ||||
|      *     The identifier of the specific query within the provider's | ||||
|      *     authentication process that this state corresponds to. | ||||
|      * | ||||
|      * @param expirationTimestamp | ||||
|      *     The timestamp in milliseconds since the Unix epoch when this state | ||||
|      *     expires and can no longer be used to resume authentication. | ||||
|      * | ||||
|      * @param credentials | ||||
|      *     The Credentials object initially submitted by the user and associated | ||||
|      *     with this resumable state. | ||||
|      */ | ||||
|     public ResumableAuthenticationState(String providerIdentifier, String queryIdentifier,  | ||||
|             long expirationTimestamp, Credentials credentials) { | ||||
|         this.expirationTimestamp = expirationTimestamp; | ||||
|         this.credentials = credentials; | ||||
|         this.providerIdentifier = providerIdentifier; | ||||
|         this.queryIdentifier = queryIdentifier; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Checks if this resumable state has expired based on the stored expiration | ||||
|      * timestamp and the current system time. | ||||
|      * | ||||
|      * @return  | ||||
|      *     True if the current system time is after the expiration timestamp, | ||||
|      *     indicating that the state is expired; false otherwise. | ||||
|      */ | ||||
|     public boolean isExpired() { | ||||
|         return System.currentTimeMillis() >= expirationTimestamp; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Retrieves the original credentials associated with this resumable state. | ||||
|      * | ||||
|      * @return  | ||||
|      *     The Credentials object containing user details that were submitted | ||||
|      *     when the state was created. | ||||
|      */ | ||||
|     public Credentials getCredentials() { | ||||
|         return this.credentials; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Retrieves the identifier of the authentication provider associated with this state. | ||||
|      * | ||||
|      * @return  | ||||
|      *     The identifier of the authentication provider, providing context for this state | ||||
|      *     within the overall authentication sequence. | ||||
|      */ | ||||
|     public String getProviderIdentifier() { | ||||
|         return this.providerIdentifier; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Retrieves the identifier for a specific query in the authentication | ||||
|      * process that is associated with this state. | ||||
|      * | ||||
|      * @return  | ||||
|      *     The query identifier used for retrieving a value representing the state within | ||||
|      *     the provider's authentication process that should be resumed. | ||||
|      */ | ||||
|     public String getQueryIdentifier() { | ||||
|         return this.queryIdentifier; | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user