diff --git a/.env.testing b/.env.testing index 16f147f88..f5d86bc4f 100644 --- a/.env.testing +++ b/.env.testing @@ -12,16 +12,16 @@ TRUST_PROXIES="*" LOG_CHANNEL=stack -DB_CONNECTION=mysql +DB_CONNECTION=sqlite DB_HOST=127.0.0.1 DB_PORT=3306 -DB_DATABASE= +DB_DATABASE='tests/database.sqlite' DB_USERNAME= DB_PASSWORD= BROADCAST_DRIVER=log -CACHE_DRIVER=redis -SESSION_DRIVER=redis +CACHE_DRIVER=array +SESSION_DRIVER=array SESSION_LIFETIME=120 QUEUE_DRIVER=redis diff --git a/.gitignore b/.gitignore index 82945e0a4..0494cee10 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,10 @@ npm-debug.log yarn-error.log .env .DS_Store +.bash_profile +.bash_history +.bashrc +.gitconfig +.git-credentials +/.composer/ +/nginx.conf diff --git a/app/Http/Controllers/Api/BaseApiController.php b/app/Http/Controllers/Api/BaseApiController.php index eb92a1806..681126ff6 100644 --- a/app/Http/Controllers/Api/BaseApiController.php +++ b/app/Http/Controllers/Api/BaseApiController.php @@ -213,19 +213,15 @@ class BaseApiController extends Controller $profile = $user->profile; if(config('pixelfed.enforce_account_limit') == true) { - $size = Media::whereUserId($user->id)->sum('size') / 1000; + $size = Cache::remember($user->storageUsedKey(), now()->addDays(3), function() use($user) { + return Media::whereUserId($user->id)->sum('size') / 1000; + }); $limit = (int) config('pixelfed.max_account_size'); if ($size >= $limit) { abort(403, 'Account size limit reached.'); } } - $recent = Media::whereProfileId($profile->id)->whereNull('status_id')->count(); - - if($recent > 50) { - abort(403); - } - $monthHash = hash('sha1', date('Y').date('m')); $userHash = hash('sha1', $user->id . (string) $user->created_at); diff --git a/app/Http/Controllers/ApiController.php b/app/Http/Controllers/ApiController.php index 6903b3d41..d71da8ce8 100644 --- a/app/Http/Controllers/ApiController.php +++ b/app/Http/Controllers/ApiController.php @@ -81,11 +81,13 @@ class ApiController extends BaseApiController public function composeLocationSearch(Request $request) { + abort_if(!Auth::check(), 403); $this->validate($request, [ 'q' => 'required|string' ]); - - $places = Place::where('name', 'like', '%' . $request->input('q') . '%') + $q = filter_var($request->input('q'), FILTER_SANITIZE_STRING); + $q = '%' . $q . '%'; + $places = Place::where('name', 'like', $q) ->take(25) ->get() ->map(function($r) { diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index efda66a45..713ffe63e 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -63,17 +63,17 @@ class RegisterController extends Controller 'unique:users', function ($attribute, $value, $fail) { if (!ctype_alpha($value[0])) { - return $fail($attribute.' is invalid. Username must be alpha-numeric and start with a letter.'); + return $fail('Username is invalid. Username must be alpha-numeric and start with a letter.'); } - $val = str_replace(['-', '_'], '', $value); + $val = str_replace(['_', '-', '.'], '', $value); if(!ctype_alnum($val)) { - return $fail($attribute . ' is invalid. Username must be alpha-numeric.'); + return $fail('Username is invalid. Username must be alpha-numeric and may contain dashes (-), periods (.) and underscores (_).'); } }, ]; $rules = [ - 'name' => 'required|string|max:'.config('pixelfed.max_name_length'), + 'name' => 'nullable|string|max:'.config('pixelfed.max_name_length'), 'username' => $usernameRules, 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:8|confirmed', diff --git a/app/Http/Controllers/DiscoverController.php b/app/Http/Controllers/DiscoverController.php index fb226c741..0024d22de 100644 --- a/app/Http/Controllers/DiscoverController.php +++ b/app/Http/Controllers/DiscoverController.php @@ -65,27 +65,6 @@ class DiscoverController extends Controller return view('discover.tags.category', compact('tag', 'posts')); } - public function showPersonal(Request $request) - { - abort_if(!Auth::check(), 403); - - $profile = Auth::user()->profile; - - $tags = Cache::remember('profile-'.$profile->id.':hashtags', now()->addMinutes(15), function() use ($profile){ - return $profile->hashtags()->groupBy('hashtag_id')->inRandomOrder()->take(8)->get(); - }); - $following = Cache::remember('profile:following:'.$profile->id, now()->addMinutes(60), function() use ($profile) { - $res = Follower::whereProfileId($profile->id)->pluck('following_id'); - return $res->push($profile->id)->toArray(); - }); - $posts = Cache::remember('profile-'.$profile->id.':hashtag-posts', now()->addMinutes(5), function() use ($profile, $following) { - $posts = Status::whereScope('public')->withCount(['likes','comments'])->whereNotIn('profile_id', $following)->whereHas('media')->whereType('photo')->orderByDesc('created_at')->take(39)->get(); - $posts->post_count = Status::whereScope('public')->whereNotIn('profile_id', $following)->whereHas('media')->whereType('photo')->count(); - return $posts; - }); - return view('discover.personal', compact('posts', 'tags')); - } - public function showLoops(Request $request) { if(config('exp.loops') != true) { @@ -148,4 +127,10 @@ class DiscoverController extends Controller } return $res; } + + public function profilesDirectory(Request $request) + { + $profiles = Profile::whereNull('domain')->simplePaginate(48); + return view('discover.profiles.home', compact('profiles')); + } } diff --git a/app/Http/Controllers/FederationController.php b/app/Http/Controllers/FederationController.php index 6eba09c74..e6edb11c6 100644 --- a/app/Http/Controllers/FederationController.php +++ b/app/Http/Controllers/FederationController.php @@ -228,6 +228,9 @@ class FederationController extends Controller $id = Helpers::validateUrl($bodyDecoded['id']); $keyDomain = parse_url($keyId, PHP_URL_HOST); $idDomain = parse_url($id, PHP_URL_HOST); + if($keyDomain == config('pixelfed.domain.app') || $idDomain == config('pixelfed.domain.app')) { + return false; + } if(isset($bodyDecoded['object']) && is_array($bodyDecoded['object']) && isset($bodyDecoded['object']['attributedTo']) @@ -248,7 +251,7 @@ class FederationController extends Controller } $pkey = openssl_pkey_get_public($actor->public_key); $inboxPath = "/users/{$profile->username}/inbox"; - list($verified, $headers) = HTTPSignature::verify($pkey, $signatureData, $request->headers->all(), $inboxPath, $body); + list($verified, $headers) = HttpSignature::verify($pkey, $signatureData, $request->headers->all(), $inboxPath, $body); if($verified == 1) { return true; } else { diff --git a/app/Http/Controllers/InternalApiController.php b/app/Http/Controllers/InternalApiController.php index abe07ad22..081ec1f7e 100644 --- a/app/Http/Controllers/InternalApiController.php +++ b/app/Http/Controllers/InternalApiController.php @@ -240,7 +240,8 @@ class InternalApiController extends Controller 'media.*.license' => 'nullable|string|max:80', 'cw' => 'nullable|boolean', 'visibility' => 'required|string|in:public,private,unlisted|min:2|max:10', - 'place' => 'nullable' + 'place' => 'nullable', + 'comments_disabled' => 'nullable|boolean' ]); if(config('costar.enabled') == true) { @@ -255,7 +256,8 @@ class InternalApiController extends Controller } } - $profile = Auth::user()->profile; + $user = Auth::user(); + $profile = $user->profile; $visibility = $request->input('visibility'); $medias = $request->input('media'); $attachments = []; @@ -287,9 +289,15 @@ class InternalApiController extends Controller if($request->filled('place')) { $status->place_id = $request->input('place')['id']; } + + if($request->filled('comments_disabled')) { + $status->comments_disabled = $request->input('comments_disabled'); + } + $status->caption = strip_tags($request->caption); $status->scope = 'draft'; $status->profile_id = $profile->id; + $status->save(); foreach($attachments as $media) { @@ -308,6 +316,7 @@ class InternalApiController extends Controller NewStatusPipeline::dispatch($status); Cache::forget('user:account:id:'.$profile->user_id); Cache::forget('profile:status_count:'.$profile->id); + Cache::forget($user->storageUsedKey()); return $status->url(); } diff --git a/app/Http/Controllers/MediaController.php b/app/Http/Controllers/MediaController.php index 477d8a730..e41b22bd6 100644 --- a/app/Http/Controllers/MediaController.php +++ b/app/Http/Controllers/MediaController.php @@ -2,7 +2,56 @@ namespace App\Http\Controllers; +use Illuminate\Http\Request; +use Auth, Storage, URL; +use App\Media; +use Image as Intervention; +use App\Jobs\ImageOptimizePipeline\ImageOptimize; + class MediaController extends Controller { - // + public function __construct() + { + $this->middleware('auth'); + } + + public function index(Request $request) + { + //return view('settings.drive.index'); + } + + public function composeUpdate(Request $request, $id) + { + $this->validate($request, [ + 'file' => function() { + return [ + 'required', + 'mimes:' . config('pixelfed.media_types'), + 'max:' . config('pixelfed.max_photo_size'), + ]; + }, + ]); + + $user = Auth::user(); + + $photo = $request->file('file'); + + $media = Media::whereUserId($user->id) + ->whereProfileId($user->profile_id) + ->whereNull('status_id') + ->findOrFail($id); + + $fragments = explode('/', $media->media_path); + $name = last($fragments); + array_pop($fragments); + $dir = implode('/', $fragments); + $path = $photo->storeAs($dir, $name); + $res = []; + $res['url'] = URL::temporarySignedRoute( + 'temp-media', now()->addHours(1), ['profileId' => $media->profile_id, 'mediaId' => $media->id] + ); + ImageOptimize::dispatch($media); + return $res; + + } } diff --git a/app/Http/Controllers/PlaceController.php b/app/Http/Controllers/PlaceController.php index 89e5710a3..cf1a861a1 100644 --- a/app/Http/Controllers/PlaceController.php +++ b/app/Http/Controllers/PlaceController.php @@ -12,12 +12,33 @@ class PlaceController extends Controller { public function show(Request $request, $id, $slug) { - // TODO: Replace with vue component + apis $place = Place::whereSlug($slug)->findOrFail($id); $posts = Status::wherePlaceId($place->id) + ->whereNull('uri') ->whereScope('public') ->orderByDesc('created_at') - ->paginate(10); + ->simplePaginate(10); + return view('discover.places.show', compact('place', 'posts')); } + + public function directoryHome(Request $request) + { + $places = Place::select('country') + ->distinct('country') + ->simplePaginate(48); + + return view('discover.places.directory.home', compact('places')); + } + + public function directoryCities(Request $request, $country) + { + $country = urldecode($country); + $places = Place::whereCountry($country) + ->orderBy('name', 'asc') + ->distinct('name') + ->simplePaginate(48); + + return view('discover.places.directory.cities', compact('places')); + } } diff --git a/app/Http/Controllers/PublicApiController.php b/app/Http/Controllers/PublicApiController.php index 29b3984c0..41cc2b3d9 100644 --- a/app/Http/Controllers/PublicApiController.php +++ b/app/Http/Controllers/PublicApiController.php @@ -22,6 +22,7 @@ use App\Transformer\Api\{ RelationshipTransformer, StatusTransformer, }; +use App\Services\UserFilterService; use App\Jobs\StatusPipeline\NewStatusPipeline; use League\Fractal\Serializer\ArraySerializer; use League\Fractal\Pagination\IlluminatePaginatorAdapter; @@ -234,23 +235,27 @@ class PublicApiController extends Controller $max = $request->input('max_id'); $limit = $request->input('limit') ?? 3; - $private = Cache::remember('profiles:private', now()->addMinutes(1440), function() { - return Profile::whereIsPrivate(true) - ->orWhere('unlisted', true) - ->orWhere('status', '!=', null) - ->pluck('id'); - }); + // $private = Cache::remember('profiles:private', now()->addMinutes(1440), function() { + // return Profile::whereIsPrivate(true) + // ->orWhere('unlisted', true) + // ->orWhere('status', '!=', null) + // ->pluck('id'); + // }); - if(Auth::check()) { - $pid = Auth::user()->profile->id; - $filters = UserFilter::whereUserId($pid) - ->whereFilterableType('App\Profile') - ->whereIn('filter_type', ['mute', 'block']) - ->pluck('filterable_id')->toArray(); - $filtered = array_merge($private->toArray(), $filters); - } else { - $filtered = $private->toArray(); - } + // if(Auth::check()) { + // // $pid = Auth::user()->profile->id; + // // $filters = UserFilter::whereUserId($pid) + // // ->whereFilterableType('App\Profile') + // // ->whereIn('filter_type', ['mute', 'block']) + // // ->pluck('filterable_id')->toArray(); + // // $filtered = array_merge($private->toArray(), $filters); + // $filtered = UserFilterService::filters(Auth::user()->profile_id); + // } else { + // // $filtered = $private->toArray(); + // $filtered = []; + // } + + $filtered = Auth::check() ? UserFilterService::filters(Auth::user()->profile_id) : []; if($min || $max) { $dir = $min ? '>' : '<'; @@ -276,14 +281,12 @@ class PublicApiController extends Controller ->with('profile', 'hashtags', 'mentions') ->whereIn('type', ['photo', 'photo:album', 'video', 'video:album']) ->whereLocal(true) - ->whereNull('uri') ->whereNotIn('profile_id', $filtered) - ->whereNull('in_reply_to_id') - ->whereNull('reblog_of_id') ->whereVisibility('public') ->orderBy('created_at', 'desc') ->limit($limit) ->get(); + //->toSql(); } else { $timeline = Status::select( 'id', @@ -305,17 +308,16 @@ class PublicApiController extends Controller )->whereIn('type', ['photo', 'photo:album', 'video', 'video:album']) ->with('profile', 'hashtags', 'mentions') ->whereLocal(true) - ->whereNull('uri') ->whereNotIn('profile_id', $filtered) - ->whereNull('in_reply_to_id') - ->whereNull('reblog_of_id') ->whereVisibility('public') ->orderBy('created_at', 'desc') ->simplePaginate($limit); + //->toSql(); } $fractal = new Fractal\Resource\Collection($timeline, new StatusTransformer()); $res = $this->fractal->createData($fractal)->toArray(); + // $res = $timeline; return response()->json($res); } @@ -347,20 +349,22 @@ class PublicApiController extends Controller return $following->push($pid)->toArray(); }); - $private = Cache::remember('profiles:private', now()->addMinutes(1440), function() { - return Profile::whereIsPrivate(true) - ->orWhere('unlisted', true) - ->orWhere('status', '!=', null) - ->pluck('id'); - }); + // $private = Cache::remember('profiles:private', now()->addMinutes(1440), function() { + // return Profile::whereIsPrivate(true) + // ->orWhere('unlisted', true) + // ->orWhere('status', '!=', null) + // ->pluck('id'); + // }); - $private = $private->diff($following)->flatten(); + // $private = $private->diff($following)->flatten(); - $filters = UserFilter::whereUserId($pid) - ->whereFilterableType('App\Profile') - ->whereIn('filter_type', ['mute', 'block']) - ->pluck('filterable_id')->toArray(); - $filtered = array_merge($private->toArray(), $filters); + // $filters = UserFilter::whereUserId($pid) + // ->whereFilterableType('App\Profile') + // ->whereIn('filter_type', ['mute', 'block']) + // ->pluck('filterable_id')->toArray(); + // $filtered = array_merge($private->toArray(), $filters); + + $filtered = Auth::check() ? UserFilterService::filters(Auth::user()->profile_id) : []; if($min || $max) { $dir = $min ? '>' : '<'; @@ -387,8 +391,6 @@ class PublicApiController extends Controller ->where('id', $dir, $id) ->whereIn('profile_id', $following) ->whereNotIn('profile_id', $filtered) - ->whereNull('in_reply_to_id') - ->whereNull('reblog_of_id') ->whereIn('visibility',['public', 'unlisted', 'private']) ->orderBy('created_at', 'desc') ->limit($limit) @@ -415,8 +417,6 @@ class PublicApiController extends Controller ->with('profile', 'hashtags', 'mentions') ->whereIn('profile_id', $following) ->whereNotIn('profile_id', $filtered) - ->whereNull('in_reply_to_id') - ->whereNull('reblog_of_id') ->whereIn('visibility',['public', 'unlisted', 'private']) ->orderBy('created_at', 'desc') ->simplePaginate($limit); diff --git a/app/Http/Controllers/SearchController.php b/app/Http/Controllers/SearchController.php index ada796b10..064afd86f 100644 --- a/app/Http/Controllers/SearchController.php +++ b/app/Http/Controllers/SearchController.php @@ -54,7 +54,8 @@ class SearchController extends Controller 'id' => (string) $item->id, 'following' => $item->followedBy(Auth::user()->profile), 'follow_request' => $item->hasFollowRequestById(Auth::user()->profile_id), - 'thumb' => $item->avatarUrl() + 'thumb' => $item->avatarUrl(), + 'local' => (bool) !$item->domain ] ]]; } else if ($type == 'Note') { @@ -92,7 +93,7 @@ class SearchController extends Controller } return $tokens; }); - $users = Profile::select('username', 'name', 'id') + $users = Profile::select('domain', 'username', 'name', 'id') ->whereNull('status') ->whereNull('domain') ->where('id', '!=', Auth::user()->profile->id) @@ -113,9 +114,11 @@ class SearchController extends Controller 'avatar' => $item->avatarUrl(), 'id' => $item->id, 'entity' => [ - 'id' => $item->id, + 'id' => (string) $item->id, 'following' => $item->followedBy(Auth::user()->profile), - 'thumb' => $item->avatarUrl() + 'follow_request' => $item->hasFollowRequestById(Auth::user()->profile_id), + 'thumb' => $item->avatarUrl(), + 'local' => (bool) !$item->domain ] ]; }); @@ -162,4 +165,5 @@ class SearchController extends Controller return view('search.results'); } + } diff --git a/app/Http/Controllers/StatusController.php b/app/Http/Controllers/StatusController.php index c5a1c9975..364ca21a8 100644 --- a/app/Http/Controllers/StatusController.php +++ b/app/Http/Controllers/StatusController.php @@ -22,7 +22,6 @@ class StatusController extends Controller { public function show(Request $request, $username, int $id) { - // $id = strlen($id) < 17 ? array_first(\Hashids::decode($id)) : $id; $user = Profile::whereNull('domain')->whereUsername($username)->firstOrFail(); if($user->status != null) { @@ -60,9 +59,24 @@ class StatusController extends Controller return view($template, compact('user', 'status')); } + public function showId(int $id) + { + abort(404); + $status = Status::whereNull('reblog_of_id') + ->whereIn('scope', ['public', 'unlisted']) + ->findOrFail($id); + return redirect($status->url()); + } + public function showEmbed(Request $request, $username, int $id) { - return; + abort(404); + $profile = Profile::whereNull('status')->whereUsername($username)->first(); + $status = Status::whereScope('private')->find($id); + if(!$profile || !$status) { + return view('status.embed-removed'); + } + return view('status.embed', compact('status')); } public function showObject(Request $request, $username, int $id) @@ -77,13 +91,7 @@ class StatusController extends Controller ->whereNotIn('visibility',['draft','direct']) ->findOrFail($id); - if($status->uri) { - $url = $status->uri; - if(ends_with($url, '/activity')) { - $url = str_replace('/activity', '', $url); - } - return redirect($url); - } + abort_if($status->uri, 404); if($status->visibility == 'private' || $user->is_private) { if(!Auth::check()) { @@ -190,7 +198,7 @@ class StatusController extends Controller $resource = new Fractal\Resource\Item($status, new Note()); $res = $fractal->createData($resource)->toArray(); - return response(json_encode($res['data']))->header('Content-Type', 'application/activity+json'); + return response()->json($res['data'], 200, ['Content-Type' => 'application/activity+json'], JSON_PRETTY_PRINT); } public function edit(Request $request, $username, $id) diff --git a/app/Http/Middleware/EmailVerificationCheck.php b/app/Http/Middleware/EmailVerificationCheck.php index 502f4fd23..f805468cb 100644 --- a/app/Http/Middleware/EmailVerificationCheck.php +++ b/app/Http/Middleware/EmailVerificationCheck.php @@ -19,7 +19,13 @@ class EmailVerificationCheck if ($request->user() && config('pixelfed.enforce_email_verification') && is_null($request->user()->email_verified_at) && - !$request->is('i/verify-email', 'log*', 'i/confirm-email/*', 'settings/home') + !$request->is( + 'i/verify-email', + 'log*', + 'i/confirm-email/*', + 'settings/home', + 'settings/email' + ) ) { return redirect('/i/verify-email'); } diff --git a/app/Jobs/ImageOptimizePipeline/ImageUpdate.php b/app/Jobs/ImageOptimizePipeline/ImageUpdate.php index 968f0bd72..8460a36d7 100644 --- a/app/Jobs/ImageOptimizePipeline/ImageUpdate.php +++ b/app/Jobs/ImageOptimizePipeline/ImageUpdate.php @@ -53,6 +53,10 @@ class ImageUpdate implements ShouldQueue } $path = storage_path('app/'.$media->media_path); $thumb = storage_path('app/'.$media->thumbnail_path); + + if (!is_file($path)) { + return; + } if (in_array($media->mime, $this->protectedMimes) == true) { ImageOptimizer::optimize($thumb); diff --git a/app/Jobs/InboxPipeline/InboxWorker.php b/app/Jobs/InboxPipeline/InboxWorker.php index 4726d9aff..20962113c 100644 --- a/app/Jobs/InboxPipeline/InboxWorker.php +++ b/app/Jobs/InboxPipeline/InboxWorker.php @@ -18,6 +18,9 @@ class InboxWorker implements ShouldQueue protected $profile; protected $payload; + public $timeout = 5; + public $tries = 1; + /** * Create a new job instance. * diff --git a/app/Observers/UserFilterObserver.php b/app/Observers/UserFilterObserver.php new file mode 100644 index 000000000..fa83d690a --- /dev/null +++ b/app/Observers/UserFilterObserver.php @@ -0,0 +1,99 @@ +filterCreate($userFilter); + } + + /** + * Handle the user filter "updated" event. + * + * @param \App\UserFilter $userFilter + * @return void + */ + public function updated(UserFilter $userFilter) + { + $this->filterCreate($userFilter); + } + + /** + * Handle the user filter "deleted" event. + * + * @param \App\UserFilter $userFilter + * @return void + */ + public function deleted(UserFilter $userFilter) + { + $this->filterDelete($userFilter); + } + + /** + * Handle the user filter "restored" event. + * + * @param \App\UserFilter $userFilter + * @return void + */ + public function restored(UserFilter $userFilter) + { + $this->filterCreate($userFilter); + } + + /** + * Handle the user filter "force deleted" event. + * + * @param \App\UserFilter $userFilter + * @return void + */ + public function forceDeleted(UserFilter $userFilter) + { + $this->filterDelete($userFilter); + } + + protected function filterCreate(UserFilter $userFilter) + { + if($userFilter->filterable_type !== 'App\Profile') { + return; + } + + switch ($userFilter->filter_type) { + case 'mute': + UserFilterService::mute($userFilter->user_id, $userFilter->filterable_id); + break; + + case 'block': + UserFilterService::block($userFilter->user_id, $userFilter->filterable_id); + break; + } + } + + + protected function filterDelete(UserFilter $userFilter) + { + if($userFilter->filterable_type !== 'App\Profile') { + return; + } + + switch ($userFilter->filter_type) { + case 'mute': + UserFilterService::unmute($userFilter->user_id, $userFilter->filterable_id); + break; + + case 'block': + UserFilterService::unblock($userFilter->user_id, $userFilter->filterable_id); + break; + } + } +} diff --git a/app/Place.php b/app/Place.php index a63c507c5..5ea6351cc 100644 --- a/app/Place.php +++ b/app/Place.php @@ -28,4 +28,16 @@ class Place extends Model { return $this->hasMany(Status::class, 'id', 'place_id'); } + + public function countryUrl() + { + $country = strtolower($this->country); + $country = urlencode($country); + return url('/discover/location/country/' . $country); + } + + public function cityUrl() + { + return $this->url(); + } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 6bfe29459..aa82eb674 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -6,13 +6,15 @@ use App\Observers\{ AvatarObserver, NotificationObserver, StatusHashtagObserver, - UserObserver + UserObserver, + UserFilterObserver, }; use App\{ Avatar, Notification, StatusHashtag, - User + User, + UserFilter }; use Auth, Horizon, URL; use Illuminate\Support\Facades\Blade; @@ -35,6 +37,7 @@ class AppServiceProvider extends ServiceProvider Notification::observe(NotificationObserver::class); StatusHashtag::observe(StatusHashtagObserver::class); User::observe(UserObserver::class); + UserFilter::observe(UserFilterObserver::class); Horizon::auth(function ($request) { return Auth::check() && $request->user()->is_admin; diff --git a/app/Services/UserFilterService.php b/app/Services/UserFilterService.php new file mode 100644 index 000000000..e365fe8b2 --- /dev/null +++ b/app/Services/UserFilterService.php @@ -0,0 +1,100 @@ +whereUserId($profile_id) + ->pluck('filterable_id') + ->toArray(); + foreach ($ids as $muted_id) { + Redis::zadd($key, (int) $muted_id, (int) $muted_id); + } + return $ids; + } + } + + public static function blocks(int $profile_id) : array + { + $key = self::USER_BLOCKS_KEY . $profile_id; + $cached = Redis::zrevrange($key, 0, -1); + if($cached) { + return $cached; + } else { + $ids = UserFilter::whereFilterType('block') + ->whereUserId($profile_id) + ->pluck('filterable_id') + ->toArray(); + foreach ($ids as $blocked_id) { + Redis::zadd($key, $blocked_id, $blocked_id); + } + return $ids; + } + } + + public static function filters(int $profile_id) : array + { + return array_merge(self::mutes($profile_id), self::blocks($profile_id)); + } + + public static function mute(int $profile_id, int $muted_id) + { + $key = self::USER_MUTES_KEY . $profile_id; + $mutes = self::mutes($profile_id); + $exists = in_array($muted_id, $mutes); + if(!$exists) { + Redis::zadd($key, $muted_id, $muted_id); + } + return true; + } + + public static function unmute(int $profile_id, string $muted_id) + { + $key = self::USER_MUTES_KEY . $profile_id; + $mutes = self::mutes($profile_id); + $exists = in_array($muted_id, $mutes); + if($exists) { + Redis::zrem($key, $muted_id); + } + return true; + } + + public static function block(int $profile_id, int $blocked_id) + { + $key = self::USER_BLOCKS_KEY . $profile_id; + $exists = in_array($blocked_id, self::blocks($profile_id)); + if(!$exists) { + Redis::zadd($key, $blocked_id, $blocked_id); + } + return true; + } + + public static function unblock(int $profile_id, string $blocked_id) + { + $key = self::USER_BLOCKS_KEY . $profile_id; + $exists = in_array($blocked_id, self::blocks($profile_id)); + if($exists) { + Redis::zrem($key, $blocked_id); + } + return $exists; + } +} \ No newline at end of file diff --git a/app/Transformer/ActivityPub/StatusTransformer.php b/app/Transformer/ActivityPub/StatusTransformer.php index e89a57fa5..e780c1068 100644 --- a/app/Transformer/ActivityPub/StatusTransformer.php +++ b/app/Transformer/ActivityPub/StatusTransformer.php @@ -54,6 +54,13 @@ class StatusTransformer extends Fractal\TransformerAbstract ]; }), 'tag' => [], + 'location' => $status->place_id ? [ + 'type' => 'Place', + 'name' => $status->place->name, + 'longitude' => $status->place->long, + 'latitude' => $status->place->lat, + 'country' => $status->place->country + ] : null, ]; } } diff --git a/app/Transformer/ActivityPub/Verb/CreateNote.php b/app/Transformer/ActivityPub/Verb/CreateNote.php index b5f51d769..83f7e6020 100644 --- a/app/Transformer/ActivityPub/Verb/CreateNote.php +++ b/app/Transformer/ActivityPub/Verb/CreateNote.php @@ -74,7 +74,14 @@ class CreateNote extends Fractal\TransformerAbstract 'announce' => 'https://www.w3.org/ns/activitystreams#Public', 'like' => 'https://www.w3.org/ns/activitystreams#Public', 'reply' => $status->comments_disabled == true ? null : 'https://www.w3.org/ns/activitystreams#Public' - ] + ], + 'location' => $status->place_id ? [ + 'type' => 'Place', + 'name' => $status->place->name, + 'longitude' => $status->place->long, + 'latitude' => $status->place->lat, + 'country' => $status->place->country + ] : null, ] ]; } diff --git a/app/Transformer/ActivityPub/Verb/Note.php b/app/Transformer/ActivityPub/Verb/Note.php index ac4567179..d27875967 100644 --- a/app/Transformer/ActivityPub/Verb/Note.php +++ b/app/Transformer/ActivityPub/Verb/Note.php @@ -67,7 +67,14 @@ class Note extends Fractal\TransformerAbstract 'announce' => 'https://www.w3.org/ns/activitystreams#Public', 'like' => 'https://www.w3.org/ns/activitystreams#Public', 'reply' => $status->comments_disabled == true ? null : 'https://www.w3.org/ns/activitystreams#Public' - ] + ], + 'location' => $status->place_id ? [ + 'type' => 'Place', + 'name' => $status->place->name, + 'longitude' => $status->place->long, + 'latitude' => $status->place->lat, + 'country' => $status->place->country + ] : null, ]; } } diff --git a/app/Transformer/Api/AccountTransformer.php b/app/Transformer/Api/AccountTransformer.php index e29c8616b..eb3e819cb 100644 --- a/app/Transformer/Api/AccountTransformer.php +++ b/app/Transformer/Api/AccountTransformer.php @@ -2,11 +2,16 @@ namespace App\Transformer\Api; +use Auth; use App\Profile; use League\Fractal; class AccountTransformer extends Fractal\TransformerAbstract { + protected $defaultIncludes = [ + 'relationship', + ]; + public function transform(Profile $profile) { $is_admin = $profile->domain ? false : $profile->user->is_admin; @@ -32,7 +37,12 @@ class AccountTransformer extends Fractal\TransformerAbstract 'bot' => null, 'website' => $profile->website, 'software' => 'pixelfed', - 'is_admin' => (bool) $is_admin + 'is_admin' => (bool) $is_admin, ]; } + + protected function includeRelationship(Profile $profile) + { + return $this->item($profile, new RelationshipTransformer()); + } } diff --git a/app/Transformer/Api/RelationshipTransformer.php b/app/Transformer/Api/RelationshipTransformer.php index 89e1decd8..a736eed49 100644 --- a/app/Transformer/Api/RelationshipTransformer.php +++ b/app/Transformer/Api/RelationshipTransformer.php @@ -14,6 +14,9 @@ class RelationshipTransformer extends Fractal\TransformerAbstract public function transform(Profile $profile) { $auth = Auth::check(); + if(!$auth) { + return []; + } $user = $auth ? Auth::user()->profile : false; $requested = false; if($user) { diff --git a/app/User.php b/app/User.php index 0db0bf7ca..896ad12d6 100644 --- a/app/User.php +++ b/app/User.php @@ -78,4 +78,9 @@ class User extends Authenticatable return $this->hasMany(UserDevice::class); } + public function storageUsedKey() + { + return 'profile:storage:used:' . $this->id; + } + } diff --git a/app/Util/ActivityPub/Inbox.php b/app/Util/ActivityPub/Inbox.php index 48a0ab50d..f7053e7bf 100644 --- a/app/Util/ActivityPub/Inbox.php +++ b/app/Util/ActivityPub/Inbox.php @@ -10,7 +10,8 @@ use App\{ Like, Notification, Profile, - Status + Status, + StatusHashtag, }; use Carbon\Carbon; use App\Util\ActivityPub\Helpers; @@ -129,7 +130,7 @@ class Inbox } $inReplyTo = $activity['inReplyTo']; - $url = $activity['id']; + $url = isset($activity['url']) ? $activity['url'] : $activity['id']; Helpers::statusFirstOrFetch($url, true); return; @@ -147,7 +148,7 @@ class Inbox return; } - $url = $activity['id']; + $url = isset($activity['url']) ? $activity['url'] : $activity['id']; if(Status::whereUrl($url)->exists()) { return; } @@ -285,28 +286,74 @@ class Inbox public function handleDeleteActivity() { + if(!isset( + $this->payload['actor'], + $this->payload['object'], + $this->payload['object']['id'], + $this->payload['object']['type'] + )) { + return; + } $actor = $this->payload['actor']; $obj = $this->payload['object']; - abort_if(!Helpers::validateUrl($obj), 400); - if(is_string($obj) && Helpers::validateUrl($obj)) { - // actor object detected - // todo delete actor + $type = $this->payload['object']['type']; + $typeCheck = in_array($type, ['Person', 'Tombstone']); + if(!Helpers::validateUrl($actor) || !Helpers::validateUrl($obj['id']) || !$typeCheck) { return; - } else if (Helpers::validateUrl($obj['id']) && Helpers::validateObject($obj) && $obj['type'] == 'Tombstone') { - // todo delete status or object + } + if(parse_url($obj['id'], PHP_URL_HOST) !== parse_url($actor, PHP_URL_HOST)) { return; } + $id = $this->payload['object']['id']; + switch ($type) { + case 'Person': + $profile = Profile::whereNull('domain') + ->whereNull('private_key') + ->whereRemoteUrl($id) + ->first(); + if(!$profile) { + return; + } + Notification::whereActorId($profile->id)->delete(); + $profile->avatar()->delete(); + $profile->followers()->delete(); + $profile->following()->delete(); + $profile->likes()->delete(); + $profile->media()->delete(); + $profile->statuses()->delete(); + $profile->delete(); + return; + break; + + case 'Tombstone': + $status = Status::whereUri($id)->first(); + if(!$status) { + return; + } + $status->media->delete(); + $status->delete(); + return; + break; + + default: + return; + break; + } } public function handleLikeActivity() { $actor = $this->payload['actor']; - abort_if(!Helpers::validateUrl($actor), 400); + if(!Helpers::validateUrl($actor)) { + return; + } $profile = self::actorFirstOrCreate($actor); $obj = $this->payload['object']; - abort_if(!Helpers::validateLocalUrl($obj), 400); + if(!Helpers::validateUrl($obj)) { + return; + } $status = Helpers::statusFirstOrFetch($obj); if(!$status || !$profile) { return; @@ -343,7 +390,9 @@ class Inbox case 'Announce': $obj = $obj['object']; - abort_if(!Helpers::validateLocalUrl($obj), 400); + if(!Helpers::validateLocalUrl($obj)) { + return; + } $status = Helpers::statusFetch($obj); if(!$status) { return; diff --git a/app/Util/RateLimit/User.php b/app/Util/RateLimit/User.php index d2f243202..ddcfc2212 100644 --- a/app/Util/RateLimit/User.php +++ b/app/Util/RateLimit/User.php @@ -83,4 +83,19 @@ trait User { { return 100; } + + public function getMaxComposeMediaUpdatesPerHourAttribute() + { + return 100; + } + + public function getMaxComposeMediaUpdatesPerDayAttribute() + { + return 1000; + } + + public function getMaxComposeMediaUpdatesPerMonthAttribute() + { + return 5000; + } } \ No newline at end of file diff --git a/composer.lock b/composer.lock index ae185e956..954fe0ffe 100644 --- a/composer.lock +++ b/composer.lock @@ -71,16 +71,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.108.6", + "version": "3.110.8", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "8894571024e4c75d20bbf8c6f1500c1e62c227e8" + "reference": "1c4ec294479c0ab1d231431b04b2b2f14a72407f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/8894571024e4c75d20bbf8c6f1500c1e62c227e8", - "reference": "8894571024e4c75d20bbf8c6f1500c1e62c227e8", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/1c4ec294479c0ab1d231431b04b2b2f14a72407f", + "reference": "1c4ec294479c0ab1d231431b04b2b2f14a72407f", "shasum": "" }, "require": { @@ -150,26 +150,26 @@ "s3", "sdk" ], - "time": "2019-08-07T18:11:35+00:00" + "time": "2019-09-03T19:34:31+00:00" }, { "name": "beyondcode/laravel-self-diagnosis", - "version": "1.2.0", + "version": "1.3.2", "source": { "type": "git", "url": "https://github.com/beyondcode/laravel-self-diagnosis.git", - "reference": "0d9a06d774a8cc20806879a2e831075b17d8f0ac" + "reference": "6792a2d8b29ab9080490dac145e310514dcf6224" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/beyondcode/laravel-self-diagnosis/zipball/0d9a06d774a8cc20806879a2e831075b17d8f0ac", - "reference": "0d9a06d774a8cc20806879a2e831075b17d8f0ac", + "url": "https://api.github.com/repos/beyondcode/laravel-self-diagnosis/zipball/6792a2d8b29ab9080490dac145e310514dcf6224", + "reference": "6792a2d8b29ab9080490dac145e310514dcf6224", "shasum": "" }, "require": { "composer/semver": "^1.4", "geerlingguy/ping": "^1.1", - "illuminate/support": "5.2.*|5.3.*|5.4.*|5.5.*|5.6.*|5.7.*|5.8.*", + "illuminate/support": "5.2.*|5.3.*|5.4.*|5.5.*|5.6.*|5.7.*|5.8.*|^6.0", "php": "^7.1", "vlucas/phpdotenv": "~2.5|~3.3" }, @@ -212,7 +212,7 @@ "beyondcode", "laravel-self-diagnosis" ], - "time": "2019-03-20T15:23:20+00:00" + "time": "2019-09-03T15:01:16+00:00" }, { "name": "cakephp/chronos", @@ -845,16 +845,16 @@ }, { "name": "egulias/email-validator", - "version": "2.1.10", + "version": "2.1.11", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "a6c8d7101b19a451c1707b1b79bbbc56e4bdb7ec" + "reference": "92dd169c32f6f55ba570c309d83f5209cefb5e23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/a6c8d7101b19a451c1707b1b79bbbc56e4bdb7ec", - "reference": "a6c8d7101b19a451c1707b1b79bbbc56e4bdb7ec", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/92dd169c32f6f55ba570c309d83f5209cefb5e23", + "reference": "92dd169c32f6f55ba570c309d83f5209cefb5e23", "shasum": "" }, "require": { @@ -873,7 +873,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "2.1.x-dev" } }, "autoload": { @@ -899,7 +899,7 @@ "validation", "validator" ], - "time": "2019-07-19T20:52:08+00:00" + "time": "2019-08-13T17:33:27+00:00" }, { "name": "erusev/parsedown", @@ -1044,25 +1044,25 @@ }, { "name": "fideloper/proxy", - "version": "4.2.0", + "version": "4.2.1", "source": { "type": "git", "url": "https://github.com/fideloper/TrustedProxy.git", - "reference": "39a4c2165e578bc771f5dc031c273210a3a9b6d2" + "reference": "03085e58ec7bee24773fa5a8850751a6e61a7e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/39a4c2165e578bc771f5dc031c273210a3a9b6d2", - "reference": "39a4c2165e578bc771f5dc031c273210a3a9b6d2", + "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/03085e58ec7bee24773fa5a8850751a6e61a7e8a", + "reference": "03085e58ec7bee24773fa5a8850751a6e61a7e8a", "shasum": "" }, "require": { - "illuminate/contracts": "~5.0|~6.0", + "illuminate/contracts": "^5.0|^6.0|^7.0", "php": ">=5.4.0" }, "require-dev": { - "illuminate/http": "~5.6|~6.0", - "mockery/mockery": "~1.0", + "illuminate/http": "^5.0|^6.0|^7.0", + "mockery/mockery": "^1.0", "phpunit/phpunit": "^6.0" }, "type": "library", @@ -1094,7 +1094,7 @@ "proxy", "trusted proxy" ], - "time": "2019-07-29T16:49:45+00:00" + "time": "2019-09-03T16:45:42+00:00" }, { "name": "firebase/php-jwt", @@ -1640,16 +1640,16 @@ }, { "name": "laravel/framework", - "version": "v5.8.31", + "version": "v5.8.35", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "24cc1786bd55876fa52380306354772355345efd" + "reference": "5a9e4d241a8b815e16c9d2151e908992c38db197" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/24cc1786bd55876fa52380306354772355345efd", - "reference": "24cc1786bd55876fa52380306354772355345efd", + "url": "https://api.github.com/repos/laravel/framework/zipball/5a9e4d241a8b815e16c9d2151e908992c38db197", + "reference": "5a9e4d241a8b815e16c9d2151e908992c38db197", "shasum": "" }, "require": { @@ -1732,6 +1732,7 @@ "suggest": { "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (^3.0).", "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6).", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", "ext-pcntl": "Required to use all features of the queue worker.", "ext-posix": "Required to use all features of the queue worker.", "filp/whoops": "Required for friendly error pages in development (^2.1.4).", @@ -1783,20 +1784,20 @@ "framework", "laravel" ], - "time": "2019-08-06T15:09:02+00:00" + "time": "2019-09-03T16:44:30+00:00" }, { "name": "laravel/horizon", - "version": "v3.2.8", + "version": "v3.3.2", "source": { "type": "git", "url": "https://github.com/laravel/horizon.git", - "reference": "02ddc3936c4b99f2d7914857a66ef432480876c4" + "reference": "692d3649a9c1bd13a3340ecc10036c1d3b55155b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/horizon/zipball/02ddc3936c4b99f2d7914857a66ef432480876c4", - "reference": "02ddc3936c4b99f2d7914857a66ef432480876c4", + "url": "https://api.github.com/repos/laravel/horizon/zipball/692d3649a9c1bd13a3340ecc10036c1d3b55155b", + "reference": "692d3649a9c1bd13a3340ecc10036c1d3b55155b", "shasum": "" }, "require": { @@ -1804,9 +1805,9 @@ "ext-json": "*", "ext-pcntl": "*", "ext-posix": "*", - "illuminate/contracts": "~5.7.0|~5.8.0|^6.0", - "illuminate/queue": "~5.7.0|~5.8.0|^6.0", - "illuminate/support": "~5.7.0|~5.8.0|^6.0", + "illuminate/contracts": "~5.7.0|~5.8.0|^6.0|^7.0", + "illuminate/queue": "~5.7.0|~5.8.0|^6.0|^7.0", + "illuminate/support": "~5.7.0|~5.8.0|^6.0|^7.0", "php": ">=7.1.0", "predis/predis": "^1.1", "ramsey/uuid": "^3.5", @@ -1815,8 +1816,8 @@ }, "require-dev": { "mockery/mockery": "^1.0", - "orchestra/testbench": "^3.7", - "phpunit/phpunit": "^7.0" + "orchestra/testbench": "^3.7|^4.0|^5.0", + "phpunit/phpunit": "^7.0|^8.0" }, "type": "library", "extra": { @@ -1852,20 +1853,20 @@ "laravel", "queue" ], - "time": "2019-08-06T18:04:38+00:00" + "time": "2019-08-27T14:30:05+00:00" }, { "name": "laravel/passport", - "version": "v7.3.5", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/laravel/passport.git", - "reference": "57937b08dc8e444b4756782a5ba172b5ba54d4f5" + "reference": "4460bd1fb5d913d75e547caf02a5a19c6d77794d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/passport/zipball/57937b08dc8e444b4756782a5ba172b5ba54d4f5", - "reference": "57937b08dc8e444b4756782a5ba172b5ba54d4f5", + "url": "https://api.github.com/repos/laravel/passport/zipball/4460bd1fb5d913d75e547caf02a5a19c6d77794d", + "reference": "4460bd1fb5d913d75e547caf02a5a19c6d77794d", "shasum": "" }, "require": { @@ -1876,6 +1877,7 @@ "illuminate/console": "~5.6.0|~5.7.0|~5.8.0|^6.0", "illuminate/container": "~5.6.0|~5.7.0|~5.8.0|^6.0", "illuminate/contracts": "~5.6.0|~5.7.0|~5.8.0|^6.0", + "illuminate/cookie": "~5.6.0|~5.7.0|~5.8.0|^6.0", "illuminate/database": "~5.6.0|~5.7.0|~5.8.0|^6.0", "illuminate/encryption": "~5.6.0|~5.7.0|~5.8.0|^6.0", "illuminate/http": "~5.6.0|~5.7.0|~5.8.0|^6.0", @@ -1922,20 +1924,20 @@ "oauth", "passport" ], - "time": "2019-08-06T18:10:19+00:00" + "time": "2019-08-20T18:10:43+00:00" }, { "name": "laravel/tinker", - "version": "v1.0.9", + "version": "v1.0.10", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "eb0075527fdeeb1cc1d68bd4ca7d50256b30a827" + "reference": "ad571aacbac1539c30d480908f9d0c9614eaf1a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/eb0075527fdeeb1cc1d68bd4ca7d50256b30a827", - "reference": "eb0075527fdeeb1cc1d68bd4ca7d50256b30a827", + "url": "https://api.github.com/repos/laravel/tinker/zipball/ad571aacbac1539c30d480908f9d0c9614eaf1a7", + "reference": "ad571aacbac1539c30d480908f9d0c9614eaf1a7", "shasum": "" }, "require": { @@ -1985,7 +1987,7 @@ "laravel", "psysh" ], - "time": "2019-07-29T18:09:25+00:00" + "time": "2019-08-07T15:10:45+00:00" }, { "name": "lcobucci/jwt", @@ -2094,16 +2096,16 @@ }, { "name": "league/flysystem", - "version": "1.0.53", + "version": "1.0.55", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "08e12b7628f035600634a5e76d95b5eb66cea674" + "reference": "33c91155537c6dc899eacdc54a13ac6303f156e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/08e12b7628f035600634a5e76d95b5eb66cea674", - "reference": "08e12b7628f035600634a5e76d95b5eb66cea674", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/33c91155537c6dc899eacdc54a13ac6303f156e6", + "reference": "33c91155537c6dc899eacdc54a13ac6303f156e6", "shasum": "" }, "require": { @@ -2174,7 +2176,7 @@ "sftp", "storage" ], - "time": "2019-06-18T20:09:29+00:00" + "time": "2019-08-24T11:17:19+00:00" }, { "name": "league/flysystem-aws-s3-v3", @@ -2637,16 +2639,16 @@ }, { "name": "nesbot/carbon", - "version": "2.22.3", + "version": "2.24.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "738fbd8d80b2c5e158fda76c29c2de432fcc6f7e" + "reference": "934459c5ac0658bc765ad1e53512c7c77adcac29" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/738fbd8d80b2c5e158fda76c29c2de432fcc6f7e", - "reference": "738fbd8d80b2c5e158fda76c29c2de432fcc6f7e", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/934459c5ac0658bc765ad1e53512c7c77adcac29", + "reference": "934459c5ac0658bc765ad1e53512c7c77adcac29", "shasum": "" }, "require": { @@ -2693,14 +2695,14 @@ "homepage": "http://github.com/kylekatarnls" } ], - "description": "A simple API extension for DateTime.", + "description": "A API extension for DateTime that supports 281 different languages.", "homepage": "http://carbon.nesbot.com", "keywords": [ "date", "datetime", "time" ], - "time": "2019-08-07T12:36:44+00:00" + "time": "2019-08-31T16:37:55+00:00" }, { "name": "neutron/temporary-filesystem", @@ -2744,16 +2746,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.2.2", + "version": "v4.2.4", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "1bd73cc04c3843ad8d6b0bfc0956026a151fc420" + "reference": "97e59c7a16464196a8b9c77c47df68e4a39a45c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bd73cc04c3843ad8d6b0bfc0956026a151fc420", - "reference": "1bd73cc04c3843ad8d6b0bfc0956026a151fc420", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/97e59c7a16464196a8b9c77c47df68e4a39a45c4", + "reference": "97e59c7a16464196a8b9c77c47df68e4a39a45c4", "shasum": "" }, "require": { @@ -2761,7 +2763,7 @@ "php": ">=7.0" }, "require-dev": { - "phpunit/phpunit": "^6.5 || ^7.0" + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0" }, "bin": [ "bin/php-parse" @@ -2791,20 +2793,20 @@ "parser", "php" ], - "time": "2019-05-25T20:07:01+00:00" + "time": "2019-09-01T07:51:21+00:00" }, { "name": "opis/closure", - "version": "3.3.1", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/opis/closure.git", - "reference": "92927e26d7fc3f271efe1f55bdbb073fbb2f0722" + "reference": "60a97fff133b1669a5b1776aa8ab06db3f3962b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opis/closure/zipball/92927e26d7fc3f271efe1f55bdbb073fbb2f0722", - "reference": "92927e26d7fc3f271efe1f55bdbb073fbb2f0722", + "url": "https://api.github.com/repos/opis/closure/zipball/60a97fff133b1669a5b1776aa8ab06db3f3962b7", + "reference": "60a97fff133b1669a5b1776aa8ab06db3f3962b7", "shasum": "" }, "require": { @@ -2852,7 +2854,7 @@ "serialization", "serialize" ], - "time": "2019-07-09T21:58:11+00:00" + "time": "2019-09-02T21:07:33+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -4114,20 +4116,20 @@ }, { "name": "spatie/db-dumper", - "version": "2.14.2", + "version": "2.14.3", "source": { "type": "git", "url": "https://github.com/spatie/db-dumper.git", - "reference": "093750d69c383fb14d9e7cd6caa052ea7b35e5b5" + "reference": "0ea605041373dce22cd0a387bca598050c7d033b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/db-dumper/zipball/093750d69c383fb14d9e7cd6caa052ea7b35e5b5", - "reference": "093750d69c383fb14d9e7cd6caa052ea7b35e5b5", + "url": "https://api.github.com/repos/spatie/db-dumper/zipball/0ea605041373dce22cd0a387bca598050c7d033b", + "reference": "0ea605041373dce22cd0a387bca598050c7d033b", "shasum": "" }, "require": { - "php": "^7.3", + "php": "^7.2", "symfony/process": "^4.2" }, "require-dev": { @@ -4146,9 +4148,9 @@ "authors": [ { "name": "Freek Van der Herten", + "role": "Developer", "email": "freek@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" + "homepage": "https://spatie.be" } ], "description": "Dump databases", @@ -4160,20 +4162,20 @@ "mysqldump", "spatie" ], - "time": "2019-06-28T08:23:04+00:00" + "time": "2019-08-21T16:39:54+00:00" }, { "name": "spatie/image-optimizer", - "version": "1.1.5", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/spatie/image-optimizer.git", - "reference": "e62f8b459bee0a880c8976c316e82638a74510b5" + "reference": "e7527edc984c98ab61db092742856fb15cf71e68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/image-optimizer/zipball/e62f8b459bee0a880c8976c316e82638a74510b5", - "reference": "e62f8b459bee0a880c8976c316e82638a74510b5", + "url": "https://api.github.com/repos/spatie/image-optimizer/zipball/e7527edc984c98ab61db092742856fb15cf71e68", + "reference": "e7527edc984c98ab61db092742856fb15cf71e68", "shasum": "" }, "require": { @@ -4199,9 +4201,9 @@ "authors": [ { "name": "Freek Van der Herten", + "role": "Developer", "email": "freek@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" + "homepage": "https://spatie.be" } ], "description": "Easily optimize images using PHP", @@ -4210,7 +4212,7 @@ "image-optimizer", "spatie" ], - "time": "2019-02-15T12:11:38+00:00" + "time": "2019-08-28T14:33:06+00:00" }, { "name": "spatie/laravel-backup", @@ -4347,16 +4349,16 @@ }, { "name": "spatie/temporary-directory", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/spatie/temporary-directory.git", - "reference": "8a23b99619babb782d6e99796efb4f3d4949a0d8" + "reference": "3e51af9a8361f85cffc1fb2c52135f3e064758cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/8a23b99619babb782d6e99796efb4f3d4949a0d8", - "reference": "8a23b99619babb782d6e99796efb4f3d4949a0d8", + "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/3e51af9a8361f85cffc1fb2c52135f3e064758cc", + "reference": "3e51af9a8361f85cffc1fb2c52135f3e064758cc", "shasum": "" }, "require": { @@ -4389,7 +4391,7 @@ "spatie", "temporary-directory" ], - "time": "2019-07-16T20:42:32+00:00" + "time": "2019-08-28T06:53:51+00:00" }, { "name": "stevebauman/purify", @@ -4515,16 +4517,16 @@ }, { "name": "symfony/console", - "version": "v4.3.3", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "8b0ae5742ce9aaa8b0075665862c1ca397d1c1d9" + "reference": "de63799239b3881b8a08f8481b22348f77ed7b36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/8b0ae5742ce9aaa8b0075665862c1ca397d1c1d9", - "reference": "8b0ae5742ce9aaa8b0075665862c1ca397d1c1d9", + "url": "https://api.github.com/repos/symfony/console/zipball/de63799239b3881b8a08f8481b22348f77ed7b36", + "reference": "de63799239b3881b8a08f8481b22348f77ed7b36", "shasum": "" }, "require": { @@ -4586,20 +4588,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2019-07-24T17:13:59+00:00" + "time": "2019-08-26T08:26:39+00:00" }, { "name": "symfony/css-selector", - "version": "v4.3.3", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "105c98bb0c5d8635bea056135304bd8edcc42b4d" + "reference": "c6e5e2a00db768c92c3ae131532af4e1acc7bd03" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/105c98bb0c5d8635bea056135304bd8edcc42b4d", - "reference": "105c98bb0c5d8635bea056135304bd8edcc42b4d", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/c6e5e2a00db768c92c3ae131532af4e1acc7bd03", + "reference": "c6e5e2a00db768c92c3ae131532af4e1acc7bd03", "shasum": "" }, "require": { @@ -4639,20 +4641,20 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2019-01-16T21:53:39+00:00" + "time": "2019-08-20T14:07:54+00:00" }, { "name": "symfony/debug", - "version": "v4.3.3", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "527887c3858a2462b0137662c74837288b998ee3" + "reference": "afcdea44a2e399c1e4b52246ec8d54c715393ced" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/527887c3858a2462b0137662c74837288b998ee3", - "reference": "527887c3858a2462b0137662c74837288b998ee3", + "url": "https://api.github.com/repos/symfony/debug/zipball/afcdea44a2e399c1e4b52246ec8d54c715393ced", + "reference": "afcdea44a2e399c1e4b52246ec8d54c715393ced", "shasum": "" }, "require": { @@ -4695,20 +4697,20 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2019-07-23T11:21:36+00:00" + "time": "2019-08-20T14:27:59+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.3.3", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "212b020949331b6531250584531363844b34a94e" + "reference": "429d0a1451d4c9c4abe1959b2986b88794b9b7d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/212b020949331b6531250584531363844b34a94e", - "reference": "212b020949331b6531250584531363844b34a94e", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/429d0a1451d4c9c4abe1959b2986b88794b9b7d2", + "reference": "429d0a1451d4c9c4abe1959b2986b88794b9b7d2", "shasum": "" }, "require": { @@ -4765,7 +4767,7 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2019-06-27T06:42:14+00:00" + "time": "2019-08-26T08:55:16+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -4827,16 +4829,16 @@ }, { "name": "symfony/filesystem", - "version": "v4.3.3", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b9896d034463ad6fd2bf17e2bf9418caecd6313d" + "reference": "9abbb7ef96a51f4d7e69627bc6f63307994e4263" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b9896d034463ad6fd2bf17e2bf9418caecd6313d", - "reference": "b9896d034463ad6fd2bf17e2bf9418caecd6313d", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/9abbb7ef96a51f4d7e69627bc6f63307994e4263", + "reference": "9abbb7ef96a51f4d7e69627bc6f63307994e4263", "shasum": "" }, "require": { @@ -4873,20 +4875,20 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2019-06-23T08:51:25+00:00" + "time": "2019-08-20T14:07:54+00:00" }, { "name": "symfony/finder", - "version": "v4.3.3", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "9638d41e3729459860bb96f6247ccb61faaa45f2" + "reference": "86c1c929f0a4b24812e1eb109262fc3372c8e9f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/9638d41e3729459860bb96f6247ccb61faaa45f2", - "reference": "9638d41e3729459860bb96f6247ccb61faaa45f2", + "url": "https://api.github.com/repos/symfony/finder/zipball/86c1c929f0a4b24812e1eb109262fc3372c8e9f2", + "reference": "86c1c929f0a4b24812e1eb109262fc3372c8e9f2", "shasum": "" }, "require": { @@ -4922,20 +4924,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2019-06-28T13:16:30+00:00" + "time": "2019-08-14T12:26:46+00:00" }, { "name": "symfony/http-foundation", - "version": "v4.3.3", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "8b778ee0c27731105fbf1535f51793ad1ae0ba2b" + "reference": "d804bea118ff340a12e22a79f9c7e7eb56b35adc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/8b778ee0c27731105fbf1535f51793ad1ae0ba2b", - "reference": "8b778ee0c27731105fbf1535f51793ad1ae0ba2b", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d804bea118ff340a12e22a79f9c7e7eb56b35adc", + "reference": "d804bea118ff340a12e22a79f9c7e7eb56b35adc", "shasum": "" }, "require": { @@ -4977,20 +4979,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2019-07-23T11:21:36+00:00" + "time": "2019-08-26T08:55:16+00:00" }, { "name": "symfony/http-kernel", - "version": "v4.3.3", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "a414548d236ddd8fa3df52367d583e82339c5e95" + "reference": "5e0fc71be03d52cd00c423061cfd300bd6f92a52" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/a414548d236ddd8fa3df52367d583e82339c5e95", - "reference": "a414548d236ddd8fa3df52367d583e82339c5e95", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/5e0fc71be03d52cd00c423061cfd300bd6f92a52", + "reference": "5e0fc71be03d52cd00c423061cfd300bd6f92a52", "shasum": "" }, "require": { @@ -5069,20 +5071,20 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2019-07-28T07:10:23+00:00" + "time": "2019-08-26T16:47:42+00:00" }, { "name": "symfony/mime", - "version": "v4.3.3", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "6b7148029b1dd5eda1502064f06d01357b7b2d8b" + "reference": "987a05df1c6ac259b34008b932551353f4f408df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/6b7148029b1dd5eda1502064f06d01357b7b2d8b", - "reference": "6b7148029b1dd5eda1502064f06d01357b7b2d8b", + "url": "https://api.github.com/repos/symfony/mime/zipball/987a05df1c6ac259b34008b932551353f4f408df", + "reference": "987a05df1c6ac259b34008b932551353f4f408df", "shasum": "" }, "require": { @@ -5091,7 +5093,7 @@ "symfony/polyfill-mbstring": "^1.0" }, "require-dev": { - "egulias/email-validator": "^2.0", + "egulias/email-validator": "^2.1.10", "symfony/dependency-injection": "~3.4|^4.1" }, "type": "library", @@ -5128,7 +5130,7 @@ "mime", "mime-type" ], - "time": "2019-07-19T16:21:19+00:00" + "time": "2019-08-22T08:16:11+00:00" }, { "name": "symfony/polyfill-ctype", @@ -5591,16 +5593,16 @@ }, { "name": "symfony/process", - "version": "v4.3.3", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "856d35814cf287480465bb7a6c413bb7f5f5e69c" + "reference": "e89969c00d762349f078db1128506f7f3dcc0d4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/856d35814cf287480465bb7a6c413bb7f5f5e69c", - "reference": "856d35814cf287480465bb7a6c413bb7f5f5e69c", + "url": "https://api.github.com/repos/symfony/process/zipball/e89969c00d762349f078db1128506f7f3dcc0d4a", + "reference": "e89969c00d762349f078db1128506f7f3dcc0d4a", "shasum": "" }, "require": { @@ -5636,7 +5638,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2019-05-30T16:10:05+00:00" + "time": "2019-08-26T08:26:39+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -5705,16 +5707,16 @@ }, { "name": "symfony/routing", - "version": "v4.3.3", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "a88c47a5861549f5dc1197660818084c3b67d773" + "reference": "ff1049f6232dc5b6023b1ff1c6de56f82bcd264f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/a88c47a5861549f5dc1197660818084c3b67d773", - "reference": "a88c47a5861549f5dc1197660818084c3b67d773", + "url": "https://api.github.com/repos/symfony/routing/zipball/ff1049f6232dc5b6023b1ff1c6de56f82bcd264f", + "reference": "ff1049f6232dc5b6023b1ff1c6de56f82bcd264f", "shasum": "" }, "require": { @@ -5777,20 +5779,20 @@ "uri", "url" ], - "time": "2019-07-23T14:43:56+00:00" + "time": "2019-08-26T08:26:39+00:00" }, { "name": "symfony/service-contracts", - "version": "v1.1.5", + "version": "v1.1.6", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f391a00de78ec7ec8cf5cdcdae59ec7b883edb8d" + "reference": "ea7263d6b6d5f798b56a45a5b8d686725f2719a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f391a00de78ec7ec8cf5cdcdae59ec7b883edb8d", - "reference": "f391a00de78ec7ec8cf5cdcdae59ec7b883edb8d", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/ea7263d6b6d5f798b56a45a5b8d686725f2719a3", + "reference": "ea7263d6b6d5f798b56a45a5b8d686725f2719a3", "shasum": "" }, "require": { @@ -5835,26 +5837,26 @@ "interoperability", "standards" ], - "time": "2019-06-13T11:15:36+00:00" + "time": "2019-08-20T14:44:19+00:00" }, { "name": "symfony/translation", - "version": "v4.3.3", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "4e3e39cc485304f807622bdc64938e4633396406" + "reference": "28498169dd334095fa981827992f3a24d50fed0f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/4e3e39cc485304f807622bdc64938e4633396406", - "reference": "4e3e39cc485304f807622bdc64938e4633396406", + "url": "https://api.github.com/repos/symfony/translation/zipball/28498169dd334095fa981827992f3a24d50fed0f", + "reference": "28498169dd334095fa981827992f3a24d50fed0f", "shasum": "" }, "require": { "php": "^7.1.3", "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^1.1.2" + "symfony/translation-contracts": "^1.1.6" }, "conflict": { "symfony/config": "<3.4", @@ -5911,20 +5913,20 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2019-07-18T10:34:59+00:00" + "time": "2019-08-26T08:55:16+00:00" }, { "name": "symfony/translation-contracts", - "version": "v1.1.5", + "version": "v1.1.6", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "cb4b18ad7b92a26e83b65dde940fab78339e6f3c" + "reference": "325b17c24f3ee23cbecfa63ba809c6d89b5fa04a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/cb4b18ad7b92a26e83b65dde940fab78339e6f3c", - "reference": "cb4b18ad7b92a26e83b65dde940fab78339e6f3c", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/325b17c24f3ee23cbecfa63ba809c6d89b5fa04a", + "reference": "325b17c24f3ee23cbecfa63ba809c6d89b5fa04a", "shasum": "" }, "require": { @@ -5968,20 +5970,20 @@ "interoperability", "standards" ], - "time": "2019-06-13T11:15:36+00:00" + "time": "2019-08-02T12:15:04+00:00" }, { "name": "symfony/var-dumper", - "version": "v4.3.3", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "e4110b992d2cbe198d7d3b244d079c1c58761d07" + "reference": "641043e0f3e615990a0f29479f9c117e8a6698c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e4110b992d2cbe198d7d3b244d079c1c58761d07", - "reference": "e4110b992d2cbe198d7d3b244d079c1c58761d07", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/641043e0f3e615990a0f29479f9c117e8a6698c6", + "reference": "641043e0f3e615990a0f29479f9c117e8a6698c6", "shasum": "" }, "require": { @@ -6044,11 +6046,11 @@ "debug", "dump" ], - "time": "2019-07-27T06:42:46+00:00" + "time": "2019-08-26T08:26:39+00:00" }, { "name": "tightenco/collect", - "version": "v5.8.31", + "version": "v5.8.34", "source": { "type": "git", "url": "https://github.com/tightenco/collect.git", @@ -6145,16 +6147,16 @@ }, { "name": "vlucas/phpdotenv", - "version": "v3.4.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "5084b23845c24dbff8ac6c204290c341e4776c92" + "reference": "95cb0fa6c025f7f0db7fc60f81e9fb231eb2d222" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/5084b23845c24dbff8ac6c204290c341e4776c92", - "reference": "5084b23845c24dbff8ac6c204290c341e4776c92", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/95cb0fa6c025f7f0db7fc60f81e9fb231eb2d222", + "reference": "95cb0fa6c025f7f0db7fc60f81e9fb231eb2d222", "shasum": "" }, "require": { @@ -6168,7 +6170,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "3.5-dev" } }, "autoload": { @@ -6181,10 +6183,15 @@ "BSD-3-Clause" ], "authors": [ + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "homepage": "https://gjcampbell.co.uk/" + }, { "name": "Vance Lucas", "email": "vance@vancelucas.com", - "homepage": "http://www.vancelucas.com" + "homepage": "https://vancelucas.com/" } ], "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", @@ -6193,7 +6200,7 @@ "env", "environment" ], - "time": "2019-06-15T22:40:20+00:00" + "time": "2019-08-27T17:00:38+00:00" }, { "name": "zendframework/zend-diactoros", @@ -6269,18 +6276,18 @@ "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "3d0d45c92c171e9663035fe291b8eb4e1d0c97f5" + "reference": "18208d64897ab732f6c04a19b319fe8f1d57a9c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/3d0d45c92c171e9663035fe291b8eb4e1d0c97f5", - "reference": "3d0d45c92c171e9663035fe291b8eb4e1d0c97f5", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/18208d64897ab732f6c04a19b319fe8f1d57a9c0", + "reference": "18208d64897ab732f6c04a19b319fe8f1d57a9c0", "shasum": "" }, "require": { - "illuminate/routing": "5.5.x|5.6.x|5.7.x|5.8.x", - "illuminate/session": "5.5.x|5.6.x|5.7.x|5.8.x", - "illuminate/support": "5.5.x|5.6.x|5.7.x|5.8.x", + "illuminate/routing": "^5.5|^6", + "illuminate/session": "^5.5|^6", + "illuminate/support": "^5.5|^6", "maximebf/debugbar": "~1.15.0", "php": ">=7.0", "symfony/debug": "^3|^4", @@ -6329,20 +6336,20 @@ "profiler", "webprofiler" ], - "time": "2019-08-06T20:15:36+00:00" + "time": "2019-08-29T07:01:03+00:00" }, { "name": "composer/ca-bundle", - "version": "1.2.3", + "version": "1.2.4", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "f26a67e397be0e5c00d7c52ec7b5010098e15ce5" + "reference": "10bb96592168a0f8e8f6dcde3532d9fa50b0b527" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/f26a67e397be0e5c00d7c52ec7b5010098e15ce5", - "reference": "f26a67e397be0e5c00d7c52ec7b5010098e15ce5", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/10bb96592168a0f8e8f6dcde3532d9fa50b0b527", + "reference": "10bb96592168a0f8e8f6dcde3532d9fa50b0b527", "shasum": "" }, "require": { @@ -6385,7 +6392,7 @@ "ssl", "tls" ], - "time": "2019-08-02T09:05:43+00:00" + "time": "2019-08-30T08:44:50+00:00" }, { "name": "composer/composer", @@ -6573,16 +6580,16 @@ }, { "name": "doctrine/annotations", - "version": "v1.6.1", + "version": "v1.7.0", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "53120e0eb10355388d6ccbe462f1fea34ddadb24" + "reference": "fa4c4e861e809d6a1103bd620cce63ed91aedfeb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/53120e0eb10355388d6ccbe462f1fea34ddadb24", - "reference": "53120e0eb10355388d6ccbe462f1fea34ddadb24", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/fa4c4e861e809d6a1103bd620cce63ed91aedfeb", + "reference": "fa4c4e861e809d6a1103bd620cce63ed91aedfeb", "shasum": "" }, "require": { @@ -6591,12 +6598,12 @@ }, "require-dev": { "doctrine/cache": "1.*", - "phpunit/phpunit": "^6.4" + "phpunit/phpunit": "^7.5@dev" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6.x-dev" + "dev-master": "1.7.x-dev" } }, "autoload": { @@ -6609,6 +6616,10 @@ "MIT" ], "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, { "name": "Roman Borschel", "email": "roman@code-factory.org" @@ -6617,10 +6628,6 @@ "name": "Benjamin Eberlei", "email": "kontakt@beberlei.de" }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, { "name": "Jonathan Wage", "email": "jonwage@gmail.com" @@ -6637,7 +6644,7 @@ "docblock", "parser" ], - "time": "2019-03-25T19:12:02+00:00" + "time": "2019-08-08T18:11:40+00:00" }, { "name": "doctrine/instantiator", @@ -6758,16 +6765,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v2.15.1", + "version": "v2.15.3", "source": { "type": "git", "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", - "reference": "20064511ab796593a3990669eff5f5b535001f7c" + "reference": "705490b0f282f21017d73561e9498d2b622ee34c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/20064511ab796593a3990669eff5f5b535001f7c", - "reference": "20064511ab796593a3990669eff5f5b535001f7c", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/705490b0f282f21017d73561e9498d2b622ee34c", + "reference": "705490b0f282f21017d73561e9498d2b622ee34c", "shasum": "" }, "require": { @@ -6797,9 +6804,10 @@ "php-cs-fixer/accessible-object": "^1.0", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.1", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.1", - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1", + "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.1", "phpunitgoodpractices/traits": "^1.8", - "symfony/phpunit-bridge": "^4.3" + "symfony/phpunit-bridge": "^4.3", + "symfony/yaml": "^3.0 || ^4.0" }, "suggest": { "ext-mbstring": "For handling non-UTF8 characters in cache signature.", @@ -6832,17 +6840,17 @@ "MIT" ], "authors": [ - { - "name": "Dariusz Rumiński", - "email": "dariusz.ruminski@gmail.com" - }, { "name": "Fabien Potencier", "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" } ], "description": "A tool to automatically fix PHP code style", - "time": "2019-06-01T10:32:12+00:00" + "time": "2019-08-31T12:51:54+00:00" }, { "name": "fzaninotto/faker", @@ -7253,16 +7261,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.9.1", + "version": "1.9.3", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72" + "reference": "007c053ae6f31bba39dfa19a7726f56e9763bbea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72", - "reference": "e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/007c053ae6f31bba39dfa19a7726f56e9763bbea", + "reference": "007c053ae6f31bba39dfa19a7726f56e9763bbea", "shasum": "" }, "require": { @@ -7297,7 +7305,7 @@ "object", "object graph" ], - "time": "2019-04-07T13:18:21+00:00" + "time": "2019-08-09T12:45:53+00:00" }, { "name": "nette/finder", @@ -7565,16 +7573,16 @@ }, { "name": "nunomaduro/phpinsights", - "version": "v1.7.0", + "version": "v1.9.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/phpinsights.git", - "reference": "320780b4acb092777f8b08dd2b8e31230b84b0b4" + "reference": "7453929847df79aeaacddc2753186aa6b16cbdb4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/phpinsights/zipball/320780b4acb092777f8b08dd2b8e31230b84b0b4", - "reference": "320780b4acb092777f8b08dd2b8e31230b84b0b4", + "url": "https://api.github.com/repos/nunomaduro/phpinsights/zipball/7453929847df79aeaacddc2753186aa6b16cbdb4", + "reference": "7453929847df79aeaacddc2753186aa6b16cbdb4", "shasum": "" }, "require": { @@ -7588,9 +7596,9 @@ "sensiolabs/security-checker": "^6.0", "symfony/console": "^4.2", "symfony/finder": "^4.2", - "symplify/coding-standard": "^6.0", - "symplify/easy-coding-standard": "^6.0", - "symplify/package-builder": "^6.0" + "symplify/coding-standard": "^6.0.4", + "symplify/easy-coding-standard": "^6.0.4", + "symplify/package-builder": "^6.0.4" }, "require-dev": { "illuminate/console": "^5.8", @@ -7639,7 +7647,7 @@ "quality", "source" ], - "time": "2019-06-20T16:01:33+00:00" + "time": "2019-08-20T14:41:42+00:00" }, { "name": "object-calisthenics/phpcs-calisthenics-rules", @@ -8456,16 +8464,16 @@ }, { "name": "phpunit/phpunit", - "version": "7.5.14", + "version": "7.5.15", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "2834789aeb9ac182ad69bfdf9ae91856a59945ff" + "reference": "d79c053d972856b8b941bb233e39dc521a5093f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2834789aeb9ac182ad69bfdf9ae91856a59945ff", - "reference": "2834789aeb9ac182ad69bfdf9ae91856a59945ff", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d79c053d972856b8b941bb233e39dc521a5093f0", + "reference": "d79c053d972856b8b941bb233e39dc521a5093f0", "shasum": "" }, "require": { @@ -8536,7 +8544,7 @@ "testing", "xunit" ], - "time": "2019-07-15T06:24:08+00:00" + "time": "2019-08-21T07:05:16+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -8758,16 +8766,16 @@ }, { "name": "sebastian/exporter", - "version": "3.1.0", + "version": "3.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "234199f4528de6d12aaa58b612e98f7d36adb937" + "reference": "06a9a5947f47b3029d76118eb5c22802e5869687" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937", - "reference": "234199f4528de6d12aaa58b612e98f7d36adb937", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/06a9a5947f47b3029d76118eb5c22802e5869687", + "reference": "06a9a5947f47b3029d76118eb5c22802e5869687", "shasum": "" }, "require": { @@ -8794,6 +8802,10 @@ "BSD-3-Clause" ], "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" @@ -8802,17 +8814,13 @@ "name": "Volker Dusch", "email": "github@wallbash.com" }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, { "name": "Adam Harvey", "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" } ], "description": "Provides the functionality to export PHP variables for visualization", @@ -8821,7 +8829,7 @@ "export", "exporter" ], - "time": "2017-04-03T13:19:02+00:00" + "time": "2019-08-11T12:43:14+00:00" }, { "name": "sebastian/finder-facade", @@ -9377,16 +9385,16 @@ }, { "name": "symfony/cache", - "version": "v4.3.3", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "d263af3cec33afa862310e58545fdc10d779806f" + "reference": "1d8f7fee990c586f275cde1a9fc883d6b1e2d43e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/d263af3cec33afa862310e58545fdc10d779806f", - "reference": "d263af3cec33afa862310e58545fdc10d779806f", + "url": "https://api.github.com/repos/symfony/cache/zipball/1d8f7fee990c586f275cde1a9fc883d6b1e2d43e", + "reference": "1d8f7fee990c586f275cde1a9fc883d6b1e2d43e", "shasum": "" }, "require": { @@ -9451,7 +9459,7 @@ "caching", "psr6" ], - "time": "2019-06-28T13:16:30+00:00" + "time": "2019-08-26T08:26:39+00:00" }, { "name": "symfony/cache-contracts", @@ -9513,16 +9521,16 @@ }, { "name": "symfony/config", - "version": "v4.3.3", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "a17a2aea43950ce83a0603ed301bac362eb86870" + "reference": "07d49c0f823e0bc367c6d84e35b61419188a5ece" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/a17a2aea43950ce83a0603ed301bac362eb86870", - "reference": "a17a2aea43950ce83a0603ed301bac362eb86870", + "url": "https://api.github.com/repos/symfony/config/zipball/07d49c0f823e0bc367c6d84e35b61419188a5ece", + "reference": "07d49c0f823e0bc367c6d84e35b61419188a5ece", "shasum": "" }, "require": { @@ -9573,26 +9581,26 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2019-07-18T10:34:59+00:00" + "time": "2019-08-26T08:26:39+00:00" }, { "name": "symfony/dependency-injection", - "version": "v4.3.3", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "9ad1b83d474ae17156f6914cb81ffe77aeac3a9b" + "reference": "d3ad14b66ac773ba6123622eb9b5b010165fe3d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/9ad1b83d474ae17156f6914cb81ffe77aeac3a9b", - "reference": "9ad1b83d474ae17156f6914cb81ffe77aeac3a9b", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/d3ad14b66ac773ba6123622eb9b5b010165fe3d9", + "reference": "d3ad14b66ac773ba6123622eb9b5b010165fe3d9", "shasum": "" }, "require": { "php": "^7.1.3", "psr/container": "^1.0", - "symfony/service-contracts": "^1.1.2" + "symfony/service-contracts": "^1.1.6" }, "conflict": { "symfony/config": "<4.3", @@ -9646,26 +9654,26 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2019-07-26T07:03:43+00:00" + "time": "2019-08-26T16:27:33+00:00" }, { "name": "symfony/http-client", - "version": "v4.3.3", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "7759fabfbdf7f57a1d29655550b49c4ff04891a5" + "reference": "9a4fa769269ed730196a5c52c742b30600cf1e87" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/7759fabfbdf7f57a1d29655550b49c4ff04891a5", - "reference": "7759fabfbdf7f57a1d29655550b49c4ff04891a5", + "url": "https://api.github.com/repos/symfony/http-client/zipball/9a4fa769269ed730196a5c52c742b30600cf1e87", + "reference": "9a4fa769269ed730196a5c52c742b30600cf1e87", "shasum": "" }, "require": { "php": "^7.1.3", "psr/log": "^1.0", - "symfony/http-client-contracts": "^1.1.4", + "symfony/http-client-contracts": "^1.1.6", "symfony/polyfill-php73": "^1.11" }, "provide": { @@ -9708,20 +9716,20 @@ ], "description": "Symfony HttpClient component", "homepage": "https://symfony.com", - "time": "2019-07-24T10:16:23+00:00" + "time": "2019-08-20T14:27:59+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v1.1.5", + "version": "v1.1.6", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "e1924aea9c70ae3e69fff05afa3cb8ce541bf3bb" + "reference": "6005fe61a33724405d56eb5b055d5d370192a1bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/e1924aea9c70ae3e69fff05afa3cb8ce541bf3bb", - "reference": "e1924aea9c70ae3e69fff05afa3cb8ce541bf3bb", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/6005fe61a33724405d56eb5b055d5d370192a1bd", + "reference": "6005fe61a33724405d56eb5b055d5d370192a1bd", "shasum": "" }, "require": { @@ -9765,20 +9773,20 @@ "interoperability", "standards" ], - "time": "2019-06-17T17:43:54+00:00" + "time": "2019-08-08T10:05:21+00:00" }, { "name": "symfony/options-resolver", - "version": "v4.3.3", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "40762ead607c8f792ee4516881369ffa553fee6f" + "reference": "81c2e120522a42f623233968244baebd6b36cb6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/40762ead607c8f792ee4516881369ffa553fee6f", - "reference": "40762ead607c8f792ee4516881369ffa553fee6f", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/81c2e120522a42f623233968244baebd6b36cb6a", + "reference": "81c2e120522a42f623233968244baebd6b36cb6a", "shasum": "" }, "require": { @@ -9819,7 +9827,7 @@ "configuration", "options" ], - "time": "2019-06-13T11:01:17+00:00" + "time": "2019-08-08T09:29:19+00:00" }, { "name": "symfony/polyfill-php70", @@ -9882,16 +9890,16 @@ }, { "name": "symfony/stopwatch", - "version": "v4.3.3", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "6b100e9309e8979cf1978ac1778eb155c1f7d93b" + "reference": "1e4ff456bd625be5032fac9be4294e60442e9b71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/6b100e9309e8979cf1978ac1778eb155c1f7d93b", - "reference": "6b100e9309e8979cf1978ac1778eb155c1f7d93b", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/1e4ff456bd625be5032fac9be4294e60442e9b71", + "reference": "1e4ff456bd625be5032fac9be4294e60442e9b71", "shasum": "" }, "require": { @@ -9928,20 +9936,20 @@ ], "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", - "time": "2019-05-27T08:16:38+00:00" + "time": "2019-08-07T11:52:19+00:00" }, { "name": "symfony/var-exporter", - "version": "v4.3.3", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "9dee83031dcf6dcb53bb7ec1c51de085329bf5cb" + "reference": "d5b4e2d334c1d80e42876c7d489896cfd37562f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/9dee83031dcf6dcb53bb7ec1c51de085329bf5cb", - "reference": "9dee83031dcf6dcb53bb7ec1c51de085329bf5cb", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/d5b4e2d334c1d80e42876c7d489896cfd37562f2", + "reference": "d5b4e2d334c1d80e42876c7d489896cfd37562f2", "shasum": "" }, "require": { @@ -9988,20 +9996,20 @@ "instantiate", "serialize" ], - "time": "2019-06-22T08:39:44+00:00" + "time": "2019-08-22T07:33:08+00:00" }, { "name": "symfony/yaml", - "version": "v4.3.3", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "34d29c2acd1ad65688f58452fd48a46bd996d5a6" + "reference": "5a0b7c32dc3ec56fd4abae8a4a71b0cf05013686" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/34d29c2acd1ad65688f58452fd48a46bd996d5a6", - "reference": "34d29c2acd1ad65688f58452fd48a46bd996d5a6", + "url": "https://api.github.com/repos/symfony/yaml/zipball/5a0b7c32dc3ec56fd4abae8a4a71b0cf05013686", + "reference": "5a0b7c32dc3ec56fd4abae8a4a71b0cf05013686", "shasum": "" }, "require": { @@ -10047,7 +10055,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2019-07-24T14:47:54+00:00" + "time": "2019-08-20T14:27:59+00:00" }, { "name": "symplify/coding-standard", @@ -10055,12 +10063,12 @@ "source": { "type": "git", "url": "https://github.com/Symplify/CodingStandard.git", - "reference": "0b54e62481f3edc843e1cd5b6d36a6f3b3742c5e" + "reference": "d16273e5e71960f49e448300fbe44d6f5292aeee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Symplify/CodingStandard/zipball/0b54e62481f3edc843e1cd5b6d36a6f3b3742c5e", - "reference": "0b54e62481f3edc843e1cd5b6d36a6f3b3742c5e", + "url": "https://api.github.com/repos/Symplify/CodingStandard/zipball/d16273e5e71960f49e448300fbe44d6f5292aeee", + "reference": "d16273e5e71960f49e448300fbe44d6f5292aeee", "shasum": "" }, "require": { @@ -10103,12 +10111,12 @@ "source": { "type": "git", "url": "https://github.com/Symplify/EasyCodingStandard.git", - "reference": "d4d9c0f4a7bda18b97c98588fbdc9c4715b07981" + "reference": "5893608bde2bf5bd5f48d977481582e3d2f90daa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Symplify/EasyCodingStandard/zipball/d4d9c0f4a7bda18b97c98588fbdc9c4715b07981", - "reference": "d4d9c0f4a7bda18b97c98588fbdc9c4715b07981", + "url": "https://api.github.com/repos/Symplify/EasyCodingStandard/zipball/5893608bde2bf5bd5f48d977481582e3d2f90daa", + "reference": "5893608bde2bf5bd5f48d977481582e3d2f90daa", "shasum": "" }, "require": { @@ -10167,12 +10175,12 @@ "source": { "type": "git", "url": "https://github.com/Symplify/PackageBuilder.git", - "reference": "bd961b17c8e5467940c47836666d921bce17d1dd" + "reference": "f531e03f87c89b26605f1cc1022160e398108ba1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Symplify/PackageBuilder/zipball/bd961b17c8e5467940c47836666d921bce17d1dd", - "reference": "bd961b17c8e5467940c47836666d921bce17d1dd", + "url": "https://api.github.com/repos/Symplify/PackageBuilder/zipball/f531e03f87c89b26605f1cc1022160e398108ba1", + "reference": "f531e03f87c89b26605f1cc1022160e398108ba1", "shasum": "" }, "require": { @@ -10290,16 +10298,16 @@ }, { "name": "webmozart/assert", - "version": "1.4.0", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9" + "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9", - "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9", + "url": "https://api.github.com/repos/webmozart/assert/zipball/88e6d84706d09a236046d686bbea96f07b3a34f4", + "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4", "shasum": "" }, "require": { @@ -10307,8 +10315,7 @@ "symfony/polyfill-ctype": "^1.8" }, "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" + "phpunit/phpunit": "^4.8.36 || ^7.5.13" }, "type": "library", "extra": { @@ -10337,7 +10344,7 @@ "check", "validate" ], - "time": "2018-12-25T11:19:39+00:00" + "time": "2019-08-24T08:43:50+00:00" } ], "aliases": [], diff --git a/config/image.php b/config/image.php index 67983819d..eb77c9089 100644 --- a/config/image.php +++ b/config/image.php @@ -15,6 +15,6 @@ return [ | */ - 'driver' => 'gd', + 'driver' => env('IMAGE_DRIVER', 'gd'), ]; diff --git a/config/instance.php b/config/instance.php index a59542466..b01b43c38 100644 --- a/config/instance.php +++ b/config/instance.php @@ -25,7 +25,7 @@ return [ 'timeline' => [ 'local' => [ - 'is_public' => env('INSTANCE_PUBLIC_LOCAL_TIMELINE', true) + 'is_public' => env('INSTANCE_PUBLIC_LOCAL_TIMELINE', false) ] ], diff --git a/config/pixelfed.php b/config/pixelfed.php index 15b6a1035..17cc25e07 100644 --- a/config/pixelfed.php +++ b/config/pixelfed.php @@ -23,7 +23,7 @@ return [ | This value is the version of your Pixelfed instance. | */ - 'version' => '0.10.0', + 'version' => '0.10.2', /* |-------------------------------------------------------------------------- diff --git a/config/session.php b/config/session.php index 736fb3c79..a99d32a7c 100644 --- a/config/session.php +++ b/config/session.php @@ -16,7 +16,7 @@ return [ | */ - 'driver' => env('SESSION_DRIVER', 'file'), + 'driver' => env('SESSION_DRIVER', 'database'), /* |-------------------------------------------------------------------------- @@ -29,7 +29,7 @@ return [ | */ - 'lifetime' => env('SESSION_LIFETIME', 120), + 'lifetime' => env('SESSION_LIFETIME', 2880), 'expire_on_close' => false, @@ -109,7 +109,7 @@ return [ | */ - 'lottery' => [2, 100], + 'lottery' => [2, 1000], /* |-------------------------------------------------------------------------- @@ -122,10 +122,7 @@ return [ | */ - 'cookie' => env( - 'SESSION_COOKIE', - str_slug(env('APP_NAME', 'laravel'), '_').'_session' - ), + 'cookie' => 'pxfs', /* |-------------------------------------------------------------------------- @@ -151,7 +148,7 @@ return [ | */ - 'domain' => env('SESSION_DOMAIN', null), + 'domain' => env('SESSION_DOMAIN', env('APP_DOMAIN', null)), /* |-------------------------------------------------------------------------- @@ -164,7 +161,7 @@ return [ | */ - 'secure' => env('SESSION_SECURE_COOKIE', false), + 'secure' => true, /* |-------------------------------------------------------------------------- diff --git a/config/websockets.php b/config/websockets.php index d4b7001a6..76f7f6724 100644 --- a/config/websockets.php +++ b/config/websockets.php @@ -47,7 +47,7 @@ return [ /* * This path will be used to register the necessary routes for the package. */ - 'path' => 'laravel-websockets', + 'path' => 'pxws', /* * Dashboard Routes Middleware @@ -98,18 +98,20 @@ return [ * certificate chain of issuers. The private key also may be contained * in a separate file specified by local_pk. */ - 'local_cert' => null, + 'local_cert' => env('WSS_LOCAL_CERT', null), /* * Path to local private key file on filesystem in case of separate files for * certificate (local_cert) and private key. */ - 'local_pk' => null, + 'local_pk' => env('WSS_LOCAL_PK', null), /* * Passphrase for your local_cert file. */ - 'passphrase' => null, + 'passphrase' => env('WSS_PASSPHRASE', null), + + 'verify_peer' => env('WSS_VERIFY_PEER', false), ], /* diff --git a/package-lock.json b/package-lock.json index 0940e1541..9504ca5a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -797,6 +797,11 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" }, + "@trevoreyre/autocomplete-vue": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@trevoreyre/autocomplete-vue/-/autocomplete-vue-2.0.2.tgz", + "integrity": "sha512-2A/SQjtZOX1/4AAsw/EkblMKw1xH+EJj99K2tRXu8umUpBFWUFk3PXCa7NlBE3fv2YSKf7fGEn1i225xtiulUg==" + }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", @@ -2241,9 +2246,9 @@ } }, "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { "delayed-stream": "~1.0.0" } @@ -2516,6 +2521,11 @@ "sha.js": "^2.4.8" } }, + "cropperjs": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/cropperjs/-/cropperjs-1.5.4.tgz", + "integrity": "sha512-2DczDxhqruvDz+oOUjRTXvsIyUnlSDvWG7r7qaUQioPoZAgfA07kaTtdNXAD/8ezA4CHRk1MT7PFMFQVpcD/1Q==" + }, "cross-env": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz", @@ -4020,7 +4030,8 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "bundled": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -4038,11 +4049,13 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true + "bundled": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4055,15 +4068,18 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true + "bundled": true, + "optional": true }, "concat-map": { "version": "0.0.1", - "bundled": true + "bundled": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "bundled": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -4166,7 +4182,8 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "bundled": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -4176,6 +4193,7 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -4188,17 +4206,20 @@ "minimatch": { "version": "3.0.4", "bundled": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true + "bundled": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -4215,6 +4236,7 @@ "mkdirp": { "version": "0.5.1", "bundled": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -4287,7 +4309,8 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "bundled": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -4297,6 +4320,7 @@ "once": { "version": "1.4.0", "bundled": true, + "optional": true, "requires": { "wrappy": "1" } @@ -4372,7 +4396,8 @@ }, "safe-buffer": { "version": "5.1.2", - "bundled": true + "bundled": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -4402,6 +4427,7 @@ "string-width": { "version": "1.0.2", "bundled": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -4419,6 +4445,7 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -4457,11 +4484,13 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true + "bundled": true, + "optional": true }, "yallist": { "version": "3.0.3", - "bundled": true + "bundled": true, + "optional": true } } }, @@ -5715,9 +5744,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, "lodash._baseassign": { "version": "3.2.0", @@ -7654,9 +7683,9 @@ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", + "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==" }, "public-encrypt": { "version": "4.0.3", @@ -8947,9 +8976,9 @@ } }, "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==" + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" }, "spdy": { "version": "4.0.0", @@ -9838,6 +9867,14 @@ "babel-helper-vue-jsx-merge-props": "^2.0.3" } }, + "vue-cropperjs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/vue-cropperjs/-/vue-cropperjs-4.0.0.tgz", + "integrity": "sha512-9x9HFUN2RPpz+AJ9bvnvbtAytW5Q9WeZcMgXqvaRutaCFNGA29rKkKWpUPRy+gn/rFJ5ZpcC1qZO9Hrd3WeqZA==", + "requires": { + "cropperjs": "^1.1.3" + } + }, "vue-functional-data-merge": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/vue-functional-data-merge/-/vue-functional-data-merge-3.1.0.tgz", diff --git a/public/css/app.css b/public/css/app.css index fa08b2b60..601f94f62 100644 Binary files a/public/css/app.css and b/public/css/app.css differ diff --git a/public/css/appdark.css b/public/css/appdark.css index 18d3d2cb1..b0e3cfd3f 100644 Binary files a/public/css/appdark.css and b/public/css/appdark.css differ diff --git a/public/css/landing.css b/public/css/landing.css index d54ad3f5b..8ab253b47 100644 Binary files a/public/css/landing.css and b/public/css/landing.css differ diff --git a/public/js/ace.js b/public/js/ace.js index b418d0e7c..97bb5535f 100644 Binary files a/public/js/ace.js and b/public/js/ace.js differ diff --git a/public/js/collectioncompose.js b/public/js/collectioncompose.js index d49cadaa4..08e29ca59 100644 Binary files a/public/js/collectioncompose.js and b/public/js/collectioncompose.js differ diff --git a/public/js/collections.js b/public/js/collections.js index f7f5f605f..adacc760e 100644 Binary files a/public/js/collections.js and b/public/js/collections.js differ diff --git a/public/js/compose-classic.js b/public/js/compose-classic.js new file mode 100644 index 000000000..2fc110c35 Binary files /dev/null and b/public/js/compose-classic.js differ diff --git a/public/js/compose.js b/public/js/compose.js index 98cb8a057..81a0800d0 100644 Binary files a/public/js/compose.js and b/public/js/compose.js differ diff --git a/public/js/developers.js b/public/js/developers.js index f13efa935..762be82a9 100644 Binary files a/public/js/developers.js and b/public/js/developers.js differ diff --git a/public/js/discover.js b/public/js/discover.js index 42f879f69..b62111b0f 100644 Binary files a/public/js/discover.js and b/public/js/discover.js differ diff --git a/public/js/hashtag.js b/public/js/hashtag.js index 63ee8c312..7b179502c 100644 Binary files a/public/js/hashtag.js and b/public/js/hashtag.js differ diff --git a/public/js/loops.js b/public/js/loops.js index c6292ebb8..3d7b1ed35 100644 Binary files a/public/js/loops.js and b/public/js/loops.js differ diff --git a/public/js/mode-dot.js b/public/js/mode-dot.js index 23eadee5f..2313ae88e 100644 Binary files a/public/js/mode-dot.js and b/public/js/mode-dot.js differ diff --git a/public/js/profile.js b/public/js/profile.js index 1c121f664..c91af14fe 100644 Binary files a/public/js/profile.js and b/public/js/profile.js differ diff --git a/public/js/quill.js b/public/js/quill.js index c62ddc234..9a7bf8092 100644 Binary files a/public/js/quill.js and b/public/js/quill.js differ diff --git a/public/js/search.js b/public/js/search.js index 7f6cf2ab5..f358e29f3 100644 Binary files a/public/js/search.js and b/public/js/search.js differ diff --git a/public/js/status.js b/public/js/status.js index e19e7c321..8f268fecd 100644 Binary files a/public/js/status.js and b/public/js/status.js differ diff --git a/public/js/theme-monokai.js b/public/js/theme-monokai.js index b287efb10..9175ca7de 100644 Binary files a/public/js/theme-monokai.js and b/public/js/theme-monokai.js differ diff --git a/public/js/timeline.js b/public/js/timeline.js index cea68a81d..2de9076b2 100644 Binary files a/public/js/timeline.js and b/public/js/timeline.js differ diff --git a/public/js/vendor.js b/public/js/vendor.js index fa3004264..e93e9f76d 100644 Binary files a/public/js/vendor.js and b/public/js/vendor.js differ diff --git a/public/mix-manifest.json b/public/mix-manifest.json index 24ba6d842..a580da259 100644 Binary files a/public/mix-manifest.json and b/public/mix-manifest.json differ diff --git a/resources/assets/js/components/ComposeModal.vue b/resources/assets/js/components/ComposeModal.vue index 7599b1bbd..3d9035bf1 100644 --- a/resources/assets/js/components/ComposeModal.vue +++ b/resources/assets/js/components/ComposeModal.vue @@ -1,197 +1,244 @@