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) {} +} 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] ); 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": { 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'), ], ], diff --git a/contrib/docker/Dockerfile.apache b/contrib/docker/Dockerfile.apache index 481db4647..7f4b8742d 100644 --- a/contrib/docker/Dockerfile.apache +++ b/contrib/docker/Dockerfile.apache @@ -4,16 +4,16 @@ 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 \ + 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 \ 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 diff --git a/contrib/docker/start.sh b/contrib/docker/start.sh index 1367b8635..7bc26c0db 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 & +if [ "$HORIZON_EMBED" = "true" ]; then + 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 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 ?', 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 @@
-
+