diff --git a/doc/licenses/logging-interceptor-4.9.1/LICENSE.txt b/doc/licenses/logging-interceptor-4.9.1/LICENSE.txt deleted file mode 100644 index f49a4e16e6..0000000000 --- a/doc/licenses/logging-interceptor-4.9.1/LICENSE.txt +++ /dev/null @@ -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. \ No newline at end of file diff --git a/doc/licenses/logging-interceptor-4.9.1/README b/doc/licenses/logging-interceptor-4.9.1/README index 4755b031ce..e6c30ced57 100644 --- a/doc/licenses/logging-interceptor-4.9.1/README +++ b/doc/licenses/logging-interceptor-4.9.1/README @@ -1,4 +1,4 @@ -okhttp logging-interceptor (https://square.github.io/okhttp/) +OkHttp Logging Interceptor (https://square.github.io/okhttp/) ------------------------------------------------------------- Version: 4.9.1 diff --git a/doc/licenses/okhttp-3.14.9/LICENSE.txt b/doc/licenses/okhttp-3.14.9/LICENSE.txt deleted file mode 100644 index f49a4e16e6..0000000000 --- a/doc/licenses/okhttp-3.14.9/LICENSE.txt +++ /dev/null @@ -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. \ No newline at end of file diff --git a/doc/licenses/okhttp-3.14.9/NOTICE b/doc/licenses/okhttp-3.14.9/NOTICE deleted file mode 100644 index 48164b3fce..0000000000 --- a/doc/licenses/okhttp-3.14.9/NOTICE +++ /dev/null @@ -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. diff --git a/doc/licenses/okhttp-3.14.9/README b/doc/licenses/okhttp-3.14.9/README deleted file mode 100644 index ed470799c5..0000000000 --- a/doc/licenses/okhttp-3.14.9/README +++ /dev/null @@ -1,7 +0,0 @@ -okhttp (https://square.github.io/okhttp/) ---------------------------------------------- - - Version: 3.14.9 - From: 'Square Inc' - License(s): - Apache 2.0 diff --git a/doc/licenses/okhttp-3.14.9/dep-coordinates.txt b/doc/licenses/okhttp-3.14.9/dep-coordinates.txt deleted file mode 100644 index eb6c3831bd..0000000000 --- a/doc/licenses/okhttp-3.14.9/dep-coordinates.txt +++ /dev/null @@ -1 +0,0 @@ -com.squareup.okhttp3:okhttp:jar:3.14.9 diff --git a/doc/licenses/okhttp-4.9.1/NOTICE b/doc/licenses/okhttp-4.12.0/NOTICE similarity index 100% rename from doc/licenses/okhttp-4.9.1/NOTICE rename to doc/licenses/okhttp-4.12.0/NOTICE diff --git a/doc/licenses/okhttp-4.12.0/README b/doc/licenses/okhttp-4.12.0/README new file mode 100644 index 0000000000..54aee25497 --- /dev/null +++ b/doc/licenses/okhttp-4.12.0/README @@ -0,0 +1,8 @@ +OkHttp (https://square.github.io/okhttp/) +----------------------------------------- + + Version: 4.12.0 + From: 'Square Inc' + License(s): + Apache 2.0 + diff --git a/doc/licenses/okhttp-4.12.0/dep-coordinates.txt b/doc/licenses/okhttp-4.12.0/dep-coordinates.txt new file mode 100644 index 0000000000..8aeb660e82 --- /dev/null +++ b/doc/licenses/okhttp-4.12.0/dep-coordinates.txt @@ -0,0 +1,2 @@ +com.squareup.okhttp3:okhttp:jar:4.12.0 +com.squareup.okhttp3:logging-interceptor:jar:4.12.0 diff --git a/doc/licenses/okhttp-4.9.1/LICENSE.txt b/doc/licenses/okhttp-4.9.1/LICENSE.txt deleted file mode 100644 index f49a4e16e6..0000000000 --- a/doc/licenses/okhttp-4.9.1/LICENSE.txt +++ /dev/null @@ -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. \ No newline at end of file diff --git a/doc/licenses/okhttp-4.9.1/README b/doc/licenses/okhttp-4.9.1/README deleted file mode 100644 index 4277242602..0000000000 --- a/doc/licenses/okhttp-4.9.1/README +++ /dev/null @@ -1,7 +0,0 @@ -okhttp (https://square.github.io/okhttp/) ---------------------------------------------- - - Version: 4.9.1 - From: 'Square Inc' - License(s): - Apache 2.0 diff --git a/doc/licenses/okhttp-4.9.1/dep-coordinates.txt b/doc/licenses/okhttp-4.9.1/dep-coordinates.txt deleted file mode 100644 index 0215ca270b..0000000000 --- a/doc/licenses/okhttp-4.9.1/dep-coordinates.txt +++ /dev/null @@ -1 +0,0 @@ -com.squareup.okhttp3:okhttp:jar:4.9.1 diff --git a/doc/licenses/okio-1.17.2/LICENSE.txt b/doc/licenses/okio-1.17.2/LICENSE.txt deleted file mode 100644 index f49a4e16e6..0000000000 --- a/doc/licenses/okio-1.17.2/LICENSE.txt +++ /dev/null @@ -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. \ No newline at end of file diff --git a/doc/licenses/okio-1.17.2/NOTICE b/doc/licenses/okio-1.17.2/NOTICE deleted file mode 100644 index 25fdd5926a..0000000000 --- a/doc/licenses/okio-1.17.2/NOTICE +++ /dev/null @@ -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. \ No newline at end of file diff --git a/doc/licenses/okio-1.17.2/README b/doc/licenses/okio-1.17.2/README deleted file mode 100644 index a8723ed5aa..0000000000 --- a/doc/licenses/okio-1.17.2/README +++ /dev/null @@ -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) diff --git a/doc/licenses/okio-1.17.2/dep-coordinates.txt b/doc/licenses/okio-1.17.2/dep-coordinates.txt deleted file mode 100644 index 54ab8297ca..0000000000 --- a/doc/licenses/okio-1.17.2/dep-coordinates.txt +++ /dev/null @@ -1 +0,0 @@ -com.squareup.okio:okio:jar:1.17.2 diff --git a/doc/licenses/okio-2.8.0/LICENSE.txt b/doc/licenses/okio-2.8.0/LICENSE.txt deleted file mode 100644 index f49a4e16e6..0000000000 --- a/doc/licenses/okio-2.8.0/LICENSE.txt +++ /dev/null @@ -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. \ No newline at end of file diff --git a/doc/licenses/okio-2.8.0/README b/doc/licenses/okio-2.8.0/README deleted file mode 100644 index cf4693dbd7..0000000000 --- a/doc/licenses/okio-2.8.0/README +++ /dev/null @@ -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) diff --git a/doc/licenses/okio-2.8.0/dep-coordinates.txt b/doc/licenses/okio-2.8.0/dep-coordinates.txt deleted file mode 100644 index 88c8776ad2..0000000000 --- a/doc/licenses/okio-2.8.0/dep-coordinates.txt +++ /dev/null @@ -1 +0,0 @@ -com.squareup.okio:okio:jar:2.8.0 diff --git a/doc/licenses/okio-2.8.0/NOTICE b/doc/licenses/okio-3.6.0/NOTICE similarity index 100% rename from doc/licenses/okio-2.8.0/NOTICE rename to doc/licenses/okio-3.6.0/NOTICE diff --git a/doc/licenses/okio-3.6.0/README b/doc/licenses/okio-3.6.0/README new file mode 100644 index 0000000000..23b5197834 --- /dev/null +++ b/doc/licenses/okio-3.6.0/README @@ -0,0 +1,8 @@ +Okio (https://square.github.io/okio/) +------------------------------------- + + Version: 3.6.0 + From: 'Square Inc' + License(s): + Apache 2.0 + diff --git a/doc/licenses/okio-3.6.0/dep-coordinates.txt b/doc/licenses/okio-3.6.0/dep-coordinates.txt new file mode 100644 index 0000000000..b785b2613d --- /dev/null +++ b/doc/licenses/okio-3.6.0/dep-coordinates.txt @@ -0,0 +1,2 @@ +com.squareup.okio:okio:jar:3.6.0 +com.squareup.okio:okio-jvm:jar:3.6.0 diff --git a/doc/licenses/retrofit-2.9.0/LICENSE.txt b/doc/licenses/retrofit-2.9.0/LICENSE.txt deleted file mode 100644 index f49a4e16e6..0000000000 --- a/doc/licenses/retrofit-2.9.0/LICENSE.txt +++ /dev/null @@ -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. \ No newline at end of file diff --git a/doc/licenses/retrofit-2.9.0/README b/doc/licenses/retrofit-2.9.0/README index 8de113264e..64da926518 100644 --- a/doc/licenses/retrofit-2.9.0/README +++ b/doc/licenses/retrofit-2.9.0/README @@ -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 diff --git a/doc/licenses/spring-web-5.3.25/LICENSE b/doc/licenses/spring-web-5.3.25/LICENSE deleted file mode 100644 index ff77379631..0000000000 --- a/doc/licenses/spring-web-5.3.25/LICENSE +++ /dev/null @@ -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. diff --git a/doc/licenses/spring-web-5.3.25/README b/doc/licenses/spring-web-5.3.25/README deleted file mode 100644 index f719e88ff7..0000000000 --- a/doc/licenses/spring-web-5.3.25/README +++ /dev/null @@ -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 diff --git a/doc/licenses/spring-web-5.3.25/dep-coordinates.txt b/doc/licenses/spring-web-5.3.25/dep-coordinates.txt deleted file mode 100644 index 0670c0fa8d..0000000000 --- a/doc/licenses/spring-web-5.3.25/dep-coordinates.txt +++ /dev/null @@ -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 diff --git a/extensions/guacamole-auth-duo/pom.xml b/extensions/guacamole-auth-duo/pom.xml index f7f49563c2..95afee4412 100644 --- a/extensions/guacamole-auth-duo/pom.xml +++ b/extensions/guacamole-auth-duo/pom.xml @@ -39,33 +39,10 @@ UTF-8 + 4.12.0 + 1.9.23 - - - - - com.squareup.okhttp3 - okhttp - 4.9.1 - - - - - org.jetbrains.kotlin - kotlin-stdlib-common - 1.4.10 - - - - org.jetbrains.kotlin - kotlin-stdlib - 1.4.10 - - - - - @@ -95,19 +72,62 @@ 2.5 provided - + com.duosecurity duo-universal-sdk 1.1.3 + + + com.squareup.okhttp3 + okhttp + + + com.squareup.okhttp3 + logging-interceptor + + + + + + + com.squareup.okhttp3 + okhttp + ${okhttp.version} + + + org.jetbrains.kotlin + kotlin-stdlib-common + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + + + + + com.squareup.okhttp3 + logging-interceptor + ${okhttp.version} + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + + + + + + + org.jetbrains.kotlin + kotlin-stdlib-common + ${kotlin.version} - - - org.springframework - spring-web - 5.3.25 + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} diff --git a/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationProvider.java b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationProvider.java index dc9999c984..ff3555ca58 100644 --- a/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationProvider.java +++ b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationProvider.java @@ -21,9 +21,11 @@ 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 String getIdentifier() { } @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 UserContext getUserContext(AuthenticatedUser authenticatedUser) } + @Override + public void shutdown() { + sessionManager.shutdown(); + } + } diff --git a/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationSession.java b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationSession.java new file mode 100644 index 0000000000..6876cad123 --- /dev/null +++ b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationSession.java @@ -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; + } + +} diff --git a/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationSessionManager.java b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationSessionManager.java new file mode 100644 index 0000000000..f2f39da2ed --- /dev/null +++ b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationSessionManager.java @@ -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 { + + // Intentionally empty (the default functions inherited from the + // AuthenticationSessionManager base class are sufficient for our needs) + +} diff --git a/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/UserVerificationService.java b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/UserVerificationService.java index 26ab71221e..2333e21ef0 100644 --- a/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/UserVerificationService.java +++ b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/UserVerificationService.java @@ -26,12 +26,12 @@ 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,33 +39,50 @@ 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"; - + /** * The value that will be returned in the token if Duo authentication * was successful. */ 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)) - return; - + // Ignore anonymous users (unverifiable) String username = authenticatedUser.getIdentifier(); + if (username.equals(AuthenticatedUser.ANONYMOUS_IDENTIFIER)) + return; + // 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); + } + + // 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 Code and State from the request - 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) { - - // Get a new session state from the Duo client - duoState = duoClient.generateState(); - long expirationTimestamp = System.currentTimeMillis() + (confService.getAuthTimeout() * 1000L); - - // Request additional credentials - 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)), - new TranslatableMessage("LOGIN.INFO_DUO_REDIRECT_PENDING") - ) - )), - duoState, DuoAuthenticationProvider.PROVIDER_IDENTIFER, - DUO_STATE_PARAMETER_NAME, expirationTimestamp - ); + // 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); + + // Redirect to Duo to obtain an authentication code if that redirect + // has not yet occurred + if (duoCode != null && duoState != null) { + + // 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); + } - // 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"); + } + + // 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 expiresAfter = TimeUnit.MINUTES.toMillis(confService.getAuthenticationTimeout()); + sessionManager.defer(new DuoAuthenticationSession(credentials, expiresAfter), duoState); + + // Obtain authentication URL from Duo client + String duoAuthUrlString; + try { + duoAuthUrlString = duoClient.createAuthUrl(username, duoState); } catch (DuoException e) { - throw new GuacamoleServerException("Duo Client error.", 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("Error creating URI from Duo Authentication URL.", 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, duoAuthUrl, + new TranslatableMessage("LOGIN.INFO_DUO_REDIRECT_PENDING") + ) + )) + ); + } } diff --git a/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/conf/ConfigurationService.java b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/conf/ConfigurationService.java index f6bed8073e..5ed7d7a217 100644 --- a/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/conf/ConfigurationService.java +++ b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/conf/ConfigurationService.java @@ -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. */ @@ -170,20 +170,23 @@ public String getClientSecret() throws GuacamoleException { public URI getRedirectUri() throws GuacamoleException { 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. - * - * @throws GuacamoleException - * If guacamole.properties cannot be parsed. + * The maximum amount of time to allow for an in-progress Duo + * authentication attempt to be completed, in minutes. + * + * @throws GuacamoleException + * 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); } } diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleInsufficientCredentialsException.java b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleInsufficientCredentialsException.java index f0c27bc365..5b51d2ce9c 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleInsufficientCredentialsException.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/language/TranslatableGuacamoleInsufficientCredentialsException.java @@ -136,46 +136,6 @@ public TranslatableGuacamoleInsufficientCredentialsException(String message, 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; diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractAuthenticationProvider.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractAuthenticationProvider.java index 81a91d9d9a..6b6fd8f219 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractAuthenticationProvider.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractAuthenticationProvider.java @@ -42,6 +42,20 @@ public Object getResource() throws GuacamoleException { return null; } + /** + * {@inheritDoc} + * + *

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} * diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AuthenticationProvider.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AuthenticationProvider.java index fd7d844780..680c7c3820 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AuthenticationProvider.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AuthenticationProvider.java @@ -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. diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Credentials.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Credentials.java index 45eebe80df..6ad0e240b3 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Credentials.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/Credentials.java @@ -34,16 +34,6 @@ */ 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. */ diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/IdentifierGenerator.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/IdentifierGenerator.java index fcc365a9b7..2a2dd340f9 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/IdentifierGenerator.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/IdentifierGenerator.java @@ -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 diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/credentials/GuacamoleInsufficientCredentialsException.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/credentials/GuacamoleInsufficientCredentialsException.java index 8c76694743..06ae3ea5c6 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/credentials/GuacamoleInsufficientCredentialsException.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/credentials/GuacamoleInsufficientCredentialsException.java @@ -28,95 +28,6 @@ */ 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 GuacamoleInsufficientCredentialsException(String message, 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 GuacamoleInsufficientCredentialsException(String message, Throwable cause */ 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 GuacamoleInsufficientCredentialsException(String message, CredentialsInfo */ 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; } } diff --git a/guacamole/src/main/java/org/apache/guacamole/extension/AuthenticationProviderFacade.java b/guacamole/src/main/java/org/apache/guacamole/extension/AuthenticationProviderFacade.java index 9855cd6fdd..b89b2ada64 100644 --- a/guacamole/src/main/java/org/apache/guacamole/extension/AuthenticationProviderFacade.java +++ b/guacamole/src/main/java/org/apache/guacamole/extension/AuthenticationProviderFacade.java @@ -119,6 +119,18 @@ public Object getResource() throws GuacamoleException { } + @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 diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/auth/AuthenticationService.java b/guacamole/src/main/java/org/apache/guacamole/rest/auth/AuthenticationService.java index dc8d3bb7da..5a0e4c5fe7 100644 --- a/guacamole/src/main/java/org/apache/guacamole/rest/auth/AuthenticationService.java +++ b/guacamole/src/main/java/org/apache/guacamole/rest/auth/AuthenticationService.java @@ -21,11 +21,8 @@ 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.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 resumableStateMap = new ConcurrentHashMap<>(); - /** * Attempts authentication against all AuthenticationProviders, in order, * using the provided credentials. The first authentication failure takes @@ -322,20 +313,6 @@ private List getUserContexts(GuacamoleSession existingSess 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 " @@ -354,82 +331,6 @@ private List getUserContexts(GuacamoleSession existingSess return userContexts; } - - /** - * 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> iterator = resumableStateMap.entrySet().iterator(); - while (iterator.hasNext()) { - Map.Entry 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 @@ -456,29 +357,39 @@ private Credentials resumeAuthentication(Credentials credentials) { public String authenticate(Credentials credentials, String token) throws GuacamoleException { - // Fire pre-authentication event before ANY authn/authz occurs at all - listenerService.handleEvent((AuthenticationRequestReceivedEvent) () -> credentials); - - // Pull existing session if token provided - GuacamoleSession existingSession; - if (token != null) - existingSession = tokenSessionMap.get(token); - else - existingSession = null; - - AuthenticatedUser authenticatedUser; String authToken; + try { - // Retrieve credentials if resuming authentication - Credentials actualCredentials = resumeAuthentication(credentials); - if (actualCredentials == null) - actualCredentials = credentials; + // 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); + } + } - try { + // Fire pre-authentication event before ANY authn/authz occurs at all + final Credentials updatedCredentials = credentials; + listenerService.handleEvent((AuthenticationRequestReceivedEvent) () -> updatedCredentials); + + // Pull existing session if token provided + GuacamoleSession existingSession; + if (token != null) + existingSession = tokenSessionMap.get(token); + else + existingSession = null; // Get up-to-date AuthenticatedUser and associated UserContexts - authenticatedUser = getAuthenticatedUser(existingSession, actualCredentials); - List userContexts = getUserContexts(existingSession, authenticatedUser, actualCredentials); + AuthenticatedUser authenticatedUser = getAuthenticatedUser(existingSession, updatedCredentials); + List userContexts = getUserContexts(existingSession, authenticatedUser, updatedCredentials); // Update existing session, if it exists if (existingSession != null) { @@ -508,7 +419,12 @@ public String authenticate(Credentials credentials, String token) // 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 diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/auth/ResumableAuthenticationState.java b/guacamole/src/main/java/org/apache/guacamole/rest/auth/ResumableAuthenticationState.java deleted file mode 100644 index 1aaa7ea579..0000000000 --- a/guacamole/src/main/java/org/apache/guacamole/rest/auth/ResumableAuthenticationState.java +++ /dev/null @@ -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; - } -}