From d483f4a01fd3d12f0d991fafce01a7cb39d0ee40 Mon Sep 17 00:00:00 2001 From: Mike Barnes Date: Mon, 5 Nov 2018 17:01:22 +1100 Subject: [PATCH 01/11] Expose S3 endpoint setting via config file To use non-AWS services like Google Cloud Storage or a custom provider via S3 compatibility, the endpoint needs to be configurable, and separated from the URL to allow Cloudflare etc proxy for SSL termination. eg for GCS in S3 mode with custom domain: AWS_ENDPOINT="https://storage.googleapis.com" AWS_URL="https://i.pitchfork.club" This is already supported via the driver, it just needs a config option to feed it in. https://laracasts.com/discuss/channels/laravel/custom-file-driver-digital-ocean-spaces?page=1 --- config/filesystems.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/config/filesystems.php b/config/filesystems.php index ab75dc28b..cc6157b23 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -56,12 +56,13 @@ return [ ], 's3' => [ - 'driver' => 's3', - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'region' => env('AWS_DEFAULT_REGION'), - 'bucket' => env('AWS_BUCKET'), - 'url' => env('AWS_URL'), + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + 'endpoint' => env('AWS_ENDPOINT'), ], ], From a5761f7ebffc06f6d6eec3397f11932c535784a7 Mon Sep 17 00:00:00 2001 From: kaiyou Date: Sun, 11 Nov 2018 18:03:35 +0100 Subject: [PATCH 02/11] Drop privileges when starting artisan or horizon --- contrib/docker/Dockerfile.apache | 2 +- contrib/docker/start.sh | 8 ++++---- docker-compose.yml | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/contrib/docker/Dockerfile.apache b/contrib/docker/Dockerfile.apache index 481db4647..1b59ce9d2 100644 --- a/contrib/docker/Dockerfile.apache +++ b/contrib/docker/Dockerfile.apache @@ -4,7 +4,7 @@ ARG COMPOSER_VERSION="1.6.5" ARG COMPOSER_CHECKSUM="67bebe9df9866a795078bb2cf21798d8b0214f2e0b2fd81f2e907a8ef0be3434" RUN apt-get update \ - && apt-get install -y --no-install-recommends git \ + && apt-get install -y --no-install-recommends git gosu \ optipng pngquant jpegoptim gifsicle \ libfreetype6 libjpeg62-turbo libpng16-16 libxpm4 libvpx4 libmagickwand-6.q16-3 \ libfreetype6-dev libjpeg62-turbo-dev libpng-dev libxpm-dev libvpx-dev libmagickwand-dev \ diff --git a/contrib/docker/start.sh b/contrib/docker/start.sh index 1367b8635..6f99cb449 100755 --- a/contrib/docker/start.sh +++ b/contrib/docker/start.sh @@ -2,18 +2,18 @@ # Create the storage tree if needed and fix permissions cp -r storage.skel/* storage/ -chown -R www-data:www-data storage/ +chown -R www-data:www-data storage/ bootstrap/cache/ php artisan storage:link # Migrate database if the app was upgraded -php artisan migrate --force +gosu www-data:www-data php artisan migrate --force # Run other specific migratins if required -php artisan update +gosu www-data:www-data php artisan update # Run a worker if it is set as embedded if [ $HORIZON_EMBED = true ]; then - php artisan horizon & + gosu www-data:www-data php artisan horizon & fi # Finally run Apache diff --git a/docker-compose.yml b/docker-compose.yml index 4c6e8f6db..a010930a4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -38,7 +38,7 @@ services: # - "app-storage:/var/www/storage" # networks: # - internal - # command: php artisan horizon + # command: gosu www-data php artisan horizon db: image: mysql:5.7 From de6c95d2564acde52cda9a02a5e40a1669d5f585 Mon Sep 17 00:00:00 2001 From: Brad Koehn Date: Mon, 12 Nov 2018 13:21:27 -0600 Subject: [PATCH 03/11] fixed a bash scripting bug in start.sh that prevented horizon from ever starting --- contrib/docker/start.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/docker/start.sh b/contrib/docker/start.sh index 1367b8635..079f6be91 100755 --- a/contrib/docker/start.sh +++ b/contrib/docker/start.sh @@ -12,7 +12,7 @@ php artisan migrate --force php artisan update # Run a worker if it is set as embedded -if [ $HORIZON_EMBED = true ]; then +if [ "$HORIZON_EMBED" -eq "true" ]; then php artisan horizon & fi From 89a7ac9c37b0253d6f2bd75daf3c0cde39bbbc8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Santoro?= Date: Tue, 13 Nov 2018 19:12:45 +0000 Subject: [PATCH 04/11] Fix WebP support in Apache Docker image With PHP 7, WebP support is now provided by libwebp instead of libvpx. Reference: http://php.net/manual/en/image.installation.php Fixes #556. --- contrib/docker/Dockerfile.apache | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contrib/docker/Dockerfile.apache b/contrib/docker/Dockerfile.apache index 481db4647..024488aae 100644 --- a/contrib/docker/Dockerfile.apache +++ b/contrib/docker/Dockerfile.apache @@ -6,14 +6,14 @@ ARG COMPOSER_CHECKSUM="67bebe9df9866a795078bb2cf21798d8b0214f2e0b2fd81f2e907a8ef RUN apt-get update \ && apt-get install -y --no-install-recommends git \ optipng pngquant jpegoptim gifsicle \ - libfreetype6 libjpeg62-turbo libpng16-16 libxpm4 libvpx4 libmagickwand-6.q16-3 \ - libfreetype6-dev libjpeg62-turbo-dev libpng-dev libxpm-dev libvpx-dev libmagickwand-dev \ + libfreetype6 libjpeg62-turbo libpng16-16 libxpm4 libwebp6 libmagickwand-6.q16-3 \ + libfreetype6-dev libjpeg62-turbo-dev libpng-dev libxpm-dev libwebp-dev libmagickwand-dev \ && docker-php-source extract \ && docker-php-ext-configure gd \ --with-freetype-dir=/usr/lib/x86_64-linux-gnu/ \ --with-jpeg-dir=/usr/lib/x86_64-linux-gnu/ \ --with-xpm-dir=/usr/lib/x86_64-linux-gnu/ \ - --with-vpx-dir=/usr/lib/x86_64-linux-gnu/ \ + --with-webp-dir=/usr/lib/x86_64-linux-gnu/ \ && docker-php-ext-install pdo_mysql pcntl gd exif bcmath \ && pecl install imagick \ && docker-php-ext-enable imagick pcntl imagick gd exif \ From c554bcd84e6bf8078620bbc0ca83c19c9ec808a1 Mon Sep 17 00:00:00 2001 From: Brad Koehn Date: Wed, 14 Nov 2018 12:11:08 -0600 Subject: [PATCH 05/11] updated to use correct '=' operator by request --- contrib/docker/start.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/docker/start.sh b/contrib/docker/start.sh index 079f6be91..eed8a259a 100755 --- a/contrib/docker/start.sh +++ b/contrib/docker/start.sh @@ -12,7 +12,7 @@ php artisan migrate --force php artisan update # Run a worker if it is set as embedded -if [ "$HORIZON_EMBED" -eq "true" ]; then +if [ "$HORIZON_EMBED" = "true" ]; then php artisan horizon & fi From 3962706c30ca08ee9d80a6c6aaa7fa458a581830 Mon Sep 17 00:00:00 2001 From: ButterflyOfFire <42316180+BoFFire@users.noreply.github.com> Date: Mon, 19 Nov 2018 17:16:35 +0100 Subject: [PATCH 06/11] fix typo. --- resources/lang/fr/profile.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/fr/profile.php b/resources/lang/fr/profile.php index 4df0991be..b950b00fd 100644 --- a/resources/lang/fr/profile.php +++ b/resources/lang/fr/profile.php @@ -4,7 +4,7 @@ return [ 'emptyTimeline' => 'Cet·te utilisateur·rice n\'a pas encore de publications !', 'emptyFollowers' => 'Cet·te utilisateur·rice n`\'a pas encore d\'abonné·e·s !', 'emptyFollowing' => 'Cet·te utilisateur·rice ne suit personne pour le moment !', - 'emptySaved' => 'Vous n\'avez sauvegardé aucune publication pour le moment !' + 'emptySaved' => 'Vous n\'avez sauvegardé aucune publication pour le moment !', 'savedWarning' => 'Vous seul pouvez voir ce que vous avez enregistré', 'privateProfileWarning' => 'Ce compte est privé', 'alreadyFollow' => 'N\'êtes vous pas déjà abonné·e à :username ?', From 88a0b60ae46b35c4aa2468a789d51c7bb611470a Mon Sep 17 00:00:00 2001 From: Ben Lubar Date: Tue, 20 Nov 2018 10:51:24 -0600 Subject: [PATCH 07/11] Fix Dockerfile.fpm by replacing it with a modified copy of Dockerfile.apache. --- contrib/docker/Dockerfile.fpm | 83 ++++++++++++++++++++++++----------- 1 file changed, 58 insertions(+), 25 deletions(-) diff --git a/contrib/docker/Dockerfile.fpm b/contrib/docker/Dockerfile.fpm index c9ee294a0..6c7822ea0 100644 --- a/contrib/docker/Dockerfile.fpm +++ b/contrib/docker/Dockerfile.fpm @@ -1,31 +1,64 @@ -FROM php:7.2.6-fpm-alpine +FROM php:7-fpm ARG COMPOSER_VERSION="1.6.5" ARG COMPOSER_CHECKSUM="67bebe9df9866a795078bb2cf21798d8b0214f2e0b2fd81f2e907a8ef0be3434" -RUN apk add --no-cache --virtual .build build-base autoconf imagemagick-dev libtool && \ - apk --no-cache add imagemagick git && \ - docker-php-ext-install pdo_mysql pcntl && \ - pecl install imagick && \ - docker-php-ext-enable imagick pcntl imagick && \ - curl -LsS https://getcomposer.org/download/${COMPOSER_VERSION}/composer.phar -o /tmp/composer.phar && \ - echo "${COMPOSER_CHECKSUM} /tmp/composer.phar" | sha256sum -c - && \ - install -m0755 -o root -g root /tmp/composer.phar /usr/bin/composer.phar && \ - ln -sf /usr/bin/composer.phar /usr/bin/composer && \ - rm /tmp/composer.phar && \ - apk --no-cache del --purge .build +RUN apt-get update \ + && apt-get install -y --no-install-recommends git \ + optipng pngquant jpegoptim gifsicle \ + libfreetype6 libjpeg62-turbo libpng16-16 libxpm4 libvpx4 libmagickwand-6.q16-3 \ + libfreetype6-dev libjpeg62-turbo-dev libpng-dev libxpm-dev libvpx-dev libmagickwand-dev \ + && docker-php-source extract \ + && docker-php-ext-configure gd \ + --with-freetype-dir=/usr/lib/x86_64-linux-gnu/ \ + --with-jpeg-dir=/usr/lib/x86_64-linux-gnu/ \ + --with-xpm-dir=/usr/lib/x86_64-linux-gnu/ \ + --with-vpx-dir=/usr/lib/x86_64-linux-gnu/ \ + && docker-php-ext-install pdo_mysql pcntl gd exif bcmath \ + && pecl install imagick \ + && docker-php-ext-enable imagick pcntl imagick gd exif \ + && curl -LsS https://getcomposer.org/download/${COMPOSER_VERSION}/composer.phar -o /usr/bin/composer \ + && echo "${COMPOSER_CHECKSUM} /usr/bin/composer" | sha256sum -c - \ + && chmod 755 /usr/bin/composer \ + && apt-get autoremove --purge -y \ + libfreetype6-dev libjpeg62-turbo-dev libpng-dev libxpm-dev libvpx-dev libmagickwand-dev \ + && rm -rf /var/cache/apt \ + && docker-php-source delete -COPY . /var/www/html/ - -WORKDIR /var/www/html -RUN install -d -m0755 -o www-data -g www-data \ - /var/www/html/storage \ - /var/www/html/storage/framework \ - /var/www/html/storage/logs \ - /var/www/html/storage/framework/sessions \ - /var/www/html/storage/framework/views \ - /var/www/html/storage/framework/cache && \ - composer install --prefer-source --no-interaction - -VOLUME ["/var/www/html"] ENV PATH="~/.composer/vendor/bin:./vendor/bin:${PATH}" + +COPY . /var/www/ + +WORKDIR /var/www/ +RUN cp -r storage storage.skel \ + && cp contrib/docker/php.ini /usr/local/etc/php/conf.d/pixelfed.ini \ + && composer install --prefer-source --no-interaction \ + && rm -rf html && ln -s public html + +VOLUME ["/var/www/storage", "/var/www/public.ext"] + +ENV APP_ENV=production \ + APP_DEBUG=false \ + LOG_CHANNEL=stderr \ + DB_CONNECTION=mysql \ + DB_PORT=3306 \ + DB_HOST=db \ + BROADCAST_DRIVER=log \ + QUEUE_DRIVER=redis \ + HORIZON_PREFIX=horizon-pixelfed \ + REDIS_HOST=redis \ + SESSION_SECURE_COOKIE=true \ + API_BASE="/api/1/" \ + API_SEARCH="/api/search" \ + OPEN_REGISTRATION=true \ + ENFORCE_EMAIL_VERIFICATION=true \ + REMOTE_FOLLOW=false \ + ACTIVITY_PUB=false + +CMD cp -r storage.skel/* storage/ \ + && cp -r public/* public.ext/ \ + && chown -R www-data:www-data storage/ \ + && php artisan storage:link \ + && php artisan migrate --force \ + && php artisan update \ + && exec php-fpm From 2f305273effb7eaf0b8f143935c675566c68dc00 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Sun, 25 Nov 2018 14:33:55 -0700 Subject: [PATCH 08/11] Update timeline template --- resources/views/timeline/template.blade.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/views/timeline/template.blade.php b/resources/views/timeline/template.blade.php index 2317cadc4..a7db3e1f8 100644 --- a/resources/views/timeline/template.blade.php +++ b/resources/views/timeline/template.blade.php @@ -15,7 +15,7 @@
-
+
@if (session('status'))
{!! session('status') !!} @@ -72,7 +72,7 @@
-
+
{{Auth::user()->username}}'s avatar From 13a5b0e12dd2abf051241f1b4d959a9654fbce61 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Mon, 26 Nov 2018 12:33:56 -0700 Subject: [PATCH 09/11] Add WIP account delete job --- .../DeletePipeline/DeleteAccountPipeline.php | 165 ++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 app/Jobs/DeletePipeline/DeleteAccountPipeline.php diff --git a/app/Jobs/DeletePipeline/DeleteAccountPipeline.php b/app/Jobs/DeletePipeline/DeleteAccountPipeline.php new file mode 100644 index 000000000..fa2913142 --- /dev/null +++ b/app/Jobs/DeletePipeline/DeleteAccountPipeline.php @@ -0,0 +1,165 @@ +user = $user; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + $user = $this->user; + $this->deleteAccountLogs($user); + $this->deleteActivities($user); + $this->deleteAvatar($user); + $this->deleteBookmarks($user); + $this->deleteEmailVerification($user); + $this->deleteFollowRequests($user); + $this->deleteFollowers($user); + $this->deleteLikes($user); + $this->deleteMedia($user); + $this->deleteMentions($user); + $this->deleteNotifications($user); + + // todo send Delete to every known instance sharedInbox + } + + public function deleteAccountLogs($user) + { + AccountLog::chunk(200, function($logs) use ($user) { + foreach($logs as $log) { + if($log->user_id == $user->id) { + $log->delete(); + } + } + }); + } + + public function deleteActivities($user) + { + // todo after AP + } + + public function deleteAvatar($user) + { + $avatar = $user->profile->avatar; + + if(is_file($avatar->media_path)) { + unlink($avatar->media_path); + } + + if(is_file($avatar->thumb_path)) { + unlink($avatar->thumb_path); + } + + $avatar->delete(); + } + + public function deleteBookmarks($user) + { + Bookmark::whereProfileId($user->profile->id)->delete(); + } + + public function deleteEmailVerification($user) + { + EmailVerification::whereUserId($user->id)->delete(); + } + + public function deleteFollowRequests($user) + { + $id = $user->profile->id; + FollowRequest::whereFollowingId($id)->orWhere('follower_id', $id)->delete(); + } + + public function deleteFollowers($user) + { + $id = $user->profile->id; + Follower::whereProfileId($id)->orWhere('following_id', $id)->delete(); + } + + public function deleteLikes($user) + { + $id = $user->profile->id; + Like::whereProfileId($id)->delete(); + } + + public function deleteMedia($user) + { + $medias = Media::whereUserId($user->id)->get(); + foreach($medias as $media) { + $path = $media->media_path; + $thumb = $media->thumbnail_path; + if(is_file($path)) { + unlink($path); + } + if(is_file($thumb)) { + unlink($thumb); + } + $media->delete(); + } + } + + public function deleteMentions($user) + { + Mention::whereProfileId($user->profile->id)->delete(); + } + + public function deleteNotifications($user) + { + $id = $user->profile->id; + Notification::whereProfileId($id)->orWhere('actor_id', $id)->delete(); + } + + public function deleteProfile($user) {} + public function deleteReports($user) {} + public function deleteStatuses($user) {} + public function deleteUser($user) {} +} From ebd05897a613733bedd561a48c2159d6e30e992f Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Mon, 26 Nov 2018 20:20:37 -0700 Subject: [PATCH 10/11] Update composer.json, remove unused abandoned dep --- composer.json | 1 - 1 file changed, 1 deletion(-) diff --git a/composer.json b/composer.json index f7061357f..771855505 100644 --- a/composer.json +++ b/composer.json @@ -30,7 +30,6 @@ "predis/predis": "^1.1", "spatie/laravel-backup": "^5.0.0", "spatie/laravel-image-optimizer": "^1.1", - "spatie/laravel-partialcache": "^1.3", "stevebauman/purify": "2.0.*" }, "require-dev": { From 2d773ca537cdd291416565d8a3d7aac31defa240 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Mon, 26 Nov 2018 20:26:27 -0700 Subject: [PATCH 11/11] Fixes #406 --- app/Jobs/StatusPipeline/StatusEntityLexer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Jobs/StatusPipeline/StatusEntityLexer.php b/app/Jobs/StatusPipeline/StatusEntityLexer.php index 8aac4341f..7bf50adc3 100644 --- a/app/Jobs/StatusPipeline/StatusEntityLexer.php +++ b/app/Jobs/StatusPipeline/StatusEntityLexer.php @@ -82,7 +82,7 @@ class StatusEntityLexer implements ShouldQueue foreach ($tags as $tag) { DB::transaction(function () use ($status, $tag) { - $slug = str_slug($tag); + $slug = str_slug($tag, '-', false); $hashtag = Hashtag::firstOrCreate( ['name' => $tag, 'slug' => $slug] );