chore: synchronize project dependencies and update vendor directory files

This commit is contained in:
2026-07-15 13:15:05 +07:00
parent 2ab9f65c99
commit 3203c6e129
10000 changed files with 1501312 additions and 0 deletions
+152
View File
@@ -0,0 +1,152 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CKFinder Changelog</title>
</head>
<body>
<h1 id="ckfinder-changelog">CKFinder Changelog</h1>
<p><a href="https://ckeditor.com/ckfinder/">CKFinder</a></p>
<p>Copyright (c) 2007-2021, CKSource - Frederico Knabben. All rights reserved.</p>
<h2 id="version-3-5-3">Version 3.5.3</h2>
<h3 id="new-features">New Features</h3>
<ul>
<li class="php">Added support for PHP 8.1.</li></ul>
<h3 id="fixed-issues">Fixed issues</h3>
<ul>
<li class="php">Updated third-party libraries.</li><li class="php">Replaced deprecated method calls.</li></ul>
<h2 id="version-3-5-2">Version 3.5.2</h2>
<h3 id="fixed-issues">Fixed issues</h3>
<ul>
<li>Upgraded jQuery to v3.6.0.</li><li>Replaced Lodash with Underscore v1.13.1.</li></ul>
<h2 id="version-3-5-1-2">Version 3.5.1.2</h2>
<h3 id="new-features">New Features</h3>
<ul>
<li class="php">Added support for PHP 8.</li></ul>
<h3 id="fixed-issues">Fixed Issues</h3>
<ul>
<li class="net">Fixed type registration issues in a newer version of Autofac.</li></ul>
<h2 id="version-3-5-1-1">Version 3.5.1.1</h2>
<h3 id="fixed-issues">Fixed issues</h3>
<ul>
<li class="php">Updated third-party libraries.</li><li class="php">Fixed race condition in the local filesystem adapter.</li><li class="net">Upgraded the ImageProcessor library to version 2.8.0.</li><li class="net">Upgraded the Autofac library to version 5.2.0.</li><li>[Java] Fixed issues related to DirectoryStream not being properly closed at some places.</li></ul>
<h3 id="localization-updates">Localization Updates</h3>
<ul>
<li>Updated: Bosnian, Chinese, Japanese, Korean.</li></ul>
<h2 id="version-3-5-1">Version 3.5.1</h2>
<h3 id="new-features">New Features</h3>
<ul>
<li>Added support for uploading files without a file extension. Files without an extention have to be explicitly enabled in the resource types configuration.</li></ul>
<h3 id="documentation-updates">Documentation Updates</h3>
<ul>
<li class="php">Added documentation that clarifies how to fully <a href="https://ckeditor.com/docs/ckfinder/ckfinder3-php/howto.html#securing_public_folder">protect against content sniffing in web browsers</a>.</li><li class="net">Added documentation that clarifies how to fully <a href="https://ckeditor.com/docs/ckfinder/ckfinder3-net/howto.html#securing_public_folder">protect against content sniffing in web browsers</a>.</li></ul>
<h2 id="version-3-5-0">Version 3.5.0</h2>
<h3 id="fixed-issues">Fixed Issues</h3>
<ul>
<li>Fixed issues related to loading language files in a CORS-enabled environment.</li><li>Fixed image editing in a CORS-enabled environment.</li><li>Fixed contrast issues in the &quot;Choose resized&quot; dialog.</li><li class="net">Fixed an issue with downloading large files that occurred on some IIS configurations.</li><li class="net">Fixed an issue with the <code>Proxy</code> command on an S3 backend.</li></ul>
<h3 id="localization-updates">Localization Updates</h3>
<ul>
<li>Updated: Japanese.</li></ul>
<h2 id="version-3-4-5">Version 3.4.5</h2>
<h3 id="new-features">New Features</h3>
<ul>
<li>New skin: Neko.</li><li>The language files can now be loaded in a CORS-enabled environment.</li><li>Improved the look &amp; feel of the image preview view.</li></ul>
<h3 id="fixed-issues">Fixed Issues</h3>
<ul>
<li>Fixed performance issues in the folder tree view for folders that contain hundreds of subfolders.</li><li>Fixed focus issues in Compact and List view.</li><li>Fixed file panel auto scroll issue in Modal mode.</li><li>Fixed navigation issues in Compact and List views.</li><li class="net">Refactored Amazon S3 adapter, so it is now possible to pass a custom instance of <code>AmazonS3Client</code>.</li><li class="net">Fixed an issue with incorrect last file modification dates.</li></ul>
<h3 id="backward-incompatible-changes">Backward Incompatible Changes</h3>
<ul>
<li>Due to performance issues, the <code>view:FolderTreeNode</code> event is no longer emitted in the CKFinder JavaScript client.</li></ul>
<h2 id="version-3-4-4">Version 3.4.4</h2>
<h3 id="fixed-issues">Fixed Issues</h3>
<ul>
<li>Fixed file selection issue that occurred when search filter was used.</li><li class="php">Fixed problem with dates on FTP adapter.</li><li class="net">Updated AWS SDK to version 3.</li></ul>
<h3 id="localization-updates">Localization Updates</h3>
<ul>
<li>Updated: Chinese, Dutch, Finnish, Persian.</li></ul>
<h2 id="version-3-4-3">Version 3.4.3</h2>
<h3 id="fixed-issues">Fixed Issues</h3>
<ul>
<li>Fixed file upload issue in the latest version of Microsoft Edge (v42).</li><li>Fixed text selection issue in CKFinder UI.</li><li class="php">Added support for Unix symbolic links in the local filesystem backend adapter.</li><li class="net">Fixed URL generation in backends that use the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3-net/commands.html#command_proxy">Proxy</a> command.</li><li class="net">Upgraded the ImageProcessor library to the latest version (v2.6.2).</li><li class="net">Added possibility to set license details per request.</li></ul>
<h2 id="version-3-4-2">Version 3.4.2</h2>
<h3 id="fixed-issues">Fixed Issues</h3>
<ul>
<li>Fixed issues with resolving base path when <code>ckfinder.js</code> is loaded with query string parameters.</li><li>Fixed PDF preview for files with the &quot;pdf&quot; extension written in uppercase.</li><li class="php">Updated AWS SDK to version 3.</li><li class="php">Updated Dropbox API to version 2.</li><li class="net">Fixed <a href="https://ckeditor.com/docs/ckfinder/ckfinder3-net/configuration.html#configuration_options_backends"><code>baseUrl</code></a> option which was ignored by some backend adapters.</li><li class="net">Fixed URL generation for resized images in backends that use the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3-net/commands.html#command_proxy">Proxy</a> command.</li></ul>
<h3 id="localization-updates">Localization Updates</h3>
<ul>
<li>Added: Azerbaijani, Uzbek (Cyrillic and Latin versions).</li><li>Updated: Vietnamese.</li></ul>
<h2 id="version-3-4-1">Version 3.4.1</h2>
<h3 id="new-features">New Features</h3>
<ul>
<li class="net">Added support for FTP storage.</li></ul>
<h3 id="fixed-issues">Fixed Issues</h3>
<ul>
<li class="net">Improved Thumbnail command performance.</li></ul>
<h3 id="localization-updates">Localization Updates</h3>
<ul>
<li>Updated: Greek and Turkish.</li></ul>
<h2 id="version-3-4">Version 3.4</h2>
<h3 id="new-features">New Features</h3>
<ul>
<li>The <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/api/CKFinder.Application-event-settings_change_GROUP_NAME"><code>settings:change:GROUP:NAME</code></a> event has a new parameter: <code>previousValue</code>.</li><li>Added the <a href="https://ckeditor.com/docs/ckfinder/demo/ckfinder3/samples/user-interface-compact.html">Compact View</a> for displaying files in columns (not supported in IE9).</li><li>The <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/api/CKFinder.Config-cfg-defaultViewType"><code>defaultViewType</code></a> configuration option accepts a new value: <code>compact</code>.</li><li>Added the <code>width</code> parameter for columns defined for List View in the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/api/CKFinder.Application-event-listView_columns"><code>listView:columns</code></a> event.</li><li>Added the &quot;OK&quot; button to information dialogs (those created using the <code>dialog:info</code> request).</li><li class="net">Improved configuration validation.</li><li class="net">Added progress tracking for time-consuming operations.</li><li class="net">Added support for IIS virtual directories in the local storage adapter.</li></ul>
<h3 id="fixed-issues">Fixed Issues</h3>
<ul>
<li>Added the missing <code>command:before:FileUpload</code>, <code>command:ok:FileUpload</code> and <code>command:error:FileUpload</code> events for uploading files.</li><li>Fixed focus in the settings panel when changing the view type.</li><li>Fixed double <code>toolbar:reset:Main:folder</code> event in compact mode when the user selects a folder in the files pane.</li><li>Fixed keyboard navigation for disabled context menu items.</li><li>Removed the possibility to invoke the Delete File command by keyboard inside a folder with <code>ACL FILE_DELETE</code> set to <code>false</code>.</li><li>Removed the possibility to invoke the Rename File command by keyboard inside a folder with <code>ACL FILE_RENAME</code> set to <code>false</code>.</li><li>Fixed drag&amp;drop uploads in List View.</li><li>Updated Javascript code prettifier for samples.</li><li class="php">Fixed file permission issue occurring during file upload on some IIS server configurations.</li><li class="net">Fixed HTML file extension matching.</li><li class="net">Fixed URL generation for resized images in backends that use the Proxy command.</li><li class="net">Added missing file size field to the SaveImage command response.</li><li class="net">Improved thumbnail caching.</li></ul>
<h3 id="localization-updates">Localization Updates</h3>
<ul>
<li>Added: Swiss German (thanks to <a href="https://twitter.com/mirogrenda">Miro Grenda</a>!) and Ukrainian (thanks to Holovin Yevhen Nikolayevich!).</li><li>Updated: Chinese, Czech, Esperanto, French, German, Kurdish, Latvian, Polish, Russian, Slovakian, Spanish and Turkish.</li></ul>
<h2 id="version-3-3-1">Version 3.3.1</h2>
<h3 id="fixed-issues">Fixed Issues</h3>
<ul>
<li class="net">Fixed performance issue in folders with more than 1000 files.</li></ul>
<h2 id="version-3-3">Version 3.3</h2>
<h3 id="new-features">New Features</h3>
<ul>
<li class="php">Added support for Microsoft Azure Storage.</li><li class="net">Added a stable version of the ASP.NET connector.</li><li class="net">Added support for Microsoft Azure Storage.</li><li class="net">Added support for Amazon S3 Storage.</li></ul>
<h3 id="backward-incompatible-changes">Backward Incompatible Changes</h3>
<ul>
<li>Language files have undergone a major reorganization. Obsolete keys were removed.</li><li>Events related to rendering columns in the files pane were changed: <code>listView:file:column:NAME</code>, <code>listView:folder:column:NAME</code>.</li></ul>
<h3 id="fixed-issues">Fixed Issues</h3>
<ul>
<li>Performance improvements for rendering the files pane with thousands of items.</li><li>Thumbnail slider enabled in list view when loading CKFinder.</li><li>Choosing files with double click does not fetch the file URL for some remote backends.</li><li>Invalid time when parsing time in the 12-hour clock system.</li><li class="php">Image Edit: Saving an image that exceeds <code>maxWidth</code>/<code>maxHeight</code> throws an error.</li></ul>
<h3 id="localization-updates">Localization Updates</h3>
<ul>
<li>Added: Bosnian.</li><li>Updated: Brazilian Portuguese, Czech, Esperanto, French, German, Italian, Kurdish, Latvian, Persian, Polish, Russian, Spanish and Swedish.</li></ul>
<h2 id="version-3-2-1">Version 3.2.1</h2>
<h3 id="fixed-issues">Fixed Issues</h3>
<ul>
<li>In widget mode (in Internet Explorer/Edge only) the CSRF protection was too strict and did not allow for actions that should be allowed.</li></ul>
<h2 id="version-3-2">Version 3.2</h2>
<h3 id="new-features">New Features</h3>
<ul>
<li>Added new view for files pane: a list view with file details.</li><li>Added sorting of files in files pane by name, date and size.</li><li>Added the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/api/CKFinder.Config-cfg-listViewIconSize"><code>listViewIconSize</code></a> configuration option.</li><li>Added the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/api/CKFinder.Config-cfg-defaultSortBy"><code>defaultSortBy</code></a> configuration option.</li><li>Added the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/api/CKFinder.Config-cfg-defaultSortByOrder"><code>defaultSortByOrder</code></a> configuration option.</li><li>Added the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/api/CKFinder.Config-cfg-defaultViewType"><code>defaultViewType</code></a> configuration option.</li><li>Added the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/api/CKFinder.Application-event-listView_columns"><code>listView:columns</code></a> event.</li><li>Added the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/api/CKFinder.Application-event-listView_file_column_NAME"><code>listView:file:column:NAME</code></a> event.</li><li>Added the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/api/CKFinder.Application-event-listView_folder_column_NAME"><code>listView:folder:column:NAME</code></a> event.</li><li>Added the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/api/CKFinder.Application-event-resources_show_before"><code>resources:show:before</code></a> event.</li><li>Added the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/api/CKFinder.Application-event-dialog_close_NAME"><code>dialog:close:NAME</code></a> event.</li><li>Added the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/api/CKFinder.Application-request-file_getActive"><code>file:getActive</code></a> request.</li><li>Added the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/api/CKFinder.Application-request-csrf_getToken"><code>csrf:getToken</code></a> request.</li><li>Added the <code>sendPostAsJson</code> parameter to the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/api/CKFinder.Application-request-command_send"><code>command:send</code></a> request</li><li>The <code>view</code> parameter for the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/api/CKFinder.Application-request-page_create"><code>page:create</code></a> request is now optional.</li></ul>
<h3 id="fixed-issues">Fixed Issues</h3>
<ul>
<li>Individual settings views have a proper name in the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/api/CKFinder.Application-event-view_NAME"><code>view:NAME</code></a> event instead of a single <code>Setting</code>.</li><li>Compact mode: Keyboard navigation in breadcrumbs is inverted for RTL languages.</li><li>Fixed an issue that prevented to move or copy over 250 files on a default PHP installation.</li><li>Fixed wrong error message for an empty file name.</li><li>Fixed detection of swipe direction when opening panels on touch screen devices.</li><li>Compact mode: Focus on filter box is lost when typing.</li><li>Thumbnails are not refreshed after editing an image.</li><li>Files filter is not refreshed after clicking a folder.</li><li>Focus is lost after moving files.</li><li>The toolbar is unnecessarily rendered when lazy loading of a folder finishes and a file was selected.</li></ul>
<h3 id="localization-updates">Localization Updates</h3>
<ul>
<li>Added: Esperanto.</li></ul>
<h2 id="version-3-1">Version 3.1</h2>
<h3 id="security-updates">Security Updates</h3>
<p>As a result of security testing and hacking that we did on CKFinder 3 we discovered some potential security concerns in the server-side part of the application.
These issues affected actions that only authenticated users could perform solely in locations specified in your CKFinder backends configuration, but since
in some cases it was possible to skip ACL checks or file extension checks, <strong>an upgrade is highly recommended</strong>.</p>
<h3 id="new-features">New Features</h3>
<ul>
<li>Improved accessibility. Added compatibility with screen readers.</li><li>Reworked keyboard navigation in the entire application. Implemented custom <kbd>Tab</kbd> key support to resolve inconsistency between browsers.</li><li>Added the Keyboard Shortcuts dialog window &mdash; press <kbd>?</kbd> to open it.</li><li>Greatly improved application performance when loading files from remote locations (e.g. Amazon S3).</li><li>Improved performance by reducing the number of situations when the entire files pane is reloaded.</li><li>Improved performance by caching files on subsequent clicks of the folder.</li><li>Added Microsoft Edge compatibility.</li><li>Added preview of PDF files in the gallery.</li><li>Added drag and drop support for files onto folders and breadcrumbs in compact mode.</li><li>Added busy dialog and progress tracking for time-consuming operations.</li><li>Added Proxy command support. It is now possible to view files stored outside the document root or in remote backends in the gallery.</li><li class="php">Added the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3-php/commands.html#command_proxy"><code>Proxy</code></a> command and the corresponding <a href="https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#backend_option_useProxyCommand"><code>useProxyCommand</code></a> backend configuration option.</li><li>Reworked the Choose Scaled dialog window.</li><li>Edit Image feature now warns against closing without saving changes.</li><li>Added the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/api/CKFinder.Application-request-folder_getIcon"><code>folder:getIcon</code></a> request.</li><li>Removed Maximize/Minimize buttons in popup mode as the browser provides native controls for it.</li><li class="php">Improved performance by caching file previews.</li><li class="php">Added the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_cache"><code>cache</code></a> option that configures cache lifetime for various CKFinder components.</li><li class="php">Added the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_tempDirectory"><code>tempDirectory</code></a> option that configures the path to the temporary files folder used by CKFinder.</li><li class="php">Added the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_sessionWriteClose"><code>sessionWriteClose</code></a> option that configures whether the connector should close write access to the session to avoid performance issues.</li><li class="php">Added the <a href="https://ckeditor.com/docs/ckfinder/ckfinder3-php/commands.html#command_operation"><code>Operation</code></a> command that tracks the progress of operation in time-consuming connector commands.</li></ul>
<h3 id="backward-incompatible-changes">Backward Incompatible Changes</h3>
<ul>
<li>Context menu API has undergone major changes. See the updated <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/guide/dev_contextmenu-section-ckfinder-3.1%2B">context menu documentation</a>.</li><li>Toolbar API events <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/api/CKFinder.Application-event-toolbar_reset_NAME"><code>toolbar:reset:NAME</code></a> and <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/api/CKFinder.Application-event-toolbar_reset_NAME_EVENT"><code>toolbar:reset:NAME:EVENT</code></a> - <code>data.toolbar</code> is now a <code>Backbone.Collection</code>, not an array.</li><li>The <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/api/CKFinder.Application-request-file_getIcon"><code>file:getIcon</code></a> request no longer has the <code>extension</code> parameter. Pass the <code>file</code> parameter instead.</li></ul>
<h3 id="fixed-issues">Fixed Issues</h3>
<ul>
<li>Compact mode: Breadcrumb was hidden when entering a folder with many files.</li><li>Compact mode: There was no way to enter a folder on Android.</li><li>Compact mode: Broken border around CKFinder when viewing the top level folder with resource types.</li><li>Edit Image: Loading an image was not working when the domain name contained a dash character.</li><li>Edit Image: Context menu item was enabled when the user had no permissions to edit the file.</li><li>Edit Image: Resize option was not available in compact mode.</li><li>Edit Image: Reset button should have been disabled if there was nothing to reset.</li><li>Edit Image: Fixed validation of provided values in the edit image controls.</li><li>Edit Image: There was no information about failing to save a file.</li><li>Edit Image: It was possible to crop an area bigger than the edited image.</li><li>Edit Image: Fixed progress bar behavior.</li><li>Filter input: Clearing filter input did not result in showing all files in IE9.</li><li>Filter input: Filter should remember its state if it is still active.</li><li>Focusing elements: Focus in context menu and toolbar did not cycle.</li><li>Focusing elements: Focus was lost after resizing an image.</li><li>Focusing elements: Focus was not remembered when returning to the files pane.</li><li>Focusing elements: Pressing <kbd>Tab</kbd> should focus the first item in a component (file, folder, toolbar button), not the container.</li><li>Focusing elements: Lock focus chain within the settings panel.</li><li>Scrolling files: Scrolling on mobile devices was troublesome and sometimes did not work at all.</li><li>Scrolling files: Files were unnecessarily selected on scroll on mobile devices.</li><li>Thumbnails: Problem with thumbnails in widgets/popups when <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/api/CKFinder.Config-cfg-connectorPath"><code>connectorPath</code></a> did not include the domain.</li><li>Thumbnails: Thumbnails loaded with a significant delay for a larger number of files.</li><li>Thumbnails: Thumbnails were not refreshed in certain scenarios.</li><li>iOS/Safari: Thumbnails were not shown.</li><li>iOS/Safari: Popup sample did not work.</li><li>iOS/Safari: The configured height of the widget was ignored, instead CKFinder height depended on the number of files inside.</li><li>iOS/Safari: Downloading files did not work.</li><li>Setting global configuration did not work for widgets and popups.</li><li>There was no Close button available after file upload.</li><li>It should not be possible to move dialog windows.</li><li>Fixed various UI glitches in the RTL interface.</li><li>Video or image sometimes overlapped file preview controls in file preview.</li><li>Delete files confirmation dialog did not appear when the files pane was scrolled.</li><li>Changed the confusing empty folder message in the read-only mode.</li><li>Removed the notification about correctly uploaded file in IE9.</li><li>Resolved an issue with validating license names that started with <code>www[0-9]</code> or that contained upper case letters.</li><li>In certain scenarios not all available toolbar buttons were shown in CKFinder.</li><li>Fixed the look of the &quot;More&quot; drop-down in the toolbar.</li><li class="php">Empty <code>directory</code> key in the backend definition resulted in a double slash in the file URL.</li></ul>
<h3 id="localization-updates">Localization Updates</h3>
<ul>
<li>Added: Basque, Kurdish.</li><li>Updated: Brazilian Portuguese, Chinese, Croatian, Czech, Danish, Esperanto, Estonian, French, German, Greek, Hungarian, Italian, Korean, Norwegian, Persian, Polish and Russian.</li></ul>
<h2 id="version-3-0">Version 3.0</h2>
<p>A brand new version of CKFinder, currently available only for PHP. For an overview of new features, see the <a href="http://cksource.com/blog/CKFinder-3.0-for-PHP-Released">announcement about CKFinder 3.0 for PHP</a>.</p>
<ul>
<li>New architecture based on jQuery, jQuery Mobile, Backbone, Marionette, and RequireJS.</li><li>Built-in image editor.</li><li>Customizable skins compatible with jQuery UI Themeroller.</li><li>Full responsiveness, great mobile support.</li><li>Cloud storage support (Amazon S3, Dropbox) and FTP connector.</li></ul>
</body>
</html>
+175
View File
@@ -0,0 +1,175 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CKFinder License</title>
</head>
<body>
<h2>CKFinder License Agreement, Version 4.0</h2>
<p>NOTICE:</p>
<p>PLEASE READ THIS AGREEMENT CAREFULLY BEFORE ACCEPTING IT. WHEN YOU CONFIRM THIS AGREEMENT YOU ACCEPT AND AGREE TO THE TERMS AND CONDITIONS SPECIFIED HEREIN. IF ANY PERSON OR LEGAL ENTITY USES OR INSTALLS THE SOFTWARE ON YOUR BEHALF PRIOR TO YOUR USE OF THE SOFTWARE, SUCH PERSON OR LEGAL ENTITY WILL BE DEEMED TO BE YOUR PROXY ACTING ON YOUR BEHALF AND YOU WILL BE DEEMED TO HAVE ACCEPTED ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT AS IF YOU HAD USED OR INSTALLED THE SOFTWARE. IF ANY PERSON OR LEGAL ENTITY ORDERS OR ACQUIRES THE SOFTWARE ON YOUR BEHALF, SUCH PERSON OR LEGAL ENTITY SHALL BE DEEMED AS DULY EMPOWERED TO ACCEPT THE TERMS AND CONDITIONS OF THIS AGREEMENT ON YOUR BEHALF AND YOU WILL BE DEEMED TO HAVE ACCEPTED ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT AS IF YOU HAD ORDERED OR ACQUIRED THE SOFTWARE DIRECTLY.</p>
<p>ANY PERSON OR LEGAL ENTITY WHO USES OR INSTALLS THE SOFTWARE ACTING ON YOUR BEHALF IS OBLIGED TO PROVIDE YOU ACCESS TO THE SOFTWARE NOT EARLIER THAN THE PROVIDING OF THIS AGREEMENT AND LEGAL EVIDENCE AND SHALL BE DEEMED TO BE A USER OF THE SOFTWARE BOUND BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AS LONG AS THIS PERSON OR LEGAL ENTITY RETAINS A COPY OF THE SOFTWARE.</p>
<p>This document (“Agreement”) is a legal agreement between You, either an individual or a Legal Entity, and CKSource sp. z o.o. sp.k., with its registered office in Warsaw, at ul. Zygmunta Słomińskiego 15 lok. 508, 00-195 Warsaw, Poland, NIP number 5252621537, REGON: 361766395 (“CKSource”), covering Your permissions to reproduce and distribute the Software under the License terms defined hereby.</p>
<ol>
<li><h3>Definitions</h3>
<p>“Agreement Name” shall mean the name used to reference this Agreement in any context, which is “CKSource Software License Agreement 4.0” or “CKSource License 4.0”.</p>
<p>“Software” shall mean the copyrighted material owned by CKSource, subject to the terms of this License. The Software is publicly, uniquely, and in its entirety, recognizable by a trademark name owned by CKSource (“Software Name”).</p>
<p>“Software Release” or “Release” shall mean a set of files distributed by CKSource, or anyone authorized to distribute it, that represents the Software. A Release is uniquely identified by the Software Name and a code. Such code is generally referenced as the Software version or revision number, or a combination of both.</p>
<p>“Release Date” shall mean the day that CKSource started distributing a Release.</p>
<p>“Website” shall mean a website (i) owned by You, or (ii) produced by You and to which the owner grants You the permission to act on behalf of the owner and on which You, under terms of this Agreement intend to manage its content. For the purpose of this Agreement Website shall mean (i) collection of internet or intranet pages placed in a computer server-based file archive so that is available for the public or internal viewing by the Website's visitors. A website used for SaaS distribution is not a valid Website for the purposes of this Agreement.</p>
<p>“Application” shall mean a single software component (i) owned by You, or (ii) to which the owner grants You the permission to act on behalf of the owner. For the purpose of this Agreement Application shall be (i) a set of mathematical codes, programmes, routines, and other functions that control the functioning and operation of a computer's hardware and (ii) is utilized by You, your customers or contractors based on a predefined interaction plan between end users and Software Release and for the specific business process or processes which are not directly related to managing content on the Websites.</p>
<p>“SaaS” shall mean software that is based on one set of common code and data definitions that is consumed in a one-to-many model by all contracted customers at anytime on a pay-for-use basis or as a subscription based on use metrics.</p>
<p>“Server” shall mean a network computer with one or more computer central processing units (CPU's) that operates for the exclusive purpose of hosting Production Websites or Websites.</p>
<p>“Development Activity” shall mean the act of interacting with the Software or one of its Releases, in any number of Websites owned or produced by You, with the intent of installation, customization, configuration, testing, documentation, or any other software development activity related to the Software.</p>
<p>“Developer” shall mean an Employee designated by You to perform Development Activities.</p>
<p>“Production Website” shall mean a Website with the Software installed, which already had Development Activities performed, and that has been delivered to end-users for production usage. Maintenance activities performed on Production Websites, excluding software development activities related to the Software, are not considered Development Activities.</p>
<p>“Hostname” shall mean a unique name by which a website is reachable in a network. This includes, but is not limited to, a website IP address. (For example, if a website is reachable by the Internet address “http://www.example.com/”, the Hostname is “www.example.com”.) Subdomains of a Hostname are considered different Hostnames.</p>
<p>“Employee” shall mean a person who is hired for a wage, salary, fee or payment to perform work for You. This includes the common understanding for employees and contractors.</p>
<p>“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control of 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.</p>
<p>“Effective Date” means the date on which the Legal Evidence is made effective.</p>
<p>“You” (or “Your”) shall mean an individual or a Legal Entity exercising permissions granted by the License and accepting this Agreement.</p>
</li>
<li><h3>Grant of License</h3>
<p>Subject to the terms and conditions of this Agreement, CKSource hereby grants You, in accordance to any restriction, as defined in Section 4, a non-exclusive, perpetual, irrevocable, royalty free, worldwide license (“License”) to use, reproduce, modify, and distribute a Software Release in Websites. This license does not allow You to use, reproduce, modify, sublicense and distribute a Software as embedded into single or many Applications or/and SaaS. This license does not allow You to use, reproduce, modify and distribute a Software as a software component of any of your commercial software products including those that are used by your customers to manage content on their Websites.</p>
<p>You should carefully read the following terms and conditions before using, installing, copying, or distributing the Software. Unless otherwise agreed in writing by CKSource, your use, installation, copying, or distribution of the Software indicates your acceptance of this License.</p>
</li>
<li><h3>Scope of License</h3>
<p>You can use, install, copy, and distribute the Software as provided in this Agreement solely for the purpose of managing content on the Websites. You may not rent, lease, loan, sublicense, reverse engineer, decompile, disassemble, or create derivative works based on the Software, in whole or in part, nor permit anyone else to do so.</p>
<p>It is agreed that in exchange for the license set forth herein, you will pay a license fee (“License Fee”). The fee value will be specified by CKSource at the moment of the purchase.</p>
<p>All rights of any kind to the Software, which are not expressly granted by this Agreement, are entirely and exclusively reserved to and by CKSource. The Software is protected by applicable national and international laws and treaties.</p>
</li>
<li><h3>License Models and Restrictions</h3>
<p>This Agreement may be offered to You under different license options that imply specific restrictions to Your ability to enter this Agreement. Among others, the following are some of the restrictions that may apply:</p>
<ul class="sub">
<li class="sub"><span class="sub">a. </span>“Websites Limit”: assembling the Software into a maximum limited number of Websites (“Sites”). The Hostname of any or all the Sites may be specified at the moment of purchase or at any moment during the Upgrade Period. As an exception, Hostnames prefixed with “www.” are considered a single Hostname with a similar Hostname that misses that prefix only and both together count as one Website.</li>
<li class="sub"><span class="sub">b. </span>“Employees Limit”: the maximum limited number of Employees at the Effective Date. Automatic Renewals, as described in Section 12, are valid only if this limit is still valid at renewal date.</li>
<li class="sub"><span class="sub">c. </span>“Support Requests Limit”: the maximum limited number of Support Requests per each calendar month.</li>
</ul>
<p>Restrictions, or the absence of them, must be clearly specified in the Legal Evidence. Nonconformance with the restrictions constitutes a breach to this Agreement.</p>
</li>
<li><h3>Unlicensed Copies</h3>
<p>If You did not pay the License Fee, You may use unlicensed copies of the Software for the exclusive purpose of demonstration. In this case You will be using the Software in “demo mode”. Without derogating from the forgoing, You may not use the Software in “demo mode” for any of your business purposes. The Software in “demo mode” shall only be used for evaluation purposes and may not be used or disclosed for any other purposes, including, without limitation, for external distribution. You may not remove the demo notices, if any, from the user interface of the Software nor disable the ability to display such notices nor otherwise modify the Software. Product support, if any, is not offered for the Software in “demo mode”.</p>
</li>
<li><h3>Agreement Acceptance</h3>
<p>This Agreement is automatically accepted by both parties as long as You are in possession of a legal evidence (“Legal Evidence”) that the acceptance has taken place. The Legal Evidence can be represented by (i) a copy of this Agreement signed by You and CKSource or (ii) a valid Certificate of License Ownership, provided by CKSource and addressed to You. The Legal Evidence must precisely indicate this Agreement Name, the Software Name and a summary of restrictions as described in Section 4. </p>
<p>Legal Evidences for different combinations of restrictions, Sites, Applications and SaaS will not restrict each other and will not interfere in the rights granted to You by each of them.</p>
<p>Legal Evidences are not transferable to different Sites, Applications and SaaS.</p>
</li>
<li><h3>Limitation on Releases</h3>
<p>This agreement is valid for all Releases of the Software with Release Dates within or before the 365 days that follow the Effective Date (“Upgrade Period”). CKSource has no obligation to provide you any Release that is not released for general distribution to other CKSource licensees. Nothing in this Agreement shall be construed to obligate CKSource to provide additional Releases to You under any circumstances.</p>
</li>
<li><h3>Support</h3>
<div class="support">
<p>In accordance with Section 4, CKSource shall provide support for Developers for the period of 365 days following the Effective Date (“Support Period”). Support shall be limited to electronic messaging access. CKSource shall keep You informed, either per CKSource readiness or by following your request, including changes to it, about the rules and procedures that You must perform to enjoy support under the terms of this Agreement. Support topics shall be limited to the following (each a “Support Request”):</p>
<ul class="sub">
<li class="sub"><span class="sub">a. </span>providing information in relation to the standard Software installation &amp; configuration procedures,</li>
<li class="sub"><span class="sub">b. </span>providing information about using Software's default features and functions,</li>
<li class="sub"><span class="sub">c. </span>providing information about contents of Software's standard documentation,</li>
<li class="sub"><span class="sub">d. </span>bug reporting.</li>
</ul>
<p>The number of Support Requests that CKSource is entitled to accept from You may be limited, as specified in Section 4. CKSource may refuse Support Requests that exceed these limits, if any. The decision, if one of the questions raised by You during providing support services by CKSource is a new Support Request, shall be solely made by CKSource support engineer.</p>
<p>CKSource is not in any way obliged to perform bug fixing or custom development activities as a result of a Support Request.</p>
</div>
</li>
<li><h3>License Key</h3>
<p>Whenever applicable, following a valid License purchase, a unique license key (the “License Key”) may be provided to You, which allows Software activation. The License Key is subject to the restrictions set forth in this License and may not be disclosed or distributed in any way. The disclosure or distribution of the License Key shall constitute a breach of this License, the effect of which shall be the automatic termination and revocation of any and all rights granted herein.</p>
</li>
<li><h3>Source Code</h3>
<p>The original source code (“Source Code”) of the Software may be distributed by CKSource alongside its executable version, or as an integral part of it. You may modify and compile the Source Code. The Source Code or its modified version can be copied and distributed exclusively within the scope of this license, as defined in the “License Model” terms of this license, as long as a valid license has been purchased for the distribution target. CKSource retains all rights over the Source Code and all its modified versions. Redistributions of the Source Code and modified versions of it must contain the original headers and copyright notices. Modifications to the Source Code must be explicitly and entirely identified in the Source Code files. This section of the license supersedes all modification restrictions imposed by other sections. You are not allowed to remove copyright notices nor make changes to the license validation code present in the Source Code.</p>
</li>
<li><h3>License Fee</h3>
<p>In consideration for the License granted in this Agreement during the term of this Agreement, You agreed to pay to CKSource a one-time fee (“License Fee”).</p>
<p>In consideration for the Software upgrades access and support services provided during the Upgrade Period and Support Period, You shall pay a yearly fee (“Annual Support and Upgrade Fee”).</p>
<p>The License Fee and the Annual Support and Upgrade Fee amount shall be specified by CKSource at the moment of the purchase as a single unified price.</p>
<p>The fees listed in this Agreement do not include taxes. If CKSource is required to pay any sales, use, property, excise, value added, gross receipts, withholding or other taxes levied on the Software or support under this Agreement or on Your use thereof, then such taxes shall be billed to and paid by You. This Section does not apply to taxes based on CKSource net income, franchise taxes or CKSource's employer contributions and taxes.</p>
<p>You understand that CKSource uses third-party paying agents to process selected payments. You understand that until payments are not received and verified by the paying agent, this Agreement is not valid.</p>
<p>All payments made hereunder are nonrefundable. You may not withhold or set off any amounts due under this Agreement. Failure to pay any fee when due shall constitute a material breach of this Agreement. In addition, if You fail to make any payments when due for support, upon written notice to You, CKSource shall cease providing support.</p>
</li>
<li><h3>Automatic Renewal</h3>
<p>You may opt to automatically extend the expiration date for both the Upgrade Period and Support Period by successive cycles of 365 days (each one a “Renewal”). In such case, you agree to pay a fee for each Renewal at the beginning of each cycle. The annual Renewal fee shall be informed by CKSource at the moment of the purchase and optionally agreed by you.</p>
<p>If you opted to have automatic Renewals, CKSource shall send you a payment request for the Renewal fee at any moment following the first day of each Renewal period. You shall perform the full payment in 30 calendar days following the payment request.</p>
<p>Both parties can discontinue the automatic Renewals by written notification to the other party before the beginning of extension cycles.</p>
</li>
<li><h3>Reservation of Rights and Ownership</h3>
<p>CKSource reserves all rights not expressly granted to You in this Agreement. The Software is protected by copyright and other intellectual property laws and treaties. CKSource owns the title, copyright, and other intellectual property rights in the Software. The Software is licensed, not sold. This Agreement does not grant you any rights to the Software's trademarks or services.</p>
</li>
<li><h3>Termination</h3>
<p>Without prejudice to any other rights, this Agreement automatically terminates if You fail to comply with the terms and conditions of this Agreement. You may terminate this Agreement at any time without cause. In case of termination, in any circumstance, payments issued by You will not be reimbursed.</p>
<p>You shall immediately discontinue distribution of Website, assembled with the Software, upon expiration or termination of this Agreement.</p>
</li>
<li><h3>Warranty</h3>
<p>CKSource warrants that it has full title and ownership to the Software and has the authority to grant the license hereunder. To the best of CKSource's knowledge the Software does not infringe upon the intellectual property rights of any third party and that CKSource did not receive any notice regarding any alleged infringement thereof.</p>
</li>
<li><h3>Disclaimer of Warranties</h3>
<p>With the exclusion of warranties explicitly mentioned in Section 15, the Software and its related material are provided “AS IS” and without warranty of any kind. CKSource expressly disclaims all other warranties, expressed or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose.</p>
</li>
<li><h3>Exclusion of Incidental, Consequential and Certain Other Damages</h3>
<p>TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL CKSOURCE BE LIABLE FOR ANY SPECIAL, INCIDENTAL, PUNITIVE, INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, BUT NOT LIMITED TO, DAMAGES FOR LOSS OF PROFITS OR CONFIDENTIAL OR OTHER INFORMATION, FOR BUSINESS INTERRUPTION, FOR PERSONAL INJURY, FOR LOSS OF PRIVACY, FOR FAILURE TO MEET ANY DUTY INCLUDING OF GOOD FAITH OR OF REASONABLE CARE, FOR NEGLIGENCE, AND FOR ANY OTHER PECUNIARY OR OTHER LOSS WHATSOEVER) ARISING OUT OF OR IN ANY WAY RELATED TO THE USE OF OR INABILITY TO USE THE SOFTWARE, THE PROVISION OF OR FAILURE TO PROVIDE SUPPORT OR OTHER SERVICES, INFORMATON, SOFTWARE, AND RELATED CONTENT THROUGH THE SOFTWARE OR OTHERWISE ARISING OUT OF THE USE OF THE SOFTWARE, OR OTHERWISE UNDER OR IN CONNECTION WITH ANY PROVISION OF THIS AGREEMENT, EVEN IN THE EVENT OF THE FAULT, TORT (INCLUDING NEGLIGENCE), MISREPRESENTATION, STRICT LIABILITY, BREACH OF CONTRACT, AND EVEN IF THE OWNER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
</li>
<li><h3>Limitation of Liability</h3>
<p>In no event shall CKSource's liability exceed the license fee paid, if any.</p>
</li>
<li><h3>Governing Law and Venue</h3>
<p>This Agreement shall be construed and controlled by the laws of Poland, and You and CKSource further consent to exclusive jurisdiction by the courts of Poland.</p>
<p>END OF AGREEMENT TERMS</p>
</li>
</ol>
</body>
</html>
+42
View File
@@ -0,0 +1,42 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CKFinder Readme</title>
</head>
<body>
<h1 id="ckfinder-3-for-php">CKFinder 3 for PHP</h1>
<p>Thank you for choosing CKFinder.</p>
<h2 id="feedback">Feedback</h2>
<p>Use <a href="https://github.com/ckfinder/ckfinder/issues">https://github.com/ckfinder/ckfinder/issues</a> to report issues in CKFinder 3 (and its documentation) or submit
feature requests.</p>
<p>If you are unsure what information to provide when reporting a bug, check <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/#!/guide/dev_feedback">https://ckeditor.com/docs/ckfinder/ckfinder3/#!/guide/dev_feedback</a></p>
<h2 id="translations">Translations</h2>
<p>In order to submit translations for CKFinder please visit <a href="https://github.com/ckfinder/ckfinder-translations">https://github.com/ckfinder/ckfinder-translations</a></p>
<h2 id="documentation">Documentation</h2>
<p>CKFinder is made from two parts: the client side part and the server side connector(s).</p>
<p>The client side part is common across all distributions (PHP, ASP.NET and Java), while
the server side parts are different for each language, that&#39;s why there are multiple documentation websites available.</p>
<h3 id="ckfinder-3-documentation-https-ckeditor-com-docs-ckfinder-ckfinder3-">CKFinder 3 Documentation - <a href="https://ckeditor.com/docs/ckfinder/ckfinder3/">https://ckeditor.com/docs/ckfinder/ckfinder3/</a></h3>
<p>This website contains documentation about the client side part of CKFinder, common for all versions of CKFinder 3
and includes information about:</p>
<ul>
<li>Integrating CKFinder with your website or with CKEditor.</li>
<li>Client side configuration options.</li>
<li>API documentation.</li>
<li>Tutorials about creating JavaScript plugins.</li>
<li>Tutorials about creating skins.</li>
</ul>
<h3 id="ckfinder-3-for-php-documentation-https-ckeditor-com-docs-ckfinder-ckfinder3-php-">CKFinder 3 for PHP Documentation - <a href="https://ckeditor.com/docs/ckfinder/ckfinder3-php/">https://ckeditor.com/docs/ckfinder/ckfinder3-php/</a></h3>
<p>This website contains documentation about the PHP connector for CKFinder 3 and includes information about:</p>
<ul>
<li>Enabling the PHP connector.</li>
<li>Configuring the PHP connector.</li>
<li>Tutorials about creating PHP plugins.</li>
</ul>
<h2 id="license">License</h2>
<p>Copyright (c) 2007-2021, CKSource - Frederico Knabben. All rights reserved.</p>
<p>To purchase a license for CKFinder visit <a href="https://ckeditor.com/ckfinder/">https://ckeditor.com/ckfinder/</a></p>
</body>
</html>
+21
View File
@@ -0,0 +1,21 @@
<!DOCTYPE html>
<!--
Copyright (c) 2007-2019, CKSource - Frederico Knabben. All rights reserved.
For licensing, see LICENSE.html or https://ckeditor.com/sales/license/ckfinder
-->
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
<title>CKFinder 3 - File Browser</title>
</head>
<body>
<script src="ckfinder.js"></script>
<script>
CKFinder.start();
</script>
</body>
</html>
File diff suppressed because one or more lines are too long
+14
View File
@@ -0,0 +1,14 @@
/*
Copyright (c) 2007-2019, CKSource - Frederico Knabben. All rights reserved.
For licensing, see LICENSE.html or https://ckeditor.com/sales/license/ckfinder
*/
var config = {};
// Set your configuration options below.
// Examples:
// config.language = 'pl';
// config.skin = 'jquery-mobile';
CKFinder.define( config );
+26
View File
@@ -0,0 +1,26 @@
/*
Copyright (c) 2007-2019, CKSource - Frederico Knabben. All rights reserved.
For licensing, see LICENSE.html or https://ckeditor.com/sales/license/ckfinder
*/
var config = {};
$config['authentication'] = function () {
return true;
};
config['backends'][] = array(
'name' => 'default',
'adapter' => 'local',
'baseUrl' => '/public/images/post/',
// 'root' => '', // Can be used to explicitly set the CKFinder user files directory.
'chmodFiles' => 0777,
'chmodFolders' => 0755,
'filesystemEncoding' => 'UTF-8',
);
// Set your configuration options below.
// Examples:
// config.language = 'pl';
// config.skin = 'jquery-mobile';
CKFinder.define( config );
+181
View File
@@ -0,0 +1,181 @@
<?php
use Illuminate\Support\Facades\Auth;
/*
* CKFinder Configuration File
*
* For the official documentation visit https://ckeditor.com/docs/ckfinder/ckfinder3-php/
*/
/*============================ PHP Error Reporting ====================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/debugging.html
// Production
error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT);
ini_set('display_errors', 0);
// Development
// error_reporting(E_ALL);
// ini_set('display_errors', 1);
/*============================ General Settings =======================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html
$config = array();
/*============================ Enable PHP Connector HERE ==============================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_authentication
session_start();
$config['authentication'] = function () {
return isset($_SESSION['IsAuthorized']) && $_SESSION['IsAuthorized'];
// return true;
};
/*============================ License Key ============================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_licenseKey
$config['licenseName'] = '';
$config['licenseKey'] = '';
/*============================ CKFinder Internal Directory ============================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_privateDir
$config['privateDir'] = array(
'backend' => 'default',
'tags' => '.ckfinder/tags',
'logs' => '.ckfinder/logs',
'cache' => '.ckfinder/cache',
'thumbs' => '.ckfinder/cache/thumbs',
);
/*============================ Images and Thumbnails ==================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_images
$config['images'] = array(
'maxWidth' => 1600,
'maxHeight' => 2000,
'quality' => 80,
'sizes' => array(
'small' => array('width' => 480, 'height' => 480, 'quality' => 80),
'medium' => array('width' => 600, 'height' => 600, 'quality' => 80),
'large' => array('width' => 800, 'height' => 800, 'quality' => 80)
)
);
/*=================================== Backends ========================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_backends
$config['backends'][] = array(
'name' => 'default',
'adapter' => 'local',
'baseUrl' => '/public/images/post/',
// 'root' => '', // Can be used to explicitly set the CKFinder user files directory.
'chmodFiles' => 0777,
'chmodFolders' => 0755,
'filesystemEncoding' => 'UTF-8',
);
/*================================ Resource Types =====================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_resourceTypes
$config['defaultResourceTypes'] = '';
$config['resourceTypes'][] = array(
'name' => 'Files', // Single quotes not allowed.
'directory' => 'files',
'maxSize' => 0,
'allowedExtensions' => '7z,aiff,asf,avi,bmp,csv,doc,docx,fla,flv,gif,gz,gzip,jpeg,jpg,mid,mov,mp3,mp4,mpc,mpeg,mpg,ods,odt,pdf,png,ppt,pptx,qt,ram,rar,rm,rmi,rmvb,rtf,sdc,swf,sxc,sxw,tar,tgz,tif,tiff,txt,vsd,wav,wma,wmv,xls,xlsx,zip',
'deniedExtensions' => '',
'backend' => 'default'
);
$config['resourceTypes'][] = array(
'name' => 'Images',
'directory' => 'images',
'maxSize' => 0,
'allowedExtensions' => 'bmp,gif,jpeg,jpg,png',
'deniedExtensions' => '',
'backend' => 'default'
);
/*================================ Access Control =====================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_roleSessionVar
$config['roleSessionVar'] = 'CKFinder_UserRole';
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_accessControl
$config['accessControl'][] = array(
'role' => '*',
'resourceType' => '*',
'folder' => '/',
'FOLDER_VIEW' => true,
'FOLDER_CREATE' => true,
'FOLDER_RENAME' => true,
'FOLDER_DELETE' => true,
'FILE_VIEW' => true,
'FILE_CREATE' => true,
'FILE_RENAME' => true,
'FILE_DELETE' => true,
'IMAGE_RESIZE' => true,
'IMAGE_RESIZE_CUSTOM' => true
);
/*================================ Other Settings =====================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html
$config['overwriteOnUpload'] = false;
$config['checkDoubleExtension'] = true;
$config['disallowUnsafeCharacters'] = false;
$config['secureImageUploads'] = true;
$config['checkSizeAfterScaling'] = true;
$config['htmlExtensions'] = array('html', 'htm', 'xml', 'js');
$config['hideFolders'] = array('.*', 'CVS', '__thumbs');
$config['hideFiles'] = array('.*');
$config['forceAscii'] = false;
$config['xSendfile'] = false;
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_debug
$config['debug'] = false;
/*==================================== Plugins ========================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_plugins
$config['pluginsDirectory'] = __DIR__ . '/plugins';
$config['plugins'] = array();
/*================================ Cache settings =====================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_cache
$config['cache'] = array(
'imagePreview' => 24 * 3600,
'thumbnails' => 24 * 3600 * 365,
'proxyCommand' => 0
);
/*============================ Temp Directory settings ================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_tempDirectory
$config['tempDirectory'] = sys_get_temp_dir();
/*============================ Session Cause Performance Issues =======================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_sessionWriteClose
$config['sessionWriteClose'] = true;
/*================================= CSRF protection ===================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_csrfProtection
$config['csrfProtection'] = true;
/*===================================== Headers =======================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_headers
$config['headers'] = array();
/*============================== End of Configuration =================================*/
// Config must be returned - do not change it.
return $config;
+180
View File
@@ -0,0 +1,180 @@
<?php
/*
* CKFinder Configuration File
*
* For the official documentation visit https://ckeditor.com/docs/ckfinder/ckfinder3-php/
*/
/*============================ PHP Error Reporting ====================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/debugging.html
// Production
error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT);
ini_set('display_errors', 0);
// Development
// error_reporting(E_ALL);
// ini_set('display_errors', 1);
/*============================ General Settings =======================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html
$config = array();
/*============================ Enable PHP Connector HERE ==============================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_authentication
$config['authentication'] = function () {
return true;
};
/*============================ License Key ============================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_licenseKey
$config['licenseName'] = '';
$config['licenseKey'] = '';
/*============================ CKFinder Internal Directory ============================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_privateDir
$config['privateDir'] = array(
'backend' => 'default',
'tags' => '.ckfinder/tags',
'logs' => '.ckfinder/logs',
'cache' => '.ckfinder/cache',
'thumbs' => '.ckfinder/cache/thumbs',
);
/*============================ Images and Thumbnails ==================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_images
$config['images'] = array(
'maxWidth' => 1600,
'maxHeight' => 1200,
'quality' => 80,
'sizes' => array(
'small' => array('width' => 480, 'height' => 320, 'quality' => 80),
'medium' => array('width' => 600, 'height' => 480, 'quality' => 80),
'large' => array('width' => 800, 'height' => 600, 'quality' => 80)
)
);
/*=================================== Backends ========================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_backends
$config['backends'][] = array(
'name' => 'default',
'adapter' => 'local',
'baseUrl' => '/ckfinder/userfiles/',
// 'root' => '', // Can be used to explicitly set the CKFinder user files directory.
'chmodFiles' => 0777,
'chmodFolders' => 0755,
'filesystemEncoding' => 'UTF-8',
);
/*================================ Resource Types =====================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_resourceTypes
$config['defaultResourceTypes'] = '';
$config['resourceTypes'][] = array(
'name' => 'Files', // Single quotes not allowed.
'directory' => 'files',
'maxSize' => 0,
'allowedExtensions' => '7z,aiff,asf,avi,bmp,csv,doc,docx,fla,flv,gif,gz,gzip,jpeg,jpg,mid,mov,mp3,mp4,mpc,mpeg,mpg,ods,odt,pdf,png,ppt,pptx,qt,ram,rar,rm,rmi,rmvb,rtf,sdc,swf,sxc,sxw,tar,tgz,tif,tiff,txt,vsd,wav,wma,wmv,xls,xlsx,zip',
'deniedExtensions' => '',
'backend' => 'default'
);
$config['resourceTypes'][] = array(
'name' => 'Images',
'directory' => 'images',
'maxSize' => 0,
'allowedExtensions' => 'bmp,gif,jpeg,jpg,png',
'deniedExtensions' => '',
'backend' => 'default'
);
/*================================ Access Control =====================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_roleSessionVar
$config['roleSessionVar'] = 'CKFinder_UserRole';
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_accessControl
$config['accessControl'][] = array(
'role' => '*',
'resourceType' => '*',
'folder' => '/',
'FOLDER_VIEW' => true,
'FOLDER_CREATE' => true,
'FOLDER_RENAME' => true,
'FOLDER_DELETE' => true,
'FILE_VIEW' => true,
'FILE_CREATE' => true,
'FILE_RENAME' => true,
'FILE_DELETE' => true,
'IMAGE_RESIZE' => true,
'IMAGE_RESIZE_CUSTOM' => true
);
/*================================ Other Settings =====================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html
$config['overwriteOnUpload'] = false;
$config['checkDoubleExtension'] = true;
$config['disallowUnsafeCharacters'] = false;
$config['secureImageUploads'] = true;
$config['checkSizeAfterScaling'] = true;
$config['htmlExtensions'] = array('html', 'htm', 'xml', 'js');
$config['hideFolders'] = array('.*', 'CVS', '__thumbs');
$config['hideFiles'] = array('.*');
$config['forceAscii'] = false;
$config['xSendfile'] = false;
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_debug
$config['debug'] = false;
/*==================================== Plugins ========================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_plugins
$config['pluginsDirectory'] = __DIR__ . '/plugins';
$config['plugins'] = array();
/*================================ Cache settings =====================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_cache
$config['cache'] = array(
'imagePreview' => 24 * 3600,
'thumbnails' => 24 * 3600 * 365,
'proxyCommand' => 0
);
/*============================ Temp Directory settings ================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_tempDirectory
$config['tempDirectory'] = sys_get_temp_dir();
/*============================ Session Cause Performance Issues =======================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_sessionWriteClose
$config['sessionWriteClose'] = true;
/*================================= CSRF protection ===================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_csrfProtection
$config['csrfProtection'] = true;
/*===================================== Headers =======================================*/
// https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html#configuration_options_headers
$config['headers'] = array();
/*============================== End of Configuration =================================*/
// Config must be returned - do not change it.
return $config;
@@ -0,0 +1,20 @@
<?php
/*
* CKFinder
* ========
* https://ckeditor.com/ckeditor-4/ckfinder/
* Copyright (c) 2007-2019, CKSource - Frederico Knabben. All rights reserved.
*
* The software, this file and its contents are subject to the CKFinder
* License. Please read the license.txt file before using, installing, copying,
* modifying or distribute this file or part of its contents. The contents of
* this file is part of the Source Code of CKFinder.
*/
require_once __DIR__ . '/vendor/autoload.php';
use CKSource\CKFinder\CKFinder;
$ckfinder = new CKFinder(__DIR__ . '/../../../config.php');
$ckfinder->run();
@@ -0,0 +1,7 @@
<?php
// autoload.php @generated by Composer
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInitf62c5d72efa7ef951c181e85a3dd4828::getLoader();
@@ -0,0 +1,4 @@
## Code of Conduct
This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct).
For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact
opensource-codeofconduct@amazon.com with any additional questions or comments.
@@ -0,0 +1,61 @@
# Contributing Guidelines
Thank you for your interest in contributing to our project. Whether it's a bug report, new feature, correction, or additional
documentation, we greatly value feedback and contributions from our community.
Please read through this document before submitting any issues or pull requests to ensure we have all the necessary
information to effectively respond to your bug report or contribution.
## Reporting Bugs/Feature Requests
We welcome you to use the GitHub issue tracker to report bugs or suggest features.
When filing an issue, please check existing open, or recently closed, issues to make sure somebody else hasn't already
reported the issue. Please try to include as much information as you can. Details like these are incredibly useful:
* A reproducible test case or series of steps
* The version of our code being used
* Any modifications you've made relevant to the bug
* Anything unusual about your environment or deployment
## Contributing via Pull Requests
Contributions via pull requests are much appreciated. Before sending us a pull request, please ensure that:
1. You are working against the latest source on the *master* branch.
2. You check existing open, and recently merged, pull requests to make sure someone else hasn't addressed the problem already.
3. You open an issue to discuss any significant work - we would hate for your time to be wasted.
To send us a pull request, please:
1. Fork the repository.
2. Modify the source; please focus on the specific change you are contributing. If you also reformat all the code, it will be hard for us to focus on your change.
3. Ensure local tests pass.
4. Commit to your fork using clear commit messages.
5. Send us a pull request, answering any default questions in the pull request interface.
6. Pay attention to any automated CI failures reported in the pull request, and stay involved in the conversation.
GitHub provides additional document on [forking a repository](https://help.github.com/articles/fork-a-repo/) and
[creating a pull request](https://help.github.com/articles/creating-a-pull-request/).
## Finding contributions to work on
Looking at the existing issues is a great way to find something to contribute on. As our projects, by default, use the default GitHub issue labels (enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any 'help wanted' issues is a great place to start.
## Code of Conduct
This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct).
For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact
opensource-codeofconduct@amazon.com with any additional questions or comments.
## Security issue notifications
If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public github issue.
## Licensing
See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to confirm the licensing of your contribution.
We may ask you to sign a [Contributor License Agreement (CLA)](http://en.wikipedia.org/wiki/Contributor_License_Agreement) for larger changes.
@@ -0,0 +1,175 @@
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.
@@ -0,0 +1,72 @@
INT_DIR=build/install
GENERATE_STUBS=$(shell expr `php --version | head -1 | cut -f 2 -d' '` \>= 7.1)
CMAKE = cmake3
ifeq (, $(shell which cmake3))
CMAKE = cmake
endif
# default to using system OpenSSL, if disabled aws-lc will be used
USE_OPENSSL ?= ON
ifneq (OFF,$(USE_OPENSSL))
CMAKE_USE_OPENSSL=-DUSE_OPENSSL=ON
# if a path was provided, add it to CMAKE_PREFIX_PATH
ifneq (ON,$(USE_OPENSSL))
CMAKE_PREFIX_PATH=-DCMAKE_PREFIX_PATH=$(USE_OPENSSL)
endif
endif
CMAKE_CONFIGURE = $(CMAKE) \
-DCMAKE_INSTALL_PREFIX=$(INT_DIR) \
-DBUILD_TESTING=OFF \
-DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE) \
$(CMAKE_USE_OPENSSL) \
$(CMAKE_PREFIX_PATH)
CMAKE_BUILD = CMAKE_BUILD_PARALLEL_LEVEL='' $(CMAKE) --build
CMAKE_BUILD_TYPE ?= RelWithDebInfo
CMAKE_TARGET = --config $(CMAKE_BUILD_TYPE) --target install
all: extension
.PHONY: all extension
# configure for static aws-crt-ffi.a
build/aws-crt-ffi-static/CMakeCache.txt:
$(CMAKE_CONFIGURE) -Hcrt/aws-crt-ffi -Bbuild/aws-crt-ffi-static -DBUILD_SHARED_LIBS=OFF
# build static libaws-crt-ffi.a
build/aws-crt-ffi-static/libaws-crt-ffi.a: build/aws-crt-ffi-static/CMakeCache.txt
$(CMAKE_BUILD) build/aws-crt-ffi-static $(CMAKE_TARGET)
# PHP extension target
extension: ext/awscrt.lo
# Force the crt object target to depend on the CRT static library
ext/awscrt.lo: ext/awscrt.c
ext/awscrt.c: build/aws-crt-ffi-static/libaws-crt-ffi.a ext/api.h ext/awscrt_arginfo.h
ext/awscrt_arginfo.h: ext/awscrt.stub.php gen_stub.php
ifeq ($(GENERATE_STUBS),1)
# generate awscrt_arginfo.h
php gen_stub.php --minimal-arginfo ext/awscrt.stub.php
endif
# transform/install api.h from FFI lib
src/api.h: crt/aws-crt-ffi/src/api.h
php gen_api.php crt/aws-crt-ffi/src/api.h > src/api.h
# install api.h to ext/ as well
ext/api.h : src/api.h
cp -v src/api.h ext/api.h
ext/php_aws_crt.h: ext/awscrt_arginfo.h ext/api.h
vendor/bin/phpunit:
composer update
test-extension: vendor/bin/phpunit extension
composer run test-extension
# Use PHPUnit to run tests
test: test-extension
@@ -0,0 +1,35 @@
CMAKE=cmake.exe
COMPOSER_PHAR=C:\ProgramData\ComposerSetup\bin\composer.phar
PHP_BINARY=$(PHP_PREFIX)\php.exe
CMAKE_CONFIGURE = $(CMAKE) -DCMAKE_INSTALL_PREFIX=$(AWSCRT_DIR)\build\install -DCMAKE_PREFIX_PATH=$(AWSCRT_DIR)\build\install -DBUILD_TESTING=OFF -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE)
CMAKE_BUILD = $(CMAKE) --build
CMAKE_BUILD_TYPE = Release
CMAKE_TARGET = --config $(CMAKE_BUILD_TYPE) --target install
# configure for static aws-crt-ffi.lib
$(AWSCRT_DIR)\build\CMakeCache.txt:
$(CMAKE_CONFIGURE) -H$(AWSCRT_DIR)\crt\aws-crt-ffi -B$(AWSCRT_DIR)\build -DBUILD_SHARED_LIBS=OFF
# build static libaws-crt-ffi.lib
$(AWSCRT_DIR)\build\libaws-crt-ffi.lib: $(AWSCRT_DIR)\build\CMakeCache.txt
$(CMAKE_BUILD) $(AWSCRT_DIR)\build $(CMAKE_TARGET)
# Force the awscrt extension DLL target to depend on the extension src
$(BUILD_DIR)\php_awscrt.dll: $(AWSCRT_DIR)\ext\awscrt.c
$(AWSCRT_DIR)\ext\awscrt.c: $(AWSCRT_DIR)\build\libaws-crt-ffi.lib $(AWSCRT_DIR)\ext\api.h $(AWSCRT_DIR)\ext\awscrt_arginfo.h
# transform\install api.h from FFI lib
$(AWSCRT_DIR)\src\api.h: $(AWSCRT_DIR)\crt\aws-crt-ffi\src\api.h
php $(AWSCRT_DIR)\gen_api.php $(AWSCRT_DIR)\crt\aws-crt-ffi\src\api.h > $(AWSCRT_DIR)\src\api.h
# install api.h to ext/ as well
$(AWSCRT_DIR)\ext\api.h : $(AWSCRT_DIR)\src\api.h
copy $(AWSCRT_DIR)\src\api.h $(AWSCRT_DIR)\ext\api.h
# Use PHPUnit to run tests
test-awscrt: install $(AWSCRT_DIR)\src\api.h $(BUILD_DIR)\php_awscrt.dll
$(PHP_BINARY) -c $(AWSCRT_DIR)\php-win.ini $(COMPOSER_PHAR) --working-dir=$(AWSCRT_DIR) update
$(PHP_BINARY) -c $(AWSCRT_DIR)\php-win.ini $(COMPOSER_PHAR) --working-dir=$(AWSCRT_DIR) run test-win
@@ -0,0 +1 @@
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
@@ -0,0 +1,80 @@
# AWS Common Runtime PHP bindings
## Requirements
* PHP 5.5+ on UNIX platforms, 7.2+ on Windows
* CMake 3.x
* GCC 4.4+, clang 3.8+ on UNIX, Visual Studio 2017 build tools on Windows
* Tests require [Composer](https://getcomposer.org)
## Building on UNIX
```sh
$ git clone --recursive https://github.com/awslabs/aws-crt-php.git
$ cd aws-crt-php
$ phpize
$ ./configure
$ make && make test
```
## Building on Windows
* First, ensure that you are able to build PHP on windows via the PHP SDK (this example assumes installation of the SDK to C:\php-sdk and that you've checked out the PHP source to php-src within the build directory). The following resources are helpful to get PHP building on windows:
* https://github.com/microsoft/php-sdk-binary-tools
* https://medium.com/@erinus/how-to-build-php-on-windows-a7ad0a87862a
* https://medium.com/@erinus/how-to-build-php-extension-on-windows-d1667290f809
```bat
""" From VS2017 Command Prompt
> C:\php-sdk\phpsdk-vc15-x64.bat
C:\php-sdk\
$ phpsdk_buildtree php-<version>
C:\php-sdk\php-<version>\vc15\x64\
$ git clone https://github.com/php/php-src.git && cd php-src
""" This only has to be done once, the first time you set this all up
C:\php-sdk\php-<version>\vc15\x64\php-src
$ phpsdk_deps --update --branch <php-major.minor-version>
C:\php-sdk\php-<version>\vc15\x64\php-src
$ git clone --recursive https://github.com/awslabs/aws-crt-php.git ..\pecl\awscrt
C:\php-sdk\php-<version>\vc15\x64\php-src
$ buildconf
C:\php-sdk\php-<version>\vc15\x64\php-src
$ configure --enable-cli --with-openssl --enable-awscrt=shared
C:\php-sdk\php-<version>\vc15\x64\php-src
$ nmake
C:\php-sdk\php-<version>\vc15\x64\php-src
$ nmake test-awscrt
```
## Debugging
Using [PHPBrew](https://github.com/phpbrew/phpbrew) to build/manage multiple versions of PHP is helpful.
Note: You must use a debug build of PHP to debug native extensions.
See the [PHP Internals Book](https://www.phpinternalsbook.com/php7/build_system/building_php.html) for more info
```shell
# PHP 8 example
$ phpbrew install --stdout -j 8 8.0 +default -- CFLAGS=-Wno-error --disable-cgi --enable-debug
# PHP 5.5 example
$ phpbrew install --stdout -j 8 5.5 +default -openssl -mbstring -- CFLAGS="-w -Wno-error" --enable-debug --with-zlib=/usr/local/opt/zlib
$ phpbrew switch php-8.0.6 # or whatever version is current, it'll be at the end of the build output
$ phpize
$ ./configure
$ make CMAKE_BUILD_TYPE=Debug
```
Ensure that the php you launch from your debugger is the result of `which php`, not just
the system default php.
## Security
See [CONTRIBUTING](CONTRIBUTING.md#security-issue-notifications) for more information.
## License
This project is licensed under the Apache-2.0 License.
@@ -0,0 +1,37 @@
{
"name": "aws-crt-php",
"hosts": {
"ubuntu": {
"pkg_setup": [
"add-apt-repository -y ppa:ondrej/php"
],
"packages": [
"autotools-dev",
"autoconf",
"libtool",
"clang",
"php5.6-dev"
]
},
"al2": {
"packages": [
"autoconf",
"automake",
"libtool",
"clang",
"php-devel"
]
}
},
"build_steps": [
["phpize"],
["./configure"],
["make"]
],
"test_env": {
"NO_INTERACTION": "1"
},
"test_steps": [
["./run_tests"]
]
}
@@ -0,0 +1,34 @@
{
"name": "aws/aws-crt-php",
"homepage": "http://aws.amazon.com/sdkforphp",
"description": "AWS Common Runtime for PHP",
"keywords": ["aws","amazon","sdk","crt"],
"type": "library",
"authors": [
{
"name": "AWS SDK Common Runtime Team",
"email": "aws-sdk-common-runtime@amazon.com"
}
],
"config": {
"platform": {"php": "5.6"}
},
"minimum-stability": "alpha",
"require": {
"php": ">=5.5"
},
"require-dev": {
"phpunit/phpunit":"^4.8.35|^5.4.3"
},
"autoload": {
"classmap": [
"src/"
]
},
"scripts": {
"test": "./run_tests",
"test-extension": "@test",
"test-win": "run_tests"
},
"license": "Apache-2.0"
}
@@ -0,0 +1,30 @@
dnl
dnl * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
dnl * SPDX-License-Identifier: Apache-2.0.
dnl
PHP_ARG_WITH(awscrt, for AWS Common Runtime support,
[ --with-awscrt Include awscrt support])
if test "$PHP_AWSCRT" != "no"; then
# force lib paths to be absolute, or PHP will mangle them
cwd=`pwd`
# Enable s2n and libcrypto for non-darwin UNIX
if uname -a | grep -i darwin > /dev/null 2>&1; then
platform_tls_libs=""
else
platform_tls_libs="-ls2n -lcrypto"
fi
CRT_LIBPATHS="-L${cwd}/build/install/lib -L${cwd}/build/install/lib64"
CRT_LIBS="-laws-crt-ffi -laws-c-auth -laws-c-http -laws-c-io -laws-c-cal -laws-c-compression -laws-checksums -laws-c-common ${platform_tls_libs}"
PHP_ADD_INCLUDE(${cwd}/build/install/include)
PHP_EVAL_LIBLINE([$CRT_LIBPATHS $CRT_LIBS], AWSCRT_SHARED_LIBADD)
# Shoves the linker line into the Makefile
PHP_SUBST(AWSCRT_SHARED_LIBADD)
# Sources for the PHP extension itself
AWSCRT_SOURCES=ext/awscrt.c
PHP_NEW_EXTENSION(awscrt, $AWSCRT_SOURCES, $ext_shared)
PHP_ADD_MAKEFILE_FRAGMENT
fi
@@ -0,0 +1,13 @@
// vim:ft=javascript
ARG_ENABLE("awscrt", "Include AWS Common Runtime support", "yes");
if (PHP_AWSCRT != "no") {
ADD_MAKEFILE_FRAGMENT();
DEFINE('CFLAGS_AWSCRT', '/I ' + configure_module_dirname + '\\build\\install\\include');
DEFINE('LIBS_AWSCRT', '/LIBPATH:' + configure_module_dirname + '\\build\\install\\lib ' +
'aws-crt-ffi.lib aws-c-auth.lib aws-c-http.lib aws-c-io.lib aws-c-cal.lib aws-c-compression.lib aws-c-common.lib ' +
'ncrypt.lib Secur32.lib Crypt32.lib Shlwapi.lib');
DEFINE('AWSCRT_DIR', configure_module_dirname);
EXTENSION("awscrt", "ext\\awscrt.c", PHP_AWSCRT_SHARED);
}
@@ -0,0 +1,17 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
/* This is a unity-build style source file, as PHP's build system is simplest with 1 source file per extension */
#include "credentials.c"
#include "crt.c"
#include "event_loop.c"
#include "http.c"
#include "signing.c"
#include "stream.c"
// #include "hash.c"
#include "crc.c"
#include "logging.c"
#include "php_util.c"
@@ -0,0 +1,88 @@
<?php
/**
* @generate-class-entries
* @generate-function-entries
*/
function aws_crt_last_error(): int {}
function aws_crt_error_name(int $error_code): string {}
function aws_crt_error_str(int $error_code): string {}
function aws_crt_error_debug_str(int $error_code): string {}
function aws_crt_log_to_stdout(): void {}
function aws_crt_log_to_stderr(): void {}
function aws_crt_log_to_file(string $filename): void {}
function aws_crt_log_to_stream(object $stream): void {}
function aws_crt_log_stop(): void {}
function aws_crt_log_set_level(int $level): void {}
function aws_crt_log_message(string $message): void {}
function aws_crt_event_loop_group_options_new(): int {}
function aws_crt_event_loop_group_options_release(int $elg_options): void {}
function aws_crt_event_loop_group_options_set_max_threads(int $elg_options, int $max_threads): void {}
function aws_crt_event_loop_group_new(object $options): object {}
function aws_crt_event_loop_group_release(object $event_loop_group): void {}
function aws_crt_input_stream_options_new(): object {}
function aws_crt_input_stream_options_release(object $options): void {}
function aws_crt_input_stream_options_set_user_data(object $options, object $user_data): void {}
function aws_crt_input_stream_new(object $options): object {}
function aws_crt_input_stream_release(int $stream): void {}
function aws_crt_input_stream_seek(int $stream, int $offset, int $basis): int {}
function aws_crt_input_stream_read(int $stream, int $length): string {}
function aws_crt_input_stream_eof(int $stream): bool {}
function aws_crt_input_stream_get_length(int $stream): int {}
function aws_crt_http_message_new_from_blob(string $blob): int {}
function aws_crt_http_message_to_blob(int $message): string {}
function aws_crt_http_message_release(int $message): void {}
function aws_crt_credentials_options_new(): object {}
function aws_crt_credentials_options_release(object $options): void {}
function aws_crt_credentials_options_set_access_key_id(object $options, string $access_key_id): void {}
function aws_crt_credentials_options_set_secret_access_key(object $options, string $secret_access_key): void {}
function aws_crt_credentials_options_set_session_token(object $options, string $session_token): void {}
function aws_crt_credentials_options_set_expiration_timepoint_seconds(object $options, int $expiration_timepoint_seconds): void {}
function aws_crt_credentials_new(object $options): object {}
function aws_crt_credentials_release(object $credentials): void {}
function aws_crt_credentials_provider_release(int $credentials): void {}
function aws_crt_credentials_provider_static_options_new(): object {}
function aws_crt_credentials_provider_static_options_release(object $options): void {}
function aws_crt_credentials_provider_static_options_set_access_key_id(object $options, string $access_key_id): void {}
function aws_crt_credentials_provider_static_options_set_secret_access_key(object $options, string $secret_access_key): void {}
function aws_crt_credentials_provider_static_options_set_session_token(object $options, string $session_token): void {}
function aws_crt_credentials_provider_static_new(object $options): object {}
function aws_crt_signing_config_aws_new(): int {}
function aws_crt_signing_config_aws_release(int $config): void {}
function aws_crt_signing_config_aws_set_algorithm(int $config, int $algorithm): void {}
function aws_crt_signing_config_aws_set_signature_type(int $config, int $signature_type): void {}
function aws_crt_signing_config_aws_set_credentials_provider(int $config, int $credentials_provider): void {}
function aws_crt_signing_config_aws_set_region(int $config, string $region): void {}
function aws_crt_signing_config_aws_set_service(int $config, string $service): void {}
function aws_crt_signing_config_aws_set_use_double_uri_encode(int $config, bool $use_double_uri_encode): void {}
function aws_crt_signing_config_aws_set_should_normalize_uri_path(int $config, bool $should_normalize_uri_path): void {}
function aws_crt_signing_config_aws_set_omit_session_token(int $config, bool $omit_session_token): void {}
function aws_crt_signing_config_aws_set_signed_body_value(int $config, string $signed_body_value): void {}
function aws_crt_signing_config_aws_set_signed_body_header_type(int $config, int $signed_body_header_type): void {}
function aws_crt_signing_config_aws_set_expiration_in_seconds(int $config, int $expiration_in_seconds): void {}
function aws_crt_signing_config_aws_set_date(int $config, int $timestamp): void {}
function aws_crt_signing_config_aws_set_should_sign_header_fn(int $config, object $should_sign_header): void {}
function aws_crt_signable_new_from_http_request(int $http_message): int {}
function aws_crt_signable_new_from_chunk(int $input_stream, string $previous_signature): int {}
function aws_crt_signable_new_from_canonical_request(string $request): int {}
function aws_crt_signable_release(int $signable): void {}
function aws_crt_signing_result_release(int $signing_result): void {}
function aws_crt_signing_result_apply_to_http_request(object $signing_result, object $http_request): void {}
function aws_crt_sign_request_aws(int $signable, int $signing_config, object $on_complete, object $user_data): int {}
function aws_crt_test_verify_sigv4a_signing(int $signable, int $signing_config, string $expected_canonical_request, string $signature, string $ecc_key_pub_x, string $ecc_key_pub_y): bool {}
function aws_crt_crc32(string $input, int $prev): int {}
function aws_crt_crc32c(string $input, int $prev): int {}
@@ -0,0 +1,413 @@
/* This is a generated file, edit the .stub.php file instead.
* Stub hash: 344f9d59b85697b80bb6808ac7d5eb7c1d07c03f */
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_last_error, 0, 0, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_error_name, 0, 0, 1)
ZEND_ARG_INFO(0, error_code)
ZEND_END_ARG_INFO()
#define arginfo_aws_crt_error_str arginfo_aws_crt_error_name
#define arginfo_aws_crt_error_debug_str arginfo_aws_crt_error_name
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_log_to_stdout, 0, 0, 0)
ZEND_END_ARG_INFO()
#define arginfo_aws_crt_log_to_stderr arginfo_aws_crt_log_to_stdout
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_log_to_file, 0, 0, 1)
ZEND_ARG_INFO(0, filename)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_log_to_stream, 0, 0, 1)
ZEND_ARG_INFO(0, stream)
ZEND_END_ARG_INFO()
#define arginfo_aws_crt_log_stop arginfo_aws_crt_log_to_stdout
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_log_set_level, 0, 0, 1)
ZEND_ARG_INFO(0, level)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_log_message, 0, 0, 1)
ZEND_ARG_INFO(0, message)
ZEND_END_ARG_INFO()
#define arginfo_aws_crt_event_loop_group_options_new arginfo_aws_crt_last_error
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_event_loop_group_options_release, 0, 0, 1)
ZEND_ARG_INFO(0, elg_options)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_event_loop_group_options_set_max_threads, 0, 0, 2)
ZEND_ARG_INFO(0, elg_options)
ZEND_ARG_INFO(0, max_threads)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_event_loop_group_new, 0, 0, 1)
ZEND_ARG_INFO(0, options)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_event_loop_group_release, 0, 0, 1)
ZEND_ARG_INFO(0, event_loop_group)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_input_stream_options_new, 0, 0, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_input_stream_options_release, 0, 0, 1)
ZEND_ARG_INFO(0, options)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_input_stream_options_set_user_data, 0, 0, 2)
ZEND_ARG_INFO(0, options)
ZEND_ARG_INFO(0, user_data)
ZEND_END_ARG_INFO()
#define arginfo_aws_crt_input_stream_new arginfo_aws_crt_event_loop_group_new
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_input_stream_release, 0, 0, 1)
ZEND_ARG_INFO(0, stream)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_input_stream_seek, 0, 0, 3)
ZEND_ARG_INFO(0, stream)
ZEND_ARG_INFO(0, offset)
ZEND_ARG_INFO(0, basis)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_input_stream_read, 0, 0, 2)
ZEND_ARG_INFO(0, stream)
ZEND_ARG_INFO(0, length)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_input_stream_eof, 0, 0, 1)
ZEND_ARG_INFO(0, stream)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_input_stream_get_length, 0, 0, 1)
ZEND_ARG_INFO(0, stream)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_http_message_new_from_blob, 0, 0, 1)
ZEND_ARG_INFO(0, blob)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_http_message_to_blob, 0, 0, 1)
ZEND_ARG_INFO(0, message)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_http_message_release, 0, 0, 1)
ZEND_ARG_INFO(0, message)
ZEND_END_ARG_INFO()
#define arginfo_aws_crt_credentials_options_new arginfo_aws_crt_input_stream_options_new
#define arginfo_aws_crt_credentials_options_release arginfo_aws_crt_input_stream_options_release
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_credentials_options_set_access_key_id, 0, 0, 2)
ZEND_ARG_INFO(0, options)
ZEND_ARG_INFO(0, access_key_id)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_credentials_options_set_secret_access_key, 0, 0, 2)
ZEND_ARG_INFO(0, options)
ZEND_ARG_INFO(0, secret_access_key)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_credentials_options_set_session_token, 0, 0, 2)
ZEND_ARG_INFO(0, options)
ZEND_ARG_INFO(0, session_token)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_credentials_options_set_expiration_timepoint_seconds, 0, 0, 2)
ZEND_ARG_INFO(0, options)
ZEND_ARG_INFO(0, expiration_timepoint_seconds)
ZEND_END_ARG_INFO()
#define arginfo_aws_crt_credentials_new arginfo_aws_crt_event_loop_group_new
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_credentials_release, 0, 0, 1)
ZEND_ARG_INFO(0, credentials)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_credentials_provider_release, 0, 0, 1)
ZEND_ARG_INFO(0, credentials)
ZEND_END_ARG_INFO()
#define arginfo_aws_crt_credentials_provider_static_options_new arginfo_aws_crt_input_stream_options_new
#define arginfo_aws_crt_credentials_provider_static_options_release arginfo_aws_crt_input_stream_options_release
#define arginfo_aws_crt_credentials_provider_static_options_set_access_key_id arginfo_aws_crt_credentials_options_set_access_key_id
#define arginfo_aws_crt_credentials_provider_static_options_set_secret_access_key arginfo_aws_crt_credentials_options_set_secret_access_key
#define arginfo_aws_crt_credentials_provider_static_options_set_session_token arginfo_aws_crt_credentials_options_set_session_token
#define arginfo_aws_crt_credentials_provider_static_new arginfo_aws_crt_event_loop_group_new
#define arginfo_aws_crt_signing_config_aws_new arginfo_aws_crt_last_error
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_release, 0, 0, 1)
ZEND_ARG_INFO(0, config)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_algorithm, 0, 0, 2)
ZEND_ARG_INFO(0, config)
ZEND_ARG_INFO(0, algorithm)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_signature_type, 0, 0, 2)
ZEND_ARG_INFO(0, config)
ZEND_ARG_INFO(0, signature_type)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_credentials_provider, 0, 0, 2)
ZEND_ARG_INFO(0, config)
ZEND_ARG_INFO(0, credentials_provider)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_region, 0, 0, 2)
ZEND_ARG_INFO(0, config)
ZEND_ARG_INFO(0, region)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_service, 0, 0, 2)
ZEND_ARG_INFO(0, config)
ZEND_ARG_INFO(0, service)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_use_double_uri_encode, 0, 0, 2)
ZEND_ARG_INFO(0, config)
ZEND_ARG_INFO(0, use_double_uri_encode)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_should_normalize_uri_path, 0, 0, 2)
ZEND_ARG_INFO(0, config)
ZEND_ARG_INFO(0, should_normalize_uri_path)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_omit_session_token, 0, 0, 2)
ZEND_ARG_INFO(0, config)
ZEND_ARG_INFO(0, omit_session_token)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_signed_body_value, 0, 0, 2)
ZEND_ARG_INFO(0, config)
ZEND_ARG_INFO(0, signed_body_value)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_signed_body_header_type, 0, 0, 2)
ZEND_ARG_INFO(0, config)
ZEND_ARG_INFO(0, signed_body_header_type)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_expiration_in_seconds, 0, 0, 2)
ZEND_ARG_INFO(0, config)
ZEND_ARG_INFO(0, expiration_in_seconds)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_date, 0, 0, 2)
ZEND_ARG_INFO(0, config)
ZEND_ARG_INFO(0, timestamp)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_should_sign_header_fn, 0, 0, 2)
ZEND_ARG_INFO(0, config)
ZEND_ARG_INFO(0, should_sign_header)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signable_new_from_http_request, 0, 0, 1)
ZEND_ARG_INFO(0, http_message)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signable_new_from_chunk, 0, 0, 2)
ZEND_ARG_INFO(0, input_stream)
ZEND_ARG_INFO(0, previous_signature)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signable_new_from_canonical_request, 0, 0, 1)
ZEND_ARG_INFO(0, request)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signable_release, 0, 0, 1)
ZEND_ARG_INFO(0, signable)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_result_release, 0, 0, 1)
ZEND_ARG_INFO(0, signing_result)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_result_apply_to_http_request, 0, 0, 2)
ZEND_ARG_INFO(0, signing_result)
ZEND_ARG_INFO(0, http_request)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_sign_request_aws, 0, 0, 4)
ZEND_ARG_INFO(0, signable)
ZEND_ARG_INFO(0, signing_config)
ZEND_ARG_INFO(0, on_complete)
ZEND_ARG_INFO(0, user_data)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_test_verify_sigv4a_signing, 0, 0, 6)
ZEND_ARG_INFO(0, signable)
ZEND_ARG_INFO(0, signing_config)
ZEND_ARG_INFO(0, expected_canonical_request)
ZEND_ARG_INFO(0, signature)
ZEND_ARG_INFO(0, ecc_key_pub_x)
ZEND_ARG_INFO(0, ecc_key_pub_y)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_crc32, 0, 0, 2)
ZEND_ARG_INFO(0, input)
ZEND_ARG_INFO(0, prev)
ZEND_END_ARG_INFO()
#define arginfo_aws_crt_crc32c arginfo_aws_crt_crc32
ZEND_FUNCTION(aws_crt_last_error);
ZEND_FUNCTION(aws_crt_error_name);
ZEND_FUNCTION(aws_crt_error_str);
ZEND_FUNCTION(aws_crt_error_debug_str);
ZEND_FUNCTION(aws_crt_log_to_stdout);
ZEND_FUNCTION(aws_crt_log_to_stderr);
ZEND_FUNCTION(aws_crt_log_to_file);
ZEND_FUNCTION(aws_crt_log_to_stream);
ZEND_FUNCTION(aws_crt_log_stop);
ZEND_FUNCTION(aws_crt_log_set_level);
ZEND_FUNCTION(aws_crt_log_message);
ZEND_FUNCTION(aws_crt_event_loop_group_options_new);
ZEND_FUNCTION(aws_crt_event_loop_group_options_release);
ZEND_FUNCTION(aws_crt_event_loop_group_options_set_max_threads);
ZEND_FUNCTION(aws_crt_event_loop_group_new);
ZEND_FUNCTION(aws_crt_event_loop_group_release);
ZEND_FUNCTION(aws_crt_input_stream_options_new);
ZEND_FUNCTION(aws_crt_input_stream_options_release);
ZEND_FUNCTION(aws_crt_input_stream_options_set_user_data);
ZEND_FUNCTION(aws_crt_input_stream_new);
ZEND_FUNCTION(aws_crt_input_stream_release);
ZEND_FUNCTION(aws_crt_input_stream_seek);
ZEND_FUNCTION(aws_crt_input_stream_read);
ZEND_FUNCTION(aws_crt_input_stream_eof);
ZEND_FUNCTION(aws_crt_input_stream_get_length);
ZEND_FUNCTION(aws_crt_http_message_new_from_blob);
ZEND_FUNCTION(aws_crt_http_message_to_blob);
ZEND_FUNCTION(aws_crt_http_message_release);
ZEND_FUNCTION(aws_crt_credentials_options_new);
ZEND_FUNCTION(aws_crt_credentials_options_release);
ZEND_FUNCTION(aws_crt_credentials_options_set_access_key_id);
ZEND_FUNCTION(aws_crt_credentials_options_set_secret_access_key);
ZEND_FUNCTION(aws_crt_credentials_options_set_session_token);
ZEND_FUNCTION(aws_crt_credentials_options_set_expiration_timepoint_seconds);
ZEND_FUNCTION(aws_crt_credentials_new);
ZEND_FUNCTION(aws_crt_credentials_release);
ZEND_FUNCTION(aws_crt_credentials_provider_release);
ZEND_FUNCTION(aws_crt_credentials_provider_static_options_new);
ZEND_FUNCTION(aws_crt_credentials_provider_static_options_release);
ZEND_FUNCTION(aws_crt_credentials_provider_static_options_set_access_key_id);
ZEND_FUNCTION(aws_crt_credentials_provider_static_options_set_secret_access_key);
ZEND_FUNCTION(aws_crt_credentials_provider_static_options_set_session_token);
ZEND_FUNCTION(aws_crt_credentials_provider_static_new);
ZEND_FUNCTION(aws_crt_signing_config_aws_new);
ZEND_FUNCTION(aws_crt_signing_config_aws_release);
ZEND_FUNCTION(aws_crt_signing_config_aws_set_algorithm);
ZEND_FUNCTION(aws_crt_signing_config_aws_set_signature_type);
ZEND_FUNCTION(aws_crt_signing_config_aws_set_credentials_provider);
ZEND_FUNCTION(aws_crt_signing_config_aws_set_region);
ZEND_FUNCTION(aws_crt_signing_config_aws_set_service);
ZEND_FUNCTION(aws_crt_signing_config_aws_set_use_double_uri_encode);
ZEND_FUNCTION(aws_crt_signing_config_aws_set_should_normalize_uri_path);
ZEND_FUNCTION(aws_crt_signing_config_aws_set_omit_session_token);
ZEND_FUNCTION(aws_crt_signing_config_aws_set_signed_body_value);
ZEND_FUNCTION(aws_crt_signing_config_aws_set_signed_body_header_type);
ZEND_FUNCTION(aws_crt_signing_config_aws_set_expiration_in_seconds);
ZEND_FUNCTION(aws_crt_signing_config_aws_set_date);
ZEND_FUNCTION(aws_crt_signing_config_aws_set_should_sign_header_fn);
ZEND_FUNCTION(aws_crt_signable_new_from_http_request);
ZEND_FUNCTION(aws_crt_signable_new_from_chunk);
ZEND_FUNCTION(aws_crt_signable_new_from_canonical_request);
ZEND_FUNCTION(aws_crt_signable_release);
ZEND_FUNCTION(aws_crt_signing_result_release);
ZEND_FUNCTION(aws_crt_signing_result_apply_to_http_request);
ZEND_FUNCTION(aws_crt_sign_request_aws);
ZEND_FUNCTION(aws_crt_test_verify_sigv4a_signing);
ZEND_FUNCTION(aws_crt_crc32);
ZEND_FUNCTION(aws_crt_crc32c);
static const zend_function_entry ext_functions[] = {
ZEND_FE(aws_crt_last_error, arginfo_aws_crt_last_error)
ZEND_FE(aws_crt_error_name, arginfo_aws_crt_error_name)
ZEND_FE(aws_crt_error_str, arginfo_aws_crt_error_str)
ZEND_FE(aws_crt_error_debug_str, arginfo_aws_crt_error_debug_str)
ZEND_FE(aws_crt_log_to_stdout, arginfo_aws_crt_log_to_stdout)
ZEND_FE(aws_crt_log_to_stderr, arginfo_aws_crt_log_to_stderr)
ZEND_FE(aws_crt_log_to_file, arginfo_aws_crt_log_to_file)
ZEND_FE(aws_crt_log_to_stream, arginfo_aws_crt_log_to_stream)
ZEND_FE(aws_crt_log_stop, arginfo_aws_crt_log_stop)
ZEND_FE(aws_crt_log_set_level, arginfo_aws_crt_log_set_level)
ZEND_FE(aws_crt_log_message, arginfo_aws_crt_log_message)
ZEND_FE(aws_crt_event_loop_group_options_new, arginfo_aws_crt_event_loop_group_options_new)
ZEND_FE(aws_crt_event_loop_group_options_release, arginfo_aws_crt_event_loop_group_options_release)
ZEND_FE(aws_crt_event_loop_group_options_set_max_threads, arginfo_aws_crt_event_loop_group_options_set_max_threads)
ZEND_FE(aws_crt_event_loop_group_new, arginfo_aws_crt_event_loop_group_new)
ZEND_FE(aws_crt_event_loop_group_release, arginfo_aws_crt_event_loop_group_release)
ZEND_FE(aws_crt_input_stream_options_new, arginfo_aws_crt_input_stream_options_new)
ZEND_FE(aws_crt_input_stream_options_release, arginfo_aws_crt_input_stream_options_release)
ZEND_FE(aws_crt_input_stream_options_set_user_data, arginfo_aws_crt_input_stream_options_set_user_data)
ZEND_FE(aws_crt_input_stream_new, arginfo_aws_crt_input_stream_new)
ZEND_FE(aws_crt_input_stream_release, arginfo_aws_crt_input_stream_release)
ZEND_FE(aws_crt_input_stream_seek, arginfo_aws_crt_input_stream_seek)
ZEND_FE(aws_crt_input_stream_read, arginfo_aws_crt_input_stream_read)
ZEND_FE(aws_crt_input_stream_eof, arginfo_aws_crt_input_stream_eof)
ZEND_FE(aws_crt_input_stream_get_length, arginfo_aws_crt_input_stream_get_length)
ZEND_FE(aws_crt_http_message_new_from_blob, arginfo_aws_crt_http_message_new_from_blob)
ZEND_FE(aws_crt_http_message_to_blob, arginfo_aws_crt_http_message_to_blob)
ZEND_FE(aws_crt_http_message_release, arginfo_aws_crt_http_message_release)
ZEND_FE(aws_crt_credentials_options_new, arginfo_aws_crt_credentials_options_new)
ZEND_FE(aws_crt_credentials_options_release, arginfo_aws_crt_credentials_options_release)
ZEND_FE(aws_crt_credentials_options_set_access_key_id, arginfo_aws_crt_credentials_options_set_access_key_id)
ZEND_FE(aws_crt_credentials_options_set_secret_access_key, arginfo_aws_crt_credentials_options_set_secret_access_key)
ZEND_FE(aws_crt_credentials_options_set_session_token, arginfo_aws_crt_credentials_options_set_session_token)
ZEND_FE(aws_crt_credentials_options_set_expiration_timepoint_seconds, arginfo_aws_crt_credentials_options_set_expiration_timepoint_seconds)
ZEND_FE(aws_crt_credentials_new, arginfo_aws_crt_credentials_new)
ZEND_FE(aws_crt_credentials_release, arginfo_aws_crt_credentials_release)
ZEND_FE(aws_crt_credentials_provider_release, arginfo_aws_crt_credentials_provider_release)
ZEND_FE(aws_crt_credentials_provider_static_options_new, arginfo_aws_crt_credentials_provider_static_options_new)
ZEND_FE(aws_crt_credentials_provider_static_options_release, arginfo_aws_crt_credentials_provider_static_options_release)
ZEND_FE(aws_crt_credentials_provider_static_options_set_access_key_id, arginfo_aws_crt_credentials_provider_static_options_set_access_key_id)
ZEND_FE(aws_crt_credentials_provider_static_options_set_secret_access_key, arginfo_aws_crt_credentials_provider_static_options_set_secret_access_key)
ZEND_FE(aws_crt_credentials_provider_static_options_set_session_token, arginfo_aws_crt_credentials_provider_static_options_set_session_token)
ZEND_FE(aws_crt_credentials_provider_static_new, arginfo_aws_crt_credentials_provider_static_new)
ZEND_FE(aws_crt_signing_config_aws_new, arginfo_aws_crt_signing_config_aws_new)
ZEND_FE(aws_crt_signing_config_aws_release, arginfo_aws_crt_signing_config_aws_release)
ZEND_FE(aws_crt_signing_config_aws_set_algorithm, arginfo_aws_crt_signing_config_aws_set_algorithm)
ZEND_FE(aws_crt_signing_config_aws_set_signature_type, arginfo_aws_crt_signing_config_aws_set_signature_type)
ZEND_FE(aws_crt_signing_config_aws_set_credentials_provider, arginfo_aws_crt_signing_config_aws_set_credentials_provider)
ZEND_FE(aws_crt_signing_config_aws_set_region, arginfo_aws_crt_signing_config_aws_set_region)
ZEND_FE(aws_crt_signing_config_aws_set_service, arginfo_aws_crt_signing_config_aws_set_service)
ZEND_FE(aws_crt_signing_config_aws_set_use_double_uri_encode, arginfo_aws_crt_signing_config_aws_set_use_double_uri_encode)
ZEND_FE(aws_crt_signing_config_aws_set_should_normalize_uri_path, arginfo_aws_crt_signing_config_aws_set_should_normalize_uri_path)
ZEND_FE(aws_crt_signing_config_aws_set_omit_session_token, arginfo_aws_crt_signing_config_aws_set_omit_session_token)
ZEND_FE(aws_crt_signing_config_aws_set_signed_body_value, arginfo_aws_crt_signing_config_aws_set_signed_body_value)
ZEND_FE(aws_crt_signing_config_aws_set_signed_body_header_type, arginfo_aws_crt_signing_config_aws_set_signed_body_header_type)
ZEND_FE(aws_crt_signing_config_aws_set_expiration_in_seconds, arginfo_aws_crt_signing_config_aws_set_expiration_in_seconds)
ZEND_FE(aws_crt_signing_config_aws_set_date, arginfo_aws_crt_signing_config_aws_set_date)
ZEND_FE(aws_crt_signing_config_aws_set_should_sign_header_fn, arginfo_aws_crt_signing_config_aws_set_should_sign_header_fn)
ZEND_FE(aws_crt_signable_new_from_http_request, arginfo_aws_crt_signable_new_from_http_request)
ZEND_FE(aws_crt_signable_new_from_chunk, arginfo_aws_crt_signable_new_from_chunk)
ZEND_FE(aws_crt_signable_new_from_canonical_request, arginfo_aws_crt_signable_new_from_canonical_request)
ZEND_FE(aws_crt_signable_release, arginfo_aws_crt_signable_release)
ZEND_FE(aws_crt_signing_result_release, arginfo_aws_crt_signing_result_release)
ZEND_FE(aws_crt_signing_result_apply_to_http_request, arginfo_aws_crt_signing_result_apply_to_http_request)
ZEND_FE(aws_crt_sign_request_aws, arginfo_aws_crt_sign_request_aws)
ZEND_FE(aws_crt_test_verify_sigv4a_signing, arginfo_aws_crt_test_verify_sigv4a_signing)
ZEND_FE(aws_crt_crc32, arginfo_aws_crt_crc32)
ZEND_FE(aws_crt_crc32c, arginfo_aws_crt_crc32c)
ZEND_FE_END
};
@@ -0,0 +1,32 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#include "php_aws_crt.h"
PHP_FUNCTION(aws_crt_crc32) {
zend_ulong prev = 0;
const char *input = NULL;
size_t len = 0;
aws_php_parse_parameters("sl", &input, &len, &prev);
if (prev > UINT32_MAX) {
aws_php_throw_exception("previous crc cannot be larger than UINT32_MAX");
}
RETURN_LONG((zend_ulong)aws_crt_crc32((const uint8_t *)input, len, prev));
}
PHP_FUNCTION(aws_crt_crc32c) {
zend_ulong prev = 0;
const char *input = NULL;
size_t len = 0;
aws_php_parse_parameters("sl", &input, &len, &prev);
if (prev > UINT32_MAX) {
aws_php_throw_exception("previous crc cannot be larger than UINT32_MAX");
}
RETURN_LONG((zend_ulong)aws_crt_crc32c((const uint8_t *)input, len, prev));
}
@@ -0,0 +1,154 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#include "php_aws_crt.h"
PHP_FUNCTION(aws_crt_credentials_options_new) {
aws_crt_credentials_options *options = aws_crt_credentials_options_new();
RETURN_LONG((zend_ulong)options);
}
PHP_FUNCTION(aws_crt_credentials_options_release) {
zend_ulong php_options = 0;
aws_php_parse_parameters("l", &php_options);
aws_crt_credentials_options *options = (void *)php_options;
aws_crt_credentials_options_release(options);
}
PHP_FUNCTION(aws_crt_credentials_options_set_access_key_id) {
zend_ulong php_options = 0;
const char *access_key_id = NULL;
size_t access_key_id_len = 0;
aws_php_parse_parameters("ls", &php_options, &access_key_id, &access_key_id_len);
aws_crt_credentials_options *options = (void *)php_options;
aws_crt_credentials_options_set_access_key_id(options, (uint8_t *)access_key_id, access_key_id_len);
}
PHP_FUNCTION(aws_crt_credentials_options_set_secret_access_key) {
zend_ulong php_options = 0;
const char *secret_access_key = NULL;
size_t secret_access_key_len = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ls", &php_options, &secret_access_key, &secret_access_key_len) ==
FAILURE) {
RETURN_NULL();
}
aws_crt_credentials_options *options = (void *)php_options;
aws_crt_credentials_options_set_secret_access_key(options, (uint8_t *)secret_access_key, secret_access_key_len);
}
PHP_FUNCTION(aws_crt_credentials_options_set_session_token) {
zend_ulong php_options = 0;
const char *session_token = NULL;
size_t session_token_len = 0;
aws_php_parse_parameters("ls", &php_options, &session_token, &session_token_len);
aws_crt_credentials_options *options = (void *)php_options;
aws_crt_credentials_options_set_session_token(options, (uint8_t *)session_token, session_token_len);
}
PHP_FUNCTION(aws_crt_credentials_options_set_expiration_timepoint_seconds) {
zend_ulong php_options = 0;
zend_ulong expiration_timepoint_seconds = 0;
aws_php_parse_parameters("ll", &php_options, &expiration_timepoint_seconds);
aws_crt_credentials_options *options = (void *)php_options;
aws_crt_credentials_options_set_expiration_timepoint_seconds(options, expiration_timepoint_seconds);
}
PHP_FUNCTION(aws_crt_credentials_new) {
zend_ulong php_options = 0;
aws_php_parse_parameters("l", &php_options);
aws_crt_credentials_options *options = (void *)php_options;
aws_crt_credentials *credentials = aws_crt_credentials_new(options);
RETURN_LONG((zend_ulong)credentials);
}
PHP_FUNCTION(aws_crt_credentials_release) {
zend_ulong php_credentials = 0;
aws_php_parse_parameters("l", &php_credentials);
aws_crt_credentials *credentials = (void *)php_credentials;
aws_crt_credentials_release(credentials);
}
PHP_FUNCTION(aws_crt_credentials_provider_release) {
zend_ulong php_creds_provider = 0;
aws_php_parse_parameters("l", &php_creds_provider);
aws_crt_credentials_provider *provider = (void *)php_creds_provider;
aws_crt_credentials_provider_release(provider);
}
PHP_FUNCTION(aws_crt_credentials_provider_static_options_new) {
aws_crt_credentials_provider_static_options *options = aws_crt_credentials_provider_static_options_new();
RETURN_LONG((zend_ulong)options);
}
PHP_FUNCTION(aws_crt_credentials_provider_static_options_release) {
zend_ulong php_options = 0;
aws_php_parse_parameters("l", &php_options);
aws_crt_credentials_provider_static_options *options = (void *)php_options;
aws_crt_credentials_provider_static_options_release(options);
}
PHP_FUNCTION(aws_crt_credentials_provider_static_options_set_access_key_id) {
zend_ulong php_options = 0;
const char *access_key_id = NULL;
size_t access_key_id_len = 0;
aws_php_parse_parameters("ls", &php_options, &access_key_id, &access_key_id_len);
aws_crt_credentials_provider_static_options *options = (void *)php_options;
aws_crt_credentials_provider_static_options_set_access_key_id(options, (uint8_t *)access_key_id, access_key_id_len);
}
PHP_FUNCTION(aws_crt_credentials_provider_static_options_set_secret_access_key) {
zend_ulong php_options = 0;
const char *secret_access_key = NULL;
size_t secret_access_key_len = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ls", &php_options, &secret_access_key, &secret_access_key_len) ==
FAILURE) {
RETURN_NULL();
}
aws_crt_credentials_provider_static_options *options = (void *)php_options;
aws_crt_credentials_provider_static_options_set_secret_access_key(
options, (uint8_t *)secret_access_key, secret_access_key_len);
}
PHP_FUNCTION(aws_crt_credentials_provider_static_options_set_session_token) {
zend_ulong php_options = 0;
const char *session_token = NULL;
size_t session_token_len = 0;
aws_php_parse_parameters("ls", &php_options, &session_token, &session_token_len);
aws_crt_credentials_provider_static_options *options = (void *)php_options;
aws_crt_credentials_provider_static_options_set_session_token(options, (uint8_t *)session_token, session_token_len);
}
PHP_FUNCTION(aws_crt_credentials_provider_static_new) {
zend_ulong php_options = 0;
aws_php_parse_parameters("l", &php_options);
aws_crt_credentials_provider_static_options *options = (void *)php_options;
aws_crt_credentials_provider *provider = aws_crt_credentials_provider_static_new(options);
RETURN_LONG((zend_ulong)provider);
}
@@ -0,0 +1,314 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#include "php_aws_crt.h"
/* Helpful references for this extension:
* zend_parse_parameters and friends -
* https://git.php.net/?p=php-src.git;a=blob;f=docs/parameter-parsing-api.md;h=c962fc6ee58cc756aaac9e65759b7d5ea5c18fc4;hb=HEAD
* https://git.php.net/?p=php-src.git;a=blob;f=docs/self-contained-extensions.md;h=47f4c636baca8ca195118e2cc234ac7fd2842c1b;hb=HEAD
* Threads:
* http://blog.jpauli.tech/2017-01-12-threads-and-php-html/
* Examples:
* Curl extension: https://github.com/php/php-src/blob/PHP-5.6/ext/curl/interface.c
* libuv extension: https://github.com/amphp/ext-uv/blob/master/php_uv.c
*/
zval aws_php_invoke_callback(zval *callback, const char *arg_types, ...) {
char *error = NULL;
zend_fcall_info fci = {0};
zend_fcall_info_cache fcc = empty_fcall_info_cache;
if (zend_fcall_info_init(callback, IS_CALLABLE_CHECK_SYNTAX_ONLY, &fci, &fcc, NULL, &error) == FAILURE) {
aws_php_throw_exception("Unable to initialize callback from callable via zend_fcall_info_init: %s", error);
}
/* Allocate the stack frame of zval arguments and fill them in */
const size_t num_args = strlen(arg_types);
zval *stack = alloca(sizeof(zval) * num_args);
int arg_idx = 0;
va_list va;
va_start(va, arg_types);
while (arg_idx < num_args) {
const char arg_type = arg_types[arg_idx];
switch (arg_type) {
/* zval types */
case 'a':
case 'A':
case 'n':
case 'o':
case 'r':
case 'z': {
zval *zval_val = va_arg(va, zval *);
ZVAL_ZVAL(&stack[arg_idx], zval_val, 0, 0);
break;
}
/* buffers/strings (char *, size_t) */
case 'p':
case 's': {
const char *buf = va_arg(va, const char *);
const size_t len = va_arg(va, size_t);
aws_php_zval_stringl(&stack[arg_idx], buf, len);
break;
}
/* other primitives */
case 'b': {
zend_bool bool_val = va_arg(va, int);
ZVAL_BOOL(&stack[arg_idx], bool_val);
break;
}
case 'd': {
double double_val = va_arg(va, double);
ZVAL_DOUBLE(&stack[arg_idx], double_val);
break;
}
case 'l': {
zend_ulong long_val = va_arg(va, zend_ulong);
ZVAL_LONG(&stack[arg_idx], long_val);
break;
}
/* strings (zend_string), not supported in PHP 5.6, therefore not supported */
case 'P':
case 'S':
/* unsupported */
case 'C':
case 'f':
case 'h':
case 'H':
case 'O':
aws_php_throw_exception("Unsupported argument type to aws_php_invoke_callback: %c", arg_type);
break;
default:
aws_php_throw_exception("Unsupported argument type to aws_php_invoke_callback: %c", arg_type);
break;
}
++arg_idx;
}
va_end(va);
/* set up the stack for the call */
#if AWS_PHP_AT_LEAST_7
zend_fcall_info_argp(&fci, num_args, stack);
#else
/* PHP5.6 may mutate the arguments due to coercion */
zval **arg_ptrs = alloca(sizeof(zval *) * num_args);
zval ***args = alloca(sizeof(zval **) * num_args);
for (int arg_idx = 0; arg_idx < num_args; ++arg_idx) {
arg_ptrs[arg_idx] = &stack[arg_idx];
args[arg_idx] = &arg_ptrs[arg_idx];
}
fci.param_count = num_args;
fci.params = args;
#endif
zval retval;
/* PHP5 allocates its own return value, 7+ uses an existing one we provide */
#if !AWS_PHP_AT_LEAST_7
zval *retval5 = NULL;
fci.retval_ptr_ptr = &retval5;
#else
fci.retval = &retval;
#endif
if (zend_call_function(&fci, &fcc) == FAILURE) {
aws_php_throw_exception("zend_call_function failed in aws_php_invoke_callback");
}
#if !AWS_PHP_AT_LEAST_7
/* initialize the local retval from the retval in retval_ptr_ptr above */
if (retval5) {
ZVAL_ZVAL(&retval, retval5, 1, 1);
}
#endif
/* Clean up arguments */
#if AWS_PHP_AT_LEAST_7
zend_fcall_info_args_clear(&fci, 1);
#endif
return retval;
}
void aws_php_zval_stringl(zval *val, const char *str, size_t len) {
AWS_FATAL_ASSERT(val != NULL);
#if AWS_PHP_AT_LEAST_7
ZVAL_STRINGL(val, str, len);
#else
ZVAL_STRINGL(val, str, len, 1);
#endif
}
aws_php_thread_queue s_aws_php_main_thread_queue;
bool aws_php_is_main_thread(void) {
return s_aws_php_main_thread_queue.thread_id == aws_thread_current_thread_id();
}
void aws_php_thread_queue_init(aws_php_thread_queue *queue) {
aws_mutex_init(&queue->mutex);
memset(queue->queue, 0, sizeof(aws_php_task) * AWS_PHP_THREAD_QUEUE_MAX_DEPTH);
queue->write_slot = 0;
queue->thread_id = aws_thread_current_thread_id();
}
void aws_php_thread_queue_clean_up(aws_php_thread_queue *queue) {
assert(queue->write_slot == 0 && "aws_php_thread_queue cannot be cleaned up while queue is not empty");
aws_mutex_clean_up(&queue->mutex);
}
void aws_php_thread_queue_push(aws_php_thread_queue *queue, aws_php_task task) {
aws_mutex_lock(&queue->mutex);
assert(queue->write_slot < AWS_PHP_THREAD_QUEUE_MAX_DEPTH && "thread queue is full");
queue->queue[queue->write_slot++] = task;
aws_mutex_unlock(&queue->mutex);
}
bool aws_php_thread_queue_drain(aws_php_thread_queue *queue) {
assert(
queue->thread_id == aws_thread_current_thread_id() &&
"thread queue cannot be drained from a thread other than its home");
aws_php_task drain_queue[AWS_PHP_THREAD_QUEUE_MAX_DEPTH];
aws_mutex_lock(&queue->mutex);
/* copy any queued tasks into the drain queue, then reset the queue */
memcpy(drain_queue, queue->queue, sizeof(aws_php_task) * AWS_PHP_THREAD_QUEUE_MAX_DEPTH);
memset(queue->queue, 0, sizeof(aws_php_task) * AWS_PHP_THREAD_QUEUE_MAX_DEPTH);
queue->write_slot = 0;
aws_mutex_unlock(&queue->mutex);
bool did_work = false;
for (int idx = 0; idx < AWS_PHP_THREAD_QUEUE_MAX_DEPTH; ++idx) {
aws_php_task *task = &drain_queue[idx];
if (!task->callback) {
break;
}
did_work = true;
task->callback(task->data);
if (task->dtor) {
task->dtor(task->data);
}
}
return did_work;
}
/* called on main thread after delivery */
static void s_thread_queue_complete_promise(void *data) {
struct aws_promise *promise = data;
aws_promise_complete(promise, NULL, NULL);
}
/* called from worker thread to wait for the main thread to execute any queued work in PHP */
void aws_php_thread_queue_yield(aws_php_thread_queue *queue) {
/* If on the main thread, then just drain the queue */
if (aws_php_is_main_thread()) {
aws_php_thread_queue_drain(queue);
} else {
/* push a task onto the end of the queue, we will return once this task completes our promise */
struct aws_promise *queue_drained = aws_promise_new(aws_crt_default_allocator());
aws_php_task queue_drained_task = {
.callback = s_thread_queue_complete_promise,
.data = queue_drained,
};
aws_php_thread_queue_push(queue, queue_drained_task);
aws_promise_wait(queue_drained);
aws_promise_release(queue_drained);
}
}
/* called from PHP thread to wait on async queued jobs, one of which should complete the promise */
void aws_php_thread_queue_wait(aws_php_thread_queue *queue, struct aws_promise *promise) {
while (!aws_promise_is_complete(promise)) {
aws_php_thread_queue_drain(queue);
}
}
ZEND_DECLARE_MODULE_GLOBALS(awscrt);
PHP_INI_BEGIN()
STD_PHP_INI_ENTRY(
"awscrt.log_level",
"",
PHP_INI_ALL,
OnUpdateLongGEZero,
log_level,
zend_awscrt_globals,
awscrt_globals)
PHP_INI_END()
static PHP_MINIT_FUNCTION(awscrt) {
REGISTER_INI_ENTRIES();
/* prevent s2n from initializing/de-initializing OpenSSL/libcrypto */
aws_crt_crypto_share();
aws_crt_init();
aws_php_thread_queue_init(&s_aws_php_main_thread_queue);
return SUCCESS;
}
static PHP_MSHUTDOWN_FUNCTION(awscrt) {
UNREGISTER_INI_ENTRIES();
aws_php_thread_queue_clean_up(&s_aws_php_main_thread_queue);
aws_crt_thread_join_all(0);
aws_crt_clean_up();
return SUCCESS;
}
static PHP_GINIT_FUNCTION(awscrt) {
#if defined(COMPILE_DL_ASTKIT) && defined(ZTS)
ZEND_TSRMLS_CACHE_UPDATE();
#endif
awscrt_globals->log_level = 0;
}
zend_module_entry awscrt_module_entry = {
STANDARD_MODULE_HEADER,
"awscrt",
ext_functions, /* functions */
PHP_MINIT(awscrt),
PHP_MSHUTDOWN(awscrt),
NULL, /* RINIT */
NULL, /* RSHUTDOWN */
NULL, /* MINFO */
NO_VERSION_YET,
PHP_MODULE_GLOBALS(awscrt),
PHP_GINIT(awscrt),
NULL, /* GSHUTDOWN */
NULL, /* RPOSTSHUTDOWN */
STANDARD_MODULE_PROPERTIES_EX,
};
#ifdef COMPILE_DL_AWSCRT
ZEND_GET_MODULE(awscrt)
#endif
/* aws_crt_last_error() */
PHP_FUNCTION(aws_crt_last_error) {
RETURN_LONG(aws_crt_last_error());
}
/* aws_crt_error_str(int error_code) */
PHP_FUNCTION(aws_crt_error_str) {
zend_ulong error_code = 0;
aws_php_parse_parameters("l", &error_code);
XRETURN_STRING(aws_crt_error_str(error_code));
}
/* aws_crt_error_name(int error_code) */
PHP_FUNCTION(aws_crt_error_name) {
zend_ulong error_code = 0;
aws_php_parse_parameters("l", &error_code);
XRETURN_STRING(aws_crt_error_name(error_code));
}
/* aws_crt_error_debug_str(int error_code) */
PHP_FUNCTION(aws_crt_error_debug_str) {
zend_ulong error_code = 0;
aws_php_parse_parameters("l", &error_code);
XRETURN_STRING(aws_crt_error_debug_str(error_code));
}
@@ -0,0 +1,48 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#include "php_aws_crt.h"
PHP_FUNCTION(aws_crt_event_loop_group_options_new) {
aws_php_parse_parameters_none();
aws_crt_event_loop_group_options *options = aws_crt_event_loop_group_options_new();
RETURN_LONG((zend_ulong)options);
}
PHP_FUNCTION(aws_crt_event_loop_group_options_release) {
zend_ulong php_options = 0;
aws_php_parse_parameters("l", &php_options);
aws_crt_event_loop_group_options *options = (void *)php_options;
aws_crt_event_loop_group_options_release(options);
}
PHP_FUNCTION(aws_crt_event_loop_group_options_set_max_threads) {
zend_ulong php_options = 0;
zend_ulong num_threads = 0;
aws_php_parse_parameters("ll", &php_options, &num_threads);
aws_crt_event_loop_group_options *options = (void *)php_options;
aws_crt_event_loop_group_options_set_max_threads(options, num_threads);
}
PHP_FUNCTION(aws_crt_event_loop_group_new) {
zend_ulong php_options = 0;
aws_php_parse_parameters("l", &php_options);
aws_crt_event_loop_group_options *options = (void *)php_options;
aws_crt_event_loop_group *elg = aws_crt_event_loop_group_new(options);
RETURN_LONG((zend_ulong)elg);
}
PHP_FUNCTION(aws_crt_event_loop_group_release) {
zend_ulong php_elg = 0;
aws_php_parse_parameters("l", &php_elg);
aws_crt_event_loop_group *elg = (void *)php_elg;
aws_crt_event_loop_group_release(elg);
}
@@ -0,0 +1,36 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#include "php_aws_crt.h"
PHP_FUNCTION(aws_crt_http_message_new_from_blob) {
const char *blob = NULL;
size_t blob_len = 0;
aws_php_parse_parameters("s", &blob, &blob_len);
aws_crt_http_message *message = aws_crt_http_message_new_from_blob((uint8_t *)blob, blob_len);
RETURN_LONG((zend_ulong)message);
}
PHP_FUNCTION(aws_crt_http_message_to_blob) {
zend_ulong php_msg = 0;
aws_php_parse_parameters("l", &php_msg);
aws_crt_http_message *message = (void *)php_msg;
aws_crt_buf blob;
aws_crt_http_message_to_blob(message, &blob);
XRETURN_STRINGL((const char *)blob.blob, blob.length);
}
PHP_FUNCTION(aws_crt_http_message_release) {
zend_ulong php_msg = 0;
aws_php_parse_parameters("l", &php_msg);
aws_crt_http_message *message = (void *)php_msg;
aws_crt_http_message_release(message);
}
@@ -0,0 +1,65 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#include "php_aws_crt.h"
PHP_FUNCTION(aws_crt_log_to_stdout) {
aws_php_parse_parameters_none();
aws_crt_log_to_stdout();
}
PHP_FUNCTION(aws_crt_log_to_stderr) {
aws_php_parse_parameters_none();
aws_crt_log_to_stderr();
}
PHP_FUNCTION(aws_crt_log_to_file) {
const char *filename = NULL;
size_t filename_len = 0;
/* read the filename as a path, which guarantees no NUL bytes */
aws_php_parse_parameters("p", &filename, &filename_len);
aws_crt_log_to_file(filename);
}
static void php_crt_log(const char *message, size_t len, void *user_data) {
php_stream *stream = user_data;
php_stream_write(stream, message, len);
php_stream_flush(stream);
}
PHP_FUNCTION(aws_crt_log_to_stream) {
zval *php_log_stream = NULL;
aws_php_parse_parameters("r", &php_log_stream);
if (php_log_stream) {
php_stream *stream = NULL;
Z_ADDREF(*php_log_stream);
AWS_PHP_STREAM_FROM_ZVAL(stream, php_log_stream);
aws_crt_log_to_callback((aws_crt_log_callback *)php_crt_log, stream);
} else {
aws_crt_log_to_callback(NULL, NULL);
}
}
PHP_FUNCTION(aws_crt_log_set_level) {
zend_ulong log_level = 0;
aws_php_parse_parameters("l", &log_level);
aws_crt_log_set_level((aws_crt_log_level)log_level);
}
PHP_FUNCTION(aws_crt_log_stop) {
aws_php_parse_parameters_none();
aws_crt_log_stop();
}
PHP_FUNCTION(aws_crt_log_message) {
zend_ulong log_level = 0;
const char *message = NULL;
size_t message_len = 0;
aws_php_parse_parameters("ls", &log_level, &message, &message_len);
aws_crt_log_message((aws_crt_log_level)log_level, (const uint8_t *)message, message_len);
}
@@ -0,0 +1,171 @@
#ifndef PHP_AWS_CRT_H
#define PHP_AWS_CRT_H
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "php.h"
#include "Zend/zend_extensions.h" /* for ZEND_EXTENSION_API_NO */
#include <aws/common/common.h>
#include <aws/common/mutex.h>
#include <aws/common/promise.h>
#include <aws/common/thread.h>
/* ZEND_EXTENSION_API_NO from each branch of the PHP source */
#define AWS_PHP_EXTENSION_API_5_5 220121212
#define AWS_PHP_EXTENSION_API_5_6 220131226
#define AWS_PHP_EXTENSION_API_7_0 320151012
#define AWS_PHP_EXTENSION_API_7_1 320160303
#define AWS_PHP_EXTENSION_API_7_2 320170718
#define AWS_PHP_EXTENSION_API_7_3 320180731
#define AWS_PHP_EXTENSION_API_7_4 320190902
#define AWS_PHP_EXTENSION_API_8_0 420200930
#if ZEND_EXTENSION_API_NO < AWS_PHP_EXTENSION_API_5_5
# error "PHP >= 5.5 is required"
#endif
#define AWS_PHP_AT_LEAST_7 (ZEND_EXTENSION_API_NO >= AWS_PHP_EXTENSION_API_7_0)
#define AWS_PHP_AT_LEAST_7_2 (ZEND_EXTENSION_API_NO >= AWS_PHP_EXTENSION_API_7_2)
ZEND_BEGIN_MODULE_GLOBALS(awscrt)
long log_level;
ZEND_END_MODULE_GLOBALS(awscrt)
ZEND_EXTERN_MODULE_GLOBALS(awscrt)
#define AWSCRT_GLOBAL(v) ZEND_MODULE_GLOBALS_ACCESSOR(awscrt, v)
#if AWS_PHP_AT_LEAST_7
/* PHP 7 takes a zval*, PHP5 takes a zval** */
# define AWS_PHP_STREAM_FROM_ZVAL(s, z) php_stream_from_zval(s, z)
#define XRETURN_STRINGL RETURN_STRINGL
#define XRETURN_STRING RETURN_STRING
#define XRETVAL_STRINGL RETVAL_STRINGL
#define XRETVAL_STRING RETVAL_STRING
#else /* PHP 5.5-5.6 */
# define AWS_PHP_STREAM_FROM_ZVAL(s, z) php_stream_from_zval(s, &z)
#define XRETURN_STRINGL(s, l) RETURN_STRINGL(s, l, 1)
#define XRETURN_STRING(s) RETURN_STRING(s, 1)
#define XRETVAL_STRINGL(s, l) RETVAL_STRINGL(s, l, 1)
#define XRETVAL_STRING(s) RETVAL_STRING(s, 1)
#endif /* PHP 5.x */
#include "api.h"
#include "awscrt_arginfo.h"
/* Utility macros borrowed from common */
#define GLUE(x, y) x y
#define RETURN_ARG_COUNT(_1_, _2_, _3_, _4_, _5_, count, ...) count
#define EXPAND_ARGS(args) RETURN_ARG_COUNT args
#define COUNT_ARGS_MAX5(...) EXPAND_ARGS((__VA_ARGS__, 5, 4, 3, 2, 1, 0))
#define OVERLOAD_MACRO2(name, count) name##count
#define OVERLOAD_MACRO1(name, count) OVERLOAD_MACRO2(name, count)
#define OVERLOAD_MACRO(name, count) OVERLOAD_MACRO1(name, count)
#define CALL_OVERLOAD(name, ...) GLUE(OVERLOAD_MACRO(name, COUNT_ARGS_MAX5(__VA_ARGS__)), (__VA_ARGS__))
#define VARIABLE_LENGTH_ARRAY(type, name, length) type *name = alloca(sizeof(type) * (length))
/*
* PHP utility APIs for this extension
*/
/*
* Exception throwing mechanism, will never return
*/
#define aws_php_throw_exception(...) CALL_OVERLOAD(_AWS_PHP_THROW_EXCEPTION, __VA_ARGS__);
#define _AWS_PHP_THROW_EXCEPTION5(format, ...) zend_error_noreturn(E_ERROR, format, __VA_ARGS__)
#define _AWS_PHP_THROW_EXCEPTION4(format, ...) zend_error_noreturn(E_ERROR, format, __VA_ARGS__)
#define _AWS_PHP_THROW_EXCEPTION3(format, ...) zend_error_noreturn(E_ERROR, format, __VA_ARGS__)
#define _AWS_PHP_THROW_EXCEPTION2(format, ...) zend_error_noreturn(E_ERROR, format, __VA_ARGS__)
#define _AWS_PHP_THROW_EXCEPTION1(format) zend_error_noreturn(E_ERROR, format)
/**
* throws an exception resulting from argument parsing, notes the current function name in the exception
*/
#define aws_php_argparse_fail() \
do { \
aws_php_throw_exception("Failed to parse arguments to %s", __func__); \
} while (0)
/**
* calls zend_parse_parameters() with the arguments and throws an exception if parsing fails
*/
#define aws_php_parse_parameters(type_spec, ...) \
do { \
if (zend_parse_parameters(ZEND_NUM_ARGS(), type_spec, __VA_ARGS__) == FAILURE) { \
aws_php_argparse_fail(); \
} \
} while (0)
/**
* calls zend_parse_parameters_none() and throws an exception if parsing fails
*/
#define aws_php_parse_parameters_none() \
do { \
if (zend_parse_parameters_none() == FAILURE) { \
aws_php_argparse_fail(); \
} \
} while (0)
/* PHP/Zend utility functions to work across PHP versions */
zval *aws_php_zval_new(void);
void aws_php_zval_dtor(void *zval_ptr);
bool aws_php_zval_as_bool(zval *z);
void aws_php_zval_copy(zval *dest, zval *src);
/**
* Replacement for ZVAL_STRINGL that is PHP version agnostic
*/
void aws_php_zval_stringl(zval *val, const char *str, size_t len);
/* Thread queue functions for managing PHP's optional threading situation */
typedef struct _aws_php_task {
void (*callback)(void *); /* task function */
void (*dtor)(void *); /* deletes task_data, if non-null */
void *data;
} aws_php_task;
/* maximum number of queued callbacks to execute at once. Since this is to support single-threaded usage,
* this can be a fairly small number, as how many callbacks could we reasonably be stacking up?! */
#define AWS_PHP_THREAD_QUEUE_MAX_DEPTH 32
typedef struct _aws_php_thread_queue {
struct aws_mutex mutex;
aws_php_task queue[AWS_PHP_THREAD_QUEUE_MAX_DEPTH];
size_t write_slot;
aws_thread_id_t thread_id;
} aws_php_thread_queue;
extern aws_php_thread_queue s_aws_php_main_thread_queue;
bool aws_php_is_main_thread(void);
void aws_php_thread_queue_init(aws_php_thread_queue *queue);
void aws_php_thread_queue_clean_up(aws_php_thread_queue *queue);
void aws_php_thread_queue_push(aws_php_thread_queue *queue, aws_php_task task);
bool aws_php_thread_queue_drain(aws_php_thread_queue *queue);
/* called from worker thread to wait for the main thread to execute any queued work in PHP */
void aws_php_thread_queue_yield(aws_php_thread_queue *queue);
/* called from PHP thread to wait on async queued jobs, one of which MUST complete the promise */
void aws_php_thread_queue_wait(aws_php_thread_queue *queue, struct aws_promise *promise);
/**
* generic dispatch mechanism to call a callback provided as a zval with arguments
* that are converted to zvals based on the arg_types format string
* Uses the same format string as zend_parse_parameters
*/
zval aws_php_invoke_callback(zval *callback, const char *arg_types, ...);
#endif /* PHP_AWS_CRT_H */
@@ -0,0 +1,33 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#include "php_aws_crt.h"
zval *aws_php_zval_new(void) {
return emalloc(sizeof(zval));
}
void aws_php_zval_dtor(void *zval_ptr) {
zval *z = zval_ptr;
zval_dtor(z);
efree(z);
}
bool aws_php_zval_as_bool(zval *z) {
#if AWS_PHP_AT_LEAST_7
return (Z_TYPE_P(z) == IS_TRUE);
#else
return (Z_TYPE_P(z) == IS_BOOL && Z_LVAL_P(z) != 0);
#endif
}
void aws_php_zval_copy(zval *dest, zval *src) {
#if AWS_PHP_AT_LEAST_7
ZVAL_COPY(dest, src);
#else
ZVAL_COPY_VALUE(dest, src);
#endif
}
@@ -0,0 +1,374 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#include "php_aws_crt.h"
PHP_FUNCTION(aws_crt_signing_config_aws_new) {
if (zend_parse_parameters_none() == FAILURE) {
RETURN_NULL();
}
aws_crt_signing_config_aws *signing_config = aws_crt_signing_config_aws_new();
RETURN_LONG((zend_ulong)signing_config);
}
PHP_FUNCTION(aws_crt_signing_config_aws_release) {
zend_ulong php_signing_config = 0;
aws_php_parse_parameters("l", &php_signing_config);
aws_crt_signing_config_aws *signing_config = (void *)php_signing_config;
aws_crt_signing_config_aws_release(signing_config);
}
PHP_FUNCTION(aws_crt_signing_config_aws_set_algorithm) {
zend_ulong php_signing_config = 0;
zend_ulong php_algorithm = 0;
aws_php_parse_parameters("ll", &php_signing_config, &php_algorithm);
aws_crt_signing_config_aws *signing_config = (void *)php_signing_config;
aws_crt_signing_algorithm algorithm = php_algorithm;
aws_crt_signing_config_aws_set_algorithm(signing_config, algorithm);
}
PHP_FUNCTION(aws_crt_signing_config_aws_set_signature_type) {
zend_ulong php_signing_config = 0;
zend_ulong php_signature_type = 0;
aws_php_parse_parameters("ll", &php_signing_config, &php_signature_type);
aws_crt_signing_config_aws *signing_config = (void *)php_signing_config;
aws_crt_signature_type signature_type = php_signature_type;
aws_crt_signing_config_aws_set_signature_type(signing_config, signature_type);
}
PHP_FUNCTION(aws_crt_signing_config_aws_set_credentials_provider) {
zend_ulong php_signing_config = 0;
zend_ulong php_credentials_provider = 0;
aws_php_parse_parameters("ll", &php_signing_config, &php_credentials_provider);
aws_crt_signing_config_aws *signing_config = (void *)php_signing_config;
aws_crt_credentials_provider *credentials_provider = (void *)php_credentials_provider;
aws_crt_signing_config_aws_set_credentials_provider(signing_config, credentials_provider);
}
PHP_FUNCTION(aws_crt_signing_config_aws_set_region) {
zend_ulong php_signing_config = 0;
const char *region = NULL;
size_t region_len = 0;
aws_php_parse_parameters("ls", &php_signing_config, &region, &region_len);
aws_crt_signing_config_aws *signing_config = (void *)php_signing_config;
aws_crt_signing_config_aws_set_region(signing_config, (uint8_t *)region, region_len);
}
PHP_FUNCTION(aws_crt_signing_config_aws_set_service) {
zend_ulong php_signing_config = 0;
const char *service = NULL;
size_t service_len = 0;
aws_php_parse_parameters("ls", &php_signing_config, &service, &service_len);
aws_crt_signing_config_aws *signing_config = (void *)php_signing_config;
aws_crt_signing_config_aws_set_service(signing_config, (uint8_t *)service, service_len);
}
PHP_FUNCTION(aws_crt_signing_config_aws_set_use_double_uri_encode) {
zend_ulong php_signing_config = 0;
zend_bool php_use_double_uri_encode = 0;
aws_php_parse_parameters("lb", &php_signing_config, &php_use_double_uri_encode);
aws_crt_signing_config_aws *signing_config = (void *)php_signing_config;
aws_crt_signing_config_aws_set_use_double_uri_encode(signing_config, php_use_double_uri_encode);
}
PHP_FUNCTION(aws_crt_signing_config_aws_set_should_normalize_uri_path) {
zend_ulong php_signing_config = 0;
zend_bool php_should_normalize_uri_path = 0;
aws_php_parse_parameters("lb", &php_signing_config, &php_should_normalize_uri_path);
aws_crt_signing_config_aws *signing_config = (void *)php_signing_config;
aws_crt_signing_config_aws_set_should_normalize_uri_path(signing_config, php_should_normalize_uri_path);
}
PHP_FUNCTION(aws_crt_signing_config_aws_set_omit_session_token) {
zend_ulong php_signing_config = 0;
zend_bool php_omit_session_token = 0;
aws_php_parse_parameters("lb", &php_signing_config, &php_omit_session_token);
aws_crt_signing_config_aws *signing_config = (void *)php_signing_config;
aws_crt_signing_config_aws_set_omit_session_token(signing_config, php_omit_session_token);
}
PHP_FUNCTION(aws_crt_signing_config_aws_set_signed_body_value) {
zend_ulong php_signing_config = 0;
const char *signed_body_value = NULL;
size_t signed_body_value_len = 0;
aws_php_parse_parameters("ls", &php_signing_config, &signed_body_value, &signed_body_value_len);
aws_crt_signing_config_aws *signing_config = (void *)php_signing_config;
aws_crt_signing_config_aws_set_signed_body_value(
signing_config, (uint8_t *)signed_body_value, signed_body_value_len);
}
PHP_FUNCTION(aws_crt_signing_config_aws_set_signed_body_header_type) {
zend_ulong php_signing_config = 0;
zend_ulong php_signed_body_header_type = 0;
aws_php_parse_parameters("ll", &php_signing_config, &php_signed_body_header_type);
aws_crt_signing_config_aws *signing_config = (void *)php_signing_config;
aws_crt_signed_body_header_type signed_body_header_type = php_signed_body_header_type;
aws_crt_signing_config_aws_set_signed_body_header_type(signing_config, signed_body_header_type);
}
PHP_FUNCTION(aws_crt_signing_config_aws_set_expiration_in_seconds) {
zend_ulong php_signing_config = 0;
zend_ulong php_expiration_in_seconds = 0;
aws_php_parse_parameters("ll", &php_signing_config, &php_expiration_in_seconds);
aws_crt_signing_config_aws *signing_config = (void *)php_signing_config;
aws_crt_signing_config_aws_set_expiration_in_seconds(signing_config, php_expiration_in_seconds);
}
PHP_FUNCTION(aws_crt_signing_config_aws_set_date) {
zend_ulong php_signing_config = 0;
zend_ulong php_timestamp = 0;
aws_php_parse_parameters("ll", &php_signing_config, &php_timestamp);
aws_crt_signing_config_aws *signing_config = (void *)php_signing_config;
aws_crt_signing_config_aws_set_date(signing_config, php_timestamp);
}
typedef struct _should_sign_header_data {
zval *should_sign_header;
zval *header_name;
bool result;
} should_sign_header_data;
static void should_sign_header_task(void *data) {
should_sign_header_data *task = data;
zval result = aws_php_invoke_callback(task->should_sign_header, "z", task->header_name);
task->result = aws_php_zval_as_bool(&result);
zval_dtor(&result);
}
static bool aws_php_should_sign_header(const char *header_name, size_t header_length, void *user_data) {
zval php_header_name;
aws_php_zval_stringl(&php_header_name, header_name, header_length);
should_sign_header_data task_data = {
.should_sign_header = user_data,
.header_name = &php_header_name,
.result = false,
};
aws_php_task task = {
.callback = should_sign_header_task,
.data = &task_data,
};
aws_php_thread_queue_push(&s_aws_php_main_thread_queue, task);
aws_php_thread_queue_yield(&s_aws_php_main_thread_queue);
zval_dtor(&php_header_name);
return task_data.result;
}
PHP_FUNCTION(aws_crt_signing_config_aws_set_should_sign_header_fn) {
zend_ulong php_signing_config = 0;
zval *php_should_sign_header = NULL;
aws_php_parse_parameters("lz", &php_signing_config, &php_should_sign_header);
aws_crt_signing_config_aws *signing_config = (void *)php_signing_config;
/* copy/retain PHP callback, add as user data for signing_config resource */
zval *should_sign_header = aws_php_zval_new();
aws_php_zval_copy(should_sign_header, php_should_sign_header);
aws_crt_resource_set_user_data(signing_config, should_sign_header, aws_php_zval_dtor);
aws_crt_signing_config_aws_set_should_sign_header_fn(
signing_config, aws_php_should_sign_header, should_sign_header);
}
PHP_FUNCTION(aws_crt_signable_new_from_http_request) {
zend_ulong php_http_message = 0;
aws_php_parse_parameters("l", &php_http_message);
const aws_crt_http_message *http_message = (void *)php_http_message;
aws_crt_signable *signable = aws_crt_signable_new_from_http_request(http_message);
RETURN_LONG((zend_ulong)signable);
}
PHP_FUNCTION(aws_crt_signable_new_from_chunk) {
zend_ulong php_input_stream = 0;
const char *previous_signature = NULL;
size_t previous_signature_len = 0;
aws_php_parse_parameters("ls", &php_input_stream, &previous_signature, &previous_signature_len);
aws_crt_input_stream *input_stream = (void *)php_input_stream;
aws_crt_signable *signable =
aws_crt_signable_new_from_chunk(input_stream, (uint8_t *)previous_signature, previous_signature_len);
RETURN_LONG((zend_ulong)signable);
}
PHP_FUNCTION(aws_crt_signable_new_from_canonical_request) {
const char *canonical_request = NULL;
size_t canonical_request_len = 0;
aws_crt_signable *signable =
aws_crt_signable_new_from_canonical_request((uint8_t *)canonical_request, canonical_request_len);
RETURN_LONG((zend_ulong)signable);
}
PHP_FUNCTION(aws_crt_signable_release) {
zend_ulong php_signable = 0;
aws_php_parse_parameters("l", &php_signable);
aws_crt_signable *signable = (void *)php_signable;
aws_crt_signable_release(signable);
}
PHP_FUNCTION(aws_crt_signing_result_release) {
zend_ulong php_signing_result = 0;
aws_php_parse_parameters("l", &php_signing_result);
aws_crt_signing_result *result = (void *)php_signing_result;
aws_crt_signing_result_release(result);
}
PHP_FUNCTION(aws_crt_signing_result_apply_to_http_request) {
zend_ulong php_signing_result = 0;
zend_ulong php_http_request = 0;
aws_php_parse_parameters("ll", &php_signing_result, &php_http_request);
aws_crt_signing_result *result = (void *)php_signing_result;
aws_crt_http_message *request = (void *)php_http_request;
if (aws_crt_signing_result_apply_to_http_request(result, request)) {
aws_php_throw_exception(
"Failed to apply signing result to HTTP request: %s", aws_crt_error_name(aws_crt_last_error()));
}
}
typedef struct _signing_state {
struct aws_promise *promise;
zval *on_complete;
aws_crt_signing_result *signing_result;
int error_code;
} signing_state;
/* called on main thread to deliver result to php */
static void s_sign_aws_complete(void *data) {
signing_state *state = data;
zval *on_complete = state->on_complete;
aws_php_invoke_callback(on_complete, "ll", (zend_ulong)state->signing_result, (zend_ulong)state->error_code);
}
/* called from signing process in aws_sign_request_aws */
static void s_on_sign_request_aws_complete(aws_crt_signing_result *result, int error_code, void *user_data) {
signing_state *state = user_data;
struct aws_promise *promise = state->promise;
state->signing_result = result;
state->error_code = error_code;
/*
* Must execute PHP callback before this function returns, or signing_result will be killed
* so the callback is queued back to the main thread and will have run when yield returns
*/
aws_php_task complete_callback_task = {
.callback = s_sign_aws_complete,
.data = state,
};
aws_php_thread_queue_push(&s_aws_php_main_thread_queue, complete_callback_task);
aws_php_thread_queue_yield(&s_aws_php_main_thread_queue);
if (error_code) {
aws_promise_fail(promise, error_code);
} else {
aws_promise_complete(promise, result, NULL);
}
}
PHP_FUNCTION(aws_crt_sign_request_aws) {
zend_ulong php_signable = 0;
zend_ulong php_signing_config = 0;
zval *php_on_complete = 0;
zend_ulong php_user_data = 0;
aws_php_parse_parameters("llzl", &php_signable, &php_signing_config, &php_on_complete, &php_user_data);
aws_crt_signable *signable = (void *)php_signable;
aws_crt_signing_config_aws *signing_config = (void *)php_signing_config;
struct aws_promise *promise = aws_promise_new(aws_crt_default_allocator());
signing_state state = {
.promise = promise,
.on_complete = php_on_complete,
};
int ret = aws_crt_sign_request_aws(signable, signing_config, s_on_sign_request_aws_complete, &state);
if (ret != 0) {
int last_error = aws_crt_last_error();
aws_promise_fail(promise, last_error);
aws_php_throw_exception(
"aws_crt_sign_request_aws: error starting signing process: %s", aws_crt_error_name(last_error));
}
aws_php_thread_queue_wait(&s_aws_php_main_thread_queue, promise);
done:
aws_promise_release(promise);
RETURN_LONG(ret);
}
PHP_FUNCTION(aws_crt_test_verify_sigv4a_signing) {
zend_ulong php_signable = 0;
zend_ulong php_signing_config = 0;
const char *expected_canonical_request = NULL;
size_t expected_canonical_request_len = 0;
const char *signature = NULL;
size_t signature_len = 0;
const char *ecc_key_pub_x = NULL;
size_t ecc_key_pub_x_len = 0;
const char *ecc_key_pub_y = NULL;
size_t ecc_key_pub_y_len = 0;
aws_php_parse_parameters(
"llssss",
&php_signable,
&php_signing_config,
&expected_canonical_request,
&expected_canonical_request_len,
&signature,
&signature_len,
&ecc_key_pub_x,
&ecc_key_pub_x_len,
&ecc_key_pub_y,
&ecc_key_pub_y_len);
const aws_crt_signable *signable = (void *)php_signable;
const aws_crt_signing_config *signing_config = (void *)php_signing_config;
bool result = AWS_OP_SUCCESS ==
aws_crt_test_verify_sigv4a_signing(
signable, signing_config, expected_canonical_request, signature, ecc_key_pub_x, ecc_key_pub_y);
RETURN_BOOL(result);
}
@@ -0,0 +1,148 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#include "php_aws_crt.h"
/* PHP streams info:
* https://git.php.net/?p=php-src.git;a=blob;f=docs/streams.md;h=0ec3846d68bf70067297d8a6c691d2591c49b48a;hb=HEAD
* https://github.com/php/php-src/blob/PHP-5.6.0/main/php_streams.h
*/
PHP_FUNCTION(aws_crt_input_stream_options_new) {
if (zend_parse_parameters_none() == FAILURE) {
aws_php_argparse_fail();
}
aws_crt_input_stream_options *options = aws_crt_input_stream_options_new();
RETURN_LONG((zend_ulong)options);
}
PHP_FUNCTION(aws_crt_input_stream_options_release) {
zend_ulong php_options = 0;
aws_php_parse_parameters("l", &php_options);
aws_crt_input_stream_options *options = (void *)php_options;
aws_crt_input_stream_options_release(options);
}
PHP_FUNCTION(aws_crt_input_stream_options_set_user_data) {
zend_ulong php_options = 0;
zval *user_data = NULL;
aws_php_parse_parameters("lz", &php_options, &user_data);
aws_crt_input_stream_options *options = (void *)php_options;
php_stream *stream = NULL;
AWS_PHP_STREAM_FROM_ZVAL(stream, user_data);
aws_crt_input_stream_options_set_user_data(options, stream);
}
static int s_php_stream_seek(void *user_data, int64_t offset, aws_crt_input_stream_seek_basis basis) {
php_stream *stream = user_data;
return php_stream_seek(stream, offset, basis);
}
static int s_php_stream_read(void *user_data, uint8_t *dest, size_t dest_length) {
php_stream *stream = user_data;
return php_stream_read(stream, (char *)dest, dest_length) != 0;
}
static int s_php_stream_get_length(void *user_data, int64_t *out_length) {
php_stream *stream = user_data;
size_t pos = php_stream_tell(stream);
php_stream_seek(stream, 0, SEEK_END);
*out_length = php_stream_tell(stream);
php_stream_seek(stream, pos, SEEK_SET);
return 0;
}
static int s_php_stream_get_status(void *user_data, aws_crt_input_stream_status *out_status) {
php_stream *stream = user_data;
out_status->is_valid = stream != NULL;
/* We would like to use php_stream_eof here, but certain streams (notably php://memory)
* are not actually capable of EOF, so we get to do it the hard way */
int64_t length = 0;
int64_t pos = 0;
s_php_stream_get_length(stream, &length);
pos = php_stream_tell(stream);
out_status->is_end_of_stream = pos == length;
return 0;
}
static void s_php_stream_destroy(void *user_data) {
(void)user_data;
/* no op, stream will be freed by PHP refcount dropping from InputStream::stream */
}
PHP_FUNCTION(aws_crt_input_stream_new) {
zend_ulong php_options = 0;
aws_php_parse_parameters("l", &php_options);
aws_crt_input_stream_options *options = (void *)php_options;
aws_crt_input_stream_options_set_seek(options, s_php_stream_seek);
aws_crt_input_stream_options_set_read(options, s_php_stream_read);
aws_crt_input_stream_options_set_get_status(options, s_php_stream_get_status);
aws_crt_input_stream_options_set_get_length(options, s_php_stream_get_length);
aws_crt_input_stream_options_set_destroy(options, s_php_stream_destroy);
aws_crt_input_stream *stream = aws_crt_input_stream_new(options);
RETURN_LONG((zend_ulong)stream);
}
PHP_FUNCTION(aws_crt_input_stream_release) {
zend_ulong php_stream = 0;
aws_php_parse_parameters("l", &php_stream);
aws_crt_input_stream *stream = (void *)php_stream;
aws_crt_input_stream_release(stream);
}
PHP_FUNCTION(aws_crt_input_stream_seek) {
zend_ulong php_stream = 0;
zend_ulong offset = 0;
zend_ulong basis = 0;
aws_php_parse_parameters("lll", &php_stream, &offset, &basis);
aws_crt_input_stream *stream = (void *)php_stream;
RETURN_LONG(aws_crt_input_stream_seek(stream, offset, basis));
}
PHP_FUNCTION(aws_crt_input_stream_read) {
zend_ulong php_stream = 0;
zend_ulong length = 0;
aws_php_parse_parameters("ll", &php_stream, &length);
aws_crt_input_stream *stream = (void *)php_stream;
uint8_t *buf = emalloc(length);
int ret = aws_crt_input_stream_read(stream, buf, length);
XRETVAL_STRINGL((const char *)buf, length);
efree(buf);
}
PHP_FUNCTION(aws_crt_input_stream_eof) {
zend_ulong php_stream = 0;
aws_php_parse_parameters("l", &php_stream);
aws_crt_input_stream *stream = (void *)php_stream;
aws_crt_input_stream_status status = {0};
aws_crt_input_stream_get_status(stream, &status);
RETURN_BOOL(status.is_end_of_stream);
}
PHP_FUNCTION(aws_crt_input_stream_get_length) {
zend_ulong php_stream = 0;
aws_php_parse_parameters("l", &php_stream);
aws_crt_input_stream *stream = (void *)php_stream;
int64_t length = 0;
aws_crt_input_stream_get_length(stream, &length);
RETURN_LONG(length);
}
@@ -0,0 +1,24 @@
#!/bin/bash
if [[ -z $CLANG_FORMAT ]] ; then
CLANG_FORMAT=clang-format
fi
if NOT type $CLANG_FORMAT 2> /dev/null ; then
echo "No appropriate clang-format found."
exit 1
fi
FAIL=0
SOURCE_FILES=`find src ext -type f \( -name '*.c' \)`
for i in $SOURCE_FILES
do
$CLANG_FORMAT -output-replacements-xml $i | grep -c "<replacement " > /dev/null
if [ $? -ne 1 ]
then
echo "$i failed clang-format check."
FAIL=1
fi
done
exit $FAIL
@@ -0,0 +1,24 @@
<?php
$source = "php://stdin";
if (isset($argv[1])) {
$source = $argv[1];
}
$input_lines = file($source);
foreach ($input_lines as $line) {
// Strip AWS_EXTERN_C_BEGIN/END
if (preg_match('/AWS_EXTERN_C/', $line)) {
continue;
}
// Strip macros/includes
if (preg_match('/^#/', $line)) {
continue;
}
// Strip visibility attributes
$line = str_replace('AWS_CRT_API ', '', $line);
echo($line);
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,19 @@
</contents>
<dependencies>
<required>
<php>
<min>7.4.0</min>
</php>
<pearinstaller>
<min>1.10.0</min>
</pearinstaller>
</required>
</dependencies>
<providesextension>awscrt</providesextension>
<extsrcrelease/>
<changelog>
<release>
</release>
</changelog>
</package>
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.8.1" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
<name>awscrt</name>
<channel>pecl.php.net</channel>
<summary>AWS Common Runtime PHP bindings</summary>
<description>AWS Common Runtime provides a set of low level tools as network protocols and authentication used by the AWSSDK for PHP to provide high level API to access AWS services.</description>
<lead>
<name>{{{NAME}}}</name>
<user>{{{USER}}}</user>
<email>{{{EMAIL}}}</email>
<active>yes</active>
</lead>
<date>{{{TODAY}}}</date>
<version>
<release>{{{VERSION}}}</release>
<api>1.0.0</api>
</version>
<stability>
<release>devel</release>
<api>stable</api>
</stability>
<license uri="https://www.apache.org/licenses/LICENSE-2.0">Apache License Version 2.0</license>
<notes>{{{NOTES}}}</notes>
<contents>
@@ -0,0 +1,2 @@
extension=php_awscrt.dll
extension=php_openssl.dll
@@ -0,0 +1 @@
extension=modules/awscrt.so
@@ -0,0 +1,144 @@
#!/bin/zsh
zparseopts -A opts -name: -user: -email: -version: -notes:
if [[ $# -lt 10 ]]
then
echo "Usage ${0} --name NAME, --user USER --email EMAIL --version VERSION --notes NOTES"
exit 1
fi
NAME="${opts[--name]}"
USER="${opts[--user]}"
EMAIL="${opts[--email]}"
VERSION="${opts[--version]}"
NOTES="${opts[--notes]}"
TODAY=$(date -u +%Y-%m-%d)
cat package.xml-template_pre \
| sed "s/{{{NAME}}}/$NAME/g" \
| sed "s/{{{USER}}}/$USER/g" \
| sed "s/{{{EMAIL}}}/$EMAIL/g" \
| sed "s/{{{TODAY}}}/$TODAY/g" \
| sed "s/{{{VERSION}}}/$VERSION/g" \
| sed "s/{{{NOTES}}}/$NOTES/g"
source_ext='(c|cc|h|cpp|hpp|m4|w32|ini|frag|cmake|inl|in|py|gnu|yaml|def|pl|S|s|errordata|go|lds|num|asm|mod|peg|mk|rs|toml|sh)'
doc_ext='(md|json|html|dot|graphml|png|gn|sha1|css|rst|)'
special_docs='(LICENSE*|NOTICE|changelog.txt|CHANGELOG|THIRD-PARTY|README*|readme|METADATA|CONTRIBUTORS|UPDATING|doc.config)'
special_tests='(ci-test.sh|format-check.sh|run_tests*|sanitizer-blacklist.txt|run-clang-tidy.sh|benchmark-build-run.sh|break-tests.sh|generate-coverage.sh|test.xml)'
special_src='(gen_api.php|gen_stub.php|CMakeLists.txt|post.sh|postun.sh|Makefile*|build-buildspec.sh|build-deps.sh|objects.txt|go.*|BUILD*|DEPS|install_and_run.sh|codemod.sh|requirements.txt)'
skip_files='(package.xml*|prepare_release.sh|codereview.settings|*.o|*.a|*.obj|*.lib|break-tests-android.sh|whitespace.txt|prepare_package_xml.sh|crypto_test_data.cc|*.pdf|*.svg|*.docx|cbmc-proof.txt|codecov*|litani*|*.toml)'
special_scripts='(awscrt.stub.php)'
skip_directories='(tests|test|AWSCRTAndroidTestRunner|docker-images|codebuild|fuzz|verfication|third_party|docs|generated-src|aws-lc|aws-crt-sys)'
process_file() {
if (( $# == 0 ))
then
echo "ERROR: filename not passed"
exit 1
fi
if [[ $1 = $~skip_files ]]
then
# This file is not part of the release bundle
return 0
fi
echo -n '<file name="'"$1"'" role="'
# Special cases
case ${a} in
$~special_scripts)
echo -n 'script'
;;
$~special_docs)
echo -n 'doc'
;;
$~special_tests)
echo -n 'test'
;;
$~special_src)
echo -n 'src'
;;
*)
# Extension based cases
case ${a:t:e} in
$~source_ext)
echo -n 'src'
;;
$~doc_ext)
echo -n 'doc'
;;
php)
echo -n 'script'
;;
*)
echo "${a:t:e} - ${a} - FAIL TO RECOGNIZE"
exit 1
esac
esac
echo '"/>'
return 0
}
process_dir() {
if (( $# == 0 ))
then
echo "WARNING: dirname not passed"
exit 1
fi
if [[ "${1}" = $~skip_directories ]]
then
return 0
fi
echo '<dir name="'"$1"'">'
cd "$1"
for a in *
do
if [[ -f ${a} ]]
then process_file "${a}"
else process_dir "${a}"
fi
done
# Special cases for compiler features placed in tests directories in and s2n
if [[ "${1}" = "s2n" && -d tests ]]
then
echo '<dir name="tests">'
echo '<dir name="features">'
cd tests/features
for a in *
do
process_file "${a}"
done
cd ../..
echo '</dir>'
echo '</dir>'
fi
echo '</dir>'
cd ..
return 0
}
echo '<dir name="/">'
for a in *
do
if [[ ${a} == 'tests' ]]
then
echo '<dir name="tests">'
for b in tests/*
do
echo '<file name="'$( basename "${b}" )'" role="test" />'
done
echo '</dir>'
continue
fi
if [[ -f ${a} ]]
then process_file "${a}"
else process_dir "${a}"
fi
done
echo '</dir>'
cat package.xml-template_post
@@ -0,0 +1,31 @@
#!/bin/zsh
zparseopts -A opts -name: -user: -email: -version: -notes:
if [[ $# -lt 10 ]]; then
echo "Usage ${0} --name NAME --user USER --email EMAIL --version VERSION --notes NOTES"
exit 1
fi
PACKAGE='awscrt'
NAME="${opts[--name]}"
USER="${opts[--user]}"
EMAIL="${opts[--email]}"
VERSION="${opts[--version]}"
NOTES="${opts[--notes]}"
./prepare_package_xml.sh --name "${NAME}" --user "${USER}" --email "${EMAIL}" --version "${VERSION}" --notes "${NOTES}" >package.xml
if [[ $? -ne 0 ]]; then
echo "ERROR PROCESSING review package.xml"
exit 1
fi
tidy -xml -m -i package.xml
pear package-validate
if [[ $? -ne 0 ]]; then
echo "ERROR VALIDATING review package.xml"
exit 1
fi
pear package
if [[ $? -ne 0 ]]; then
echo "ERROR PROCESSING review package.xml"
exit 1
fi
echo "Size of ${PACKAGE}-${VERSION}.tgz: " $(du -h "${PACKAGE}-${VERSION}.tgz")
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
set -ex
launcher=
if command -v catchsegv; then
launcher=catchsegv
fi
if [ -z $PHP_BINARY ]; then
PHP_BINARY=$(which php)
fi
if [ ! -d vendor ]; then
composer update
fi
$launcher $PHP_BINARY -c php.ini vendor/bin/phpunit tests --debug
@@ -0,0 +1,4 @@
@echo on
%PHP_BINARY% -c php-win.ini vendor/bin/phpunit tests --debug
@@ -0,0 +1,69 @@
<?php
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
namespace AWS\CRT\Auth;
use AWS\CRT\NativeResource as NativeResource;
use AWS\CRT\Options as Options;
/**
* Represents a set of AWS credentials
*
* @param array options:
* - string access_key_id - AWS Access Key Id
* - string secret_access_key - AWS Secret Access Key
* - string session_token - Optional STS session token
* - int expiration_timepoint_seconds - Optional time to expire these credentials
*/
final class AwsCredentials extends NativeResource {
static function defaults() {
return [
'access_key_id' => '',
'secret_access_key' => '',
'session_token' => '',
'expiration_timepoint_seconds' => 0,
];
}
private $access_key_id;
private $secret_access_key;
private $session_token;
private $expiration_timepoint_seconds = 0;
public function __get($name) {
return $this->$name;
}
function __construct(array $options = []) {
parent::__construct();
$options = new Options($options, self::defaults());
$this->access_key_id = $options->access_key_id->asString();
$this->secret_access_key = $options->secret_access_key->asString();
$this->session_token = $options->session_token ? $options->session_token->asString() : null;
$this->expiration_timepoint_seconds = $options->expiration_timepoint_seconds->asInt();
if (strlen($this->access_key_id) == 0) {
throw new \InvalidArgumentException("access_key_id must be provided");
}
if (strlen($this->secret_access_key) == 0) {
throw new \InvalidArgumentException("secret_access_key must be provided");
}
$creds_options = self::$crt->aws_credentials_options_new();
self::$crt->aws_credentials_options_set_access_key_id($creds_options, $this->access_key_id);
self::$crt->aws_credentials_options_set_secret_access_key($creds_options, $this->secret_access_key);
self::$crt->aws_credentials_options_set_session_token($creds_options, $this->session_token);
self::$crt->aws_credentials_options_set_expiration_timepoint_seconds($creds_options, $this->expiration_timepoint_seconds);
$this->acquire(self::$crt->aws_credentials_new($creds_options));
self::$crt->aws_credentials_options_release($creds_options);
}
function __destruct() {
self::$crt->aws_credentials_release($this->release());
parent::__destruct();
}
}
@@ -0,0 +1,23 @@
<?php
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
namespace AWS\CRT\Auth;
use AWS\CRT\NativeResource as NativeResource;
/**
* Base class for credentials providers
*/
abstract class CredentialsProvider extends NativeResource {
function __construct(array $options = []) {
parent::__construct();
}
function __destruct() {
self::$crt->credentials_provider_release($this->release());
parent::__destruct();
}
}
@@ -0,0 +1,43 @@
<?php
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
namespace AWS\CRT\Auth;
use AWS\CRT\IO\InputStream;
use AWS\CRT\NativeResource as NativeResource;
class Signable extends NativeResource {
public static function fromHttpRequest($http_message) {
return new Signable(function() use ($http_message) {
return self::$crt->signable_new_from_http_request($http_message->native);
});
}
public static function fromChunk($chunk_stream, $previous_signature="") {
if (!($chunk_stream instanceof InputStream)) {
$chunk_stream = new InputStream($chunk_stream);
}
return new Signable(function() use($chunk_stream, $previous_signature) {
return self::$crt->signable_new_from_chunk($chunk_stream->native, $previous_signature);
});
}
public static function fromCanonicalRequest($canonical_request) {
return new Signable(function() use($canonical_request) {
return self::$crt->signable_new_from_canonical_request($canonical_request);
});
}
protected function __construct($ctor) {
parent::__construct();
$this->acquire($ctor());
}
function __destruct() {
self::$crt->signable_release($this->release());
parent::__destruct();
}
}
@@ -0,0 +1,15 @@
<?php
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
namespace AWS\CRT\Auth;
class SignatureType {
const HTTP_REQUEST_HEADERS = 0;
const HTTP_REQUEST_QUERY_PARAMS = 1;
const HTTP_REQUEST_CHUNK = 2;
const HTTP_REQUEST_EVENT = 3;
const CANONICAL_REQUEST_HEADERS = 4;
const CANONICAL_REQUEST_QUERY_PARAMS = 5;
}
@@ -0,0 +1,11 @@
<?php
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
namespace AWS\CRT\Auth;
class SignedBodyHeaderType {
const NONE = 0;
const X_AMZ_CONTENT_SHA256 = 1;
}
@@ -0,0 +1,22 @@
<?php
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
namespace AWS\CRT\Auth;
use AWS\CRT\NativeResource;
abstract class Signing extends NativeResource {
static function signRequestAws($signable, $signing_config, $on_complete) {
return self::$crt->sign_request_aws($signable->native, $signing_config->native,
function($result, $error_code) use ($on_complete) {
$signing_result = SigningResult::fromNative($result);
$on_complete($signing_result, $error_code);
}, null);
}
static function testVerifySigV4ASigning($signable, $signing_config, $expected_canonical_request, $signature, $ecc_key_pub_x, $ecc_key_pub_y) {
return self::$crt->test_verify_sigv4a_signing($signable, $signing_config, $expected_canonical_request, $signature, $ecc_key_pub_x, $ecc_key_pub_y);
}
}
@@ -0,0 +1,11 @@
<?php
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
namespace AWS\CRT\Auth;
class SigningAlgorithm {
const SIGv4 = 0;
const SIGv4_ASYMMETRIC = 1;
}
@@ -0,0 +1,75 @@
<?php
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
namespace AWS\CRT\Auth;
use AWS\CRT\NativeResource as NativeResource;
use AWS\CRT\Options as Options;
class SigningConfigAWS extends NativeResource {
public static function defaults() {
return [
'algorithm' => SigningAlgorithm::SIGv4,
'signature_type' => SignatureType::HTTP_REQUEST_HEADERS,
'credentials_provider' => null,
'region' => null,
'service' => null,
'use_double_uri_encode' => false,
'should_normalize_uri_path' => false,
'omit_session_token' => false,
'signed_body_value' => null,
'signed_body_header_type' => SignedBodyHeaderType::NONE,
'expiration_in_seconds' => 0,
'date' => time(),
'should_sign_header' => null,
];
}
private $options;
public function __construct(array $options = []) {
parent::__construct();
$this->options = $options = new Options($options, self::defaults());
$sc = $this->acquire(self::$crt->signing_config_aws_new());
self::$crt->signing_config_aws_set_algorithm($sc, $options->algorithm->asInt());
self::$crt->signing_config_aws_set_signature_type($sc, $options->signature_type->asInt());
if ($credentials_provider = $options->credentials_provider->asObject()) {
self::$crt->signing_config_aws_set_credentials_provider(
$sc,
$credentials_provider->native);
}
self::$crt->signing_config_aws_set_region(
$sc, $options->region->asString());
self::$crt->signing_config_aws_set_service(
$sc, $options->service->asString());
self::$crt->signing_config_aws_set_use_double_uri_encode(
$sc, $options->use_double_uri_encode->asBool());
self::$crt->signing_config_aws_set_should_normalize_uri_path(
$sc, $options->should_normalize_uri_path->asBool());
self::$crt->signing_config_aws_set_omit_session_token(
$sc, $options->omit_session_token->asBool());
self::$crt->signing_config_aws_set_signed_body_value(
$sc, $options->signed_body_value->asString());
self::$crt->signing_config_aws_set_signed_body_header_type(
$sc, $options->signed_body_header_type->asInt());
self::$crt->signing_config_aws_set_expiration_in_seconds(
$sc, $options->expiration_in_seconds->asInt());
self::$crt->signing_config_aws_set_date($sc, $options->date->asInt());
if ($should_sign_header = $options->should_sign_header->asCallable()) {
self::$crt->signing_config_aws_set_should_sign_header_fn($sc, $should_sign_header);
}
}
function __destruct()
{
self::$crt->signing_config_aws_release($this->release());
parent::__destruct();
}
public function __get($name) {
return $this->options->get($name);
}
}
@@ -0,0 +1,33 @@
<?php
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
namespace AWS\CRT\Auth;
use AWS\CRT\NativeResource;
use AWS\CRT\HTTP\Request;
class SigningResult extends NativeResource {
protected function __construct($native) {
parent::__construct();
$this->acquire($native);
}
function __destruct() {
// No destruction necessary, SigningResults are transient, just release
$this->release();
parent::__destruct();
}
public static function fromNative($ptr) {
return new SigningResult($ptr);
}
public function applyToHttpRequest(&$http_request) {
self::$crt->signing_result_apply_to_http_request($this->native, $http_request->native);
// Update http_request from native
$http_request = Request::unmarshall($http_request->toBlob());
}
}
@@ -0,0 +1,35 @@
<?php
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
namespace AWS\CRT\Auth;
/**
* Provides a static set of AWS credentials
*
* @param array options:
* - string access_key_id - AWS Access Key Id
* - string secret_access_key - AWS Secret Access Key
* - string session_token - Optional STS session token
*/
final class StaticCredentialsProvider extends CredentialsProvider {
private $credentials;
public function __get($name) {
return $this->$name;
}
function __construct(array $options = []) {
parent::__construct();
$this->credentials = new AwsCredentials($options);
$provider_options = self::$crt->credentials_provider_static_options_new();
self::$crt->credentials_provider_static_options_set_access_key_id($provider_options, $this->credentials->access_key_id);
self::$crt->credentials_provider_static_options_set_secret_access_key($provider_options, $this->credentials->secret_access_key);
self::$crt->credentials_provider_static_options_set_session_token($provider_options, $this->credentials->session_token);
$this->acquire(self::$crt->credentials_provider_static_new($provider_options));
self::$crt->credentials_provider_static_options_release($provider_options);
}
}
@@ -0,0 +1,358 @@
<?php
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
namespace AWS\CRT;
use AWS\CRT\Internal\Extension;
use \RuntimeException;
/**
* Wrapper for the interface to the CRT. There only ever needs to be one of these, but
* additional instances won't cost anything other than their memory.
* Creating an instance of any NativeResource will activate the CRT binding. User code
* should only need to create one of these if they are only accessing CRT:: static functions.
*/
final class CRT {
private static $impl = null;
private static $refcount = 0;
function __construct() {
if (is_null(self::$impl)) {
try {
self::$impl = new Extension();
} catch (RuntimeException $rex) {
throw new RuntimeException("Unable to initialize AWS CRT via awscrt extension: \n$rex", -1);
}
}
++self::$refcount;
}
function __destruct() {
if (--self::$refcount == 0) {
self::$impl = null;
}
}
/**
* @return bool whether or not the CRT is currently loaded
*/
public static function isLoaded() {
return !is_null(self::$impl);
}
/**
* @return bool whether or not the CRT is available via one of the possible backends
*/
public static function isAvailable() {
try {
new CRT();
return true;
} catch (RuntimeException $ex) {
return false;
}
}
/**
* @return integer last error code reported within the CRT
*/
public static function last_error() {
return self::$impl->aws_crt_last_error();
}
/**
* @param integer $error Error code from the CRT, usually delivered via callback or {@see last_error}
* @return string Human-readable description of the provided error code
*/
public static function error_str($error) {
return self::$impl->aws_crt_error_str((int) $error);
}
/**
* @param integer $error Error code from the CRT, usually delivered via callback or {@see last_error}
* @return string Name/enum identifier for the provided error code
*/
public static function error_name($error) {
return self::$impl->aws_crt_error_name((int) $error);
}
public static function log_to_stdout() {
return self::$impl->aws_crt_log_to_stdout();
}
public static function log_to_stderr() {
return self::$impl->aws_crt_log_to_stderr();
}
public static function log_to_file($filename) {
return self::$impl->aws_crt_log_to_file($filename);
}
public static function log_to_stream($stream) {
return self::$impl->aws_crt_log_to_stream($stream);
}
public static function log_set_level($level) {
return self::$impl->aws_crt_log_set_level($level);
}
public static function log_stop() {
return self::$impl->aws_crt_log_stop();
}
public static function log_message($level, $message) {
return self::$impl->aws_crt_log_message($level, $message);
}
/**
* @return object Pointer to native event_loop_group_options
*/
function event_loop_group_options_new() {
return self::$impl->aws_crt_event_loop_group_options_new();
}
/**
* @param object $elg_options Pointer to native event_loop_group_options
*/
function event_loop_group_options_release($elg_options) {
self::$impl->aws_crt_event_loop_group_options_release($elg_options);
}
/**
* @param object $elg_options Pointer to native event_loop_group_options
* @param integer $max_threads Maximum number of threads to allow the event loop group to use, default: 0/1 per CPU core
*/
function event_loop_group_options_set_max_threads($elg_options, $max_threads) {
self::$impl->aws_crt_event_loop_group_options_set_max_threads($elg_options, (int)$max_threads);
}
/**
* @param object Pointer to event_loop_group_options, {@see event_loop_group_options_new}
* @return object Pointer to the new event loop group
*/
function event_loop_group_new($options) {
return self::$impl->aws_crt_event_loop_group_new($options);
}
/**
* @param object $elg Pointer to the event loop group to release
*/
function event_loop_group_release($elg) {
self::$impl->aws_crt_event_loop_group_release($elg);
}
/**
* return object Pointer to native AWS credentials options
*/
function aws_credentials_options_new() {
return self::$impl->aws_crt_credentials_options_new();
}
function aws_credentials_options_release($options) {
self::$impl->aws_crt_credentials_options_release($options);
}
function aws_credentials_options_set_access_key_id($options, $access_key_id) {
self::$impl->aws_crt_credentials_options_set_access_key_id($options, $access_key_id);
}
function aws_credentials_options_set_secret_access_key($options, $secret_access_key) {
self::$impl->aws_crt_credentials_options_set_secret_access_key($options, $secret_access_key);
}
function aws_credentials_options_set_session_token($options, $session_token) {
self::$impl->aws_crt_credentials_options_set_session_token($options, $session_token);
}
function aws_credentials_options_set_expiration_timepoint_seconds($options, $expiration_timepoint_seconds) {
self::$impl->aws_crt_credentials_options_set_expiration_timepoint_seconds($options, $expiration_timepoint_seconds);
}
function aws_credentials_new($options) {
return self::$impl->aws_crt_credentials_new($options);
}
function aws_credentials_release($credentials) {
self::$impl->aws_crt_credentials_release($credentials);
}
function credentials_provider_release($provider) {
self::$impl->aws_crt_credentials_provider_release($provider);
}
function credentials_provider_static_options_new() {
return self::$impl->aws_crt_credentials_provider_static_options_new();
}
function credentials_provider_static_options_release($options) {
self::$impl->aws_crt_credentials_provider_static_options_release($options);
}
function credentials_provider_static_options_set_access_key_id($options, $access_key_id) {
self::$impl->aws_crt_credentials_provider_static_options_set_access_key_id($options, $access_key_id);
}
function credentials_provider_static_options_set_secret_access_key($options, $secret_access_key) {
self::$impl->aws_crt_credentials_provider_static_options_set_secret_access_key($options, $secret_access_key);
}
function credentials_provider_static_options_set_session_token($options, $session_token) {
self::$impl->aws_crt_credentials_provider_static_options_set_session_token($options, $session_token);
}
function credentials_provider_static_new($options) {
return self::$impl->aws_crt_credentials_provider_static_new($options);
}
function input_stream_options_new() {
return self::$impl->aws_crt_input_stream_options_new();
}
function input_stream_options_release($options) {
self::$impl->aws_crt_input_stream_options_release($options);
}
function input_stream_options_set_user_data($options, $user_data) {
self::$impl->aws_crt_input_stream_options_set_user_data($options, $user_data);
}
function input_stream_new($options) {
return self::$impl->aws_crt_input_stream_new($options);
}
function input_stream_release($stream) {
self::$impl->aws_crt_input_stream_release($stream);
}
function input_stream_seek($stream, $offset, $basis) {
return self::$impl->aws_crt_input_stream_seek($stream, $offset, $basis);
}
function input_stream_read($stream, $length) {
return self::$impl->aws_crt_input_stream_read($stream, $length);
}
function input_stream_eof($stream) {
return self::$impl->aws_crt_input_stream_eof($stream);
}
function input_stream_get_length($stream) {
return self::$impl->aws_crt_input_stream_get_length($stream);
}
function http_message_new_from_blob($blob) {
return self::$impl->aws_crt_http_message_new_from_blob($blob);
}
function http_message_to_blob($message) {
return self::$impl->aws_crt_http_message_to_blob($message);
}
function http_message_release($message) {
self::$impl->aws_crt_http_message_release($message);
}
function signing_config_aws_new() {
return self::$impl->aws_crt_signing_config_aws_new();
}
function signing_config_aws_release($signing_config) {
return self::$impl->aws_crt_signing_config_aws_release($signing_config);
}
function signing_config_aws_set_algorithm($signing_config, $algorithm) {
self::$impl->aws_crt_signing_config_aws_set_algorithm($signing_config, (int)$algorithm);
}
function signing_config_aws_set_signature_type($signing_config, $signature_type) {
self::$impl->aws_crt_signing_config_aws_set_signature_type($signing_config, (int)$signature_type);
}
function signing_config_aws_set_credentials_provider($signing_config, $credentials_provider) {
self::$impl->aws_crt_signing_config_aws_set_credentials_provider($signing_config, $credentials_provider);
}
function signing_config_aws_set_region($signing_config, $region) {
self::$impl->aws_crt_signing_config_aws_set_region($signing_config, $region);
}
function signing_config_aws_set_service($signing_config, $service) {
self::$impl->aws_crt_signing_config_aws_set_service($signing_config, $service);
}
function signing_config_aws_set_use_double_uri_encode($signing_config, $use_double_uri_encode) {
self::$impl->aws_crt_signing_config_aws_set_use_double_uri_encode($signing_config, $use_double_uri_encode);
}
function signing_config_aws_set_should_normalize_uri_path($signing_config, $should_normalize_uri_path) {
self::$impl->aws_crt_signing_config_aws_set_should_normalize_uri_path($signing_config, $should_normalize_uri_path);
}
function signing_config_aws_set_omit_session_token($signing_config, $omit_session_token) {
self::$impl->aws_crt_signing_config_aws_set_omit_session_token($signing_config, $omit_session_token);
}
function signing_config_aws_set_signed_body_value($signing_config, $signed_body_value) {
self::$impl->aws_crt_signing_config_aws_set_signed_body_value($signing_config, $signed_body_value);
}
function signing_config_aws_set_signed_body_header_type($signing_config, $signed_body_header_type) {
self::$impl->aws_crt_signing_config_aws_set_signed_body_header_type($signing_config, $signed_body_header_type);
}
function signing_config_aws_set_expiration_in_seconds($signing_config, $expiration_in_seconds) {
self::$impl->aws_crt_signing_config_aws_set_expiration_in_seconds($signing_config, $expiration_in_seconds);
}
function signing_config_aws_set_date($signing_config, $timestamp) {
self::$impl->aws_crt_signing_config_aws_set_date($signing_config, $timestamp);
}
function signing_config_aws_set_should_sign_header_fn($signing_config, $should_sign_header_fn) {
self::$impl->aws_crt_signing_config_aws_set_should_sign_header_fn($signing_config, $should_sign_header_fn);
}
function signable_new_from_http_request($http_message) {
return self::$impl->aws_crt_signable_new_from_http_request($http_message);
}
function signable_new_from_chunk($chunk_stream, $previous_signature) {
return self::$impl->aws_crt_signable_new_from_chunk($chunk_stream, $previous_signature);
}
function signable_new_from_canonical_request($canonical_request) {
return self::$impl->aws_crt_signable_new_from_canonical_request($canonical_request);
}
function signable_release($signable) {
self::$impl->aws_crt_signable_release($signable);
}
function signing_result_release($signing_result) {
self::$impl->aws_crt_signing_result_release($signing_result);
}
function signing_result_apply_to_http_request($signing_result, $http_message) {
return self::$impl->aws_crt_signing_result_apply_to_http_request(
$signing_result, $http_message);
}
function sign_request_aws($signable, $signing_config, $on_complete, $user_data) {
return self::$impl->aws_crt_sign_request_aws($signable, $signing_config, $on_complete, $user_data);
}
function test_verify_sigv4a_signing($signable, $signing_config, $expected_canonical_request, $signature, $ecc_key_pub_x, $ecc_key_pub_y) {
return self::$impl->aws_crt_test_verify_sigv4a_signing($signable, $signing_config, $expected_canonical_request, $signature, $ecc_key_pub_x, $ecc_key_pub_y);
}
public static function crc32($input, $previous = 0) {
return self::$impl->aws_crt_crc32($input, $previous);
}
public static function crc32c($input, $previous = 0) {
return self::$impl->aws_crt_crc32c($input, $previous);
}
}
@@ -0,0 +1,50 @@
<?php
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
namespace AWS\CRT\HTTP;
use AWS\CRT\Internal\Encoding;
final class Headers {
private $headers;
public function __construct($headers = []) {
$this->headers = $headers;
}
public static function marshall($headers) {
$buf = "";
foreach ($headers->headers as $header => $value) {
$buf .= Encoding::encodeString($header);
$buf .= Encoding::encodeString($value);
}
return $buf;
}
public static function unmarshall($buf) {
$strings = Encoding::readStrings($buf);
$headers = [];
for ($idx = 0; $idx < count($strings);) {
$headers[$strings[$idx++]] = $strings[$idx++];
}
return new Headers($headers);
}
public function count() {
return count($this->headers);
}
public function get($header) {
return isset($this->headers[$header]) ? $this->headers[$header] : null;
}
public function set($header, $value) {
$this->headers[$header] = $value;
}
public function toArray() {
return $this->headers;
}
}
@@ -0,0 +1,95 @@
<?php
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
namespace AWS\CRT\HTTP;
use AWS\CRT\NativeResource;
use AWS\CRT\Internal\Encoding;
abstract class Message extends NativeResource {
private $method;
private $path;
private $query;
private $headers;
public function __construct($method, $path, $query = [], $headers = []) {
parent::__construct();
$this->method = $method;
$this->path = $path;
$this->query = $query;
$this->headers = new Headers($headers);
$this->acquire(self::$crt->http_message_new_from_blob(self::marshall($this)));
}
public function __destruct() {
self::$crt->http_message_release($this->release());
parent::__destruct();
}
public function toBlob() {
return self::$crt->http_message_to_blob($this->native);
}
protected static function marshall($msg) {
$buf = "";
$buf .= Encoding::encodeString($msg->method);
$buf .= Encoding::encodeString($msg->pathAndQuery());
$buf .= Headers::marshall($msg->headers);
return $buf;
}
protected static function _unmarshall($buf, $class=Message::class) {
$method = Encoding::readString($buf);
$path_and_query = Encoding::readString($buf);
$parts = explode("?", $path_and_query, 2);
$path = isset($parts[0]) ? $parts[0] : "";
$query = isset($parts[1]) ? $parts[1] : "";
$headers = Headers::unmarshall($buf);
// Turn query params back into a dictionary
if (strlen($query)) {
$query = rawurldecode($query);
$query = explode("&", $query);
$query = array_reduce($query, function($params, $pair) {
list($param, $value) = explode("=", $pair, 2);
$params[$param] = $value;
return $params;
}, []);
} else {
$query = [];
}
return new $class($method, $path, $query, $headers->toArray());
}
public function pathAndQuery() {
$path = $this->path;
$queries = [];
foreach ($this->query as $param => $value) {
$queries []= urlencode($param) . "=" . urlencode($value);
}
$query = implode("&", $queries);
if (strlen($query)) {
$path = implode("?", [$path, $query]);
}
return $path;
}
public function method() {
return $this->method;
}
public function path() {
return $this->path;
}
public function query() {
return $this->query;
}
public function headers() {
return $this->headers;
}
}
@@ -0,0 +1,32 @@
<?php
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
namespace AWS\CRT\HTTP;
use AWS\CRT\IO\InputStream;
class Request extends Message {
private $body_stream = null;
public function __construct($method, $path, $query = [], $headers = [], $body_stream = null) {
parent::__construct($method, $path, $query, $headers);
if (!is_null($body_stream) && !($body_stream instanceof InputStream)) {
throw InvalidArgumentException('body_stream must be an instance of ' . InputStream::class);
}
$this->body_stream = $body_stream;
}
public static function marshall($request) {
return parent::marshall($request);
}
public static function unmarshall($buf) {
return parent::_unmarshall($buf, Request::class);
}
public function body_stream() {
return $this->body_stream;
}
}
@@ -0,0 +1,27 @@
<?php
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
namespace AWS\CRT\HTTP;
class Response extends Message {
private $status_code;
public function __construct($method, $path, $query, $headers, $status_code) {
parent::__construct($method, $path, $query, $headers);
$this->status_code = $status_code;
}
public static function marshall($response) {
return parent::marshall($response);
}
public static function unmarshall($buf) {
return parent::_unmarshall($buf, Response::class);
}
public function status_code() {
return $this->status_code;
}
}
@@ -0,0 +1,39 @@
<?php
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
namespace AWS\CRT\IO;
use AWS\CRT\NativeResource as NativeResource;
use AWS\CRT\Options as Options;
/**
* Represents 1 or more event loops (1 per thread) for doing I/O and background tasks.
* Typically, every application has one EventLoopGroup.
*
* @param array options:
* - int num_threads - Number of worker threads in the EventLoopGroup. Defaults to 0/1 per logical core.
*/
final class EventLoopGroup extends NativeResource {
static function defaults() {
return [
'max_threads' => 0,
];
}
function __construct(array $options = []) {
parent::__construct();
$options = new Options($options, self::defaults());
$elg_options = self::$crt->event_loop_group_options_new();
self::$crt->event_loop_group_options_set_max_threads($elg_options, $options->getInt('max_threads'));
$this->acquire(self::$crt->event_loop_group_new($elg_options));
self::$crt->event_loop_group_options_release($elg_options);
}
function __destruct() {
self::$crt->event_loop_group_release($this->release());
parent::__destruct();
}
}
@@ -0,0 +1,49 @@
<?php
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
namespace AWS\CRT\IO;
use AWS\CRT\NativeResource as NativeResource;
final class InputStream extends NativeResource {
private $stream = null;
const SEEK_BEGIN = 0;
const SEEK_END = 2;
public function __construct($stream) {
$this->stream = $stream;
$options = self::$crt->input_stream_options_new();
// The stream implementation in native just converts the PHP stream into
// a native php_stream* and executes operations entirely in native
self::$crt->input_stream_options_set_user_data($options, $stream);
$this->acquire(self::$crt->input_stream_new($options));
self::$crt->input_stream_options_release($options);
}
public function __destruct() {
self::$crt->input_stream_release($this->release());
parent::__destruct();
}
public function eof() {
return self::$crt->input_stream_eof($this->native);
}
public function length() {
return self::$crt->input_stream_get_length($this->native);
}
public function read($length = 0) {
if ($length == 0) {
$length = $this->length();
}
return self::$crt->input_stream_read($this->native, $length);
}
public function seek($offset, $basis) {
return self::$crt->input_stream_seek($this->native, $offset, $basis);
}
}
@@ -0,0 +1,37 @@
<?php
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
namespace AWS\CRT\Internal;
final class Encoding {
public static function readString(&$buffer) {
list($len, $str) = self::decodeString($buffer);
// Advance by sizeof(length) + strlen(str)
$buffer = substr($buffer, 4 + $len);
return $str;
}
public static function readStrings($buffer) {
$strings = [];
while (strlen($buffer)) {
$strings []= self::readString($buffer);
}
return $strings;
}
public static function decodeString($buffer) {
$len = unpack("N", $buffer)[1];
$buffer = substr($buffer, 4);
$str = unpack("a${len}", $buffer)[1];
return [$len, $str];
}
public static function encodeString($str) {
if (is_array($str)) {
$str = $str[0];
}
return pack("Na*", strlen($str), $str);
}
}
@@ -0,0 +1,29 @@
<?php
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
namespace AWS\CRT\Internal;
use \RuntimeException;
/**
* @internal
* Forwards calls on to awscrt PHP extension functions
*/
final class Extension {
function __construct() {
if (!extension_loaded('awscrt')) {
throw new RuntimeException('awscrt extension is not loaded');
}
}
/**
* Forwards any call made on this object to the extension function of the
* same name with the supplied arguments. Argument type hinting and checking
* occurs at the CRT wrapper.
*/
function __call($name, $args) {
return call_user_func_array($name, $args);
}
}
@@ -0,0 +1,47 @@
<?php
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
namespace AWS\CRT;
use AWS\CRT\CRT;
final class Log {
const NONE = 0;
const FATAL = 1;
const ERROR = 2;
const WARN = 3;
const INFO = 4;
const DEBUG = 5;
const TRACE = 6;
public static function toStdout() {
CRT::log_to_stdout();
}
public static function toStderr() {
CRT::log_to_stderr();
}
public static function toFile($filename) {
CRT::log_to_file($filename);
}
public static function toStream($stream) {
assert(get_resource_type($stream) == "stream");
CRT::log_to_stream($stream);
}
public static function stop() {
CRT::log_stop();
}
public static function setLogLevel($level) {
assert($level >= self::NONE && $level <= self::TRACE);
CRT::log_set_level($level);
}
public static function log($level, $message) {
CRT::log_message($level, $message);
}
}
@@ -0,0 +1,42 @@
<?php
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
namespace AWS\CRT;
use AWS\CRT\CRT as CRT;
/**
* Base class for all native resources, tracks all outstanding resources
* and provides basic leak checking
*/
abstract class NativeResource {
protected static $crt = null;
protected static $resources = [];
protected $native = null;
protected function __construct() {
if (is_null(self::$crt)) {
self::$crt = new CRT();
}
self::$resources[spl_object_hash($this)] = 1;
}
protected function acquire($handle) {
return $this->native = $handle;
}
protected function release() {
$native = $this->native;
$this->native = null;
return $native;
}
function __destruct() {
// Should have been destroyed and released by derived resource
assert($this->native == null);
unset(self::$resources[spl_object_hash($this)]);
}
}
@@ -0,0 +1,77 @@
<?php
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
namespace AWS\CRT;
final class OptionValue {
private $value;
function __construct($value) {
$this->value = $value;
}
public function asObject() {
return $this->value;
}
public function asMixed() {
return $this->value;
}
public function asInt() {
return empty($this->value) ? 0 : (int)$this->value;
}
public function asBool() {
return boolval($this->value);
}
public function asString() {
return !empty($this->value) ? strval($this->value) : "";
}
public function asArray() {
return is_array($this->value) ? $this->value : (!empty($this->value) ? [$this->value] : []);
}
public function asCallable() {
return is_callable($this->value) ? $this->value : null;
}
}
final class Options {
private $options;
public function __construct($opts = [], $defaults = []) {
$this->options = array_replace($defaults, empty($opts) ? [] : $opts);
}
public function __get($name) {
return $this->get($name);
}
public function asArray() {
return $this->options;
}
public function toArray() {
return array_merge_recursive([], $this->options);
}
public function get($name) {
return new OptionValue($this->options[$name]);
}
public function getInt($name) {
return $this->get($name)->asInt();
}
public function getString($name) {
return $this->get($name)->asString();
}
public function getBool($name) {
return $this->get($name)->asBool();
}
}
@@ -0,0 +1,4 @@
## Code of Conduct
This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct).
For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact
opensource-codeofconduct@amazon.com with any additional questions or comments.
@@ -0,0 +1,4 @@
## Building and enabling the Common Run Time
1. **Follow instructions on crt repo** Clone and build the repo as shown [here][https://github.com/awslabs/aws-crt-php].
1. **Enable the CRT** add the following line to your php.ini file `extension=path/to/aws-crt-php/modules/awscrt.so`
@@ -0,0 +1,141 @@
# Apache License
Version 2.0, January 2004
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:
1. You must give any other recipients of the Work or Derivative Works a copy of this License; and
2. You must cause any modified files to carry prominent notices stating that You changed the files; and
3. 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
4. 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
@@ -0,0 +1,17 @@
# AWS SDK for PHP
<http://aws.amazon.com/php>
Copyright Amazon.com, Inc. or its affiliates. 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.
@@ -0,0 +1,84 @@
The AWS SDK for PHP includes the following third-party software/licensing:
** Guzzle - https://github.com/guzzle/guzzle
Copyright (c) 2014 Michael Dowling, https://github.com/mtdowling
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
----------------
** jmespath.php - https://github.com/mtdowling/jmespath.php
Copyright (c) 2014 Michael Dowling, https://github.com/mtdowling
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
----------------
** phpunit-mock-objects -- https://github.com/sebastianbergmann/phpunit-mock-objects
Copyright (c) 2002-2018, Sebastian Bergmann <sebastian@phpunit.de>.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
* Neither the name of Sebastian Bergmann nor the names of his
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,69 @@
{
"name": "aws/aws-sdk-php",
"homepage": "http://aws.amazon.com/sdkforphp",
"description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project",
"keywords": ["aws","amazon","sdk","s3","ec2","dynamodb","cloud","glacier"],
"type": "library",
"license": "Apache-2.0",
"authors": [
{
"name": "Amazon Web Services",
"homepage": "http://aws.amazon.com"
}
],
"support": {
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
"issues": "https://github.com/aws/aws-sdk-php/issues"
},
"require": {
"php": ">=5.5",
"guzzlehttp/guzzle": "^5.3.3|^6.2.1|^7.0",
"guzzlehttp/psr7": "^1.7.0|^2.0",
"guzzlehttp/promises": "^1.4.0",
"mtdowling/jmespath.php": "^2.6",
"ext-pcre": "*",
"ext-json": "*",
"ext-simplexml": "*",
"aws/aws-crt-php": "^1.0.2"
},
"require-dev": {
"ext-openssl": "*",
"ext-dom": "*",
"ext-pcntl": "*",
"ext-sockets": "*",
"phpunit/phpunit": "^4.8.35|^5.4.3",
"behat/behat": "~3.0",
"doctrine/cache": "~1.4",
"aws/aws-php-sns-message-validator": "~1.0",
"nette/neon": "^2.3",
"andrewsville/php-token-reflection": "^1.4",
"psr/cache": "^1.0",
"psr/simple-cache": "^1.0",
"paragonie/random_compat": ">= 2",
"sebastian/comparator": "^1.2.3"
},
"suggest": {
"ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages",
"ext-curl": "To send requests using cURL",
"ext-sockets": "To use client-side monitoring",
"doctrine/cache": "To use the DoctrineCacheAdapter",
"aws/aws-php-sns-message-validator": "To validate incoming SNS notifications"
},
"autoload": {
"psr-4": {
"Aws\\": "src/"
},
"files": ["src/functions.php"]
},
"autoload-dev": {
"psr-4": {
"Aws\\Test\\": "tests/"
},
"classmap": ["build/"]
},
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
}
}
}
@@ -0,0 +1,55 @@
<?php
namespace Aws\ACMPCA;
use Aws\AwsClient;
/**
* This client is used to interact with the **AWS Certificate Manager Private Certificate Authority** service.
* @method \Aws\Result createCertificateAuthority(array $args = [])
* @method \GuzzleHttp\Promise\Promise createCertificateAuthorityAsync(array $args = [])
* @method \Aws\Result createCertificateAuthorityAuditReport(array $args = [])
* @method \GuzzleHttp\Promise\Promise createCertificateAuthorityAuditReportAsync(array $args = [])
* @method \Aws\Result createPermission(array $args = [])
* @method \GuzzleHttp\Promise\Promise createPermissionAsync(array $args = [])
* @method \Aws\Result deleteCertificateAuthority(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteCertificateAuthorityAsync(array $args = [])
* @method \Aws\Result deletePermission(array $args = [])
* @method \GuzzleHttp\Promise\Promise deletePermissionAsync(array $args = [])
* @method \Aws\Result deletePolicy(array $args = [])
* @method \GuzzleHttp\Promise\Promise deletePolicyAsync(array $args = [])
* @method \Aws\Result describeCertificateAuthority(array $args = [])
* @method \GuzzleHttp\Promise\Promise describeCertificateAuthorityAsync(array $args = [])
* @method \Aws\Result describeCertificateAuthorityAuditReport(array $args = [])
* @method \GuzzleHttp\Promise\Promise describeCertificateAuthorityAuditReportAsync(array $args = [])
* @method \Aws\Result getCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise getCertificateAsync(array $args = [])
* @method \Aws\Result getCertificateAuthorityCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise getCertificateAuthorityCertificateAsync(array $args = [])
* @method \Aws\Result getCertificateAuthorityCsr(array $args = [])
* @method \GuzzleHttp\Promise\Promise getCertificateAuthorityCsrAsync(array $args = [])
* @method \Aws\Result getPolicy(array $args = [])
* @method \GuzzleHttp\Promise\Promise getPolicyAsync(array $args = [])
* @method \Aws\Result importCertificateAuthorityCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise importCertificateAuthorityCertificateAsync(array $args = [])
* @method \Aws\Result issueCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise issueCertificateAsync(array $args = [])
* @method \Aws\Result listCertificateAuthorities(array $args = [])
* @method \GuzzleHttp\Promise\Promise listCertificateAuthoritiesAsync(array $args = [])
* @method \Aws\Result listPermissions(array $args = [])
* @method \GuzzleHttp\Promise\Promise listPermissionsAsync(array $args = [])
* @method \Aws\Result listTags(array $args = [])
* @method \GuzzleHttp\Promise\Promise listTagsAsync(array $args = [])
* @method \Aws\Result putPolicy(array $args = [])
* @method \GuzzleHttp\Promise\Promise putPolicyAsync(array $args = [])
* @method \Aws\Result restoreCertificateAuthority(array $args = [])
* @method \GuzzleHttp\Promise\Promise restoreCertificateAuthorityAsync(array $args = [])
* @method \Aws\Result revokeCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise revokeCertificateAsync(array $args = [])
* @method \Aws\Result tagCertificateAuthority(array $args = [])
* @method \GuzzleHttp\Promise\Promise tagCertificateAuthorityAsync(array $args = [])
* @method \Aws\Result untagCertificateAuthority(array $args = [])
* @method \GuzzleHttp\Promise\Promise untagCertificateAuthorityAsync(array $args = [])
* @method \Aws\Result updateCertificateAuthority(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateCertificateAuthorityAsync(array $args = [])
*/
class ACMPCAClient extends AwsClient {}
@@ -0,0 +1,9 @@
<?php
namespace Aws\ACMPCA\Exception;
use Aws\Exception\AwsException;
/**
* Represents an error interacting with the **AWS Certificate Manager Private Certificate Authority** service.
*/
class ACMPCAException extends AwsException {}
@@ -0,0 +1,157 @@
<?php
namespace Aws;
use GuzzleHttp\Promise;
/**
* A configuration provider is a function that returns a promise that is
* fulfilled with a configuration object. This class provides base functionality
* usable by specific configuration provider implementations
*/
abstract class AbstractConfigurationProvider
{
const ENV_PROFILE = 'AWS_PROFILE';
const ENV_CONFIG_FILE = 'AWS_CONFIG_FILE';
public static $cacheKey;
protected static $interfaceClass;
protected static $exceptionClass;
/**
* Wraps a config provider and saves provided configuration in an
* instance of Aws\CacheInterface. Forwards calls when no config found
* in cache and updates cache with the results.
*
* @param callable $provider Configuration provider function to wrap
* @param CacheInterface $cache Cache to store configuration
* @param string|null $cacheKey (optional) Cache key to use
*
* @return callable
*/
public static function cache(
callable $provider,
CacheInterface $cache,
$cacheKey = null
) {
$cacheKey = $cacheKey ?: static::$cacheKey;
return function () use ($provider, $cache, $cacheKey) {
$found = $cache->get($cacheKey);
if ($found instanceof static::$interfaceClass) {
return Promise\Create::promiseFor($found);
}
return $provider()
->then(function ($config) use (
$cache,
$cacheKey
) {
$cache->set($cacheKey, $config);
return $config;
});
};
}
/**
* Creates an aggregate configuration provider that invokes the provided
* variadic providers one after the other until a provider returns
* configuration.
*
* @return callable
*/
public static function chain()
{
$links = func_get_args();
if (empty($links)) {
throw new \InvalidArgumentException('No providers in chain');
}
return function () use ($links) {
/** @var callable $parent */
$parent = array_shift($links);
$promise = $parent();
while ($next = array_shift($links)) {
$promise = $promise->otherwise($next);
}
return $promise;
};
}
/**
* Gets the environment's HOME directory if available.
*
* @return null|string
*/
protected static function getHomeDir()
{
// On Linux/Unix-like systems, use the HOME environment variable
if ($homeDir = getenv('HOME')) {
return $homeDir;
}
// Get the HOMEDRIVE and HOMEPATH values for Windows hosts
$homeDrive = getenv('HOMEDRIVE');
$homePath = getenv('HOMEPATH');
return ($homeDrive && $homePath) ? $homeDrive . $homePath : null;
}
/**
* Gets default config file location from environment, falling back to aws
* default location
*
* @return string
*/
protected static function getDefaultConfigFilename()
{
if ($filename = getenv(self::ENV_CONFIG_FILE)) {
return $filename;
}
return self::getHomeDir() . '/.aws/config';
}
/**
* Wraps a config provider and caches previously provided configuration.
*
* @param callable $provider Config provider function to wrap.
*
* @return callable
*/
public static function memoize(callable $provider)
{
return function () use ($provider) {
static $result;
static $isConstant;
// Constant config will be returned constantly.
if ($isConstant) {
return $result;
}
// Create the initial promise that will be used as the cached value
if (null === $result) {
$result = $provider();
}
// Return config and set flag that provider is already set
return $result
->then(function ($config) use (&$isConstant) {
$isConstant = true;
return $config;
});
};
}
/**
* Reject promise with standardized exception.
*
* @param $msg
* @return Promise\RejectedPromise
*/
protected static function reject($msg)
{
$exceptionClass = static::$exceptionClass;
return new Promise\RejectedPromise(new $exceptionClass($msg));
}
}
@@ -0,0 +1,65 @@
<?php
namespace Aws\AccessAnalyzer;
use Aws\AwsClient;
/**
* This client is used to interact with the **Access Analyzer** service.
* @method \Aws\Result applyArchiveRule(array $args = [])
* @method \GuzzleHttp\Promise\Promise applyArchiveRuleAsync(array $args = [])
* @method \Aws\Result cancelPolicyGeneration(array $args = [])
* @method \GuzzleHttp\Promise\Promise cancelPolicyGenerationAsync(array $args = [])
* @method \Aws\Result createAccessPreview(array $args = [])
* @method \GuzzleHttp\Promise\Promise createAccessPreviewAsync(array $args = [])
* @method \Aws\Result createAnalyzer(array $args = [])
* @method \GuzzleHttp\Promise\Promise createAnalyzerAsync(array $args = [])
* @method \Aws\Result createArchiveRule(array $args = [])
* @method \GuzzleHttp\Promise\Promise createArchiveRuleAsync(array $args = [])
* @method \Aws\Result deleteAnalyzer(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteAnalyzerAsync(array $args = [])
* @method \Aws\Result deleteArchiveRule(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteArchiveRuleAsync(array $args = [])
* @method \Aws\Result getAccessPreview(array $args = [])
* @method \GuzzleHttp\Promise\Promise getAccessPreviewAsync(array $args = [])
* @method \Aws\Result getAnalyzedResource(array $args = [])
* @method \GuzzleHttp\Promise\Promise getAnalyzedResourceAsync(array $args = [])
* @method \Aws\Result getAnalyzer(array $args = [])
* @method \GuzzleHttp\Promise\Promise getAnalyzerAsync(array $args = [])
* @method \Aws\Result getArchiveRule(array $args = [])
* @method \GuzzleHttp\Promise\Promise getArchiveRuleAsync(array $args = [])
* @method \Aws\Result getFinding(array $args = [])
* @method \GuzzleHttp\Promise\Promise getFindingAsync(array $args = [])
* @method \Aws\Result getGeneratedPolicy(array $args = [])
* @method \GuzzleHttp\Promise\Promise getGeneratedPolicyAsync(array $args = [])
* @method \Aws\Result listAccessPreviewFindings(array $args = [])
* @method \GuzzleHttp\Promise\Promise listAccessPreviewFindingsAsync(array $args = [])
* @method \Aws\Result listAccessPreviews(array $args = [])
* @method \GuzzleHttp\Promise\Promise listAccessPreviewsAsync(array $args = [])
* @method \Aws\Result listAnalyzedResources(array $args = [])
* @method \GuzzleHttp\Promise\Promise listAnalyzedResourcesAsync(array $args = [])
* @method \Aws\Result listAnalyzers(array $args = [])
* @method \GuzzleHttp\Promise\Promise listAnalyzersAsync(array $args = [])
* @method \Aws\Result listArchiveRules(array $args = [])
* @method \GuzzleHttp\Promise\Promise listArchiveRulesAsync(array $args = [])
* @method \Aws\Result listFindings(array $args = [])
* @method \GuzzleHttp\Promise\Promise listFindingsAsync(array $args = [])
* @method \Aws\Result listPolicyGenerations(array $args = [])
* @method \GuzzleHttp\Promise\Promise listPolicyGenerationsAsync(array $args = [])
* @method \Aws\Result listTagsForResource(array $args = [])
* @method \GuzzleHttp\Promise\Promise listTagsForResourceAsync(array $args = [])
* @method \Aws\Result startPolicyGeneration(array $args = [])
* @method \GuzzleHttp\Promise\Promise startPolicyGenerationAsync(array $args = [])
* @method \Aws\Result startResourceScan(array $args = [])
* @method \GuzzleHttp\Promise\Promise startResourceScanAsync(array $args = [])
* @method \Aws\Result tagResource(array $args = [])
* @method \GuzzleHttp\Promise\Promise tagResourceAsync(array $args = [])
* @method \Aws\Result untagResource(array $args = [])
* @method \GuzzleHttp\Promise\Promise untagResourceAsync(array $args = [])
* @method \Aws\Result updateArchiveRule(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateArchiveRuleAsync(array $args = [])
* @method \Aws\Result updateFindings(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateFindingsAsync(array $args = [])
* @method \Aws\Result validatePolicy(array $args = [])
* @method \GuzzleHttp\Promise\Promise validatePolicyAsync(array $args = [])
*/
class AccessAnalyzerClient extends AwsClient {}
@@ -0,0 +1,9 @@
<?php
namespace Aws\AccessAnalyzer\Exception;
use Aws\Exception\AwsException;
/**
* Represents an error interacting with the **Access Analyzer** service.
*/
class AccessAnalyzerException extends AwsException {}
@@ -0,0 +1,15 @@
<?php
namespace Aws\Account;
use Aws\AwsClient;
/**
* This client is used to interact with the **AWS Account** service.
* @method \Aws\Result deleteAlternateContact(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteAlternateContactAsync(array $args = [])
* @method \Aws\Result getAlternateContact(array $args = [])
* @method \GuzzleHttp\Promise\Promise getAlternateContactAsync(array $args = [])
* @method \Aws\Result putAlternateContact(array $args = [])
* @method \GuzzleHttp\Promise\Promise putAlternateContactAsync(array $args = [])
*/
class AccountClient extends AwsClient {}
@@ -0,0 +1,9 @@
<?php
namespace Aws\Account\Exception;
use Aws\Exception\AwsException;
/**
* Represents an error interacting with the **AWS Account** service.
*/
class AccountException extends AwsException {}
@@ -0,0 +1,40 @@
<?php
namespace Aws\Acm;
use Aws\AwsClient;
/**
* This client is used to interact with the **AWS Certificate Manager** service.
*
* @method \Aws\Result addTagsToCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise addTagsToCertificateAsync(array $args = [])
* @method \Aws\Result deleteCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteCertificateAsync(array $args = [])
* @method \Aws\Result describeCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise describeCertificateAsync(array $args = [])
* @method \Aws\Result exportCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise exportCertificateAsync(array $args = [])
* @method \Aws\Result getAccountConfiguration(array $args = [])
* @method \GuzzleHttp\Promise\Promise getAccountConfigurationAsync(array $args = [])
* @method \Aws\Result getCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise getCertificateAsync(array $args = [])
* @method \Aws\Result importCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise importCertificateAsync(array $args = [])
* @method \Aws\Result listCertificates(array $args = [])
* @method \GuzzleHttp\Promise\Promise listCertificatesAsync(array $args = [])
* @method \Aws\Result listTagsForCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise listTagsForCertificateAsync(array $args = [])
* @method \Aws\Result putAccountConfiguration(array $args = [])
* @method \GuzzleHttp\Promise\Promise putAccountConfigurationAsync(array $args = [])
* @method \Aws\Result removeTagsFromCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise removeTagsFromCertificateAsync(array $args = [])
* @method \Aws\Result renewCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise renewCertificateAsync(array $args = [])
* @method \Aws\Result requestCertificate(array $args = [])
* @method \GuzzleHttp\Promise\Promise requestCertificateAsync(array $args = [])
* @method \Aws\Result resendValidationEmail(array $args = [])
* @method \GuzzleHttp\Promise\Promise resendValidationEmailAsync(array $args = [])
* @method \Aws\Result updateCertificateOptions(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateCertificateOptionsAsync(array $args = [])
*/
class AcmClient extends AwsClient {}
@@ -0,0 +1,9 @@
<?php
namespace Aws\Acm\Exception;
use Aws\Exception\AwsException;
/**
* Represents an error interacting with the **AWS Certificate Manager** service.
*/
class AcmException extends AwsException {}
@@ -0,0 +1,195 @@
<?php
namespace Aws\AlexaForBusiness;
use Aws\AwsClient;
/**
* This client is used to interact with the **Alexa For Business** service.
* @method \Aws\Result approveSkill(array $args = [])
* @method \GuzzleHttp\Promise\Promise approveSkillAsync(array $args = [])
* @method \Aws\Result associateContactWithAddressBook(array $args = [])
* @method \GuzzleHttp\Promise\Promise associateContactWithAddressBookAsync(array $args = [])
* @method \Aws\Result associateDeviceWithNetworkProfile(array $args = [])
* @method \GuzzleHttp\Promise\Promise associateDeviceWithNetworkProfileAsync(array $args = [])
* @method \Aws\Result associateDeviceWithRoom(array $args = [])
* @method \GuzzleHttp\Promise\Promise associateDeviceWithRoomAsync(array $args = [])
* @method \Aws\Result associateSkillGroupWithRoom(array $args = [])
* @method \GuzzleHttp\Promise\Promise associateSkillGroupWithRoomAsync(array $args = [])
* @method \Aws\Result associateSkillWithSkillGroup(array $args = [])
* @method \GuzzleHttp\Promise\Promise associateSkillWithSkillGroupAsync(array $args = [])
* @method \Aws\Result associateSkillWithUsers(array $args = [])
* @method \GuzzleHttp\Promise\Promise associateSkillWithUsersAsync(array $args = [])
* @method \Aws\Result createAddressBook(array $args = [])
* @method \GuzzleHttp\Promise\Promise createAddressBookAsync(array $args = [])
* @method \Aws\Result createBusinessReportSchedule(array $args = [])
* @method \GuzzleHttp\Promise\Promise createBusinessReportScheduleAsync(array $args = [])
* @method \Aws\Result createConferenceProvider(array $args = [])
* @method \GuzzleHttp\Promise\Promise createConferenceProviderAsync(array $args = [])
* @method \Aws\Result createContact(array $args = [])
* @method \GuzzleHttp\Promise\Promise createContactAsync(array $args = [])
* @method \Aws\Result createGatewayGroup(array $args = [])
* @method \GuzzleHttp\Promise\Promise createGatewayGroupAsync(array $args = [])
* @method \Aws\Result createNetworkProfile(array $args = [])
* @method \GuzzleHttp\Promise\Promise createNetworkProfileAsync(array $args = [])
* @method \Aws\Result createProfile(array $args = [])
* @method \GuzzleHttp\Promise\Promise createProfileAsync(array $args = [])
* @method \Aws\Result createRoom(array $args = [])
* @method \GuzzleHttp\Promise\Promise createRoomAsync(array $args = [])
* @method \Aws\Result createSkillGroup(array $args = [])
* @method \GuzzleHttp\Promise\Promise createSkillGroupAsync(array $args = [])
* @method \Aws\Result createUser(array $args = [])
* @method \GuzzleHttp\Promise\Promise createUserAsync(array $args = [])
* @method \Aws\Result deleteAddressBook(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteAddressBookAsync(array $args = [])
* @method \Aws\Result deleteBusinessReportSchedule(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteBusinessReportScheduleAsync(array $args = [])
* @method \Aws\Result deleteConferenceProvider(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteConferenceProviderAsync(array $args = [])
* @method \Aws\Result deleteContact(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteContactAsync(array $args = [])
* @method \Aws\Result deleteDevice(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteDeviceAsync(array $args = [])
* @method \Aws\Result deleteDeviceUsageData(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteDeviceUsageDataAsync(array $args = [])
* @method \Aws\Result deleteGatewayGroup(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteGatewayGroupAsync(array $args = [])
* @method \Aws\Result deleteNetworkProfile(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteNetworkProfileAsync(array $args = [])
* @method \Aws\Result deleteProfile(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteProfileAsync(array $args = [])
* @method \Aws\Result deleteRoom(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteRoomAsync(array $args = [])
* @method \Aws\Result deleteRoomSkillParameter(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteRoomSkillParameterAsync(array $args = [])
* @method \Aws\Result deleteSkillAuthorization(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteSkillAuthorizationAsync(array $args = [])
* @method \Aws\Result deleteSkillGroup(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteSkillGroupAsync(array $args = [])
* @method \Aws\Result deleteUser(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteUserAsync(array $args = [])
* @method \Aws\Result disassociateContactFromAddressBook(array $args = [])
* @method \GuzzleHttp\Promise\Promise disassociateContactFromAddressBookAsync(array $args = [])
* @method \Aws\Result disassociateDeviceFromRoom(array $args = [])
* @method \GuzzleHttp\Promise\Promise disassociateDeviceFromRoomAsync(array $args = [])
* @method \Aws\Result disassociateSkillFromSkillGroup(array $args = [])
* @method \GuzzleHttp\Promise\Promise disassociateSkillFromSkillGroupAsync(array $args = [])
* @method \Aws\Result disassociateSkillFromUsers(array $args = [])
* @method \GuzzleHttp\Promise\Promise disassociateSkillFromUsersAsync(array $args = [])
* @method \Aws\Result disassociateSkillGroupFromRoom(array $args = [])
* @method \GuzzleHttp\Promise\Promise disassociateSkillGroupFromRoomAsync(array $args = [])
* @method \Aws\Result forgetSmartHomeAppliances(array $args = [])
* @method \GuzzleHttp\Promise\Promise forgetSmartHomeAppliancesAsync(array $args = [])
* @method \Aws\Result getAddressBook(array $args = [])
* @method \GuzzleHttp\Promise\Promise getAddressBookAsync(array $args = [])
* @method \Aws\Result getConferencePreference(array $args = [])
* @method \GuzzleHttp\Promise\Promise getConferencePreferenceAsync(array $args = [])
* @method \Aws\Result getConferenceProvider(array $args = [])
* @method \GuzzleHttp\Promise\Promise getConferenceProviderAsync(array $args = [])
* @method \Aws\Result getContact(array $args = [])
* @method \GuzzleHttp\Promise\Promise getContactAsync(array $args = [])
* @method \Aws\Result getDevice(array $args = [])
* @method \GuzzleHttp\Promise\Promise getDeviceAsync(array $args = [])
* @method \Aws\Result getGateway(array $args = [])
* @method \GuzzleHttp\Promise\Promise getGatewayAsync(array $args = [])
* @method \Aws\Result getGatewayGroup(array $args = [])
* @method \GuzzleHttp\Promise\Promise getGatewayGroupAsync(array $args = [])
* @method \Aws\Result getInvitationConfiguration(array $args = [])
* @method \GuzzleHttp\Promise\Promise getInvitationConfigurationAsync(array $args = [])
* @method \Aws\Result getNetworkProfile(array $args = [])
* @method \GuzzleHttp\Promise\Promise getNetworkProfileAsync(array $args = [])
* @method \Aws\Result getProfile(array $args = [])
* @method \GuzzleHttp\Promise\Promise getProfileAsync(array $args = [])
* @method \Aws\Result getRoom(array $args = [])
* @method \GuzzleHttp\Promise\Promise getRoomAsync(array $args = [])
* @method \Aws\Result getRoomSkillParameter(array $args = [])
* @method \GuzzleHttp\Promise\Promise getRoomSkillParameterAsync(array $args = [])
* @method \Aws\Result getSkillGroup(array $args = [])
* @method \GuzzleHttp\Promise\Promise getSkillGroupAsync(array $args = [])
* @method \Aws\Result listBusinessReportSchedules(array $args = [])
* @method \GuzzleHttp\Promise\Promise listBusinessReportSchedulesAsync(array $args = [])
* @method \Aws\Result listConferenceProviders(array $args = [])
* @method \GuzzleHttp\Promise\Promise listConferenceProvidersAsync(array $args = [])
* @method \Aws\Result listDeviceEvents(array $args = [])
* @method \GuzzleHttp\Promise\Promise listDeviceEventsAsync(array $args = [])
* @method \Aws\Result listGatewayGroups(array $args = [])
* @method \GuzzleHttp\Promise\Promise listGatewayGroupsAsync(array $args = [])
* @method \Aws\Result listGateways(array $args = [])
* @method \GuzzleHttp\Promise\Promise listGatewaysAsync(array $args = [])
* @method \Aws\Result listSkills(array $args = [])
* @method \GuzzleHttp\Promise\Promise listSkillsAsync(array $args = [])
* @method \Aws\Result listSkillsStoreCategories(array $args = [])
* @method \GuzzleHttp\Promise\Promise listSkillsStoreCategoriesAsync(array $args = [])
* @method \Aws\Result listSkillsStoreSkillsByCategory(array $args = [])
* @method \GuzzleHttp\Promise\Promise listSkillsStoreSkillsByCategoryAsync(array $args = [])
* @method \Aws\Result listSmartHomeAppliances(array $args = [])
* @method \GuzzleHttp\Promise\Promise listSmartHomeAppliancesAsync(array $args = [])
* @method \Aws\Result listTags(array $args = [])
* @method \GuzzleHttp\Promise\Promise listTagsAsync(array $args = [])
* @method \Aws\Result putConferencePreference(array $args = [])
* @method \GuzzleHttp\Promise\Promise putConferencePreferenceAsync(array $args = [])
* @method \Aws\Result putInvitationConfiguration(array $args = [])
* @method \GuzzleHttp\Promise\Promise putInvitationConfigurationAsync(array $args = [])
* @method \Aws\Result putRoomSkillParameter(array $args = [])
* @method \GuzzleHttp\Promise\Promise putRoomSkillParameterAsync(array $args = [])
* @method \Aws\Result putSkillAuthorization(array $args = [])
* @method \GuzzleHttp\Promise\Promise putSkillAuthorizationAsync(array $args = [])
* @method \Aws\Result registerAVSDevice(array $args = [])
* @method \GuzzleHttp\Promise\Promise registerAVSDeviceAsync(array $args = [])
* @method \Aws\Result rejectSkill(array $args = [])
* @method \GuzzleHttp\Promise\Promise rejectSkillAsync(array $args = [])
* @method \Aws\Result resolveRoom(array $args = [])
* @method \GuzzleHttp\Promise\Promise resolveRoomAsync(array $args = [])
* @method \Aws\Result revokeInvitation(array $args = [])
* @method \GuzzleHttp\Promise\Promise revokeInvitationAsync(array $args = [])
* @method \Aws\Result searchAddressBooks(array $args = [])
* @method \GuzzleHttp\Promise\Promise searchAddressBooksAsync(array $args = [])
* @method \Aws\Result searchContacts(array $args = [])
* @method \GuzzleHttp\Promise\Promise searchContactsAsync(array $args = [])
* @method \Aws\Result searchDevices(array $args = [])
* @method \GuzzleHttp\Promise\Promise searchDevicesAsync(array $args = [])
* @method \Aws\Result searchNetworkProfiles(array $args = [])
* @method \GuzzleHttp\Promise\Promise searchNetworkProfilesAsync(array $args = [])
* @method \Aws\Result searchProfiles(array $args = [])
* @method \GuzzleHttp\Promise\Promise searchProfilesAsync(array $args = [])
* @method \Aws\Result searchRooms(array $args = [])
* @method \GuzzleHttp\Promise\Promise searchRoomsAsync(array $args = [])
* @method \Aws\Result searchSkillGroups(array $args = [])
* @method \GuzzleHttp\Promise\Promise searchSkillGroupsAsync(array $args = [])
* @method \Aws\Result searchUsers(array $args = [])
* @method \GuzzleHttp\Promise\Promise searchUsersAsync(array $args = [])
* @method \Aws\Result sendAnnouncement(array $args = [])
* @method \GuzzleHttp\Promise\Promise sendAnnouncementAsync(array $args = [])
* @method \Aws\Result sendInvitation(array $args = [])
* @method \GuzzleHttp\Promise\Promise sendInvitationAsync(array $args = [])
* @method \Aws\Result startDeviceSync(array $args = [])
* @method \GuzzleHttp\Promise\Promise startDeviceSyncAsync(array $args = [])
* @method \Aws\Result startSmartHomeApplianceDiscovery(array $args = [])
* @method \GuzzleHttp\Promise\Promise startSmartHomeApplianceDiscoveryAsync(array $args = [])
* @method \Aws\Result tagResource(array $args = [])
* @method \GuzzleHttp\Promise\Promise tagResourceAsync(array $args = [])
* @method \Aws\Result untagResource(array $args = [])
* @method \GuzzleHttp\Promise\Promise untagResourceAsync(array $args = [])
* @method \Aws\Result updateAddressBook(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateAddressBookAsync(array $args = [])
* @method \Aws\Result updateBusinessReportSchedule(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateBusinessReportScheduleAsync(array $args = [])
* @method \Aws\Result updateConferenceProvider(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateConferenceProviderAsync(array $args = [])
* @method \Aws\Result updateContact(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateContactAsync(array $args = [])
* @method \Aws\Result updateDevice(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateDeviceAsync(array $args = [])
* @method \Aws\Result updateGateway(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateGatewayAsync(array $args = [])
* @method \Aws\Result updateGatewayGroup(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateGatewayGroupAsync(array $args = [])
* @method \Aws\Result updateNetworkProfile(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateNetworkProfileAsync(array $args = [])
* @method \Aws\Result updateProfile(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateProfileAsync(array $args = [])
* @method \Aws\Result updateRoom(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateRoomAsync(array $args = [])
* @method \Aws\Result updateSkillGroup(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateSkillGroupAsync(array $args = [])
*/
class AlexaForBusinessClient extends AwsClient {}
@@ -0,0 +1,9 @@
<?php
namespace Aws\AlexaForBusiness\Exception;
use Aws\Exception\AwsException;
/**
* Represents an error interacting with the **Alexa For Business** service.
*/
class AlexaForBusinessException extends AwsException {}
@@ -0,0 +1,83 @@
<?php
namespace Aws\Amplify;
use Aws\AwsClient;
/**
* This client is used to interact with the **AWS Amplify** service.
* @method \Aws\Result createApp(array $args = [])
* @method \GuzzleHttp\Promise\Promise createAppAsync(array $args = [])
* @method \Aws\Result createBackendEnvironment(array $args = [])
* @method \GuzzleHttp\Promise\Promise createBackendEnvironmentAsync(array $args = [])
* @method \Aws\Result createBranch(array $args = [])
* @method \GuzzleHttp\Promise\Promise createBranchAsync(array $args = [])
* @method \Aws\Result createDeployment(array $args = [])
* @method \GuzzleHttp\Promise\Promise createDeploymentAsync(array $args = [])
* @method \Aws\Result createDomainAssociation(array $args = [])
* @method \GuzzleHttp\Promise\Promise createDomainAssociationAsync(array $args = [])
* @method \Aws\Result createWebhook(array $args = [])
* @method \GuzzleHttp\Promise\Promise createWebhookAsync(array $args = [])
* @method \Aws\Result deleteApp(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteAppAsync(array $args = [])
* @method \Aws\Result deleteBackendEnvironment(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteBackendEnvironmentAsync(array $args = [])
* @method \Aws\Result deleteBranch(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteBranchAsync(array $args = [])
* @method \Aws\Result deleteDomainAssociation(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteDomainAssociationAsync(array $args = [])
* @method \Aws\Result deleteJob(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteJobAsync(array $args = [])
* @method \Aws\Result deleteWebhook(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteWebhookAsync(array $args = [])
* @method \Aws\Result generateAccessLogs(array $args = [])
* @method \GuzzleHttp\Promise\Promise generateAccessLogsAsync(array $args = [])
* @method \Aws\Result getApp(array $args = [])
* @method \GuzzleHttp\Promise\Promise getAppAsync(array $args = [])
* @method \Aws\Result getArtifactUrl(array $args = [])
* @method \GuzzleHttp\Promise\Promise getArtifactUrlAsync(array $args = [])
* @method \Aws\Result getBackendEnvironment(array $args = [])
* @method \GuzzleHttp\Promise\Promise getBackendEnvironmentAsync(array $args = [])
* @method \Aws\Result getBranch(array $args = [])
* @method \GuzzleHttp\Promise\Promise getBranchAsync(array $args = [])
* @method \Aws\Result getDomainAssociation(array $args = [])
* @method \GuzzleHttp\Promise\Promise getDomainAssociationAsync(array $args = [])
* @method \Aws\Result getJob(array $args = [])
* @method \GuzzleHttp\Promise\Promise getJobAsync(array $args = [])
* @method \Aws\Result getWebhook(array $args = [])
* @method \GuzzleHttp\Promise\Promise getWebhookAsync(array $args = [])
* @method \Aws\Result listApps(array $args = [])
* @method \GuzzleHttp\Promise\Promise listAppsAsync(array $args = [])
* @method \Aws\Result listArtifacts(array $args = [])
* @method \GuzzleHttp\Promise\Promise listArtifactsAsync(array $args = [])
* @method \Aws\Result listBackendEnvironments(array $args = [])
* @method \GuzzleHttp\Promise\Promise listBackendEnvironmentsAsync(array $args = [])
* @method \Aws\Result listBranches(array $args = [])
* @method \GuzzleHttp\Promise\Promise listBranchesAsync(array $args = [])
* @method \Aws\Result listDomainAssociations(array $args = [])
* @method \GuzzleHttp\Promise\Promise listDomainAssociationsAsync(array $args = [])
* @method \Aws\Result listJobs(array $args = [])
* @method \GuzzleHttp\Promise\Promise listJobsAsync(array $args = [])
* @method \Aws\Result listTagsForResource(array $args = [])
* @method \GuzzleHttp\Promise\Promise listTagsForResourceAsync(array $args = [])
* @method \Aws\Result listWebhooks(array $args = [])
* @method \GuzzleHttp\Promise\Promise listWebhooksAsync(array $args = [])
* @method \Aws\Result startDeployment(array $args = [])
* @method \GuzzleHttp\Promise\Promise startDeploymentAsync(array $args = [])
* @method \Aws\Result startJob(array $args = [])
* @method \GuzzleHttp\Promise\Promise startJobAsync(array $args = [])
* @method \Aws\Result stopJob(array $args = [])
* @method \GuzzleHttp\Promise\Promise stopJobAsync(array $args = [])
* @method \Aws\Result tagResource(array $args = [])
* @method \GuzzleHttp\Promise\Promise tagResourceAsync(array $args = [])
* @method \Aws\Result untagResource(array $args = [])
* @method \GuzzleHttp\Promise\Promise untagResourceAsync(array $args = [])
* @method \Aws\Result updateApp(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateAppAsync(array $args = [])
* @method \Aws\Result updateBranch(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateBranchAsync(array $args = [])
* @method \Aws\Result updateDomainAssociation(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateDomainAssociationAsync(array $args = [])
* @method \Aws\Result updateWebhook(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateWebhookAsync(array $args = [])
*/
class AmplifyClient extends AwsClient {}
@@ -0,0 +1,9 @@
<?php
namespace Aws\Amplify\Exception;
use Aws\Exception\AwsException;
/**
* Represents an error interacting with the **AWS Amplify** service.
*/
class AmplifyException extends AwsException {}
@@ -0,0 +1,71 @@
<?php
namespace Aws\AmplifyBackend;
use Aws\AwsClient;
/**
* This client is used to interact with the **AmplifyBackend** service.
* @method \Aws\Result cloneBackend(array $args = [])
* @method \GuzzleHttp\Promise\Promise cloneBackendAsync(array $args = [])
* @method \Aws\Result createBackend(array $args = [])
* @method \GuzzleHttp\Promise\Promise createBackendAsync(array $args = [])
* @method \Aws\Result createBackendAPI(array $args = [])
* @method \GuzzleHttp\Promise\Promise createBackendAPIAsync(array $args = [])
* @method \Aws\Result createBackendAuth(array $args = [])
* @method \GuzzleHttp\Promise\Promise createBackendAuthAsync(array $args = [])
* @method \Aws\Result createBackendConfig(array $args = [])
* @method \GuzzleHttp\Promise\Promise createBackendConfigAsync(array $args = [])
* @method \Aws\Result createBackendStorage(array $args = [])
* @method \GuzzleHttp\Promise\Promise createBackendStorageAsync(array $args = [])
* @method \Aws\Result createToken(array $args = [])
* @method \GuzzleHttp\Promise\Promise createTokenAsync(array $args = [])
* @method \Aws\Result deleteBackend(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteBackendAsync(array $args = [])
* @method \Aws\Result deleteBackendAPI(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteBackendAPIAsync(array $args = [])
* @method \Aws\Result deleteBackendAuth(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteBackendAuthAsync(array $args = [])
* @method \Aws\Result deleteBackendStorage(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteBackendStorageAsync(array $args = [])
* @method \Aws\Result deleteToken(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteTokenAsync(array $args = [])
* @method \Aws\Result generateBackendAPIModels(array $args = [])
* @method \GuzzleHttp\Promise\Promise generateBackendAPIModelsAsync(array $args = [])
* @method \Aws\Result getBackend(array $args = [])
* @method \GuzzleHttp\Promise\Promise getBackendAsync(array $args = [])
* @method \Aws\Result getBackendAPI(array $args = [])
* @method \GuzzleHttp\Promise\Promise getBackendAPIAsync(array $args = [])
* @method \Aws\Result getBackendAPIModels(array $args = [])
* @method \GuzzleHttp\Promise\Promise getBackendAPIModelsAsync(array $args = [])
* @method \Aws\Result getBackendAuth(array $args = [])
* @method \GuzzleHttp\Promise\Promise getBackendAuthAsync(array $args = [])
* @method \Aws\Result getBackendJob(array $args = [])
* @method \GuzzleHttp\Promise\Promise getBackendJobAsync(array $args = [])
* @method \Aws\Result getBackendStorage(array $args = [])
* @method \GuzzleHttp\Promise\Promise getBackendStorageAsync(array $args = [])
* @method \Aws\Result getToken(array $args = [])
* @method \GuzzleHttp\Promise\Promise getTokenAsync(array $args = [])
* @method \Aws\Result importBackendAuth(array $args = [])
* @method \GuzzleHttp\Promise\Promise importBackendAuthAsync(array $args = [])
* @method \Aws\Result importBackendStorage(array $args = [])
* @method \GuzzleHttp\Promise\Promise importBackendStorageAsync(array $args = [])
* @method \Aws\Result listBackendJobs(array $args = [])
* @method \GuzzleHttp\Promise\Promise listBackendJobsAsync(array $args = [])
* @method \Aws\Result listS3Buckets(array $args = [])
* @method \GuzzleHttp\Promise\Promise listS3BucketsAsync(array $args = [])
* @method \Aws\Result removeAllBackends(array $args = [])
* @method \GuzzleHttp\Promise\Promise removeAllBackendsAsync(array $args = [])
* @method \Aws\Result removeBackendConfig(array $args = [])
* @method \GuzzleHttp\Promise\Promise removeBackendConfigAsync(array $args = [])
* @method \Aws\Result updateBackendAPI(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateBackendAPIAsync(array $args = [])
* @method \Aws\Result updateBackendAuth(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateBackendAuthAsync(array $args = [])
* @method \Aws\Result updateBackendConfig(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateBackendConfigAsync(array $args = [])
* @method \Aws\Result updateBackendJob(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateBackendJobAsync(array $args = [])
* @method \Aws\Result updateBackendStorage(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateBackendStorageAsync(array $args = [])
*/
class AmplifyBackendClient extends AwsClient {}
@@ -0,0 +1,9 @@
<?php
namespace Aws\AmplifyBackend\Exception;
use Aws\Exception\AwsException;
/**
* Represents an error interacting with the **AmplifyBackend** service.
*/
class AmplifyBackendException extends AwsException {}
@@ -0,0 +1,37 @@
<?php
namespace Aws\AmplifyUIBuilder;
use Aws\AwsClient;
/**
* This client is used to interact with the **AWS Amplify UI Builder** service.
* @method \Aws\Result createComponent(array $args = [])
* @method \GuzzleHttp\Promise\Promise createComponentAsync(array $args = [])
* @method \Aws\Result createTheme(array $args = [])
* @method \GuzzleHttp\Promise\Promise createThemeAsync(array $args = [])
* @method \Aws\Result deleteComponent(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteComponentAsync(array $args = [])
* @method \Aws\Result deleteTheme(array $args = [])
* @method \GuzzleHttp\Promise\Promise deleteThemeAsync(array $args = [])
* @method \Aws\Result exchangeCodeForToken(array $args = [])
* @method \GuzzleHttp\Promise\Promise exchangeCodeForTokenAsync(array $args = [])
* @method \Aws\Result exportComponents(array $args = [])
* @method \GuzzleHttp\Promise\Promise exportComponentsAsync(array $args = [])
* @method \Aws\Result exportThemes(array $args = [])
* @method \GuzzleHttp\Promise\Promise exportThemesAsync(array $args = [])
* @method \Aws\Result getComponent(array $args = [])
* @method \GuzzleHttp\Promise\Promise getComponentAsync(array $args = [])
* @method \Aws\Result getTheme(array $args = [])
* @method \GuzzleHttp\Promise\Promise getThemeAsync(array $args = [])
* @method \Aws\Result listComponents(array $args = [])
* @method \GuzzleHttp\Promise\Promise listComponentsAsync(array $args = [])
* @method \Aws\Result listThemes(array $args = [])
* @method \GuzzleHttp\Promise\Promise listThemesAsync(array $args = [])
* @method \Aws\Result refreshToken(array $args = [])
* @method \GuzzleHttp\Promise\Promise refreshTokenAsync(array $args = [])
* @method \Aws\Result updateComponent(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateComponentAsync(array $args = [])
* @method \Aws\Result updateTheme(array $args = [])
* @method \GuzzleHttp\Promise\Promise updateThemeAsync(array $args = [])
*/
class AmplifyUIBuilderClient extends AwsClient {}
@@ -0,0 +1,9 @@
<?php
namespace Aws\AmplifyUIBuilder\Exception;
use Aws\Exception\AwsException;
/**
* Represents an error interacting with the **AWS Amplify UI Builder** service.
*/
class AmplifyUIBuilderException extends AwsException {}
@@ -0,0 +1,71 @@
<?php
namespace Aws\Api;
/**
* Base class that is used by most API shapes
*/
abstract class AbstractModel implements \ArrayAccess
{
/** @var array */
protected $definition;
/** @var ShapeMap */
protected $shapeMap;
/**
* @param array $definition Service description
* @param ShapeMap $shapeMap Shapemap used for creating shapes
*/
public function __construct(array $definition, ShapeMap $shapeMap)
{
$this->definition = $definition;
$this->shapeMap = $shapeMap;
}
public function toArray()
{
return $this->definition;
}
#[\ReturnTypeWillChange]
public function offsetGet($offset)
{
return isset($this->definition[$offset])
? $this->definition[$offset] : null;
}
#[\ReturnTypeWillChange]
public function offsetSet($offset, $value)
{
$this->definition[$offset] = $value;
}
#[\ReturnTypeWillChange]
public function offsetExists($offset)
{
return isset($this->definition[$offset]);
}
#[\ReturnTypeWillChange]
public function offsetUnset($offset)
{
unset($this->definition[$offset]);
}
protected function shapeAt($key)
{
if (!isset($this->definition[$key])) {
throw new \InvalidArgumentException('Expected shape definition at '
. $key);
}
return $this->shapeFor($this->definition[$key]);
}
protected function shapeFor(array $definition)
{
return isset($definition['shape'])
? $this->shapeMap->resolve($definition)
: Shape::create($definition, $this->shapeMap);
}
}
@@ -0,0 +1,244 @@
<?php
namespace Aws\Api;
use Aws\Exception\UnresolvedApiException;
/**
* API providers.
*
* An API provider is a function that accepts a type, service, and version and
* returns an array of API data on success or NULL if no API data can be created
* for the provided arguments.
*
* You can wrap your calls to an API provider with the
* {@see ApiProvider::resolve} method to ensure that API data is created. If the
* API data is not created, then the resolve() method will throw a
* {@see Aws\Exception\UnresolvedApiException}.
*
* use Aws\Api\ApiProvider;
* $provider = ApiProvider::defaultProvider();
* // Returns an array or NULL.
* $data = $provider('api', 's3', '2006-03-01');
* // Returns an array or throws.
* $data = ApiProvider::resolve($provider, 'api', 'elasticfood', '2020-01-01');
*
* You can compose multiple providers into a single provider using
* {@see Aws\or_chain}. This method accepts providers as arguments and
* returns a new function that will invoke each provider until a non-null value
* is returned.
*
* $a = ApiProvider::filesystem(sys_get_temp_dir() . '/aws-beta-models');
* $b = ApiProvider::manifest();
*
* $c = \Aws\or_chain($a, $b);
* $data = $c('api', 'betaservice', '2015-08-08'); // $a handles this.
* $data = $c('api', 's3', '2006-03-01'); // $b handles this.
* $data = $c('api', 'invalid', '2014-12-15'); // Neither handles this.
*/
class ApiProvider
{
/** @var array A map of public API type names to their file suffix. */
private static $typeMap = [
'api' => 'api-2',
'paginator' => 'paginators-1',
'waiter' => 'waiters-2',
'docs' => 'docs-2',
];
/** @var array API manifest */
private $manifest;
/** @var string The directory containing service models. */
private $modelsDir;
/**
* Resolves an API provider and ensures a non-null return value.
*
* @param callable $provider Provider function to invoke.
* @param string $type Type of data ('api', 'waiter', 'paginator').
* @param string $service Service name.
* @param string $version API version.
*
* @return array
* @throws UnresolvedApiException
*/
public static function resolve(callable $provider, $type, $service, $version)
{
// Execute the provider and return the result, if there is one.
$result = $provider($type, $service, $version);
if (is_array($result)) {
if (!isset($result['metadata']['serviceIdentifier'])) {
$result['metadata']['serviceIdentifier'] = $service;
}
return $result;
}
// Throw an exception with a message depending on the inputs.
if (!isset(self::$typeMap[$type])) {
$msg = "The type must be one of: " . implode(', ', self::$typeMap);
} elseif ($service) {
$msg = "The {$service} service does not have version: {$version}.";
} else {
$msg = "You must specify a service name to retrieve its API data.";
}
throw new UnresolvedApiException($msg);
}
/**
* Default SDK API provider.
*
* This provider loads pre-built manifest data from the `data` directory.
*
* @return self
*/
public static function defaultProvider()
{
return new self(__DIR__ . '/../data', \Aws\manifest());
}
/**
* Loads API data after resolving the version to the latest, compatible,
* available version based on the provided manifest data.
*
* Manifest data is essentially an associative array of service names to
* associative arrays of API version aliases.
*
* [
* ...
* 'ec2' => [
* 'latest' => '2014-10-01',
* '2014-10-01' => '2014-10-01',
* '2014-09-01' => '2014-10-01',
* '2014-06-15' => '2014-10-01',
* ...
* ],
* 'ecs' => [...],
* 'elasticache' => [...],
* ...
* ]
*
* @param string $dir Directory containing service models.
* @param array $manifest The API version manifest data.
*
* @return self
*/
public static function manifest($dir, array $manifest)
{
return new self($dir, $manifest);
}
/**
* Loads API data from the specified directory.
*
* If "latest" is specified as the version, this provider must glob the
* directory to find which is the latest available version.
*
* @param string $dir Directory containing service models.
*
* @return self
* @throws \InvalidArgumentException if the provided `$dir` is invalid.
*/
public static function filesystem($dir)
{
return new self($dir);
}
/**
* Retrieves a list of valid versions for the specified service.
*
* @param string $service Service name
*
* @return array
*/
public function getVersions($service)
{
if (!isset($this->manifest)) {
$this->buildVersionsList($service);
}
if (!isset($this->manifest[$service]['versions'])) {
return [];
}
return array_values(array_unique($this->manifest[$service]['versions']));
}
/**
* Execute the provider.
*
* @param string $type Type of data ('api', 'waiter', 'paginator').
* @param string $service Service name.
* @param string $version API version.
*
* @return array|null
*/
public function __invoke($type, $service, $version)
{
// Resolve the type or return null.
if (isset(self::$typeMap[$type])) {
$type = self::$typeMap[$type];
} else {
return null;
}
// Resolve the version or return null.
if (!isset($this->manifest)) {
$this->buildVersionsList($service);
}
if (!isset($this->manifest[$service]['versions'][$version])) {
return null;
}
$version = $this->manifest[$service]['versions'][$version];
$path = "{$this->modelsDir}/{$service}/{$version}/{$type}.json";
try {
return \Aws\load_compiled_json($path);
} catch (\InvalidArgumentException $e) {
return null;
}
}
/**
* @param string $modelsDir Directory containing service models.
* @param array $manifest The API version manifest data.
*/
private function __construct($modelsDir, array $manifest = null)
{
$this->manifest = $manifest;
$this->modelsDir = rtrim($modelsDir, '/');
if (!is_dir($this->modelsDir)) {
throw new \InvalidArgumentException(
"The specified models directory, {$modelsDir}, was not found."
);
}
}
/**
* Build the versions list for the specified service by globbing the dir.
*/
private function buildVersionsList($service)
{
$dir = "{$this->modelsDir}/{$service}/";
if (!is_dir($dir)) {
return;
}
// Get versions, remove . and .., and sort in descending order.
$results = array_diff(scandir($dir, SCANDIR_SORT_DESCENDING), ['..', '.']);
if (!$results) {
$this->manifest[$service] = ['versions' => []];
} else {
$this->manifest[$service] = [
'versions' => [
'latest' => $results[0]
]
];
$this->manifest[$service]['versions'] += array_combine($results, $results);
}
}
}
@@ -0,0 +1,124 @@
<?php
namespace Aws\Api;
use Aws\Api\Parser\Exception\ParserException;
use DateTime;
use DateTimeZone;
use Exception;
/**
* DateTime overrides that make DateTime work more seamlessly as a string,
* with JSON documents, and with JMESPath.
*/
class DateTimeResult extends \DateTime implements \JsonSerializable
{
/**
* Create a new DateTimeResult from a unix timestamp.
* The Unix epoch (or Unix time or POSIX time or Unix
* timestamp) is the number of seconds that have elapsed since
* January 1, 1970 (midnight UTC/GMT).
*
* @return DateTimeResult
* @throws Exception
*/
public static function fromEpoch($unixTimestamp)
{
if (!is_numeric($unixTimestamp)) {
throw new ParserException('Invalid timestamp value passed to DateTimeResult::fromEpoch');
}
// PHP 5.5 does not support sub-second precision
if (\PHP_VERSION_ID < 56000) {
return new self(gmdate('c', $unixTimestamp));
}
$decimalSeparator = isset(localeconv()['decimal_point']) ? localeconv()['decimal_point'] : ".";
$formatString = "U" . $decimalSeparator . "u";
$dateTime = DateTime::createFromFormat(
$formatString,
sprintf('%0.6f', $unixTimestamp),
new DateTimeZone('UTC')
);
if (false === $dateTime) {
throw new ParserException('Invalid timestamp value passed to DateTimeResult::fromEpoch');
}
return new self(
$dateTime->format('Y-m-d H:i:s.u'),
new DateTimeZone('UTC')
);
}
/**
* @return DateTimeResult
*/
public static function fromISO8601($iso8601Timestamp)
{
if (is_numeric($iso8601Timestamp) || !is_string($iso8601Timestamp)) {
throw new ParserException('Invalid timestamp value passed to DateTimeResult::fromISO8601');
}
return new DateTimeResult($iso8601Timestamp);
}
/**
* Create a new DateTimeResult from an unknown timestamp.
*
* @return DateTimeResult
* @throws Exception
*/
public static function fromTimestamp($timestamp, $expectedFormat = null)
{
if (empty($timestamp)) {
return self::fromEpoch(0);
}
if (!(is_string($timestamp) || is_numeric($timestamp))) {
throw new ParserException('Invalid timestamp value passed to DateTimeResult::fromTimestamp');
}
try {
if ($expectedFormat == 'iso8601') {
try {
return self::fromISO8601($timestamp);
} catch (Exception $exception) {
return self::fromEpoch($timestamp);
}
} else if ($expectedFormat == 'unixTimestamp') {
try {
return self::fromEpoch($timestamp);
} catch (Exception $exception) {
return self::fromISO8601($timestamp);
}
} else if (\Aws\is_valid_epoch($timestamp)) {
return self::fromEpoch($timestamp);
}
return self::fromISO8601($timestamp);
} catch (Exception $exception) {
throw new ParserException('Invalid timestamp value passed to DateTimeResult::fromTimestamp');
}
}
/**
* Serialize the DateTimeResult as an ISO 8601 date string.
*
* @return string
*/
public function __toString()
{
return $this->format('c');
}
/**
* Serialize the date as an ISO 8601 date when serializing as JSON.
*
* @return string
*/
#[\ReturnTypeWillChange]
public function jsonSerialize()
{
return (string) $this;
}
}
@@ -0,0 +1,128 @@
<?php
namespace Aws\Api;
/**
* Encapsulates the documentation strings for a given service-version and
* provides methods for extracting the desired parts related to a service,
* operation, error, or shape (i.e., parameter).
*/
class DocModel
{
/** @var array */
private $docs;
/**
* @param array $docs
*
* @throws \RuntimeException
*/
public function __construct(array $docs)
{
if (!extension_loaded('tidy')) {
throw new \RuntimeException('The "tidy" PHP extension is required.');
}
$this->docs = $docs;
}
/**
* Convert the doc model to an array.
*
* @return array
*/
public function toArray()
{
return $this->docs;
}
/**
* Retrieves documentation about the service.
*
* @return null|string
*/
public function getServiceDocs()
{
return isset($this->docs['service']) ? $this->docs['service'] : null;
}
/**
* Retrieves documentation about an operation.
*
* @param string $operation Name of the operation
*
* @return null|string
*/
public function getOperationDocs($operation)
{
return isset($this->docs['operations'][$operation])
? $this->docs['operations'][$operation]
: null;
}
/**
* Retrieves documentation about an error.
*
* @param string $error Name of the error
*
* @return null|string
*/
public function getErrorDocs($error)
{
return isset($this->docs['shapes'][$error]['base'])
? $this->docs['shapes'][$error]['base']
: null;
}
/**
* Retrieves documentation about a shape, specific to the context.
*
* @param string $shapeName Name of the shape.
* @param string $parentName Name of the parent/context shape.
* @param string $ref Name used by the context to reference the shape.
*
* @return null|string
*/
public function getShapeDocs($shapeName, $parentName, $ref)
{
if (!isset($this->docs['shapes'][$shapeName])) {
return '';
}
$result = '';
$d = $this->docs['shapes'][$shapeName];
if (isset($d['refs']["{$parentName}\$${ref}"])) {
$result = $d['refs']["{$parentName}\$${ref}"];
} elseif (isset($d['base'])) {
$result = $d['base'];
}
if (isset($d['append'])) {
$result .= $d['append'];
}
return $this->clean($result);
}
private function clean($content)
{
if (!$content) {
return '';
}
$tidy = new \tidy();
$tidy->parseString($content, [
'indent' => true,
'doctype' => 'omit',
'output-html' => true,
'show-body-only' => true,
'drop-empty-paras' => true,
'drop-font-tags' => true,
'drop-proprietary-attributes' => true,
'hide-comments' => true,
'logical-emphasis' => true
]);
$tidy->cleanRepair();
return (string) $content;
}
}
@@ -0,0 +1,95 @@
<?php
namespace Aws\Api\ErrorParser;
use Aws\Api\Parser\MetadataParserTrait;
use Aws\Api\Parser\PayloadParserTrait;
use Aws\Api\Service;
use Aws\Api\StructureShape;
use Aws\CommandInterface;
use Psr\Http\Message\ResponseInterface;
abstract class AbstractErrorParser
{
use MetadataParserTrait;
use PayloadParserTrait;
/**
* @var Service
*/
protected $api;
/**
* @param Service $api
*/
public function __construct(Service $api = null)
{
$this->api = $api;
}
abstract protected function payload(
ResponseInterface $response,
StructureShape $member
);
protected function extractPayload(
StructureShape $member,
ResponseInterface $response
) {
if ($member instanceof StructureShape) {
// Structure members parse top-level data into a specific key.
return $this->payload($response, $member);
} else {
// Streaming data is just the stream from the response body.
return $response->getBody();
}
}
protected function populateShape(
array &$data,
ResponseInterface $response,
CommandInterface $command = null
) {
$data['body'] = [];
if (!empty($command) && !empty($this->api)) {
// If modeled error code is indicated, check for known error shape
if (!empty($data['code'])) {
$errors = $this->api->getOperation($command->getName())->getErrors();
foreach ($errors as $key => $error) {
// If error code matches a known error shape, populate the body
if ($data['code'] == $error['name']
&& $error instanceof StructureShape
) {
$modeledError = $error;
$data['body'] = $this->extractPayload(
$modeledError,
$response
);
$data['error_shape'] = $modeledError;
foreach ($error->getMembers() as $name => $member) {
switch ($member['location']) {
case 'header':
$this->extractHeader($name, $member, $response, $data['body']);
break;
case 'headers':
$this->extractHeaders($name, $member, $response, $data['body']);
break;
case 'statusCode':
$this->extractStatus($name, $response, $data['body']);
break;
}
}
break;
}
}
}
}
return $data;
}
}
@@ -0,0 +1,38 @@
<?php
namespace Aws\Api\ErrorParser;
use Aws\Api\Parser\PayloadParserTrait;
use Aws\Api\StructureShape;
use Psr\Http\Message\ResponseInterface;
/**
* Provides basic JSON error parsing functionality.
*/
trait JsonParserTrait
{
use PayloadParserTrait;
private function genericHandler(ResponseInterface $response)
{
$code = (string) $response->getStatusCode();
return [
'request_id' => (string) $response->getHeaderLine('x-amzn-requestid'),
'code' => null,
'message' => null,
'type' => $code[0] == '4' ? 'client' : 'server',
'parsed' => $this->parseJson($response->getBody(), $response)
];
}
protected function payload(
ResponseInterface $response,
StructureShape $member
) {
$jsonBody = $this->parseJson($response->getBody(), $response);
if ($jsonBody) {
return $this->parser->parse($member, $jsonBody);
}
}
}
@@ -0,0 +1,47 @@
<?php
namespace Aws\Api\ErrorParser;
use Aws\Api\Parser\JsonParser;
use Aws\Api\Service;
use Aws\CommandInterface;
use Psr\Http\Message\ResponseInterface;
/**
* Parsers JSON-RPC errors.
*/
class JsonRpcErrorParser extends AbstractErrorParser
{
use JsonParserTrait;
private $parser;
public function __construct(Service $api = null, JsonParser $parser = null)
{
parent::__construct($api);
$this->parser = $parser ?: new JsonParser();
}
public function __invoke(
ResponseInterface $response,
CommandInterface $command = null
) {
$data = $this->genericHandler($response);
// Make the casing consistent across services.
if ($data['parsed']) {
$data['parsed'] = array_change_key_case($data['parsed']);
}
if (isset($data['parsed']['__type'])) {
$parts = explode('#', $data['parsed']['__type']);
$data['code'] = isset($parts[1]) ? $parts[1] : $parts[0];
$data['message'] = isset($data['parsed']['message'])
? $data['parsed']['message']
: null;
}
$this->populateShape($data, $response, $command);
return $data;
}
}
@@ -0,0 +1,58 @@
<?php
namespace Aws\Api\ErrorParser;
use Aws\Api\Parser\JsonParser;
use Aws\Api\Service;
use Aws\Api\StructureShape;
use Aws\CommandInterface;
use Psr\Http\Message\ResponseInterface;
/**
* Parses JSON-REST errors.
*/
class RestJsonErrorParser extends AbstractErrorParser
{
use JsonParserTrait;
private $parser;
public function __construct(Service $api = null, JsonParser $parser = null)
{
parent::__construct($api);
$this->parser = $parser ?: new JsonParser();
}
public function __invoke(
ResponseInterface $response,
CommandInterface $command = null
) {
$data = $this->genericHandler($response);
// Merge in error data from the JSON body
if ($json = $data['parsed']) {
$data = array_replace($data, $json);
}
// Correct error type from services like Amazon Glacier
if (!empty($data['type'])) {
$data['type'] = strtolower($data['type']);
}
// Retrieve the error code from services like Amazon Elastic Transcoder
if ($code = $response->getHeaderLine('x-amzn-errortype')) {
$colon = strpos($code, ':');
$data['code'] = $colon ? substr($code, 0, $colon) : $code;
}
// Retrieve error message directly
$data['message'] = isset($data['parsed']['message'])
? $data['parsed']['message']
: (isset($data['parsed']['Message'])
? $data['parsed']['Message']
: null);
$this->populateShape($data, $response, $command);
return $data;
}
}
@@ -0,0 +1,111 @@
<?php
namespace Aws\Api\ErrorParser;
use Aws\Api\Parser\PayloadParserTrait;
use Aws\Api\Parser\XmlParser;
use Aws\Api\Service;
use Aws\Api\StructureShape;
use Aws\CommandInterface;
use Psr\Http\Message\ResponseInterface;
/**
* Parses XML errors.
*/
class XmlErrorParser extends AbstractErrorParser
{
use PayloadParserTrait;
protected $parser;
public function __construct(Service $api = null, XmlParser $parser = null)
{
parent::__construct($api);
$this->parser = $parser ?: new XmlParser();
}
public function __invoke(
ResponseInterface $response,
CommandInterface $command = null
) {
$code = (string) $response->getStatusCode();
$data = [
'type' => $code[0] == '4' ? 'client' : 'server',
'request_id' => null,
'code' => null,
'message' => null,
'parsed' => null
];
$body = $response->getBody();
if ($body->getSize() > 0) {
$this->parseBody($this->parseXml($body, $response), $data);
} else {
$this->parseHeaders($response, $data);
}
$this->populateShape($data, $response, $command);
return $data;
}
private function parseHeaders(ResponseInterface $response, array &$data)
{
if ($response->getStatusCode() == '404') {
$data['code'] = 'NotFound';
}
$data['message'] = $response->getStatusCode() . ' '
. $response->getReasonPhrase();
if ($requestId = $response->getHeaderLine('x-amz-request-id')) {
$data['request_id'] = $requestId;
$data['message'] .= " (Request-ID: $requestId)";
}
}
private function parseBody(\SimpleXMLElement $body, array &$data)
{
$data['parsed'] = $body;
$prefix = $this->registerNamespacePrefix($body);
if ($tempXml = $body->xpath("//{$prefix}Code[1]")) {
$data['code'] = (string) $tempXml[0];
}
if ($tempXml = $body->xpath("//{$prefix}Message[1]")) {
$data['message'] = (string) $tempXml[0];
}
$tempXml = $body->xpath("//{$prefix}RequestId[1]");
if (isset($tempXml[0])) {
$data['request_id'] = (string)$tempXml[0];
}
}
protected function registerNamespacePrefix(\SimpleXMLElement $element)
{
$namespaces = $element->getDocNamespaces();
if (!isset($namespaces[''])) {
return '';
}
// Account for the default namespace being defined and PHP not
// being able to handle it :(.
$element->registerXPathNamespace('ns', $namespaces['']);
return 'ns:';
}
protected function payload(
ResponseInterface $response,
StructureShape $member
) {
$xmlBody = $this->parseXml($response->getBody(), $response);
$prefix = $this->registerNamespacePrefix($xmlBody);
$errorBody = $xmlBody->xpath("//{$prefix}Error");
if (is_array($errorBody) && !empty($errorBody[0])) {
return $this->parser->parse($member, $errorBody[0]);
}
}
}

Some files were not shown because too many files have changed in this diff Show More