Changeset 3444652
- Timestamp:
- 01/22/2026 09:22:49 AM (2 months ago)
- Location:
- acquired-payments-gateway-for-woocommerce
- Files:
-
- 16 edited
- 1 copied
-
tags/2.1.0 (copied) (copied from acquired-payments-gateway-for-woocommerce/trunk)
-
tags/2.1.0/acquired-com-for-woocommerce.php (modified) (2 diffs)
-
tags/2.1.0/languages/acquired-com-for-woocommerce.pot (modified) (1 diff)
-
tags/2.1.0/readme.txt (modified) (2 diffs)
-
tags/2.1.0/src/Api/IncomingDataHandler.php (modified) (3 diffs)
-
tags/2.1.0/src/Services/SettingsService.php (modified) (2 diffs)
-
tags/2.1.0/src/bootstrap.php (modified) (1 diff)
-
tags/2.1.0/vendor/composer/autoload_static.php (modified) (4 diffs)
-
tags/2.1.0/vendor/composer/installed.php (modified) (2 diffs)
-
trunk/acquired-com-for-woocommerce.php (modified) (2 diffs)
-
trunk/languages/acquired-com-for-woocommerce.pot (modified) (1 diff)
-
trunk/readme.txt (modified) (2 diffs)
-
trunk/src/Api/IncomingDataHandler.php (modified) (3 diffs)
-
trunk/src/Services/SettingsService.php (modified) (2 diffs)
-
trunk/src/bootstrap.php (modified) (1 diff)
-
trunk/vendor/composer/autoload_static.php (modified) (4 diffs)
-
trunk/vendor/composer/installed.php (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
acquired-payments-gateway-for-woocommerce/tags/2.1.0/acquired-com-for-woocommerce.php
r3382664 r3444652 3 3 * Plugin Name: Acquired.com for WooCommerce 4 4 * Description: Securely accept Cards, Apple Pay & Google Pay on your store using Acquired.com. 5 * Version: 2. 0.05 * Version: 2.1.0 6 6 * Author: Acquired 7 7 * Author URI: https://acquired.com … … 45 45 } 46 46 if ( ! defined( 'ACFW_VERSION' ) ) { 47 define( 'ACFW_VERSION', '2. 0.0' );47 define( 'ACFW_VERSION', '2.1.0' ); 48 48 } 49 49 if ( ! defined( 'ACFW_PHP_VERSION' ) ) { -
acquired-payments-gateway-for-woocommerce/tags/2.1.0/languages/acquired-com-for-woocommerce.pot
r3382664 r3444652 3 3 msgid "" 4 4 msgstr "" 5 "Project-Id-Version: Acquired.com for WooCommerce 2. 0.0\n"5 "Project-Id-Version: Acquired.com for WooCommerce 2.1.0\n" 6 6 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/acquired-com-for-woocommerce\n" 7 7 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -
acquired-payments-gateway-for-woocommerce/tags/2.1.0/readme.txt
r3382664 r3444652 5 5 Tested up to: 6.8.3 6 6 Requires PHP: 8.1 7 Stable tag: 2. 0.07 Stable tag: 2.1.0 8 8 License: MIT License 9 9 License URI: https://opensource.org/license/mit … … 62 62 == Changelog == 63 63 64 = 2.1.0 - 2026/01/22 = 65 * Feature: Update to support the release of signing keys and multiple APP IDs. 66 64 67 = 2.0.0 - 2025/10/22 = 65 68 * Release version 2.0.0 -
acquired-payments-gateway-for-woocommerce/tags/2.1.0/src/Api/IncomingDataHandler.php
r3382664 r3444652 25 25 * @param LoggerService $logger_service 26 26 * @param string $app_key 27 */ 28 public function __construct( private LoggerService $logger_service, private string $app_key ) {} 27 * @param string $signing_key 28 */ 29 public function __construct( private LoggerService $logger_service, private string $app_key, private string $signing_key = '' ) {} 29 30 30 31 /** … … 90 91 */ 91 92 private function validate_redirect_hash( array $data ) : bool { 92 if ( ! $this->app_key ) { 93 // Determine which key to use: signing_key takes precedence, fallback to app_key for backward compatibility 94 $key = ( ! empty( $this->signing_key ) ) ? $this->signing_key : $this->app_key; 95 96 if ( ! $key ) { 93 97 return false; 94 98 } 95 99 96 $first_hash = hash( 'sha256', $data['status'] . $data['transaction_id'] . $data['order_id'] . $data['timestamp'] ); 97 98 $final_hash = hash( 'sha256', $first_hash . $this->app_key ); 99 100 return hash_equals( $data['hash'], $final_hash ); 100 $first_hash = hash( 'sha256', $data['status'] . $data['transaction_id'] . $data['order_id'] . $data['timestamp'] ); 101 $expected_hash = hash( 'sha256', $first_hash . $key ); 102 103 // Support comma-delimited hashes for key rotation. If ANY hash matches, validation passes. 104 $hashes = array_map( 'trim', explode( ',', $data['hash'] ) ); 105 foreach ( $hashes as $candidate_hash ) { 106 if ( hash_equals( $expected_hash, $candidate_hash ) ) { 107 return true; 108 } 109 } 110 111 return false; 101 112 } 102 113 … … 109 120 */ 110 121 private function validate_webhook_hash( string $data, string $hash ) : bool { 111 if ( ! $this->app_key ) { 122 // Determine which key to use: signing_key takes precedence, fallback to app_key for backward compatibility 123 $key = ( ! empty( $this->signing_key ) ) ? $this->signing_key : $this->app_key; 124 125 if ( ! $key ) { 112 126 return false; 113 127 } 114 128 115 return hash_equals( hash_hmac( 'sha256', preg_replace( '/\s+/', '', $data ), $this->app_key ), $hash ); 129 $sanitized_data = preg_replace( '/\s+/', '', $data ); 130 $expected_hash = hash_hmac( 'sha256', $sanitized_data, $key ); 131 132 // Support comma-delimited hashes for key rotation. If ANY hash matches, validation passes. 133 $hashes = array_map( 'trim', explode( ',', $hash ) ); 134 foreach ( $hashes as $candidate_hash ) { 135 if ( hash_equals( $expected_hash, $candidate_hash ) ) { 136 return true; 137 } 138 } 139 140 return false; 116 141 } 117 142 -
acquired-payments-gateway-for-woocommerce/tags/2.1.0/src/Services/SettingsService.php
r3382664 r3444652 264 264 265 265 /** 266 * Get signing key for specific environment. 267 * 268 * @param string $environment 269 * @return string 270 */ 271 public function get_signing_key_for_environment( string $environment ) : string { 272 return $this->get_option( 'signing_key_' . $environment, '' ); 273 } 274 275 /** 276 * Get signing key for current environment. 277 * 278 * @return string 279 */ 280 public function get_signing_key() : string { 281 return $this->get_signing_key_for_environment( $this->is_environment_production() ? 'production' : 'staging' ); 282 } 283 284 /** 266 285 * Get payment reference. 267 286 * … … 435 454 'type' => 'password', 436 455 'description' => __( 'Enter your Acquired.com staging App Key.', 'acquired-com-for-woocommerce' ), 456 'desc_tip' => true, 457 ], 458 'signing_keys' => [ 459 'title' => __( 'Signing Keys', 'acquired-com-for-woocommerce' ), 460 'description' => __( 'Signing keys for webhook and redirect hash validation. For backward compatibility, the App Key will be used if no signing key is provided.', 'acquired-com-for-woocommerce' ), 461 'type' => 'title', 462 ], 463 'signing_key_production' => [ 464 'title' => __( 'Live Signing Key', 'acquired-com-for-woocommerce' ), 465 'type' => 'password', 466 'description' => __( 'Enter your Acquired.com production signing key (format: sk_{32-bit hex}).', 'acquired-com-for-woocommerce' ), 467 'desc_tip' => true, 468 ], 469 'signing_key_staging' => [ 470 'title' => __( 'Staging Signing Key', 'acquired-com-for-woocommerce' ), 471 'type' => 'password', 472 'description' => __( 'Enter your Acquired.com staging signing key (format: sk_{32-bit hex}).', 'acquired-com-for-woocommerce' ), 437 473 'desc_tip' => true, 438 474 ], -
acquired-payments-gateway-for-woocommerce/tags/2.1.0/src/bootstrap.php
r3382664 r3444652 69 69 CustomerService::class => autowire(), 70 70 IncomingDataHandler::class => function( $container ) { 71 return new IncomingDataHandler( $container->get( LoggerService::class ), $container->get( SettingsService::class )->get_app_key() );71 return new IncomingDataHandler( $container->get( LoggerService::class ), $container->get( SettingsService::class )->get_app_key(), $container->get( SettingsService::class )->get_signing_key() ); 72 72 }, 73 73 LoggerService::class => function( $container ) { -
acquired-payments-gateway-for-woocommerce/tags/2.1.0/vendor/composer/autoload_static.php
r3382664 r3444652 15 15 16 16 public static $prefixLengthsPsr4 = array ( 17 'P' => 17 'P' => 18 18 array ( 19 19 'Psr\\Http\\Message\\' => 17, … … 21 21 'Psr\\Container\\' => 14, 22 22 ), 23 'L' => 23 'L' => 24 24 array ( 25 25 'Laravel\\SerializableClosure\\' => 28, 26 26 ), 27 'I' => 27 'I' => 28 28 array ( 29 29 'Invoker\\' => 8, 30 30 ), 31 'G' => 31 'G' => 32 32 array ( 33 33 'GuzzleHttp\\Psr7\\' => 16, … … 35 35 'GuzzleHttp\\' => 11, 36 36 ), 37 'D' => 37 'D' => 38 38 array ( 39 39 'DI\\' => 3, 40 40 ), 41 'A' => 41 'A' => 42 42 array ( 43 43 'AcquiredComForWooCommerce\\' => 26, … … 46 46 47 47 public static $prefixDirsPsr4 = array ( 48 'Psr\\Http\\Message\\' => 48 'Psr\\Http\\Message\\' => 49 49 array ( 50 50 0 => __DIR__ . '/..' . '/psr/http-factory/src', 51 51 1 => __DIR__ . '/..' . '/psr/http-message/src', 52 52 ), 53 'Psr\\Http\\Client\\' => 53 'Psr\\Http\\Client\\' => 54 54 array ( 55 55 0 => __DIR__ . '/..' . '/psr/http-client/src', 56 56 ), 57 'Psr\\Container\\' => 57 'Psr\\Container\\' => 58 58 array ( 59 59 0 => __DIR__ . '/..' . '/psr/container/src', 60 60 ), 61 'Laravel\\SerializableClosure\\' => 61 'Laravel\\SerializableClosure\\' => 62 62 array ( 63 63 0 => __DIR__ . '/..' . '/laravel/serializable-closure/src', 64 64 ), 65 'Invoker\\' => 65 'Invoker\\' => 66 66 array ( 67 67 0 => __DIR__ . '/..' . '/php-di/invoker/src', 68 68 ), 69 'GuzzleHttp\\Psr7\\' => 69 'GuzzleHttp\\Psr7\\' => 70 70 array ( 71 71 0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src', 72 72 ), 73 'GuzzleHttp\\Promise\\' => 73 'GuzzleHttp\\Promise\\' => 74 74 array ( 75 75 0 => __DIR__ . '/..' . '/guzzlehttp/promises/src', 76 76 ), 77 'GuzzleHttp\\' => 77 'GuzzleHttp\\' => 78 78 array ( 79 79 0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src', 80 80 ), 81 'DI\\' => 81 'DI\\' => 82 82 array ( 83 83 0 => __DIR__ . '/..' . '/php-di/php-di/src', 84 84 ), 85 'AcquiredComForWooCommerce\\' => 85 'AcquiredComForWooCommerce\\' => 86 86 array ( 87 87 0 => __DIR__ . '/../..' . '/src', -
acquired-payments-gateway-for-woocommerce/tags/2.1.0/vendor/composer/installed.php
r3382664 r3444652 2 2 'root' => array( 3 3 'name' => 'acquired-com/acquired-com-for-woocommerce', 4 'pretty_version' => ' 2.0.0',5 'version' => '2. 0.0.0',6 'reference' => ' 9253e38ea8ac62aaf43c1b5d3cf42016c3d544ff',4 'pretty_version' => 'v2.1.0', 5 'version' => '2.1.0.0', 6 'reference' => 'a93f08d0336663bc2dfb37ae5157f73e7a1b5ce4', 7 7 'type' => 'wordpress-plugin', 8 8 'install_path' => __DIR__ . '/../../', … … 12 12 'versions' => array( 13 13 'acquired-com/acquired-com-for-woocommerce' => array( 14 'pretty_version' => ' 2.0.0',15 'version' => '2. 0.0.0',16 'reference' => ' 9253e38ea8ac62aaf43c1b5d3cf42016c3d544ff',14 'pretty_version' => 'v2.1.0', 15 'version' => '2.1.0.0', 16 'reference' => 'a93f08d0336663bc2dfb37ae5157f73e7a1b5ce4', 17 17 'type' => 'wordpress-plugin', 18 18 'install_path' => __DIR__ . '/../../', -
acquired-payments-gateway-for-woocommerce/trunk/acquired-com-for-woocommerce.php
r3382664 r3444652 3 3 * Plugin Name: Acquired.com for WooCommerce 4 4 * Description: Securely accept Cards, Apple Pay & Google Pay on your store using Acquired.com. 5 * Version: 2. 0.05 * Version: 2.1.0 6 6 * Author: Acquired 7 7 * Author URI: https://acquired.com … … 45 45 } 46 46 if ( ! defined( 'ACFW_VERSION' ) ) { 47 define( 'ACFW_VERSION', '2. 0.0' );47 define( 'ACFW_VERSION', '2.1.0' ); 48 48 } 49 49 if ( ! defined( 'ACFW_PHP_VERSION' ) ) { -
acquired-payments-gateway-for-woocommerce/trunk/languages/acquired-com-for-woocommerce.pot
r3382664 r3444652 3 3 msgid "" 4 4 msgstr "" 5 "Project-Id-Version: Acquired.com for WooCommerce 2. 0.0\n"5 "Project-Id-Version: Acquired.com for WooCommerce 2.1.0\n" 6 6 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/acquired-com-for-woocommerce\n" 7 7 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -
acquired-payments-gateway-for-woocommerce/trunk/readme.txt
r3382664 r3444652 5 5 Tested up to: 6.8.3 6 6 Requires PHP: 8.1 7 Stable tag: 2. 0.07 Stable tag: 2.1.0 8 8 License: MIT License 9 9 License URI: https://opensource.org/license/mit … … 62 62 == Changelog == 63 63 64 = 2.1.0 - 2026/01/22 = 65 * Feature: Update to support the release of signing keys and multiple APP IDs. 66 64 67 = 2.0.0 - 2025/10/22 = 65 68 * Release version 2.0.0 -
acquired-payments-gateway-for-woocommerce/trunk/src/Api/IncomingDataHandler.php
r3382664 r3444652 25 25 * @param LoggerService $logger_service 26 26 * @param string $app_key 27 */ 28 public function __construct( private LoggerService $logger_service, private string $app_key ) {} 27 * @param string $signing_key 28 */ 29 public function __construct( private LoggerService $logger_service, private string $app_key, private string $signing_key = '' ) {} 29 30 30 31 /** … … 90 91 */ 91 92 private function validate_redirect_hash( array $data ) : bool { 92 if ( ! $this->app_key ) { 93 // Determine which key to use: signing_key takes precedence, fallback to app_key for backward compatibility 94 $key = ( ! empty( $this->signing_key ) ) ? $this->signing_key : $this->app_key; 95 96 if ( ! $key ) { 93 97 return false; 94 98 } 95 99 96 $first_hash = hash( 'sha256', $data['status'] . $data['transaction_id'] . $data['order_id'] . $data['timestamp'] ); 97 98 $final_hash = hash( 'sha256', $first_hash . $this->app_key ); 99 100 return hash_equals( $data['hash'], $final_hash ); 100 $first_hash = hash( 'sha256', $data['status'] . $data['transaction_id'] . $data['order_id'] . $data['timestamp'] ); 101 $expected_hash = hash( 'sha256', $first_hash . $key ); 102 103 // Support comma-delimited hashes for key rotation. If ANY hash matches, validation passes. 104 $hashes = array_map( 'trim', explode( ',', $data['hash'] ) ); 105 foreach ( $hashes as $candidate_hash ) { 106 if ( hash_equals( $expected_hash, $candidate_hash ) ) { 107 return true; 108 } 109 } 110 111 return false; 101 112 } 102 113 … … 109 120 */ 110 121 private function validate_webhook_hash( string $data, string $hash ) : bool { 111 if ( ! $this->app_key ) { 122 // Determine which key to use: signing_key takes precedence, fallback to app_key for backward compatibility 123 $key = ( ! empty( $this->signing_key ) ) ? $this->signing_key : $this->app_key; 124 125 if ( ! $key ) { 112 126 return false; 113 127 } 114 128 115 return hash_equals( hash_hmac( 'sha256', preg_replace( '/\s+/', '', $data ), $this->app_key ), $hash ); 129 $sanitized_data = preg_replace( '/\s+/', '', $data ); 130 $expected_hash = hash_hmac( 'sha256', $sanitized_data, $key ); 131 132 // Support comma-delimited hashes for key rotation. If ANY hash matches, validation passes. 133 $hashes = array_map( 'trim', explode( ',', $hash ) ); 134 foreach ( $hashes as $candidate_hash ) { 135 if ( hash_equals( $expected_hash, $candidate_hash ) ) { 136 return true; 137 } 138 } 139 140 return false; 116 141 } 117 142 -
acquired-payments-gateway-for-woocommerce/trunk/src/Services/SettingsService.php
r3382664 r3444652 264 264 265 265 /** 266 * Get signing key for specific environment. 267 * 268 * @param string $environment 269 * @return string 270 */ 271 public function get_signing_key_for_environment( string $environment ) : string { 272 return $this->get_option( 'signing_key_' . $environment, '' ); 273 } 274 275 /** 276 * Get signing key for current environment. 277 * 278 * @return string 279 */ 280 public function get_signing_key() : string { 281 return $this->get_signing_key_for_environment( $this->is_environment_production() ? 'production' : 'staging' ); 282 } 283 284 /** 266 285 * Get payment reference. 267 286 * … … 435 454 'type' => 'password', 436 455 'description' => __( 'Enter your Acquired.com staging App Key.', 'acquired-com-for-woocommerce' ), 456 'desc_tip' => true, 457 ], 458 'signing_keys' => [ 459 'title' => __( 'Signing Keys', 'acquired-com-for-woocommerce' ), 460 'description' => __( 'Signing keys for webhook and redirect hash validation. For backward compatibility, the App Key will be used if no signing key is provided.', 'acquired-com-for-woocommerce' ), 461 'type' => 'title', 462 ], 463 'signing_key_production' => [ 464 'title' => __( 'Live Signing Key', 'acquired-com-for-woocommerce' ), 465 'type' => 'password', 466 'description' => __( 'Enter your Acquired.com production signing key (format: sk_{32-bit hex}).', 'acquired-com-for-woocommerce' ), 467 'desc_tip' => true, 468 ], 469 'signing_key_staging' => [ 470 'title' => __( 'Staging Signing Key', 'acquired-com-for-woocommerce' ), 471 'type' => 'password', 472 'description' => __( 'Enter your Acquired.com staging signing key (format: sk_{32-bit hex}).', 'acquired-com-for-woocommerce' ), 437 473 'desc_tip' => true, 438 474 ], -
acquired-payments-gateway-for-woocommerce/trunk/src/bootstrap.php
r3382664 r3444652 69 69 CustomerService::class => autowire(), 70 70 IncomingDataHandler::class => function( $container ) { 71 return new IncomingDataHandler( $container->get( LoggerService::class ), $container->get( SettingsService::class )->get_app_key() );71 return new IncomingDataHandler( $container->get( LoggerService::class ), $container->get( SettingsService::class )->get_app_key(), $container->get( SettingsService::class )->get_signing_key() ); 72 72 }, 73 73 LoggerService::class => function( $container ) { -
acquired-payments-gateway-for-woocommerce/trunk/vendor/composer/autoload_static.php
r3382664 r3444652 15 15 16 16 public static $prefixLengthsPsr4 = array ( 17 'P' => 17 'P' => 18 18 array ( 19 19 'Psr\\Http\\Message\\' => 17, … … 21 21 'Psr\\Container\\' => 14, 22 22 ), 23 'L' => 23 'L' => 24 24 array ( 25 25 'Laravel\\SerializableClosure\\' => 28, 26 26 ), 27 'I' => 27 'I' => 28 28 array ( 29 29 'Invoker\\' => 8, 30 30 ), 31 'G' => 31 'G' => 32 32 array ( 33 33 'GuzzleHttp\\Psr7\\' => 16, … … 35 35 'GuzzleHttp\\' => 11, 36 36 ), 37 'D' => 37 'D' => 38 38 array ( 39 39 'DI\\' => 3, 40 40 ), 41 'A' => 41 'A' => 42 42 array ( 43 43 'AcquiredComForWooCommerce\\' => 26, … … 46 46 47 47 public static $prefixDirsPsr4 = array ( 48 'Psr\\Http\\Message\\' => 48 'Psr\\Http\\Message\\' => 49 49 array ( 50 50 0 => __DIR__ . '/..' . '/psr/http-factory/src', 51 51 1 => __DIR__ . '/..' . '/psr/http-message/src', 52 52 ), 53 'Psr\\Http\\Client\\' => 53 'Psr\\Http\\Client\\' => 54 54 array ( 55 55 0 => __DIR__ . '/..' . '/psr/http-client/src', 56 56 ), 57 'Psr\\Container\\' => 57 'Psr\\Container\\' => 58 58 array ( 59 59 0 => __DIR__ . '/..' . '/psr/container/src', 60 60 ), 61 'Laravel\\SerializableClosure\\' => 61 'Laravel\\SerializableClosure\\' => 62 62 array ( 63 63 0 => __DIR__ . '/..' . '/laravel/serializable-closure/src', 64 64 ), 65 'Invoker\\' => 65 'Invoker\\' => 66 66 array ( 67 67 0 => __DIR__ . '/..' . '/php-di/invoker/src', 68 68 ), 69 'GuzzleHttp\\Psr7\\' => 69 'GuzzleHttp\\Psr7\\' => 70 70 array ( 71 71 0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src', 72 72 ), 73 'GuzzleHttp\\Promise\\' => 73 'GuzzleHttp\\Promise\\' => 74 74 array ( 75 75 0 => __DIR__ . '/..' . '/guzzlehttp/promises/src', 76 76 ), 77 'GuzzleHttp\\' => 77 'GuzzleHttp\\' => 78 78 array ( 79 79 0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src', 80 80 ), 81 'DI\\' => 81 'DI\\' => 82 82 array ( 83 83 0 => __DIR__ . '/..' . '/php-di/php-di/src', 84 84 ), 85 'AcquiredComForWooCommerce\\' => 85 'AcquiredComForWooCommerce\\' => 86 86 array ( 87 87 0 => __DIR__ . '/../..' . '/src', -
acquired-payments-gateway-for-woocommerce/trunk/vendor/composer/installed.php
r3382664 r3444652 2 2 'root' => array( 3 3 'name' => 'acquired-com/acquired-com-for-woocommerce', 4 'pretty_version' => ' 2.0.0',5 'version' => '2. 0.0.0',6 'reference' => ' 9253e38ea8ac62aaf43c1b5d3cf42016c3d544ff',4 'pretty_version' => 'v2.1.0', 5 'version' => '2.1.0.0', 6 'reference' => 'a93f08d0336663bc2dfb37ae5157f73e7a1b5ce4', 7 7 'type' => 'wordpress-plugin', 8 8 'install_path' => __DIR__ . '/../../', … … 12 12 'versions' => array( 13 13 'acquired-com/acquired-com-for-woocommerce' => array( 14 'pretty_version' => ' 2.0.0',15 'version' => '2. 0.0.0',16 'reference' => ' 9253e38ea8ac62aaf43c1b5d3cf42016c3d544ff',14 'pretty_version' => 'v2.1.0', 15 'version' => '2.1.0.0', 16 'reference' => 'a93f08d0336663bc2dfb37ae5157f73e7a1b5ce4', 17 17 'type' => 'wordpress-plugin', 18 18 'install_path' => __DIR__ . '/../../',
Note: See TracChangeset
for help on using the changeset viewer.