diff --git a/.phpcs.xml.dist b/.phpcs.xml.dist new file mode 100644 index 00000000..df58068d --- /dev/null +++ b/.phpcs.xml.dist @@ -0,0 +1,47 @@ + + + Generally-applicable sniffs for WordPress plugins. + + + . + /vendor/ + /node_modules/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..e732d4c5 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,71 @@ +sudo: false +dist: trusty + +language: php + +notifications: + email: + on_success: never + on_failure: change + +branches: + only: + - master + +cache: + directories: + - $HOME/.composer/cache + +matrix: + include: + - php: 7.4 + env: WP_VERSION=latest + - php: 7.3 + env: WP_VERSION=latest + - php: 7.2 + env: WP_VERSION=latest + - php: 7.1 + env: WP_VERSION=latest + - php: 7.0 + env: WP_VERSION=latest + - php: 5.6 + env: WP_VERSION=5.3 + - php: 5.6 + env: WP_VERSION=latest + - php: 5.6 + env: WP_VERSION=trunk + - php: 5.6 + env: WP_TRAVISCI=phpcs + +before_script: + - export PATH="$HOME/.composer/vendor/bin:$PATH" + - | + if [ -f ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/xdebug.ini ]; then + phpenv config-rm xdebug.ini + else + echo "xdebug.ini does not exist" + fi + - | + if [[ ! -z "$WP_VERSION" ]] ; then + bash bin/install-wp-tests.sh wordpress_test root '' localhost $WP_VERSION + composer global require "phpunit/phpunit=4.8.*|5.7.*" + fi + - | + if [[ "$WP_TRAVISCI" == "phpcs" ]] ; then + composer global require wp-coding-standards/wpcs + composer global require phpcompatibility/php-compatibility + composer global require phpcompatibility/phpcompatibility-paragonie + composer global require phpcompatibility/phpcompatibility-wp + phpcs --config-set installed_paths $HOME/.composer/vendor/wp-coding-standards/wpcs,$HOME/.composer/vendor/phpcompatibility/php-compatibility,$HOME/.composer/vendor/phpcompatibility/phpcompatibility-paragonie,$HOME/.composer/vendor/phpcompatibility/phpcompatibility-wp + fi + +script: + - | + if [[ ! -z "$WP_VERSION" ]] ; then + phpunit + WP_MULTISITE=1 phpunit + fi + - | + if [[ "$WP_TRAVISCI" == "phpcs" ]] ; then + phpcs + fi diff --git a/bin/install-wp-tests.sh b/bin/install-wp-tests.sh new file mode 100755 index 00000000..c6f53dc5 --- /dev/null +++ b/bin/install-wp-tests.sh @@ -0,0 +1,181 @@ +#!/usr/bin/env bash + +if [ $# -lt 3 ]; then + echo "usage: $0 [db-host] [wp-version] [skip-database-creation]" + exit 1 +fi + +DB_NAME=$1 +DB_USER=$2 +DB_PASS=$3 +DB_HOST=${4-localhost} +WP_VERSION=${5-latest} +SKIP_DB_CREATE=${6-false} + +TMPDIR=${TMPDIR-/tmp} +TMPDIR=$(echo $TMPDIR | sed -e "s/\/$//") +WP_TESTS_DIR=${WP_TESTS_DIR-$TMPDIR/wordpress-tests-lib} +WP_CORE_DIR=${WP_CORE_DIR-$TMPDIR/wordpress} + +download() { + if [ `which curl` ]; then + curl -s "$1" > "$2"; + elif [ `which wget` ]; then + wget -nv -O "$2" "$1" + fi +} + +if [[ $WP_VERSION =~ ^[0-9]+\.[0-9]+\-(beta|RC)[0-9]+$ ]]; then + WP_BRANCH=${WP_VERSION%\-*} + WP_TESTS_TAG="branches/$WP_BRANCH" + +elif [[ $WP_VERSION =~ ^[0-9]+\.[0-9]+$ ]]; then + WP_TESTS_TAG="branches/$WP_VERSION" +elif [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0-9]+ ]]; then + if [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0] ]]; then + # version x.x.0 means the first release of the major version, so strip off the .0 and download version x.x + WP_TESTS_TAG="tags/${WP_VERSION%??}" + else + WP_TESTS_TAG="tags/$WP_VERSION" + fi +elif [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then + WP_TESTS_TAG="trunk" +else + # http serves a single offer, whereas https serves multiple. we only want one + download http://api.wordpress.org/core/version-check/1.7/ /tmp/wp-latest.json + grep '[0-9]+\.[0-9]+(\.[0-9]+)?' /tmp/wp-latest.json + LATEST_VERSION=$(grep -o '"version":"[^"]*' /tmp/wp-latest.json | sed 's/"version":"//') + if [[ -z "$LATEST_VERSION" ]]; then + echo "Latest WordPress version could not be found" + exit 1 + fi + WP_TESTS_TAG="tags/$LATEST_VERSION" +fi +set -ex + +install_wp() { + + if [ -d $WP_CORE_DIR ]; then + return; + fi + + mkdir -p $WP_CORE_DIR + + if [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then + mkdir -p $TMPDIR/wordpress-trunk + rm -rf $TMPDIR/wordpress-trunk/* + svn export --quiet https://core.svn.wordpress.org/trunk $TMPDIR/wordpress-trunk/wordpress + mv $TMPDIR/wordpress-trunk/wordpress/* $WP_CORE_DIR + else + if [ $WP_VERSION == 'latest' ]; then + local ARCHIVE_NAME='latest' + elif [[ $WP_VERSION =~ [0-9]+\.[0-9]+ ]]; then + # https serves multiple offers, whereas http serves single. + download https://api.wordpress.org/core/version-check/1.7/ $TMPDIR/wp-latest.json + if [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0] ]]; then + # version x.x.0 means the first release of the major version, so strip off the .0 and download version x.x + LATEST_VERSION=${WP_VERSION%??} + else + # otherwise, scan the releases and get the most up to date minor version of the major release + local VERSION_ESCAPED=`echo $WP_VERSION | sed 's/\./\\\\./g'` + LATEST_VERSION=$(grep -o '"version":"'$VERSION_ESCAPED'[^"]*' $TMPDIR/wp-latest.json | sed 's/"version":"//' | head -1) + fi + if [[ -z "$LATEST_VERSION" ]]; then + local ARCHIVE_NAME="wordpress-$WP_VERSION" + else + local ARCHIVE_NAME="wordpress-$LATEST_VERSION" + fi + else + local ARCHIVE_NAME="wordpress-$WP_VERSION" + fi + download https://wordpress.org/${ARCHIVE_NAME}.tar.gz $TMPDIR/wordpress.tar.gz + tar --strip-components=1 -zxmf $TMPDIR/wordpress.tar.gz -C $WP_CORE_DIR + fi + + download https://raw.githubusercontent.com/markoheijnen/wp-mysqli/master/db.php $WP_CORE_DIR/wp-content/db.php +} + +install_test_suite() { + # portable in-place argument for both GNU sed and Mac OSX sed + if [[ $(uname -s) == 'Darwin' ]]; then + local ioption='-i.bak' + else + local ioption='-i' + fi + + # set up testing suite if it doesn't yet exist + if [ ! -d $WP_TESTS_DIR ]; then + # set up testing suite + mkdir -p $WP_TESTS_DIR + rm -rf $WP_TESTS_DIR/{includes,data} + svn export --quiet --ignore-externals https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/includes/ $WP_TESTS_DIR/includes + svn export --quiet --ignore-externals https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/data/ $WP_TESTS_DIR/data + fi + + if [ ! -f wp-tests-config.php ]; then + download https://develop.svn.wordpress.org/${WP_TESTS_TAG}/wp-tests-config-sample.php "$WP_TESTS_DIR"/wp-tests-config.php + # remove all forward slashes in the end + WP_CORE_DIR=$(echo $WP_CORE_DIR | sed "s:/\+$::") + sed $ioption "s:dirname( __FILE__ ) . '/src/':'$WP_CORE_DIR/':" "$WP_TESTS_DIR"/wp-tests-config.php + sed $ioption "s:__DIR__ . '/src/':'$WP_CORE_DIR/':" "$WP_TESTS_DIR"/wp-tests-config.php + sed $ioption "s/youremptytestdbnamehere/$DB_NAME/" "$WP_TESTS_DIR"/wp-tests-config.php + sed $ioption "s/yourusernamehere/$DB_USER/" "$WP_TESTS_DIR"/wp-tests-config.php + sed $ioption "s/yourpasswordhere/$DB_PASS/" "$WP_TESTS_DIR"/wp-tests-config.php + sed $ioption "s|localhost|${DB_HOST}|" "$WP_TESTS_DIR"/wp-tests-config.php + fi + +} + +recreate_db() { + shopt -s nocasematch + if [[ $1 =~ ^(y|yes)$ ]] + then + mysqladmin drop $DB_NAME -f --user="$DB_USER" --password="$DB_PASS"$EXTRA + create_db + echo "Recreated the database ($DB_NAME)." + else + echo "Leaving the existing database ($DB_NAME) in place." + fi + shopt -u nocasematch +} + +create_db() { + mysqladmin create $DB_NAME --user="$DB_USER" --password="$DB_PASS"$EXTRA +} + +install_db() { + + if [ ${SKIP_DB_CREATE} = "true" ]; then + return 0 + fi + + # parse DB_HOST for port or socket references + local PARTS=(${DB_HOST//\:/ }) + local DB_HOSTNAME=${PARTS[0]}; + local DB_SOCK_OR_PORT=${PARTS[1]}; + local EXTRA="" + + if ! [ -z $DB_HOSTNAME ] ; then + if [ $(echo $DB_SOCK_OR_PORT | grep -e '^[0-9]\{1,\}$') ]; then + EXTRA=" --host=$DB_HOSTNAME --port=$DB_SOCK_OR_PORT --protocol=tcp" + elif ! [ -z $DB_SOCK_OR_PORT ] ; then + EXTRA=" --socket=$DB_SOCK_OR_PORT" + elif ! [ -z $DB_HOSTNAME ] ; then + EXTRA=" --host=$DB_HOSTNAME --protocol=tcp" + fi + fi + + # create database + if [ $(mysql --user="$DB_USER" --password="$DB_PASS"$EXTRA --execute='show databases;' | grep ^$DB_NAME$) ] + then + echo "Reinstalling will delete the existing test database ($DB_NAME)" + read -p 'Are you sure you want to proceed? [y/N]: ' DELETE_EXISTING_DB + recreate_db $DELETE_EXISTING_DB + else + create_db + fi +} + +install_wp +install_test_suite +install_db diff --git a/composer.json b/composer.json index af29d295..9d87c0a3 100644 --- a/composer.json +++ b/composer.json @@ -6,8 +6,34 @@ "homepage": "https://www.lengow.com", "license": "GPLv3", "type": "wordpress-plugin", + "repositories": [ + { + "type": "path", + "url": "~/vhosts/api-php-sdk" + } + ], "require": { + "lengow/api-php-sdk": "dev-main", + "symfony/http-client": "^5.4", + "nyholm/psr7": "^1.8", "composer/installers": "*", - "php": ">=5.5" + "php": ">=7.4" + }, + "config": { + "allow-plugins": { + "php-http/discovery": true, + "composer/installers": true + } + }, + "require-dev": { + "phpunit/phpunit": "^9.6", + "guzzlehttp/guzzle": "^7.8", + "php-http/mock-client": "^1.6" + }, + "autoload-dev": { + "classmap": [ + "tests/integration/trait-mock-client.php", + "tests/integration/trait-fixtures.php" + ] } } diff --git a/includes/admin/class-lengow-admin-connection.php b/includes/admin/class-lengow-admin-connection.php index 2ac36632..f8bd25de 100644 --- a/includes/admin/class-lengow-admin-connection.php +++ b/includes/admin/class-lengow-admin-connection.php @@ -21,6 +21,9 @@ * @copyright 2017 Lengow SAS */ +use Lengow\Sdk\Client\AuthenticatorInterface; +use Lengow\Sdk\Client\Exception\HttpException; + if ( ! defined( 'ABSPATH' ) ) { exit; } @@ -85,7 +88,6 @@ public static function post_process() { } break; } - exit(); } } @@ -97,20 +99,35 @@ public static function post_process() { * * @return boolean */ - private static function check_api_credentials( $access_token, $secret ) { - $access_ids_saved = false; - $account_id = Lengow_Connector::get_account_id_by_credentials( $access_token, $secret ); - if ( $account_id ) { - $access_ids_saved = Lengow_Configuration::set_access_ids( + private static function check_api_credentials( string $access_token, string $secret ): bool { + try { + $access = Lengow::sdk()->access()->getToken( $access_token, $secret ); + if (Lengow_Configuration::set_access_ids( array( - Lengow_Configuration::ACCOUNT_ID => $account_id, + Lengow_Configuration::ACCOUNT_ID => $access->account_id, Lengow_Configuration::ACCESS_TOKEN => $access_token, Lengow_Configuration::SECRET => $secret, ) - ); + )) { + Lengow_Configuration::update_value( Lengow_Configuration::AUTHORIZATION_TOKEN, $access->token ); + Lengow_Configuration::update_value( Lengow_Configuration::AUTHORIZATION_TOKEN_EXPIRE_AT, time() + 3600 ); + Lengow::sdk()->getClient()->getAuthenticator()->setCredentials( $access_token, $secret ); + Lengow::sdk()->getClient()->getAuthenticator()->setToken( + $access->token, + time() + AuthenticatorInterface::TOKEN_LIFETIME, + $access->account_id + ); + + return true; + } + + Lengow_Main::log( 'Connector', 'Unable to save access IDs' ); + return false; + } catch ( HttpException $e ) { + Lengow_Main::get_log_instance()->log_exception( $e ); } - return $access_ids_saved; + return false; } /** @@ -122,13 +139,13 @@ private static function connect_cms() { $cms_token = Lengow_Main::get_token(); $cms_connected = Lengow_Sync::sync_catalog( true ); if ( ! $cms_connected ) { - $sync_data = wp_json_encode( Lengow_Sync::get_sync_data() ); - $result = Lengow_Connector::query_api( - Lengow_Connector::POST, - Lengow_Connector::API_CMS, - array(), - $sync_data - ); + $sync_data = Lengow_Sync::get_sync_data(); + try { + $result = Lengow::sdk()->cms()->post( $sync_data ); + } catch ( HttpException $e ) { + Lengow_Main::get_log_instance()->log_exception( $e ); + } + if ( isset( $result->common_account ) ) { $cms_connected = true; $message_key = 'log.connection.cms_creation_success'; diff --git a/includes/admin/class-lengow-admin-dashboard.php b/includes/admin/class-lengow-admin-dashboard.php index 1a3a49a7..3c955050 100755 --- a/includes/admin/class-lengow-admin-dashboard.php +++ b/includes/admin/class-lengow-admin-dashboard.php @@ -36,7 +36,8 @@ class Lengow_Admin_Dashboard { public static function display() { $locale = new Lengow_Translation(); $merchant_status = Lengow_Sync::get_status_account(); - if ( 'free_trial' === $merchant_status['type'] && $merchant_status['expired'] ) { + // @TODO if $merchant_status is false ? + if ( false !== $merchant_status && 'free_trial' === $merchant_status['type'] && $merchant_status['expired'] ) { $refresh_status = admin_url( 'admin.php?action=dashboard_get_process&do_action=refresh_status' ); include_once 'views/dashboard/html-admin-status.php'; } else { diff --git a/includes/admin/class-lengow-admin-products.php b/includes/admin/class-lengow-admin-products.php index 5d23f837..e71e1807 100755 --- a/includes/admin/class-lengow-admin-products.php +++ b/includes/admin/class-lengow-admin-products.php @@ -357,7 +357,7 @@ public function search( $text, $input_id ) { echo wp_kses( '
', $allowed_html ); // the hidden element is needed to load the right page. echo wp_kses( '', $allowed_html ); - echo wp_kses( $this->search_box( $text, $input_id ), $allowed_html ); + $this->search_box( $text, $input_id ); echo wp_kses( '
', $allowed_html ); } diff --git a/includes/admin/views/dashboard/html-admin-dashboard.php b/includes/admin/views/dashboard/html-admin-dashboard.php index 2516842a..6eddc8db 100755 --- a/includes/admin/views/dashboard/html-admin-dashboard.php +++ b/includes/admin/views/dashboard/html-admin-dashboard.php @@ -22,7 +22,7 @@
t( 'menu.jump_to_lengow' ) ); ?> - +