feat: add S3-compatible storage provider (MinIO, Ceph, R2, etc.)
Adds a new 'S3-Compatible Storage' provider that works with any
S3-API-compatible object storage service, including MinIO, Ceph,
Cloudflare R2, Backblaze B2, and others.
Changes:
- New provider class: classes/providers/storage/s3-compatible-provider.php
- Provider key: s3compatible
- Reads user-configured endpoint URL from settings
- Uses path-style URL access (required by most S3-compatible services)
- Supports credentials via AS3CF_S3COMPAT_ACCESS_KEY_ID /
AS3CF_S3COMPAT_SECRET_ACCESS_KEY wp-config.php constants
- Disables AWS-specific features (Block Public Access, Object Ownership)
- New provider SVG icons (s3compatible.svg, -link.svg, -round.svg)
- Registered provider in main plugin class with endpoint setting support
- Updated StorageProviderSubPage to show endpoint URL input for S3-compatible
- Built pro settings bundle with rollup (Svelte 4.2.19)
- Added package.json and updated rollup.config.mjs for pro-only builds
This commit is contained in:
202
vendor/Gcp/google/auth/COPYING
vendored
Normal file
202
vendor/Gcp/google/auth/COPYING
vendored
Normal file
@@ -0,0 +1,202 @@
|
||||
|
||||
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 2015 Google 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.
|
||||
203
vendor/Gcp/google/auth/LICENSE
vendored
Normal file
203
vendor/Gcp/google/auth/LICENSE
vendored
Normal file
@@ -0,0 +1,203 @@
|
||||
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.
|
||||
|
||||
|
||||
7
vendor/Gcp/google/auth/SECURITY.md
vendored
Normal file
7
vendor/Gcp/google/auth/SECURITY.md
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
# Security Policy
|
||||
|
||||
To report a security issue, please use [g.co/vulnz](https://g.co/vulnz).
|
||||
|
||||
The Google Security Team will respond within 5 working days of your report on g.co/vulnz.
|
||||
|
||||
We use g.co/vulnz for our intake, and do coordination and disclosure here using GitHub Security Advisory to privately discuss and fix the issue.
|
||||
1
vendor/Gcp/google/auth/VERSION
vendored
Normal file
1
vendor/Gcp/google/auth/VERSION
vendored
Normal file
@@ -0,0 +1 @@
|
||||
1.33.0
|
||||
35
vendor/Gcp/google/auth/autoload.php
vendored
Normal file
35
vendor/Gcp/google/auth/autoload.php
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp;
|
||||
|
||||
/*
|
||||
* Copyright 2014 Google 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.
|
||||
*/
|
||||
function oauth2client_php_autoload($className)
|
||||
{
|
||||
$classPath = \explode('_', $className);
|
||||
if ($classPath[0] != 'Google') {
|
||||
return;
|
||||
}
|
||||
if (\count($classPath) > 3) {
|
||||
// Maximum class file path depth in this project is 3.
|
||||
$classPath = \array_slice($classPath, 0, 3);
|
||||
}
|
||||
$filePath = \dirname(__FILE__) . '/src/' . \implode('/', $classPath) . '.php';
|
||||
if (\file_exists($filePath)) {
|
||||
require_once $filePath;
|
||||
}
|
||||
}
|
||||
\spl_autoload_register('oauth2client_php_autoload');
|
||||
390
vendor/Gcp/google/auth/src/AccessToken.php
vendored
Normal file
390
vendor/Gcp/google/auth/src/AccessToken.php
vendored
Normal file
@@ -0,0 +1,390 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2019 Google LLC
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth;
|
||||
|
||||
use DateTime;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Firebase\JWT\ExpiredException;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Firebase\JWT\JWT;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Firebase\JWT\Key;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Firebase\JWT\SignatureInvalidException;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Cache\MemoryCacheItemPool;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\HttpHandler\HttpClientCache;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\HttpHandler\HttpHandlerFactory;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\Psr7\Request;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\Psr7\Utils;
|
||||
use InvalidArgumentException;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\phpseclib3\Crypt\PublicKeyLoader;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\phpseclib3\Crypt\RSA;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\phpseclib3\Math\BigInteger;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Psr\Cache\CacheItemPoolInterface;
|
||||
use RuntimeException;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\SimpleJWT\InvalidTokenException;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\SimpleJWT\JWT as SimpleJWT;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\SimpleJWT\Keys\KeyFactory;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\SimpleJWT\Keys\KeySet;
|
||||
use TypeError;
|
||||
use UnexpectedValueException;
|
||||
/**
|
||||
* Wrapper around Google Access Tokens which provides convenience functions.
|
||||
*
|
||||
* @experimental
|
||||
*/
|
||||
class AccessToken
|
||||
{
|
||||
const FEDERATED_SIGNON_CERT_URL = 'https://www.googleapis.com/oauth2/v3/certs';
|
||||
const IAP_CERT_URL = 'https://www.gstatic.com/iap/verify/public_key-jwk';
|
||||
const IAP_ISSUER = 'https://cloud.google.com/iap';
|
||||
const OAUTH2_ISSUER = 'accounts.google.com';
|
||||
const OAUTH2_ISSUER_HTTPS = 'https://accounts.google.com';
|
||||
const OAUTH2_REVOKE_URI = 'https://oauth2.googleapis.com/revoke';
|
||||
/**
|
||||
* @var callable
|
||||
*/
|
||||
private $httpHandler;
|
||||
/**
|
||||
* @var CacheItemPoolInterface
|
||||
*/
|
||||
private $cache;
|
||||
/**
|
||||
* @param callable $httpHandler [optional] An HTTP Handler to deliver PSR-7 requests.
|
||||
* @param CacheItemPoolInterface $cache [optional] A PSR-6 compatible cache implementation.
|
||||
*/
|
||||
public function __construct(callable $httpHandler = null, CacheItemPoolInterface $cache = null)
|
||||
{
|
||||
$this->httpHandler = $httpHandler ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient());
|
||||
$this->cache = $cache ?: new MemoryCacheItemPool();
|
||||
}
|
||||
/**
|
||||
* Verifies an id token and returns the authenticated apiLoginTicket.
|
||||
* Throws an exception if the id token is not valid.
|
||||
* The audience parameter can be used to control which id tokens are
|
||||
* accepted. By default, the id token must have been issued to this OAuth2 client.
|
||||
*
|
||||
* @param string $token The JSON Web Token to be verified.
|
||||
* @param array<mixed> $options [optional] {
|
||||
* Configuration options.
|
||||
* @type string $audience The indended recipient of the token.
|
||||
* @type string $issuer The intended issuer of the token.
|
||||
* @type string $cacheKey The cache key of the cached certs. Defaults to
|
||||
* the sha1 of $certsLocation if provided, otherwise is set to
|
||||
* "federated_signon_certs_v3".
|
||||
* @type string $certsLocation The location (remote or local) from which
|
||||
* to retrieve certificates, if not cached. This value should only be
|
||||
* provided in limited circumstances in which you are sure of the
|
||||
* behavior.
|
||||
* @type bool $throwException Whether the function should throw an
|
||||
* exception if the verification fails. This is useful for
|
||||
* determining the reason verification failed.
|
||||
* }
|
||||
* @return array<mixed>|false the token payload, if successful, or false if not.
|
||||
* @throws InvalidArgumentException If certs could not be retrieved from a local file.
|
||||
* @throws InvalidArgumentException If received certs are in an invalid format.
|
||||
* @throws InvalidArgumentException If the cert alg is not supported.
|
||||
* @throws RuntimeException If certs could not be retrieved from a remote location.
|
||||
* @throws UnexpectedValueException If the token issuer does not match.
|
||||
* @throws UnexpectedValueException If the token audience does not match.
|
||||
*/
|
||||
public function verify($token, array $options = [])
|
||||
{
|
||||
$audience = $options['audience'] ?? null;
|
||||
$issuer = $options['issuer'] ?? null;
|
||||
$certsLocation = $options['certsLocation'] ?? self::FEDERATED_SIGNON_CERT_URL;
|
||||
$cacheKey = $options['cacheKey'] ?? $this->getCacheKeyFromCertLocation($certsLocation);
|
||||
$throwException = $options['throwException'] ?? \false;
|
||||
// for backwards compatibility
|
||||
// Check signature against each available cert.
|
||||
$certs = $this->getCerts($certsLocation, $cacheKey, $options);
|
||||
$alg = $this->determineAlg($certs);
|
||||
if (!\in_array($alg, ['RS256', 'ES256'])) {
|
||||
throw new InvalidArgumentException('unrecognized "alg" in certs, expected ES256 or RS256');
|
||||
}
|
||||
try {
|
||||
if ($alg == 'RS256') {
|
||||
return $this->verifyRs256($token, $certs, $audience, $issuer);
|
||||
}
|
||||
return $this->verifyEs256($token, $certs, $audience, $issuer);
|
||||
} catch (ExpiredException $e) {
|
||||
// firebase/php-jwt 5+
|
||||
} catch (SignatureInvalidException $e) {
|
||||
// firebase/php-jwt 5+
|
||||
} catch (InvalidTokenException $e) {
|
||||
// simplejwt
|
||||
} catch (InvalidArgumentException $e) {
|
||||
} catch (UnexpectedValueException $e) {
|
||||
}
|
||||
if ($throwException) {
|
||||
throw $e;
|
||||
}
|
||||
return \false;
|
||||
}
|
||||
/**
|
||||
* Identifies the expected algorithm to verify by looking at the "alg" key
|
||||
* of the provided certs.
|
||||
*
|
||||
* @param array<mixed> $certs Certificate array according to the JWK spec (see
|
||||
* https://tools.ietf.org/html/rfc7517).
|
||||
* @return string The expected algorithm, such as "ES256" or "RS256".
|
||||
*/
|
||||
private function determineAlg(array $certs)
|
||||
{
|
||||
$alg = null;
|
||||
foreach ($certs as $cert) {
|
||||
if (empty($cert['alg'])) {
|
||||
throw new InvalidArgumentException('certs expects "alg" to be set');
|
||||
}
|
||||
$alg = $alg ?: $cert['alg'];
|
||||
if ($alg != $cert['alg']) {
|
||||
throw new InvalidArgumentException('More than one alg detected in certs');
|
||||
}
|
||||
}
|
||||
return $alg;
|
||||
}
|
||||
/**
|
||||
* Verifies an ES256-signed JWT.
|
||||
*
|
||||
* @param string $token The JSON Web Token to be verified.
|
||||
* @param array<mixed> $certs Certificate array according to the JWK spec (see
|
||||
* https://tools.ietf.org/html/rfc7517).
|
||||
* @param string|null $audience If set, returns false if the provided
|
||||
* audience does not match the "aud" claim on the JWT.
|
||||
* @param string|null $issuer If set, returns false if the provided
|
||||
* issuer does not match the "iss" claim on the JWT.
|
||||
* @return array<mixed> the token payload, if successful, or false if not.
|
||||
*/
|
||||
private function verifyEs256($token, array $certs, $audience = null, $issuer = null)
|
||||
{
|
||||
$this->checkSimpleJwt();
|
||||
$jwkset = new KeySet();
|
||||
foreach ($certs as $cert) {
|
||||
$jwkset->add(KeyFactory::create($cert, 'php'));
|
||||
}
|
||||
// Validate the signature using the key set and ES256 algorithm.
|
||||
$jwt = $this->callSimpleJwtDecode([$token, $jwkset, 'ES256']);
|
||||
$payload = $jwt->getClaims();
|
||||
if ($audience) {
|
||||
if (!isset($payload['aud']) || $payload['aud'] != $audience) {
|
||||
throw new UnexpectedValueException('Audience does not match');
|
||||
}
|
||||
}
|
||||
// @see https://cloud.google.com/iap/docs/signed-headers-howto#verifying_the_jwt_payload
|
||||
$issuer = $issuer ?: self::IAP_ISSUER;
|
||||
if (!isset($payload['iss']) || $payload['iss'] !== $issuer) {
|
||||
throw new UnexpectedValueException('Issuer does not match');
|
||||
}
|
||||
return $payload;
|
||||
}
|
||||
/**
|
||||
* Verifies an RS256-signed JWT.
|
||||
*
|
||||
* @param string $token The JSON Web Token to be verified.
|
||||
* @param array<mixed> $certs Certificate array according to the JWK spec (see
|
||||
* https://tools.ietf.org/html/rfc7517).
|
||||
* @param string|null $audience If set, returns false if the provided
|
||||
* audience does not match the "aud" claim on the JWT.
|
||||
* @param string|null $issuer If set, returns false if the provided
|
||||
* issuer does not match the "iss" claim on the JWT.
|
||||
* @return array<mixed> the token payload, if successful, or false if not.
|
||||
*/
|
||||
private function verifyRs256($token, array $certs, $audience = null, $issuer = null)
|
||||
{
|
||||
$this->checkAndInitializePhpsec();
|
||||
$keys = [];
|
||||
foreach ($certs as $cert) {
|
||||
if (empty($cert['kid'])) {
|
||||
throw new InvalidArgumentException('certs expects "kid" to be set');
|
||||
}
|
||||
if (empty($cert['n']) || empty($cert['e'])) {
|
||||
throw new InvalidArgumentException('RSA certs expects "n" and "e" to be set');
|
||||
}
|
||||
$publicKey = $this->loadPhpsecPublicKey($cert['n'], $cert['e']);
|
||||
// create an array of key IDs to certs for the JWT library
|
||||
$keys[$cert['kid']] = new Key($publicKey, 'RS256');
|
||||
}
|
||||
$payload = $this->callJwtStatic('decode', [$token, $keys]);
|
||||
if ($audience) {
|
||||
if (!\property_exists($payload, 'aud') || $payload->aud != $audience) {
|
||||
throw new UnexpectedValueException('Audience does not match');
|
||||
}
|
||||
}
|
||||
// support HTTP and HTTPS issuers
|
||||
// @see https://developers.google.com/identity/sign-in/web/backend-auth
|
||||
$issuers = $issuer ? [$issuer] : [self::OAUTH2_ISSUER, self::OAUTH2_ISSUER_HTTPS];
|
||||
if (!isset($payload->iss) || !\in_array($payload->iss, $issuers)) {
|
||||
throw new UnexpectedValueException('Issuer does not match');
|
||||
}
|
||||
return (array) $payload;
|
||||
}
|
||||
/**
|
||||
* Revoke an OAuth2 access token or refresh token. This method will revoke the current access
|
||||
* token, if a token isn't provided.
|
||||
*
|
||||
* @param string|array<mixed> $token The token (access token or a refresh token) that should be revoked.
|
||||
* @param array<mixed> $options [optional] Configuration options.
|
||||
* @return bool Returns True if the revocation was successful, otherwise False.
|
||||
*/
|
||||
public function revoke($token, array $options = [])
|
||||
{
|
||||
if (\is_array($token)) {
|
||||
if (isset($token['refresh_token'])) {
|
||||
$token = $token['refresh_token'];
|
||||
} else {
|
||||
$token = $token['access_token'];
|
||||
}
|
||||
}
|
||||
$body = Utils::streamFor(\http_build_query(['token' => $token]));
|
||||
$request = new Request('POST', self::OAUTH2_REVOKE_URI, ['Cache-Control' => 'no-store', 'Content-Type' => 'application/x-www-form-urlencoded'], $body);
|
||||
$httpHandler = $this->httpHandler;
|
||||
$response = $httpHandler($request, $options);
|
||||
return $response->getStatusCode() == 200;
|
||||
}
|
||||
/**
|
||||
* Gets federated sign-on certificates to use for verifying identity tokens.
|
||||
* Returns certs as array structure, where keys are key ids, and values
|
||||
* are PEM encoded certificates.
|
||||
*
|
||||
* @param string $location The location from which to retrieve certs.
|
||||
* @param string $cacheKey The key under which to cache the retrieved certs.
|
||||
* @param array<mixed> $options [optional] Configuration options.
|
||||
* @return array<mixed>
|
||||
* @throws InvalidArgumentException If received certs are in an invalid format.
|
||||
*/
|
||||
private function getCerts($location, $cacheKey, array $options = [])
|
||||
{
|
||||
$cacheItem = $this->cache->getItem($cacheKey);
|
||||
$certs = $cacheItem ? $cacheItem->get() : null;
|
||||
$expireTime = null;
|
||||
if (!$certs) {
|
||||
list($certs, $expireTime) = $this->retrieveCertsFromLocation($location, $options);
|
||||
}
|
||||
if (!isset($certs['keys'])) {
|
||||
if ($location !== self::IAP_CERT_URL) {
|
||||
throw new InvalidArgumentException('federated sign-on certs expects "keys" to be set');
|
||||
}
|
||||
throw new InvalidArgumentException('certs expects "keys" to be set');
|
||||
}
|
||||
// Push caching off until after verifying certs are in a valid format.
|
||||
// Don't want to cache bad data.
|
||||
if ($expireTime) {
|
||||
$cacheItem->expiresAt(new DateTime($expireTime));
|
||||
$cacheItem->set($certs);
|
||||
$this->cache->save($cacheItem);
|
||||
}
|
||||
return $certs['keys'];
|
||||
}
|
||||
/**
|
||||
* Retrieve and cache a certificates file.
|
||||
*
|
||||
* @param string $url location
|
||||
* @param array<mixed> $options [optional] Configuration options.
|
||||
* @return array{array<mixed>, string}
|
||||
* @throws InvalidArgumentException If certs could not be retrieved from a local file.
|
||||
* @throws RuntimeException If certs could not be retrieved from a remote location.
|
||||
*/
|
||||
private function retrieveCertsFromLocation($url, array $options = [])
|
||||
{
|
||||
// If we're retrieving a local file, just grab it.
|
||||
$expireTime = '+1 hour';
|
||||
if (\strpos($url, 'http') !== 0) {
|
||||
if (!\file_exists($url)) {
|
||||
throw new InvalidArgumentException(\sprintf('Failed to retrieve verification certificates from path: %s.', $url));
|
||||
}
|
||||
return [\json_decode((string) \file_get_contents($url), \true), $expireTime];
|
||||
}
|
||||
$httpHandler = $this->httpHandler;
|
||||
$response = $httpHandler(new Request('GET', $url), $options);
|
||||
if ($response->getStatusCode() == 200) {
|
||||
if ($cacheControl = $response->getHeaderLine('Cache-Control')) {
|
||||
\array_map(function ($value) use(&$expireTime) {
|
||||
list($key, $value) = \explode('=', $value) + [null, null];
|
||||
if (\trim($key) == 'max-age') {
|
||||
$expireTime = '+' . $value . ' seconds';
|
||||
}
|
||||
}, \explode(',', $cacheControl));
|
||||
}
|
||||
return [\json_decode((string) $response->getBody(), \true), $expireTime];
|
||||
}
|
||||
throw new RuntimeException(\sprintf('Failed to retrieve verification certificates: "%s".', $response->getBody()->getContents()), $response->getStatusCode());
|
||||
}
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
private function checkAndInitializePhpsec()
|
||||
{
|
||||
if (!\class_exists(RSA::class)) {
|
||||
throw new RuntimeException('Please require phpseclib/phpseclib v3 to use this utility.');
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @return string
|
||||
* @throws TypeError If the key cannot be initialized to a string.
|
||||
*/
|
||||
private function loadPhpsecPublicKey(string $modulus, string $exponent) : string
|
||||
{
|
||||
$key = PublicKeyLoader::load(['n' => new BigInteger($this->callJwtStatic('urlsafeB64Decode', [$modulus]), 256), 'e' => new BigInteger($this->callJwtStatic('urlsafeB64Decode', [$exponent]), 256)]);
|
||||
$formattedPublicKey = $key->toString('PKCS8');
|
||||
if (!\is_string($formattedPublicKey)) {
|
||||
throw new TypeError('Failed to initialize the key');
|
||||
}
|
||||
return $formattedPublicKey;
|
||||
}
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
private function checkSimpleJwt()
|
||||
{
|
||||
// @codeCoverageIgnoreStart
|
||||
if (!\class_exists(SimpleJwt::class)) {
|
||||
throw new RuntimeException('Please require kelvinmo/simplejwt ^0.2 to use this utility.');
|
||||
}
|
||||
// @codeCoverageIgnoreEnd
|
||||
}
|
||||
/**
|
||||
* Provide a hook to mock calls to the JWT static methods.
|
||||
*
|
||||
* @param string $method
|
||||
* @param array<mixed> $args
|
||||
* @return mixed
|
||||
*/
|
||||
protected function callJwtStatic($method, array $args = [])
|
||||
{
|
||||
return \call_user_func_array([JWT::class, $method], $args);
|
||||
// @phpstan-ignore-line
|
||||
}
|
||||
/**
|
||||
* Provide a hook to mock calls to the JWT static methods.
|
||||
*
|
||||
* @param array<mixed> $args
|
||||
* @return mixed
|
||||
*/
|
||||
protected function callSimpleJwtDecode(array $args = [])
|
||||
{
|
||||
return \call_user_func_array([SimpleJwt::class, 'decode'], $args);
|
||||
}
|
||||
/**
|
||||
* Generate a cache key based on the cert location using sha1 with the
|
||||
* exception of using "federated_signon_certs_v3" to preserve BC.
|
||||
*
|
||||
* @param string $certsLocation
|
||||
* @return string
|
||||
*/
|
||||
private function getCacheKeyFromCertLocation($certsLocation)
|
||||
{
|
||||
$key = $certsLocation === self::FEDERATED_SIGNON_CERT_URL ? 'federated_signon_certs_v3' : \sha1($certsLocation);
|
||||
return 'google_auth_certs_cache|' . $key;
|
||||
}
|
||||
}
|
||||
301
vendor/Gcp/google/auth/src/ApplicationDefaultCredentials.php
vendored
Normal file
301
vendor/Gcp/google/auth/src/ApplicationDefaultCredentials.php
vendored
Normal file
@@ -0,0 +1,301 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2015 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth;
|
||||
|
||||
use DomainException;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Credentials\AppIdentityCredentials;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Credentials\GCECredentials;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Credentials\ServiceAccountCredentials;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\HttpHandler\HttpClientCache;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\HttpHandler\HttpHandlerFactory;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Middleware\AuthTokenMiddleware;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Middleware\ProxyAuthTokenMiddleware;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Subscriber\AuthTokenSubscriber;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\Client;
|
||||
use InvalidArgumentException;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Psr\Cache\CacheItemPoolInterface;
|
||||
/**
|
||||
* ApplicationDefaultCredentials obtains the default credentials for
|
||||
* authorizing a request to a Google service.
|
||||
*
|
||||
* Application Default Credentials are described here:
|
||||
* https://developers.google.com/accounts/docs/application-default-credentials
|
||||
*
|
||||
* This class implements the search for the application default credentials as
|
||||
* described in the link.
|
||||
*
|
||||
* It provides three factory methods:
|
||||
* - #get returns the computed credentials object
|
||||
* - #getSubscriber returns an AuthTokenSubscriber built from the credentials object
|
||||
* - #getMiddleware returns an AuthTokenMiddleware built from the credentials object
|
||||
*
|
||||
* This allows it to be used as follows with GuzzleHttp\Client:
|
||||
*
|
||||
* ```
|
||||
* use Google\Auth\ApplicationDefaultCredentials;
|
||||
* use GuzzleHttp\Client;
|
||||
* use GuzzleHttp\HandlerStack;
|
||||
*
|
||||
* $middleware = ApplicationDefaultCredentials::getMiddleware(
|
||||
* 'https://www.googleapis.com/auth/taskqueue'
|
||||
* );
|
||||
* $stack = HandlerStack::create();
|
||||
* $stack->push($middleware);
|
||||
*
|
||||
* $client = new Client([
|
||||
* 'handler' => $stack,
|
||||
* 'base_uri' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/',
|
||||
* 'auth' => 'google_auth' // authorize all requests
|
||||
* ]);
|
||||
*
|
||||
* $res = $client->get('myproject/taskqueues/myqueue');
|
||||
* ```
|
||||
*/
|
||||
class ApplicationDefaultCredentials
|
||||
{
|
||||
/**
|
||||
* @deprecated
|
||||
*
|
||||
* Obtains an AuthTokenSubscriber that uses the default FetchAuthTokenInterface
|
||||
* implementation to use in this environment.
|
||||
*
|
||||
* If supplied, $scope is used to in creating the credentials instance if
|
||||
* this does not fallback to the compute engine defaults.
|
||||
*
|
||||
* @param string|string[] $scope the scope of the access request, expressed
|
||||
* either as an Array or as a space-delimited String.
|
||||
* @param callable $httpHandler callback which delivers psr7 request
|
||||
* @param array<mixed> $cacheConfig configuration for the cache when it's present
|
||||
* @param CacheItemPoolInterface $cache A cache implementation, may be
|
||||
* provided if you have one already available for use.
|
||||
* @return AuthTokenSubscriber
|
||||
* @throws DomainException if no implementation can be obtained.
|
||||
*/
|
||||
public static function getSubscriber(
|
||||
// @phpstan-ignore-line
|
||||
$scope = null,
|
||||
callable $httpHandler = null,
|
||||
array $cacheConfig = null,
|
||||
CacheItemPoolInterface $cache = null
|
||||
)
|
||||
{
|
||||
$creds = self::getCredentials($scope, $httpHandler, $cacheConfig, $cache);
|
||||
/** @phpstan-ignore-next-line */
|
||||
return new AuthTokenSubscriber($creds, $httpHandler);
|
||||
}
|
||||
/**
|
||||
* Obtains an AuthTokenMiddleware that uses the default FetchAuthTokenInterface
|
||||
* implementation to use in this environment.
|
||||
*
|
||||
* If supplied, $scope is used to in creating the credentials instance if
|
||||
* this does not fallback to the compute engine defaults.
|
||||
*
|
||||
* @param string|string[] $scope the scope of the access request, expressed
|
||||
* either as an Array or as a space-delimited String.
|
||||
* @param callable $httpHandler callback which delivers psr7 request
|
||||
* @param array<mixed> $cacheConfig configuration for the cache when it's present
|
||||
* @param CacheItemPoolInterface $cache A cache implementation, may be
|
||||
* provided if you have one already available for use.
|
||||
* @param string $quotaProject specifies a project to bill for access
|
||||
* charges associated with the request.
|
||||
* @return AuthTokenMiddleware
|
||||
* @throws DomainException if no implementation can be obtained.
|
||||
*/
|
||||
public static function getMiddleware($scope = null, callable $httpHandler = null, array $cacheConfig = null, CacheItemPoolInterface $cache = null, $quotaProject = null)
|
||||
{
|
||||
$creds = self::getCredentials($scope, $httpHandler, $cacheConfig, $cache, $quotaProject);
|
||||
return new AuthTokenMiddleware($creds, $httpHandler);
|
||||
}
|
||||
/**
|
||||
* Obtains the default FetchAuthTokenInterface implementation to use
|
||||
* in this environment.
|
||||
*
|
||||
* @param string|string[] $scope the scope of the access request, expressed
|
||||
* either as an Array or as a space-delimited String.
|
||||
* @param callable $httpHandler callback which delivers psr7 request
|
||||
* @param array<mixed> $cacheConfig configuration for the cache when it's present
|
||||
* @param CacheItemPoolInterface $cache A cache implementation, may be
|
||||
* provided if you have one already available for use.
|
||||
* @param string $quotaProject specifies a project to bill for access
|
||||
* charges associated with the request.
|
||||
* @param string|string[] $defaultScope The default scope to use if no
|
||||
* user-defined scopes exist, expressed either as an Array or as a
|
||||
* space-delimited string.
|
||||
* @param string $universeDomain Specifies a universe domain to use for the
|
||||
* calling client library
|
||||
*
|
||||
* @return FetchAuthTokenInterface
|
||||
* @throws DomainException if no implementation can be obtained.
|
||||
*/
|
||||
public static function getCredentials($scope = null, callable $httpHandler = null, array $cacheConfig = null, CacheItemPoolInterface $cache = null, $quotaProject = null, $defaultScope = null, string $universeDomain = null)
|
||||
{
|
||||
$creds = null;
|
||||
$jsonKey = CredentialsLoader::fromEnv() ?: CredentialsLoader::fromWellKnownFile();
|
||||
$anyScope = $scope ?: $defaultScope;
|
||||
if (!$httpHandler) {
|
||||
if (!($client = HttpClientCache::getHttpClient())) {
|
||||
$client = new Client();
|
||||
HttpClientCache::setHttpClient($client);
|
||||
}
|
||||
$httpHandler = HttpHandlerFactory::build($client);
|
||||
}
|
||||
if (\is_null($quotaProject)) {
|
||||
// if a quota project isn't specified, try to get one from the env var
|
||||
$quotaProject = CredentialsLoader::quotaProjectFromEnv();
|
||||
}
|
||||
if (!\is_null($jsonKey)) {
|
||||
if ($quotaProject) {
|
||||
$jsonKey['quota_project_id'] = $quotaProject;
|
||||
}
|
||||
if ($universeDomain) {
|
||||
$jsonKey['universe_domain'] = $universeDomain;
|
||||
}
|
||||
$creds = CredentialsLoader::makeCredentials($scope, $jsonKey, $defaultScope);
|
||||
} elseif (AppIdentityCredentials::onAppEngine() && !GCECredentials::onAppEngineFlexible()) {
|
||||
$creds = new AppIdentityCredentials($anyScope);
|
||||
} elseif (self::onGce($httpHandler, $cacheConfig, $cache)) {
|
||||
$creds = new GCECredentials(null, $anyScope, null, $quotaProject, null, $universeDomain);
|
||||
$creds->setIsOnGce(\true);
|
||||
// save the credentials a trip to the metadata server
|
||||
}
|
||||
if (\is_null($creds)) {
|
||||
throw new DomainException(self::notFound());
|
||||
}
|
||||
if (!\is_null($cache)) {
|
||||
$creds = new FetchAuthTokenCache($creds, $cacheConfig, $cache);
|
||||
}
|
||||
return $creds;
|
||||
}
|
||||
/**
|
||||
* Obtains an AuthTokenMiddleware which will fetch an ID token to use in the
|
||||
* Authorization header. The middleware is configured with the default
|
||||
* FetchAuthTokenInterface implementation to use in this environment.
|
||||
*
|
||||
* If supplied, $targetAudience is used to set the "aud" on the resulting
|
||||
* ID token.
|
||||
*
|
||||
* @param string $targetAudience The audience for the ID token.
|
||||
* @param callable $httpHandler callback which delivers psr7 request
|
||||
* @param array<mixed> $cacheConfig configuration for the cache when it's present
|
||||
* @param CacheItemPoolInterface $cache A cache implementation, may be
|
||||
* provided if you have one already available for use.
|
||||
* @return AuthTokenMiddleware
|
||||
* @throws DomainException if no implementation can be obtained.
|
||||
*/
|
||||
public static function getIdTokenMiddleware($targetAudience, callable $httpHandler = null, array $cacheConfig = null, CacheItemPoolInterface $cache = null)
|
||||
{
|
||||
$creds = self::getIdTokenCredentials($targetAudience, $httpHandler, $cacheConfig, $cache);
|
||||
return new AuthTokenMiddleware($creds, $httpHandler);
|
||||
}
|
||||
/**
|
||||
* Obtains an ProxyAuthTokenMiddleware which will fetch an ID token to use in the
|
||||
* Authorization header. The middleware is configured with the default
|
||||
* FetchAuthTokenInterface implementation to use in this environment.
|
||||
*
|
||||
* If supplied, $targetAudience is used to set the "aud" on the resulting
|
||||
* ID token.
|
||||
*
|
||||
* @param string $targetAudience The audience for the ID token.
|
||||
* @param callable $httpHandler callback which delivers psr7 request
|
||||
* @param array<mixed> $cacheConfig configuration for the cache when it's present
|
||||
* @param CacheItemPoolInterface $cache A cache implementation, may be
|
||||
* provided if you have one already available for use.
|
||||
* @return ProxyAuthTokenMiddleware
|
||||
* @throws DomainException if no implementation can be obtained.
|
||||
*/
|
||||
public static function getProxyIdTokenMiddleware($targetAudience, callable $httpHandler = null, array $cacheConfig = null, CacheItemPoolInterface $cache = null)
|
||||
{
|
||||
$creds = self::getIdTokenCredentials($targetAudience, $httpHandler, $cacheConfig, $cache);
|
||||
return new ProxyAuthTokenMiddleware($creds, $httpHandler);
|
||||
}
|
||||
/**
|
||||
* Obtains the default FetchAuthTokenInterface implementation to use
|
||||
* in this environment, configured with a $targetAudience for fetching an ID
|
||||
* token.
|
||||
*
|
||||
* @param string $targetAudience The audience for the ID token.
|
||||
* @param callable $httpHandler callback which delivers psr7 request
|
||||
* @param array<mixed> $cacheConfig configuration for the cache when it's present
|
||||
* @param CacheItemPoolInterface $cache A cache implementation, may be
|
||||
* provided if you have one already available for use.
|
||||
* @return FetchAuthTokenInterface
|
||||
* @throws DomainException if no implementation can be obtained.
|
||||
* @throws InvalidArgumentException if JSON "type" key is invalid
|
||||
*/
|
||||
public static function getIdTokenCredentials($targetAudience, callable $httpHandler = null, array $cacheConfig = null, CacheItemPoolInterface $cache = null)
|
||||
{
|
||||
$creds = null;
|
||||
$jsonKey = CredentialsLoader::fromEnv() ?: CredentialsLoader::fromWellKnownFile();
|
||||
if (!$httpHandler) {
|
||||
if (!($client = HttpClientCache::getHttpClient())) {
|
||||
$client = new Client();
|
||||
HttpClientCache::setHttpClient($client);
|
||||
}
|
||||
$httpHandler = HttpHandlerFactory::build($client);
|
||||
}
|
||||
if (!\is_null($jsonKey)) {
|
||||
if (!\array_key_exists('type', $jsonKey)) {
|
||||
throw new \InvalidArgumentException('json key is missing the type field');
|
||||
}
|
||||
if ($jsonKey['type'] == 'authorized_user') {
|
||||
throw new InvalidArgumentException('ID tokens are not supported for end user credentials');
|
||||
}
|
||||
if ($jsonKey['type'] != 'service_account') {
|
||||
throw new InvalidArgumentException('invalid value in the type field');
|
||||
}
|
||||
$creds = new ServiceAccountCredentials(null, $jsonKey, null, $targetAudience);
|
||||
} elseif (self::onGce($httpHandler, $cacheConfig, $cache)) {
|
||||
$creds = new GCECredentials(null, null, $targetAudience);
|
||||
$creds->setIsOnGce(\true);
|
||||
// save the credentials a trip to the metadata server
|
||||
}
|
||||
if (\is_null($creds)) {
|
||||
throw new DomainException(self::notFound());
|
||||
}
|
||||
if (!\is_null($cache)) {
|
||||
$creds = new FetchAuthTokenCache($creds, $cacheConfig, $cache);
|
||||
}
|
||||
return $creds;
|
||||
}
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
private static function notFound()
|
||||
{
|
||||
$msg = 'Your default credentials were not found. To set up ';
|
||||
$msg .= 'Application Default Credentials, see ';
|
||||
$msg .= 'https://cloud.google.com/docs/authentication/external/set-up-adc';
|
||||
return $msg;
|
||||
}
|
||||
/**
|
||||
* @param callable $httpHandler
|
||||
* @param array<mixed> $cacheConfig
|
||||
* @param CacheItemPoolInterface $cache
|
||||
* @return bool
|
||||
*/
|
||||
private static function onGce(callable $httpHandler = null, array $cacheConfig = null, CacheItemPoolInterface $cache = null)
|
||||
{
|
||||
$gceCacheConfig = [];
|
||||
foreach (['lifetime', 'prefix'] as $key) {
|
||||
if (isset($cacheConfig['gce_' . $key])) {
|
||||
$gceCacheConfig[$key] = $cacheConfig['gce_' . $key];
|
||||
}
|
||||
}
|
||||
return (new GCECache($gceCacheConfig, $cache))->onGce($httpHandler);
|
||||
}
|
||||
}
|
||||
23
vendor/Gcp/google/auth/src/Cache/InvalidArgumentException.php
vendored
Normal file
23
vendor/Gcp/google/auth/src/Cache/InvalidArgumentException.php
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2016 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Cache;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Psr\Cache\InvalidArgumentException as PsrInvalidArgumentException;
|
||||
class InvalidArgumentException extends \InvalidArgumentException implements PsrInvalidArgumentException
|
||||
{
|
||||
}
|
||||
146
vendor/Gcp/google/auth/src/Cache/Item.php
vendored
Normal file
146
vendor/Gcp/google/auth/src/Cache/Item.php
vendored
Normal file
@@ -0,0 +1,146 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2016 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Cache;
|
||||
|
||||
use DateTime;
|
||||
use DateTimeInterface;
|
||||
use DateTimeZone;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Psr\Cache\CacheItemInterface;
|
||||
use TypeError;
|
||||
/**
|
||||
* A cache item.
|
||||
*
|
||||
* This class will be used by MemoryCacheItemPool and SysVCacheItemPool
|
||||
* on PHP 7.4 and below. It is compatible with psr/cache 1.0 and 2.0 (PSR-6).
|
||||
* @see TypedItem for compatiblity with psr/cache 3.0.
|
||||
*/
|
||||
final class Item implements CacheItemInterface
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $key;
|
||||
/**
|
||||
* @var mixed
|
||||
*/
|
||||
private $value;
|
||||
/**
|
||||
* @var DateTimeInterface|null
|
||||
*/
|
||||
private $expiration;
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $isHit = \false;
|
||||
/**
|
||||
* @param string $key
|
||||
*/
|
||||
public function __construct($key)
|
||||
{
|
||||
$this->key = $key;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getKey()
|
||||
{
|
||||
return $this->key;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function get()
|
||||
{
|
||||
return $this->isHit() ? $this->value : null;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function isHit()
|
||||
{
|
||||
if (!$this->isHit) {
|
||||
return \false;
|
||||
}
|
||||
if ($this->expiration === null) {
|
||||
return \true;
|
||||
}
|
||||
return $this->currentTime()->getTimestamp() < $this->expiration->getTimestamp();
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function set($value)
|
||||
{
|
||||
$this->isHit = \true;
|
||||
$this->value = $value;
|
||||
return $this;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function expiresAt($expiration)
|
||||
{
|
||||
if ($this->isValidExpiration($expiration)) {
|
||||
$this->expiration = $expiration;
|
||||
return $this;
|
||||
}
|
||||
$error = \sprintf('Argument 1 passed to %s::expiresAt() must implement interface DateTimeInterface, %s given', \get_class($this), \gettype($expiration));
|
||||
throw new TypeError($error);
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function expiresAfter($time)
|
||||
{
|
||||
if (\is_int($time)) {
|
||||
$this->expiration = $this->currentTime()->add(new \DateInterval("PT{$time}S"));
|
||||
} elseif ($time instanceof \DateInterval) {
|
||||
$this->expiration = $this->currentTime()->add($time);
|
||||
} elseif ($time === null) {
|
||||
$this->expiration = $time;
|
||||
} else {
|
||||
$message = 'Argument 1 passed to %s::expiresAfter() must be an ' . 'instance of DateInterval or of the type integer, %s given';
|
||||
$error = \sprintf($message, \get_class($this), \gettype($time));
|
||||
throw new TypeError($error);
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
/**
|
||||
* Determines if an expiration is valid based on the rules defined by PSR6.
|
||||
*
|
||||
* @param mixed $expiration
|
||||
* @return bool
|
||||
*/
|
||||
private function isValidExpiration($expiration)
|
||||
{
|
||||
if ($expiration === null) {
|
||||
return \true;
|
||||
}
|
||||
if ($expiration instanceof DateTimeInterface) {
|
||||
return \true;
|
||||
}
|
||||
return \false;
|
||||
}
|
||||
/**
|
||||
* @return DateTime
|
||||
*/
|
||||
protected function currentTime()
|
||||
{
|
||||
return new DateTime('now', new DateTimeZone('UTC'));
|
||||
}
|
||||
}
|
||||
161
vendor/Gcp/google/auth/src/Cache/MemoryCacheItemPool.php
vendored
Normal file
161
vendor/Gcp/google/auth/src/Cache/MemoryCacheItemPool.php
vendored
Normal file
@@ -0,0 +1,161 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2016 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Cache;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Psr\Cache\CacheItemInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Psr\Cache\CacheItemPoolInterface;
|
||||
/**
|
||||
* Simple in-memory cache implementation.
|
||||
*/
|
||||
final class MemoryCacheItemPool implements CacheItemPoolInterface
|
||||
{
|
||||
/**
|
||||
* @var CacheItemInterface[]
|
||||
*/
|
||||
private $items;
|
||||
/**
|
||||
* @var CacheItemInterface[]
|
||||
*/
|
||||
private $deferredItems;
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* @return CacheItemInterface The corresponding Cache Item.
|
||||
*/
|
||||
public function getItem($key) : CacheItemInterface
|
||||
{
|
||||
return \current($this->getItems([$key]));
|
||||
// @phpstan-ignore-line
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* @return iterable<CacheItemInterface>
|
||||
* A traversable collection of Cache Items keyed by the cache keys of
|
||||
* each item. A Cache item will be returned for each key, even if that
|
||||
* key is not found. However, if no keys are specified then an empty
|
||||
* traversable MUST be returned instead.
|
||||
*/
|
||||
public function getItems(array $keys = []) : iterable
|
||||
{
|
||||
$items = [];
|
||||
$itemClass = \PHP_VERSION_ID >= 80000 ? TypedItem::class : Item::class;
|
||||
foreach ($keys as $key) {
|
||||
$items[$key] = $this->hasItem($key) ? clone $this->items[$key] : new $itemClass($key);
|
||||
}
|
||||
return $items;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* @return bool
|
||||
* True if item exists in the cache, false otherwise.
|
||||
*/
|
||||
public function hasItem($key) : bool
|
||||
{
|
||||
$this->isValidKey($key);
|
||||
return isset($this->items[$key]) && $this->items[$key]->isHit();
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* @return bool
|
||||
* True if the pool was successfully cleared. False if there was an error.
|
||||
*/
|
||||
public function clear() : bool
|
||||
{
|
||||
$this->items = [];
|
||||
$this->deferredItems = [];
|
||||
return \true;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* @return bool
|
||||
* True if the item was successfully removed. False if there was an error.
|
||||
*/
|
||||
public function deleteItem($key) : bool
|
||||
{
|
||||
return $this->deleteItems([$key]);
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* @return bool
|
||||
* True if the items were successfully removed. False if there was an error.
|
||||
*/
|
||||
public function deleteItems(array $keys) : bool
|
||||
{
|
||||
\array_walk($keys, [$this, 'isValidKey']);
|
||||
foreach ($keys as $key) {
|
||||
unset($this->items[$key]);
|
||||
}
|
||||
return \true;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* @return bool
|
||||
* True if the item was successfully persisted. False if there was an error.
|
||||
*/
|
||||
public function save(CacheItemInterface $item) : bool
|
||||
{
|
||||
$this->items[$item->getKey()] = $item;
|
||||
return \true;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* @return bool
|
||||
* False if the item could not be queued or if a commit was attempted and failed. True otherwise.
|
||||
*/
|
||||
public function saveDeferred(CacheItemInterface $item) : bool
|
||||
{
|
||||
$this->deferredItems[$item->getKey()] = $item;
|
||||
return \true;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* @return bool
|
||||
* True if all not-yet-saved items were successfully saved or there were none. False otherwise.
|
||||
*/
|
||||
public function commit() : bool
|
||||
{
|
||||
foreach ($this->deferredItems as $item) {
|
||||
$this->save($item);
|
||||
}
|
||||
$this->deferredItems = [];
|
||||
return \true;
|
||||
}
|
||||
/**
|
||||
* Determines if the provided key is valid.
|
||||
*
|
||||
* @param string $key
|
||||
* @return bool
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
private function isValidKey($key)
|
||||
{
|
||||
$invalidCharacters = '{}()/\\\\@:';
|
||||
if (!\is_string($key) || \preg_match("#[{$invalidCharacters}]#", $key)) {
|
||||
throw new InvalidArgumentException('The provided key is not valid: ' . \var_export($key, \true));
|
||||
}
|
||||
return \true;
|
||||
}
|
||||
}
|
||||
207
vendor/Gcp/google/auth/src/Cache/SysVCacheItemPool.php
vendored
Normal file
207
vendor/Gcp/google/auth/src/Cache/SysVCacheItemPool.php
vendored
Normal file
@@ -0,0 +1,207 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Cache;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Psr\Cache\CacheItemInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Psr\Cache\CacheItemPoolInterface;
|
||||
/**
|
||||
* SystemV shared memory based CacheItemPool implementation.
|
||||
*
|
||||
* This CacheItemPool implementation can be used among multiple processes, but
|
||||
* it doesn't provide any locking mechanism. If multiple processes write to
|
||||
* this ItemPool, you have to avoid race condition manually in your code.
|
||||
*/
|
||||
class SysVCacheItemPool implements CacheItemPoolInterface
|
||||
{
|
||||
const VAR_KEY = 1;
|
||||
const DEFAULT_PROJ = 'A';
|
||||
const DEFAULT_MEMSIZE = 10000;
|
||||
const DEFAULT_PERM = 0600;
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $sysvKey;
|
||||
/**
|
||||
* @var CacheItemInterface[]
|
||||
*/
|
||||
private $items;
|
||||
/**
|
||||
* @var CacheItemInterface[]
|
||||
*/
|
||||
private $deferredItems;
|
||||
/**
|
||||
* @var array<mixed>
|
||||
*/
|
||||
private $options;
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $hasLoadedItems = \false;
|
||||
/**
|
||||
* Create a SystemV shared memory based CacheItemPool.
|
||||
*
|
||||
* @param array<mixed> $options {
|
||||
* [optional] Configuration options.
|
||||
*
|
||||
* @type int $variableKey The variable key for getting the data from the shared memory. **Defaults to** 1.
|
||||
* @type string $proj The project identifier for ftok. This needs to be a one character string.
|
||||
* **Defaults to** 'A'.
|
||||
* @type int $memsize The memory size in bytes for shm_attach. **Defaults to** 10000.
|
||||
* @type int $perm The permission for shm_attach. **Defaults to** 0600.
|
||||
* }
|
||||
*/
|
||||
public function __construct($options = [])
|
||||
{
|
||||
if (!\extension_loaded('sysvshm')) {
|
||||
throw new \RuntimeException('sysvshm extension is required to use this ItemPool');
|
||||
}
|
||||
$this->options = $options + ['variableKey' => self::VAR_KEY, 'proj' => self::DEFAULT_PROJ, 'memsize' => self::DEFAULT_MEMSIZE, 'perm' => self::DEFAULT_PERM];
|
||||
$this->items = [];
|
||||
$this->deferredItems = [];
|
||||
$this->sysvKey = \ftok(__FILE__, $this->options['proj']);
|
||||
}
|
||||
/**
|
||||
* @param mixed $key
|
||||
* @return CacheItemInterface
|
||||
*/
|
||||
public function getItem($key) : CacheItemInterface
|
||||
{
|
||||
$this->loadItems();
|
||||
return \current($this->getItems([$key]));
|
||||
// @phpstan-ignore-line
|
||||
}
|
||||
/**
|
||||
* @param array<mixed> $keys
|
||||
* @return iterable<CacheItemInterface>
|
||||
*/
|
||||
public function getItems(array $keys = []) : iterable
|
||||
{
|
||||
$this->loadItems();
|
||||
$items = [];
|
||||
$itemClass = \PHP_VERSION_ID >= 80000 ? TypedItem::class : Item::class;
|
||||
foreach ($keys as $key) {
|
||||
$items[$key] = $this->hasItem($key) ? clone $this->items[$key] : new $itemClass($key);
|
||||
}
|
||||
return $items;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function hasItem($key) : bool
|
||||
{
|
||||
$this->loadItems();
|
||||
return isset($this->items[$key]) && $this->items[$key]->isHit();
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function clear() : bool
|
||||
{
|
||||
$this->items = [];
|
||||
$this->deferredItems = [];
|
||||
return $this->saveCurrentItems();
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function deleteItem($key) : bool
|
||||
{
|
||||
return $this->deleteItems([$key]);
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function deleteItems(array $keys) : bool
|
||||
{
|
||||
if (!$this->hasLoadedItems) {
|
||||
$this->loadItems();
|
||||
}
|
||||
foreach ($keys as $key) {
|
||||
unset($this->items[$key]);
|
||||
}
|
||||
return $this->saveCurrentItems();
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function save(CacheItemInterface $item) : bool
|
||||
{
|
||||
if (!$this->hasLoadedItems) {
|
||||
$this->loadItems();
|
||||
}
|
||||
$this->items[$item->getKey()] = $item;
|
||||
return $this->saveCurrentItems();
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function saveDeferred(CacheItemInterface $item) : bool
|
||||
{
|
||||
$this->deferredItems[$item->getKey()] = $item;
|
||||
return \true;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function commit() : bool
|
||||
{
|
||||
foreach ($this->deferredItems as $item) {
|
||||
if ($this->save($item) === \false) {
|
||||
return \false;
|
||||
}
|
||||
}
|
||||
$this->deferredItems = [];
|
||||
return \true;
|
||||
}
|
||||
/**
|
||||
* Save the current items.
|
||||
*
|
||||
* @return bool true when success, false upon failure
|
||||
*/
|
||||
private function saveCurrentItems()
|
||||
{
|
||||
$shmid = \shm_attach($this->sysvKey, $this->options['memsize'], $this->options['perm']);
|
||||
if ($shmid !== \false) {
|
||||
$ret = \shm_put_var($shmid, $this->options['variableKey'], $this->items);
|
||||
\shm_detach($shmid);
|
||||
return $ret;
|
||||
}
|
||||
return \false;
|
||||
}
|
||||
/**
|
||||
* Load the items from the shared memory.
|
||||
*
|
||||
* @return bool true when success, false upon failure
|
||||
*/
|
||||
private function loadItems()
|
||||
{
|
||||
$shmid = \shm_attach($this->sysvKey, $this->options['memsize'], $this->options['perm']);
|
||||
if ($shmid !== \false) {
|
||||
$data = @\shm_get_var($shmid, $this->options['variableKey']);
|
||||
if (!empty($data)) {
|
||||
$this->items = $data;
|
||||
} else {
|
||||
$this->items = [];
|
||||
}
|
||||
\shm_detach($shmid);
|
||||
$this->hasLoadedItems = \true;
|
||||
return \true;
|
||||
}
|
||||
return \false;
|
||||
}
|
||||
}
|
||||
142
vendor/Gcp/google/auth/src/Cache/TypedItem.php
vendored
Normal file
142
vendor/Gcp/google/auth/src/Cache/TypedItem.php
vendored
Normal file
@@ -0,0 +1,142 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2022 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Cache;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Psr\Cache\CacheItemInterface;
|
||||
/**
|
||||
* A cache item.
|
||||
*
|
||||
* This class will be used by MemoryCacheItemPool and SysVCacheItemPool
|
||||
* on PHP 8.0 and above. It is compatible with psr/cache 3.0 (PSR-6).
|
||||
* @see Item for compatiblity with previous versions of PHP.
|
||||
*/
|
||||
final class TypedItem implements CacheItemInterface
|
||||
{
|
||||
/**
|
||||
* @var mixed
|
||||
*/
|
||||
private mixed $value;
|
||||
/**
|
||||
* @var \DateTimeInterface|null
|
||||
*/
|
||||
private ?\DateTimeInterface $expiration;
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private bool $isHit = \false;
|
||||
/**
|
||||
* @param string $key
|
||||
*/
|
||||
public function __construct(private string $key)
|
||||
{
|
||||
$this->key = $key;
|
||||
$this->expiration = null;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getKey() : string
|
||||
{
|
||||
return $this->key;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function get() : mixed
|
||||
{
|
||||
return $this->isHit() ? $this->value : null;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function isHit() : bool
|
||||
{
|
||||
if (!$this->isHit) {
|
||||
return \false;
|
||||
}
|
||||
if ($this->expiration === null) {
|
||||
return \true;
|
||||
}
|
||||
return $this->currentTime()->getTimestamp() < $this->expiration->getTimestamp();
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function set(mixed $value) : static
|
||||
{
|
||||
$this->isHit = \true;
|
||||
$this->value = $value;
|
||||
return $this;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function expiresAt($expiration) : static
|
||||
{
|
||||
if ($this->isValidExpiration($expiration)) {
|
||||
$this->expiration = $expiration;
|
||||
return $this;
|
||||
}
|
||||
$error = \sprintf('Argument 1 passed to %s::expiresAt() must implement interface DateTimeInterface, %s given', \get_class($this), \gettype($expiration));
|
||||
throw new \TypeError($error);
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function expiresAfter($time) : static
|
||||
{
|
||||
if (\is_int($time)) {
|
||||
$this->expiration = $this->currentTime()->add(new \DateInterval("PT{$time}S"));
|
||||
} elseif ($time instanceof \DateInterval) {
|
||||
$this->expiration = $this->currentTime()->add($time);
|
||||
} elseif ($time === null) {
|
||||
$this->expiration = $time;
|
||||
} else {
|
||||
$message = 'Argument 1 passed to %s::expiresAfter() must be an ' . 'instance of DateInterval or of the type integer, %s given';
|
||||
$error = \sprintf($message, \get_class($this), \gettype($time));
|
||||
throw new \TypeError($error);
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
/**
|
||||
* Determines if an expiration is valid based on the rules defined by PSR6.
|
||||
*
|
||||
* @param mixed $expiration
|
||||
* @return bool
|
||||
*/
|
||||
private function isValidExpiration($expiration)
|
||||
{
|
||||
if ($expiration === null) {
|
||||
return \true;
|
||||
}
|
||||
// We test for two types here due to the fact the DateTimeInterface
|
||||
// was not introduced until PHP 5.5. Checking for the DateTime type as
|
||||
// well allows us to support 5.4.
|
||||
if ($expiration instanceof \DateTimeInterface) {
|
||||
return \true;
|
||||
}
|
||||
return \false;
|
||||
}
|
||||
/**
|
||||
* @return \DateTime
|
||||
*/
|
||||
protected function currentTime()
|
||||
{
|
||||
return new \DateTime('now', new \DateTimeZone('UTC'));
|
||||
}
|
||||
}
|
||||
96
vendor/Gcp/google/auth/src/CacheTrait.php
vendored
Normal file
96
vendor/Gcp/google/auth/src/CacheTrait.php
vendored
Normal file
@@ -0,0 +1,96 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2015 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Psr\Cache\CacheItemPoolInterface;
|
||||
trait CacheTrait
|
||||
{
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $maxKeyLength = 64;
|
||||
/**
|
||||
* @var array<mixed>
|
||||
*/
|
||||
private $cacheConfig;
|
||||
/**
|
||||
* @var ?CacheItemPoolInterface
|
||||
*/
|
||||
private $cache;
|
||||
/**
|
||||
* Gets the cached value if it is present in the cache when that is
|
||||
* available.
|
||||
*
|
||||
* @param mixed $k
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
private function getCachedValue($k)
|
||||
{
|
||||
if (\is_null($this->cache)) {
|
||||
return null;
|
||||
}
|
||||
$key = $this->getFullCacheKey($k);
|
||||
if (\is_null($key)) {
|
||||
return null;
|
||||
}
|
||||
$cacheItem = $this->cache->getItem($key);
|
||||
if ($cacheItem->isHit()) {
|
||||
return $cacheItem->get();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Saves the value in the cache when that is available.
|
||||
*
|
||||
* @param mixed $k
|
||||
* @param mixed $v
|
||||
* @return mixed
|
||||
*/
|
||||
private function setCachedValue($k, $v)
|
||||
{
|
||||
if (\is_null($this->cache)) {
|
||||
return null;
|
||||
}
|
||||
$key = $this->getFullCacheKey($k);
|
||||
if (\is_null($key)) {
|
||||
return null;
|
||||
}
|
||||
$cacheItem = $this->cache->getItem($key);
|
||||
$cacheItem->set($v);
|
||||
$cacheItem->expiresAfter($this->cacheConfig['lifetime']);
|
||||
return $this->cache->save($cacheItem);
|
||||
}
|
||||
/**
|
||||
* @param null|string $key
|
||||
* @return null|string
|
||||
*/
|
||||
private function getFullCacheKey($key)
|
||||
{
|
||||
if (\is_null($key)) {
|
||||
return null;
|
||||
}
|
||||
$key = $this->cacheConfig['prefix'] . $key;
|
||||
// ensure we do not have illegal characters
|
||||
$key = \preg_replace('|[^a-zA-Z0-9_\\.!]|', '', $key);
|
||||
// Hash keys if they exceed $maxKeyLength (defaults to 64)
|
||||
if ($this->maxKeyLength && \strlen($key) > $this->maxKeyLength) {
|
||||
$key = \substr(\hash('sha256', $key), 0, $this->maxKeyLength);
|
||||
}
|
||||
return $key;
|
||||
}
|
||||
}
|
||||
270
vendor/Gcp/google/auth/src/CredentialSource/AwsNativeSource.php
vendored
Normal file
270
vendor/Gcp/google/auth/src/CredentialSource/AwsNativeSource.php
vendored
Normal file
@@ -0,0 +1,270 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2023 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\CredentialSource;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\ExternalAccountCredentialSourceInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\HttpHandler\HttpClientCache;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\HttpHandler\HttpHandlerFactory;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\Psr7\Request;
|
||||
/**
|
||||
* Authenticates requests using AWS credentials.
|
||||
*/
|
||||
class AwsNativeSource implements ExternalAccountCredentialSourceInterface
|
||||
{
|
||||
private const CRED_VERIFICATION_QUERY = 'Action=GetCallerIdentity&Version=2011-06-15';
|
||||
private string $audience;
|
||||
private string $regionalCredVerificationUrl;
|
||||
private ?string $regionUrl;
|
||||
private ?string $securityCredentialsUrl;
|
||||
private ?string $imdsv2SessionTokenUrl;
|
||||
/**
|
||||
* @param string $audience The audience for the credential.
|
||||
* @param string $regionalCredVerificationUrl The regional AWS GetCallerIdentity action URL used to determine the
|
||||
* AWS account ID and its roles. This is not called by this library, but
|
||||
* is sent in the subject token to be called by the STS token server.
|
||||
* @param string|null $regionUrl This URL should be used to determine the current AWS region needed for the signed
|
||||
* request construction.
|
||||
* @param string|null $securityCredentialsUrl The AWS metadata server URL used to retrieve the access key, secret
|
||||
* key and security token needed to sign the GetCallerIdentity request.
|
||||
* @param string|null $imdsv2SessionTokenUrl Presence of this URL enforces the auth libraries to fetch a Session
|
||||
* Token from AWS. This field is required for EC2 instances using IMDSv2.
|
||||
*/
|
||||
public function __construct(string $audience, string $regionalCredVerificationUrl, string $regionUrl = null, string $securityCredentialsUrl = null, string $imdsv2SessionTokenUrl = null)
|
||||
{
|
||||
$this->audience = $audience;
|
||||
$this->regionalCredVerificationUrl = $regionalCredVerificationUrl;
|
||||
$this->regionUrl = $regionUrl;
|
||||
$this->securityCredentialsUrl = $securityCredentialsUrl;
|
||||
$this->imdsv2SessionTokenUrl = $imdsv2SessionTokenUrl;
|
||||
}
|
||||
public function fetchSubjectToken(callable $httpHandler = null) : string
|
||||
{
|
||||
if (\is_null($httpHandler)) {
|
||||
$httpHandler = HttpHandlerFactory::build(HttpClientCache::getHttpClient());
|
||||
}
|
||||
$headers = [];
|
||||
if ($this->imdsv2SessionTokenUrl) {
|
||||
$headers = ['X-aws-ec2-metadata-token' => self::getImdsV2SessionToken($this->imdsv2SessionTokenUrl, $httpHandler)];
|
||||
}
|
||||
if (!($signingVars = self::getSigningVarsFromEnv())) {
|
||||
if (!$this->securityCredentialsUrl) {
|
||||
throw new \LogicException('Unable to get credentials from ENV, and no security credentials URL provided');
|
||||
}
|
||||
$signingVars = self::getSigningVarsFromUrl($httpHandler, $this->securityCredentialsUrl, self::getRoleName($httpHandler, $this->securityCredentialsUrl, $headers), $headers);
|
||||
}
|
||||
if (!($region = self::getRegionFromEnv())) {
|
||||
if (!$this->regionUrl) {
|
||||
throw new \LogicException('Unable to get region from ENV, and no region URL provided');
|
||||
}
|
||||
$region = self::getRegionFromUrl($httpHandler, $this->regionUrl, $headers);
|
||||
}
|
||||
$url = \str_replace('{region}', $region, $this->regionalCredVerificationUrl);
|
||||
$host = \parse_url($url)['host'] ?? '';
|
||||
// From here we use the signing vars to create the signed request to receive a token
|
||||
[$accessKeyId, $secretAccessKey, $securityToken] = $signingVars;
|
||||
$headers = self::getSignedRequestHeaders($region, $host, $accessKeyId, $secretAccessKey, $securityToken);
|
||||
// Inject x-goog-cloud-target-resource into header
|
||||
$headers['x-goog-cloud-target-resource'] = $this->audience;
|
||||
// Format headers as they're expected in the subject token
|
||||
$formattedHeaders = \array_map(fn($k, $v) => ['key' => $k, 'value' => $v], \array_keys($headers), $headers);
|
||||
$request = ['headers' => $formattedHeaders, 'method' => 'POST', 'url' => $url];
|
||||
return \urlencode(\json_encode($request) ?: '');
|
||||
}
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
public static function getImdsV2SessionToken(string $imdsV2Url, callable $httpHandler) : string
|
||||
{
|
||||
$headers = ['X-aws-ec2-metadata-token-ttl-seconds' => '21600'];
|
||||
$request = new Request('PUT', $imdsV2Url, $headers);
|
||||
$response = $httpHandler($request);
|
||||
return (string) $response->getBody();
|
||||
}
|
||||
/**
|
||||
* @see http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html
|
||||
*
|
||||
* @internal
|
||||
*
|
||||
* @return array<string, string>
|
||||
*/
|
||||
public static function getSignedRequestHeaders(string $region, string $host, string $accessKeyId, string $secretAccessKey, ?string $securityToken) : array
|
||||
{
|
||||
$service = 'sts';
|
||||
# Create a date for headers and the credential string in ISO-8601 format
|
||||
$amzdate = \gmdate('Ymd\\THis\\Z');
|
||||
$datestamp = \gmdate('Ymd');
|
||||
# Date w/o time, used in credential scope
|
||||
# Create the canonical headers and signed headers. Header names
|
||||
# must be trimmed and lowercase, and sorted in code point order from
|
||||
# low to high. Note that there is a trailing \n.
|
||||
$canonicalHeaders = \sprintf("host:%s\nx-amz-date:%s\n", $host, $amzdate);
|
||||
if ($securityToken) {
|
||||
$canonicalHeaders .= \sprintf("x-amz-security-token:%s\n", $securityToken);
|
||||
}
|
||||
# Step 5: Create the list of signed headers. This lists the headers
|
||||
# in the canonicalHeaders list, delimited with ";" and in alpha order.
|
||||
# Note: The request can include any headers; $canonicalHeaders and
|
||||
# $signedHeaders lists those that you want to be included in the
|
||||
# hash of the request. "Host" and "x-amz-date" are always required.
|
||||
$signedHeaders = 'host;x-amz-date';
|
||||
if ($securityToken) {
|
||||
$signedHeaders .= ';x-amz-security-token';
|
||||
}
|
||||
# Step 6: Create payload hash (hash of the request body content). For GET
|
||||
# requests, the payload is an empty string ("").
|
||||
$payloadHash = \hash('sha256', '');
|
||||
# Step 7: Combine elements to create canonical request
|
||||
$canonicalRequest = \implode("\n", [
|
||||
'POST',
|
||||
// method
|
||||
'/',
|
||||
// canonical URL
|
||||
self::CRED_VERIFICATION_QUERY,
|
||||
// query string
|
||||
$canonicalHeaders,
|
||||
$signedHeaders,
|
||||
$payloadHash,
|
||||
]);
|
||||
# ************* TASK 2: CREATE THE STRING TO SIGN*************
|
||||
# Match the algorithm to the hashing algorithm you use, either SHA-1 or
|
||||
# SHA-256 (recommended)
|
||||
$algorithm = 'AWS4-HMAC-SHA256';
|
||||
$scope = \implode('/', [$datestamp, $region, $service, 'aws4_request']);
|
||||
$stringToSign = \implode("\n", [$algorithm, $amzdate, $scope, \hash('sha256', $canonicalRequest)]);
|
||||
# ************* TASK 3: CALCULATE THE SIGNATURE *************
|
||||
# Create the signing key using the function defined above.
|
||||
// (done above)
|
||||
$signingKey = self::getSignatureKey($secretAccessKey, $datestamp, $region, $service);
|
||||
# Sign the string_to_sign using the signing_key
|
||||
$signature = \bin2hex(self::hmacSign($signingKey, $stringToSign));
|
||||
# ************* TASK 4: ADD SIGNING INFORMATION TO THE REQUEST *************
|
||||
# The signing information can be either in a query string value or in
|
||||
# a header named Authorization. This code shows how to use a header.
|
||||
# Create authorization header and add to request headers
|
||||
$authorizationHeader = \sprintf('%s Credential=%s/%s, SignedHeaders=%s, Signature=%s', $algorithm, $accessKeyId, $scope, $signedHeaders, $signature);
|
||||
# The request can include any headers, but MUST include "host", "x-amz-date",
|
||||
# and (for this scenario) "Authorization". "host" and "x-amz-date" must
|
||||
# be included in the canonical_headers and signed_headers, as noted
|
||||
# earlier. Order here is not significant.
|
||||
$headers = ['host' => $host, 'x-amz-date' => $amzdate, 'Authorization' => $authorizationHeader];
|
||||
if ($securityToken) {
|
||||
$headers['x-amz-security-token'] = $securityToken;
|
||||
}
|
||||
return $headers;
|
||||
}
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
public static function getRegionFromEnv() : ?string
|
||||
{
|
||||
$region = \getenv('AWS_REGION');
|
||||
if (empty($region)) {
|
||||
$region = \getenv('AWS_DEFAULT_REGION');
|
||||
}
|
||||
return $region ?: null;
|
||||
}
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* @param callable $httpHandler
|
||||
* @param string $regionUrl
|
||||
* @param array<string, string|string[]> $headers Request headers to send in with the request.
|
||||
*/
|
||||
public static function getRegionFromUrl(callable $httpHandler, string $regionUrl, array $headers) : string
|
||||
{
|
||||
// get the region/zone from the region URL
|
||||
$regionRequest = new Request('GET', $regionUrl, $headers);
|
||||
$regionResponse = $httpHandler($regionRequest);
|
||||
// Remove last character. For example, if us-east-2b is returned,
|
||||
// the region would be us-east-2.
|
||||
return \substr((string) $regionResponse->getBody(), 0, -1);
|
||||
}
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* @param callable $httpHandler
|
||||
* @param string $securityCredentialsUrl
|
||||
* @param array<string, string|string[]> $headers Request headers to send in with the request.
|
||||
*/
|
||||
public static function getRoleName(callable $httpHandler, string $securityCredentialsUrl, array $headers) : string
|
||||
{
|
||||
// Get the AWS role name
|
||||
$roleRequest = new Request('GET', $securityCredentialsUrl, $headers);
|
||||
$roleResponse = $httpHandler($roleRequest);
|
||||
$roleName = (string) $roleResponse->getBody();
|
||||
return $roleName;
|
||||
}
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* @param callable $httpHandler
|
||||
* @param string $securityCredentialsUrl
|
||||
* @param array<string, string|string[]> $headers Request headers to send in with the request.
|
||||
* @return array{string, string, ?string}
|
||||
*/
|
||||
public static function getSigningVarsFromUrl(callable $httpHandler, string $securityCredentialsUrl, string $roleName, array $headers) : array
|
||||
{
|
||||
// Get the AWS credentials
|
||||
$credsRequest = new Request('GET', $securityCredentialsUrl . '/' . $roleName, $headers);
|
||||
$credsResponse = $httpHandler($credsRequest);
|
||||
$awsCreds = \json_decode((string) $credsResponse->getBody(), \true);
|
||||
return [
|
||||
$awsCreds['AccessKeyId'],
|
||||
// accessKeyId
|
||||
$awsCreds['SecretAccessKey'],
|
||||
// secretAccessKey
|
||||
$awsCreds['Token'],
|
||||
];
|
||||
}
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* @return array{string, string, ?string}
|
||||
*/
|
||||
public static function getSigningVarsFromEnv() : ?array
|
||||
{
|
||||
$accessKeyId = \getenv('AWS_ACCESS_KEY_ID');
|
||||
$secretAccessKey = \getenv('AWS_SECRET_ACCESS_KEY');
|
||||
if ($accessKeyId && $secretAccessKey) {
|
||||
return [$accessKeyId, $secretAccessKey, \getenv('AWS_SESSION_TOKEN') ?: null];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* Return HMAC hash in binary string
|
||||
*/
|
||||
private static function hmacSign(string $key, string $msg) : string
|
||||
{
|
||||
return \hash_hmac('sha256', self::utf8Encode($msg), $key, \true);
|
||||
}
|
||||
/**
|
||||
* @TODO add a fallback when mbstring is not available
|
||||
*/
|
||||
private static function utf8Encode(string $string) : string
|
||||
{
|
||||
return \mb_convert_encoding($string, 'UTF-8', 'ISO-8859-1');
|
||||
}
|
||||
private static function getSignatureKey(string $key, string $dateStamp, string $regionName, string $serviceName) : string
|
||||
{
|
||||
$kDate = self::hmacSign(self::utf8Encode('AWS4' . $key), $dateStamp);
|
||||
$kRegion = self::hmacSign($kDate, $regionName);
|
||||
$kService = self::hmacSign($kRegion, $serviceName);
|
||||
$kSigning = self::hmacSign($kService, 'aws4_request');
|
||||
return $kSigning;
|
||||
}
|
||||
}
|
||||
60
vendor/Gcp/google/auth/src/CredentialSource/FileSource.php
vendored
Normal file
60
vendor/Gcp/google/auth/src/CredentialSource/FileSource.php
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2023 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\CredentialSource;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\ExternalAccountCredentialSourceInterface;
|
||||
use InvalidArgumentException;
|
||||
use UnexpectedValueException;
|
||||
/**
|
||||
* Retrieve a token from a file.
|
||||
*/
|
||||
class FileSource implements ExternalAccountCredentialSourceInterface
|
||||
{
|
||||
private string $file;
|
||||
private ?string $format;
|
||||
private ?string $subjectTokenFieldName;
|
||||
/**
|
||||
* @param string $file The file to read the subject token from.
|
||||
* @param string $format The format of the token in the file. Can be null or "json".
|
||||
* @param string $subjectTokenFieldName The name of the field containing the token in the file. This is required
|
||||
* when format is "json".
|
||||
*/
|
||||
public function __construct(string $file, string $format = null, string $subjectTokenFieldName = null)
|
||||
{
|
||||
$this->file = $file;
|
||||
if ($format === 'json' && \is_null($subjectTokenFieldName)) {
|
||||
throw new InvalidArgumentException('subject_token_field_name must be set when format is JSON');
|
||||
}
|
||||
$this->format = $format;
|
||||
$this->subjectTokenFieldName = $subjectTokenFieldName;
|
||||
}
|
||||
public function fetchSubjectToken(callable $httpHandler = null) : string
|
||||
{
|
||||
$contents = \file_get_contents($this->file);
|
||||
if ($this->format === 'json') {
|
||||
if (!($json = \json_decode((string) $contents, \true))) {
|
||||
throw new UnexpectedValueException('Unable to decode JSON file');
|
||||
}
|
||||
if (!isset($json[$this->subjectTokenFieldName])) {
|
||||
throw new UnexpectedValueException('subject_token_field_name not found in JSON file');
|
||||
}
|
||||
$contents = $json[$this->subjectTokenFieldName];
|
||||
}
|
||||
return $contents;
|
||||
}
|
||||
}
|
||||
74
vendor/Gcp/google/auth/src/CredentialSource/UrlSource.php
vendored
Normal file
74
vendor/Gcp/google/auth/src/CredentialSource/UrlSource.php
vendored
Normal file
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2023 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\CredentialSource;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\ExternalAccountCredentialSourceInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\HttpHandler\HttpClientCache;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\HttpHandler\HttpHandlerFactory;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\Psr7\Request;
|
||||
use InvalidArgumentException;
|
||||
use UnexpectedValueException;
|
||||
/**
|
||||
* Retrieve a token from a URL.
|
||||
*/
|
||||
class UrlSource implements ExternalAccountCredentialSourceInterface
|
||||
{
|
||||
private string $url;
|
||||
private ?string $format;
|
||||
private ?string $subjectTokenFieldName;
|
||||
/**
|
||||
* @var array<string, string|string[]>
|
||||
*/
|
||||
private ?array $headers;
|
||||
/**
|
||||
* @param string $url The URL to fetch the subject token from.
|
||||
* @param string $format The format of the token in the response. Can be null or "json".
|
||||
* @param string $subjectTokenFieldName The name of the field containing the token in the response. This is required
|
||||
* when format is "json".
|
||||
* @param array<string, string|string[]> $headers Request headers to send in with the request to the URL.
|
||||
*/
|
||||
public function __construct(string $url, string $format = null, string $subjectTokenFieldName = null, array $headers = null)
|
||||
{
|
||||
$this->url = $url;
|
||||
if ($format === 'json' && \is_null($subjectTokenFieldName)) {
|
||||
throw new InvalidArgumentException('subject_token_field_name must be set when format is JSON');
|
||||
}
|
||||
$this->format = $format;
|
||||
$this->subjectTokenFieldName = $subjectTokenFieldName;
|
||||
$this->headers = $headers;
|
||||
}
|
||||
public function fetchSubjectToken(callable $httpHandler = null) : string
|
||||
{
|
||||
if (\is_null($httpHandler)) {
|
||||
$httpHandler = HttpHandlerFactory::build(HttpClientCache::getHttpClient());
|
||||
}
|
||||
$request = new Request('GET', $this->url, $this->headers ?: []);
|
||||
$response = $httpHandler($request);
|
||||
$body = (string) $response->getBody();
|
||||
if ($this->format === 'json') {
|
||||
if (!($json = \json_decode((string) $body, \true))) {
|
||||
throw new UnexpectedValueException('Unable to decode JSON response');
|
||||
}
|
||||
if (!isset($json[$this->subjectTokenFieldName])) {
|
||||
throw new UnexpectedValueException('subject_token_field_name not found in JSON file');
|
||||
}
|
||||
$body = $json[$this->subjectTokenFieldName];
|
||||
}
|
||||
return $body;
|
||||
}
|
||||
}
|
||||
209
vendor/Gcp/google/auth/src/Credentials/AppIdentityCredentials.php
vendored
Normal file
209
vendor/Gcp/google/auth/src/Credentials/AppIdentityCredentials.php
vendored
Normal file
@@ -0,0 +1,209 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2015 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Credentials;
|
||||
|
||||
/*
|
||||
* The AppIdentityService class is automatically defined on App Engine,
|
||||
* so including this dependency is not necessary, and will result in a
|
||||
* PHP fatal error in the App Engine environment.
|
||||
*/
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\google\appengine\api\app_identity\AppIdentityService;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\CredentialsLoader;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\ProjectIdProviderInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\SignBlobInterface;
|
||||
/**
|
||||
* @deprecated
|
||||
*
|
||||
* AppIdentityCredentials supports authorization on Google App Engine.
|
||||
*
|
||||
* It can be used to authorize requests using the AuthTokenMiddleware or
|
||||
* AuthTokenSubscriber, but will only succeed if being run on App Engine:
|
||||
*
|
||||
* Example:
|
||||
* ```
|
||||
* use Google\Auth\Credentials\AppIdentityCredentials;
|
||||
* use Google\Auth\Middleware\AuthTokenMiddleware;
|
||||
* use GuzzleHttp\Client;
|
||||
* use GuzzleHttp\HandlerStack;
|
||||
*
|
||||
* $gae = new AppIdentityCredentials('https://www.googleapis.com/auth/books');
|
||||
* $middleware = new AuthTokenMiddleware($gae);
|
||||
* $stack = HandlerStack::create();
|
||||
* $stack->push($middleware);
|
||||
*
|
||||
* $client = new Client([
|
||||
* 'handler' => $stack,
|
||||
* 'base_uri' => 'https://www.googleapis.com/books/v1',
|
||||
* 'auth' => 'google_auth'
|
||||
* ]);
|
||||
*
|
||||
* $res = $client->get('volumes?q=Henry+David+Thoreau&country=US');
|
||||
* ```
|
||||
*/
|
||||
class AppIdentityCredentials extends CredentialsLoader implements SignBlobInterface, ProjectIdProviderInterface
|
||||
{
|
||||
/**
|
||||
* Result of fetchAuthToken.
|
||||
*
|
||||
* @var array<mixed>
|
||||
*/
|
||||
protected $lastReceivedToken;
|
||||
/**
|
||||
* Array of OAuth2 scopes to be requested.
|
||||
*
|
||||
* @var string[]
|
||||
*/
|
||||
private $scope;
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $clientName;
|
||||
/**
|
||||
* @param string|string[] $scope One or more scopes.
|
||||
*/
|
||||
public function __construct($scope = [])
|
||||
{
|
||||
$this->scope = \is_array($scope) ? $scope : \explode(' ', (string) $scope);
|
||||
}
|
||||
/**
|
||||
* Determines if this an App Engine instance, by accessing the
|
||||
* SERVER_SOFTWARE environment variable (prod) or the APPENGINE_RUNTIME
|
||||
* environment variable (dev).
|
||||
*
|
||||
* @return bool true if this an App Engine Instance, false otherwise
|
||||
*/
|
||||
public static function onAppEngine()
|
||||
{
|
||||
$appEngineProduction = isset($_SERVER['SERVER_SOFTWARE']) && 0 === \strpos($_SERVER['SERVER_SOFTWARE'], 'Google App Engine');
|
||||
if ($appEngineProduction) {
|
||||
return \true;
|
||||
}
|
||||
$appEngineDevAppServer = isset($_SERVER['APPENGINE_RUNTIME']) && $_SERVER['APPENGINE_RUNTIME'] == 'php';
|
||||
if ($appEngineDevAppServer) {
|
||||
return \true;
|
||||
}
|
||||
return \false;
|
||||
}
|
||||
/**
|
||||
* Implements FetchAuthTokenInterface#fetchAuthToken.
|
||||
*
|
||||
* Fetches the auth tokens using the AppIdentityService if available.
|
||||
* As the AppIdentityService uses protobufs to fetch the access token,
|
||||
* the GuzzleHttp\ClientInterface instance passed in will not be used.
|
||||
*
|
||||
* @param callable $httpHandler callback which delivers psr7 request
|
||||
* @return array<mixed> {
|
||||
* A set of auth related metadata, containing the following
|
||||
*
|
||||
* @type string $access_token
|
||||
* @type string $expiration_time
|
||||
* }
|
||||
*/
|
||||
public function fetchAuthToken(callable $httpHandler = null)
|
||||
{
|
||||
try {
|
||||
$this->checkAppEngineContext();
|
||||
} catch (\Exception $e) {
|
||||
return [];
|
||||
}
|
||||
/** @phpstan-ignore-next-line */
|
||||
$token = AppIdentityService::getAccessToken($this->scope);
|
||||
$this->lastReceivedToken = $token;
|
||||
return $token;
|
||||
}
|
||||
/**
|
||||
* Sign a string using AppIdentityService.
|
||||
*
|
||||
* @param string $stringToSign The string to sign.
|
||||
* @param bool $forceOpenSsl [optional] Does not apply to this credentials
|
||||
* type.
|
||||
* @return string The signature, base64-encoded.
|
||||
* @throws \Exception If AppEngine SDK or mock is not available.
|
||||
*/
|
||||
public function signBlob($stringToSign, $forceOpenSsl = \false)
|
||||
{
|
||||
$this->checkAppEngineContext();
|
||||
/** @phpstan-ignore-next-line */
|
||||
return \base64_encode(AppIdentityService::signForApp($stringToSign)['signature']);
|
||||
}
|
||||
/**
|
||||
* Get the project ID from AppIdentityService.
|
||||
*
|
||||
* Returns null if AppIdentityService is unavailable.
|
||||
*
|
||||
* @param callable $httpHandler Not used by this type.
|
||||
* @return string|null
|
||||
*/
|
||||
public function getProjectId(callable $httpHandler = null)
|
||||
{
|
||||
try {
|
||||
$this->checkAppEngineContext();
|
||||
} catch (\Exception $e) {
|
||||
return null;
|
||||
}
|
||||
/** @phpstan-ignore-next-line */
|
||||
return AppIdentityService::getApplicationId();
|
||||
}
|
||||
/**
|
||||
* Get the client name from AppIdentityService.
|
||||
*
|
||||
* Subsequent calls to this method will return a cached value.
|
||||
*
|
||||
* @param callable $httpHandler Not used in this implementation.
|
||||
* @return string
|
||||
* @throws \Exception If AppEngine SDK or mock is not available.
|
||||
*/
|
||||
public function getClientName(callable $httpHandler = null)
|
||||
{
|
||||
$this->checkAppEngineContext();
|
||||
if (!$this->clientName) {
|
||||
/** @phpstan-ignore-next-line */
|
||||
$this->clientName = AppIdentityService::getServiceAccountName();
|
||||
}
|
||||
return $this->clientName;
|
||||
}
|
||||
/**
|
||||
* @return array{access_token:string,expires_at:int}|null
|
||||
*/
|
||||
public function getLastReceivedToken()
|
||||
{
|
||||
if ($this->lastReceivedToken) {
|
||||
return ['access_token' => $this->lastReceivedToken['access_token'], 'expires_at' => $this->lastReceivedToken['expiration_time']];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* Caching is handled by the underlying AppIdentityService, return empty string
|
||||
* to prevent caching.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getCacheKey()
|
||||
{
|
||||
return '';
|
||||
}
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
private function checkAppEngineContext()
|
||||
{
|
||||
if (!self::onAppEngine() || !\class_exists('DeliciousBrains\\WP_Offload_Media\\Gcp\\google\\appengine\\api\\app_identity\\AppIdentityService')) {
|
||||
throw new \Exception('This class must be run in App Engine, or you must include the AppIdentityService ' . 'mock class defined in tests/mocks/AppIdentityService.php');
|
||||
}
|
||||
}
|
||||
}
|
||||
229
vendor/Gcp/google/auth/src/Credentials/ExternalAccountCredentials.php
vendored
Normal file
229
vendor/Gcp/google/auth/src/Credentials/ExternalAccountCredentials.php
vendored
Normal file
@@ -0,0 +1,229 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2023 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Credentials;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\CredentialSource\AwsNativeSource;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\CredentialSource\FileSource;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\CredentialSource\UrlSource;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\ExternalAccountCredentialSourceInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\FetchAuthTokenInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\GetQuotaProjectInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\GetUniverseDomainInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\HttpHandler\HttpClientCache;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\HttpHandler\HttpHandlerFactory;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\OAuth2;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\ProjectIdProviderInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\UpdateMetadataInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\UpdateMetadataTrait;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\Psr7\Request;
|
||||
use InvalidArgumentException;
|
||||
class ExternalAccountCredentials implements FetchAuthTokenInterface, UpdateMetadataInterface, GetQuotaProjectInterface, GetUniverseDomainInterface, ProjectIdProviderInterface
|
||||
{
|
||||
use UpdateMetadataTrait;
|
||||
private const EXTERNAL_ACCOUNT_TYPE = 'external_account';
|
||||
private const CLOUD_RESOURCE_MANAGER_URL = 'https://cloudresourcemanager.UNIVERSE_DOMAIN/v1/projects/%s';
|
||||
private OAuth2 $auth;
|
||||
private ?string $quotaProject;
|
||||
private ?string $serviceAccountImpersonationUrl;
|
||||
private ?string $workforcePoolUserProject;
|
||||
private ?string $projectId;
|
||||
private string $universeDomain;
|
||||
/**
|
||||
* @param string|string[] $scope The scope of the access request, expressed either as an array
|
||||
* or as a space-delimited string.
|
||||
* @param array<mixed> $jsonKey JSON credentials as an associative array.
|
||||
*/
|
||||
public function __construct($scope, array $jsonKey)
|
||||
{
|
||||
if (!\array_key_exists('type', $jsonKey)) {
|
||||
throw new InvalidArgumentException('json key is missing the type field');
|
||||
}
|
||||
if ($jsonKey['type'] !== self::EXTERNAL_ACCOUNT_TYPE) {
|
||||
throw new InvalidArgumentException(\sprintf('expected "%s" type but received "%s"', self::EXTERNAL_ACCOUNT_TYPE, $jsonKey['type']));
|
||||
}
|
||||
if (!\array_key_exists('token_url', $jsonKey)) {
|
||||
throw new InvalidArgumentException('json key is missing the token_url field');
|
||||
}
|
||||
if (!\array_key_exists('audience', $jsonKey)) {
|
||||
throw new InvalidArgumentException('json key is missing the audience field');
|
||||
}
|
||||
if (!\array_key_exists('subject_token_type', $jsonKey)) {
|
||||
throw new InvalidArgumentException('json key is missing the subject_token_type field');
|
||||
}
|
||||
if (!\array_key_exists('credential_source', $jsonKey)) {
|
||||
throw new InvalidArgumentException('json key is missing the credential_source field');
|
||||
}
|
||||
if (\array_key_exists('service_account_impersonation_url', $jsonKey)) {
|
||||
$this->serviceAccountImpersonationUrl = $jsonKey['service_account_impersonation_url'];
|
||||
}
|
||||
$this->quotaProject = $jsonKey['quota_project_id'] ?? null;
|
||||
$this->workforcePoolUserProject = $jsonKey['workforce_pool_user_project'] ?? null;
|
||||
$this->universeDomain = $jsonKey['universe_domain'] ?? GetUniverseDomainInterface::DEFAULT_UNIVERSE_DOMAIN;
|
||||
$this->auth = new OAuth2(['tokenCredentialUri' => $jsonKey['token_url'], 'audience' => $jsonKey['audience'], 'scope' => $scope, 'subjectTokenType' => $jsonKey['subject_token_type'], 'subjectTokenFetcher' => self::buildCredentialSource($jsonKey), 'additionalOptions' => $this->workforcePoolUserProject ? ['userProject' => $this->workforcePoolUserProject] : []]);
|
||||
if (!$this->isWorkforcePool() && $this->workforcePoolUserProject) {
|
||||
throw new InvalidArgumentException('workforce_pool_user_project should not be set for non-workforce pool credentials.');
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @param array<mixed> $jsonKey
|
||||
*/
|
||||
private static function buildCredentialSource(array $jsonKey) : ExternalAccountCredentialSourceInterface
|
||||
{
|
||||
$credentialSource = $jsonKey['credential_source'];
|
||||
if (isset($credentialSource['file'])) {
|
||||
return new FileSource($credentialSource['file'], $credentialSource['format']['type'] ?? null, $credentialSource['format']['subject_token_field_name'] ?? null);
|
||||
}
|
||||
if (isset($credentialSource['environment_id']) && 1 === \preg_match('/^aws(\\d+)$/', $credentialSource['environment_id'], $matches)) {
|
||||
if ($matches[1] !== '1') {
|
||||
throw new InvalidArgumentException("aws version \"{$matches[1]}\" is not supported in the current build.");
|
||||
}
|
||||
if (!\array_key_exists('regional_cred_verification_url', $credentialSource)) {
|
||||
throw new InvalidArgumentException('The regional_cred_verification_url field is required for aws1 credential source.');
|
||||
}
|
||||
if (!\array_key_exists('audience', $jsonKey)) {
|
||||
throw new InvalidArgumentException('aws1 credential source requires an audience to be set in the JSON file.');
|
||||
}
|
||||
return new AwsNativeSource(
|
||||
$jsonKey['audience'],
|
||||
$credentialSource['regional_cred_verification_url'],
|
||||
// $regionalCredVerificationUrl
|
||||
$credentialSource['region_url'] ?? null,
|
||||
// $regionUrl
|
||||
$credentialSource['url'] ?? null,
|
||||
// $securityCredentialsUrl
|
||||
$credentialSource['imdsv2_session_token_url'] ?? null
|
||||
);
|
||||
}
|
||||
if (isset($credentialSource['url'])) {
|
||||
return new UrlSource($credentialSource['url'], $credentialSource['format']['type'] ?? null, $credentialSource['format']['subject_token_field_name'] ?? null, $credentialSource['headers'] ?? null);
|
||||
}
|
||||
throw new InvalidArgumentException('Unable to determine credential source from json key.');
|
||||
}
|
||||
/**
|
||||
* @param string $stsToken
|
||||
* @param callable $httpHandler
|
||||
*
|
||||
* @return array<mixed> {
|
||||
* A set of auth related metadata, containing the following
|
||||
*
|
||||
* @type string $access_token
|
||||
* @type int $expires_at
|
||||
* }
|
||||
*/
|
||||
private function getImpersonatedAccessToken(string $stsToken, callable $httpHandler = null) : array
|
||||
{
|
||||
if (!isset($this->serviceAccountImpersonationUrl)) {
|
||||
throw new InvalidArgumentException('service_account_impersonation_url must be set in JSON credentials.');
|
||||
}
|
||||
$request = new Request('POST', $this->serviceAccountImpersonationUrl, ['Content-Type' => 'application/json', 'Authorization' => 'Bearer ' . $stsToken], (string) \json_encode(['lifetime' => \sprintf('%ss', OAuth2::DEFAULT_EXPIRY_SECONDS), 'scope' => \explode(' ', $this->auth->getScope())]));
|
||||
if (\is_null($httpHandler)) {
|
||||
$httpHandler = HttpHandlerFactory::build(HttpClientCache::getHttpClient());
|
||||
}
|
||||
$response = $httpHandler($request);
|
||||
$body = \json_decode((string) $response->getBody(), \true);
|
||||
return ['access_token' => $body['accessToken'], 'expires_at' => \strtotime($body['expireTime'])];
|
||||
}
|
||||
/**
|
||||
* @param callable $httpHandler
|
||||
*
|
||||
* @return array<mixed> {
|
||||
* A set of auth related metadata, containing the following
|
||||
*
|
||||
* @type string $access_token
|
||||
* @type int $expires_at (impersonated service accounts only)
|
||||
* @type int $expires_in (identity pool only)
|
||||
* @type string $issued_token_type (identity pool only)
|
||||
* @type string $token_type (identity pool only)
|
||||
* }
|
||||
*/
|
||||
public function fetchAuthToken(callable $httpHandler = null)
|
||||
{
|
||||
$stsToken = $this->auth->fetchAuthToken($httpHandler);
|
||||
if (isset($this->serviceAccountImpersonationUrl)) {
|
||||
return $this->getImpersonatedAccessToken($stsToken['access_token'], $httpHandler);
|
||||
}
|
||||
return $stsToken;
|
||||
}
|
||||
public function getCacheKey()
|
||||
{
|
||||
return $this->auth->getCacheKey();
|
||||
}
|
||||
public function getLastReceivedToken()
|
||||
{
|
||||
return $this->auth->getLastReceivedToken();
|
||||
}
|
||||
/**
|
||||
* Get the quota project used for this API request
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getQuotaProject()
|
||||
{
|
||||
return $this->quotaProject;
|
||||
}
|
||||
/**
|
||||
* Get the universe domain used for this API request
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUniverseDomain() : string
|
||||
{
|
||||
return $this->universeDomain;
|
||||
}
|
||||
/**
|
||||
* Get the project ID.
|
||||
*
|
||||
* @param callable $httpHandler Callback which delivers psr7 request
|
||||
* @param string $accessToken The access token to use to sign the blob. If
|
||||
* provided, saves a call to the metadata server for a new access
|
||||
* token. **Defaults to** `null`.
|
||||
* @return string|null
|
||||
*/
|
||||
public function getProjectId(callable $httpHandler = null, string $accessToken = null)
|
||||
{
|
||||
if (isset($this->projectId)) {
|
||||
return $this->projectId;
|
||||
}
|
||||
$projectNumber = $this->getProjectNumber() ?: $this->workforcePoolUserProject;
|
||||
if (!$projectNumber) {
|
||||
return null;
|
||||
}
|
||||
if (\is_null($httpHandler)) {
|
||||
$httpHandler = HttpHandlerFactory::build(HttpClientCache::getHttpClient());
|
||||
}
|
||||
$url = \str_replace('UNIVERSE_DOMAIN', $this->getUniverseDomain(), \sprintf(self::CLOUD_RESOURCE_MANAGER_URL, $projectNumber));
|
||||
if (\is_null($accessToken)) {
|
||||
$accessToken = $this->fetchAuthToken($httpHandler)['access_token'];
|
||||
}
|
||||
$request = new Request('GET', $url, ['authorization' => 'Bearer ' . $accessToken]);
|
||||
$response = $httpHandler($request);
|
||||
$body = \json_decode((string) $response->getBody(), \true);
|
||||
return $this->projectId = $body['projectId'];
|
||||
}
|
||||
private function getProjectNumber() : ?string
|
||||
{
|
||||
$parts = \explode('/', $this->auth->getAudience());
|
||||
$i = \array_search('projects', $parts);
|
||||
return $parts[$i + 1] ?? null;
|
||||
}
|
||||
private function isWorkforcePool() : bool
|
||||
{
|
||||
$regex = '#//iam\\.googleapis\\.com/locations/[^/]+/workforcePools/#';
|
||||
return \preg_match($regex, $this->auth->getAudience()) === 1;
|
||||
}
|
||||
}
|
||||
493
vendor/Gcp/google/auth/src/Credentials/GCECredentials.php
vendored
Normal file
493
vendor/Gcp/google/auth/src/Credentials/GCECredentials.php
vendored
Normal file
@@ -0,0 +1,493 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2015 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Credentials;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\CredentialsLoader;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\GetQuotaProjectInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\HttpHandler\HttpClientCache;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\HttpHandler\HttpHandlerFactory;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Iam;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\IamSignerTrait;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\ProjectIdProviderInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\SignBlobInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\Exception\ClientException;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\Exception\ConnectException;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\Exception\RequestException;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\Exception\ServerException;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\Psr7\Request;
|
||||
use InvalidArgumentException;
|
||||
/**
|
||||
* GCECredentials supports authorization on Google Compute Engine.
|
||||
*
|
||||
* It can be used to authorize requests using the AuthTokenMiddleware, but will
|
||||
* only succeed if being run on GCE:
|
||||
*
|
||||
* use Google\Auth\Credentials\GCECredentials;
|
||||
* use Google\Auth\Middleware\AuthTokenMiddleware;
|
||||
* use GuzzleHttp\Client;
|
||||
* use GuzzleHttp\HandlerStack;
|
||||
*
|
||||
* $gce = new GCECredentials();
|
||||
* $middleware = new AuthTokenMiddleware($gce);
|
||||
* $stack = HandlerStack::create();
|
||||
* $stack->push($middleware);
|
||||
*
|
||||
* $client = new Client([
|
||||
* 'handler' => $stack,
|
||||
* 'base_uri' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/',
|
||||
* 'auth' => 'google_auth'
|
||||
* ]);
|
||||
*
|
||||
* $res = $client->get('myproject/taskqueues/myqueue');
|
||||
*/
|
||||
class GCECredentials extends CredentialsLoader implements SignBlobInterface, ProjectIdProviderInterface, GetQuotaProjectInterface
|
||||
{
|
||||
use IamSignerTrait;
|
||||
// phpcs:disable
|
||||
const cacheKey = 'GOOGLE_AUTH_PHP_GCE';
|
||||
// phpcs:enable
|
||||
/**
|
||||
* The metadata IP address on appengine instances.
|
||||
*
|
||||
* The IP is used instead of the domain 'metadata' to avoid slow responses
|
||||
* when not on Compute Engine.
|
||||
*/
|
||||
const METADATA_IP = '169.254.169.254';
|
||||
/**
|
||||
* The metadata path of the default token.
|
||||
*/
|
||||
const TOKEN_URI_PATH = 'v1/instance/service-accounts/default/token';
|
||||
/**
|
||||
* The metadata path of the default id token.
|
||||
*/
|
||||
const ID_TOKEN_URI_PATH = 'v1/instance/service-accounts/default/identity';
|
||||
/**
|
||||
* The metadata path of the client ID.
|
||||
*/
|
||||
const CLIENT_ID_URI_PATH = 'v1/instance/service-accounts/default/email';
|
||||
/**
|
||||
* The metadata path of the project ID.
|
||||
*/
|
||||
const PROJECT_ID_URI_PATH = 'v1/project/project-id';
|
||||
/**
|
||||
* The metadata path of the project ID.
|
||||
*/
|
||||
const UNIVERSE_DOMAIN_URI_PATH = 'v1/universe/universe_domain';
|
||||
/**
|
||||
* The header whose presence indicates GCE presence.
|
||||
*/
|
||||
const FLAVOR_HEADER = 'Metadata-Flavor';
|
||||
/**
|
||||
* The Linux file which contains the product name.
|
||||
*/
|
||||
private const GKE_PRODUCT_NAME_FILE = '/sys/class/dmi/id/product_name';
|
||||
/**
|
||||
* Note: the explicit `timeout` and `tries` below is a workaround. The underlying
|
||||
* issue is that resolving an unknown host on some networks will take
|
||||
* 20-30 seconds; making this timeout short fixes the issue, but
|
||||
* could lead to false negatives in the event that we are on GCE, but
|
||||
* the metadata resolution was particularly slow. The latter case is
|
||||
* "unlikely" since the expected 4-nines time is about 0.5 seconds.
|
||||
* This allows us to limit the total ping maximum timeout to 1.5 seconds
|
||||
* for developer desktop scenarios.
|
||||
*/
|
||||
const MAX_COMPUTE_PING_TRIES = 3;
|
||||
const COMPUTE_PING_CONNECTION_TIMEOUT_S = 0.5;
|
||||
/**
|
||||
* Flag used to ensure that the onGCE test is only done once;.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
private $hasCheckedOnGce = \false;
|
||||
/**
|
||||
* Flag that stores the value of the onGCE check.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
private $isOnGce = \false;
|
||||
/**
|
||||
* Result of fetchAuthToken.
|
||||
*
|
||||
* @var array<mixed>
|
||||
*/
|
||||
protected $lastReceivedToken;
|
||||
/**
|
||||
* @var string|null
|
||||
*/
|
||||
private $clientName;
|
||||
/**
|
||||
* @var string|null
|
||||
*/
|
||||
private $projectId;
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $tokenUri;
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $targetAudience;
|
||||
/**
|
||||
* @var string|null
|
||||
*/
|
||||
private $quotaProject;
|
||||
/**
|
||||
* @var string|null
|
||||
*/
|
||||
private $serviceAccountIdentity;
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private ?string $universeDomain;
|
||||
/**
|
||||
* @param Iam $iam [optional] An IAM instance.
|
||||
* @param string|string[] $scope [optional] the scope of the access request,
|
||||
* expressed either as an array or as a space-delimited string.
|
||||
* @param string $targetAudience [optional] The audience for the ID token.
|
||||
* @param string $quotaProject [optional] Specifies a project to bill for access
|
||||
* charges associated with the request.
|
||||
* @param string $serviceAccountIdentity [optional] Specify a service
|
||||
* account identity name to use instead of "default".
|
||||
* @param string $universeDomain [optional] Specify a universe domain to use
|
||||
* instead of fetching one from the metadata server.
|
||||
*/
|
||||
public function __construct(Iam $iam = null, $scope = null, $targetAudience = null, $quotaProject = null, $serviceAccountIdentity = null, string $universeDomain = null)
|
||||
{
|
||||
$this->iam = $iam;
|
||||
if ($scope && $targetAudience) {
|
||||
throw new InvalidArgumentException('Scope and targetAudience cannot both be supplied');
|
||||
}
|
||||
$tokenUri = self::getTokenUri($serviceAccountIdentity);
|
||||
if ($scope) {
|
||||
if (\is_string($scope)) {
|
||||
$scope = \explode(' ', $scope);
|
||||
}
|
||||
$scope = \implode(',', $scope);
|
||||
$tokenUri = $tokenUri . '?scopes=' . $scope;
|
||||
} elseif ($targetAudience) {
|
||||
$tokenUri = self::getIdTokenUri($serviceAccountIdentity);
|
||||
$tokenUri = $tokenUri . '?audience=' . $targetAudience;
|
||||
$this->targetAudience = $targetAudience;
|
||||
}
|
||||
$this->tokenUri = $tokenUri;
|
||||
$this->quotaProject = $quotaProject;
|
||||
$this->serviceAccountIdentity = $serviceAccountIdentity;
|
||||
$this->universeDomain = $universeDomain;
|
||||
}
|
||||
/**
|
||||
* The full uri for accessing the default token.
|
||||
*
|
||||
* @param string $serviceAccountIdentity [optional] Specify a service
|
||||
* account identity name to use instead of "default".
|
||||
* @return string
|
||||
*/
|
||||
public static function getTokenUri($serviceAccountIdentity = null)
|
||||
{
|
||||
$base = 'http://' . self::METADATA_IP . '/computeMetadata/';
|
||||
$base .= self::TOKEN_URI_PATH;
|
||||
if ($serviceAccountIdentity) {
|
||||
return \str_replace('/default/', '/' . $serviceAccountIdentity . '/', $base);
|
||||
}
|
||||
return $base;
|
||||
}
|
||||
/**
|
||||
* The full uri for accessing the default service account.
|
||||
*
|
||||
* @param string $serviceAccountIdentity [optional] Specify a service
|
||||
* account identity name to use instead of "default".
|
||||
* @return string
|
||||
*/
|
||||
public static function getClientNameUri($serviceAccountIdentity = null)
|
||||
{
|
||||
$base = 'http://' . self::METADATA_IP . '/computeMetadata/';
|
||||
$base .= self::CLIENT_ID_URI_PATH;
|
||||
if ($serviceAccountIdentity) {
|
||||
return \str_replace('/default/', '/' . $serviceAccountIdentity . '/', $base);
|
||||
}
|
||||
return $base;
|
||||
}
|
||||
/**
|
||||
* The full uri for accesesing the default identity token.
|
||||
*
|
||||
* @param string $serviceAccountIdentity [optional] Specify a service
|
||||
* account identity name to use instead of "default".
|
||||
* @return string
|
||||
*/
|
||||
private static function getIdTokenUri($serviceAccountIdentity = null)
|
||||
{
|
||||
$base = 'http://' . self::METADATA_IP . '/computeMetadata/';
|
||||
$base .= self::ID_TOKEN_URI_PATH;
|
||||
if ($serviceAccountIdentity) {
|
||||
return \str_replace('/default/', '/' . $serviceAccountIdentity . '/', $base);
|
||||
}
|
||||
return $base;
|
||||
}
|
||||
/**
|
||||
* The full uri for accessing the default project ID.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private static function getProjectIdUri()
|
||||
{
|
||||
$base = 'http://' . self::METADATA_IP . '/computeMetadata/';
|
||||
return $base . self::PROJECT_ID_URI_PATH;
|
||||
}
|
||||
/**
|
||||
* The full uri for accessing the default universe domain.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private static function getUniverseDomainUri()
|
||||
{
|
||||
$base = 'http://' . self::METADATA_IP . '/computeMetadata/';
|
||||
return $base . self::UNIVERSE_DOMAIN_URI_PATH;
|
||||
}
|
||||
/**
|
||||
* Determines if this an App Engine Flexible instance, by accessing the
|
||||
* GAE_INSTANCE environment variable.
|
||||
*
|
||||
* @return bool true if this an App Engine Flexible Instance, false otherwise
|
||||
*/
|
||||
public static function onAppEngineFlexible()
|
||||
{
|
||||
return \substr((string) \getenv('GAE_INSTANCE'), 0, 4) === 'aef-';
|
||||
}
|
||||
/**
|
||||
* Determines if this a GCE instance, by accessing the expected metadata
|
||||
* host.
|
||||
* If $httpHandler is not specified a the default HttpHandler is used.
|
||||
*
|
||||
* @param callable $httpHandler callback which delivers psr7 request
|
||||
* @return bool True if this a GCEInstance, false otherwise
|
||||
*/
|
||||
public static function onGce(callable $httpHandler = null)
|
||||
{
|
||||
$httpHandler = $httpHandler ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient());
|
||||
$checkUri = 'http://' . self::METADATA_IP;
|
||||
for ($i = 1; $i <= self::MAX_COMPUTE_PING_TRIES; $i++) {
|
||||
try {
|
||||
// Comment from: oauth2client/client.py
|
||||
//
|
||||
// Note: the explicit `timeout` below is a workaround. The underlying
|
||||
// issue is that resolving an unknown host on some networks will take
|
||||
// 20-30 seconds; making this timeout short fixes the issue, but
|
||||
// could lead to false negatives in the event that we are on GCE, but
|
||||
// the metadata resolution was particularly slow. The latter case is
|
||||
// "unlikely".
|
||||
$resp = $httpHandler(new Request('GET', $checkUri, [self::FLAVOR_HEADER => 'Google']), ['timeout' => self::COMPUTE_PING_CONNECTION_TIMEOUT_S]);
|
||||
return $resp->getHeaderLine(self::FLAVOR_HEADER) == 'Google';
|
||||
} catch (ClientException $e) {
|
||||
} catch (ServerException $e) {
|
||||
} catch (RequestException $e) {
|
||||
} catch (ConnectException $e) {
|
||||
}
|
||||
}
|
||||
if (\PHP_OS === 'Windows') {
|
||||
// @TODO: implement GCE residency detection on Windows
|
||||
return \false;
|
||||
}
|
||||
// Detect GCE residency on Linux
|
||||
return self::detectResidencyLinux(self::GKE_PRODUCT_NAME_FILE);
|
||||
}
|
||||
private static function detectResidencyLinux(string $productNameFile) : bool
|
||||
{
|
||||
if (\file_exists($productNameFile)) {
|
||||
$productName = \trim((string) \file_get_contents($productNameFile));
|
||||
return 0 === \strpos($productName, 'Google');
|
||||
}
|
||||
return \false;
|
||||
}
|
||||
/**
|
||||
* Implements FetchAuthTokenInterface#fetchAuthToken.
|
||||
*
|
||||
* Fetches the auth tokens from the GCE metadata host if it is available.
|
||||
* If $httpHandler is not specified a the default HttpHandler is used.
|
||||
*
|
||||
* @param callable $httpHandler callback which delivers psr7 request
|
||||
*
|
||||
* @return array<mixed> {
|
||||
* A set of auth related metadata, based on the token type.
|
||||
*
|
||||
* @type string $access_token for access tokens
|
||||
* @type int $expires_in for access tokens
|
||||
* @type string $token_type for access tokens
|
||||
* @type string $id_token for ID tokens
|
||||
* }
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function fetchAuthToken(callable $httpHandler = null)
|
||||
{
|
||||
$httpHandler = $httpHandler ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient());
|
||||
if (!$this->hasCheckedOnGce) {
|
||||
$this->isOnGce = self::onGce($httpHandler);
|
||||
$this->hasCheckedOnGce = \true;
|
||||
}
|
||||
if (!$this->isOnGce) {
|
||||
return [];
|
||||
// return an empty array with no access token
|
||||
}
|
||||
$response = $this->getFromMetadata($httpHandler, $this->tokenUri);
|
||||
if ($this->targetAudience) {
|
||||
return $this->lastReceivedToken = ['id_token' => $response];
|
||||
}
|
||||
if (null === ($json = \json_decode($response, \true))) {
|
||||
throw new \Exception('Invalid JSON response');
|
||||
}
|
||||
$json['expires_at'] = \time() + $json['expires_in'];
|
||||
// store this so we can retrieve it later
|
||||
$this->lastReceivedToken = $json;
|
||||
return $json;
|
||||
}
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getCacheKey()
|
||||
{
|
||||
return self::cacheKey;
|
||||
}
|
||||
/**
|
||||
* @return array<mixed>|null
|
||||
*/
|
||||
public function getLastReceivedToken()
|
||||
{
|
||||
if ($this->lastReceivedToken) {
|
||||
if (\array_key_exists('id_token', $this->lastReceivedToken)) {
|
||||
return $this->lastReceivedToken;
|
||||
}
|
||||
return ['access_token' => $this->lastReceivedToken['access_token'], 'expires_at' => $this->lastReceivedToken['expires_at']];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* Get the client name from GCE metadata.
|
||||
*
|
||||
* Subsequent calls will return a cached value.
|
||||
*
|
||||
* @param callable $httpHandler callback which delivers psr7 request
|
||||
* @return string
|
||||
*/
|
||||
public function getClientName(callable $httpHandler = null)
|
||||
{
|
||||
if ($this->clientName) {
|
||||
return $this->clientName;
|
||||
}
|
||||
$httpHandler = $httpHandler ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient());
|
||||
if (!$this->hasCheckedOnGce) {
|
||||
$this->isOnGce = self::onGce($httpHandler);
|
||||
$this->hasCheckedOnGce = \true;
|
||||
}
|
||||
if (!$this->isOnGce) {
|
||||
return '';
|
||||
}
|
||||
$this->clientName = $this->getFromMetadata($httpHandler, self::getClientNameUri($this->serviceAccountIdentity));
|
||||
return $this->clientName;
|
||||
}
|
||||
/**
|
||||
* Fetch the default Project ID from compute engine.
|
||||
*
|
||||
* Returns null if called outside GCE.
|
||||
*
|
||||
* @param callable $httpHandler Callback which delivers psr7 request
|
||||
* @return string|null
|
||||
*/
|
||||
public function getProjectId(callable $httpHandler = null)
|
||||
{
|
||||
if ($this->projectId) {
|
||||
return $this->projectId;
|
||||
}
|
||||
$httpHandler = $httpHandler ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient());
|
||||
if (!$this->hasCheckedOnGce) {
|
||||
$this->isOnGce = self::onGce($httpHandler);
|
||||
$this->hasCheckedOnGce = \true;
|
||||
}
|
||||
if (!$this->isOnGce) {
|
||||
return null;
|
||||
}
|
||||
$this->projectId = $this->getFromMetadata($httpHandler, self::getProjectIdUri());
|
||||
return $this->projectId;
|
||||
}
|
||||
/**
|
||||
* Fetch the default universe domain from the metadata server.
|
||||
*
|
||||
* @param callable $httpHandler Callback which delivers psr7 request
|
||||
* @return string
|
||||
*/
|
||||
public function getUniverseDomain(callable $httpHandler = null) : string
|
||||
{
|
||||
if (null !== $this->universeDomain) {
|
||||
return $this->universeDomain;
|
||||
}
|
||||
$httpHandler = $httpHandler ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient());
|
||||
if (!$this->hasCheckedOnGce) {
|
||||
$this->isOnGce = self::onGce($httpHandler);
|
||||
$this->hasCheckedOnGce = \true;
|
||||
}
|
||||
try {
|
||||
$this->universeDomain = $this->getFromMetadata($httpHandler, self::getUniverseDomainUri());
|
||||
} catch (ClientException $e) {
|
||||
// If the metadata server exists, but returns a 404 for the universe domain, the auth
|
||||
// libraries should safely assume this is an older metadata server running in GCU, and
|
||||
// should return the default universe domain.
|
||||
if (!$e->hasResponse() || 404 != $e->getResponse()->getStatusCode()) {
|
||||
throw $e;
|
||||
}
|
||||
$this->universeDomain = self::DEFAULT_UNIVERSE_DOMAIN;
|
||||
}
|
||||
// We expect in some cases the metadata server will return an empty string for the universe
|
||||
// domain. In this case, the auth library MUST return the default universe domain.
|
||||
if ('' === $this->universeDomain) {
|
||||
$this->universeDomain = self::DEFAULT_UNIVERSE_DOMAIN;
|
||||
}
|
||||
return $this->universeDomain;
|
||||
}
|
||||
/**
|
||||
* Fetch the value of a GCE metadata server URI.
|
||||
*
|
||||
* @param callable $httpHandler An HTTP Handler to deliver PSR7 requests.
|
||||
* @param string $uri The metadata URI.
|
||||
* @return string
|
||||
*/
|
||||
private function getFromMetadata(callable $httpHandler, $uri)
|
||||
{
|
||||
$resp = $httpHandler(new Request('GET', $uri, [self::FLAVOR_HEADER => 'Google']));
|
||||
return (string) $resp->getBody();
|
||||
}
|
||||
/**
|
||||
* Get the quota project used for this API request
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getQuotaProject()
|
||||
{
|
||||
return $this->quotaProject;
|
||||
}
|
||||
/**
|
||||
* Set whether or not we've already checked the GCE environment.
|
||||
*
|
||||
* @param bool $isOnGce
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setIsOnGce($isOnGce)
|
||||
{
|
||||
// Implicitly set hasCheckedGce to true
|
||||
$this->hasCheckedOnGce = \true;
|
||||
// Set isOnGce
|
||||
$this->isOnGce = $isOnGce;
|
||||
}
|
||||
}
|
||||
77
vendor/Gcp/google/auth/src/Credentials/IAMCredentials.php
vendored
Normal file
77
vendor/Gcp/google/auth/src/Credentials/IAMCredentials.php
vendored
Normal file
@@ -0,0 +1,77 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2015 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Credentials;
|
||||
|
||||
/**
|
||||
* Authenticates requests using IAM credentials.
|
||||
*/
|
||||
class IAMCredentials
|
||||
{
|
||||
const SELECTOR_KEY = 'x-goog-iam-authority-selector';
|
||||
const TOKEN_KEY = 'x-goog-iam-authorization-token';
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $selector;
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $token;
|
||||
/**
|
||||
* @param string $selector the IAM selector
|
||||
* @param string $token the IAM token
|
||||
*/
|
||||
public function __construct($selector, $token)
|
||||
{
|
||||
if (!\is_string($selector)) {
|
||||
throw new \InvalidArgumentException('selector must be a string');
|
||||
}
|
||||
if (!\is_string($token)) {
|
||||
throw new \InvalidArgumentException('token must be a string');
|
||||
}
|
||||
$this->selector = $selector;
|
||||
$this->token = $token;
|
||||
}
|
||||
/**
|
||||
* export a callback function which updates runtime metadata.
|
||||
*
|
||||
* @return callable updateMetadata function
|
||||
*/
|
||||
public function getUpdateMetadataFunc()
|
||||
{
|
||||
return [$this, 'updateMetadata'];
|
||||
}
|
||||
/**
|
||||
* Updates metadata with the appropriate header metadata.
|
||||
*
|
||||
* @param array<mixed> $metadata metadata hashmap
|
||||
* @param string $unusedAuthUri optional auth uri
|
||||
* @param callable $httpHandler callback which delivers psr7 request
|
||||
* Note: this param is unused here, only included here for
|
||||
* consistency with other credentials class
|
||||
*
|
||||
* @return array<mixed> updated metadata hashmap
|
||||
*/
|
||||
public function updateMetadata($metadata, $unusedAuthUri = null, callable $httpHandler = null)
|
||||
{
|
||||
$metadata_copy = $metadata;
|
||||
$metadata_copy[self::SELECTOR_KEY] = $this->selector;
|
||||
$metadata_copy[self::TOKEN_KEY] = $this->token;
|
||||
return $metadata_copy;
|
||||
}
|
||||
}
|
||||
120
vendor/Gcp/google/auth/src/Credentials/ImpersonatedServiceAccountCredentials.php
vendored
Normal file
120
vendor/Gcp/google/auth/src/Credentials/ImpersonatedServiceAccountCredentials.php
vendored
Normal file
@@ -0,0 +1,120 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2022 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Credentials;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\CredentialsLoader;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\IamSignerTrait;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\SignBlobInterface;
|
||||
class ImpersonatedServiceAccountCredentials extends CredentialsLoader implements SignBlobInterface
|
||||
{
|
||||
use IamSignerTrait;
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $impersonatedServiceAccountName;
|
||||
/**
|
||||
* @var UserRefreshCredentials
|
||||
*/
|
||||
protected $sourceCredentials;
|
||||
/**
|
||||
* Instantiate an instance of ImpersonatedServiceAccountCredentials from a credentials file that
|
||||
* has be created with the --impersonated-service-account flag.
|
||||
*
|
||||
* @param string|string[] $scope The scope of the access request, expressed either as an
|
||||
* array or as a space-delimited string.
|
||||
* @param string|array<mixed> $jsonKey JSON credential file path or JSON credentials
|
||||
* as an associative array.
|
||||
*/
|
||||
public function __construct($scope, $jsonKey)
|
||||
{
|
||||
if (\is_string($jsonKey)) {
|
||||
if (!\file_exists($jsonKey)) {
|
||||
throw new \InvalidArgumentException('file does not exist');
|
||||
}
|
||||
$json = \file_get_contents($jsonKey);
|
||||
if (!($jsonKey = \json_decode((string) $json, \true))) {
|
||||
throw new \LogicException('invalid json for auth config');
|
||||
}
|
||||
}
|
||||
if (!\array_key_exists('service_account_impersonation_url', $jsonKey)) {
|
||||
throw new \LogicException('json key is missing the service_account_impersonation_url field');
|
||||
}
|
||||
if (!\array_key_exists('source_credentials', $jsonKey)) {
|
||||
throw new \LogicException('json key is missing the source_credentials field');
|
||||
}
|
||||
$this->impersonatedServiceAccountName = $this->getImpersonatedServiceAccountNameFromUrl($jsonKey['service_account_impersonation_url']);
|
||||
$this->sourceCredentials = new UserRefreshCredentials($scope, $jsonKey['source_credentials']);
|
||||
}
|
||||
/**
|
||||
* Helper function for extracting the Server Account Name from the URL saved in the account
|
||||
* credentials file.
|
||||
*
|
||||
* @param $serviceAccountImpersonationUrl string URL from "service_account_impersonation_url"
|
||||
* @return string Service account email or ID.
|
||||
*/
|
||||
private function getImpersonatedServiceAccountNameFromUrl(string $serviceAccountImpersonationUrl) : string
|
||||
{
|
||||
$fields = \explode('/', $serviceAccountImpersonationUrl);
|
||||
$lastField = \end($fields);
|
||||
$splitter = \explode(':', $lastField);
|
||||
return $splitter[0];
|
||||
}
|
||||
/**
|
||||
* Get the client name from the keyfile
|
||||
*
|
||||
* In this implementation, it will return the issuers email from the oauth token.
|
||||
*
|
||||
* @param callable|null $unusedHttpHandler not used by this credentials type.
|
||||
* @return string Token issuer email
|
||||
*/
|
||||
public function getClientName(callable $unusedHttpHandler = null)
|
||||
{
|
||||
return $this->impersonatedServiceAccountName;
|
||||
}
|
||||
/**
|
||||
* @param callable $httpHandler
|
||||
*
|
||||
* @return array<mixed> {
|
||||
* A set of auth related metadata, containing the following
|
||||
*
|
||||
* @type string $access_token
|
||||
* @type int $expires_in
|
||||
* @type string $scope
|
||||
* @type string $token_type
|
||||
* @type string $id_token
|
||||
* }
|
||||
*/
|
||||
public function fetchAuthToken(callable $httpHandler = null)
|
||||
{
|
||||
return $this->sourceCredentials->fetchAuthToken($httpHandler);
|
||||
}
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getCacheKey()
|
||||
{
|
||||
return $this->sourceCredentials->getCacheKey();
|
||||
}
|
||||
/**
|
||||
* @return array<mixed>
|
||||
*/
|
||||
public function getLastReceivedToken()
|
||||
{
|
||||
return $this->sourceCredentials->getLastReceivedToken();
|
||||
}
|
||||
}
|
||||
62
vendor/Gcp/google/auth/src/Credentials/InsecureCredentials.php
vendored
Normal file
62
vendor/Gcp/google/auth/src/Credentials/InsecureCredentials.php
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2018 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Credentials;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\FetchAuthTokenInterface;
|
||||
/**
|
||||
* Provides a set of credentials that will always return an empty access token.
|
||||
* This is useful for APIs which do not require authentication, for local
|
||||
* service emulators, and for testing.
|
||||
*/
|
||||
class InsecureCredentials implements FetchAuthTokenInterface
|
||||
{
|
||||
/**
|
||||
* @var array{access_token:string}
|
||||
*/
|
||||
private $token = ['access_token' => ''];
|
||||
/**
|
||||
* Fetches the auth token. In this case it returns an empty string.
|
||||
*
|
||||
* @param callable $httpHandler
|
||||
* @return array{access_token:string} A set of auth related metadata
|
||||
*/
|
||||
public function fetchAuthToken(callable $httpHandler = null)
|
||||
{
|
||||
return $this->token;
|
||||
}
|
||||
/**
|
||||
* Returns the cache key. In this case it returns a null value, disabling
|
||||
* caching.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getCacheKey()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* Fetches the last received token. In this case, it returns the same empty string
|
||||
* auth token.
|
||||
*
|
||||
* @return array{access_token:string}
|
||||
*/
|
||||
public function getLastReceivedToken()
|
||||
{
|
||||
return $this->token;
|
||||
}
|
||||
}
|
||||
312
vendor/Gcp/google/auth/src/Credentials/ServiceAccountCredentials.php
vendored
Normal file
312
vendor/Gcp/google/auth/src/Credentials/ServiceAccountCredentials.php
vendored
Normal file
@@ -0,0 +1,312 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2015 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Credentials;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\CredentialsLoader;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\GetQuotaProjectInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\OAuth2;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\ProjectIdProviderInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\ServiceAccountSignerTrait;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\SignBlobInterface;
|
||||
use InvalidArgumentException;
|
||||
/**
|
||||
* ServiceAccountCredentials supports authorization using a Google service
|
||||
* account.
|
||||
*
|
||||
* (cf https://developers.google.com/accounts/docs/OAuth2ServiceAccount)
|
||||
*
|
||||
* It's initialized using the json key file that's downloadable from developer
|
||||
* console, which should contain a private_key and client_email fields that it
|
||||
* uses.
|
||||
*
|
||||
* Use it with AuthTokenMiddleware to authorize http requests:
|
||||
*
|
||||
* use Google\Auth\Credentials\ServiceAccountCredentials;
|
||||
* use Google\Auth\Middleware\AuthTokenMiddleware;
|
||||
* use GuzzleHttp\Client;
|
||||
* use GuzzleHttp\HandlerStack;
|
||||
*
|
||||
* $sa = new ServiceAccountCredentials(
|
||||
* 'https://www.googleapis.com/auth/taskqueue',
|
||||
* '/path/to/your/json/key_file.json'
|
||||
* );
|
||||
* $middleware = new AuthTokenMiddleware($sa);
|
||||
* $stack = HandlerStack::create();
|
||||
* $stack->push($middleware);
|
||||
*
|
||||
* $client = new Client([
|
||||
* 'handler' => $stack,
|
||||
* 'base_uri' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/',
|
||||
* 'auth' => 'google_auth' // authorize all requests
|
||||
* ]);
|
||||
*
|
||||
* $res = $client->get('myproject/taskqueues/myqueue');
|
||||
*/
|
||||
class ServiceAccountCredentials extends CredentialsLoader implements GetQuotaProjectInterface, SignBlobInterface, ProjectIdProviderInterface
|
||||
{
|
||||
use ServiceAccountSignerTrait;
|
||||
/**
|
||||
* The OAuth2 instance used to conduct authorization.
|
||||
*
|
||||
* @var OAuth2
|
||||
*/
|
||||
protected $auth;
|
||||
/**
|
||||
* The quota project associated with the JSON credentials
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $quotaProject;
|
||||
/**
|
||||
* @var string|null
|
||||
*/
|
||||
protected $projectId;
|
||||
/**
|
||||
* @var array<mixed>|null
|
||||
*/
|
||||
private $lastReceivedJwtAccessToken;
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $useJwtAccessWithScope = \false;
|
||||
/**
|
||||
* @var ServiceAccountJwtAccessCredentials|null
|
||||
*/
|
||||
private $jwtAccessCredentials;
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private string $universeDomain;
|
||||
/**
|
||||
* Create a new ServiceAccountCredentials.
|
||||
*
|
||||
* @param string|string[]|null $scope the scope of the access request, expressed
|
||||
* either as an Array or as a space-delimited String.
|
||||
* @param string|array<mixed> $jsonKey JSON credential file path or JSON credentials
|
||||
* as an associative array
|
||||
* @param string $sub an email address account to impersonate, in situations when
|
||||
* the service account has been delegated domain wide access.
|
||||
* @param string $targetAudience The audience for the ID token.
|
||||
*/
|
||||
public function __construct($scope, $jsonKey, $sub = null, $targetAudience = null)
|
||||
{
|
||||
if (\is_string($jsonKey)) {
|
||||
if (!\file_exists($jsonKey)) {
|
||||
throw new \InvalidArgumentException('file does not exist');
|
||||
}
|
||||
$jsonKeyStream = \file_get_contents($jsonKey);
|
||||
if (!($jsonKey = \json_decode((string) $jsonKeyStream, \true))) {
|
||||
throw new \LogicException('invalid json for auth config');
|
||||
}
|
||||
}
|
||||
if (!\array_key_exists('client_email', $jsonKey)) {
|
||||
throw new \InvalidArgumentException('json key is missing the client_email field');
|
||||
}
|
||||
if (!\array_key_exists('private_key', $jsonKey)) {
|
||||
throw new \InvalidArgumentException('json key is missing the private_key field');
|
||||
}
|
||||
if (\array_key_exists('quota_project_id', $jsonKey)) {
|
||||
$this->quotaProject = (string) $jsonKey['quota_project_id'];
|
||||
}
|
||||
if ($scope && $targetAudience) {
|
||||
throw new InvalidArgumentException('Scope and targetAudience cannot both be supplied');
|
||||
}
|
||||
$additionalClaims = [];
|
||||
if ($targetAudience) {
|
||||
$additionalClaims = ['target_audience' => $targetAudience];
|
||||
}
|
||||
$this->auth = new OAuth2(['audience' => self::TOKEN_CREDENTIAL_URI, 'issuer' => $jsonKey['client_email'], 'scope' => $scope, 'signingAlgorithm' => 'RS256', 'signingKey' => $jsonKey['private_key'], 'sub' => $sub, 'tokenCredentialUri' => self::TOKEN_CREDENTIAL_URI, 'additionalClaims' => $additionalClaims]);
|
||||
$this->projectId = $jsonKey['project_id'] ?? null;
|
||||
$this->universeDomain = $jsonKey['universe_domain'] ?? self::DEFAULT_UNIVERSE_DOMAIN;
|
||||
}
|
||||
/**
|
||||
* When called, the ServiceAccountCredentials will use an instance of
|
||||
* ServiceAccountJwtAccessCredentials to fetch (self-sign) an access token
|
||||
* even when only scopes are supplied. Otherwise,
|
||||
* ServiceAccountJwtAccessCredentials is only called when no scopes and an
|
||||
* authUrl (audience) is suppled.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function useJwtAccessWithScope()
|
||||
{
|
||||
$this->useJwtAccessWithScope = \true;
|
||||
}
|
||||
/**
|
||||
* @param callable $httpHandler
|
||||
*
|
||||
* @return array<mixed> {
|
||||
* A set of auth related metadata, containing the following
|
||||
*
|
||||
* @type string $access_token
|
||||
* @type int $expires_in
|
||||
* @type string $token_type
|
||||
* }
|
||||
*/
|
||||
public function fetchAuthToken(callable $httpHandler = null)
|
||||
{
|
||||
if ($this->useSelfSignedJwt()) {
|
||||
$jwtCreds = $this->createJwtAccessCredentials();
|
||||
$accessToken = $jwtCreds->fetchAuthToken($httpHandler);
|
||||
if ($lastReceivedToken = $jwtCreds->getLastReceivedToken()) {
|
||||
// Keep self-signed JWTs in memory as the last received token
|
||||
$this->lastReceivedJwtAccessToken = $lastReceivedToken;
|
||||
}
|
||||
return $accessToken;
|
||||
}
|
||||
return $this->auth->fetchAuthToken($httpHandler);
|
||||
}
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getCacheKey()
|
||||
{
|
||||
$key = $this->auth->getIssuer() . ':' . $this->auth->getCacheKey();
|
||||
if ($sub = $this->auth->getSub()) {
|
||||
$key .= ':' . $sub;
|
||||
}
|
||||
return $key;
|
||||
}
|
||||
/**
|
||||
* @return array<mixed>
|
||||
*/
|
||||
public function getLastReceivedToken()
|
||||
{
|
||||
// If self-signed JWTs are being used, fetch the last received token
|
||||
// from memory. Else, fetch it from OAuth2
|
||||
return $this->useSelfSignedJwt() ? $this->lastReceivedJwtAccessToken : $this->auth->getLastReceivedToken();
|
||||
}
|
||||
/**
|
||||
* Get the project ID from the service account keyfile.
|
||||
*
|
||||
* Returns null if the project ID does not exist in the keyfile.
|
||||
*
|
||||
* @param callable $httpHandler Not used by this credentials type.
|
||||
* @return string|null
|
||||
*/
|
||||
public function getProjectId(callable $httpHandler = null)
|
||||
{
|
||||
return $this->projectId;
|
||||
}
|
||||
/**
|
||||
* Updates metadata with the authorization token.
|
||||
*
|
||||
* @param array<mixed> $metadata metadata hashmap
|
||||
* @param string $authUri optional auth uri
|
||||
* @param callable $httpHandler callback which delivers psr7 request
|
||||
* @return array<mixed> updated metadata hashmap
|
||||
*/
|
||||
public function updateMetadata($metadata, $authUri = null, callable $httpHandler = null)
|
||||
{
|
||||
// scope exists. use oauth implementation
|
||||
if (!$this->useSelfSignedJwt()) {
|
||||
return parent::updateMetadata($metadata, $authUri, $httpHandler);
|
||||
}
|
||||
$jwtCreds = $this->createJwtAccessCredentials();
|
||||
if ($this->auth->getScope()) {
|
||||
// Prefer user-provided "scope" to "audience"
|
||||
$updatedMetadata = $jwtCreds->updateMetadata($metadata, null, $httpHandler);
|
||||
} else {
|
||||
$updatedMetadata = $jwtCreds->updateMetadata($metadata, $authUri, $httpHandler);
|
||||
}
|
||||
if ($lastReceivedToken = $jwtCreds->getLastReceivedToken()) {
|
||||
// Keep self-signed JWTs in memory as the last received token
|
||||
$this->lastReceivedJwtAccessToken = $lastReceivedToken;
|
||||
}
|
||||
return $updatedMetadata;
|
||||
}
|
||||
/**
|
||||
* @return ServiceAccountJwtAccessCredentials
|
||||
*/
|
||||
private function createJwtAccessCredentials()
|
||||
{
|
||||
if (!$this->jwtAccessCredentials) {
|
||||
// Create credentials for self-signing a JWT (JwtAccess)
|
||||
$credJson = ['private_key' => $this->auth->getSigningKey(), 'client_email' => $this->auth->getIssuer()];
|
||||
$this->jwtAccessCredentials = new ServiceAccountJwtAccessCredentials($credJson, $this->auth->getScope());
|
||||
}
|
||||
return $this->jwtAccessCredentials;
|
||||
}
|
||||
/**
|
||||
* @param string $sub an email address account to impersonate, in situations when
|
||||
* the service account has been delegated domain wide access.
|
||||
* @return void
|
||||
*/
|
||||
public function setSub($sub)
|
||||
{
|
||||
$this->auth->setSub($sub);
|
||||
}
|
||||
/**
|
||||
* Get the client name from the keyfile.
|
||||
*
|
||||
* In this case, it returns the keyfile's client_email key.
|
||||
*
|
||||
* @param callable $httpHandler Not used by this credentials type.
|
||||
* @return string
|
||||
*/
|
||||
public function getClientName(callable $httpHandler = null)
|
||||
{
|
||||
return $this->auth->getIssuer();
|
||||
}
|
||||
/**
|
||||
* Get the quota project used for this API request
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getQuotaProject()
|
||||
{
|
||||
return $this->quotaProject;
|
||||
}
|
||||
/**
|
||||
* Get the universe domain configured in the JSON credential.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUniverseDomain() : string
|
||||
{
|
||||
return $this->universeDomain;
|
||||
}
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
private function useSelfSignedJwt()
|
||||
{
|
||||
// When a sub is supplied, the user is using domain-wide delegation, which not available
|
||||
// with self-signed JWTs
|
||||
if (null !== $this->auth->getSub()) {
|
||||
// If we are outside the GDU, we can't use domain-wide delegation
|
||||
if ($this->getUniverseDomain() !== self::DEFAULT_UNIVERSE_DOMAIN) {
|
||||
throw new \LogicException(\sprintf('Service Account subject is configured for the credential. Domain-wide ' . 'delegation is not supported in universes other than %s.', self::DEFAULT_UNIVERSE_DOMAIN));
|
||||
}
|
||||
return \false;
|
||||
}
|
||||
// If claims are set, this call is for "id_tokens"
|
||||
if ($this->auth->getAdditionalClaims()) {
|
||||
return \false;
|
||||
}
|
||||
// When true, ServiceAccountCredentials will always use JwtAccess for access tokens
|
||||
if ($this->useJwtAccessWithScope) {
|
||||
return \true;
|
||||
}
|
||||
// If the universe domain is outside the GDU, use JwtAccess for access tokens
|
||||
if ($this->getUniverseDomain() !== self::DEFAULT_UNIVERSE_DOMAIN) {
|
||||
return \true;
|
||||
}
|
||||
return \is_null($this->auth->getScope());
|
||||
}
|
||||
}
|
||||
171
vendor/Gcp/google/auth/src/Credentials/ServiceAccountJwtAccessCredentials.php
vendored
Normal file
171
vendor/Gcp/google/auth/src/Credentials/ServiceAccountJwtAccessCredentials.php
vendored
Normal file
@@ -0,0 +1,171 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2015 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Credentials;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\CredentialsLoader;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\GetQuotaProjectInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\OAuth2;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\ProjectIdProviderInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\ServiceAccountSignerTrait;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\SignBlobInterface;
|
||||
/**
|
||||
* Authenticates requests using Google's Service Account credentials via
|
||||
* JWT Access.
|
||||
*
|
||||
* This class allows authorizing requests for service accounts directly
|
||||
* from credentials from a json key file downloaded from the developer
|
||||
* console (via 'Generate new Json Key'). It is not part of any OAuth2
|
||||
* flow, rather it creates a JWT and sends that as a credential.
|
||||
*/
|
||||
class ServiceAccountJwtAccessCredentials extends CredentialsLoader implements GetQuotaProjectInterface, SignBlobInterface, ProjectIdProviderInterface
|
||||
{
|
||||
use ServiceAccountSignerTrait;
|
||||
/**
|
||||
* The OAuth2 instance used to conduct authorization.
|
||||
*
|
||||
* @var OAuth2
|
||||
*/
|
||||
protected $auth;
|
||||
/**
|
||||
* The quota project associated with the JSON credentials
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $quotaProject;
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $projectId;
|
||||
/**
|
||||
* Create a new ServiceAccountJwtAccessCredentials.
|
||||
*
|
||||
* @param string|array<mixed> $jsonKey JSON credential file path or JSON credentials
|
||||
* as an associative array
|
||||
* @param string|string[] $scope the scope of the access request, expressed
|
||||
* either as an Array or as a space-delimited String.
|
||||
*/
|
||||
public function __construct($jsonKey, $scope = null)
|
||||
{
|
||||
if (\is_string($jsonKey)) {
|
||||
if (!\file_exists($jsonKey)) {
|
||||
throw new \InvalidArgumentException('file does not exist');
|
||||
}
|
||||
$jsonKeyStream = \file_get_contents($jsonKey);
|
||||
if (!($jsonKey = \json_decode((string) $jsonKeyStream, \true))) {
|
||||
throw new \LogicException('invalid json for auth config');
|
||||
}
|
||||
}
|
||||
if (!\array_key_exists('client_email', $jsonKey)) {
|
||||
throw new \InvalidArgumentException('json key is missing the client_email field');
|
||||
}
|
||||
if (!\array_key_exists('private_key', $jsonKey)) {
|
||||
throw new \InvalidArgumentException('json key is missing the private_key field');
|
||||
}
|
||||
if (\array_key_exists('quota_project_id', $jsonKey)) {
|
||||
$this->quotaProject = (string) $jsonKey['quota_project_id'];
|
||||
}
|
||||
$this->auth = new OAuth2(['issuer' => $jsonKey['client_email'], 'sub' => $jsonKey['client_email'], 'signingAlgorithm' => 'RS256', 'signingKey' => $jsonKey['private_key'], 'scope' => $scope]);
|
||||
$this->projectId = $jsonKey['project_id'] ?? null;
|
||||
}
|
||||
/**
|
||||
* Updates metadata with the authorization token.
|
||||
*
|
||||
* @param array<mixed> $metadata metadata hashmap
|
||||
* @param string $authUri optional auth uri
|
||||
* @param callable $httpHandler callback which delivers psr7 request
|
||||
* @return array<mixed> updated metadata hashmap
|
||||
*/
|
||||
public function updateMetadata($metadata, $authUri = null, callable $httpHandler = null)
|
||||
{
|
||||
$scope = $this->auth->getScope();
|
||||
if (empty($authUri) && empty($scope)) {
|
||||
return $metadata;
|
||||
}
|
||||
$this->auth->setAudience($authUri);
|
||||
return parent::updateMetadata($metadata, $authUri, $httpHandler);
|
||||
}
|
||||
/**
|
||||
* Implements FetchAuthTokenInterface#fetchAuthToken.
|
||||
*
|
||||
* @param callable $httpHandler
|
||||
*
|
||||
* @return null|array{access_token:string} A set of auth related metadata
|
||||
*/
|
||||
public function fetchAuthToken(callable $httpHandler = null)
|
||||
{
|
||||
$audience = $this->auth->getAudience();
|
||||
$scope = $this->auth->getScope();
|
||||
if (empty($audience) && empty($scope)) {
|
||||
return null;
|
||||
}
|
||||
if (!empty($audience) && !empty($scope)) {
|
||||
throw new \UnexpectedValueException('Cannot sign both audience and scope in JwtAccess');
|
||||
}
|
||||
$access_token = $this->auth->toJwt();
|
||||
// Set the self-signed access token in OAuth2 for getLastReceivedToken
|
||||
$this->auth->setAccessToken($access_token);
|
||||
return ['access_token' => $access_token, 'expires_in' => $this->auth->getExpiry(), 'token_type' => 'Bearer'];
|
||||
}
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getCacheKey()
|
||||
{
|
||||
return $this->auth->getCacheKey();
|
||||
}
|
||||
/**
|
||||
* @return array<mixed>
|
||||
*/
|
||||
public function getLastReceivedToken()
|
||||
{
|
||||
return $this->auth->getLastReceivedToken();
|
||||
}
|
||||
/**
|
||||
* Get the project ID from the service account keyfile.
|
||||
*
|
||||
* Returns null if the project ID does not exist in the keyfile.
|
||||
*
|
||||
* @param callable $httpHandler Not used by this credentials type.
|
||||
* @return string|null
|
||||
*/
|
||||
public function getProjectId(callable $httpHandler = null)
|
||||
{
|
||||
return $this->projectId;
|
||||
}
|
||||
/**
|
||||
* Get the client name from the keyfile.
|
||||
*
|
||||
* In this case, it returns the keyfile's client_email key.
|
||||
*
|
||||
* @param callable $httpHandler Not used by this credentials type.
|
||||
* @return string
|
||||
*/
|
||||
public function getClientName(callable $httpHandler = null)
|
||||
{
|
||||
return $this->auth->getIssuer();
|
||||
}
|
||||
/**
|
||||
* Get the quota project used for this API request
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getQuotaProject()
|
||||
{
|
||||
return $this->quotaProject;
|
||||
}
|
||||
}
|
||||
130
vendor/Gcp/google/auth/src/Credentials/UserRefreshCredentials.php
vendored
Normal file
130
vendor/Gcp/google/auth/src/Credentials/UserRefreshCredentials.php
vendored
Normal file
@@ -0,0 +1,130 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2015 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Credentials;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\CredentialsLoader;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\GetQuotaProjectInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\OAuth2;
|
||||
/**
|
||||
* Authenticates requests using User Refresh credentials.
|
||||
*
|
||||
* This class allows authorizing requests from user refresh tokens.
|
||||
*
|
||||
* This the end of the result of a 3LO flow. E.g, the end result of
|
||||
* 'gcloud auth login' saves a file with these contents in well known
|
||||
* location
|
||||
*
|
||||
* @see [Application Default Credentials](http://goo.gl/mkAHpZ)
|
||||
*/
|
||||
class UserRefreshCredentials extends CredentialsLoader implements GetQuotaProjectInterface
|
||||
{
|
||||
/**
|
||||
* The OAuth2 instance used to conduct authorization.
|
||||
*
|
||||
* @var OAuth2
|
||||
*/
|
||||
protected $auth;
|
||||
/**
|
||||
* The quota project associated with the JSON credentials
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $quotaProject;
|
||||
/**
|
||||
* Create a new UserRefreshCredentials.
|
||||
*
|
||||
* @param string|string[] $scope the scope of the access request, expressed
|
||||
* either as an Array or as a space-delimited String.
|
||||
* @param string|array<mixed> $jsonKey JSON credential file path or JSON credentials
|
||||
* as an associative array
|
||||
*/
|
||||
public function __construct($scope, $jsonKey)
|
||||
{
|
||||
if (\is_string($jsonKey)) {
|
||||
if (!\file_exists($jsonKey)) {
|
||||
throw new \InvalidArgumentException('file does not exist');
|
||||
}
|
||||
$json = \file_get_contents($jsonKey);
|
||||
if (!($jsonKey = \json_decode((string) $json, \true))) {
|
||||
throw new \LogicException('invalid json for auth config');
|
||||
}
|
||||
}
|
||||
if (!\array_key_exists('client_id', $jsonKey)) {
|
||||
throw new \InvalidArgumentException('json key is missing the client_id field');
|
||||
}
|
||||
if (!\array_key_exists('client_secret', $jsonKey)) {
|
||||
throw new \InvalidArgumentException('json key is missing the client_secret field');
|
||||
}
|
||||
if (!\array_key_exists('refresh_token', $jsonKey)) {
|
||||
throw new \InvalidArgumentException('json key is missing the refresh_token field');
|
||||
}
|
||||
$this->auth = new OAuth2(['clientId' => $jsonKey['client_id'], 'clientSecret' => $jsonKey['client_secret'], 'refresh_token' => $jsonKey['refresh_token'], 'scope' => $scope, 'tokenCredentialUri' => self::TOKEN_CREDENTIAL_URI]);
|
||||
if (\array_key_exists('quota_project_id', $jsonKey)) {
|
||||
$this->quotaProject = (string) $jsonKey['quota_project_id'];
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @param callable $httpHandler
|
||||
*
|
||||
* @return array<mixed> {
|
||||
* A set of auth related metadata, containing the following
|
||||
*
|
||||
* @type string $access_token
|
||||
* @type int $expires_in
|
||||
* @type string $scope
|
||||
* @type string $token_type
|
||||
* @type string $id_token
|
||||
* }
|
||||
*/
|
||||
public function fetchAuthToken(callable $httpHandler = null)
|
||||
{
|
||||
return $this->auth->fetchAuthToken($httpHandler);
|
||||
}
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getCacheKey()
|
||||
{
|
||||
return $this->auth->getClientId() . ':' . $this->auth->getCacheKey();
|
||||
}
|
||||
/**
|
||||
* @return array<mixed>
|
||||
*/
|
||||
public function getLastReceivedToken()
|
||||
{
|
||||
return $this->auth->getLastReceivedToken();
|
||||
}
|
||||
/**
|
||||
* Get the quota project used for this API request
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getQuotaProject()
|
||||
{
|
||||
return $this->quotaProject;
|
||||
}
|
||||
/**
|
||||
* Get the granted scopes (if they exist) for the last fetched token.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getGrantedScope()
|
||||
{
|
||||
return $this->auth->getGrantedScope();
|
||||
}
|
||||
}
|
||||
242
vendor/Gcp/google/auth/src/CredentialsLoader.php
vendored
Normal file
242
vendor/Gcp/google/auth/src/CredentialsLoader.php
vendored
Normal file
@@ -0,0 +1,242 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2015 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Credentials\ExternalAccountCredentials;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Credentials\ImpersonatedServiceAccountCredentials;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Credentials\InsecureCredentials;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Credentials\ServiceAccountCredentials;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Credentials\UserRefreshCredentials;
|
||||
use RuntimeException;
|
||||
use UnexpectedValueException;
|
||||
/**
|
||||
* CredentialsLoader contains the behaviour used to locate and find default
|
||||
* credentials files on the file system.
|
||||
*/
|
||||
abstract class CredentialsLoader implements GetUniverseDomainInterface, FetchAuthTokenInterface, UpdateMetadataInterface
|
||||
{
|
||||
use UpdateMetadataTrait;
|
||||
const TOKEN_CREDENTIAL_URI = 'https://oauth2.googleapis.com/token';
|
||||
const ENV_VAR = 'GOOGLE_APPLICATION_CREDENTIALS';
|
||||
const QUOTA_PROJECT_ENV_VAR = 'GOOGLE_CLOUD_QUOTA_PROJECT';
|
||||
const WELL_KNOWN_PATH = 'gcloud/application_default_credentials.json';
|
||||
const NON_WINDOWS_WELL_KNOWN_PATH_BASE = '.config';
|
||||
const MTLS_WELL_KNOWN_PATH = '.secureConnect/context_aware_metadata.json';
|
||||
const MTLS_CERT_ENV_VAR = 'GOOGLE_API_USE_CLIENT_CERTIFICATE';
|
||||
/**
|
||||
* @param string $cause
|
||||
* @return string
|
||||
*/
|
||||
private static function unableToReadEnv($cause)
|
||||
{
|
||||
$msg = 'Unable to read the credential file specified by ';
|
||||
$msg .= ' GOOGLE_APPLICATION_CREDENTIALS: ';
|
||||
$msg .= $cause;
|
||||
return $msg;
|
||||
}
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
private static function isOnWindows()
|
||||
{
|
||||
return \strtoupper(\substr(\PHP_OS, 0, 3)) === 'WIN';
|
||||
}
|
||||
/**
|
||||
* Load a JSON key from the path specified in the environment.
|
||||
*
|
||||
* Load a JSON key from the path specified in the environment
|
||||
* variable GOOGLE_APPLICATION_CREDENTIALS. Return null if
|
||||
* GOOGLE_APPLICATION_CREDENTIALS is not specified.
|
||||
*
|
||||
* @return array<mixed>|null JSON key | null
|
||||
*/
|
||||
public static function fromEnv()
|
||||
{
|
||||
$path = \getenv(self::ENV_VAR);
|
||||
if (empty($path)) {
|
||||
return null;
|
||||
}
|
||||
if (!\file_exists($path)) {
|
||||
$cause = 'file ' . $path . ' does not exist';
|
||||
throw new \DomainException(self::unableToReadEnv($cause));
|
||||
}
|
||||
$jsonKey = \file_get_contents($path);
|
||||
return \json_decode((string) $jsonKey, \true);
|
||||
}
|
||||
/**
|
||||
* Load a JSON key from a well known path.
|
||||
*
|
||||
* The well known path is OS dependent:
|
||||
*
|
||||
* * windows: %APPDATA%/gcloud/application_default_credentials.json
|
||||
* * others: $HOME/.config/gcloud/application_default_credentials.json
|
||||
*
|
||||
* If the file does not exist, this returns null.
|
||||
*
|
||||
* @return array<mixed>|null JSON key | null
|
||||
*/
|
||||
public static function fromWellKnownFile()
|
||||
{
|
||||
$rootEnv = self::isOnWindows() ? 'APPDATA' : 'HOME';
|
||||
$path = [\getenv($rootEnv)];
|
||||
if (!self::isOnWindows()) {
|
||||
$path[] = self::NON_WINDOWS_WELL_KNOWN_PATH_BASE;
|
||||
}
|
||||
$path[] = self::WELL_KNOWN_PATH;
|
||||
$path = \implode(\DIRECTORY_SEPARATOR, $path);
|
||||
if (!\file_exists($path)) {
|
||||
return null;
|
||||
}
|
||||
$jsonKey = \file_get_contents($path);
|
||||
return \json_decode((string) $jsonKey, \true);
|
||||
}
|
||||
/**
|
||||
* Create a new Credentials instance.
|
||||
*
|
||||
* @param string|string[] $scope the scope of the access request, expressed
|
||||
* either as an Array or as a space-delimited String.
|
||||
* @param array<mixed> $jsonKey the JSON credentials.
|
||||
* @param string|string[] $defaultScope The default scope to use if no
|
||||
* user-defined scopes exist, expressed either as an Array or as a
|
||||
* space-delimited string.
|
||||
*
|
||||
* @return ServiceAccountCredentials|UserRefreshCredentials|ImpersonatedServiceAccountCredentials|ExternalAccountCredentials
|
||||
*/
|
||||
public static function makeCredentials($scope, array $jsonKey, $defaultScope = null)
|
||||
{
|
||||
if (!\array_key_exists('type', $jsonKey)) {
|
||||
throw new \InvalidArgumentException('json key is missing the type field');
|
||||
}
|
||||
if ($jsonKey['type'] == 'service_account') {
|
||||
// Do not pass $defaultScope to ServiceAccountCredentials
|
||||
return new ServiceAccountCredentials($scope, $jsonKey);
|
||||
}
|
||||
if ($jsonKey['type'] == 'authorized_user') {
|
||||
$anyScope = $scope ?: $defaultScope;
|
||||
return new UserRefreshCredentials($anyScope, $jsonKey);
|
||||
}
|
||||
if ($jsonKey['type'] == 'impersonated_service_account') {
|
||||
$anyScope = $scope ?: $defaultScope;
|
||||
return new ImpersonatedServiceAccountCredentials($anyScope, $jsonKey);
|
||||
}
|
||||
if ($jsonKey['type'] == 'external_account') {
|
||||
$anyScope = $scope ?: $defaultScope;
|
||||
return new ExternalAccountCredentials($anyScope, $jsonKey);
|
||||
}
|
||||
throw new \InvalidArgumentException('invalid value in the type field');
|
||||
}
|
||||
/**
|
||||
* Create an authorized HTTP Client from an instance of FetchAuthTokenInterface.
|
||||
*
|
||||
* @param FetchAuthTokenInterface $fetcher is used to fetch the auth token
|
||||
* @param array<mixed> $httpClientOptions (optional) Array of request options to apply.
|
||||
* @param callable $httpHandler (optional) http client to fetch the token.
|
||||
* @param callable $tokenCallback (optional) function to be called when a new token is fetched.
|
||||
* @return \GuzzleHttp\Client
|
||||
*/
|
||||
public static function makeHttpClient(FetchAuthTokenInterface $fetcher, array $httpClientOptions = [], callable $httpHandler = null, callable $tokenCallback = null)
|
||||
{
|
||||
$middleware = new Middleware\AuthTokenMiddleware($fetcher, $httpHandler, $tokenCallback);
|
||||
$stack = \DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\HandlerStack::create();
|
||||
$stack->push($middleware);
|
||||
return new \DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\Client(['handler' => $stack, 'auth' => 'google_auth'] + $httpClientOptions);
|
||||
}
|
||||
/**
|
||||
* Create a new instance of InsecureCredentials.
|
||||
*
|
||||
* @return InsecureCredentials
|
||||
*/
|
||||
public static function makeInsecureCredentials()
|
||||
{
|
||||
return new InsecureCredentials();
|
||||
}
|
||||
/**
|
||||
* Fetch a quota project from the environment variable
|
||||
* GOOGLE_CLOUD_QUOTA_PROJECT. Return null if
|
||||
* GOOGLE_CLOUD_QUOTA_PROJECT is not specified.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public static function quotaProjectFromEnv()
|
||||
{
|
||||
return \getenv(self::QUOTA_PROJECT_ENV_VAR) ?: null;
|
||||
}
|
||||
/**
|
||||
* Gets a callable which returns the default device certification.
|
||||
*
|
||||
* @throws UnexpectedValueException
|
||||
* @return callable|null
|
||||
*/
|
||||
public static function getDefaultClientCertSource()
|
||||
{
|
||||
if (!($clientCertSourceJson = self::loadDefaultClientCertSourceFile())) {
|
||||
return null;
|
||||
}
|
||||
$clientCertSourceCmd = $clientCertSourceJson['cert_provider_command'];
|
||||
return function () use($clientCertSourceCmd) {
|
||||
$cmd = \array_map('escapeshellarg', $clientCertSourceCmd);
|
||||
\exec(\implode(' ', $cmd), $output, $returnVar);
|
||||
if (0 === $returnVar) {
|
||||
return \implode(\PHP_EOL, $output);
|
||||
}
|
||||
throw new RuntimeException('"cert_provider_command" failed with a nonzero exit code');
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Determines whether or not the default device certificate should be loaded.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function shouldLoadClientCertSource()
|
||||
{
|
||||
return \filter_var(\getenv(self::MTLS_CERT_ENV_VAR), \FILTER_VALIDATE_BOOLEAN);
|
||||
}
|
||||
/**
|
||||
* @return array{cert_provider_command:string[]}|null
|
||||
*/
|
||||
private static function loadDefaultClientCertSourceFile()
|
||||
{
|
||||
$rootEnv = self::isOnWindows() ? 'APPDATA' : 'HOME';
|
||||
$path = \sprintf('%s/%s', \getenv($rootEnv), self::MTLS_WELL_KNOWN_PATH);
|
||||
if (!\file_exists($path)) {
|
||||
return null;
|
||||
}
|
||||
$jsonKey = \file_get_contents($path);
|
||||
$clientCertSourceJson = \json_decode((string) $jsonKey, \true);
|
||||
if (!$clientCertSourceJson) {
|
||||
throw new UnexpectedValueException('Invalid client cert source JSON');
|
||||
}
|
||||
if (!isset($clientCertSourceJson['cert_provider_command'])) {
|
||||
throw new UnexpectedValueException('cert source requires "cert_provider_command"');
|
||||
}
|
||||
if (!\is_array($clientCertSourceJson['cert_provider_command'])) {
|
||||
throw new UnexpectedValueException('cert source expects "cert_provider_command" to be an array');
|
||||
}
|
||||
return $clientCertSourceJson;
|
||||
}
|
||||
/**
|
||||
* Get the universe domain from the credential. Defaults to "googleapis.com"
|
||||
* for all credential types which do not support universe domain.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUniverseDomain() : string
|
||||
{
|
||||
return self::DEFAULT_UNIVERSE_DOMAIN;
|
||||
}
|
||||
}
|
||||
23
vendor/Gcp/google/auth/src/ExternalAccountCredentialSourceInterface.php
vendored
Normal file
23
vendor/Gcp/google/auth/src/ExternalAccountCredentialSourceInterface.php
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2023 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth;
|
||||
|
||||
interface ExternalAccountCredentialSourceInterface
|
||||
{
|
||||
public function fetchSubjectToken(callable $httpHandler = null) : string;
|
||||
}
|
||||
261
vendor/Gcp/google/auth/src/FetchAuthTokenCache.php
vendored
Normal file
261
vendor/Gcp/google/auth/src/FetchAuthTokenCache.php
vendored
Normal file
@@ -0,0 +1,261 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2010 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Psr\Cache\CacheItemPoolInterface;
|
||||
/**
|
||||
* A class to implement caching for any object implementing
|
||||
* FetchAuthTokenInterface
|
||||
*/
|
||||
class FetchAuthTokenCache implements FetchAuthTokenInterface, GetQuotaProjectInterface, GetUniverseDomainInterface, SignBlobInterface, ProjectIdProviderInterface, UpdateMetadataInterface
|
||||
{
|
||||
use CacheTrait;
|
||||
/**
|
||||
* @var FetchAuthTokenInterface
|
||||
*/
|
||||
private $fetcher;
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $eagerRefreshThresholdSeconds = 10;
|
||||
/**
|
||||
* @param FetchAuthTokenInterface $fetcher A credentials fetcher
|
||||
* @param array<mixed> $cacheConfig Configuration for the cache
|
||||
* @param CacheItemPoolInterface $cache
|
||||
*/
|
||||
public function __construct(FetchAuthTokenInterface $fetcher, array $cacheConfig = null, CacheItemPoolInterface $cache)
|
||||
{
|
||||
$this->fetcher = $fetcher;
|
||||
$this->cache = $cache;
|
||||
$this->cacheConfig = \array_merge(['lifetime' => 1500, 'prefix' => '', 'cacheUniverseDomain' => $fetcher instanceof Credentials\GCECredentials], (array) $cacheConfig);
|
||||
}
|
||||
/**
|
||||
* @return FetchAuthTokenInterface
|
||||
*/
|
||||
public function getFetcher()
|
||||
{
|
||||
return $this->fetcher;
|
||||
}
|
||||
/**
|
||||
* Implements FetchAuthTokenInterface#fetchAuthToken.
|
||||
*
|
||||
* Checks the cache for a valid auth token and fetches the auth tokens
|
||||
* from the supplied fetcher.
|
||||
*
|
||||
* @param callable $httpHandler callback which delivers psr7 request
|
||||
* @return array<mixed> the response
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function fetchAuthToken(callable $httpHandler = null)
|
||||
{
|
||||
if ($cached = $this->fetchAuthTokenFromCache()) {
|
||||
return $cached;
|
||||
}
|
||||
$auth_token = $this->fetcher->fetchAuthToken($httpHandler);
|
||||
$this->saveAuthTokenInCache($auth_token);
|
||||
return $auth_token;
|
||||
}
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getCacheKey()
|
||||
{
|
||||
return $this->getFullCacheKey($this->fetcher->getCacheKey());
|
||||
}
|
||||
/**
|
||||
* @return array<mixed>|null
|
||||
*/
|
||||
public function getLastReceivedToken()
|
||||
{
|
||||
return $this->fetcher->getLastReceivedToken();
|
||||
}
|
||||
/**
|
||||
* Get the client name from the fetcher.
|
||||
*
|
||||
* @param callable $httpHandler An HTTP handler to deliver PSR7 requests.
|
||||
* @return string
|
||||
*/
|
||||
public function getClientName(callable $httpHandler = null)
|
||||
{
|
||||
if (!$this->fetcher instanceof SignBlobInterface) {
|
||||
throw new \RuntimeException('Credentials fetcher does not implement ' . 'DeliciousBrains\\WP_Offload_Media\\Gcp\\Google\\Auth\\SignBlobInterface');
|
||||
}
|
||||
return $this->fetcher->getClientName($httpHandler);
|
||||
}
|
||||
/**
|
||||
* Sign a blob using the fetcher.
|
||||
*
|
||||
* @param string $stringToSign The string to sign.
|
||||
* @param bool $forceOpenSsl Require use of OpenSSL for local signing. Does
|
||||
* not apply to signing done using external services. **Defaults to**
|
||||
* `false`.
|
||||
* @return string The resulting signature.
|
||||
* @throws \RuntimeException If the fetcher does not implement
|
||||
* `Google\Auth\SignBlobInterface`.
|
||||
*/
|
||||
public function signBlob($stringToSign, $forceOpenSsl = \false)
|
||||
{
|
||||
if (!$this->fetcher instanceof SignBlobInterface) {
|
||||
throw new \RuntimeException('Credentials fetcher does not implement ' . 'DeliciousBrains\\WP_Offload_Media\\Gcp\\Google\\Auth\\SignBlobInterface');
|
||||
}
|
||||
// Pass the access token from cache for credentials that sign blobs
|
||||
// using the IAM API. This saves a call to fetch an access token when a
|
||||
// cached token exists.
|
||||
if ($this->fetcher instanceof Credentials\GCECredentials || $this->fetcher instanceof Credentials\ImpersonatedServiceAccountCredentials) {
|
||||
$cached = $this->fetchAuthTokenFromCache();
|
||||
$accessToken = $cached['access_token'] ?? null;
|
||||
return $this->fetcher->signBlob($stringToSign, $forceOpenSsl, $accessToken);
|
||||
}
|
||||
return $this->fetcher->signBlob($stringToSign, $forceOpenSsl);
|
||||
}
|
||||
/**
|
||||
* Get the quota project used for this API request from the credentials
|
||||
* fetcher.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getQuotaProject()
|
||||
{
|
||||
if ($this->fetcher instanceof GetQuotaProjectInterface) {
|
||||
return $this->fetcher->getQuotaProject();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/*
|
||||
* Get the Project ID from the fetcher.
|
||||
*
|
||||
* @param callable $httpHandler Callback which delivers psr7 request
|
||||
* @return string|null
|
||||
* @throws \RuntimeException If the fetcher does not implement
|
||||
* `Google\Auth\ProvidesProjectIdInterface`.
|
||||
*/
|
||||
public function getProjectId(callable $httpHandler = null)
|
||||
{
|
||||
if (!$this->fetcher instanceof ProjectIdProviderInterface) {
|
||||
throw new \RuntimeException('Credentials fetcher does not implement ' . 'DeliciousBrains\\WP_Offload_Media\\Gcp\\Google\\Auth\\ProvidesProjectIdInterface');
|
||||
}
|
||||
// Pass the access token from cache for credentials that require an
|
||||
// access token to fetch the project ID. This saves a call to fetch an
|
||||
// access token when a cached token exists.
|
||||
if ($this->fetcher instanceof Credentials\ExternalAccountCredentials) {
|
||||
$cached = $this->fetchAuthTokenFromCache();
|
||||
$accessToken = $cached['access_token'] ?? null;
|
||||
return $this->fetcher->getProjectId($httpHandler, $accessToken);
|
||||
}
|
||||
return $this->fetcher->getProjectId($httpHandler);
|
||||
}
|
||||
/*
|
||||
* Get the Universe Domain from the fetcher.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUniverseDomain() : string
|
||||
{
|
||||
if ($this->fetcher instanceof GetUniverseDomainInterface) {
|
||||
if ($this->cacheConfig['cacheUniverseDomain']) {
|
||||
return $this->getCachedUniverseDomain($this->fetcher);
|
||||
}
|
||||
return $this->fetcher->getUniverseDomain();
|
||||
}
|
||||
return GetUniverseDomainInterface::DEFAULT_UNIVERSE_DOMAIN;
|
||||
}
|
||||
/**
|
||||
* Updates metadata with the authorization token.
|
||||
*
|
||||
* @param array<mixed> $metadata metadata hashmap
|
||||
* @param string $authUri optional auth uri
|
||||
* @param callable $httpHandler callback which delivers psr7 request
|
||||
* @return array<mixed> updated metadata hashmap
|
||||
* @throws \RuntimeException If the fetcher does not implement
|
||||
* `Google\Auth\UpdateMetadataInterface`.
|
||||
*/
|
||||
public function updateMetadata($metadata, $authUri = null, callable $httpHandler = null)
|
||||
{
|
||||
if (!$this->fetcher instanceof UpdateMetadataInterface) {
|
||||
throw new \RuntimeException('Credentials fetcher does not implement ' . 'DeliciousBrains\\WP_Offload_Media\\Gcp\\Google\\Auth\\UpdateMetadataInterface');
|
||||
}
|
||||
$cached = $this->fetchAuthTokenFromCache($authUri);
|
||||
if ($cached) {
|
||||
// Set the access token in the `Authorization` metadata header so
|
||||
// the downstream call to updateMetadata know they don't need to
|
||||
// fetch another token.
|
||||
if (isset($cached['access_token'])) {
|
||||
$metadata[self::AUTH_METADATA_KEY] = ['Bearer ' . $cached['access_token']];
|
||||
} elseif (isset($cached['id_token'])) {
|
||||
$metadata[self::AUTH_METADATA_KEY] = ['Bearer ' . $cached['id_token']];
|
||||
}
|
||||
}
|
||||
$newMetadata = $this->fetcher->updateMetadata($metadata, $authUri, $httpHandler);
|
||||
if (!$cached && ($token = $this->fetcher->getLastReceivedToken())) {
|
||||
$this->saveAuthTokenInCache($token, $authUri);
|
||||
}
|
||||
return $newMetadata;
|
||||
}
|
||||
/**
|
||||
* @param string|null $authUri
|
||||
* @return array<mixed>|null
|
||||
*/
|
||||
private function fetchAuthTokenFromCache($authUri = null)
|
||||
{
|
||||
// Use the cached value if its available.
|
||||
//
|
||||
// TODO: correct caching; update the call to setCachedValue to set the expiry
|
||||
// to the value returned with the auth token.
|
||||
//
|
||||
// TODO: correct caching; enable the cache to be cleared.
|
||||
// if $authUri is set, use it as the cache key
|
||||
$cacheKey = $authUri ? $this->getFullCacheKey($authUri) : $this->fetcher->getCacheKey();
|
||||
$cached = $this->getCachedValue($cacheKey);
|
||||
if (\is_array($cached)) {
|
||||
if (empty($cached['expires_at'])) {
|
||||
// If there is no expiration data, assume token is not expired.
|
||||
// (for JwtAccess and ID tokens)
|
||||
return $cached;
|
||||
}
|
||||
if (\time() + $this->eagerRefreshThresholdSeconds < $cached['expires_at']) {
|
||||
// access token is not expired
|
||||
return $cached;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* @param array<mixed> $authToken
|
||||
* @param string|null $authUri
|
||||
* @return void
|
||||
*/
|
||||
private function saveAuthTokenInCache($authToken, $authUri = null)
|
||||
{
|
||||
if (isset($authToken['access_token']) || isset($authToken['id_token'])) {
|
||||
// if $authUri is set, use it as the cache key
|
||||
$cacheKey = $authUri ? $this->getFullCacheKey($authUri) : $this->fetcher->getCacheKey();
|
||||
$this->setCachedValue($cacheKey, $authToken);
|
||||
}
|
||||
}
|
||||
private function getCachedUniverseDomain(GetUniverseDomainInterface $fetcher) : string
|
||||
{
|
||||
$cacheKey = $this->getFullCacheKey($fetcher->getCacheKey() . 'universe_domain');
|
||||
// @phpstan-ignore-line
|
||||
if ($universeDomain = $this->getCachedValue($cacheKey)) {
|
||||
return $universeDomain;
|
||||
}
|
||||
$universeDomain = $fetcher->getUniverseDomain();
|
||||
$this->setCachedValue($cacheKey, $universeDomain);
|
||||
return $universeDomain;
|
||||
}
|
||||
}
|
||||
52
vendor/Gcp/google/auth/src/FetchAuthTokenInterface.php
vendored
Normal file
52
vendor/Gcp/google/auth/src/FetchAuthTokenInterface.php
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2015 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth;
|
||||
|
||||
/**
|
||||
* An interface implemented by objects that can fetch auth tokens.
|
||||
*/
|
||||
interface FetchAuthTokenInterface
|
||||
{
|
||||
/**
|
||||
* Fetches the auth tokens based on the current state.
|
||||
*
|
||||
* @param callable $httpHandler callback which delivers psr7 request
|
||||
* @return array<mixed> a hash of auth tokens
|
||||
*/
|
||||
public function fetchAuthToken(callable $httpHandler = null);
|
||||
/**
|
||||
* Obtains a key that can used to cache the results of #fetchAuthToken.
|
||||
*
|
||||
* If the value is empty, the auth token is not cached.
|
||||
*
|
||||
* @return string a key that may be used to cache the auth token.
|
||||
*/
|
||||
public function getCacheKey();
|
||||
/**
|
||||
* Returns an associative array with the token and
|
||||
* expiration time.
|
||||
*
|
||||
* @return null|array<mixed> {
|
||||
* The last received access token.
|
||||
*
|
||||
* @type string $access_token The access token string.
|
||||
* @type int $expires_at The time the token expires as a UNIX timestamp.
|
||||
* }
|
||||
*/
|
||||
public function getLastReceivedToken();
|
||||
}
|
||||
70
vendor/Gcp/google/auth/src/GCECache.php
vendored
Normal file
70
vendor/Gcp/google/auth/src/GCECache.php
vendored
Normal file
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2020 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Credentials\GCECredentials;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Psr\Cache\CacheItemPoolInterface;
|
||||
/**
|
||||
* A class to implement caching for calls to GCECredentials::onGce. This class
|
||||
* is used automatically when you pass a `Psr\Cache\CacheItemPoolInterface`
|
||||
* cache object to `ApplicationDefaultCredentials::getCredentials`.
|
||||
*
|
||||
* ```
|
||||
* $sysvCache = new Google\Auth\SysvCacheItemPool();
|
||||
* $creds = Google\Auth\ApplicationDefaultCredentials::getCredentials(
|
||||
* $scope,
|
||||
* null,
|
||||
* null,
|
||||
* $sysvCache
|
||||
* );
|
||||
* ```
|
||||
*/
|
||||
class GCECache
|
||||
{
|
||||
const GCE_CACHE_KEY = 'google_auth_on_gce_cache';
|
||||
use CacheTrait;
|
||||
/**
|
||||
* @param array<mixed> $cacheConfig Configuration for the cache
|
||||
* @param CacheItemPoolInterface $cache
|
||||
*/
|
||||
public function __construct(array $cacheConfig = null, CacheItemPoolInterface $cache = null)
|
||||
{
|
||||
$this->cache = $cache;
|
||||
$this->cacheConfig = \array_merge(['lifetime' => 1500, 'prefix' => ''], (array) $cacheConfig);
|
||||
}
|
||||
/**
|
||||
* Caches the result of onGce so the metadata server is not called multiple
|
||||
* times.
|
||||
*
|
||||
* @param callable $httpHandler callback which delivers psr7 request
|
||||
* @return bool True if this a GCEInstance, false otherwise
|
||||
*/
|
||||
public function onGce(callable $httpHandler = null)
|
||||
{
|
||||
if (\is_null($this->cache)) {
|
||||
return GCECredentials::onGce($httpHandler);
|
||||
}
|
||||
$cacheKey = self::GCE_CACHE_KEY;
|
||||
$onGce = $this->getCachedValue($cacheKey);
|
||||
if (\is_null($onGce)) {
|
||||
$onGce = GCECredentials::onGce($httpHandler);
|
||||
$this->setCachedValue($cacheKey, $onGce);
|
||||
}
|
||||
return $onGce;
|
||||
}
|
||||
}
|
||||
32
vendor/Gcp/google/auth/src/GetQuotaProjectInterface.php
vendored
Normal file
32
vendor/Gcp/google/auth/src/GetQuotaProjectInterface.php
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2019 Google LLC
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth;
|
||||
|
||||
/**
|
||||
* An interface implemented by objects that can get quota projects.
|
||||
*/
|
||||
interface GetQuotaProjectInterface
|
||||
{
|
||||
const X_GOOG_USER_PROJECT_HEADER = 'X-Goog-User-Project';
|
||||
/**
|
||||
* Get the quota project used for this API request
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getQuotaProject();
|
||||
}
|
||||
34
vendor/Gcp/google/auth/src/GetUniverseDomainInterface.php
vendored
Normal file
34
vendor/Gcp/google/auth/src/GetUniverseDomainInterface.php
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2023 Google LLC
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth;
|
||||
|
||||
/**
|
||||
* An interface implemented by objects that can get universe domain for Google Cloud APIs.
|
||||
*/
|
||||
interface GetUniverseDomainInterface
|
||||
{
|
||||
const DEFAULT_UNIVERSE_DOMAIN = 'googleapis.com';
|
||||
/**
|
||||
* Get the universe domain from the credential. This should always return
|
||||
* a string, and default to "googleapis.com" if no universe domain is
|
||||
* configured.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUniverseDomain() : string;
|
||||
}
|
||||
59
vendor/Gcp/google/auth/src/HttpHandler/Guzzle6HttpHandler.php
vendored
Normal file
59
vendor/Gcp/google/auth/src/HttpHandler/Guzzle6HttpHandler.php
vendored
Normal file
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2015 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\HttpHandler;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\ClientInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Psr\Http\Message\RequestInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Psr\Http\Message\ResponseInterface;
|
||||
class Guzzle6HttpHandler
|
||||
{
|
||||
/**
|
||||
* @var ClientInterface
|
||||
*/
|
||||
private $client;
|
||||
/**
|
||||
* @param ClientInterface $client
|
||||
*/
|
||||
public function __construct(ClientInterface $client)
|
||||
{
|
||||
$this->client = $client;
|
||||
}
|
||||
/**
|
||||
* Accepts a PSR-7 request and an array of options and returns a PSR-7 response.
|
||||
*
|
||||
* @param RequestInterface $request
|
||||
* @param array<mixed> $options
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function __invoke(RequestInterface $request, array $options = [])
|
||||
{
|
||||
return $this->client->send($request, $options);
|
||||
}
|
||||
/**
|
||||
* Accepts a PSR-7 request and an array of options and returns a PromiseInterface
|
||||
*
|
||||
* @param RequestInterface $request
|
||||
* @param array<mixed> $options
|
||||
*
|
||||
* @return \GuzzleHttp\Promise\PromiseInterface
|
||||
*/
|
||||
public function async(RequestInterface $request, array $options = [])
|
||||
{
|
||||
return $this->client->sendAsync($request, $options);
|
||||
}
|
||||
}
|
||||
22
vendor/Gcp/google/auth/src/HttpHandler/Guzzle7HttpHandler.php
vendored
Normal file
22
vendor/Gcp/google/auth/src/HttpHandler/Guzzle7HttpHandler.php
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2020 Google LLC
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\HttpHandler;
|
||||
|
||||
class Guzzle7HttpHandler extends Guzzle6HttpHandler
|
||||
{
|
||||
}
|
||||
51
vendor/Gcp/google/auth/src/HttpHandler/HttpClientCache.php
vendored
Normal file
51
vendor/Gcp/google/auth/src/HttpHandler/HttpClientCache.php
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2019 Google LLC
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\HttpHandler;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\ClientInterface;
|
||||
/**
|
||||
* Stores an HTTP Client in order to prevent multiple instantiations.
|
||||
*/
|
||||
class HttpClientCache
|
||||
{
|
||||
/**
|
||||
* @var ClientInterface|null
|
||||
*/
|
||||
private static $httpClient;
|
||||
/**
|
||||
* Cache an HTTP Client for later calls.
|
||||
*
|
||||
* Passing null will unset the cached client.
|
||||
*
|
||||
* @param ClientInterface|null $client
|
||||
* @return void
|
||||
*/
|
||||
public static function setHttpClient(ClientInterface $client = null)
|
||||
{
|
||||
self::$httpClient = $client;
|
||||
}
|
||||
/**
|
||||
* Get the stored HTTP Client, or null.
|
||||
*
|
||||
* @return ClientInterface|null
|
||||
*/
|
||||
public static function getHttpClient()
|
||||
{
|
||||
return self::$httpClient;
|
||||
}
|
||||
}
|
||||
62
vendor/Gcp/google/auth/src/HttpHandler/HttpHandlerFactory.php
vendored
Normal file
62
vendor/Gcp/google/auth/src/HttpHandler/HttpHandlerFactory.php
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2015 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\HttpHandler;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\BodySummarizer;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\Client;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\ClientInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\HandlerStack;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\Middleware;
|
||||
class HttpHandlerFactory
|
||||
{
|
||||
/**
|
||||
* Builds out a default http handler for the installed version of guzzle.
|
||||
*
|
||||
* @param ClientInterface $client
|
||||
* @return Guzzle6HttpHandler|Guzzle7HttpHandler
|
||||
* @throws \Exception
|
||||
*/
|
||||
public static function build(ClientInterface $client = null)
|
||||
{
|
||||
if (\is_null($client)) {
|
||||
$stack = null;
|
||||
if (\class_exists(BodySummarizer::class)) {
|
||||
// double the # of characters before truncation by default
|
||||
$bodySummarizer = new BodySummarizer(240);
|
||||
$stack = HandlerStack::create();
|
||||
$stack->remove('http_errors');
|
||||
$stack->unshift(Middleware::httpErrors($bodySummarizer), 'http_errors');
|
||||
}
|
||||
$client = new Client(['handler' => $stack]);
|
||||
}
|
||||
$version = null;
|
||||
if (\defined('DeliciousBrains\\WP_Offload_Media\\Gcp\\GuzzleHttp\\ClientInterface::MAJOR_VERSION')) {
|
||||
$version = ClientInterface::MAJOR_VERSION;
|
||||
} elseif (\defined('DeliciousBrains\\WP_Offload_Media\\Gcp\\GuzzleHttp\\ClientInterface::VERSION')) {
|
||||
$version = (int) \substr(ClientInterface::VERSION, 0, 1);
|
||||
}
|
||||
switch ($version) {
|
||||
case 6:
|
||||
return new Guzzle6HttpHandler($client);
|
||||
case 7:
|
||||
return new Guzzle7HttpHandler($client);
|
||||
default:
|
||||
throw new \Exception('Version not supported');
|
||||
}
|
||||
}
|
||||
}
|
||||
86
vendor/Gcp/google/auth/src/Iam.php
vendored
Normal file
86
vendor/Gcp/google/auth/src/Iam.php
vendored
Normal file
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2019 Google LLC
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\HttpHandler\HttpClientCache;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\HttpHandler\HttpHandlerFactory;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\Psr7;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\Psr7\Utils;
|
||||
/**
|
||||
* Tools for using the IAM API.
|
||||
*
|
||||
* @see https://cloud.google.com/iam/docs IAM Documentation
|
||||
*/
|
||||
class Iam
|
||||
{
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
const IAM_API_ROOT = 'https://iamcredentials.googleapis.com/v1';
|
||||
const SIGN_BLOB_PATH = '%s:signBlob?alt=json';
|
||||
const SERVICE_ACCOUNT_NAME = 'projects/-/serviceAccounts/%s';
|
||||
private const IAM_API_ROOT_TEMPLATE = 'https://iamcredentials.UNIVERSE_DOMAIN/v1';
|
||||
/**
|
||||
* @var callable
|
||||
*/
|
||||
private $httpHandler;
|
||||
private string $universeDomain;
|
||||
/**
|
||||
* @param callable $httpHandler [optional] The HTTP Handler to send requests.
|
||||
*/
|
||||
public function __construct(callable $httpHandler = null, string $universeDomain = GetUniverseDomainInterface::DEFAULT_UNIVERSE_DOMAIN)
|
||||
{
|
||||
$this->httpHandler = $httpHandler ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient());
|
||||
$this->universeDomain = $universeDomain;
|
||||
}
|
||||
/**
|
||||
* Sign a string using the IAM signBlob API.
|
||||
*
|
||||
* Note that signing using IAM requires your service account to have the
|
||||
* `iam.serviceAccounts.signBlob` permission, part of the "Service Account
|
||||
* Token Creator" IAM role.
|
||||
*
|
||||
* @param string $email The service account email.
|
||||
* @param string $accessToken An access token from the service account.
|
||||
* @param string $stringToSign The string to be signed.
|
||||
* @param array<string> $delegates [optional] A list of service account emails to
|
||||
* add to the delegate chain. If omitted, the value of `$email` will
|
||||
* be used.
|
||||
* @return string The signed string, base64-encoded.
|
||||
*/
|
||||
public function signBlob($email, $accessToken, $stringToSign, array $delegates = [])
|
||||
{
|
||||
$httpHandler = $this->httpHandler;
|
||||
$name = \sprintf(self::SERVICE_ACCOUNT_NAME, $email);
|
||||
$apiRoot = \str_replace('UNIVERSE_DOMAIN', $this->universeDomain, self::IAM_API_ROOT_TEMPLATE);
|
||||
$uri = $apiRoot . '/' . \sprintf(self::SIGN_BLOB_PATH, $name);
|
||||
if ($delegates) {
|
||||
foreach ($delegates as &$delegate) {
|
||||
$delegate = \sprintf(self::SERVICE_ACCOUNT_NAME, $delegate);
|
||||
}
|
||||
} else {
|
||||
$delegates = [$name];
|
||||
}
|
||||
$body = ['delegates' => $delegates, 'payload' => \base64_encode($stringToSign)];
|
||||
$headers = ['Authorization' => 'Bearer ' . $accessToken];
|
||||
$request = new Psr7\Request('POST', $uri, $headers, Utils::streamFor(\json_encode($body)));
|
||||
$res = $httpHandler($request);
|
||||
$body = \json_decode((string) $res->getBody(), \true);
|
||||
return $body['signedBlob'];
|
||||
}
|
||||
}
|
||||
61
vendor/Gcp/google/auth/src/IamSignerTrait.php
vendored
Normal file
61
vendor/Gcp/google/auth/src/IamSignerTrait.php
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2022 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth;
|
||||
|
||||
use Exception;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\HttpHandler\HttpClientCache;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\HttpHandler\HttpHandlerFactory;
|
||||
trait IamSignerTrait
|
||||
{
|
||||
/**
|
||||
* @var Iam|null
|
||||
*/
|
||||
private $iam;
|
||||
/**
|
||||
* Sign a string using the default service account private key.
|
||||
*
|
||||
* This implementation uses IAM's signBlob API.
|
||||
*
|
||||
* @see https://cloud.google.com/iam/credentials/reference/rest/v1/projects.serviceAccounts/signBlob SignBlob
|
||||
*
|
||||
* @param string $stringToSign The string to sign.
|
||||
* @param bool $forceOpenSsl [optional] Does not apply to this credentials
|
||||
* type.
|
||||
* @param string $accessToken The access token to use to sign the blob. If
|
||||
* provided, saves a call to the metadata server for a new access
|
||||
* token. **Defaults to** `null`.
|
||||
* @return string
|
||||
* @throws Exception
|
||||
*/
|
||||
public function signBlob($stringToSign, $forceOpenSsl = \false, $accessToken = null)
|
||||
{
|
||||
$httpHandler = HttpHandlerFactory::build(HttpClientCache::getHttpClient());
|
||||
// Providing a signer is useful for testing, but it's undocumented
|
||||
// because it's not something a user would generally need to do.
|
||||
$signer = $this->iam;
|
||||
if (!$signer) {
|
||||
$signer = $this instanceof GetUniverseDomainInterface ? new Iam($httpHandler, $this->getUniverseDomain()) : new Iam($httpHandler);
|
||||
}
|
||||
$email = $this->getClientName($httpHandler);
|
||||
if (\is_null($accessToken)) {
|
||||
$previousToken = $this->getLastReceivedToken();
|
||||
$accessToken = $previousToken ? $previousToken['access_token'] : $this->fetchAuthToken($httpHandler)['access_token'];
|
||||
}
|
||||
return $signer->signBlob($email, $accessToken, $stringToSign);
|
||||
}
|
||||
}
|
||||
138
vendor/Gcp/google/auth/src/Middleware/AuthTokenMiddleware.php
vendored
Normal file
138
vendor/Gcp/google/auth/src/Middleware/AuthTokenMiddleware.php
vendored
Normal file
@@ -0,0 +1,138 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2015 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Middleware;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\FetchAuthTokenCache;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\FetchAuthTokenInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\GetQuotaProjectInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\UpdateMetadataInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\Psr7\Utils;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Psr\Http\Message\RequestInterface;
|
||||
/**
|
||||
* AuthTokenMiddleware is a Guzzle Middleware that adds an Authorization header
|
||||
* provided by an object implementing FetchAuthTokenInterface.
|
||||
*
|
||||
* The FetchAuthTokenInterface#fetchAuthToken is used to obtain a hash; one of
|
||||
* the values value in that hash is added as the authorization header.
|
||||
*
|
||||
* Requests will be accessed with the authorization header:
|
||||
*
|
||||
* 'authorization' 'Bearer <value of auth_token>'
|
||||
*/
|
||||
class AuthTokenMiddleware
|
||||
{
|
||||
/**
|
||||
* @var callable
|
||||
*/
|
||||
private $httpHandler;
|
||||
/**
|
||||
* It must be an implementation of FetchAuthTokenInterface.
|
||||
* It may also implement UpdateMetadataInterface allowing direct
|
||||
* retrieval of auth related headers
|
||||
* @var FetchAuthTokenInterface
|
||||
*/
|
||||
private $fetcher;
|
||||
/**
|
||||
* @var ?callable
|
||||
*/
|
||||
private $tokenCallback;
|
||||
/**
|
||||
* Creates a new AuthTokenMiddleware.
|
||||
*
|
||||
* @param FetchAuthTokenInterface $fetcher is used to fetch the auth token
|
||||
* @param callable $httpHandler (optional) callback which delivers psr7 request
|
||||
* @param callable $tokenCallback (optional) function to be called when a new token is fetched.
|
||||
*/
|
||||
public function __construct(FetchAuthTokenInterface $fetcher, callable $httpHandler = null, callable $tokenCallback = null)
|
||||
{
|
||||
$this->fetcher = $fetcher;
|
||||
$this->httpHandler = $httpHandler;
|
||||
$this->tokenCallback = $tokenCallback;
|
||||
}
|
||||
/**
|
||||
* Updates the request with an Authorization header when auth is 'google_auth'.
|
||||
*
|
||||
* use Google\Auth\Middleware\AuthTokenMiddleware;
|
||||
* use Google\Auth\OAuth2;
|
||||
* use GuzzleHttp\Client;
|
||||
* use GuzzleHttp\HandlerStack;
|
||||
*
|
||||
* $config = [..<oauth config param>.];
|
||||
* $oauth2 = new OAuth2($config)
|
||||
* $middleware = new AuthTokenMiddleware($oauth2);
|
||||
* $stack = HandlerStack::create();
|
||||
* $stack->push($middleware);
|
||||
*
|
||||
* $client = new Client([
|
||||
* 'handler' => $stack,
|
||||
* 'base_uri' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/',
|
||||
* 'auth' => 'google_auth' // authorize all requests
|
||||
* ]);
|
||||
*
|
||||
* $res = $client->get('myproject/taskqueues/myqueue');
|
||||
*
|
||||
* @param callable $handler
|
||||
* @return \Closure
|
||||
*/
|
||||
public function __invoke(callable $handler)
|
||||
{
|
||||
return function (RequestInterface $request, array $options) use($handler) {
|
||||
// Requests using "auth"="google_auth" will be authorized.
|
||||
if (!isset($options['auth']) || $options['auth'] !== 'google_auth') {
|
||||
return $handler($request, $options);
|
||||
}
|
||||
$request = $this->addAuthHeaders($request);
|
||||
if ($quotaProject = $this->getQuotaProject()) {
|
||||
$request = $request->withHeader(GetQuotaProjectInterface::X_GOOG_USER_PROJECT_HEADER, $quotaProject);
|
||||
}
|
||||
return $handler($request, $options);
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Adds auth related headers to the request.
|
||||
*
|
||||
* @param RequestInterface $request
|
||||
* @return RequestInterface
|
||||
*/
|
||||
private function addAuthHeaders(RequestInterface $request)
|
||||
{
|
||||
if (!$this->fetcher instanceof UpdateMetadataInterface || $this->fetcher instanceof FetchAuthTokenCache && !$this->fetcher->getFetcher() instanceof UpdateMetadataInterface) {
|
||||
$token = $this->fetcher->fetchAuthToken();
|
||||
$request = $request->withHeader('authorization', 'Bearer ' . ($token['access_token'] ?? $token['id_token'] ?? ''));
|
||||
} else {
|
||||
$headers = $this->fetcher->updateMetadata($request->getHeaders(), null, $this->httpHandler);
|
||||
$request = Utils::modifyRequest($request, ['set_headers' => $headers]);
|
||||
}
|
||||
if ($this->tokenCallback && ($token = $this->fetcher->getLastReceivedToken())) {
|
||||
if (\array_key_exists('access_token', $token)) {
|
||||
\call_user_func($this->tokenCallback, $this->fetcher->getCacheKey(), $token['access_token']);
|
||||
}
|
||||
}
|
||||
return $request;
|
||||
}
|
||||
/**
|
||||
* @return string|null
|
||||
*/
|
||||
private function getQuotaProject()
|
||||
{
|
||||
if ($this->fetcher instanceof GetQuotaProjectInterface) {
|
||||
return $this->fetcher->getQuotaProject();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
130
vendor/Gcp/google/auth/src/Middleware/ProxyAuthTokenMiddleware.php
vendored
Normal file
130
vendor/Gcp/google/auth/src/Middleware/ProxyAuthTokenMiddleware.php
vendored
Normal file
@@ -0,0 +1,130 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2015 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Middleware;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\FetchAuthTokenInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\GetQuotaProjectInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Psr\Http\Message\RequestInterface;
|
||||
/**
|
||||
* ProxyAuthTokenMiddleware is a Guzzle Middleware that adds an Authorization header
|
||||
* provided by an object implementing FetchAuthTokenInterface.
|
||||
*
|
||||
* The FetchAuthTokenInterface#fetchAuthToken is used to obtain a hash; one of
|
||||
* the values value in that hash is added as the authorization header.
|
||||
*
|
||||
* Requests will be accessed with the authorization header:
|
||||
*
|
||||
* 'proxy-authorization' 'Bearer <value of auth_token>'
|
||||
*/
|
||||
class ProxyAuthTokenMiddleware
|
||||
{
|
||||
/**
|
||||
* @var callable
|
||||
*/
|
||||
private $httpHandler;
|
||||
/**
|
||||
* @var FetchAuthTokenInterface
|
||||
*/
|
||||
private $fetcher;
|
||||
/**
|
||||
* @var ?callable
|
||||
*/
|
||||
private $tokenCallback;
|
||||
/**
|
||||
* Creates a new ProxyAuthTokenMiddleware.
|
||||
*
|
||||
* @param FetchAuthTokenInterface $fetcher is used to fetch the auth token
|
||||
* @param callable $httpHandler (optional) callback which delivers psr7 request
|
||||
* @param callable $tokenCallback (optional) function to be called when a new token is fetched.
|
||||
*/
|
||||
public function __construct(FetchAuthTokenInterface $fetcher, callable $httpHandler = null, callable $tokenCallback = null)
|
||||
{
|
||||
$this->fetcher = $fetcher;
|
||||
$this->httpHandler = $httpHandler;
|
||||
$this->tokenCallback = $tokenCallback;
|
||||
}
|
||||
/**
|
||||
* Updates the request with an Authorization header when auth is 'google_auth'.
|
||||
*
|
||||
* use Google\Auth\Middleware\ProxyAuthTokenMiddleware;
|
||||
* use Google\Auth\OAuth2;
|
||||
* use GuzzleHttp\Client;
|
||||
* use GuzzleHttp\HandlerStack;
|
||||
*
|
||||
* $config = [..<oauth config param>.];
|
||||
* $oauth2 = new OAuth2($config)
|
||||
* $middleware = new ProxyAuthTokenMiddleware($oauth2);
|
||||
* $stack = HandlerStack::create();
|
||||
* $stack->push($middleware);
|
||||
*
|
||||
* $client = new Client([
|
||||
* 'handler' => $stack,
|
||||
* 'base_uri' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/',
|
||||
* 'proxy_auth' => 'google_auth' // authorize all requests
|
||||
* ]);
|
||||
*
|
||||
* $res = $client->get('myproject/taskqueues/myqueue');
|
||||
*
|
||||
* @param callable $handler
|
||||
* @return \Closure
|
||||
*/
|
||||
public function __invoke(callable $handler)
|
||||
{
|
||||
return function (RequestInterface $request, array $options) use($handler) {
|
||||
// Requests using "proxy_auth"="google_auth" will be authorized.
|
||||
if (!isset($options['proxy_auth']) || $options['proxy_auth'] !== 'google_auth') {
|
||||
return $handler($request, $options);
|
||||
}
|
||||
$request = $request->withHeader('proxy-authorization', 'Bearer ' . $this->fetchToken());
|
||||
if ($quotaProject = $this->getQuotaProject()) {
|
||||
$request = $request->withHeader(GetQuotaProjectInterface::X_GOOG_USER_PROJECT_HEADER, $quotaProject);
|
||||
}
|
||||
return $handler($request, $options);
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Call fetcher to fetch the token.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
private function fetchToken()
|
||||
{
|
||||
$auth_tokens = $this->fetcher->fetchAuthToken($this->httpHandler);
|
||||
if (\array_key_exists('access_token', $auth_tokens)) {
|
||||
// notify the callback if applicable
|
||||
if ($this->tokenCallback) {
|
||||
\call_user_func($this->tokenCallback, $this->fetcher->getCacheKey(), $auth_tokens['access_token']);
|
||||
}
|
||||
return $auth_tokens['access_token'];
|
||||
}
|
||||
if (\array_key_exists('id_token', $auth_tokens)) {
|
||||
return $auth_tokens['id_token'];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* @return string|null;
|
||||
*/
|
||||
private function getQuotaProject()
|
||||
{
|
||||
if ($this->fetcher instanceof GetQuotaProjectInterface) {
|
||||
return $this->fetcher->getQuotaProject();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
140
vendor/Gcp/google/auth/src/Middleware/ScopedAccessTokenMiddleware.php
vendored
Normal file
140
vendor/Gcp/google/auth/src/Middleware/ScopedAccessTokenMiddleware.php
vendored
Normal file
@@ -0,0 +1,140 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2015 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Middleware;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\CacheTrait;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Psr\Cache\CacheItemPoolInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Psr\Http\Message\RequestInterface;
|
||||
/**
|
||||
* ScopedAccessTokenMiddleware is a Guzzle Middleware that adds an Authorization
|
||||
* header provided by a closure.
|
||||
*
|
||||
* The closure returns an access token, taking the scope, either a single
|
||||
* string or an array of strings, as its value. If provided, a cache will be
|
||||
* used to preserve the access token for a given lifetime.
|
||||
*
|
||||
* Requests will be accessed with the authorization header:
|
||||
*
|
||||
* 'authorization' 'Bearer <value of auth_token>'
|
||||
*/
|
||||
class ScopedAccessTokenMiddleware
|
||||
{
|
||||
use CacheTrait;
|
||||
const DEFAULT_CACHE_LIFETIME = 1500;
|
||||
/**
|
||||
* @var callable
|
||||
*/
|
||||
private $tokenFunc;
|
||||
/**
|
||||
* @var array<string>|string
|
||||
*/
|
||||
private $scopes;
|
||||
/**
|
||||
* Creates a new ScopedAccessTokenMiddleware.
|
||||
*
|
||||
* @param callable $tokenFunc a token generator function
|
||||
* @param array<string>|string $scopes the token authentication scopes
|
||||
* @param array<mixed> $cacheConfig configuration for the cache when it's present
|
||||
* @param CacheItemPoolInterface $cache an implementation of CacheItemPoolInterface
|
||||
*/
|
||||
public function __construct(callable $tokenFunc, $scopes, array $cacheConfig = null, CacheItemPoolInterface $cache = null)
|
||||
{
|
||||
$this->tokenFunc = $tokenFunc;
|
||||
if (!(\is_string($scopes) || \is_array($scopes))) {
|
||||
throw new \InvalidArgumentException('wants scope should be string or array');
|
||||
}
|
||||
$this->scopes = $scopes;
|
||||
if (!\is_null($cache)) {
|
||||
$this->cache = $cache;
|
||||
$this->cacheConfig = \array_merge(['lifetime' => self::DEFAULT_CACHE_LIFETIME, 'prefix' => ''], $cacheConfig);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Updates the request with an Authorization header when auth is 'scoped'.
|
||||
*
|
||||
* E.g this could be used to authenticate using the AppEngine
|
||||
* AppIdentityService.
|
||||
*
|
||||
* use google\appengine\api\app_identity\AppIdentityService;
|
||||
* use Google\Auth\Middleware\ScopedAccessTokenMiddleware;
|
||||
* use GuzzleHttp\Client;
|
||||
* use GuzzleHttp\HandlerStack;
|
||||
*
|
||||
* $scope = 'https://www.googleapis.com/auth/taskqueue'
|
||||
* $middleware = new ScopedAccessTokenMiddleware(
|
||||
* 'AppIdentityService::getAccessToken',
|
||||
* $scope,
|
||||
* [ 'prefix' => 'Google\Auth\ScopedAccessToken::' ],
|
||||
* $cache = new Memcache()
|
||||
* );
|
||||
* $stack = HandlerStack::create();
|
||||
* $stack->push($middleware);
|
||||
*
|
||||
* $client = new Client([
|
||||
* 'handler' => $stack,
|
||||
* 'base_url' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/',
|
||||
* 'auth' => 'scoped' // authorize all requests
|
||||
* ]);
|
||||
*
|
||||
* $res = $client->get('myproject/taskqueues/myqueue');
|
||||
*
|
||||
* @param callable $handler
|
||||
* @return \Closure
|
||||
*/
|
||||
public function __invoke(callable $handler)
|
||||
{
|
||||
return function (RequestInterface $request, array $options) use($handler) {
|
||||
// Requests using "auth"="scoped" will be authorized.
|
||||
if (!isset($options['auth']) || $options['auth'] !== 'scoped') {
|
||||
return $handler($request, $options);
|
||||
}
|
||||
$request = $request->withHeader('authorization', 'Bearer ' . $this->fetchToken());
|
||||
return $handler($request, $options);
|
||||
};
|
||||
}
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
private function getCacheKey()
|
||||
{
|
||||
$key = null;
|
||||
if (\is_string($this->scopes)) {
|
||||
$key .= $this->scopes;
|
||||
} elseif (\is_array($this->scopes)) {
|
||||
$key .= \implode(':', $this->scopes);
|
||||
}
|
||||
return $key;
|
||||
}
|
||||
/**
|
||||
* Determine if token is available in the cache, if not call tokenFunc to
|
||||
* fetch it.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function fetchToken()
|
||||
{
|
||||
$cacheKey = $this->getCacheKey();
|
||||
$cached = $this->getCachedValue($cacheKey);
|
||||
if (!empty($cached)) {
|
||||
return $cached;
|
||||
}
|
||||
$token = \call_user_func($this->tokenFunc, $this->scopes);
|
||||
$this->setCachedValue($cacheKey, $token);
|
||||
return $token;
|
||||
}
|
||||
}
|
||||
86
vendor/Gcp/google/auth/src/Middleware/SimpleMiddleware.php
vendored
Normal file
86
vendor/Gcp/google/auth/src/Middleware/SimpleMiddleware.php
vendored
Normal file
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2015 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Middleware;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\Psr7\Query;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Psr\Http\Message\RequestInterface;
|
||||
/**
|
||||
* SimpleMiddleware is a Guzzle Middleware that implements Google's Simple API
|
||||
* access.
|
||||
*
|
||||
* Requests are accessed using the Simple API access developer key.
|
||||
*/
|
||||
class SimpleMiddleware
|
||||
{
|
||||
/**
|
||||
* @var array<mixed>
|
||||
*/
|
||||
private $config;
|
||||
/**
|
||||
* Create a new Simple plugin.
|
||||
*
|
||||
* The configuration array expects one option
|
||||
* - key: required, otherwise InvalidArgumentException is thrown
|
||||
*
|
||||
* @param array<mixed> $config Configuration array
|
||||
*/
|
||||
public function __construct(array $config)
|
||||
{
|
||||
if (!isset($config['key'])) {
|
||||
throw new \InvalidArgumentException('requires a key to have been set');
|
||||
}
|
||||
$this->config = \array_merge(['key' => null], $config);
|
||||
}
|
||||
/**
|
||||
* Updates the request query with the developer key if auth is set to simple.
|
||||
*
|
||||
* use Google\Auth\Middleware\SimpleMiddleware;
|
||||
* use GuzzleHttp\Client;
|
||||
* use GuzzleHttp\HandlerStack;
|
||||
*
|
||||
* $my_key = 'is not the same as yours';
|
||||
* $middleware = new SimpleMiddleware(['key' => $my_key]);
|
||||
* $stack = HandlerStack::create();
|
||||
* $stack->push($middleware);
|
||||
*
|
||||
* $client = new Client([
|
||||
* 'handler' => $stack,
|
||||
* 'base_uri' => 'https://www.googleapis.com/discovery/v1/',
|
||||
* 'auth' => 'simple'
|
||||
* ]);
|
||||
*
|
||||
* $res = $client->get('drive/v2/rest');
|
||||
*
|
||||
* @param callable $handler
|
||||
* @return \Closure
|
||||
*/
|
||||
public function __invoke(callable $handler)
|
||||
{
|
||||
return function (RequestInterface $request, array $options) use($handler) {
|
||||
// Requests using "auth"="scoped" will be authorized.
|
||||
if (!isset($options['auth']) || $options['auth'] !== 'simple') {
|
||||
return $handler($request, $options);
|
||||
}
|
||||
$query = Query::parse($request->getUri()->getQuery());
|
||||
$params = \array_merge($query, $this->config);
|
||||
$uri = $request->getUri()->withQuery(Query::build($params));
|
||||
$request = $request->withUri($uri);
|
||||
return $handler($request, $options);
|
||||
};
|
||||
}
|
||||
}
|
||||
1520
vendor/Gcp/google/auth/src/OAuth2.php
vendored
Normal file
1520
vendor/Gcp/google/auth/src/OAuth2.php
vendored
Normal file
File diff suppressed because it is too large
Load Diff
32
vendor/Gcp/google/auth/src/ProjectIdProviderInterface.php
vendored
Normal file
32
vendor/Gcp/google/auth/src/ProjectIdProviderInterface.php
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2020 Google LLC
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth;
|
||||
|
||||
/**
|
||||
* Describes a Credentials object which supports fetching the project ID.
|
||||
*/
|
||||
interface ProjectIdProviderInterface
|
||||
{
|
||||
/**
|
||||
* Get the project ID.
|
||||
*
|
||||
* @param callable $httpHandler Callback which delivers psr7 request
|
||||
* @return string|null
|
||||
*/
|
||||
public function getProjectId(callable $httpHandler = null);
|
||||
}
|
||||
52
vendor/Gcp/google/auth/src/ServiceAccountSignerTrait.php
vendored
Normal file
52
vendor/Gcp/google/auth/src/ServiceAccountSignerTrait.php
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2019 Google LLC
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\phpseclib3\Crypt\PublicKeyLoader;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\phpseclib3\Crypt\RSA;
|
||||
/**
|
||||
* Sign a string using a Service Account private key.
|
||||
*/
|
||||
trait ServiceAccountSignerTrait
|
||||
{
|
||||
/**
|
||||
* Sign a string using the service account private key.
|
||||
*
|
||||
* @param string $stringToSign
|
||||
* @param bool $forceOpenssl Whether to use OpenSSL regardless of
|
||||
* whether phpseclib is installed. **Defaults to** `false`.
|
||||
* @return string
|
||||
*/
|
||||
public function signBlob($stringToSign, $forceOpenssl = \false)
|
||||
{
|
||||
$privateKey = $this->auth->getSigningKey();
|
||||
$signedString = '';
|
||||
if (\class_exists(phpseclib3\Crypt\RSA::class) && !$forceOpenssl) {
|
||||
$key = PublicKeyLoader::load($privateKey);
|
||||
$rsa = $key->withHash('sha256')->withPadding(RSA::SIGNATURE_PKCS1);
|
||||
$signedString = $rsa->sign($stringToSign);
|
||||
} elseif (\extension_loaded('openssl')) {
|
||||
\openssl_sign($stringToSign, $signedString, $privateKey, 'sha256WithRSAEncryption');
|
||||
} else {
|
||||
// @codeCoverageIgnoreStart
|
||||
throw new \RuntimeException('OpenSSL is not installed.');
|
||||
}
|
||||
// @codeCoverageIgnoreEnd
|
||||
return \base64_encode($signedString);
|
||||
}
|
||||
}
|
||||
43
vendor/Gcp/google/auth/src/SignBlobInterface.php
vendored
Normal file
43
vendor/Gcp/google/auth/src/SignBlobInterface.php
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2019 Google LLC
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth;
|
||||
|
||||
/**
|
||||
* Describes a class which supports signing arbitrary strings.
|
||||
*/
|
||||
interface SignBlobInterface extends FetchAuthTokenInterface
|
||||
{
|
||||
/**
|
||||
* Sign a string using the method which is best for a given credentials type.
|
||||
*
|
||||
* @param string $stringToSign The string to sign.
|
||||
* @param bool $forceOpenssl Require use of OpenSSL for local signing. Does
|
||||
* not apply to signing done using external services. **Defaults to**
|
||||
* `false`.
|
||||
* @return string The resulting signature. Value should be base64-encoded.
|
||||
*/
|
||||
public function signBlob($stringToSign, $forceOpenssl = \false);
|
||||
/**
|
||||
* Returns the current Client Name.
|
||||
*
|
||||
* @param callable $httpHandler callback which delivers psr7 request, if
|
||||
* one is required to obtain a client name.
|
||||
* @return string
|
||||
*/
|
||||
public function getClientName(callable $httpHandler = null);
|
||||
}
|
||||
36
vendor/Gcp/google/auth/src/UpdateMetadataInterface.php
vendored
Normal file
36
vendor/Gcp/google/auth/src/UpdateMetadataInterface.php
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2020 Google LLC
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth;
|
||||
|
||||
/**
|
||||
* Describes a Credentials object which supports updating request metadata
|
||||
* (request headers).
|
||||
*/
|
||||
interface UpdateMetadataInterface
|
||||
{
|
||||
const AUTH_METADATA_KEY = 'authorization';
|
||||
/**
|
||||
* Updates metadata with the authorization token.
|
||||
*
|
||||
* @param array<mixed> $metadata metadata hashmap
|
||||
* @param string $authUri optional auth uri
|
||||
* @param callable $httpHandler callback which delivers psr7 request
|
||||
* @return array<mixed> updated metadata hashmap
|
||||
*/
|
||||
public function updateMetadata($metadata, $authUri = null, callable $httpHandler = null);
|
||||
}
|
||||
62
vendor/Gcp/google/auth/src/UpdateMetadataTrait.php
vendored
Normal file
62
vendor/Gcp/google/auth/src/UpdateMetadataTrait.php
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2023 Google LLC
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth;
|
||||
|
||||
/**
|
||||
* Provides shared methods for updating request metadata (request headers).
|
||||
*
|
||||
* Should implement {@see UpdateMetadataInterface} and {@see FetchAuthTokenInterface}.
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
trait UpdateMetadataTrait
|
||||
{
|
||||
/**
|
||||
* export a callback function which updates runtime metadata.
|
||||
*
|
||||
* @return callable updateMetadata function
|
||||
* @deprecated
|
||||
*/
|
||||
public function getUpdateMetadataFunc()
|
||||
{
|
||||
return [$this, 'updateMetadata'];
|
||||
}
|
||||
/**
|
||||
* Updates metadata with the authorization token.
|
||||
*
|
||||
* @param array<mixed> $metadata metadata hashmap
|
||||
* @param string $authUri optional auth uri
|
||||
* @param callable $httpHandler callback which delivers psr7 request
|
||||
* @return array<mixed> updated metadata hashmap
|
||||
*/
|
||||
public function updateMetadata($metadata, $authUri = null, callable $httpHandler = null)
|
||||
{
|
||||
if (isset($metadata[self::AUTH_METADATA_KEY])) {
|
||||
// Auth metadata has already been set
|
||||
return $metadata;
|
||||
}
|
||||
$result = $this->fetchAuthToken($httpHandler);
|
||||
$metadata_copy = $metadata;
|
||||
if (isset($result['access_token'])) {
|
||||
$metadata_copy[self::AUTH_METADATA_KEY] = ['Bearer ' . $result['access_token']];
|
||||
} elseif (isset($result['id_token'])) {
|
||||
$metadata_copy[self::AUTH_METADATA_KEY] = ['Bearer ' . $result['id_token']];
|
||||
}
|
||||
return $metadata_copy;
|
||||
}
|
||||
}
|
||||
43
vendor/Gcp/google/cloud-core/CODE_OF_CONDUCT.md
vendored
Normal file
43
vendor/Gcp/google/cloud-core/CODE_OF_CONDUCT.md
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
# Contributor Code of Conduct
|
||||
|
||||
As contributors and maintainers of this project,
|
||||
and in the interest of fostering an open and welcoming community,
|
||||
we pledge to respect all people who contribute through reporting issues,
|
||||
posting feature requests, updating documentation,
|
||||
submitting pull requests or patches, and other activities.
|
||||
|
||||
We are committed to making participation in this project
|
||||
a harassment-free experience for everyone,
|
||||
regardless of level of experience, gender, gender identity and expression,
|
||||
sexual orientation, disability, personal appearance,
|
||||
body size, race, ethnicity, age, religion, or nationality.
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
|
||||
* The use of sexualized language or imagery
|
||||
* Personal attacks
|
||||
* Trolling or insulting/derogatory comments
|
||||
* Public or private harassment
|
||||
* Publishing other's private information,
|
||||
such as physical or electronic
|
||||
addresses, without explicit permission
|
||||
* Other unethical or unprofessional conduct.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or reject
|
||||
comments, commits, code, wiki edits, issues, and other contributions
|
||||
that are not aligned to this Code of Conduct.
|
||||
By adopting this Code of Conduct,
|
||||
project maintainers commit themselves to fairly and consistently
|
||||
applying these principles to every aspect of managing this project.
|
||||
Project maintainers who do not follow or enforce the Code of Conduct
|
||||
may be permanently removed from the project team.
|
||||
|
||||
This code of conduct applies both within project spaces and in public spaces
|
||||
when an individual is representing the project or its community.
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior
|
||||
may be reported by opening an issue
|
||||
or contacting one or more of the project maintainers.
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.2.0,
|
||||
available at [http://contributor-covenant.org/version/1/2/0/](http://contributor-covenant.org/version/1/2/0/)
|
||||
202
vendor/Gcp/google/cloud-core/LICENSE
vendored
Normal file
202
vendor/Gcp/google/cloud-core/LICENSE
vendored
Normal file
@@ -0,0 +1,202 @@
|
||||
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.
|
||||
|
||||
7
vendor/Gcp/google/cloud-core/SECURITY.md
vendored
Normal file
7
vendor/Gcp/google/cloud-core/SECURITY.md
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
# Security Policy
|
||||
|
||||
To report a security issue, please use [g.co/vulnz](https://g.co/vulnz).
|
||||
|
||||
The Google Security Team will respond within 5 working days of your report on g.co/vulnz.
|
||||
|
||||
We use g.co/vulnz for our intake, and do coordination and disclosure here using GitHub Security Advisory to privately discuss and fix the issue.
|
||||
1
vendor/Gcp/google/cloud-core/VERSION
vendored
Normal file
1
vendor/Gcp/google/cloud-core/VERSION
vendored
Normal file
@@ -0,0 +1 @@
|
||||
1.56.0
|
||||
61
vendor/Gcp/google/cloud-core/bin/google-cloud-batch
vendored
Normal file
61
vendor/Gcp/google/cloud-core/bin/google-cloud-batch
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2017 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
$foundAutoloader = \false;
|
||||
$autoloaderCandidates = [
|
||||
'/../vendor/autoload.php',
|
||||
// Git clone of google-cloud-php-core
|
||||
'/../../vendor/autoload.php',
|
||||
// Git clone of google-cloud-php
|
||||
'/../../../autoload.php',
|
||||
// google/cloud-core installation
|
||||
'/../../../../autoload.php',
|
||||
];
|
||||
foreach ($autoloaderCandidates as $candidate) {
|
||||
if (\file_exists(__DIR__ . $candidate)) {
|
||||
require_once __DIR__ . $candidate;
|
||||
$foundAutoloader = \true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!$foundAutoloader) {
|
||||
die('No autoloader found');
|
||||
}
|
||||
function showUsageAndDie()
|
||||
{
|
||||
die("usage: " . __FILE__ . " [daemon|retry] {id}");
|
||||
}
|
||||
if (\count($argv) < 2) {
|
||||
showUsageAndDie();
|
||||
}
|
||||
if ($argv[1] === 'daemon') {
|
||||
$daemon = new BatchDaemon(__FILE__);
|
||||
if (\count($argv) == 2) {
|
||||
$daemon->run();
|
||||
} else {
|
||||
$idNum = (int) $argv[2];
|
||||
$job = $daemon->job($idNum);
|
||||
$job->run();
|
||||
}
|
||||
} elseif ($argv[1] === 'retry') {
|
||||
$retry = new Retry();
|
||||
$retry->retryAll();
|
||||
} else {
|
||||
showUsageAndDie();
|
||||
}
|
||||
6
vendor/Gcp/google/cloud-core/perf-bootstrap.php
vendored
Normal file
6
vendor/Gcp/google/cloud-core/perf-bootstrap.php
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Testing\TestHelpers;
|
||||
TestHelpers::perfBootstrap();
|
||||
7
vendor/Gcp/google/cloud-core/snippet-bootstrap.php
vendored
Normal file
7
vendor/Gcp/google/cloud-core/snippet-bootstrap.php
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Testing\TestHelpers;
|
||||
TestHelpers::snippetBootstrap();
|
||||
\date_default_timezone_set('UTC');
|
||||
84
vendor/Gcp/google/cloud-core/src/AnonymousCredentials.php
vendored
Normal file
84
vendor/Gcp/google/cloud-core/src/AnonymousCredentials.php
vendored
Normal file
@@ -0,0 +1,84 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\FetchAuthTokenInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\UpdateMetadataInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\GetQuotaProjectInterface;
|
||||
/**
|
||||
* Provides an anonymous set of credentials, which is useful for APIs which do
|
||||
* not require authentication.
|
||||
*/
|
||||
class AnonymousCredentials implements FetchAuthTokenInterface, UpdateMetadataInterface, GetQuotaProjectInterface
|
||||
{
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $token = ['access_token' => null];
|
||||
/**
|
||||
* Fetches the auth token. In this case it returns a null value.
|
||||
*
|
||||
* @param callable $httpHandler
|
||||
* @return array
|
||||
*/
|
||||
public function fetchAuthToken(callable $httpHandler = null)
|
||||
{
|
||||
return $this->token;
|
||||
}
|
||||
/**
|
||||
* Returns the cache key. In this case it returns a null value, disabling
|
||||
* caching.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getCacheKey()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* Fetches the last received token. In this case, it returns the same null
|
||||
* auth token.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getLastReceivedToken()
|
||||
{
|
||||
return $this->token;
|
||||
}
|
||||
/**
|
||||
* This method has no effect for AnonymousCredentials.
|
||||
*
|
||||
* @param array $metadata metadata hashmap
|
||||
* @param string $authUri optional auth uri
|
||||
* @param callable $httpHandler callback which delivers psr7 request
|
||||
* @return array updated metadata hashmap
|
||||
*/
|
||||
public function updateMetadata($metadata, $authUri = null, callable $httpHandler = null)
|
||||
{
|
||||
return $metadata;
|
||||
}
|
||||
/**
|
||||
* This method always returns null for AnonymousCredentials.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getQuotaProject()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
227
vendor/Gcp/google/cloud-core/src/ApiHelperTrait.php
vendored
Normal file
227
vendor/Gcp/google/cloud-core/src/ApiHelperTrait.php
vendored
Normal file
@@ -0,0 +1,227 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2023 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\ApiCore\ArrayTrait;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\ApiCore\Options\CallOptions;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Protobuf\NullValue;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Duration;
|
||||
/**
|
||||
* @internal
|
||||
* Supplies helper methods to interact with the APIs.
|
||||
*/
|
||||
trait ApiHelperTrait
|
||||
{
|
||||
use ArrayTrait;
|
||||
use TimeTrait;
|
||||
/**
|
||||
* Format a struct for the API.
|
||||
*
|
||||
* @param array $fields
|
||||
* @return array
|
||||
*/
|
||||
private function formatStructForApi(array $fields)
|
||||
{
|
||||
$fFields = [];
|
||||
foreach ($fields as $key => $value) {
|
||||
$fFields[$key] = $this->formatValueForApi($value);
|
||||
}
|
||||
return ['fields' => $fFields];
|
||||
}
|
||||
private function unpackStructFromApi(array $struct)
|
||||
{
|
||||
$vals = [];
|
||||
foreach ($struct['fields'] as $key => $val) {
|
||||
$vals[$key] = $this->unpackValue($val);
|
||||
}
|
||||
return $vals;
|
||||
}
|
||||
private function unpackValue($value)
|
||||
{
|
||||
if (\count($value) > 1) {
|
||||
throw new \RuntimeException("Unexpected fields in struct: {$value}");
|
||||
}
|
||||
foreach ($value as $setField => $setValue) {
|
||||
switch ($setField) {
|
||||
case 'listValue':
|
||||
$valueList = [];
|
||||
foreach ($setValue['values'] as $innerValue) {
|
||||
$valueList[] = $this->unpackValue($innerValue);
|
||||
}
|
||||
return $valueList;
|
||||
case 'structValue':
|
||||
return $this->unpackStructFromApi($value['structValue']);
|
||||
default:
|
||||
return $setValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
private function flattenStruct(array $struct)
|
||||
{
|
||||
return $struct['fields'];
|
||||
}
|
||||
private function flattenValue(array $value)
|
||||
{
|
||||
if (\count($value) > 1) {
|
||||
throw new \RuntimeException("Unexpected fields in struct: {$value}");
|
||||
}
|
||||
if (isset($value['nullValue'])) {
|
||||
return null;
|
||||
}
|
||||
return \array_pop($value);
|
||||
}
|
||||
private function flattenListValue(array $value)
|
||||
{
|
||||
return $value['values'];
|
||||
}
|
||||
/**
|
||||
* Format a list for the API.
|
||||
*
|
||||
* @param array $list
|
||||
* @return array
|
||||
*/
|
||||
private function formatListForApi(array $list)
|
||||
{
|
||||
$values = [];
|
||||
foreach ($list as $value) {
|
||||
$values[] = $this->formatValueForApi($value);
|
||||
}
|
||||
return ['values' => $values];
|
||||
}
|
||||
/**
|
||||
* Format a value for the API.
|
||||
*
|
||||
* @param mixed $value
|
||||
* @return array
|
||||
*/
|
||||
private function formatValueForApi($value)
|
||||
{
|
||||
$type = \gettype($value);
|
||||
switch ($type) {
|
||||
case 'string':
|
||||
return ['string_value' => $value];
|
||||
case 'double':
|
||||
case 'integer':
|
||||
return ['number_value' => $value];
|
||||
case 'boolean':
|
||||
return ['bool_value' => $value];
|
||||
case 'NULL':
|
||||
return ['null_value' => NullValue::NULL_VALUE];
|
||||
case 'array':
|
||||
if (!empty($value) && $this->isAssoc($value)) {
|
||||
return ['struct_value' => $this->formatStructForApi($value)];
|
||||
}
|
||||
return ['list_value' => $this->formatListForApi($value)];
|
||||
}
|
||||
return [];
|
||||
}
|
||||
/**
|
||||
* Format a gRPC timestamp to match the format returned by the REST API.
|
||||
*
|
||||
* @param array $timestamp
|
||||
* @return string
|
||||
*/
|
||||
private function formatTimestampFromApi(array $timestamp)
|
||||
{
|
||||
$timestamp += ['seconds' => 0, 'nanos' => 0];
|
||||
$dt = $this->createDateTimeFromSeconds($timestamp['seconds']);
|
||||
return $this->formatTimeAsString($dt, $timestamp['nanos']);
|
||||
}
|
||||
/**
|
||||
* Format a timestamp for the API with nanosecond precision.
|
||||
*
|
||||
* @param string $value
|
||||
* @return array
|
||||
*/
|
||||
private function formatTimestampForApi($value)
|
||||
{
|
||||
list($dt, $nanos) = $this->parseTimeString($value);
|
||||
return ['seconds' => (int) $dt->format('U'), 'nanos' => (int) $nanos];
|
||||
}
|
||||
/**
|
||||
* Format a duration for the API.
|
||||
*
|
||||
* @param string|mixed $value
|
||||
* @return array
|
||||
*/
|
||||
private function formatDurationForApi($value)
|
||||
{
|
||||
if (\is_string($value)) {
|
||||
$d = \explode('.', \trim($value, 's'));
|
||||
if (\count($d) < 2) {
|
||||
$seconds = $d[0];
|
||||
$nanos = 0;
|
||||
} else {
|
||||
$seconds = (int) $d[0];
|
||||
$nanos = $this->convertFractionToNanoSeconds($d[1]);
|
||||
}
|
||||
} elseif ($value instanceof Duration) {
|
||||
$d = $value->get();
|
||||
$seconds = $d['seconds'];
|
||||
$nanos = $d['nanos'];
|
||||
}
|
||||
return ['seconds' => $seconds, 'nanos' => $nanos];
|
||||
}
|
||||
/**
|
||||
* Construct a gapic client. Allows for tests to intercept.
|
||||
*
|
||||
* @param string $gapicName
|
||||
* @param array $config
|
||||
* @return mixed
|
||||
*/
|
||||
protected function constructGapic($gapicName, array $config)
|
||||
{
|
||||
return new $gapicName($config);
|
||||
}
|
||||
/**
|
||||
* Helper function to convert selective elements into protos out of a given input array.
|
||||
*
|
||||
* Example:
|
||||
* ```
|
||||
* $output = $topic->convertDataToProtos(['schema' =>[], 'other vals'], ['schema' => Schema::class]);
|
||||
* $output['schema']; // This will be of the Schema type.
|
||||
* ```
|
||||
*
|
||||
* @param array $input The input array.
|
||||
* @param array $map The key,value pairs specifying the elements and the proto classes.
|
||||
*
|
||||
* @return array The modified array
|
||||
*/
|
||||
private function convertDataToProtos(array $input, array $map) : array
|
||||
{
|
||||
foreach ($map as $key => $className) {
|
||||
if (isset($input[$key])) {
|
||||
$input[$key] = $this->serializer->decodeMessage(new $className(), $input[$key]);
|
||||
}
|
||||
}
|
||||
return $input;
|
||||
}
|
||||
/**
|
||||
* Helper method used to split a supplied set of options into parameters that are passed into
|
||||
* a proto message and optional args.
|
||||
* We strictly treat the parameters allowed by `CallOptions` in GAX as the optional params
|
||||
* and everything else that is passed is passed to the Proto message constructor.
|
||||
*/
|
||||
private function splitOptionalArgs(array $input, array $extraAllowedKeys = []) : array
|
||||
{
|
||||
$callOptionFields = \array_keys((new CallOptions([]))->toArray());
|
||||
$keys = \array_merge($callOptionFields, $extraAllowedKeys);
|
||||
$optionalArgs = $this->pluckArray($keys, $input);
|
||||
return [$input, $optionalArgs];
|
||||
}
|
||||
}
|
||||
114
vendor/Gcp/google/cloud-core/src/ArrayTrait.php
vendored
Normal file
114
vendor/Gcp/google/cloud-core/src/ArrayTrait.php
vendored
Normal file
@@ -0,0 +1,114 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2016 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core;
|
||||
|
||||
/**
|
||||
* Provides basic array helper methods.
|
||||
*/
|
||||
trait ArrayTrait
|
||||
{
|
||||
/**
|
||||
* Pluck a value out of an array.
|
||||
*
|
||||
* @param string $key
|
||||
* @param array $arr
|
||||
* @param bool $isRequired
|
||||
* @return mixed
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
private function pluck($key, array &$arr, $isRequired = \true)
|
||||
{
|
||||
if (!\array_key_exists($key, $arr)) {
|
||||
if ($isRequired) {
|
||||
throw new \InvalidArgumentException("Key {$key} does not exist in the provided array.");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
$value = $arr[$key];
|
||||
unset($arr[$key]);
|
||||
return $value;
|
||||
}
|
||||
/**
|
||||
* Pluck a subset of an array.
|
||||
*
|
||||
* @param string[] $keys
|
||||
* @param array $arr
|
||||
* @return array
|
||||
*/
|
||||
private function pluckArray(array $keys, &$arr)
|
||||
{
|
||||
$values = [];
|
||||
foreach ($keys as $key) {
|
||||
if (\array_key_exists($key, $arr)) {
|
||||
$values[$key] = $this->pluck($key, $arr, \false);
|
||||
}
|
||||
}
|
||||
return $values;
|
||||
}
|
||||
/**
|
||||
* Determine whether given array is associative.
|
||||
* If $arr is empty, then $onEmpty will be returned
|
||||
* $onEmpty defaults to true to maintain compatibility
|
||||
* with the current usage.
|
||||
*
|
||||
* @param array $arr
|
||||
* @param bool $onEmpty
|
||||
* @return bool
|
||||
*/
|
||||
private function isAssoc(array $arr, $onEmpty = \true)
|
||||
{
|
||||
if (empty($arr)) {
|
||||
return $onEmpty;
|
||||
}
|
||||
return \array_keys($arr) !== \range(0, \count($arr) - 1);
|
||||
}
|
||||
/**
|
||||
* Just like array_filter(), but preserves falsey values except null.
|
||||
*
|
||||
* @param array $arr
|
||||
* @return array
|
||||
*/
|
||||
private function arrayFilterRemoveNull(array $arr)
|
||||
{
|
||||
return \array_filter($arr, function ($element) {
|
||||
return !\is_null($element);
|
||||
});
|
||||
}
|
||||
/**
|
||||
* A method, similar to PHP's `array_merge_recursive`, with two differences.
|
||||
*
|
||||
* 1. Keys in $array2 take precedence over keys in $array1.
|
||||
* 2. Non-array keys found in both inputs are not transformed into an array
|
||||
* and appended. Rather, the value in $array2 is used.
|
||||
*
|
||||
* @param array $array1
|
||||
* @param array $array2
|
||||
* @return array
|
||||
*/
|
||||
private function arrayMergeRecursive(array $array1, array $array2)
|
||||
{
|
||||
foreach ($array2 as $key => $value) {
|
||||
if (\array_key_exists($key, $array1) && \is_array($array1[$key]) && \is_array($value)) {
|
||||
$array1[$key] = $this->isAssoc($array1[$key]) && $this->isAssoc($value) ? $this->arrayMergeRecursive($array1[$key], $value) : \array_merge($array1[$key], $value);
|
||||
} else {
|
||||
$array1[$key] = $value;
|
||||
}
|
||||
}
|
||||
return $array1;
|
||||
}
|
||||
}
|
||||
143
vendor/Gcp/google/cloud-core/src/Batch/BatchDaemon.php
vendored
Normal file
143
vendor/Gcp/google/cloud-core/src/Batch/BatchDaemon.php
vendored
Normal file
@@ -0,0 +1,143 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\SysvTrait;
|
||||
/**
|
||||
* An external daemon script for executing the batch jobs.
|
||||
*
|
||||
* @codeCoverageIgnore
|
||||
*
|
||||
* The system test is responsible for testing this class.
|
||||
* {@see \Google\Cloud\Tests\System\Core\Batch}
|
||||
*
|
||||
* @experimental The experimental flag means that while we believe this method
|
||||
* or class is ready for use, it may change before release in backwards-
|
||||
* incompatible ways. Please use with caution, and test thoroughly when
|
||||
* upgrading.
|
||||
*/
|
||||
class BatchDaemon
|
||||
{
|
||||
use BatchDaemonTrait;
|
||||
use HandleFailureTrait;
|
||||
use SysvTrait;
|
||||
use InterruptTrait;
|
||||
/* @var BatchRunner */
|
||||
private $runner;
|
||||
/* @var array */
|
||||
private $descriptorSpec;
|
||||
/* @var string */
|
||||
private $command;
|
||||
/**
|
||||
* Prepare the descriptor spec and install signal handlers.
|
||||
*
|
||||
* @param string $entrypoint Daemon's entrypoint script.
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
public function __construct($entrypoint)
|
||||
{
|
||||
if (!$this->isSysvIPCLoaded()) {
|
||||
throw new \RuntimeException('SystemV IPC extensions are missing.');
|
||||
}
|
||||
$this->runner = new BatchRunner(new SysvConfigStorage(), new SysvProcessor());
|
||||
$this->shutdown = \false;
|
||||
// Just share the usual descriptors.
|
||||
$this->descriptorSpec = [0 => ['file', 'php://stdin', 'r'], 1 => ['file', 'php://stdout', 'w'], 2 => ['file', 'php://stderr', 'w']];
|
||||
$this->command = \sprintf('exec php -d auto_prepend_file="" %s daemon', $entrypoint);
|
||||
$this->initFailureFile();
|
||||
}
|
||||
/**
|
||||
* A loop for the parent.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function run()
|
||||
{
|
||||
$this->setupSignalHandlers();
|
||||
$procs = [];
|
||||
while (\true) {
|
||||
$jobs = $this->runner->getJobs();
|
||||
foreach ($jobs as $job) {
|
||||
if (!\array_key_exists($job->identifier(), $procs)) {
|
||||
$procs[$job->identifier()] = [];
|
||||
}
|
||||
while (\count($procs[$job->identifier()]) > $job->numWorkers()) {
|
||||
// Stopping an excessive child.
|
||||
echo 'Stopping an excessive child.' . \PHP_EOL;
|
||||
$proc = \array_pop($procs[$job->identifier()]);
|
||||
$status = \proc_get_status($proc);
|
||||
// Keep sending SIGTERM until the child exits.
|
||||
while ($status['running'] === \true) {
|
||||
@\proc_terminate($proc);
|
||||
\usleep(50000);
|
||||
$status = \proc_get_status($proc);
|
||||
}
|
||||
@\proc_close($proc);
|
||||
}
|
||||
for ($i = 0; $i < $job->numWorkers(); $i++) {
|
||||
$needStart = \false;
|
||||
if (\array_key_exists($i, $procs[$job->identifier()])) {
|
||||
$status = \proc_get_status($procs[$job->identifier()][$i]);
|
||||
if ($status['running'] !== \true) {
|
||||
$needStart = \true;
|
||||
}
|
||||
} else {
|
||||
$needStart = \true;
|
||||
}
|
||||
if ($needStart) {
|
||||
echo 'Starting a child.' . \PHP_EOL;
|
||||
$procs[$job->identifier()][$i] = \proc_open(\sprintf('%s %d', $this->command, $job->id()), $this->descriptorSpec, $pipes);
|
||||
}
|
||||
}
|
||||
}
|
||||
\usleep(1000000);
|
||||
// Reload the config after 1 second
|
||||
\pcntl_signal_dispatch();
|
||||
if ($this->shutdown) {
|
||||
echo 'Shutting down, waiting for the children' . \PHP_EOL;
|
||||
foreach ($procs as $k => $v) {
|
||||
foreach ($v as $proc) {
|
||||
$status = \proc_get_status($proc);
|
||||
// Keep sending SIGTERM until the child exits.
|
||||
while ($status['running'] === \true) {
|
||||
@\proc_terminate($proc);
|
||||
\usleep(50000);
|
||||
$status = \proc_get_status($proc);
|
||||
}
|
||||
@\proc_close($proc);
|
||||
}
|
||||
}
|
||||
echo 'BatchDaemon exiting' . \PHP_EOL;
|
||||
exit;
|
||||
}
|
||||
// Reload the config
|
||||
$this->runner->loadConfig();
|
||||
\gc_collect_cycles();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Fetch the child job by id.
|
||||
*
|
||||
* @param int $idNum The id of the job to find
|
||||
* @return JobInterface
|
||||
*/
|
||||
public function job($idNum)
|
||||
{
|
||||
return $this->runner->getJobFromIdNum($idNum);
|
||||
}
|
||||
}
|
||||
40
vendor/Gcp/google/cloud-core/src/Batch/BatchDaemonTrait.php
vendored
Normal file
40
vendor/Gcp/google/cloud-core/src/Batch/BatchDaemonTrait.php
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
/**
|
||||
* A utility trait related to BatchDaemon functionality.
|
||||
*
|
||||
* @experimental The experimental flag means that while we believe this method
|
||||
* or class is ready for use, it may change before release in backwards-
|
||||
* incompatible ways. Please use with caution, and test thoroughly when
|
||||
* upgrading.
|
||||
*/
|
||||
trait BatchDaemonTrait
|
||||
{
|
||||
/**
|
||||
* Returns whether or not the BatchDaemon is running.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
private function isDaemonRunning()
|
||||
{
|
||||
$isDaemonRunning = \filter_var(\getenv('IS_BATCH_DAEMON_RUNNING'), \FILTER_VALIDATE_BOOLEAN);
|
||||
return $isDaemonRunning !== \false;
|
||||
}
|
||||
}
|
||||
179
vendor/Gcp/google/cloud-core/src/Batch/BatchJob.php
vendored
Normal file
179
vendor/Gcp/google/cloud-core/src/Batch/BatchJob.php
vendored
Normal file
@@ -0,0 +1,179 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\SysvTrait;
|
||||
/**
|
||||
* Represent batch jobs.
|
||||
*
|
||||
* @experimental The experimental flag means that while we believe this method
|
||||
* or class is ready for use, it may change before release in backwards-
|
||||
* incompatible ways. Please use with caution, and test thoroughly when
|
||||
* upgrading.
|
||||
*/
|
||||
class BatchJob implements JobInterface
|
||||
{
|
||||
const DEFAULT_BATCH_SIZE = 100;
|
||||
const DEFAULT_CALL_PERIOD = 2.0;
|
||||
const DEFAULT_WORKERS = 1;
|
||||
use JobTrait;
|
||||
use SysvTrait;
|
||||
use InterruptTrait;
|
||||
use HandleFailureTrait;
|
||||
/**
|
||||
* @var callable The batch job handler. This callable accepts an array
|
||||
* of items and should return a boolean.
|
||||
*/
|
||||
private $func;
|
||||
/**
|
||||
* @var int The size of the batch.
|
||||
*/
|
||||
private $batchSize;
|
||||
/**
|
||||
* @var float The period in seconds from the last execution to force
|
||||
* executing the job.
|
||||
*/
|
||||
private $callPeriod;
|
||||
/**
|
||||
* @param string $identifier Unique identifier of the job.
|
||||
* @param callable $func Any Callable except for Closure. The callable
|
||||
* should accept an array of items as the first argument.
|
||||
* @param int $idNum A numeric id for the job.
|
||||
* @param array $options [optional] {
|
||||
* Configuration options.
|
||||
*
|
||||
* @type int $batchSize The size of the batch. **Defaults to** `100`.
|
||||
* @type float $callPeriod The period in seconds from the last execution
|
||||
* to force executing the job. **Defaults to** `2.0`.
|
||||
* @type int $numWorkers The number of child processes. It only takes
|
||||
* effect with the {@see \Google\Cloud\Core\Batch\BatchDaemon}.
|
||||
* **Defaults to** `1`.
|
||||
* @type string $bootstrapFile A file to load before executing the
|
||||
* job. It's needed for registering global functions.
|
||||
* }
|
||||
*/
|
||||
public function __construct($identifier, $func, $idNum, array $options = [])
|
||||
{
|
||||
$options += ['batchSize' => self::DEFAULT_BATCH_SIZE, 'callPeriod' => self::DEFAULT_CALL_PERIOD, 'bootstrapFile' => null, 'numWorkers' => self::DEFAULT_WORKERS];
|
||||
$this->identifier = $identifier;
|
||||
$this->func = $func;
|
||||
$this->id = $idNum;
|
||||
$this->batchSize = $options['batchSize'];
|
||||
$this->callPeriod = $options['callPeriod'];
|
||||
$this->bootstrapFile = $options['bootstrapFile'];
|
||||
$this->numWorkers = $options['numWorkers'];
|
||||
$this->initFailureFile();
|
||||
}
|
||||
/**
|
||||
* Run the job.
|
||||
*/
|
||||
public function run()
|
||||
{
|
||||
$this->setupSignalHandlers();
|
||||
$sysvKey = $this->getSysvKey($this->id);
|
||||
$q = \msg_get_queue($sysvKey);
|
||||
$items = [];
|
||||
$lastInvoked = \microtime(\true);
|
||||
if (!\is_null($this->bootstrapFile)) {
|
||||
require_once $this->bootstrapFile;
|
||||
}
|
||||
while (\true) {
|
||||
// Fire SIGALRM after 1 second to unblock the blocking call.
|
||||
\pcntl_alarm(1);
|
||||
if (\msg_receive(
|
||||
$q,
|
||||
0,
|
||||
$type,
|
||||
8192,
|
||||
$message,
|
||||
\true,
|
||||
0,
|
||||
// blocking mode
|
||||
$errorcode
|
||||
)) {
|
||||
if ($type === self::$typeDirect) {
|
||||
$items[] = $message;
|
||||
} elseif ($type === self::$typeFile) {
|
||||
$items[] = \unserialize(\file_get_contents($message));
|
||||
@\unlink($message);
|
||||
}
|
||||
}
|
||||
\pcntl_signal_dispatch();
|
||||
// It runs the job when
|
||||
// 1. Number of items reaches the batchSize.
|
||||
// 2-a. Count is >0 and the current time is larger than lastInvoked + period.
|
||||
// 2-b. Count is >0 and the shutdown flag is true.
|
||||
if (\count($items) >= $this->batchSize || \count($items) > 0 && (\microtime(\true) > $lastInvoked + $this->callPeriod || $this->shutdown)) {
|
||||
\printf('Running the job with %d items' . \PHP_EOL, \count($items));
|
||||
$this->flush($items);
|
||||
$items = [];
|
||||
$lastInvoked = \microtime(\true);
|
||||
}
|
||||
\gc_collect_cycles();
|
||||
if ($this->shutdown) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Finish any pending activity for this job.
|
||||
*
|
||||
* @param array $items
|
||||
* @return bool
|
||||
*/
|
||||
public function flush(array $items = [])
|
||||
{
|
||||
if (!$this->callFunc($items)) {
|
||||
$this->handleFailure($this->id, $items);
|
||||
return \false;
|
||||
}
|
||||
return \true;
|
||||
}
|
||||
/**
|
||||
* Finish any pending activity for this job.
|
||||
*
|
||||
* @access private
|
||||
* @internal
|
||||
*
|
||||
* @param array $items
|
||||
* @return bool
|
||||
*/
|
||||
public function callFunc(array $items = [])
|
||||
{
|
||||
return \call_user_func_array($this->func, [$items]);
|
||||
}
|
||||
/**
|
||||
* Returns the period in seconds from the last execution to force
|
||||
* executing the job.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getCallPeriod()
|
||||
{
|
||||
return $this->callPeriod;
|
||||
}
|
||||
/**
|
||||
* Returns the batch size.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getBatchSize()
|
||||
{
|
||||
return $this->batchSize;
|
||||
}
|
||||
}
|
||||
191
vendor/Gcp/google/cloud-core/src/Batch/BatchRunner.php
vendored
Normal file
191
vendor/Gcp/google/cloud-core/src/Batch/BatchRunner.php
vendored
Normal file
@@ -0,0 +1,191 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\SysvTrait;
|
||||
/**
|
||||
* A class for executing jobs in batch.
|
||||
*
|
||||
* @experimental The experimental flag means that while we believe this method
|
||||
* or class is ready for use, it may change before release in backwards-
|
||||
* incompatible ways. Please use with caution, and test thoroughly when
|
||||
* upgrading.
|
||||
*/
|
||||
class BatchRunner
|
||||
{
|
||||
use BatchDaemonTrait;
|
||||
use SysvTrait;
|
||||
/**
|
||||
* @var JobConfig
|
||||
*/
|
||||
private $config;
|
||||
/**
|
||||
* @var ConfigStorageInterface
|
||||
*/
|
||||
private $configStorage;
|
||||
/**
|
||||
* @var ProcessItemInterface
|
||||
*/
|
||||
private $processor;
|
||||
/**
|
||||
* Determine internal implementation and loads the configuration.
|
||||
*
|
||||
* @param ConfigStorageInterface $configStorage [optional] The
|
||||
* ConfigStorage object to use. **Defaults to** null. This is only
|
||||
* for testing purpose.
|
||||
* @param ProcessItemInterface $processor [optional] The processor object
|
||||
* to use. **Defaults to** null. This is only for testing purpose.
|
||||
*/
|
||||
public function __construct(ConfigStorageInterface $configStorage = null, ProcessItemInterface $processor = null)
|
||||
{
|
||||
if ($configStorage === null || $processor === null) {
|
||||
if ($this->isSysvIPCLoaded() && $this->isDaemonRunning()) {
|
||||
$configStorage = new SysvConfigStorage();
|
||||
$processor = new SysvProcessor();
|
||||
} else {
|
||||
$configStorage = InMemoryConfigStorage::getInstance();
|
||||
$processor = $configStorage;
|
||||
}
|
||||
}
|
||||
$this->configStorage = $configStorage;
|
||||
$this->processor = $processor;
|
||||
$this->loadConfig();
|
||||
}
|
||||
/**
|
||||
* Register a job for batch execution.
|
||||
*
|
||||
* @param string $identifier Unique identifier of the job.
|
||||
* @param callable $func Any Callable except for Closure. The callable
|
||||
* should accept an array of items as the first argument.
|
||||
* @param array $options [optional] {
|
||||
* Configuration options.
|
||||
*
|
||||
* @type int $batchSize The size of the batch.
|
||||
* @type float $callPeriod The period in seconds from the last execution
|
||||
* to force executing the job.
|
||||
* @type int $numWorkers The number of child processes. It only takes
|
||||
* effect with the {@see \Google\Cloud\Core\Batch\BatchDaemon}.
|
||||
* @type string $bootstrapFile A file to load before executing the
|
||||
* job. It's needed for registering global functions.
|
||||
* }
|
||||
* @return bool true on success, false on failure
|
||||
* @throws \InvalidArgumentException When receiving a Closure.
|
||||
*/
|
||||
public function registerJob($identifier, $func, array $options = [])
|
||||
{
|
||||
if ($func instanceof \Closure) {
|
||||
throw new \InvalidArgumentException('Closure is not allowed');
|
||||
}
|
||||
// Always work on the latest data
|
||||
$result = $this->configStorage->lock();
|
||||
if ($result === \false) {
|
||||
return \false;
|
||||
}
|
||||
$this->config = $this->configStorage->load();
|
||||
$this->config->registerJob($identifier, function ($id) use($identifier, $func, $options) {
|
||||
return new BatchJob($identifier, $func, $id, $options);
|
||||
});
|
||||
try {
|
||||
$result = $this->configStorage->save($this->config);
|
||||
} finally {
|
||||
$this->configStorage->unlock();
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
/**
|
||||
* Submit an item.
|
||||
*
|
||||
* @param string $identifier Unique identifier of the job.
|
||||
* @param mixed $item It needs to be serializable.
|
||||
*
|
||||
* @return void
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
public function submitItem($identifier, $item)
|
||||
{
|
||||
$job = $this->getJobFromId($identifier);
|
||||
if ($job === null) {
|
||||
throw new \RuntimeException("The identifier does not exist: {$identifier}");
|
||||
}
|
||||
$idNum = $job->id();
|
||||
$this->processor->submit($item, $idNum);
|
||||
}
|
||||
/**
|
||||
* Get the job with the given identifier.
|
||||
*
|
||||
* @param string $identifier Unique identifier of the job.
|
||||
*
|
||||
* @return BatchJob|null
|
||||
*/
|
||||
public function getJobFromId($identifier)
|
||||
{
|
||||
return $this->config->getJobFromId($identifier);
|
||||
}
|
||||
/**
|
||||
* Get the job with the given numeric id.
|
||||
*
|
||||
* @param int $idNum A numeric id of the job.
|
||||
*
|
||||
* @return BatchJob|null
|
||||
*/
|
||||
public function getJobFromIdNum($idNum)
|
||||
{
|
||||
return $this->config->getJobFromIdNum($idNum);
|
||||
}
|
||||
/**
|
||||
* Get all the jobs.
|
||||
*
|
||||
* @return BatchJob[]
|
||||
*/
|
||||
public function getJobs()
|
||||
{
|
||||
return $this->config->getJobs();
|
||||
}
|
||||
/**
|
||||
* Load the config from the storage.
|
||||
*
|
||||
* @return bool true on success
|
||||
* @throws \RuntimeException when it fails to load the config.
|
||||
*/
|
||||
public function loadConfig()
|
||||
{
|
||||
$result = $this->configStorage->lock();
|
||||
if ($result === \false) {
|
||||
throw new \RuntimeException('Failed to lock the configStorage');
|
||||
}
|
||||
try {
|
||||
$result = $this->configStorage->load();
|
||||
} catch (\RuntimeException $e) {
|
||||
$this->configStorage->clear();
|
||||
throw $e;
|
||||
} finally {
|
||||
$this->configStorage->unlock();
|
||||
}
|
||||
$this->config = $result;
|
||||
return \true;
|
||||
}
|
||||
/**
|
||||
* Gets the item processor.
|
||||
*
|
||||
* @return ProcessItemInterface
|
||||
*/
|
||||
public function getProcessor()
|
||||
{
|
||||
return $this->processor;
|
||||
}
|
||||
}
|
||||
151
vendor/Gcp/google/cloud-core/src/Batch/BatchTrait.php
vendored
Normal file
151
vendor/Gcp/google/cloud-core/src/Batch/BatchTrait.php
vendored
Normal file
@@ -0,0 +1,151 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Opis\Closure\SerializableClosure;
|
||||
/**
|
||||
* A trait to assist in the registering and processing of batch jobs.
|
||||
*
|
||||
* @experimental The experimental flag means that while we believe this method
|
||||
* or class is ready for use, it may change before release in backwards-
|
||||
* incompatible ways. Please use with caution, and test thoroughly when
|
||||
* upgrading.
|
||||
*/
|
||||
trait BatchTrait
|
||||
{
|
||||
use SerializableClientTrait;
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $batchOptions;
|
||||
/**
|
||||
* @var BatchRunner
|
||||
*/
|
||||
private $batchRunner;
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $identifier;
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $batchMethod;
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $debugOutput;
|
||||
/**
|
||||
* @var resource
|
||||
*/
|
||||
private $debugOutputResource;
|
||||
/**
|
||||
* Flushes items in the batch queue that have yet to be delivered. Please
|
||||
* note this will have no effect when using the batch daemon.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function flush()
|
||||
{
|
||||
$id = $this->batchRunner->getJobFromId($this->identifier)->id();
|
||||
return $this->batchRunner->getProcessor()->flush($id);
|
||||
}
|
||||
/**
|
||||
* Deliver a list of items in a batch call.
|
||||
*
|
||||
* @param array $items
|
||||
* @return bool
|
||||
* @access private
|
||||
*/
|
||||
public function send(array $items)
|
||||
{
|
||||
$start = \microtime(\true);
|
||||
try {
|
||||
\call_user_func_array($this->getCallback(), [$items]);
|
||||
} catch (\Exception $e) {
|
||||
if ($this->debugOutput) {
|
||||
\fwrite($this->debugOutputResource, $e->getMessage() . \PHP_EOL . \PHP_EOL . $e->getTraceAsString() . \PHP_EOL);
|
||||
}
|
||||
return \false;
|
||||
}
|
||||
$end = \microtime(\true);
|
||||
if ($this->debugOutput) {
|
||||
\fwrite($this->debugOutputResource, \sprintf('%f seconds for %s: %d items' . \PHP_EOL, $end - $start, $this->batchMethod, \count($items)));
|
||||
\fwrite($this->debugOutputResource, \sprintf('memory used: %d' . \PHP_EOL, \memory_get_usage()));
|
||||
}
|
||||
return \true;
|
||||
}
|
||||
/**
|
||||
* Returns an array representation of a callback which will be used to write
|
||||
* batch items.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected abstract function getCallback();
|
||||
/**
|
||||
* @param array $options [optional] {
|
||||
* Configuration options.
|
||||
*
|
||||
* @type resource $debugOutputResource A resource to output debug output
|
||||
* to. **Defaults to** `php://stderr`.
|
||||
* @type bool $debugOutput Whether or not to output debug information.
|
||||
* Please note that unless a debug output resource is configured
|
||||
* this setting will only apply to CLI based applications.
|
||||
* **Defaults to** `false`.
|
||||
* @type array $batchOptions A set of options for a BatchJob.
|
||||
* {@see \Google\Cloud\Core\Batch\BatchJob::__construct()} for
|
||||
* more details.
|
||||
* **Defaults to** ['batchSize' => 1000,
|
||||
* 'callPeriod' => 2.0,
|
||||
* 'numWorkers' => 2].
|
||||
* @type array $clientConfig A config used to construct the client upon
|
||||
* which requests will be made.
|
||||
* @type BatchRunner $batchRunner A BatchRunner object. Mainly used for
|
||||
* the tests to inject a mock. **Defaults to** a newly created
|
||||
* BatchRunner.
|
||||
* @type string $identifier An identifier for the batch job. This
|
||||
* value must be unique across all job configs.
|
||||
* @type string $batchMethod The name of the batch method used to
|
||||
* deliver items.
|
||||
* @type ClosureSerializerInterface $closureSerializer An implementation
|
||||
* responsible for serializing closures used in the
|
||||
* `$clientConfig`. This is especially important when using the
|
||||
* batch daemon. **Defaults to**
|
||||
* {@see \Google\Cloud\Core\Batch\OpisClosureSerializer} if the
|
||||
* `opis/closure` library is installed.
|
||||
* }
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
private function setCommonBatchProperties(array $options = [])
|
||||
{
|
||||
if (!isset($options['identifier'])) {
|
||||
throw new \InvalidArgumentException('A valid identifier is required in order to register a job.');
|
||||
}
|
||||
if (!isset($options['batchMethod'])) {
|
||||
throw new \InvalidArgumentException('A batchMethod is required.');
|
||||
}
|
||||
$this->setSerializableClientOptions($options);
|
||||
$this->batchMethod = $options['batchMethod'];
|
||||
$this->identifier = $options['identifier'];
|
||||
$this->debugOutputResource = $options['debugOutputResource'] ?? \fopen('php://stderr', 'w');
|
||||
$this->debugOutput = $options['debugOutput'] ?? \false;
|
||||
$batchOptions = $options['batchOptions'] ?? [];
|
||||
$this->batchOptions = $batchOptions + ['batchSize' => 1000, 'callPeriod' => 2.0, 'numWorkers' => 2];
|
||||
$this->batchRunner = $options['batchRunner'] ?? new BatchRunner();
|
||||
$this->batchRunner->registerJob($this->identifier, [$this, 'send'], $this->batchOptions);
|
||||
}
|
||||
}
|
||||
42
vendor/Gcp/google/cloud-core/src/Batch/ClosureSerializerInterface.php
vendored
Normal file
42
vendor/Gcp/google/cloud-core/src/Batch/ClosureSerializerInterface.php
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
/**
|
||||
* An interface for serializing closures.
|
||||
*
|
||||
* @experimental The experimental flag means that while we believe this method
|
||||
* or class is ready for use, it may change before release in backwards-
|
||||
* incompatible ways. Please use with caution, and test thoroughly when
|
||||
* upgrading.
|
||||
*/
|
||||
interface ClosureSerializerInterface
|
||||
{
|
||||
/**
|
||||
* Recursively serializes closures.
|
||||
*
|
||||
* @param mixed $data
|
||||
*/
|
||||
public function wrapClosures(&$data);
|
||||
/**
|
||||
* Recursively unserializes closures.
|
||||
*
|
||||
* @param mixed $data
|
||||
*/
|
||||
public function unwrapClosures(&$data);
|
||||
}
|
||||
59
vendor/Gcp/google/cloud-core/src/Batch/ConfigStorageInterface.php
vendored
Normal file
59
vendor/Gcp/google/cloud-core/src/Batch/ConfigStorageInterface.php
vendored
Normal file
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
/**
|
||||
* An interface for storing the configuration.
|
||||
*
|
||||
* @experimental The experimental flag means that while we believe this method
|
||||
* or class is ready for use, it may change before release in backwards-
|
||||
* incompatible ways. Please use with caution, and test thoroughly when
|
||||
* upgrading.
|
||||
*/
|
||||
interface ConfigStorageInterface
|
||||
{
|
||||
/**
|
||||
* locks the storage
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function lock();
|
||||
/**
|
||||
* releases the lock
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function unlock();
|
||||
/**
|
||||
* saves the JobConfig to the storage
|
||||
* @param JobConfig $config A JobConfig to save.
|
||||
* @return bool true on success, false on failure
|
||||
*/
|
||||
public function save(JobConfig $config);
|
||||
/**
|
||||
* loads the JobConfig from the storage
|
||||
*
|
||||
* @return JobConfig
|
||||
* @throws \RuntimeException when failed to load the JobConfig.
|
||||
*/
|
||||
public function load();
|
||||
/**
|
||||
* Clear the JobConfig from storage.
|
||||
*/
|
||||
public function clear();
|
||||
}
|
||||
85
vendor/Gcp/google/cloud-core/src/Batch/HandleFailureTrait.php
vendored
Normal file
85
vendor/Gcp/google/cloud-core/src/Batch/HandleFailureTrait.php
vendored
Normal file
@@ -0,0 +1,85 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
/**
|
||||
* A utility trait for handling failed items.
|
||||
*
|
||||
* @experimental The experimental flag means that while we believe this method
|
||||
* or class is ready for use, it may change before release in backwards-
|
||||
* incompatible ways. Please use with caution, and test thoroughly when
|
||||
* upgrading.
|
||||
*/
|
||||
trait HandleFailureTrait
|
||||
{
|
||||
/**
|
||||
* @var string A filename to save the failed items.
|
||||
*/
|
||||
private $failureFile;
|
||||
/**
|
||||
* @var string Base directory for the failure files.
|
||||
*/
|
||||
private $baseDir;
|
||||
/**
|
||||
* Determine the failureFile.
|
||||
*/
|
||||
private function initFailureFile()
|
||||
{
|
||||
$this->baseDir = \getenv('GOOGLE_CLOUD_BATCH_DAEMON_FAILURE_DIR');
|
||||
if ('false' === $this->baseDir) {
|
||||
// setting the file to the string "false" will prevent logging of failed items
|
||||
return;
|
||||
}
|
||||
if ($this->baseDir === \false) {
|
||||
$this->baseDir = \sprintf('%s/batch-daemon-failure', \sys_get_temp_dir());
|
||||
}
|
||||
if (!\is_dir($this->baseDir) && !@\mkdir($this->baseDir, 0700, \true) && !\is_dir($this->baseDir)) {
|
||||
throw new \RuntimeException(\sprintf('Could not create a directory: %s', $this->baseDir));
|
||||
}
|
||||
// Use getmypid for simplicity.
|
||||
$this->failureFile = \sprintf('%s/failed-items-%d', $this->baseDir, \getmypid());
|
||||
}
|
||||
/**
|
||||
* Save the items to the failureFile. We silently abandon the items upon
|
||||
* failures in this method because there's nothing we can do.
|
||||
*
|
||||
* @param int $idNum A numeric id for the job.
|
||||
* @param array $items Items to save.
|
||||
*/
|
||||
public function handleFailure($idNum, array $items)
|
||||
{
|
||||
if (!$this->failureFile) {
|
||||
$this->initFailureFile();
|
||||
}
|
||||
if ($this->failureFile) {
|
||||
$fp = @\fopen($this->failureFile, 'a');
|
||||
@\fwrite($fp, \json_encode(\serialize([$idNum => $items])) . \PHP_EOL);
|
||||
@\fclose($fp);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Get all the filenames for the failure files.
|
||||
*
|
||||
* @return array Filenames for all the failure files.
|
||||
*/
|
||||
private function getFailedFiles()
|
||||
{
|
||||
$pattern = \sprintf('%s/failed-items-*', $this->baseDir);
|
||||
return \glob($pattern) ?: [];
|
||||
}
|
||||
}
|
||||
195
vendor/Gcp/google/cloud-core/src/Batch/InMemoryConfigStorage.php
vendored
Normal file
195
vendor/Gcp/google/cloud-core/src/Batch/InMemoryConfigStorage.php
vendored
Normal file
@@ -0,0 +1,195 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
use BadMethodCallException;
|
||||
/**
|
||||
* In-memory ConfigStorageInterface implementation.
|
||||
*
|
||||
* @experimental The experimental flag means that while we believe this method
|
||||
* or class is ready for use, it may change before release in backwards-
|
||||
* incompatible ways. Please use with caution, and test thoroughly when
|
||||
* upgrading.
|
||||
*/
|
||||
final class InMemoryConfigStorage implements ConfigStorageInterface, ProcessItemInterface
|
||||
{
|
||||
use HandleFailureTrait;
|
||||
/* @var JobConfig */
|
||||
private $config;
|
||||
/* @var array */
|
||||
private $items = [];
|
||||
/* @var array */
|
||||
private $lastInvoked = [];
|
||||
/* @var float */
|
||||
private $created;
|
||||
/* @var bool */
|
||||
private $hasShutdownHookRegistered;
|
||||
/**
|
||||
* Singleton getInstance.
|
||||
*
|
||||
* @return InMemoryConfigStorage
|
||||
*/
|
||||
public static function getInstance()
|
||||
{
|
||||
static $instance = null;
|
||||
if ($instance === null) {
|
||||
$instance = new InMemoryConfigStorage();
|
||||
}
|
||||
return $instance;
|
||||
}
|
||||
/**
|
||||
* To prevent serialize.
|
||||
*/
|
||||
public function __sleep()
|
||||
{
|
||||
throw new BadMethodCallException('Serialization not supported');
|
||||
}
|
||||
/**
|
||||
* To prevent unserialize.
|
||||
*/
|
||||
public function __wakeup()
|
||||
{
|
||||
throw new BadMethodCallException('Serialization not supported');
|
||||
}
|
||||
/**
|
||||
* To prevent cloning.
|
||||
*/
|
||||
private function __clone()
|
||||
{
|
||||
}
|
||||
/**
|
||||
* The constructor registers the shutdown function for running the job for
|
||||
* remainder items when the script exits.
|
||||
*/
|
||||
private function __construct()
|
||||
{
|
||||
$this->config = new JobConfig();
|
||||
$this->created = \microtime(\true);
|
||||
$this->initFailureFile();
|
||||
$this->hasShutdownHookRegistered = \false;
|
||||
}
|
||||
/**
|
||||
* Just return true
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function lock()
|
||||
{
|
||||
return \true;
|
||||
}
|
||||
/**
|
||||
* Just return true
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function unlock()
|
||||
{
|
||||
return \true;
|
||||
}
|
||||
/**
|
||||
* Save the given JobConfig.
|
||||
*
|
||||
* @param JobConfig $config A JobConfig to save.
|
||||
* @return bool
|
||||
*/
|
||||
public function save(JobConfig $config)
|
||||
{
|
||||
$this->config = $config;
|
||||
return \true;
|
||||
}
|
||||
/**
|
||||
* Load a JobConfig from the storage.
|
||||
*
|
||||
* @return JobConfig
|
||||
* @throws \RuntimeException when failed to load the JobConfig.
|
||||
*/
|
||||
public function load()
|
||||
{
|
||||
return $this->config;
|
||||
}
|
||||
/**
|
||||
* Clear the JobConfig from storage.
|
||||
*/
|
||||
public function clear()
|
||||
{
|
||||
$this->config = new JobConfig();
|
||||
}
|
||||
/**
|
||||
* Hold the items in memory and run the job in the same process when it
|
||||
* meets the condition.
|
||||
*
|
||||
* We want to delay registering the shutdown function. The error
|
||||
* reporter also registers a shutdown function and the order matters.
|
||||
*
|
||||
* @see \Google\Cloud\ErrorReporting\Bootstrap::init()
|
||||
* @see http://php.net/manual/en/function.register-shutdown-function.php
|
||||
*
|
||||
* @param mixed $item An item to submit.
|
||||
* @param int $idNum A numeric id for the job.
|
||||
* @return void
|
||||
*/
|
||||
public function submit($item, $idNum)
|
||||
{
|
||||
if (!$this->hasShutdownHookRegistered) {
|
||||
\register_shutdown_function([$this, 'shutdown']);
|
||||
$this->hasShutdownHookRegistered = \true;
|
||||
}
|
||||
if (!\array_key_exists($idNum, $this->items)) {
|
||||
$this->items[$idNum] = [];
|
||||
$this->lastInvoked[$idNum] = $this->created;
|
||||
}
|
||||
$this->items[$idNum][] = $item;
|
||||
$job = $this->config->getJobFromIdNum($idNum);
|
||||
$batchSize = $job->getBatchSize();
|
||||
$period = $job->getCallPeriod();
|
||||
if (\count($this->items[$idNum]) >= $batchSize || \count($this->items[$idNum]) !== 0 && \microtime(\true) > $this->lastInvoked[$idNum] + $period) {
|
||||
$this->flush($idNum);
|
||||
$this->items[$idNum] = [];
|
||||
$this->lastInvoked[$idNum] = \microtime(\true);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Run the job with the given id.
|
||||
*
|
||||
* @param int $idNum A numeric id for the job.
|
||||
* @return bool
|
||||
*/
|
||||
public function flush($idNum)
|
||||
{
|
||||
if (isset($this->items[$idNum])) {
|
||||
$job = $this->config->getJobFromIdNum($idNum);
|
||||
if (!$job->flush($this->items[$idNum])) {
|
||||
$this->handleFailure($idNum, $this->items[$idNum]);
|
||||
}
|
||||
$this->items[$idNum] = [];
|
||||
$this->lastInvoked[$idNum] = \microtime(\true);
|
||||
}
|
||||
return \true;
|
||||
}
|
||||
/**
|
||||
* Run the job for remainder items.
|
||||
*/
|
||||
public function shutdown()
|
||||
{
|
||||
foreach ($this->items as $idNum => $items) {
|
||||
if (\count($items) !== 0) {
|
||||
$this->flush($idNum);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
59
vendor/Gcp/google/cloud-core/src/Batch/InterruptTrait.php
vendored
Normal file
59
vendor/Gcp/google/cloud-core/src/Batch/InterruptTrait.php
vendored
Normal file
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
/**
|
||||
* A trait to assist in handling interrupt signals and gracefully stopping work.
|
||||
*
|
||||
* @experimental The experimental flag means that while we believe this method
|
||||
* or class is ready for use, it may change before release in backwards-
|
||||
* incompatible ways. Please use with caution, and test thoroughly when
|
||||
* upgrading.
|
||||
*/
|
||||
trait InterruptTrait
|
||||
{
|
||||
private $shutdown = \false;
|
||||
private function setupSignalHandlers()
|
||||
{
|
||||
// setup signal handlers
|
||||
\pcntl_signal(\SIGTERM, [$this, "sigHandler"]);
|
||||
\pcntl_signal(\SIGINT, [$this, "sigHandler"]);
|
||||
\pcntl_signal(\SIGHUP, [$this, "sigHandler"]);
|
||||
\pcntl_signal(\SIGALRM, [$this, "sigHandler"]);
|
||||
}
|
||||
/**
|
||||
* A signal handler for setting the terminate switch.
|
||||
*
|
||||
* @see http://php.net/manual/en/function.pcntl-signal.php
|
||||
*
|
||||
* @param int $signo The received signal.
|
||||
* @param mixed $siginfo [optional] An array representing the signal
|
||||
* information. **Defaults to** null.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function sigHandler($signo, $siginfo = null)
|
||||
{
|
||||
switch ($signo) {
|
||||
case \SIGINT:
|
||||
case \SIGTERM:
|
||||
$this->shutdown = \true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
94
vendor/Gcp/google/cloud-core/src/Batch/JobConfig.php
vendored
Normal file
94
vendor/Gcp/google/cloud-core/src/Batch/JobConfig.php
vendored
Normal file
@@ -0,0 +1,94 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
/**
|
||||
* Hold configurations for the {@see \Google\Cloud\Core\Batch\BatchRunner}.
|
||||
*
|
||||
* @experimental The experimental flag means that while we believe this method
|
||||
* or class is ready for use, it may change before release in backwards-
|
||||
* incompatible ways. Please use with caution, and test thoroughly when
|
||||
* upgrading.
|
||||
*/
|
||||
class JobConfig
|
||||
{
|
||||
/**
|
||||
* @var array Associative array of JobInterface instances keyed by
|
||||
* identifier.
|
||||
*/
|
||||
private $jobs = [];
|
||||
/**
|
||||
* @var array[string]int Associative array of job identifier to job id.
|
||||
*/
|
||||
private $identifierToId = [];
|
||||
/**
|
||||
* @var array[int]string Associative array of job id to job identifier.
|
||||
*/
|
||||
private $idToIdentifier = [];
|
||||
/**
|
||||
* Get the job with the given identifier.
|
||||
*
|
||||
* @param string $identifier Unique identifier of the job.
|
||||
*
|
||||
* @return JobInterface|null
|
||||
*/
|
||||
public function getJobFromId($identifier)
|
||||
{
|
||||
return \array_key_exists($identifier, $this->identifierToId) ? $this->jobs[$identifier] : null;
|
||||
}
|
||||
/**
|
||||
* Get the job with the given numeric id.
|
||||
*
|
||||
* @param int $idNum A numeric id of the job.
|
||||
*
|
||||
* @return JobInterface|null
|
||||
*/
|
||||
public function getJobFromIdNum($idNum)
|
||||
{
|
||||
return \array_key_exists($idNum, $this->idToIdentifier) ? $this->jobs[$this->idToIdentifier[$idNum]] : null;
|
||||
}
|
||||
/**
|
||||
* Register a job for executing in batch.
|
||||
*
|
||||
* @param string $identifier Unique identifier of the job.
|
||||
* @param callable $callback Callback that accepts the job $idNum
|
||||
* and returns a JobInterface instance.
|
||||
* @return void
|
||||
*/
|
||||
public function registerJob($identifier, $callback)
|
||||
{
|
||||
if (\array_key_exists($identifier, $this->identifierToId)) {
|
||||
$idNum = $this->identifierToId[$identifier];
|
||||
} else {
|
||||
$idNum = \count($this->identifierToId) + 1;
|
||||
$this->idToIdentifier[$idNum] = $identifier;
|
||||
}
|
||||
$this->jobs[$identifier] = \call_user_func($callback, $idNum);
|
||||
$this->identifierToId[$identifier] = $idNum;
|
||||
}
|
||||
/**
|
||||
* Get all the jobs indexed by the job's identifier.
|
||||
*
|
||||
* @return array Associative array of JobInterface instances keyed by a
|
||||
* string identifier.
|
||||
*/
|
||||
public function getJobs()
|
||||
{
|
||||
return $this->jobs;
|
||||
}
|
||||
}
|
||||
54
vendor/Gcp/google/cloud-core/src/Batch/JobInterface.php
vendored
Normal file
54
vendor/Gcp/google/cloud-core/src/Batch/JobInterface.php
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
/**
|
||||
* The JobInterface represents any job that can be serialized and run in a
|
||||
* separate process via the Batch daemon.
|
||||
*
|
||||
* @experimental The experimental flag means that while we believe this method
|
||||
* or class is ready for use, it may change before release in backwards-
|
||||
* incompatible ways. Please use with caution, and test thoroughly when
|
||||
* upgrading.
|
||||
*/
|
||||
interface JobInterface
|
||||
{
|
||||
/**
|
||||
* Runs the job loop. This is expected to be a blocking call.
|
||||
*/
|
||||
public function run();
|
||||
/**
|
||||
* Return the job identifier
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function identifier();
|
||||
/**
|
||||
* Returns the number of workers for this job.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function numWorkers();
|
||||
/**
|
||||
* Finish any pending activity for this job.
|
||||
*
|
||||
* @param array $items
|
||||
* @return bool
|
||||
*/
|
||||
public function flush(array $items = []);
|
||||
}
|
||||
96
vendor/Gcp/google/cloud-core/src/Batch/JobTrait.php
vendored
Normal file
96
vendor/Gcp/google/cloud-core/src/Batch/JobTrait.php
vendored
Normal file
@@ -0,0 +1,96 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
/**
|
||||
* A trait to assist in implementing the JobInterface
|
||||
*
|
||||
* @experimental The experimental flag means that while we believe this method
|
||||
* or class is ready for use, it may change before release in backwards-
|
||||
* incompatible ways. Please use with caution, and test thoroughly when
|
||||
* upgrading.
|
||||
*/
|
||||
trait JobTrait
|
||||
{
|
||||
/**
|
||||
* @var string The job identifier
|
||||
*/
|
||||
private $identifier;
|
||||
/**
|
||||
* @var int The job id
|
||||
*/
|
||||
private $id;
|
||||
/**
|
||||
* @var int The number of workers for this job.
|
||||
*/
|
||||
private $numWorkers;
|
||||
/**
|
||||
* @var string|null An optional file that is required to run this job.
|
||||
*/
|
||||
private $bootstrapFile;
|
||||
/**
|
||||
* Return the job identifier
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function identifier()
|
||||
{
|
||||
return $this->identifier;
|
||||
}
|
||||
/**
|
||||
* Return the job id
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function id()
|
||||
{
|
||||
return $this->id;
|
||||
}
|
||||
/**
|
||||
* Returns the number of workers for this job. **Defaults to* 1.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function numWorkers()
|
||||
{
|
||||
return $this->numWorkers;
|
||||
}
|
||||
/**
|
||||
* Returns the optional file required to run this job.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function bootstrapFile()
|
||||
{
|
||||
return $this->bootstrapFile;
|
||||
}
|
||||
/**
|
||||
* Runs the job loop. This is expected to be a blocking call.
|
||||
*/
|
||||
public abstract function run();
|
||||
/**
|
||||
* Finish any pending activity for this job.
|
||||
*
|
||||
* @param array $items
|
||||
* @return bool
|
||||
*/
|
||||
public function flush(array $items = [])
|
||||
{
|
||||
return \false;
|
||||
}
|
||||
}
|
||||
54
vendor/Gcp/google/cloud-core/src/Batch/OpisClosureSerializer.php
vendored
Normal file
54
vendor/Gcp/google/cloud-core/src/Batch/OpisClosureSerializer.php
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Opis\Closure\SerializableClosure;
|
||||
/**
|
||||
* A closure serializer utilizing
|
||||
* [Opis Closure Library](https://github.com/opis/closure).
|
||||
*
|
||||
* @experimental The experimental flag means that while we believe this method
|
||||
* or class is ready for use, it may change before release in backwards-
|
||||
* incompatible ways. Please use with caution, and test thoroughly when
|
||||
* upgrading.
|
||||
*/
|
||||
class OpisClosureSerializer implements ClosureSerializerInterface
|
||||
{
|
||||
/**
|
||||
* Recursively serializes closures.
|
||||
*
|
||||
* @param mixed $data
|
||||
*/
|
||||
public function wrapClosures(&$data)
|
||||
{
|
||||
SerializableClosure::enterContext();
|
||||
SerializableClosure::wrapClosures($data);
|
||||
SerializableClosure::exitContext();
|
||||
}
|
||||
/**
|
||||
* Recursively unserializes closures.
|
||||
*
|
||||
* @param mixed $data
|
||||
*/
|
||||
public function unwrapClosures(&$data)
|
||||
{
|
||||
SerializableClosure::enterContext();
|
||||
SerializableClosure::unwrapClosures($data);
|
||||
SerializableClosure::exitContext();
|
||||
}
|
||||
}
|
||||
46
vendor/Gcp/google/cloud-core/src/Batch/ProcessItemInterface.php
vendored
Normal file
46
vendor/Gcp/google/cloud-core/src/Batch/ProcessItemInterface.php
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
/**
|
||||
* An interface for processing the items.
|
||||
*
|
||||
* @experimental The experimental flag means that while we believe this method
|
||||
* or class is ready for use, it may change before release in backwards-
|
||||
* incompatible ways. Please use with caution, and test thoroughly when
|
||||
* upgrading.
|
||||
*/
|
||||
interface ProcessItemInterface
|
||||
{
|
||||
/**
|
||||
* Submit a job for async processing.
|
||||
*
|
||||
* @param mixed $item An item to submit.
|
||||
* @param int $idNum A numeric id of the job.
|
||||
* @return void
|
||||
* @throws \RuntimeException when failed to store the item.
|
||||
*/
|
||||
public function submit($item, $idNum);
|
||||
/**
|
||||
* Run the job with the given id.
|
||||
*
|
||||
* @param int $idNum A numeric id of the job.
|
||||
* @return bool
|
||||
*/
|
||||
public function flush($idNum);
|
||||
}
|
||||
35
vendor/Gcp/google/cloud-core/src/Batch/QueueOverflowException.php
vendored
Normal file
35
vendor/Gcp/google/cloud-core/src/Batch/QueueOverflowException.php
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2020 Google LLC
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
/**
|
||||
* Exception thrown in {@see \Google\Cloud\Core\Batch\SysvProcessor::submit()}
|
||||
* method when it cannot add an item to the message queue.
|
||||
* Possible causes include:
|
||||
*
|
||||
* - batch daemon is not running
|
||||
* - no job registered for this queue
|
||||
* - items are submitted faster than a job can handle them
|
||||
*/
|
||||
class QueueOverflowException extends \RuntimeException
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct('Item queue overflow. Check that the batch daemon is running.');
|
||||
}
|
||||
}
|
||||
74
vendor/Gcp/google/cloud-core/src/Batch/Retry.php
vendored
Normal file
74
vendor/Gcp/google/cloud-core/src/Batch/Retry.php
vendored
Normal file
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
/**
|
||||
* A class for retrying the failed items.
|
||||
*
|
||||
* @experimental The experimental flag means that while we believe this method
|
||||
* or class is ready for use, it may change before release in backwards-
|
||||
* incompatible ways. Please use with caution, and test thoroughly when
|
||||
* upgrading.
|
||||
*/
|
||||
class Retry
|
||||
{
|
||||
use HandleFailureTrait;
|
||||
/* @var BatchRunner */
|
||||
private $runner;
|
||||
/**
|
||||
* Initialize a BatchRunner and $failureFile.
|
||||
*
|
||||
* @param BatchRunner $runner [optional] **Defaults to** a new BatchRunner.
|
||||
*/
|
||||
public function __construct(BatchRunner $runner = null)
|
||||
{
|
||||
$this->runner = $runner ?: new BatchRunner();
|
||||
$this->initFailureFile();
|
||||
}
|
||||
/**
|
||||
* Retry all the failed items.
|
||||
*/
|
||||
public function retryAll()
|
||||
{
|
||||
foreach ($this->getFailedFiles() as $file) {
|
||||
// Rename the file first
|
||||
$tmpFile = \dirname($file) . '/retrying-' . \basename($file);
|
||||
\rename($file, $tmpFile);
|
||||
$fp = @\fopen($tmpFile, 'r');
|
||||
if ($fp === \false) {
|
||||
\fwrite(\STDERR, \sprintf('Could not open the file: %s' . \PHP_EOL, $tmpFile));
|
||||
continue;
|
||||
}
|
||||
while ($line = \fgets($fp)) {
|
||||
$jsonDecodedValue = \json_decode($line);
|
||||
// Check if data json_encoded after serialization
|
||||
if ($jsonDecodedValue !== null || $jsonDecodedValue !== \false) {
|
||||
$line = $jsonDecodedValue;
|
||||
}
|
||||
$a = \unserialize($line);
|
||||
$idNum = \key($a);
|
||||
$job = $this->runner->getJobFromIdNum($idNum);
|
||||
if (!$job->callFunc($a[$idNum])) {
|
||||
$this->handleFailure($idNum, $a[$idNum]);
|
||||
}
|
||||
}
|
||||
@\fclose($fp);
|
||||
@\unlink($tmpFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
90
vendor/Gcp/google/cloud-core/src/Batch/SerializableClientTrait.php
vendored
Normal file
90
vendor/Gcp/google/cloud-core/src/Batch/SerializableClientTrait.php
vendored
Normal file
@@ -0,0 +1,90 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Opis\Closure\SerializableClosure;
|
||||
/**
|
||||
* A trait to assist in serializing/deserializing client configuration that may
|
||||
* contain closures.
|
||||
*
|
||||
* @experimental The experimental flag means that while we believe this method
|
||||
* or class is ready for use, it may change before release in backwards-
|
||||
* incompatible ways. Please use with caution, and test thoroughly when
|
||||
* upgrading.
|
||||
*/
|
||||
trait SerializableClientTrait
|
||||
{
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $clientConfig;
|
||||
/**
|
||||
* @var ClosureSerializerInterface|null
|
||||
*/
|
||||
private $closureSerializer;
|
||||
/**
|
||||
* @param array $options {
|
||||
* Configuration options.
|
||||
*
|
||||
* @type ClosureSerializerInterface $closureSerializer An implementation
|
||||
* responsible for serializing closures used in the
|
||||
* `$clientConfig`. This is especially important when using the
|
||||
* batch daemon. **Defaults to**
|
||||
* {@see \Google\Cloud\Core\Batch\OpisClosureSerializer} if the
|
||||
* `opis/closure` library is installed.
|
||||
* @type array $clientConfig A config used to construct the client upon
|
||||
* which requests will be made.
|
||||
* }
|
||||
*/
|
||||
private function setSerializableClientOptions(array $options)
|
||||
{
|
||||
$options += ['closureSerializer' => null, 'clientConfig' => []];
|
||||
$this->closureSerializer = $options['closureSerializer'] ?? $this->getDefaultClosureSerializer();
|
||||
$this->setWrappedClientConfig($options);
|
||||
}
|
||||
/**
|
||||
* @param array $options
|
||||
*/
|
||||
private function setWrappedClientConfig(array $options)
|
||||
{
|
||||
$config = $options['clientConfig'] ?? [];
|
||||
if ($config && $this->closureSerializer) {
|
||||
$this->closureSerializer->wrapClosures($config);
|
||||
}
|
||||
$this->clientConfig = $config;
|
||||
}
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
private function getUnwrappedClientConfig()
|
||||
{
|
||||
if ($this->clientConfig && $this->closureSerializer) {
|
||||
$this->closureSerializer->unwrapClosures($this->clientConfig);
|
||||
}
|
||||
return $this->clientConfig;
|
||||
}
|
||||
/**
|
||||
* @return ClosureSerializerInterface|null
|
||||
*/
|
||||
private function getDefaultClosureSerializer()
|
||||
{
|
||||
if (\class_exists(SerializableClosure::class)) {
|
||||
return new OpisClosureSerializer();
|
||||
}
|
||||
}
|
||||
}
|
||||
69
vendor/Gcp/google/cloud-core/src/Batch/SimpleJob.php
vendored
Normal file
69
vendor/Gcp/google/cloud-core/src/Batch/SimpleJob.php
vendored
Normal file
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
/**
|
||||
* Represents a simple job that runs a single method that loops forever.
|
||||
*
|
||||
* @experimental The experimental flag means that while we believe this method
|
||||
* or class is ready for use, it may change before release in backwards-
|
||||
* incompatible ways. Please use with caution, and test thoroughly when
|
||||
* upgrading.
|
||||
*/
|
||||
class SimpleJob implements JobInterface
|
||||
{
|
||||
use JobTrait;
|
||||
/**
|
||||
* @var callable
|
||||
*/
|
||||
private $func;
|
||||
/**
|
||||
* Creates a new Simple Job.
|
||||
*
|
||||
* @param string $identifier Unique identifier of the job.
|
||||
* @param callable $func Any Callable except for Closure. The callable
|
||||
* should not accept arguments and should loop forever.
|
||||
* @param int $id The job id.
|
||||
* @param array $options [optional] {
|
||||
* Configuration options.
|
||||
*
|
||||
* @type string $bootstrapFile A file to load before executing the job.
|
||||
* It's needed for registering global functions.
|
||||
* @type int $numWorkers The number of workers for this job.
|
||||
* }
|
||||
*/
|
||||
public function __construct($identifier, $func, $id, array $options = [])
|
||||
{
|
||||
$this->identifier = $identifier;
|
||||
$this->func = $func;
|
||||
$this->id = $id;
|
||||
$options += ['bootstrapFile' => null, 'numWorkers' => 1];
|
||||
$this->numWorkers = $options['numWorkers'];
|
||||
$this->bootstrapFile = $options['bootstrapFile'];
|
||||
}
|
||||
/**
|
||||
* Runs the job loop. This is expected to be a blocking call.
|
||||
*/
|
||||
public function run()
|
||||
{
|
||||
if ($this->bootstrapFile) {
|
||||
require_once $this->bootstrapFile;
|
||||
}
|
||||
\call_user_func($this->func);
|
||||
}
|
||||
}
|
||||
91
vendor/Gcp/google/cloud-core/src/Batch/SimpleJobTrait.php
vendored
Normal file
91
vendor/Gcp/google/cloud-core/src/Batch/SimpleJobTrait.php
vendored
Normal file
@@ -0,0 +1,91 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\SysvTrait;
|
||||
/**
|
||||
* A trait to assist in the registering and processing of simple jobs.
|
||||
*
|
||||
* @experimental The experimental flag means that while we believe this method
|
||||
* or class is ready for use, it may change before release in backwards-
|
||||
* incompatible ways. Please use with caution, and test thoroughly when
|
||||
* upgrading.
|
||||
*/
|
||||
trait SimpleJobTrait
|
||||
{
|
||||
use BatchDaemonTrait;
|
||||
use SysvTrait;
|
||||
use SerializableClientTrait;
|
||||
/**
|
||||
* The simple loop function. This method is expected to be a blocking call.
|
||||
*/
|
||||
public abstract function run();
|
||||
/**
|
||||
* Registers this object as a SimpleJob.
|
||||
*
|
||||
* @param array $options [optional] {
|
||||
* Configuration options.
|
||||
*
|
||||
* @type string $identifier An identifier for the simple job. This
|
||||
* value must be unique across all job configs.
|
||||
* @type ConfigStorageInterface $configStorage The configuration storage
|
||||
* used to save configuration.
|
||||
* @type int $numWorkers The number of workers for this job.
|
||||
* @type array $clientConfig A config used to construct the client upon
|
||||
* which requests will be made.
|
||||
* @type ClosureSerializerInterface $closureSerializer An implementation
|
||||
* responsible for serializing closures used in the
|
||||
* `$clientConfig`. This is especially important when using the
|
||||
* batch daemon. **Defaults to**
|
||||
* {@see \Google\Cloud\Core\Batch\OpisClosureSerializer} if the
|
||||
* `opis/closure` library is installed.
|
||||
* }
|
||||
*/
|
||||
private function setSimpleJobProperties(array $options = [])
|
||||
{
|
||||
if (!isset($options['identifier'])) {
|
||||
throw new \InvalidArgumentException('A valid identifier is required in order to register a job.');
|
||||
}
|
||||
$options += ['configStorage' => null];
|
||||
$this->setSerializableClientOptions($options);
|
||||
$identifier = $options['identifier'];
|
||||
$configStorage = $options['configStorage'] ?: $this->defaultConfigStorage();
|
||||
$result = $configStorage->lock();
|
||||
if ($result === \false) {
|
||||
return \false;
|
||||
}
|
||||
$config = $configStorage->load();
|
||||
$config->registerJob($identifier, function ($id) use($identifier, $options) {
|
||||
return new SimpleJob($identifier, [$this, 'run'], $id, $options);
|
||||
});
|
||||
try {
|
||||
$result = $configStorage->save($config);
|
||||
} finally {
|
||||
$configStorage->unlock();
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
private function defaultConfigStorage()
|
||||
{
|
||||
if ($this->isSysvIPCLoaded() && $this->isDaemonRunning()) {
|
||||
return new SysvConfigStorage();
|
||||
} else {
|
||||
return InMemoryConfigStorage::getInstance();
|
||||
}
|
||||
}
|
||||
}
|
||||
148
vendor/Gcp/google/cloud-core/src/Batch/SysvConfigStorage.php
vendored
Normal file
148
vendor/Gcp/google/cloud-core/src/Batch/SysvConfigStorage.php
vendored
Normal file
@@ -0,0 +1,148 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
/**
|
||||
* ConfigStorageInterface implementation with SystemV IPC shared memory.
|
||||
*
|
||||
* @experimental The experimental flag means that while we believe this method
|
||||
* or class is ready for use, it may change before release in backwards-
|
||||
* incompatible ways. Please use with caution, and test thoroughly when
|
||||
* upgrading.
|
||||
*/
|
||||
class SysvConfigStorage implements ConfigStorageInterface
|
||||
{
|
||||
const VAR_KEY = 1;
|
||||
const DEFAULT_SHM_SIZE = 200000;
|
||||
const DEFAULT_PERM = 0600;
|
||||
const DEFAULT_PROJECT = 'A';
|
||||
/* @var int */
|
||||
private $sysvKey;
|
||||
/* @var int */
|
||||
private $semid;
|
||||
/* @var int */
|
||||
private $shmSize;
|
||||
/* @var int */
|
||||
private $perm;
|
||||
/* @var string */
|
||||
private $project;
|
||||
/**
|
||||
* Prepare the key for semaphore and shared memory.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->shmSize = \intval(\getenv('GOOGLE_CLOUD_BATCH_SHM_SIZE'));
|
||||
if ($this->shmSize === 0) {
|
||||
$this->shmSize = self::DEFAULT_SHM_SIZE;
|
||||
}
|
||||
$this->perm = \octdec(\getenv('GOOGLE_CLOUD_BATCH_PERM'));
|
||||
if ($this->perm === 0) {
|
||||
$this->perm = self::DEFAULT_PERM;
|
||||
}
|
||||
$this->project = \getenv('GOOGLE_CLOUD_BATCH_PROJECT');
|
||||
if ($this->project === \false) {
|
||||
$this->project = self::DEFAULT_PROJECT;
|
||||
}
|
||||
$this->sysvKey = \ftok(__FILE__, $this->project);
|
||||
$this->semid = \sem_get($this->sysvKey, 1, $this->perm, 1);
|
||||
}
|
||||
/**
|
||||
* Acquire a lock.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function lock()
|
||||
{
|
||||
return \sem_acquire($this->semid);
|
||||
}
|
||||
/**
|
||||
* Release a lock.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function unlock()
|
||||
{
|
||||
return \sem_release($this->semid);
|
||||
}
|
||||
/**
|
||||
* Save the given JobConfig.
|
||||
*
|
||||
* @param JobConfig $config A JobConfig to save.
|
||||
* @return bool
|
||||
* @throws \RuntimeException when failed to attach to the shared memory or serialization fails
|
||||
*/
|
||||
public function save(JobConfig $config)
|
||||
{
|
||||
$shmid = \shm_attach($this->sysvKey, $this->shmSize, $this->perm);
|
||||
if ($shmid === \false) {
|
||||
throw new \RuntimeException('Failed to attach to the shared memory');
|
||||
}
|
||||
// If the variable write fails, clear the memory and re-raise the exception
|
||||
try {
|
||||
$result = \shm_put_var($shmid, self::VAR_KEY, $config);
|
||||
} catch (\Exception $e) {
|
||||
$this->clear();
|
||||
throw new \RuntimeException($e->getMessage());
|
||||
} finally {
|
||||
\shm_detach($shmid);
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
/**
|
||||
* Load a JobConfig from the storage.
|
||||
*
|
||||
* @return JobConfig
|
||||
* @throws \RuntimeException when failed to attach to the shared memory or deserialization fails
|
||||
*/
|
||||
public function load()
|
||||
{
|
||||
$shmid = \shm_attach($this->sysvKey, $this->shmSize, $this->perm);
|
||||
if ($shmid === \false) {
|
||||
throw new \RuntimeException('Failed to attach to the shared memory');
|
||||
}
|
||||
if (!\shm_has_var($shmid, self::VAR_KEY)) {
|
||||
$result = new JobConfig();
|
||||
} else {
|
||||
$result = \shm_get_var($shmid, self::VAR_KEY);
|
||||
}
|
||||
\shm_detach($shmid);
|
||||
if ($result === \false) {
|
||||
throw new \RuntimeException('Failed to deserialize data from shared memory');
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
/**
|
||||
* Clear the JobConfig from storage.
|
||||
*/
|
||||
public function clear()
|
||||
{
|
||||
$shmid = \shm_attach($this->sysvKey, $this->shmSize, $this->perm);
|
||||
\shm_remove_var($shmid, self::VAR_KEY);
|
||||
}
|
||||
/**
|
||||
* Serialize the object
|
||||
*/
|
||||
public function __serialize()
|
||||
{
|
||||
$vars = \get_object_vars($this);
|
||||
// As of PHP 8.0, "semid" is the unserializable object "SysvSemaphore"
|
||||
// @see https://github.com/googleapis/google-cloud-php/issues/3749
|
||||
unset($vars['semid']);
|
||||
return $vars;
|
||||
}
|
||||
}
|
||||
75
vendor/Gcp/google/cloud-core/src/Batch/SysvProcessor.php
vendored
Normal file
75
vendor/Gcp/google/cloud-core/src/Batch/SysvProcessor.php
vendored
Normal file
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Batch;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\SysvTrait;
|
||||
/**
|
||||
* ProcessItemInterface implementation with SysV IPC message queue.
|
||||
*
|
||||
* @experimental The experimental flag means that while we believe this method
|
||||
* or class is ready for use, it may change before release in backwards-
|
||||
* incompatible ways. Please use with caution, and test thoroughly when
|
||||
* upgrading.
|
||||
*/
|
||||
class SysvProcessor implements ProcessItemInterface
|
||||
{
|
||||
use BatchDaemonTrait;
|
||||
use SysvTrait;
|
||||
/* @var array */
|
||||
private $sysvQs = [];
|
||||
/**
|
||||
* Submit an item for async processing.
|
||||
*
|
||||
* @param mixed $item An item to submit.
|
||||
* @param int $idNum A numeric id of the job.
|
||||
* @return void
|
||||
*
|
||||
* @throws \RuntimeException when failed to store the item.
|
||||
*/
|
||||
public function submit($item, $idNum)
|
||||
{
|
||||
if (!\array_key_exists($idNum, $this->sysvQs)) {
|
||||
$this->sysvQs[$idNum] = \msg_get_queue($this->getSysvKey($idNum));
|
||||
}
|
||||
$result = @\msg_send($this->sysvQs[$idNum], self::$typeDirect, $item, \true, \false);
|
||||
if ($result === \false) {
|
||||
// Try to put the content in a temp file and send the filename.
|
||||
$tempFile = \tempnam(\sys_get_temp_dir(), 'Item');
|
||||
$result = \file_put_contents($tempFile, \serialize($item));
|
||||
if ($result === \false) {
|
||||
throw new \RuntimeException("Failed to write to {$tempFile} while submiting the item");
|
||||
}
|
||||
$result = @\msg_send($this->sysvQs[$idNum], self::$typeFile, $tempFile, \true, \false);
|
||||
if ($result === \false) {
|
||||
@\unlink($tempFile);
|
||||
throw new QueueOverflowException();
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Run the job with the given id. This has no effect and simply always
|
||||
* returns false when using the batch daemon.
|
||||
*
|
||||
* @param int $idNum A numeric id of the job.
|
||||
* @return bool
|
||||
*/
|
||||
public function flush($idNum)
|
||||
{
|
||||
return \false;
|
||||
}
|
||||
}
|
||||
90
vendor/Gcp/google/cloud-core/src/Blob.php
vendored
Normal file
90
vendor/Gcp/google/cloud-core/src/Blob.php
vendored
Normal file
@@ -0,0 +1,90 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2017 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\Psr7\Utils;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Psr\Http\Message\StreamInterface;
|
||||
/**
|
||||
* Represents a Blob value.
|
||||
*
|
||||
* Blobs can be used to store binary across data various Google Cloud services.
|
||||
*
|
||||
* Example:
|
||||
* ```
|
||||
* use Google\Cloud\Core\Blob;
|
||||
*
|
||||
* $blob = new Blob(file_get_contents(__DIR__ .'/family-photo.jpg'));
|
||||
* ```
|
||||
*
|
||||
* ```
|
||||
* // Get the value of a blob by casting to a string.
|
||||
*
|
||||
* echo (string) $blob;
|
||||
* ```
|
||||
*/
|
||||
class Blob implements \JsonSerializable
|
||||
{
|
||||
/**
|
||||
* @var mixed
|
||||
*/
|
||||
private $value;
|
||||
/**
|
||||
* Create a blob
|
||||
*
|
||||
* @param string|resource|StreamInterface $value The blob value
|
||||
*/
|
||||
public function __construct($value)
|
||||
{
|
||||
$this->value = Utils::streamFor($value);
|
||||
}
|
||||
/**
|
||||
* Get the blob contents as a stream
|
||||
*
|
||||
* Example:
|
||||
* ```
|
||||
* $value = $blob->get();
|
||||
* ```
|
||||
*
|
||||
* @return StreamInterface
|
||||
*/
|
||||
public function get()
|
||||
{
|
||||
return $this->value;
|
||||
}
|
||||
/**
|
||||
* Cast the blob to a string
|
||||
*
|
||||
* @access private
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return (string) $this->value;
|
||||
}
|
||||
/**
|
||||
* Implement JsonSerializable by returning a base64 encoded string of the blob
|
||||
*
|
||||
* @return string
|
||||
* @access private
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function jsonSerialize()
|
||||
{
|
||||
return \base64_encode((string) $this->value);
|
||||
}
|
||||
}
|
||||
35
vendor/Gcp/google/cloud-core/src/CallTrait.php
vendored
Normal file
35
vendor/Gcp/google/cloud-core/src/CallTrait.php
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2016 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core;
|
||||
|
||||
/**
|
||||
* Provide magic method support for fetching values from results
|
||||
*/
|
||||
trait CallTrait
|
||||
{
|
||||
/**
|
||||
* @access private
|
||||
*/
|
||||
public function __call($name, array $args)
|
||||
{
|
||||
if (!isset($this->info()[$name])) {
|
||||
\trigger_error(\sprintf('Call to undefined method %s::%s', __CLASS__, $name), \E_USER_ERROR);
|
||||
}
|
||||
return $this->info()[$name];
|
||||
}
|
||||
}
|
||||
203
vendor/Gcp/google/cloud-core/src/ClientTrait.php
vendored
Normal file
203
vendor/Gcp/google/cloud-core/src/ClientTrait.php
vendored
Normal file
@@ -0,0 +1,203 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2016 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\CredentialsLoader;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Credentials\GCECredentials;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Compute\Metadata;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Exception\GoogleException;
|
||||
/**
|
||||
* Provides functionality common to each service client.
|
||||
*/
|
||||
trait ClientTrait
|
||||
{
|
||||
use JsonTrait;
|
||||
/**
|
||||
* @var string|null The project ID created in the Google Developers Console.
|
||||
*/
|
||||
private $projectId;
|
||||
/**
|
||||
* Get either a gRPC or REST connection based on the provided config
|
||||
* and the system dependencies available.
|
||||
*
|
||||
* @param array $config
|
||||
* @return string
|
||||
* @throws GoogleException
|
||||
*/
|
||||
private function getConnectionType(array $config)
|
||||
{
|
||||
$isGrpcExtensionLoaded = $this->isGrpcLoaded();
|
||||
$defaultTransport = $isGrpcExtensionLoaded ? 'grpc' : 'rest';
|
||||
$transport = \strtolower($config['transport'] ?? $defaultTransport);
|
||||
if ($transport === 'grpc') {
|
||||
if (!$isGrpcExtensionLoaded) {
|
||||
throw new GoogleException('gRPC support has been requested but required dependencies ' . 'have not been found. ' . $this->getGrpcInstallationMessage());
|
||||
}
|
||||
}
|
||||
return $transport;
|
||||
}
|
||||
/**
|
||||
* Throw an exception if the gRPC extension is not loaded.
|
||||
*
|
||||
* @throws GoogleException
|
||||
*/
|
||||
private function requireGrpc()
|
||||
{
|
||||
if (!$this->isGrpcLoaded()) {
|
||||
throw new GoogleException('The requested client requires the gRPC extension. ' . $this->getGrpcInstallationMessage());
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
private function getGrpcInstallationMessage()
|
||||
{
|
||||
return 'Please see https://cloud.google.com/php/grpc for installation ' . 'instructions.';
|
||||
}
|
||||
/**
|
||||
* Fetch and validate the keyfile and set the project ID.
|
||||
*
|
||||
* @param array $config
|
||||
* @return array
|
||||
* @throws GoogleException
|
||||
*/
|
||||
private function configureAuthentication(array $config)
|
||||
{
|
||||
$config['keyFile'] = $this->getKeyFile($config);
|
||||
$this->projectId = $this->detectProjectId($config);
|
||||
return $config;
|
||||
}
|
||||
/**
|
||||
* Get a keyfile if it exists.
|
||||
*
|
||||
* Process:
|
||||
* 1. If $config['keyFile'] is set, use that.
|
||||
* 2. If $config['keyFilePath'] is set, load the file and use that.
|
||||
* 3. If GOOGLE_APPLICATION_CREDENTIALS environment variable is set, load
|
||||
* from that location and use that.
|
||||
* 4. If OS-specific well-known-file is set, load from that location and use
|
||||
* that.
|
||||
*
|
||||
* @param array $config
|
||||
* @return array|null Key data
|
||||
* @throws GoogleException
|
||||
*/
|
||||
private function getKeyFile(array $config = [])
|
||||
{
|
||||
$config += ['keyFile' => null, 'keyFilePath' => null];
|
||||
if ($config['keyFile']) {
|
||||
return $config['keyFile'];
|
||||
}
|
||||
if ($config['keyFilePath']) {
|
||||
if (!\file_exists($config['keyFilePath'])) {
|
||||
throw new GoogleException(\sprintf('Given keyfile path %s does not exist', $config['keyFilePath']));
|
||||
}
|
||||
try {
|
||||
$keyFileData = $this->jsonDecode(\file_get_contents($config['keyFilePath']), \true);
|
||||
} catch (\InvalidArgumentException $ex) {
|
||||
throw new GoogleException(\sprintf('Given keyfile at path %s was invalid', $config['keyFilePath']));
|
||||
}
|
||||
return $keyFileData;
|
||||
}
|
||||
return CredentialsLoader::fromEnv() ?: CredentialsLoader::fromWellKnownFile();
|
||||
}
|
||||
/**
|
||||
* Detect and return a project ID.
|
||||
*
|
||||
* Process:
|
||||
* 1. If $config['projectId'] is set, use that.
|
||||
* 2. If an emulator is enabled, return a dummy value.
|
||||
* 3. If $config['keyFile'] is set, attempt to retrieve a project ID from
|
||||
* that.
|
||||
* 4. Check `GOOGLE_CLOUD_PROJECT` environment variable.
|
||||
* 5. Check `GCLOUD_PROJECT` environment variable.
|
||||
* 6. If code is running on compute engine, try to get the project ID from
|
||||
* the metadata store.
|
||||
* 7. Throw exception.
|
||||
*
|
||||
* @param array $config
|
||||
* @return string
|
||||
* @throws GoogleException
|
||||
*/
|
||||
private function detectProjectId(array $config)
|
||||
{
|
||||
$config += ['httpHandler' => null, 'projectId' => null, 'projectIdRequired' => \false, 'hasEmulator' => \false, 'preferNumericProjectId' => \false, 'suppressKeyFileNotice' => \false];
|
||||
if ($config['projectId']) {
|
||||
return $config['projectId'];
|
||||
}
|
||||
if ($config['hasEmulator']) {
|
||||
return 'emulator-project';
|
||||
}
|
||||
if (isset($config['keyFile'])) {
|
||||
if (isset($config['keyFile']['project_id'])) {
|
||||
return $config['keyFile']['project_id'];
|
||||
}
|
||||
if ($config['suppressKeyFileNotice'] !== \true) {
|
||||
$serviceAccountUri = 'https://cloud.google.com/iam/docs/' . 'creating-managing-service-account-keys#creating_service_account_keys';
|
||||
\trigger_error(\sprintf('A keyfile was given, but it does not contain a project ' . 'ID. This can indicate an old and obsolete keyfile, ' . 'in which case you should create a new one. To suppress ' . 'this message, set `suppressKeyFileNotice` to `true` in your client configuration. ' . 'To learn more about generating new keys, see this URL: %s', $serviceAccountUri), \E_USER_NOTICE);
|
||||
}
|
||||
}
|
||||
if (\getenv('GOOGLE_CLOUD_PROJECT')) {
|
||||
return \getenv('GOOGLE_CLOUD_PROJECT');
|
||||
}
|
||||
if (\getenv('GCLOUD_PROJECT')) {
|
||||
return \getenv('GCLOUD_PROJECT');
|
||||
}
|
||||
if ($this->onGce($config['httpHandler'])) {
|
||||
$metadata = $this->getMetaData();
|
||||
$projectId = $config['preferNumericProjectId'] ? $metadata->getNumericProjectId() : $metadata->getProjectId();
|
||||
if ($projectId) {
|
||||
return $projectId;
|
||||
}
|
||||
}
|
||||
if ($config['projectIdRequired']) {
|
||||
throw new GoogleException('No project ID was provided, ' . 'and we were unable to detect a default project ID.');
|
||||
}
|
||||
return '';
|
||||
}
|
||||
/**
|
||||
* Abstract the GCECredentials call so we can mock it in the unit tests!
|
||||
*
|
||||
* @codeCoverageIgnore
|
||||
* @return bool
|
||||
*/
|
||||
protected function onGce($httpHandler)
|
||||
{
|
||||
return GCECredentials::onGce($httpHandler);
|
||||
}
|
||||
/**
|
||||
* Abstract the Metadata instantiation for unit testing
|
||||
*
|
||||
* @codeCoverageIgnore
|
||||
* @return Metadata
|
||||
*/
|
||||
protected function getMetaData()
|
||||
{
|
||||
return new Metadata();
|
||||
}
|
||||
/**
|
||||
* Abstract the checking of the grpc extension for unit testing.
|
||||
*
|
||||
* @codeCoverageIgnore
|
||||
* @return bool
|
||||
*/
|
||||
protected function isGrpcLoaded()
|
||||
{
|
||||
return \extension_loaded('grpc');
|
||||
}
|
||||
}
|
||||
153
vendor/Gcp/google/cloud-core/src/Compute/Metadata.php
vendored
Normal file
153
vendor/Gcp/google/cloud-core/src/Compute/Metadata.php
vendored
Normal file
@@ -0,0 +1,153 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2015 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Compute;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Compute\Metadata\Readers\HttpHandlerReader;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Compute\Metadata\Readers\ReaderInterface;
|
||||
/**
|
||||
* A library for accessing the Google Compute Engine (GCE) metadata.
|
||||
*
|
||||
* The metadata is available from Google Compute Engine instances and
|
||||
* App Engine Managed VMs instances.
|
||||
*
|
||||
* Example:
|
||||
* ```
|
||||
* use Google\Cloud\Core\Compute\Metadata;
|
||||
*
|
||||
* $metadata = new Metadata();
|
||||
* $projectId = $metadata->getProjectId();
|
||||
* ```
|
||||
*
|
||||
* ```
|
||||
* // It is easy to get any metadata from a project.
|
||||
* $val = $metadata->getProjectMetadata($key);
|
||||
* ```
|
||||
*/
|
||||
class Metadata
|
||||
{
|
||||
/**
|
||||
* @var ReaderInterface The metadata reader.
|
||||
*/
|
||||
private $reader;
|
||||
/**
|
||||
* @var string The project id.
|
||||
*/
|
||||
private $projectId;
|
||||
/**
|
||||
* @var int The numeric project id.
|
||||
*/
|
||||
private $numericProjectId;
|
||||
/**
|
||||
* @param ReaderInterface $reader [optional] A metadata reader implementation.
|
||||
*/
|
||||
public function __construct(ReaderInterface $reader = null)
|
||||
{
|
||||
$this->reader = $reader ?: new HttpHandlerReader();
|
||||
}
|
||||
/**
|
||||
* Replace the default reader implementation
|
||||
*
|
||||
* @deprecated If a custom reader implementation is desired, provide it at
|
||||
* construction.
|
||||
* @param ReaderInterface $reader The reader implementation
|
||||
*/
|
||||
public function setReader(ReaderInterface $reader)
|
||||
{
|
||||
$this->reader = $reader;
|
||||
}
|
||||
/**
|
||||
* Fetch a metadata item by its path
|
||||
*
|
||||
* Example:
|
||||
* ```
|
||||
* $projectId = $metadata->get('project/project-id');
|
||||
* ```
|
||||
*
|
||||
* @param string $path The path of the item to retrieve.
|
||||
*/
|
||||
public function get($path)
|
||||
{
|
||||
return $this->reader->read($path);
|
||||
}
|
||||
/**
|
||||
* Detect and return the project ID
|
||||
*
|
||||
* Example:
|
||||
* ```
|
||||
* $projectId = $metadata->getProjectId();
|
||||
* ```
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getProjectId()
|
||||
{
|
||||
if (!isset($this->projectId)) {
|
||||
$this->projectId = $this->get('project/project-id');
|
||||
}
|
||||
return $this->projectId;
|
||||
}
|
||||
/**
|
||||
* Detect and return the numeric project ID
|
||||
*
|
||||
* Example:
|
||||
* ```
|
||||
* $projectId = $metadata->getNumericProjectId();
|
||||
* ```
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getNumericProjectId()
|
||||
{
|
||||
if (!isset($this->numericProjectId)) {
|
||||
$this->numericProjectId = $this->get('project/numeric-project-id');
|
||||
}
|
||||
return $this->numericProjectId;
|
||||
}
|
||||
/**
|
||||
* Fetch an item from the project metadata
|
||||
*
|
||||
* Example:
|
||||
* ```
|
||||
* $foo = $metadata->getProjectMetadata('foo');
|
||||
* ```
|
||||
*
|
||||
* @param string $key The metadata key
|
||||
* @return string
|
||||
*/
|
||||
public function getProjectMetadata($key)
|
||||
{
|
||||
$path = 'project/attributes/' . $key;
|
||||
return $this->get($path);
|
||||
}
|
||||
/**
|
||||
* Fetch an item from the instance metadata
|
||||
*
|
||||
* Example:
|
||||
* ```
|
||||
* $foo = $metadata->getInstanceMetadata('foo');
|
||||
* ```
|
||||
*
|
||||
* @param string $key The instance metadata key
|
||||
* @return string
|
||||
*/
|
||||
public function getInstanceMetadata($key)
|
||||
{
|
||||
$path = 'instance/attributes/' . $key;
|
||||
return $this->get($path);
|
||||
}
|
||||
}
|
||||
55
vendor/Gcp/google/cloud-core/src/Compute/Metadata/Readers/HttpHandlerReader.php
vendored
Normal file
55
vendor/Gcp/google/cloud-core/src/Compute/Metadata/Readers/HttpHandlerReader.php
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2019 Google LLC
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Compute\Metadata\Readers;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Credentials\GCECredentials;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\HttpHandler\HttpClientCache;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\HttpHandler\HttpHandlerFactory;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\GuzzleHttp\Psr7\Request;
|
||||
/**
|
||||
* Read Compute Metadata using the HTTP Handler utility.
|
||||
*/
|
||||
class HttpHandlerReader implements ReaderInterface
|
||||
{
|
||||
/**
|
||||
* @var callable
|
||||
*/
|
||||
private $httpHandler;
|
||||
/**
|
||||
* @param callable $httpHandler [optional] An HTTP Handler capable of
|
||||
* accepting PSR7 requests and returning PSR7 responses.
|
||||
*/
|
||||
public function __construct(callable $httpHandler = null)
|
||||
{
|
||||
$this->httpHandler = $httpHandler ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient());
|
||||
}
|
||||
/**
|
||||
* Read the metadata for a given path.
|
||||
*
|
||||
* @param string $path The metadata path, relative to `/computeMetadata/v1/`.
|
||||
* @return string
|
||||
*/
|
||||
public function read($path)
|
||||
{
|
||||
$url = \sprintf('http://%s/computeMetadata/v1/%s', GCECredentials::METADATA_IP, $path);
|
||||
$request = new Request('GET', $url, [GCECredentials::FLAVOR_HEADER => 'Google']);
|
||||
$handler = $this->httpHandler;
|
||||
$res = $handler($request);
|
||||
return (string) $res->getBody();
|
||||
}
|
||||
}
|
||||
29
vendor/Gcp/google/cloud-core/src/Compute/Metadata/Readers/ReaderInterface.php
vendored
Normal file
29
vendor/Gcp/google/cloud-core/src/Compute/Metadata/Readers/ReaderInterface.php
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2016 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Compute\Metadata\Readers;
|
||||
|
||||
/**
|
||||
* Defines a metadata reader implementation.
|
||||
*/
|
||||
interface ReaderInterface
|
||||
{
|
||||
/**
|
||||
* Read metadata from a given path.
|
||||
*/
|
||||
public function read($path);
|
||||
}
|
||||
85
vendor/Gcp/google/cloud-core/src/Compute/Metadata/Readers/StreamReader.php
vendored
Normal file
85
vendor/Gcp/google/cloud-core/src/Compute/Metadata/Readers/StreamReader.php
vendored
Normal file
@@ -0,0 +1,85 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2015 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Compute\Metadata\Readers;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\Credentials\GCECredentials;
|
||||
/**
|
||||
* A class only reading the metadata URL with an appropriate header.
|
||||
*
|
||||
* This class makes it easy to test the MetadataStream class.
|
||||
*/
|
||||
class StreamReader implements ReaderInterface
|
||||
{
|
||||
/**
|
||||
* The base PATH for the metadata.
|
||||
*
|
||||
* @deprecated
|
||||
*/
|
||||
const BASE_URL = 'http://169.254.169.254/computeMetadata/v1/';
|
||||
/**
|
||||
* The header whose presence indicates GCE presence.
|
||||
*
|
||||
* @deprecated
|
||||
*/
|
||||
const FLAVOR_HEADER = 'Metadata-Flavor: Google';
|
||||
/**
|
||||
* A common context for this reader.
|
||||
*/
|
||||
private $context;
|
||||
/**
|
||||
* We create the common context in the constructor.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$options = ['http' => ['method' => 'GET', 'header' => GCECredentials::FLAVOR_HEADER . ': Google']];
|
||||
$this->context = $this->createStreamContext($options);
|
||||
}
|
||||
/**
|
||||
* Read the metadata for a given path.
|
||||
*
|
||||
* @param string $path The metadata path, relative to `/computeMetadata/v1/`.
|
||||
* @return string
|
||||
*/
|
||||
public function read($path)
|
||||
{
|
||||
$url = \sprintf('http://%s/computeMetadata/v1/%s', GCECredentials::METADATA_IP, $path);
|
||||
return $this->getMetadata($url);
|
||||
}
|
||||
/**
|
||||
* Abstracted for testing.
|
||||
*
|
||||
* @param array $options
|
||||
* @return resource
|
||||
* @codeCoverageIgnore
|
||||
*/
|
||||
protected function createStreamContext(array $options)
|
||||
{
|
||||
return \stream_context_create($options);
|
||||
}
|
||||
/**
|
||||
* Abstracted for testing.
|
||||
*
|
||||
* @param string $url
|
||||
* @return string
|
||||
* @codeCoverageIgnore
|
||||
*/
|
||||
protected function getMetadata($url)
|
||||
{
|
||||
return \file_get_contents($url, \false, $this->context);
|
||||
}
|
||||
}
|
||||
45
vendor/Gcp/google/cloud-core/src/ConcurrencyControlTrait.php
vendored
Normal file
45
vendor/Gcp/google/cloud-core/src/ConcurrencyControlTrait.php
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2017 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core;
|
||||
|
||||
/**
|
||||
* Methods to control concurrent updates.
|
||||
*/
|
||||
trait ConcurrencyControlTrait
|
||||
{
|
||||
/**
|
||||
* Apply the If-Match header to requests requiring concurrency control.
|
||||
*
|
||||
* @param array $options
|
||||
* @param string $argName
|
||||
* @return array
|
||||
*/
|
||||
private function applyEtagHeader(array $options, $argName = 'etag')
|
||||
{
|
||||
if (isset($options[$argName])) {
|
||||
if (!isset($options['restOptions'])) {
|
||||
$options['restOptions'] = [];
|
||||
}
|
||||
if (!isset($options['restOptions']['headers'])) {
|
||||
$options['restOptions']['headers'] = [];
|
||||
}
|
||||
$options['restOptions']['headers']['If-Match'] = $options[$argName];
|
||||
}
|
||||
return $options;
|
||||
}
|
||||
}
|
||||
46
vendor/Gcp/google/cloud-core/src/DebugInfoTrait.php
vendored
Normal file
46
vendor/Gcp/google/cloud-core/src/DebugInfoTrait.php
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2017 Google 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core;
|
||||
|
||||
/**
|
||||
* Provides easier to read debug information when dumping a class to stdout.
|
||||
*
|
||||
* @codeCoverageIgnore
|
||||
*/
|
||||
trait DebugInfoTrait
|
||||
{
|
||||
/**
|
||||
* @access private
|
||||
* @return array
|
||||
*/
|
||||
public function __debugInfo()
|
||||
{
|
||||
$props = \get_object_vars($this);
|
||||
if (isset($this->connection)) {
|
||||
$props['connection'] = \get_class($this->connection);
|
||||
}
|
||||
if (isset($props['__excludeFromDebug'])) {
|
||||
$exclude = $props['__excludeFromDebug'];
|
||||
unset($props['__excludeFromDebug']);
|
||||
foreach ($exclude as $e) {
|
||||
unset($props[$e]);
|
||||
}
|
||||
}
|
||||
return $props;
|
||||
}
|
||||
}
|
||||
82
vendor/Gcp/google/cloud-core/src/DetectProjectIdTrait.php
vendored
Normal file
82
vendor/Gcp/google/cloud-core/src/DetectProjectIdTrait.php
vendored
Normal file
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2024 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core;
|
||||
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Auth\ProjectIdProviderInterface;
|
||||
use DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Exception\GoogleException;
|
||||
/**
|
||||
* @internal
|
||||
* Provides functionality common to handwritten clients.
|
||||
*/
|
||||
trait DetectProjectIdTrait
|
||||
{
|
||||
/**
|
||||
* @var string|null The project ID created in the Google Developers Console.
|
||||
*/
|
||||
private $projectId;
|
||||
/**
|
||||
* Detect and return a project ID.
|
||||
* This is different from detectProjectId as this method is supposed to be used by
|
||||
* handwritten clients delegating their auth process to GAX.
|
||||
*
|
||||
* Process:
|
||||
* 1. If $config['projectId'] is set, use that.
|
||||
* 2. If an emulator is enabled, return a dummy value.
|
||||
* 3. If $config['credentials'] is set, attempt to retrieve a project ID from
|
||||
* that.
|
||||
* 4. If code is running on compute engine, try to get the project ID from
|
||||
* the metadata store.
|
||||
* 5. Throw exception.
|
||||
*
|
||||
* @param array $config
|
||||
* @return string|int|null
|
||||
* @throws GoogleException
|
||||
*/
|
||||
private function detectProjectId(array $config)
|
||||
{
|
||||
$config += ['httpHandler' => null, 'projectId' => null, 'projectIdRequired' => \false, 'hasEmulator' => \false, 'credentials' => null];
|
||||
if ($config['projectId']) {
|
||||
return $config['projectId'];
|
||||
}
|
||||
if ($config['hasEmulator']) {
|
||||
return 'emulator-project';
|
||||
}
|
||||
if ($config['credentials'] && $config['credentials'] instanceof ProjectIdProviderInterface && ($projectId = $config['credentials']->getProjectId())) {
|
||||
return $projectId;
|
||||
}
|
||||
if (\getenv('GOOGLE_CLOUD_PROJECT')) {
|
||||
return \getenv('GOOGLE_CLOUD_PROJECT');
|
||||
}
|
||||
if (\getenv('GCLOUD_PROJECT')) {
|
||||
return \getenv('GCLOUD_PROJECT');
|
||||
}
|
||||
$this->throwExceptionIfProjectIdRequired($config);
|
||||
return '';
|
||||
}
|
||||
/**
|
||||
* Throws an exception if project id is required.
|
||||
* @param array $config
|
||||
* @throws GoogleException
|
||||
*/
|
||||
private function throwExceptionIfProjectIdRequired(array $config)
|
||||
{
|
||||
if ($config['projectIdRequired']) {
|
||||
throw new GoogleException('No project ID was provided, ' . 'and we were unable to detect a default project ID.');
|
||||
}
|
||||
}
|
||||
}
|
||||
95
vendor/Gcp/google/cloud-core/src/Duration.php
vendored
Normal file
95
vendor/Gcp/google/cloud-core/src/Duration.php
vendored
Normal file
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core;
|
||||
|
||||
/**
|
||||
* Represents a Duration type.
|
||||
*
|
||||
* Example:
|
||||
* ```
|
||||
* use Google\Cloud\Core\Duration;
|
||||
*
|
||||
* $seconds = 100;
|
||||
* $nanoSeconds = 1000;
|
||||
* $duration = new Duration($seconds, $nanoSeconds);
|
||||
* ```
|
||||
*
|
||||
* ```
|
||||
* // Duration objects can be cast to json-encoded strings.
|
||||
* echo (string) $duration;
|
||||
* ```
|
||||
*/
|
||||
class Duration
|
||||
{
|
||||
const TYPE = 'DURATION';
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $seconds;
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $nanos;
|
||||
/**
|
||||
* @param int $seconds The number of seconds in the duration.
|
||||
* @param int $nanos [optional] The number of nanoseconds in the duration.
|
||||
*/
|
||||
public function __construct($seconds, $nanos = 0)
|
||||
{
|
||||
$this->seconds = $seconds;
|
||||
$this->nanos = $nanos;
|
||||
}
|
||||
/**
|
||||
* Get the duration
|
||||
*
|
||||
* Example:
|
||||
* ```
|
||||
* $res = $duration->get();
|
||||
* ```
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function get()
|
||||
{
|
||||
return ['seconds' => $this->seconds, 'nanos' => $this->nanos];
|
||||
}
|
||||
/**
|
||||
* Format the value as a string.
|
||||
*
|
||||
* Example:
|
||||
* ```
|
||||
* echo $duration->formatAsString();
|
||||
* ```
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function formatAsString()
|
||||
{
|
||||
return \json_encode($this->get());
|
||||
}
|
||||
/**
|
||||
* Format the value as a string.
|
||||
*
|
||||
* @return string
|
||||
* @access private
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return $this->formatAsString();
|
||||
}
|
||||
}
|
||||
73
vendor/Gcp/google/cloud-core/src/EmulatorTrait.php
vendored
Normal file
73
vendor/Gcp/google/cloud-core/src/EmulatorTrait.php
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2016 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core;
|
||||
|
||||
/**
|
||||
* Provides common logic for configuring the usage of an emulator.
|
||||
*/
|
||||
trait EmulatorTrait
|
||||
{
|
||||
/**
|
||||
* Configure the gapic configuration to use a service emulator.
|
||||
*
|
||||
* @param string $emulatorHost
|
||||
* @return array
|
||||
*/
|
||||
private function emulatorGapicConfig($emulatorHost)
|
||||
{
|
||||
// Strip the URL scheme from the input, if it was provided.
|
||||
if ($scheme = \parse_url($emulatorHost, \PHP_URL_SCHEME)) {
|
||||
$search = $scheme . '://';
|
||||
$emulatorHost = \str_replace($search, '', $emulatorHost);
|
||||
}
|
||||
return ['apiEndpoint' => $emulatorHost, 'transportConfig' => ['grpc' => ['stubOpts' => ['credentials' => \Grpc\ChannelCredentials::createInsecure()]]], 'credentials' => new InsecureCredentialsWrapper()];
|
||||
}
|
||||
/**
|
||||
* Retrieve a valid base uri for a service emulator.
|
||||
*
|
||||
* @param string $emulatorHost
|
||||
* @return string
|
||||
*/
|
||||
private function emulatorBaseUri($emulatorHost)
|
||||
{
|
||||
$emulatorUriComponents = \parse_url($emulatorHost);
|
||||
$emulatorUriComponents = \array_merge(['scheme' => 'http', 'port' => ''], $emulatorUriComponents);
|
||||
$baseUri = "{$emulatorUriComponents['scheme']}://{$emulatorUriComponents['host']}";
|
||||
$baseUri .= $emulatorUriComponents['port'] ? ":{$emulatorUriComponents['port']}/" : '/';
|
||||
return $baseUri;
|
||||
}
|
||||
/**
|
||||
* When emulators are enabled, use them as the service host.
|
||||
*
|
||||
* This method is deprecated and will be removed in a future major release.
|
||||
*
|
||||
* @param string $baseUri
|
||||
* @param string $emulatorHost [optional]
|
||||
* @return string
|
||||
*
|
||||
* @deprecated
|
||||
* @access private
|
||||
*/
|
||||
public function getEmulatorBaseUri($baseUri, $emulatorHost = null)
|
||||
{
|
||||
if ($emulatorHost) {
|
||||
$baseUri = $this->emulatorBaseUri($emulatorHost);
|
||||
}
|
||||
return $baseUri;
|
||||
}
|
||||
}
|
||||
25
vendor/Gcp/google/cloud-core/src/Exception/AbortedException.php
vendored
Normal file
25
vendor/Gcp/google/cloud-core/src/Exception/AbortedException.php
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2016 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Exception;
|
||||
|
||||
/**
|
||||
* Exception thrown when a transaction is aborted.
|
||||
*/
|
||||
class AbortedException extends ServiceException
|
||||
{
|
||||
}
|
||||
26
vendor/Gcp/google/cloud-core/src/Exception/BadRequestException.php
vendored
Normal file
26
vendor/Gcp/google/cloud-core/src/Exception/BadRequestException.php
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2016 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Exception;
|
||||
|
||||
/**
|
||||
* Exception thrown when a request fails due to an error in the request.
|
||||
* In REST context, this exception indicates a status code 400.
|
||||
*/
|
||||
class BadRequestException extends ServiceException
|
||||
{
|
||||
}
|
||||
26
vendor/Gcp/google/cloud-core/src/Exception/ConflictException.php
vendored
Normal file
26
vendor/Gcp/google/cloud-core/src/Exception/ConflictException.php
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2016 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Exception;
|
||||
|
||||
/**
|
||||
* Exception thrown when a request fails due to a conflict.
|
||||
* In REST context, this exception indicates a status code 409.
|
||||
*/
|
||||
class ConflictException extends ServiceException
|
||||
{
|
||||
}
|
||||
26
vendor/Gcp/google/cloud-core/src/Exception/DeadlineExceededException.php
vendored
Normal file
26
vendor/Gcp/google/cloud-core/src/Exception/DeadlineExceededException.php
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Exception;
|
||||
|
||||
/**
|
||||
* Exception thrown when a request takes too long to complete.
|
||||
* In REST context, this exception indicates a status code 504.
|
||||
*/
|
||||
class DeadlineExceededException extends ServiceException
|
||||
{
|
||||
}
|
||||
26
vendor/Gcp/google/cloud-core/src/Exception/FailedPreconditionException.php
vendored
Normal file
26
vendor/Gcp/google/cloud-core/src/Exception/FailedPreconditionException.php
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2016 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Exception;
|
||||
|
||||
/**
|
||||
* Exception thrown when a request fails due to a failed precondition.
|
||||
* In REST context, this exception indicates a status code 412.
|
||||
*/
|
||||
class FailedPreconditionException extends ServiceException
|
||||
{
|
||||
}
|
||||
26
vendor/Gcp/google/cloud-core/src/Exception/GoogleException.php
vendored
Normal file
26
vendor/Gcp/google/cloud-core/src/Exception/GoogleException.php
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2016 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Exception;
|
||||
|
||||
use Exception;
|
||||
/**
|
||||
* Exception thrown when a request fails.
|
||||
*/
|
||||
class GoogleException extends Exception
|
||||
{
|
||||
}
|
||||
36
vendor/Gcp/google/cloud-core/src/Exception/NotFoundException.php
vendored
Normal file
36
vendor/Gcp/google/cloud-core/src/Exception/NotFoundException.php
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2016 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Exception;
|
||||
|
||||
/**
|
||||
* Exception thrown when a resource is not found.
|
||||
*/
|
||||
class NotFoundException extends ServiceException
|
||||
{
|
||||
/**
|
||||
* Allows overriding message for injection of Whitelist Notice.
|
||||
*
|
||||
* @param string $message the new message
|
||||
* @return void
|
||||
* @access private
|
||||
*/
|
||||
public function setMessage($message)
|
||||
{
|
||||
$this->message = $message;
|
||||
}
|
||||
}
|
||||
26
vendor/Gcp/google/cloud-core/src/Exception/ServerException.php
vendored
Normal file
26
vendor/Gcp/google/cloud-core/src/Exception/ServerException.php
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2016 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Exception;
|
||||
|
||||
/**
|
||||
* Exception thrown when a request fails due to an error on the server.
|
||||
* In REST context, this exception indicates a status code 500.
|
||||
*/
|
||||
class ServerException extends ServiceException
|
||||
{
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user