diff --git a/.env.example b/.env.example index 9132ff0..1bfd8bc 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,11 @@ EXPOSE_HOST=multisafepay.io EXPOSE_TOKEN= APP_SUBDOMAIN=cscart-xxx +MYSQL_TABLE_PREFIX=cscart_ MYSQL_DATABASE=cscart MYSQL_USER=cscart MYSQL_PASSWORD=cscart +CSCART_VERSION=4.x.x.x +CSCART_LICENSE_KEY=YOUR_LICENSE_KEY +CSCART_ADMIN_EMAIL=admin@example.com +CSCART_ADMIN_PASSWORD=admin diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 56d79a3..62ac5ec 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,12 +1,12 @@ on: push: tags: - - '*' # Push events to matching v*, i.e. v1.0, v20.15.10 + - '*' name: Upload Release Asset jobs: build: - name: Upload Release Asset # Name of the job - runs-on: ubuntu-latest # or windows-latest, macOS-latest + name: Upload Release Asset + runs-on: ubuntu-latest steps: - name: Setup PHP Action uses: shivammathur/setup-php@v2 @@ -14,19 +14,28 @@ jobs: php-version: '7.2' - name: Get the version id: get_version - run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//} # Extract the version number from the tag + run: echo "VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV - name: Checkout code - uses: actions/checkout@v2 # Checkout the code + uses: actions/checkout@v2 - name: Build project - run: ./bin/release.sh ${{ steps.get_version.outputs.VERSION }} # Build the project + run: ./bin/release.sh ${{ steps.get_version.outputs.VERSION }} + - name: Create Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ steps.get_version.outputs.VERSION }} + release_name: Release ${{ steps.get_version.outputs.VERSION }} + draft: true + prerelease: false - name: Upload Release Asset - run: | - set -x - assets=() - for asset in ./.dist/*.zip; do - assets+=("-a" "$asset") - done - tag_name="${GITHUB_REF##*/}" - hub release create "${assets[@]}" -m "Release $tag_name" "$tag_name" -d + id: upload-release-asset + uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ./.dist/Plugin_CS-Cart_${{ steps.get_version.outputs.VERSION }}.zip + asset_name: Plugin_CS-Cart_${{ steps.get_version.outputs.VERSION }}.zip + asset_content_type: application/zip \ No newline at end of file diff --git a/.gitignore b/.gitignore index a195fd3..1827754 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,9 @@ .DS_Store +.dist .env -/.idea -/cscart -.dist \ No newline at end of file +.idea +/application +/cscart/* +!/cscart/.gitkeep +/source/* +!/source/.gitkeep diff --git a/Dockerfile b/Dockerfile index 9571750..ca42342 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,22 +1,24 @@ -FROM php:7.3-apache +FROM php:8.1-apache RUN apt-get update && apt-get upgrade -y ARG DEBIAN_FRONTEND=noninteractive ENV TZ=Europe/Amsterdam -RUN apt-get install -y software-properties-common git curl zip mariadb-client libicu-dev libxml2-dev libxslt-dev libfreetype6-dev libjpeg-dev libpng-dev libzip-dev libcurl3-dev +RUN apt-get install -y software-properties-common git curl zip mariadb-client libicu-dev libxml2-dev libxslt-dev libfreetype6-dev libjpeg-dev libpng-dev libzip-dev libcurl3-dev libonig-dev openssl nano # set up mailhog connection -RUN debconf-set-selections << "postfix postfix/main_mailer_type string 'Internet Site'" +RUN echo "postfix postfix/main_mailer_type string 'Internet Site'" | debconf-set-selections RUN apt-get install --assume-yes postfix RUN sed -i -E "s/( *relayhost *= *).*/\1[mail]:1025/g" /etc/postfix/main.cf RUN pecl install xdebug-3.1.0 && docker-php-ext-enable xdebug RUN { \ - echo 'xdebug.mode=debug'; \ - echo 'xdebug.start_with_request=trigger'; \ - echo 'xdebug.client_host=host.docker.internal'; \ - echo 'xdebug.idekey=PHPSTORM'; \ - } | tee -a "/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini" + echo 'xdebug.mode=debug'; \ + echo 'xdebug.start_with_request=trigger'; \ + echo 'xdebug.client_host=host.docker.internal'; \ + echo 'xdebug.idekey=PHPSTORM'; \ + echo 'discover_client_host=1'; \ + echo 'xdebug.client_port=9003'; \ + } | tee -a "/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini" RUN rm -rf /var/www/html #install CS Cart dependencies @@ -28,26 +30,28 @@ RUN apt-get update && apt-get install -y \ RUN curl https://raw.githubusercontent.com/colinmollenhour/modman/master/modman --silent --output /usr/local/bin/modman && chmod +x /usr/local/bin/modman RUN { \ - echo ''; \ - echo '\tSetHandler application/x-httpd-php'; \ - echo ''; \ - echo; \ - echo 'DirectoryIndex disabled'; \ - echo 'DirectoryIndex index.php index.html'; \ - echo; \ - echo ''; \ - echo '\tOptions +Indexes +FollowSymLinks'; \ - echo '\tAllowOverride All'; \ - echo '\tRequire all granted'; \ - echo '\tOrder allow,deny'; \ - echo '\tAllow from all'; \ - echo '\tSetEnvIf X-Forwarded-Proto https HTTPS=on'; \ - echo '\tSetEnvIf X-Forwarded-Host ^(.+) HTTP_X_FORWARDED_HOST=$1'; \ - echo '\tRequestHeader set Host %{HTTP_X_FORWARDED_HOST}e env=HTTP_X_FORWARDED_HOST'; \ - echo ''; \ - } | tee "/etc/apache2/conf-available/docker-php.conf" \ - && a2enconf docker-php && a2enmod headers && a2enmod rewrite + echo ''; \ + echo '\tSetHandler application/x-httpd-php'; \ + echo ''; \ + echo; \ + echo 'DirectoryIndex disabled'; \ + echo 'DirectoryIndex index.php index.html'; \ + echo; \ + echo ''; \ + echo '\tOptions +Indexes +FollowSymLinks'; \ + echo '\tAllowOverride All'; \ + echo '\tRequire all granted'; \ + echo '\tOrder allow,deny'; \ + echo '\tAllow from all'; \ + echo '\tSetEnvIf X-Forwarded-Proto https HTTPS=on'; \ + echo '\tSetEnvIf X-Forwarded-Host ^(.+) HTTP_X_FORWARDED_HOST=$1'; \ + echo '\tRequestHeader set Host %{HTTP_X_FORWARDED_HOST}e env=HTTP_X_FORWARDED_HOST'; \ + echo ''; \ + } | tee "/etc/apache2/conf-available/docker-php.conf" \ + && a2enconf docker-php && a2enmod headers && a2enmod rewrite RUN chown -R www-data:www-data /var/www/ +EXPOSE 9003 + USER www-data diff --git a/Makefile b/Makefile index b85576f..cd8c8af 100644 --- a/Makefile +++ b/Makefile @@ -1,30 +1,80 @@ include .env export +# Escape "@" in the admin email to avoid issues with sed +CSCART_ESCAPED_ADMIN_EMAIL = $(subst @,\@,${CSCART_ADMIN_EMAIL}) + +# Escape "/" and "&" as they have a special meaning in sed and can be part of the password +CSCART_ESCAPED_ADMIN_PASSWORD = $(shell echo "${CSCART_ADMIN_PASSWORD}" | sed 's/[\/&]/\\&/g') + +# Generate the secret key using openssl and base64, and escape special characters for later usage with sed +CSCART_SECRET_KEY := $(shell openssl rand -base64 32 | sed -e 's/[+/=]/\\&/g') + .PHONY: install -install: install-cscart install-multisafepay +install: validate-email deploy-cscart run-cscart-installer install-multisafepay + +.PHONY: validate-email +validate-email: + @# NOTE: Character "@" suppresses the output of the command or line + @if ! echo "${CSCART_ADMIN_EMAIL}" | grep -E '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$$' > /dev/null; then \ + echo "\nInvalid email address: ${CSCART_ADMIN_EMAIL}.\n\nExiting the script.\n"; \ + exit 1; \ + fi + +.PHONY: check-folder-empty +check-folder-empty: + @echo "Please enter your superuser credentials to allow deletion of necessary files and folders in the './cscart' directory:" + @# Delete all files in cscart directory (except the root .gitkeep and .modman folder and its content). + @# This deletion avoid conflicts with other previous installations, including different CS-Cart versions + @sudo -k find ./cscart -mindepth 1 ! -path './cscart/.gitkeep' ! -path './cscart/.modman/multisafepay' -delete + @# Check if the folder contains other than .gitkeep file and -modman folder (including its content) + @if [ $$(find ./cscart -mindepth 1 -maxdepth 1 ! -path './cscart/.modman' ! -path './cscart/.modman/*' | wc -l) -ne 1 ]; then \ + echo "\nNot all files in the './cscart' folder were removed.\n\nPlease manually delete its contents, except for the root '.gitkeep' file and the '.modman' folder.\n"; \ + exit 1; \ + fi -.PHONY: install-cscart -install-cscart: download-cscart run-cscart-installer install-multisafepay +.PHONY: deploy-cscart +deploy-cscart: check-folder-empty + @# Decompress the CS-Cart archive to the cscart directory + unzip -o ./source/cscart_v${CSCART_VERSION}.zip -d ./cscart .PHONY: run-cscart-installer run-cscart-installer: + docker-compose exec app curl -o /tmp/wait-for-it.sh https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh + docker-compose exec app chmod +x /tmp/wait-for-it.sh + docker-compose exec app /tmp/wait-for-it.sh db:3306 --timeout=30 + docker-compose exec app sed -i 's/CART-1111-1111-1111-1111/${CSCART_LICENSE_KEY}/' install/config.php + @# In the first segment of the sed command, the "@" in the email doesn’t need escaping since it’s a literal string, not a variable + docker-compose exec app sed -i 's/admin@example.com/${CSCART_ESCAPED_ADMIN_EMAIL}/' install/config.php + docker-compose exec app sed -i 's/admin/${CSCART_ESCAPED_ADMIN_PASSWORD}/' install/config.php + docker-compose exec app sed -i 's/YOURVERYSECRETCEY/${CSCART_SECRET_KEY}/' install/config.php + @# Delete in the config file non existing languages: "bg" and "sl" + docker-compose exec app sed -i "s/'bg', 'no', 'sl'/'no'/" install/config.php docker-compose exec app sed -i 's/localhost/db:3306/' install/config.php docker-compose exec app sed -i 's/%DB_NAME%/${MYSQL_DATABASE}/' install/config.php docker-compose exec app sed -i 's/%DB_USER%/${MYSQL_USER}/' install/config.php docker-compose exec app sed -i 's/%DB_PASS%/${MYSQL_PASSWORD}/' install/config.php docker-compose exec app sed -i 's/%HTTP_HOST%/https:\/\/${APP_SUBDOMAIN}.${EXPOSE_HOST}/' install/config.php docker-compose exec app /bin/sh -c 'cd install && php index.php' - docker-compose exec app mysql -hdb -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_DATABASE} -e "UPDATE cscart_settings_objects SET value = 'Y' WHERE name = 'secure_admin' OR name = 'secure_storefront'" - -.PHONY: download-cscart -download-cscart: - docker-compose exec app curl -L "https://www.cs-cart.com/index.php?dispatch=pages.get_trial&page_id=297&edition=ultimate" -o cscart.zip -s - docker-compose exec app unzip -o -q cscart.zip + docker-compose exec app mysql -h db -u ${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_DATABASE} -e "UPDATE ${MYSQL_TABLE_PREFIX}settings_objects SET value = 'Y' WHERE name = 'secure_admin' OR name = 'secure_storefront'" + docker-compose exec app rm /tmp/wait-for-it.sh .PHONY: install-multisafepay -install-multisafepay: - docker-compose exec app php msp_installer.php +install-multisafepay: msp-installer modman-deploy + @# - ignore the error if the command fails + @# || true ensures that the command returns a successful exit code due + @# to the errors that chown throws when pass through .git folder + @-docker-compose exec app chown -R www-data:www-data /var/www/ > /dev/null 2>&1 || true + +.PHONY: msp-installer +msp-installer: + docker cp ./src/msp_installer.php $$(docker-compose ps -q app):/var/www/html/msp_installer.php + docker-compose exec app chmod +x /var/www/html/msp_installer.php + @docker-compose exec app php /var/www/html/msp_installer.php || (echo "msp_installer.php failed" && exit 1) + +.PHONY: modman-deploy +modman-deploy: + docker-compose exec app modman deploy-all .PHONY: modman modman: @@ -33,4 +83,3 @@ modman: .PHONY: modman-copy modman-copy: docker-compose exec app modman deploy multisafepay --copy --force --quiet - diff --git a/cscart/.gitkeep b/cscart/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/docker-compose.yml b/docker-compose.yml index 4817ee1..a3641a0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,36 +1,44 @@ -version: '3.3' - services: app: depends_on: - db - mail - build: . + build: + context: . sysctls: - net.ipv4.ip_unprivileged_port_start=0 volumes: - ./:/var/www/html/.modman/multisafepay - - ./msp_installer.php:/var/www/html/msp_installer.php - ./cscart:/var/www/html/ environment: PHP_IDE_CONFIG: "serverName=app" db: - image: 'mysql:5.7' + image: "mysql:5.7" + platform: linux/x86_64 command: --default-authentication-plugin=mysql_native_password - # restart: always environment: MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} mail: - image: 'mailhog/mailhog' + image: "mailhog/mailhog" + platform: linux/x86_64 ports: - - 8025:8025 + - "8025:8025" + adminer: + image: adminer:latest + platform: linux/arm64/v8 + ports: + - "8080:8080" + depends_on: + - db + links: + - db expose: depends_on: - app build: https://github.com/beyondcode/expose.git entrypoint: ["/bin/sh", "-c" , "/src/expose token ${EXPOSE_TOKEN} && sed -i -E \"s/'dns'\\s?=>\\s?'.*'/'dns' => true/g\" /root/.expose/config.php && /src/expose share app --server-host=${EXPOSE_HOST} --subdomain=${APP_SUBDOMAIN}"] ports: - - 4040:4040 + - "4040:4040" diff --git a/modman b/modman index 89c0e2e..84203c1 100644 --- a/modman +++ b/modman @@ -1,9 +1,5 @@ src/app/addons/multisafepay app/addons/multisafepay -src/app/lib/other/templater/plugins/block.msp_issuers.php app/lib/other/templater/plugins/block.msp_issuers.php -src/app/lib/other/smarty/plugins/block.msp_issuers.php app/lib/other/smarty/plugins/block.msp_issuers.php -src/app/lib/vendor/smarty/smarty/libs/plugins/block.msp_issuers.php app/lib/vendor/smarty/smarty/libs/plugins/block.msp_issuers.php - src/app/payments/multisafepay/multisafepay_fastcheckout.functions.php app/payments/multisafepay/multisafepay_fastcheckout.functions.php src/app/payments/MultiSafepay.combined.php app/payments/MultiSafepay.combined.php src/app/payments/multisafepay.php app/payments/multisafepay.php @@ -30,7 +26,7 @@ src/app/payments/multisafepay_kbc.php app/payments/multisafepay_kbc.php src/app/payments/multisafepay_klarna.php app/payments/multisafepay_klarna.php src/app/payments/multisafepay_maestro.php app/payments/multisafepay_maestro.php src/app/payments/multisafepay_mastercard.php app/payments/multisafepay_mastercard.php -src/app/payments/multisafepay_payafter.php app/payments/multisafepay_payafter.php +src/app/payments/multisafepay_bnpl_mf.php app/payments/multisafepay_bnpl_mf.php src/app/payments/multisafepay_paypal.php app/payments/multisafepay_paypal.php src/app/payments/multisafepay_paysafecard.php app/payments/multisafepay_paysafecard.php src/app/payments/multisafepay_santander.php app/payments/multisafepay_santander.php @@ -61,7 +57,7 @@ src/design/backend/templates/views/orders/components/payments/msp_kbc.tpl design src/design/backend/templates/views/orders/components/payments/msp_klarna.tpl design/backend/templates/views/orders/components/payments/msp_klarna.tpl src/design/backend/templates/views/orders/components/payments/msp_maestro.tpl design/backend/templates/views/orders/components/payments/msp_maestro.tpl src/design/backend/templates/views/orders/components/payments/msp_mastercard.tpl design/backend/templates/views/orders/components/payments/msp_mastercard.tpl -src/design/backend/templates/views/orders/components/payments/msp_payafter.tpl design/backend/templates/views/orders/components/payments/msp_payafter.tpl +src/design/backend/templates/views/orders/components/payments/msp_bnpl_mf.tpl design/backend/templates/views/orders/components/payments/msp_bnpl_mf.tpl src/design/backend/templates/views/orders/components/payments/msp_paypal.tpl design/backend/templates/views/orders/components/payments/msp_paypal.tpl src/design/backend/templates/views/orders/components/payments/msp_paysafecard.tpl design/backend/templates/views/orders/components/payments/msp_paysafecard.tpl src/design/backend/templates/views/orders/components/payments/msp_santander.tpl design/backend/templates/views/orders/components/payments/msp_santander.tpl @@ -81,7 +77,7 @@ src/design/backend/templates/views/payments/components/cc_processors/msp_visa.tp src/design/backend/templates/views/payments/components/cc_processors/msp_klarna.tpl design/backend/templates/views/payments/components/cc_processors/msp_klarna.tpl src/design/backend/templates/views/payments/components/cc_processors/msp_cbc.tpl design/backend/templates/views/payments/components/cc_processors/msp_cbc.tpl src/design/backend/templates/views/payments/components/cc_processors/msp_trustpay.tpl design/backend/templates/views/payments/components/cc_processors/msp_trustpay.tpl -src/design/backend/templates/views/payments/components/cc_processors/msp_payafter.tpl design/backend/templates/views/payments/components/cc_processors/msp_payafter.tpl +src/design/backend/templates/views/payments/components/cc_processors/msp_bnpl_mf.tpl design/backend/templates/views/payments/components/cc_processors/msp_bnpl_mf.tpl src/design/backend/templates/views/payments/components/cc_processors/msp_einvoice.tpl design/backend/templates/views/payments/components/cc_processors/msp_einvoice.tpl src/design/backend/templates/views/payments/components/cc_processors/msp_amex.tpl design/backend/templates/views/payments/components/cc_processors/msp_amex.tpl src/design/backend/templates/views/payments/components/cc_processors/msp_santander.tpl design/backend/templates/views/payments/components/cc_processors/msp_santander.tpl @@ -124,7 +120,7 @@ src/design/themes/basic/templates/views/orders/components/payments/msp_kbc.tpl d src/design/themes/basic/templates/views/orders/components/payments/msp_klarna.tpl design/themes/basic/templates/views/orders/components/payments/msp_klarna.tpl src/design/themes/basic/templates/views/orders/components/payments/msp_maestro.tpl design/themes/basic/templates/views/orders/components/payments/msp_maestro.tpl src/design/themes/basic/templates/views/orders/components/payments/msp_mastercard.tpl design/themes/basic/templates/views/orders/components/payments/msp_mastercard.tpl -src/design/themes/basic/templates/views/orders/components/payments/msp_payafter.tpl design/themes/basic/templates/views/orders/components/payments/msp_payafter.tpl +src/design/themes/basic/templates/views/orders/components/payments/msp_bnpl_mf.tpl design/themes/basic/templates/views/orders/components/payments/msp_bnpl_mf.tpl src/design/themes/basic/templates/views/orders/components/payments/msp_paypal.tpl design/themes/basic/templates/views/orders/components/payments/msp_paypal.tpl src/design/themes/basic/templates/views/orders/components/payments/msp_paysafecard.tpl design/themes/basic/templates/views/orders/components/payments/msp_paysafecard.tpl src/design/themes/basic/templates/views/orders/components/payments/msp_santander.tpl design/themes/basic/templates/views/orders/components/payments/msp_santander.tpl @@ -141,7 +137,7 @@ src/design/themes/responsive/templates/views/orders/components/payments/msp_sant src/design/themes/responsive/templates/views/orders/components/payments/msp_paysafecard.tpl design/themes/responsive/templates/views/orders/components/payments/msp_paysafecard.tpl src/design/themes/responsive/templates/views/orders/components/payments/msp_wallet.tpl design/themes/responsive/templates/views/orders/components/payments/msp_wallet.tpl src/design/themes/responsive/templates/views/orders/components/payments/msp_trustpay.tpl design/themes/responsive/templates/views/orders/components/payments/msp_trustpay.tpl -src/design/themes/responsive/templates/views/orders/components/payments/msp_payafter.tpl design/themes/responsive/templates/views/orders/components/payments/msp_payafter.tpl +src/design/themes/responsive/templates/views/orders/components/payments/msp_bnpl_mf.tpl design/themes/responsive/templates/views/orders/components/payments/msp_bnpl_mf.tpl src/design/themes/responsive/templates/views/orders/components/payments/msp_idealqr.tpl design/themes/responsive/templates/views/orders/components/payments/msp_idealqr.tpl src/design/themes/responsive/templates/views/orders/components/payments/msp_cbc.tpl design/themes/responsive/templates/views/orders/components/payments/msp_cbc.tpl src/design/themes/responsive/templates/views/orders/components/payments/msp_alipay.tpl design/themes/responsive/templates/views/orders/components/payments/msp_alipay.tpl diff --git a/source/.gitkeep b/source/.gitkeep new file mode 100644 index 0000000..e69de29