diff --git a/app/AccountLog.php b/app/AccountLog.php new file mode 100644 index 00000000..f5ccedd9 --- /dev/null +++ b/app/AccountLog.php @@ -0,0 +1,10 @@ +settings)) { + $settings = new UserSetting; + $settings->user_id = $user->id; + $settings->save(); + } + } +} diff --git a/app/Hashtag.php b/app/Hashtag.php index 497bc94e..6314accc 100644 --- a/app/Hashtag.php +++ b/app/Hashtag.php @@ -6,7 +6,7 @@ use Illuminate\Database\Eloquent\Model; class Hashtag extends Model { - protected $fillable = ['name','slug']; + public $fillable = ['name','slug']; public function posts() { diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index 9f03ef72..3ef8ef27 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -18,15 +18,24 @@ class AccountController extends Controller public function notifications(Request $request) { $this->validate($request, [ - 'page' => 'nullable|min:1|max:3' + 'page' => 'nullable|min:1|max:3', + 'a' => 'nullable|alpha_dash', ]); $profile = Auth::user()->profile; + $action = $request->input('a'); $timeago = Carbon::now()->subMonths(6); - $notifications = Notification::whereProfileId($profile->id) - ->whereDate('created_at', '>', $timeago) - ->orderBy('id','desc') - ->take(30) - ->simplePaginate(); + if($action && in_array($action, ['comment', 'follow', 'mention'])) { + $notifications = Notification::whereProfileId($profile->id) + ->whereAction($action) + ->whereDate('created_at', '>', $timeago) + ->orderBy('id','desc') + ->simplePaginate(30); + } else { + $notifications = Notification::whereProfileId($profile->id) + ->whereDate('created_at', '>', $timeago) + ->orderBy('id','desc') + ->simplePaginate(30); + } return view('account.activity', compact('profile', 'notifications')); } @@ -38,10 +47,19 @@ class AccountController extends Controller public function sendVerifyEmail(Request $request) { - if(EmailVerification::whereUserId(Auth::id())->count() !== 0) { - return redirect()->back()->with('status', 'A verification email has already been sent! Please check your email.'); + $timeLimit = Carbon::now()->subDays(1)->toDateTimeString(); + $recentAttempt = EmailVerification::whereUserId(Auth::id()) + ->where('created_at', '>', $timeLimit)->count(); + $exists = EmailVerification::whereUserId(Auth::id())->count(); + + if($recentAttempt == 1 && $exists == 1) { + return redirect()->back()->with('error', 'A verification email has already been sent recently. Please check your email, or try again later.'); + } elseif ($recentAttempt == 0 && $exists !== 0) { + // Delete old verification and send new one. + EmailVerification::whereUserId(Auth::id())->delete(); } + $user = User::whereNull('email_verified_at')->find(Auth::id()); $utoken = hash('sha512', $user->id); $rtoken = str_random(40); @@ -60,14 +78,15 @@ class AccountController extends Controller public function confirmVerifyEmail(Request $request, $userToken, $randomToken) { - $verify = EmailVerification::where(DB::raw('BINARY user_token'), $userToken) - ->where(DB::raw('BINARY random_token'), $randomToken) + $verify = EmailVerification::where('user_token', $userToken) + ->where('random_token', $randomToken) ->firstOrFail(); + if(Auth::id() === $verify->user_id) { $user = User::find(Auth::id()); $user->email_verified_at = Carbon::now(); $user->save(); - return redirect('/timeline'); + return redirect('/'); } } @@ -95,4 +114,5 @@ class AccountController extends Controller } return $notifications; } + } diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index 83f844da..af596e02 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Auth; +use App\{AccountLog, User}; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\AuthenticatesUsers; @@ -25,7 +26,7 @@ class LoginController extends Controller * * @var string */ - protected $redirectTo = '/home'; + protected $redirectTo = '/'; /** * Create a new controller instance. @@ -56,4 +57,25 @@ class LoginController extends Controller $this->validate($request, $rules); } + + /** + * The user has been authenticated. + * + * @param \Illuminate\Http\Request $request + * @param mixed $user + * @return mixed + */ + protected function authenticated($request, $user) + { + $log = new AccountLog; + $log->user_id = $user->id; + $log->item_id = $user->id; + $log->item_type = 'App\User'; + $log->action = 'auth.login'; + $log->message = 'Account Login'; + $log->link = null; + $log->ip_address = $request->ip(); + $log->user_agent = $request->userAgent(); + $log->save(); + } } diff --git a/app/Http/Controllers/FederationController.php b/app/Http/Controllers/FederationController.php index 29711945..8c2e1ce9 100644 --- a/app/Http/Controllers/FederationController.php +++ b/app/Http/Controllers/FederationController.php @@ -2,8 +2,9 @@ namespace App\Http\Controllers; -use Auth; +use Auth, Cache; use App\Profile; +use Carbon\Carbon; use League\Fractal; use Illuminate\Http\Request; use App\Util\Lexer\Nickname; @@ -13,15 +14,26 @@ use App\Transformer\ActivityPub\{ ProfileTransformer }; use App\Jobs\RemoteFollowPipeline\RemoteFollowPipeline; +use App\Jobs\InboxPipeline\InboxWorker; class FederationController extends Controller { public function authCheck() { if(!Auth::check()) { - abort(403); + return abort(403); } - return; + } + + public function authorizeFollow(Request $request) + { + $this->authCheck(); + $this->validate($request, [ + 'acct' => 'required|string|min:3|max:255' + ]); + $acct = $request->input('acct'); + $nickname = Nickname::normalizeProfileUrl($acct); + return view('federation.authorizefollow', compact('acct', 'nickname')); } public function remoteFollow() @@ -64,61 +76,58 @@ class FederationController extends Controller public function nodeinfo() { - $res = [ - 'metadata' => [ - 'nodeName' => config('app.name'), - 'software' => [ - 'homepage' => 'https://pixelfed.org', - 'github' => 'https://github.com/pixelfed', - 'follow' => 'https://mastodon.social/@pixelfed' - ], - /* - TODO: Custom Features for Trending - 'customFeatures' => [ - 'trending' => [ - 'description' => 'Trending API for federated discovery', - 'api' => [ - 'url' => null, - 'docs' => null - ], + $res = Cache::remember('api:nodeinfo', 60, function() { + return [ + 'metadata' => [ + 'nodeName' => config('app.name'), + 'software' => [ + 'homepage' => 'https://pixelfed.org', + 'github' => 'https://github.com/pixelfed', + 'follow' => 'https://mastodon.social/@pixelfed' ], ], - */ - ], - 'openRegistrations' => config('pixelfed.open_registration'), - 'protocols' => [ - 'activitypub' - ], - 'services' => [ - 'inbound' => [], - 'outbound' => [] - ], - 'software' => [ - 'name' => 'pixelfed', - 'version' => config('pixelfed.version') - ], - 'usage' => [ - 'localPosts' => \App\Status::whereLocal(true)->count(), - 'users' => [ - 'total' => \App\User::count() - ] - ], - 'version' => '2.0' - ]; - - return response()->json($res); + 'openRegistrations' => config('pixelfed.open_registration'), + 'protocols' => [ + 'activitypub' + ], + 'services' => [ + 'inbound' => [], + 'outbound' => [] + ], + 'software' => [ + 'name' => 'pixelfed', + 'version' => config('pixelfed.version') + ], + 'usage' => [ + 'localPosts' => \App\Status::whereLocal(true)->whereHas('media')->count(), + 'localComments' => \App\Status::whereLocal(true)->whereNotNull('in_reply_to_id')->count(), + 'users' => [ + 'total' => \App\User::count(), + 'activeHalfyear' => \App\User::where('updated_at', '>', Carbon::now()->subMonths(6)->toDateTimeString())->count(), + 'activeMonth' => \App\User::where('updated_at', '>', Carbon::now()->subMonths(1)->toDateTimeString())->count(), + ] + ], + 'version' => '2.0' + ]; + }); + return response()->json($res, 200, [], JSON_PRETTY_PRINT); } public function webfinger(Request $request) { - $this->validate($request, ['resource'=>'required']); - $resource = $request->input('resource'); - $parsed = Nickname::normalizeProfileUrl($resource); - $username = $parsed['username']; - $user = Profile::whereUsername($username)->firstOrFail(); - $webfinger = (new Webfinger($user))->generate(); - return response()->json($webfinger); + $this->validate($request, ['resource'=>'required|string|min:3|max:255']); + + $hash = hash('sha512', $request->input('resource')); + + $webfinger = Cache::remember('api:webfinger:'.$hash, 1440, function() use($request) { + $resource = $request->input('resource'); + $parsed = Nickname::normalizeProfileUrl($resource); + $username = $parsed['username']; + $user = Profile::whereUsername($username)->firstOrFail(); + return (new Webfinger($user))->generate(); + }); + return response()->json($webfinger, 200, [], JSON_PRETTY_PRINT); } public function userOutbox(Request $request, $username) @@ -135,4 +144,20 @@ class FederationController extends Controller return response()->json($res['data']); } + public function userInbox(Request $request, $username) + { + if(config('pixelfed.activitypub_enabled') == false) { + abort(403); + } + $mimes = [ + 'application/activity+json', + 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"' + ]; + if(!in_array($request->header('Content-Type'), $mimes)) { + abort(500, 'Invalid request'); + } + $profile = Profile::whereUsername($username)->firstOrFail(); + InboxWorker::dispatch($request, $profile, $request->all()); + } + } diff --git a/app/Http/Controllers/ImportDataController.php b/app/Http/Controllers/ImportDataController.php deleted file mode 100644 index 1b0a12e6..00000000 --- a/app/Http/Controllers/ImportDataController.php +++ /dev/null @@ -1,10 +0,0 @@ -likes()->whereProfileId($profile->id)->count() !== 0) { $like = Like::whereProfileId($profile->id)->whereStatusId($status->id)->firstOrFail(); - $like->delete(); + $like->forceDelete(); $count--; } else { $like = new Like; @@ -35,9 +35,15 @@ class LikeController extends Controller $like->status_id = $status->id; $like->save(); $count++; + LikePipeline::dispatch($like); } - LikePipeline::dispatch($like); + $likes = Like::whereProfileId($profile->id) + ->orderBy('id', 'desc') + ->take(1000) + ->pluck('status_id'); + + Cache::put('api:like-ids:user:'.$profile->id, $likes, 1440); if($request->ajax()) { $response = ['code' => 200, 'msg' => 'Like saved', 'count' => $count]; diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index 4e25bd23..05299b1a 100644 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -18,17 +18,22 @@ class ProfileController extends Controller public function show(Request $request, $username) { $user = Profile::whereUsername($username)->firstOrFail(); + $settings = User::whereUsername($username)->firstOrFail()->settings; $mimes = [ 'application/activity+json', - 'application/ld+json', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"' ]; if(in_array($request->header('accept'), $mimes) && config('pixelfed.activitypub_enabled')) { return $this->showActivityPub($request, $user); } - + if($user->is_private == true) { + $can_access = $this->privateProfileCheck($user); + if($can_access !== true) { + abort(403); + } + } // TODO: refactor this mess $owner = Auth::check() && Auth::id() === $user->user_id; $is_following = ($owner == false && Auth::check()) ? $user->followedBy(Auth::user()->profile) : false; @@ -36,11 +41,26 @@ class ProfileController extends Controller $timeline = $user->statuses() ->whereHas('media') ->whereNull('in_reply_to_id') - ->orderBy('id','desc') + ->orderBy('created_at','desc') ->withCount(['comments', 'likes']) ->simplePaginate(21); - return view('profile.show', compact('user', 'owner', 'is_following', 'is_admin', 'timeline')); + return view('profile.show', compact('user', 'settings', 'owner', 'is_following', 'is_admin', 'timeline')); + } + + protected function privateProfileCheck(Profile $profile) + { + if(Auth::check() === false) { + return false; + } + + $follower_ids = (array) $profile->followers()->pluck('followers.profile_id'); + $pid = Auth::user()->profile->id; + if(!in_array($pid, $follower_ids) && $pid !== $profile->id) { + return false; + } + + return true; } public function showActivityPub(Request $request, $user) diff --git a/app/Http/Controllers/SettingsController.php b/app/Http/Controllers/SettingsController.php index 4beb4541..48ca6150 100644 --- a/app/Http/Controllers/SettingsController.php +++ b/app/Http/Controllers/SettingsController.php @@ -3,8 +3,8 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; -use App\{Profile, User}; -use Auth; +use App\{AccountLog, Profile, User}; +use Auth, DB; class SettingsController extends Controller { @@ -89,6 +89,34 @@ class SettingsController extends Controller return view('settings.avatar'); } + public function accessibility() + { + $settings = Auth::user()->settings; + return view('settings.accessibility', compact('settings')); + } + + public function accessibilityStore(Request $request) + { + $settings = Auth::user()->settings; + $fields = [ + 'compose_media_descriptions', + 'reduce_motion', + 'optimize_screen_reader', + 'high_contrast_mode', + 'video_autoplay' + ]; + foreach($fields as $field) { + $form = $request->input($field); + if($form == 'on') { + $settings->{$field} = true; + } else { + $settings->{$field} = false; + } + $settings->save(); + } + return redirect(route('settings.accessibility'))->with('status', 'Settings successfully updated!'); + } + public function notifications() { return view('settings.notifications'); @@ -96,12 +124,61 @@ class SettingsController extends Controller public function privacy() { - return view('settings.privacy'); + $settings = Auth::user()->settings; + $is_private = Auth::user()->profile->is_private; + $settings['is_private'] = (bool) $is_private; + return view('settings.privacy', compact('settings')); + } + + public function privacyStore(Request $request) + { + $settings = Auth::user()->settings; + $profile = Auth::user()->profile; + $fields = [ + 'is_private', + 'crawlable', + ]; + foreach($fields as $field) { + $form = $request->input($field); + if($field == 'is_private') { + if($form == 'on') { + $profile->{$field} = true; + $settings->show_guests = false; + $settings->show_discover = false; + $profile->save(); + } else { + $profile->{$field} = false; + $profile->save(); + } + } elseif($field == 'crawlable') { + if($form == 'on') { + $settings->{$field} = false; + } else { + $settings->{$field} = true; + } + } else { + if($form == 'on') { + $settings->{$field} = true; + } else { + $settings->{$field} = false; + } + } + $settings->save(); + } + return redirect(route('settings.privacy'))->with('status', 'Settings successfully updated!'); } public function security() { - return view('settings.security'); + $sessions = DB::table('sessions') + ->whereUserId(Auth::id()) + ->limit(20) + ->get(); + $activity = AccountLog::whereUserId(Auth::id()) + ->orderBy('created_at','desc') + ->limit(50) + ->get(); + return view('settings.security', compact('sessions', 'activity')); } public function applications() @@ -121,7 +198,7 @@ class SettingsController extends Controller public function dataImportInstagram() { - return view('settings.import.ig'); + return view('settings.import.instagram.home'); } public function developers() diff --git a/app/Http/Controllers/SiteController.php b/app/Http/Controllers/SiteController.php index 31603176..e90f4789 100644 --- a/app/Http/Controllers/SiteController.php +++ b/app/Http/Controllers/SiteController.php @@ -2,11 +2,39 @@ namespace App\Http\Controllers; -use App; +use App, Auth; use Illuminate\Http\Request; +use App\{Follower, Status, User}; class SiteController extends Controller { + + public function home() + { + if(Auth::check()) { + return $this->homeTimeline(); + } else { + return $this->homeGuest(); + } + } + + public function homeGuest() + { + return view('site.index'); + } + + public function homeTimeline() + { + // TODO: Use redis for timelines + $following = Follower::whereProfileId(Auth::user()->profile->id)->pluck('following_id'); + $following->push(Auth::user()->profile->id); + $timeline = Status::whereIn('profile_id', $following) + ->orderBy('id','desc') + ->withCount(['comments', 'likes', 'shares']) + ->simplePaginate(10); + return view('timeline.template', compact('timeline')); + } + public function changeLocale(Request $request, $locale) { if(!App::isLocale($locale)) { diff --git a/app/Http/Middleware/EmailVerificationCheck.php b/app/Http/Middleware/EmailVerificationCheck.php index 04ee1fb1..b9ff791d 100644 --- a/app/Http/Middleware/EmailVerificationCheck.php +++ b/app/Http/Middleware/EmailVerificationCheck.php @@ -18,7 +18,7 @@ class EmailVerificationCheck if($request->user() && config('pixelfed.enforce_email_verification') && is_null($request->user()->email_verified_at) && - !$request->is('i/verify-email') && !$request->is('login') && + !$request->is('i/verify-email') && !$request->is('log*') && !$request->is('i/confirm-email/*') ) { return redirect('/i/verify-email'); diff --git a/app/Report.php b/app/ImportJob.php similarity index 71% rename from app/Report.php rename to app/ImportJob.php index a57f84ac..dc0e1cda 100644 --- a/app/Report.php +++ b/app/ImportJob.php @@ -4,7 +4,7 @@ namespace App; use Illuminate\Database\Eloquent\Model; -class Report extends Model +class ImportJob extends Model { // } diff --git a/app/Jobs/InboxPipeline/InboxWorker.php b/app/Jobs/InboxPipeline/InboxWorker.php new file mode 100644 index 00000000..db65c358 --- /dev/null +++ b/app/Jobs/InboxPipeline/InboxWorker.php @@ -0,0 +1,43 @@ +request = $request; + $this->profile = $profile; + $this->payload = $payload; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + (new Inbox($this->request, $this->profile, $this->payload))->handle(); + } + +} diff --git a/app/Jobs/InboxPipeline/SharedInboxWorker.php b/app/Jobs/InboxPipeline/SharedInboxWorker.php new file mode 100644 index 00000000..dcc0db28 --- /dev/null +++ b/app/Jobs/InboxPipeline/SharedInboxWorker.php @@ -0,0 +1,41 @@ +request = $request; + $this->payload = $payload; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + (new Inbox($this->request, null, $this->payload))->handleSharedInbox(); + } +} diff --git a/app/Jobs/LikePipeline/LikePipeline.php b/app/Jobs/LikePipeline/LikePipeline.php index 9d53fd8b..8eccd726 100644 --- a/app/Jobs/LikePipeline/LikePipeline.php +++ b/app/Jobs/LikePipeline/LikePipeline.php @@ -37,6 +37,11 @@ class LikePipeline implements ShouldQueue $status = $this->like->status; $actor = $this->like->actor; + if($status->url !== null) { + // Ignore notifications to remote statuses + return; + } + $exists = Notification::whereProfileId($status->profile_id) ->whereActorId($actor->id) ->whereAction('like') diff --git a/app/Jobs/StatusPipeline/StatusEntityLexer.php b/app/Jobs/StatusPipeline/StatusEntityLexer.php index c9dff4d5..d04a7dd5 100644 --- a/app/Jobs/StatusPipeline/StatusEntityLexer.php +++ b/app/Jobs/StatusPipeline/StatusEntityLexer.php @@ -2,7 +2,7 @@ namespace App\Jobs\StatusPipeline; -use Cache; +use DB, Cache; use App\{ Hashtag, Media, @@ -68,12 +68,14 @@ class StatusEntityLexer implements ShouldQueue public function storeEntities() { - $status = $this->status; $this->storeHashtags(); $this->storeMentions(); - $status->rendered = $this->autolink; - $status->entities = json_encode($this->entities); - $status->save(); + DB::transaction(function () { + $status = $this->status; + $status->rendered = $this->autolink; + $status->entities = json_encode($this->entities); + $status->save(); + }); } public function storeHashtags() @@ -82,17 +84,15 @@ class StatusEntityLexer implements ShouldQueue $status = $this->status; foreach($tags as $tag) { - $slug = str_slug($tag); - - $htag = Hashtag::firstOrCreate( - ['name' => $tag], - ['slug' => $slug] - ); - - StatusHashtag::firstOrCreate( - ['status_id' => $status->id], - ['hashtag_id' => $htag->id] - ); + DB::transaction(function () use ($status, $tag) { + $slug = str_slug($tag); + $hashtag = Hashtag::firstOrCreate( + ['name' => $tag, 'slug' => $slug] + ); + StatusHashtag::firstOrCreate( + ['status_id' => $status->id, 'hashtag_id' => $hashtag->id] + ); + }); } } @@ -102,16 +102,18 @@ class StatusEntityLexer implements ShouldQueue $status = $this->status; foreach($mentions as $mention) { - $mentioned = Profile::whereUsername($mention)->first(); + $mentioned = Profile::whereUsername($mention)->firstOrFail(); if(empty($mentioned) || !isset($mentioned->id)) { continue; } - - $m = new Mention; - $m->status_id = $status->id; - $m->profile_id = $mentioned->id; - $m->save(); + + DB::transaction(function () use ($status, $mentioned) { + $m = new Mention; + $m->status_id = $status->id; + $m->profile_id = $mentioned->id; + $m->save(); + }); MentionPipeline::dispatch($status, $m); } diff --git a/app/Media.php b/app/Media.php index 7c913896..7ac547f3 100644 --- a/app/Media.php +++ b/app/Media.php @@ -23,4 +23,11 @@ class Media extends Model $url = Storage::url($path); return url($url); } + + public function thumbnailUrl() + { + $path = $this->thumbnail_path; + $url = Storage::url($path); + return url($url); + } } diff --git a/app/Observer/UserObserver.php b/app/Observer/UserObserver.php index e9104283..6f2a1dfc 100644 --- a/app/Observer/UserObserver.php +++ b/app/Observer/UserObserver.php @@ -2,7 +2,7 @@ namespace App\Observers; -use App\{Profile, User}; +use App\{Profile, User, UserSetting}; use App\Jobs\AvatarPipeline\CreateAvatar; class UserObserver @@ -36,6 +36,12 @@ class UserObserver CreateAvatar::dispatch($profile); } + + if(empty($user->settings)) { + $settings = new UserSetting; + $settings->user_id = $user->id; + $settings->save(); + } } } \ No newline at end of file diff --git a/app/Profile.php b/app/Profile.php index 009ed2cb..91475ca7 100644 --- a/app/Profile.php +++ b/app/Profile.php @@ -29,6 +29,15 @@ class Profile extends Model } public function url($suffix = '') + { + if($this->remote_url) { + return $this->remote_url; + } else { + return url($this->username . $suffix); + } + } + + public function localUrl($suffix = '') { return url($this->username . $suffix); } @@ -124,4 +133,9 @@ class Profile extends Model $url = url(Storage::url($this->avatar->media_path ?? 'public/avatars/default.png')); return $url; } + + public function statusCount() + { + return $this->statuses()->whereHas('media')->count(); + } } diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index fca6152c..d05aed73 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -16,6 +16,9 @@ class EventServiceProvider extends ServiceProvider 'App\Events\Event' => [ 'App\Listeners\EventListener', ], + 'auth.login' => [ + 'App\Events\AuthLoginEvent', + ], ]; /** diff --git a/app/ReportComment.php b/app/ReportComment.php new file mode 100644 index 00000000..5d364e1e --- /dev/null +++ b/app/ReportComment.php @@ -0,0 +1,10 @@ +hasMany(Like::class); } + public function liked() : bool + { + $profile = Auth::user()->profile; + return Like::whereProfileId($profile->id)->whereStatusId($this->id)->count(); + } + public function comments() { return $this->hasMany(Status::class, 'in_reply_to_id'); } + public function bookmarked() + { + $profile = Auth::user()->profile; + return Bookmark::whereProfileId($profile->id)->whereStatusId($this->id)->count(); + } + + public function shares() + { + return $this->hasMany(Status::class, 'reblog_of_id'); + } + + public function shared() : bool + { + $profile = Auth::user()->profile; + return Status::whereProfileId($profile->id)->whereReblogOfId($this->id)->count(); + } + public function parent() { - if(!empty($this->in_reply_to_id)) { - return Status::findOrFail($this->in_reply_to_id); + $parent = $this->in_reply_to_id ?? $this->reblog_of_id; + if(!empty($parent)) { + return Status::findOrFail($parent); } } @@ -100,6 +124,23 @@ class Status extends Model ); } + public function mentions() + { + return $this->hasManyThrough( + Profile::class, + Mention::class, + 'status_id', + 'id', + 'id', + 'profile_id' + ); + } + + public function reportUrl() + { + return route('report.form') . "?type=post&id={$this->id}"; + } + public function toActivityStream() { $media = $this->media; diff --git a/app/StatusHashtag.php b/app/StatusHashtag.php index 7ceac056..3d15b203 100644 --- a/app/StatusHashtag.php +++ b/app/StatusHashtag.php @@ -6,5 +6,5 @@ use Illuminate\Database\Eloquent\Model; class StatusHashtag extends Model { - protected $fillable = ['status_id', 'hashtag_id']; + public $fillable = ['status_id', 'hashtag_id']; } diff --git a/app/Transformer/Api/AccountTransformer.php b/app/Transformer/Api/AccountTransformer.php new file mode 100644 index 00000000..1f95c813 --- /dev/null +++ b/app/Transformer/Api/AccountTransformer.php @@ -0,0 +1,33 @@ + $profile->id, + 'username' => $profile->username, + 'acct' => $profile->username, + 'display_name' => $profile->name, + 'locked' => (bool) $profile->is_private, + 'created_at' => $profile->created_at->format('c'), + 'followers_count' => $profile->followerCount(), + 'following_count' => $profile->followingCount(), + 'statuses_count' => $profile->statusCount(), + 'note' => $profile->bio, + 'url' => $profile->url(), + 'avatar' => $profile->avatarUrl(), + 'avatar_static' => $profile->avatarUrl(), + 'header' => '', + 'header_static' => '', + 'moved' => null, + 'fields' => null, + 'bot' => null + ]; + } +} \ No newline at end of file diff --git a/app/Transformer/Api/ApplicationTransformer.php b/app/Transformer/Api/ApplicationTransformer.php new file mode 100644 index 00000000..a0fefcaa --- /dev/null +++ b/app/Transformer/Api/ApplicationTransformer.php @@ -0,0 +1,16 @@ + '', + 'website' => null + ]; + } +} \ No newline at end of file diff --git a/app/Transformer/Api/HashtagTransformer.php b/app/Transformer/Api/HashtagTransformer.php new file mode 100644 index 00000000..417cc985 --- /dev/null +++ b/app/Transformer/Api/HashtagTransformer.php @@ -0,0 +1,18 @@ + $hashtag->name, + 'url' => $hashtag->url(), + ]; + } +} \ No newline at end of file diff --git a/app/Transformer/Api/MediaTransformer.php b/app/Transformer/Api/MediaTransformer.php new file mode 100644 index 00000000..959bae65 --- /dev/null +++ b/app/Transformer/Api/MediaTransformer.php @@ -0,0 +1,24 @@ + $media->id, + 'type' => 'image', + 'url' => $media->url(), + 'remote_url' => null, + 'preview_url' => $media->thumbnailUrl(), + 'text_url' => null, + 'meta' => null, + 'description' => null + ]; + } +} \ No newline at end of file diff --git a/app/Transformer/Api/MentionTransformer.php b/app/Transformer/Api/MentionTransformer.php new file mode 100644 index 00000000..1d0580af --- /dev/null +++ b/app/Transformer/Api/MentionTransformer.php @@ -0,0 +1,19 @@ + $profile->id, + 'url' => $profile->url(), + 'username' => $profile->username, + 'acct' => $profile->username, + ]; + } +} \ No newline at end of file diff --git a/app/Transformer/Api/StatusTransformer.php b/app/Transformer/Api/StatusTransformer.php new file mode 100644 index 00000000..ad5129a9 --- /dev/null +++ b/app/Transformer/Api/StatusTransformer.php @@ -0,0 +1,69 @@ + $status->id, + 'uri' => $status->url(), + 'url' => $status->url(), + 'in_reply_to_id' => $status->in_reply_to_id, + 'in_reply_to_account_id' => $status->in_reply_to_profile_id, + + // TODO: fixme + 'reblog' => null, + + 'content' => "

$status->rendered

", + 'created_at' => $status->created_at->format('c'), + 'emojis' => [], + 'reblogs_count' => $status->shares()->count(), + 'favourites_count' => $status->likes()->count(), + 'reblogged' => $status->shared(), + 'favourited' => $status->liked(), + 'muted' => null, + 'sensitive' => (bool) $status->is_nsfw, + 'spoiler_text' => '', + 'visibility' => $status->visibility, + 'application' => null, + 'language' => null, + 'pinned' => null + ]; + } + + public function includeAccount(Status $status) + { + $account = $status->profile; + return $this->item($account, new AccountTransformer); + } + + public function includeMentions(Status $status) + { + $mentions = $status->mentions; + return $this->collection($mentions, new MentionTransformer); + } + + public function includeMediaAttachments(Status $status) + { + $media = $status->media; + return $this->collection($media, new MediaTransformer); + } + + public function includeTags(Status $status) + { + $tags = $status->hashtags; + return $this->collection($tags, new HashtagTransformer); + } +} \ No newline at end of file diff --git a/app/User.php b/app/User.php index 38edc3e9..a3fb76fb 100644 --- a/app/User.php +++ b/app/User.php @@ -15,7 +15,7 @@ class User extends Authenticatable * * @var array */ - protected $dates = ['deleted_at']; + protected $dates = ['deleted_at', 'email_verified_at']; /** * The attributes that are mass assignable. @@ -44,4 +44,9 @@ class User extends Authenticatable { return url(config('app.url') . '/' . $this->username); } + + public function settings() + { + return $this->hasOne(UserSetting::class); + } } diff --git a/app/UserFilter.php b/app/UserFilter.php new file mode 100644 index 00000000..071f2eeb --- /dev/null +++ b/app/UserFilter.php @@ -0,0 +1,10 @@ +=5.5", - "psr/http-message": "^1.0" + "illuminate/support": "5.2.*|5.3.*|5.4.*|5.5.*|5.6.*", + "php": "^7.1", + "vlucas/phpdotenv": "~2.5" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^1.11", - "guzzlehttp/psr7": "^1.2", - "phpunit/phpunit": "~4.8", - "symfony/http-foundation": "~2.8|~3.0", - "symfony/psr-http-message-bridge": "^1.0", - "zendframework/zend-diactoros": "^1.1" + "larapack/dd": "^1.0", + "mockery/mockery": "^1.0", + "orchestra/testbench": "~3.5", + "phpunit/phpunit": "^7.0" }, "type": "library", + "extra": { + "laravel": { + "providers": [ + "BeyondCode\\SelfDiagnosis\\SelfDiagnosisServiceProvider" + ] + } + }, "autoload": { "psr-4": { - "HttpSignatures\\": "src/" + "BeyondCode\\SelfDiagnosis\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -45,75 +50,19 @@ ], "authors": [ { - "name": "Paul Annesley", - "email": "paul@99designs.com" + "name": "Marcel Pociot", + "email": "marcel@beyondco.de", + "homepage": "https://beyondcode.de", + "role": "Developer" } ], - "description": "Sign and verify HTTP messages", + "description": "Perform various self diagnosis tests on your Laravel application.", + "homepage": "https://github.com/beyondcode/laravel-self-diagnosis", "keywords": [ - "hmac", - "http", - "https", - "signature", - "signed", - "signing" + "beyondcode", + "laravel-self-diagnosis" ], - "time": "2017-05-04T01:36:17+00:00" - }, - { - "name": "99designs/http-signatures-guzzlehttp", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/99designs/http-signatures-guzzlehttp.git", - "reference": "920ddd3cfbfae4c11a0f7c3b44699c01ae8cb203" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/99designs/http-signatures-guzzlehttp/zipball/920ddd3cfbfae4c11a0f7c3b44699c01ae8cb203", - "reference": "920ddd3cfbfae4c11a0f7c3b44699c01ae8cb203", - "shasum": "" - }, - "require": { - "99designs/http-signatures": ">=3.0.0 <5.0.0", - "guzzlehttp/guzzle": ">=6.0 <7.0.0", - "php": ">=5.5.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Adrian Palmer", - "email": "adrian.palmer@99designs.com" - }, - { - "name": "Ruben de Vries", - "email": "ruben@rubensayshi.com" - } - ], - "description": "Sign and verify HTTP messages with Guzzle 6", - "homepage": "https://github.com/99designs/http-signatures-guzzlehttp", - "keywords": [ - "guzzle 6", - "hmac", - "http", - "https", - "signature", - "signed", - "signing" - ], - "time": "2017-05-04T02:00:20+00:00" + "time": "2018-07-08T19:24:58+00:00" }, { "name": "bitverse/identicon", @@ -156,16 +105,16 @@ }, { "name": "cakephp/chronos", - "version": "1.1.4", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/cakephp/chronos.git", - "reference": "85bcaea6a832684b32ef54b2487b0c14a172e9e6" + "reference": "243bb7bc3411b549e190703dbef49a96be5b4233" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/chronos/zipball/85bcaea6a832684b32ef54b2487b0c14a172e9e6", - "reference": "85bcaea6a832684b32ef54b2487b0c14a172e9e6", + "url": "https://api.github.com/repos/cakephp/chronos/zipball/243bb7bc3411b549e190703dbef49a96be5b4233", + "reference": "243bb7bc3411b549e190703dbef49a96be5b4233", "shasum": "" }, "require": { @@ -173,15 +122,15 @@ }, "require-dev": { "athletic/athletic": "~0.1", - "cakephp/cakephp-codesniffer": "~2.3", + "cakephp/cakephp-codesniffer": "^3.0", "phpbench/phpbench": "@dev", "phpstan/phpstan": "^0.6.4", - "phpunit/phpunit": "<6.0" + "phpunit/phpunit": "<6.0 || ^7.0" }, "type": "library", "autoload": { "psr-4": { - "Cake\\Chronos\\": "src" + "Cake\\Chronos\\": "src/" }, "files": [ "src/carbon_compat.php" @@ -209,7 +158,70 @@ "datetime", "time" ], - "time": "2018-01-13T12:19:50+00:00" + "time": "2018-06-23T01:51:58+00:00" + }, + { + "name": "defuse/php-encryption", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/defuse/php-encryption.git", + "reference": "0d4d27c368ca6798bc162469e43248c363c73495" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/defuse/php-encryption/zipball/0d4d27c368ca6798bc162469e43248c363c73495", + "reference": "0d4d27c368ca6798bc162469e43248c363c73495", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "paragonie/random_compat": "~2.0", + "php": ">=5.4.0" + }, + "require-dev": { + "nikic/php-parser": "^2.0|^3.0|^4.0", + "phpunit/phpunit": "^4|^5" + }, + "bin": [ + "bin/generate-defuse-key" + ], + "type": "library", + "autoload": { + "psr-4": { + "Defuse\\Crypto\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Hornby", + "email": "taylor@defuse.ca", + "homepage": "https://defuse.ca/" + }, + { + "name": "Scott Arciszewski", + "email": "info@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "Secure PHP Encryption Library", + "keywords": [ + "aes", + "authenticated encryption", + "cipher", + "crypto", + "cryptography", + "encrypt", + "encryption", + "openssl", + "security", + "symmetric key cryptography" + ], + "time": "2018-04-23T19:33:40+00:00" }, { "name": "dnoegel/php-xdg-base-dir", @@ -724,16 +736,16 @@ }, { "name": "dragonmantank/cron-expression", - "version": "v2.1.0", + "version": "v2.2.0", "source": { "type": "git", "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "3f00985deec8df53d4cc1e5c33619bda1ee309a5" + "reference": "92a2c3768d50e21a1f26a53cb795ce72806266c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/3f00985deec8df53d4cc1e5c33619bda1ee309a5", - "reference": "3f00985deec8df53d4cc1e5c33619bda1ee309a5", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/92a2c3768d50e21a1f26a53cb795ce72806266c5", + "reference": "92a2c3768d50e21a1f26a53cb795ce72806266c5", "shasum": "" }, "require": { @@ -769,7 +781,7 @@ "cron", "schedule" ], - "time": "2018-04-06T15:51:55+00:00" + "time": "2018-06-06T03:12:17+00:00" }, { "name": "egulias/email-validator", @@ -928,6 +940,52 @@ ], "time": "2018-02-07T20:20:57+00:00" }, + { + "name": "firebase/php-jwt", + "version": "v5.0.0", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/9984a4d3a32ae7673d6971ea00bae9d0a1abba0e", + "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": " 4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "time": "2017-06-27T22:17:23+00:00" + }, { "name": "greggilbert/recaptcha", "version": "dev-master", @@ -1366,16 +1424,16 @@ }, { "name": "laravel/framework", - "version": "v5.6.23", + "version": "v5.6.26", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "f547f0a71a12763d1adb8493237d541c9e3a5d10" + "reference": "7047df295e77cecb6a2f84736a732af66cc6789c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/f547f0a71a12763d1adb8493237d541c9e3a5d10", - "reference": "f547f0a71a12763d1adb8493237d541c9e3a5d10", + "url": "https://api.github.com/repos/laravel/framework/zipball/7047df295e77cecb6a2f84736a732af66cc6789c", + "reference": "7047df295e77cecb6a2f84736a732af66cc6789c", "shasum": "" }, "require": { @@ -1501,20 +1559,20 @@ "framework", "laravel" ], - "time": "2018-05-22T14:55:57+00:00" + "time": "2018-06-20T14:21:11+00:00" }, { "name": "laravel/horizon", - "version": "v1.2.3", + "version": "v1.3.1", "source": { "type": "git", "url": "https://github.com/laravel/horizon.git", - "reference": "36ef9e2d6e09e617cf801050326a69e876ff5535" + "reference": "342c4ddf6dda7c7ed21e57566f202b96e28afb6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/horizon/zipball/36ef9e2d6e09e617cf801050326a69e876ff5535", - "reference": "36ef9e2d6e09e617cf801050326a69e876ff5535", + "url": "https://api.github.com/repos/laravel/horizon/zipball/342c4ddf6dda7c7ed21e57566f202b96e28afb6b", + "reference": "342c4ddf6dda7c7ed21e57566f202b96e28afb6b", "shasum": "" }, "require": { @@ -1569,7 +1627,76 @@ "laravel", "queue" ], - "time": "2018-03-13T18:00:18+00:00" + "time": "2018-06-21T09:19:40+00:00" + }, + { + "name": "laravel/passport", + "version": "v6.0.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/passport.git", + "reference": "3abbbca3c58a1a07968bd94096a31891fdb48cad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/passport/zipball/3abbbca3c58a1a07968bd94096a31891fdb48cad", + "reference": "3abbbca3c58a1a07968bd94096a31891fdb48cad", + "shasum": "" + }, + "require": { + "firebase/php-jwt": "~3.0|~4.0|~5.0", + "guzzlehttp/guzzle": "~6.0", + "illuminate/auth": "~5.6", + "illuminate/console": "~5.6", + "illuminate/container": "~5.6", + "illuminate/contracts": "~5.6", + "illuminate/database": "~5.6", + "illuminate/encryption": "~5.6", + "illuminate/http": "~5.6", + "illuminate/support": "~5.6", + "league/oauth2-server": "^7.0", + "php": ">=7.1", + "phpseclib/phpseclib": "^2.0", + "symfony/psr-http-message-bridge": "~1.0", + "zendframework/zend-diactoros": "~1.0" + }, + "require-dev": { + "mockery/mockery": "~1.0", + "phpunit/phpunit": "~6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.0-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Passport\\PassportServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Passport\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Passport provides OAuth2 server support to Laravel.", + "keywords": [ + "laravel", + "oauth", + "passport" + ], + "time": "2018-06-20T14:33:24+00:00" }, { "name": "laravel/tinker", @@ -1634,6 +1761,114 @@ ], "time": "2018-05-17T13:42:07+00:00" }, + { + "name": "lcobucci/jwt", + "version": "3.2.2", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/jwt.git", + "reference": "0b5930be73582369e10c4d4bb7a12bac927a203c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/0b5930be73582369e10c4d4bb7a12bac927a203c", + "reference": "0b5930be73582369e10c4d4bb7a12bac927a203c", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "php": ">=5.5" + }, + "require-dev": { + "mdanter/ecc": "~0.3.1", + "mikey179/vfsstream": "~1.5", + "phpmd/phpmd": "~2.2", + "phpunit/php-invoker": "~1.1", + "phpunit/phpunit": "~4.5", + "squizlabs/php_codesniffer": "~2.3" + }, + "suggest": { + "mdanter/ecc": "Required to use Elliptic Curves based algorithms." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Lcobucci\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Luís Otávio Cobucci Oblonczyk", + "email": "lcobucci@gmail.com", + "role": "Developer" + } + ], + "description": "A simple library to work with JSON Web Token and JSON Web Signature", + "keywords": [ + "JWS", + "jwt" + ], + "time": "2017-09-01T08:23:26+00:00" + }, + { + "name": "league/event", + "version": "2.1.2", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/event.git", + "reference": "e4bfc88dbcb60c8d8a2939a71f9813e141bbe4cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/event/zipball/e4bfc88dbcb60c8d8a2939a71f9813e141bbe4cd", + "reference": "e4bfc88dbcb60c8d8a2939a71f9813e141bbe4cd", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "~1.0.1", + "phpspec/phpspec": "~2.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Event\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Event package", + "keywords": [ + "emitter", + "event", + "listener" + ], + "time": "2015-05-21T12:24:47+00:00" + }, { "name": "league/flysystem", "version": "1.0.45", @@ -1719,45 +1954,42 @@ "time": "2018-05-07T08:44:23+00:00" }, { - "name": "league/fractal", - "version": "0.17.0", + "name": "league/oauth2-server", + "version": "7.2.0", "source": { "type": "git", - "url": "https://github.com/thephpleague/fractal.git", - "reference": "a0b350824f22fc2fdde2500ce9d6851a3f275b0e" + "url": "https://github.com/thephpleague/oauth2-server.git", + "reference": "8184f771d43ea7305ddbb893d0daf6f0352ec5fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/fractal/zipball/a0b350824f22fc2fdde2500ce9d6851a3f275b0e", - "reference": "a0b350824f22fc2fdde2500ce9d6851a3f275b0e", + "url": "https://api.github.com/repos/thephpleague/oauth2-server/zipball/8184f771d43ea7305ddbb893d0daf6f0352ec5fd", + "reference": "8184f771d43ea7305ddbb893d0daf6f0352ec5fd", "shasum": "" }, "require": { - "php": ">=5.4" + "defuse/php-encryption": "^2.1", + "ext-openssl": "*", + "lcobucci/jwt": "^3.2.2", + "league/event": "^2.1", + "php": ">=7.0.0", + "psr/http-message": "^1.0.1" + }, + "replace": { + "league/oauth2server": "*", + "lncd/oauth2": "*" }, "require-dev": { - "doctrine/orm": "^2.5", - "illuminate/contracts": "~5.0", - "mockery/mockery": "~0.9", - "pagerfanta/pagerfanta": "~1.0.0", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~1.5", - "zendframework/zend-paginator": "~2.3" - }, - "suggest": { - "illuminate/pagination": "The Illuminate Pagination component.", - "pagerfanta/pagerfanta": "Pagerfanta Paginator", - "zendframework/zend-paginator": "Zend Framework Paginator" + "phpstan/phpstan": "^0.9.2", + "phpstan/phpstan-phpunit": "^0.9.4", + "phpstan/phpstan-strict-rules": "^0.9.0", + "phpunit/phpunit": "^6.3 || ^7.0", + "zendframework/zend-diactoros": "^1.3.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.13-dev" - } - }, "autoload": { "psr-4": { - "League\\Fractal\\": "src" + "League\\OAuth2\\Server\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1766,21 +1998,30 @@ ], "authors": [ { - "name": "Phil Sturgeon", - "email": "me@philsturgeon.uk", - "homepage": "http://philsturgeon.uk/", + "name": "Alex Bilbie", + "email": "hello@alexbilbie.com", + "homepage": "http://www.alexbilbie.com", "role": "Developer" } ], - "description": "Handle the output of complex data structures ready for API output.", - "homepage": "http://fractal.thephpleague.com/", + "description": "A lightweight and powerful OAuth 2.0 authorization and resource server library with support for all the core specification grants. This library will allow you to secure your API with OAuth and allow your applications users to approve apps that want to access their data from your API.", + "homepage": "https://oauth2.thephpleague.com/", "keywords": [ + "Authentication", "api", - "json", - "league", - "rest" + "auth", + "authorisation", + "authorization", + "oauth", + "oauth 2", + "oauth 2.0", + "oauth2", + "protect", + "resource", + "secure", + "server" ], - "time": "2017-06-12T11:04:56+00:00" + "time": "2018-06-23T16:57:59+00:00" }, { "name": "monolog/monolog", @@ -1860,6 +2101,55 @@ ], "time": "2017-06-19T01:22:40+00:00" }, + { + "name": "moontoast/math", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/ramsey/moontoast-math.git", + "reference": "c2792a25df5cad4ff3d760dd37078fc5b6fccc79" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/moontoast-math/zipball/c2792a25df5cad4ff3d760dd37078fc5b6fccc79", + "reference": "c2792a25df5cad4ff3d760dd37078fc5b6fccc79", + "shasum": "" + }, + "require": { + "ext-bcmath": "*", + "php": ">=5.3.3" + }, + "require-dev": { + "jakub-onderka/php-parallel-lint": "^0.9.0", + "phpunit/phpunit": "^4.7|>=5.0 <5.4", + "satooshi/php-coveralls": "^0.6.1", + "squizlabs/php_codesniffer": "^2.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Moontoast\\Math\\": "src/Moontoast/Math/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A mathematics library, providing functionality for large numbers", + "homepage": "https://github.com/ramsey/moontoast-math", + "keywords": [ + "bcmath", + "math" + ], + "time": "2017-02-16T16:54:46+00:00" + }, { "name": "nesbot/carbon", "version": "1.25.0", @@ -1915,16 +2205,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.0.1", + "version": "v4.0.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "e4a54fa90a5cd8e8dd3fb4099942681731c5cdd3" + "reference": "35b8caf75e791ba1b2d24fec1552168d72692b12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/e4a54fa90a5cd8e8dd3fb4099942681731c5cdd3", - "reference": "e4a54fa90a5cd8e8dd3fb4099942681731c5cdd3", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/35b8caf75e791ba1b2d24fec1552168d72692b12", + "reference": "35b8caf75e791ba1b2d24fec1552168d72692b12", "shasum": "" }, "require": { @@ -1962,20 +2252,82 @@ "parser", "php" ], - "time": "2018-03-25T17:35:16+00:00" + "time": "2018-06-03T11:33:10+00:00" }, { - "name": "paragonie/random_compat", - "version": "v2.0.12", + "name": "paragonie/constant_time_encoding", + "version": "v2.2.2", "source": { "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb" + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "eccf915f45f911bfb189d1d1638d940ec6ee6e33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/258c89a6b97de7dfaf5b8c7607d0478e236b04fb", - "reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/eccf915f45f911bfb189d1d1638d940ec6ee6e33", + "reference": "eccf915f45f911bfb189d1d1638d940ec6ee6e33", + "shasum": "" + }, + "require": { + "php": "^7" + }, + "require-dev": { + "phpunit/phpunit": "^6|^7", + "vimeo/psalm": "^1" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "time": "2018-03-10T19:47:49+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v2.0.17", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "29af24f25bab834fcbb38ad2a69fa93b867e070d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/29af24f25bab834fcbb38ad2a69fa93b867e070d", + "reference": "29af24f25bab834fcbb38ad2a69fa93b867e070d", "shasum": "" }, "require": { @@ -2007,10 +2359,11 @@ "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", "keywords": [ "csprng", + "polyfill", "pseudorandom", "random" ], - "time": "2018-04-04T21:24:14+00:00" + "time": "2018-07-04T16:31:37+00:00" }, { "name": "phpseclib/phpseclib", @@ -2104,6 +2457,360 @@ ], "time": "2018-04-15T16:55:05+00:00" }, + { + "name": "pixelfed/dotenv-editor", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/pixelfed/Laravel-Dotenv-Editor.git", + "reference": "b53cb2707bb856e92cf1a282b4e5ee17a45ccb2c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pixelfed/Laravel-Dotenv-Editor/zipball/b53cb2707bb856e92cf1a282b4e5ee17a45ccb2c", + "reference": "b53cb2707bb856e92cf1a282b4e5ee17a45ccb2c", + "shasum": "" + }, + "require": { + "illuminate/config": ">=5.0", + "illuminate/container": ">=5.0", + "illuminate/support": ">=5.0", + "php": ">=5.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Jackiedo\\DotenvEditor\\": "src/Jackiedo/DotenvEditor" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jackie Do", + "email": "anhvudo@gmail.com" + } + ], + "description": "The .env file editor tool for Laravel 5+", + "keywords": [ + "dotenv", + "dotenv-editor", + "laravel" + ], + "time": "2018-07-17T19:38:26+00:00" + }, + { + "name": "pixelfed/fractal", + "version": "0.18.0", + "source": { + "type": "git", + "url": "https://github.com/pixelfed/fractal.git", + "reference": "faff10c9f3e3300b1571ef41926f933a9cce4782" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pixelfed/fractal/zipball/faff10c9f3e3300b1571ef41926f933a9cce4782", + "reference": "faff10c9f3e3300b1571ef41926f933a9cce4782", + "shasum": "" + }, + "require": { + "php": ">=5.4" + }, + "require-dev": { + "doctrine/orm": "^2.5", + "illuminate/contracts": "~5.0", + "mockery/mockery": "~0.9", + "pagerfanta/pagerfanta": "~1.0.0", + "phpunit/phpunit": "^4.8.35", + "squizlabs/php_codesniffer": "~1.5", + "zendframework/zend-paginator": "~2.3" + }, + "suggest": { + "illuminate/pagination": "The Illuminate Pagination component.", + "pagerfanta/pagerfanta": "Pagerfanta Paginator", + "zendframework/zend-paginator": "Zend Framework Paginator" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.13-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Fractal\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Phil Sturgeon", + "email": "me@philsturgeon.uk", + "homepage": "http://philsturgeon.uk/", + "role": "Developer" + } + ], + "description": "Handle the output of complex data structures ready for API output.", + "homepage": "http://fractal.thephpleague.com/", + "keywords": [ + "api", + "json", + "league", + "rest" + ], + "time": "2018-07-01T02:30:24+00:00" + }, + { + "name": "pixelfed/google2fa", + "version": "v4.0.0", + "source": { + "type": "git", + "url": "https://github.com/pixelfed/google2fa.git", + "reference": "919ecec68074a27818451d8653029773a2391fe5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pixelfed/google2fa/zipball/919ecec68074a27818451d8653029773a2391fe5", + "reference": "919ecec68074a27818451d8653029773a2391fe5", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "~1.0|~2.0", + "paragonie/random_compat": "~1.4|~2.0", + "php": ">=5.4", + "symfony/polyfill-php56": "~1.2" + }, + "require-dev": { + "bacon/bacon-qr-code": "~1.0", + "phpunit/phpunit": "~4|~5|~6" + }, + "suggest": { + "bacon/bacon-qr-code": "Required to generate inline QR Codes." + }, + "type": "library", + "extra": { + "component": "package", + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "PragmaRX\\Google2FA\\": "src/", + "PragmaRX\\Google2FA\\Tests\\": "tests/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "role": "Creator & Designer" + } + ], + "description": "A One Time Password Authentication package, compatible with Google Authenticator.", + "keywords": [ + "2fa", + "Authentication", + "Two Factor Authentication", + "google2fa", + "laravel" + ], + "time": "2018-07-05T03:38:31+00:00" + }, + { + "name": "pixelfed/google2fa-laravel", + "version": "v2.0.0", + "source": { + "type": "git", + "url": "https://github.com/pixelfed/google2fa-laravel.git", + "reference": "72cfcbe2c04db1a2702925413b40fdda3743e6b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pixelfed/google2fa-laravel/zipball/72cfcbe2c04db1a2702925413b40fdda3743e6b5", + "reference": "72cfcbe2c04db1a2702925413b40fdda3743e6b5", + "shasum": "" + }, + "require": { + "laravel/framework": ">=5.2", + "php": ">=5.4", + "pixelfed/google2fa": "~4.0" + }, + "require-dev": { + "orchestra/testbench-browser-kit": "~3.4|~3.5|~3.6", + "phpunit/phpunit": "~5|~6|~7" + }, + "suggest": { + "bacon/bacon-qr-code": "Required to generate inline QR Codes.", + "pragmarx/recovery": "Generate recovery codes." + }, + "type": "library", + "extra": { + "component": "package", + "frameworks": [ + "Laravel" + ], + "branch-alias": { + "dev-master": "0.2-dev" + }, + "laravel": { + "providers": [ + "PragmaRX\\Google2FALaravel\\ServiceProvider" + ], + "aliases": { + "Google2FA": "PragmaRX\\Google2FALaravel\\Facade" + } + } + }, + "autoload": { + "psr-4": { + "PragmaRX\\Google2FALaravel\\": "src/", + "PragmaRX\\Google2FALaravel\\Tests\\": "tests/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "role": "Creator & Designer" + } + ], + "description": "A One Time Password Authentication package, compatible with Google Authenticator.", + "keywords": [ + "Authentication", + "Two Factor Authentication", + "google2fa", + "laravel" + ], + "time": "2018-07-05T03:42:05+00:00" + }, + { + "name": "pixelfed/http-signatures", + "version": "v5.0.0", + "source": { + "type": "git", + "url": "https://github.com/pixelfed/http-signatures-php.git", + "reference": "a3b6985c632b7add360a24a507eae4187f2b51a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pixelfed/http-signatures-php/zipball/a3b6985c632b7add360a24a507eae4187f2b51a4", + "reference": "a3b6985c632b7add360a24a507eae4187f2b51a4", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "^1.0|^2.0", + "php": ">=5.5", + "psr/http-message": "^1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^1.11", + "guzzlehttp/psr7": "^1.2", + "phpunit/phpunit": "~4.8", + "symfony/http-foundation": "~2.8|~3.0", + "symfony/psr-http-message-bridge": "^1.0", + "zendframework/zend-diactoros": "^1.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "HttpSignatures\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paul Annesley", + "email": "paul@99designs.com" + } + ], + "description": "Sign and verify HTTP messages", + "keywords": [ + "hmac", + "http", + "https", + "signature", + "signed", + "signing" + ], + "time": "2018-07-18T02:16:30+00:00" + }, + { + "name": "pixelfed/http-signatures-guzzlehttp", + "version": "v4.0.0", + "source": { + "type": "git", + "url": "https://github.com/pixelfed/http-signatures-guzzlehttp.git", + "reference": "19f74eb85d7d13b7e71d6c7983a227c06342c8a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pixelfed/http-signatures-guzzlehttp/zipball/19f74eb85d7d13b7e71d6c7983a227c06342c8a4", + "reference": "19f74eb85d7d13b7e71d6c7983a227c06342c8a4", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": ">=6.0 <7.0.0", + "php": ">=5.5.0", + "pixelfed/http-signatures": "5.x" + }, + "require-dev": { + "phpunit/phpunit": "~4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Adrian Palmer", + "email": "adrian.palmer@99designs.com" + }, + { + "name": "Ruben de Vries", + "email": "ruben@rubensayshi.com" + } + ], + "description": "Sign and verify HTTP messages with Guzzle 6", + "homepage": "https://github.com/99designs/http-signatures-guzzlehttp", + "keywords": [ + "guzzle 6", + "hmac", + "http", + "https", + "signature", + "signed", + "signing" + ], + "time": "2018-07-18T02:23:35+00:00" + }, { "name": "predis/predis", "version": "v1.1.1", @@ -2350,16 +3057,16 @@ }, { "name": "psy/psysh", - "version": "v0.9.4", + "version": "v0.9.6", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "4d969a0e08e1e05e7207c07cb4207017ecc9a331" + "reference": "4a2ce86f199d51b6e2524214dc06835e872f4fce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/4d969a0e08e1e05e7207c07cb4207017ecc9a331", - "reference": "4d969a0e08e1e05e7207c07cb4207017ecc9a331", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/4a2ce86f199d51b6e2524214dc06835e872f4fce", + "reference": "4a2ce86f199d51b6e2524214dc06835e872f4fce", "shasum": "" }, "require": { @@ -2418,7 +3125,7 @@ "interactive", "shell" ], - "time": "2018-05-22T06:48:07+00:00" + "time": "2018-06-10T17:57:20+00:00" }, { "name": "ramsey/uuid", @@ -2552,16 +3259,16 @@ }, { "name": "spatie/image-optimizer", - "version": "1.0.14", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/spatie/image-optimizer.git", - "reference": "91603599eb29024cc9849a4a511a629ebce97850" + "reference": "1530d6cf72070068eecab150ffb73466c3806bdd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/image-optimizer/zipball/91603599eb29024cc9849a4a511a629ebce97850", - "reference": "91603599eb29024cc9849a4a511a629ebce97850", + "url": "https://api.github.com/repos/spatie/image-optimizer/zipball/1530d6cf72070068eecab150ffb73466c3806bdd", + "reference": "1530d6cf72070068eecab150ffb73466c3806bdd", "shasum": "" }, "require": { @@ -2597,20 +3304,20 @@ "image-optimizer", "spatie" ], - "time": "2018-03-07T13:42:33+00:00" + "time": "2018-06-05T07:36:17+00:00" }, { "name": "spatie/laravel-backup", - "version": "5.7.0", + "version": "5.9.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-backup.git", - "reference": "60c6fbc27c9c2cbdf3c7da90b080a63d2599cd2d" + "reference": "ad85988480db742937345c8b086346a30959e814" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-backup/zipball/60c6fbc27c9c2cbdf3c7da90b080a63d2599cd2d", - "reference": "60c6fbc27c9c2cbdf3c7da90b080a63d2599cd2d", + "url": "https://api.github.com/repos/spatie/laravel-backup/zipball/ad85988480db742937345c8b086346a30959e814", + "reference": "ad85988480db742937345c8b086346a30959e814", "shasum": "" }, "require": { @@ -2670,26 +3377,26 @@ "laravel-backup", "spatie" ], - "time": "2018-05-11T07:06:58+00:00" + "time": "2018-06-19T21:20:28+00:00" }, { "name": "spatie/laravel-image-optimizer", - "version": "1.2.0", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-image-optimizer.git", - "reference": "f98d1a8e90851ed0384b46f9b692297d47688a0c" + "reference": "b40f5accb41b385dcc62ca17c25283e5db11d9a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-image-optimizer/zipball/f98d1a8e90851ed0384b46f9b692297d47688a0c", - "reference": "f98d1a8e90851ed0384b46f9b692297d47688a0c", + "url": "https://api.github.com/repos/spatie/laravel-image-optimizer/zipball/b40f5accb41b385dcc62ca17c25283e5db11d9a3", + "reference": "b40f5accb41b385dcc62ca17c25283e5db11d9a3", "shasum": "" }, "require": { "illuminate/support": "~5.5.0|~5.6.0", "php": "^7.0", - "spatie/image-optimizer": "^1.0.4" + "spatie/image-optimizer": "^1.1.0" }, "require-dev": { "orchestra/testbench": "~3.5.0|~3.6.0", @@ -2729,7 +3436,7 @@ "laravel-image-optimizer", "spatie" ], - "time": "2018-05-16T14:07:07+00:00" + "time": "2018-06-05T07:37:24+00:00" }, { "name": "spatie/laravel-partialcache", @@ -2838,16 +3545,16 @@ }, { "name": "swiftmailer/swiftmailer", - "version": "v6.0.2", + "version": "v6.1.1", "source": { "type": "git", "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "412333372fb6c8ffb65496a2bbd7321af75733fc" + "reference": "aa899fef280b1c1aec8d5d4ac069af7f80c89a23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/412333372fb6c8ffb65496a2bbd7321af75733fc", - "reference": "412333372fb6c8ffb65496a2bbd7321af75733fc", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/aa899fef280b1c1aec8d5d4ac069af7f80c89a23", + "reference": "aa899fef280b1c1aec8d5d4ac069af7f80c89a23", "shasum": "" }, "require": { @@ -2858,10 +3565,14 @@ "mockery/mockery": "~0.9.1", "symfony/phpunit-bridge": "~3.3@dev" }, + "suggest": { + "ext-intl": "Needed to support internationalized email addresses", + "true/punycode": "Needed to support internationalized email addresses, if ext-intl is not installed" + }, "type": "library", "extra": { "branch-alias": { - "dev-master": "6.0-dev" + "dev-master": "6.1-dev" } }, "autoload": { @@ -2883,26 +3594,26 @@ } ], "description": "Swiftmailer, free feature-rich PHP mailer", - "homepage": "http://swiftmailer.symfony.com", + "homepage": "https://swiftmailer.symfony.com", "keywords": [ "email", "mail", "mailer" ], - "time": "2017-09-30T22:39:41+00:00" + "time": "2018-07-04T11:12:44+00:00" }, { "name": "symfony/console", - "version": "v4.1.0", + "version": "v4.1.1", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "2d5d973bf9933d46802b01010bd25c800c87c242" + "reference": "70591cda56b4b47c55776ac78e157c4bb6c8b43f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/2d5d973bf9933d46802b01010bd25c800c87c242", - "reference": "2d5d973bf9933d46802b01010bd25c800c87c242", + "url": "https://api.github.com/repos/symfony/console/zipball/70591cda56b4b47c55776ac78e157c4bb6c8b43f", + "reference": "70591cda56b4b47c55776ac78e157c4bb6c8b43f", "shasum": "" }, "require": { @@ -2957,11 +3668,11 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2018-05-30T07:26:09+00:00" + "time": "2018-05-31T10:17:53+00:00" }, { "name": "symfony/css-selector", - "version": "v4.1.0", + "version": "v4.1.1", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", @@ -3014,16 +3725,16 @@ }, { "name": "symfony/debug", - "version": "v4.1.0", + "version": "v4.1.1", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "449f8b00b28ab6e6912c3e6b920406143b27193b" + "reference": "dbe0fad88046a755dcf9379f2964c61a02f5ae3d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/449f8b00b28ab6e6912c3e6b920406143b27193b", - "reference": "449f8b00b28ab6e6912c3e6b920406143b27193b", + "url": "https://api.github.com/repos/symfony/debug/zipball/dbe0fad88046a755dcf9379f2964c61a02f5ae3d", + "reference": "dbe0fad88046a755dcf9379f2964c61a02f5ae3d", "shasum": "" }, "require": { @@ -3066,11 +3777,11 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2018-05-16T14:33:22+00:00" + "time": "2018-06-08T09:39:36+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.1.0", + "version": "v4.1.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", @@ -3133,16 +3844,16 @@ }, { "name": "symfony/finder", - "version": "v4.1.0", + "version": "v4.1.1", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "087e2ee0d74464a4c6baac4e90417db7477dc238" + "reference": "84714b8417d19e4ba02ea78a41a975b3efaafddb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/087e2ee0d74464a4c6baac4e90417db7477dc238", - "reference": "087e2ee0d74464a4c6baac4e90417db7477dc238", + "url": "https://api.github.com/repos/symfony/finder/zipball/84714b8417d19e4ba02ea78a41a975b3efaafddb", + "reference": "84714b8417d19e4ba02ea78a41a975b3efaafddb", "shasum": "" }, "require": { @@ -3178,20 +3889,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2018-05-16T14:33:22+00:00" + "time": "2018-06-19T21:38:16+00:00" }, { "name": "symfony/http-foundation", - "version": "v4.1.0", + "version": "v4.1.1", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "a916c88390fb861ee21f12a92b107d51bb68af99" + "reference": "4f9c7cf962e635b0b26b14500ac046e07dbef7f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/a916c88390fb861ee21f12a92b107d51bb68af99", - "reference": "a916c88390fb861ee21f12a92b107d51bb68af99", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/4f9c7cf962e635b0b26b14500ac046e07dbef7f3", + "reference": "4f9c7cf962e635b0b26b14500ac046e07dbef7f3", "shasum": "" }, "require": { @@ -3232,20 +3943,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2018-05-25T14:55:38+00:00" + "time": "2018-06-19T21:38:16+00:00" }, { "name": "symfony/http-kernel", - "version": "v4.1.0", + "version": "v4.1.1", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "b5ab9d4cdbfd369083744b6b5dfbf454e31e5f90" + "reference": "29c094a1c4f8209b7e033f612cbbd69029e38955" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b5ab9d4cdbfd369083744b6b5dfbf454e31e5f90", - "reference": "b5ab9d4cdbfd369083744b6b5dfbf454e31e5f90", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/29c094a1c4f8209b7e033f612cbbd69029e38955", + "reference": "29c094a1c4f8209b7e033f612cbbd69029e38955", "shasum": "" }, "require": { @@ -3253,13 +3964,13 @@ "psr/log": "~1.0", "symfony/debug": "~3.4|~4.0", "symfony/event-dispatcher": "~4.1", - "symfony/http-foundation": "~4.1", + "symfony/http-foundation": "^4.1.1", "symfony/polyfill-ctype": "~1.8" }, "conflict": { "symfony/config": "<3.4", "symfony/dependency-injection": "<4.1", - "symfony/var-dumper": "<4.1", + "symfony/var-dumper": "<4.1.1", "twig/twig": "<1.34|<2.4,>=2" }, "provide": { @@ -3280,7 +3991,7 @@ "symfony/stopwatch": "~3.4|~4.0", "symfony/templating": "~3.4|~4.0", "symfony/translation": "~3.4|~4.0", - "symfony/var-dumper": "~4.1" + "symfony/var-dumper": "^4.1.1" }, "suggest": { "symfony/browser-kit": "", @@ -3319,7 +4030,7 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2018-05-30T12:52:34+00:00" + "time": "2018-06-25T13:06:45+00:00" }, { "name": "symfony/polyfill-ctype", @@ -3435,6 +4146,62 @@ ], "time": "2018-04-26T10:06:28+00:00" }, + { + "name": "symfony/polyfill-php56", + "version": "v1.8.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php56.git", + "reference": "af98553c84912459db3f636329567809d639a8f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/af98553c84912459db3f636329567809d639a8f6", + "reference": "af98553c84912459db3f636329567809d639a8f6", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-util": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php56\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2018-04-26T10:06:28+00:00" + }, { "name": "symfony/polyfill-php72", "version": "v1.8.0", @@ -3491,17 +4258,69 @@ "time": "2018-04-26T10:06:28+00:00" }, { - "name": "symfony/process", - "version": "v4.1.0", + "name": "symfony/polyfill-util", + "version": "v1.8.0", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "73445bd33b0d337c060eef9652b94df72b6b3434" + "url": "https://github.com/symfony/polyfill-util.git", + "reference": "1a5ad95d9436cbff3296034fe9f8d586dce3fb3a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/73445bd33b0d337c060eef9652b94df72b6b3434", - "reference": "73445bd33b0d337c060eef9652b94df72b6b3434", + "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/1a5ad95d9436cbff3296034fe9f8d586dce3fb3a", + "reference": "1a5ad95d9436cbff3296034fe9f8d586dce3fb3a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Util\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony utilities for portability of PHP codes", + "homepage": "https://symfony.com", + "keywords": [ + "compat", + "compatibility", + "polyfill", + "shim" + ], + "time": "2018-04-26T10:06:28+00:00" + }, + { + "name": "symfony/process", + "version": "v4.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "1d1677391ecf00d1c5b9482d6050c0c27aa3ac3a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/1d1677391ecf00d1c5b9482d6050c0c27aa3ac3a", + "reference": "1d1677391ecf00d1c5b9482d6050c0c27aa3ac3a", "shasum": "" }, "require": { @@ -3537,20 +4356,80 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2018-05-30T07:26:09+00:00" + "time": "2018-05-31T10:17:53+00:00" }, { - "name": "symfony/routing", - "version": "v4.1.0", + "name": "symfony/psr-http-message-bridge", + "version": "v1.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "180b51c66d10f09e562c9ebc395b39aacb2cf8a2" + "url": "https://github.com/symfony/psr-http-message-bridge.git", + "reference": "c2b757934f2d9681a287e662efbc27c41fe8ef86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/180b51c66d10f09e562c9ebc395b39aacb2cf8a2", - "reference": "180b51c66d10f09e562c9ebc395b39aacb2cf8a2", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/c2b757934f2d9681a287e662efbc27c41fe8ef86", + "reference": "c2b757934f2d9681a287e662efbc27c41fe8ef86", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "psr/http-message": "~1.0", + "symfony/http-foundation": "~2.3|~3.0|~4.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "~3.2|4.0" + }, + "suggest": { + "psr/http-message-implementation": "To use the HttpFoundation factory", + "zendframework/zend-diactoros": "To use the Zend Diactoros factory" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\PsrHttpMessage\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "PSR HTTP message bridge", + "homepage": "http://symfony.com", + "keywords": [ + "http", + "http-message", + "psr-7" + ], + "time": "2017-12-19T00:31:44+00:00" + }, + { + "name": "symfony/routing", + "version": "v4.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "b38b9797327b26ea2e4146a40e6e2dc9820a6932" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/b38b9797327b26ea2e4146a40e6e2dc9820a6932", + "reference": "b38b9797327b26ea2e4146a40e6e2dc9820a6932", "shasum": "" }, "require": { @@ -3563,7 +4442,6 @@ }, "require-dev": { "doctrine/annotations": "~1.0", - "doctrine/common": "~2.2", "psr/log": "~1.0", "symfony/config": "~3.4|~4.0", "symfony/dependency-injection": "~3.4|~4.0", @@ -3615,20 +4493,20 @@ "uri", "url" ], - "time": "2018-05-30T07:26:09+00:00" + "time": "2018-06-19T21:38:16+00:00" }, { "name": "symfony/translation", - "version": "v4.1.0", + "version": "v4.1.1", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "16328f5b217cebc8dd4adfe4aeeaa8c377581f5a" + "reference": "b6d8164085ee0b6debcd1b7a131fd6f63bb04854" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/16328f5b217cebc8dd4adfe4aeeaa8c377581f5a", - "reference": "16328f5b217cebc8dd4adfe4aeeaa8c377581f5a", + "url": "https://api.github.com/repos/symfony/translation/zipball/b6d8164085ee0b6debcd1b7a131fd6f63bb04854", + "reference": "b6d8164085ee0b6debcd1b7a131fd6f63bb04854", "shasum": "" }, "require": { @@ -3684,20 +4562,20 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2018-05-30T07:26:09+00:00" + "time": "2018-06-22T08:59:39+00:00" }, { "name": "symfony/var-dumper", - "version": "v4.1.0", + "version": "v4.1.1", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "bc88ad53e825ebacc7b190bbd360781fce381c64" + "reference": "b2eebaec085d1f2cafbad7644733d494a3bbbc9b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/bc88ad53e825ebacc7b190bbd360781fce381c64", - "reference": "bc88ad53e825ebacc7b190bbd360781fce381c64", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b2eebaec085d1f2cafbad7644733d494a3bbbc9b", + "reference": "b2eebaec085d1f2cafbad7644733d494a3bbbc9b", "shasum": "" }, "require": { @@ -3759,20 +4637,20 @@ "debug", "dump" ], - "time": "2018-04-29T07:56:09+00:00" + "time": "2018-06-23T12:23:56+00:00" }, { "name": "tightenco/collect", - "version": "v5.6.23", + "version": "v5.6.25", "source": { "type": "git", "url": "https://github.com/tightenco/collect.git", - "reference": "0954fc3ca147a7d727d807e15113daba4a08c810" + "reference": "d1c093876f98f2406941af31c14788e53d7ffeee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tightenco/collect/zipball/0954fc3ca147a7d727d807e15113daba4a08c810", - "reference": "0954fc3ca147a7d727d807e15113daba4a08c810", + "url": "https://api.github.com/repos/tightenco/collect/zipball/d1c093876f98f2406941af31c14788e53d7ffeee", + "reference": "d1c093876f98f2406941af31c14788e53d7ffeee", "shasum": "" }, "require": { @@ -3809,7 +4687,7 @@ "collection", "laravel" ], - "time": "2018-05-22T17:57:22+00:00" + "time": "2018-06-12T15:43:49+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -3860,28 +4738,28 @@ }, { "name": "vlucas/phpdotenv", - "version": "v2.4.0", + "version": "v2.5.0", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c" + "reference": "6ae3e2e6494bb5e58c2decadafc3de7f1453f70a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c", - "reference": "3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/6ae3e2e6494bb5e58c2decadafc3de7f1453f70a", + "reference": "6ae3e2e6494bb5e58c2decadafc3de7f1453f70a", "shasum": "" }, "require": { "php": ">=5.3.9" }, "require-dev": { - "phpunit/phpunit": "^4.8 || ^5.0" + "phpunit/phpunit": "^4.8.35 || ^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.4-dev" + "dev-master": "2.5-dev" } }, "autoload": { @@ -3891,7 +4769,7 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause-Attribution" + "BSD-3-Clause" ], "authors": [ { @@ -3906,7 +4784,70 @@ "env", "environment" ], - "time": "2016-09-01T10:05:43+00:00" + "time": "2018-07-01T10:25:50+00:00" + }, + { + "name": "zendframework/zend-diactoros", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-diactoros.git", + "reference": "11c9c1835e60eef6f9234377a480fcec096ebd9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/11c9c1835e60eef6f9234377a480fcec096ebd9e", + "reference": "11c9c1835e60eef6f9234377a480fcec096ebd9e", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0", + "psr/http-message": "^1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-dom": "*", + "ext-libxml": "*", + "phpunit/phpunit": "^5.7.16 || ^6.0.8", + "zendframework/zend-coding-standard": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8.x-dev", + "dev-develop": "1.9.x-dev", + "dev-release-2.0": "2.0.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions/create_uploaded_file.php", + "src/functions/marshal_headers_from_sapi.php", + "src/functions/marshal_method_from_sapi.php", + "src/functions/marshal_protocol_version_from_sapi.php", + "src/functions/marshal_uri_from_sapi.php", + "src/functions/normalize_server.php", + "src/functions/normalize_uploaded_files.php", + "src/functions/parse_cookie_header.php" + ], + "psr-4": { + "Zend\\Diactoros\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "description": "PSR HTTP Message implementations", + "homepage": "https://github.com/zendframework/zend-diactoros", + "keywords": [ + "http", + "psr", + "psr-7" + ], + "time": "2018-06-27T18:52:43+00:00" } ], "packages-dev": [ @@ -3978,6 +4919,68 @@ ], "time": "2018-05-03T18:27:04+00:00" }, + { + "name": "beyondcode/laravel-er-diagram-generator", + "version": "0.2.2", + "source": { + "type": "git", + "url": "https://github.com/beyondcode/laravel-er-diagram-generator.git", + "reference": "c815b726518c72ebf6645ebc862d3549af5b55a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/beyondcode/laravel-er-diagram-generator/zipball/c815b726518c72ebf6645ebc862d3549af5b55a9", + "reference": "c815b726518c72ebf6645ebc862d3549af5b55a9", + "shasum": "" + }, + "require": { + "doctrine/dbal": "~2.3", + "nikic/php-parser": "^2.0|^3.0|^4.0", + "php": "^7.1", + "phpdocumentor/graphviz": "^1.0" + }, + "require-dev": { + "larapack/dd": "^1.0", + "orchestra/testbench": "~3.5", + "phpunit/phpunit": "^7.0", + "spatie/phpunit-snapshot-assertions": "^1.3" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "BeyondCode\\ErdGenerator\\ErdGeneratorServiceProvider" + ], + "aliases": { + "ErdGenerator": "BeyondCode\\ErdGenerator\\ErdGeneratorFacade" + } + } + }, + "autoload": { + "psr-4": { + "BeyondCode\\ErdGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marcel Pociot", + "email": "marcel@beyondco.de", + "homepage": "https://beyondcode.de", + "role": "Developer" + } + ], + "description": "Generate ER diagrams from your Laravel models.", + "homepage": "https://github.com/beyondcode/laravel-er-diagram-generator", + "keywords": [ + "beyondcode", + "laravel-er-diagram-generator" + ], + "time": "2018-07-06T09:34:29+00:00" + }, { "name": "doctrine/instantiator", "version": "1.1.0", @@ -4034,16 +5037,16 @@ }, { "name": "filp/whoops", - "version": "2.1.14", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "c6081b8838686aa04f1e83ba7e91f78b7b2a23e6" + "reference": "181c4502d8f34db7aed7bfe88d4f87875b8e947a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/c6081b8838686aa04f1e83ba7e91f78b7b2a23e6", - "reference": "c6081b8838686aa04f1e83ba7e91f78b7b2a23e6", + "url": "https://api.github.com/repos/filp/whoops/zipball/181c4502d8f34db7aed7bfe88d4f87875b8e947a", + "reference": "181c4502d8f34db7aed7bfe88d4f87875b8e947a", "shasum": "" }, "require": { @@ -4051,9 +5054,9 @@ "psr/log": "^1.0.1" }, "require-dev": { - "mockery/mockery": "0.9.*", + "mockery/mockery": "^0.9 || ^1.0", "phpunit/phpunit": "^4.8.35 || ^5.7", - "symfony/var-dumper": "^2.6 || ^3.0" + "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0" }, "suggest": { "symfony/var-dumper": "Pretty print complex values better with var-dumper available", @@ -4062,7 +5065,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "2.1-dev" } }, "autoload": { @@ -4091,7 +5094,7 @@ "throwable", "whoops" ], - "time": "2017-11-23T18:22:44+00:00" + "time": "2018-03-03T17:56:25+00:00" }, { "name": "fzaninotto/faker", @@ -4320,16 +5323,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.8.0", + "version": "1.8.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "478465659fd987669df0bd8a9bf22a8710e5f1b6" + "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/478465659fd987669df0bd8a9bf22a8710e5f1b6", - "reference": "478465659fd987669df0bd8a9bf22a8710e5f1b6", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", + "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", "shasum": "" }, "require": { @@ -4364,20 +5367,20 @@ "object", "object graph" ], - "time": "2018-05-29T17:25:09+00:00" + "time": "2018-06-11T23:09:50+00:00" }, { "name": "nunomaduro/collision", - "version": "v2.0.2", + "version": "v2.0.3", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "245958b02c6a9edf24627380f368333ac5413a51" + "reference": "b1f606399ae77e9479b5597cd1aa3d8ea0078176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/245958b02c6a9edf24627380f368333ac5413a51", - "reference": "245958b02c6a9edf24627380f368333ac5413a51", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/b1f606399ae77e9479b5597cd1aa3d8ea0078176", + "reference": "b1f606399ae77e9479b5597cd1aa3d8ea0078176", "shasum": "" }, "require": { @@ -4388,7 +5391,8 @@ }, "require-dev": { "laravel/framework": "5.6.*", - "phpunit/phpunit": "~7.0" + "phpstan/phpstan": "^0.9.2", + "phpunit/phpunit": "~7.2" }, "type": "library", "extra": { @@ -4426,7 +5430,7 @@ "php", "symfony" ], - "time": "2018-03-21T20:11:24+00:00" + "time": "2018-06-16T22:05:52+00:00" }, { "name": "phar-io/manifest", @@ -4530,6 +5534,47 @@ "description": "Library for handling version information and constraints", "time": "2017-03-05T17:38:23+00:00" }, + { + "name": "phpdocumentor/graphviz", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/GraphViz.git", + "reference": "a906a90a9f230535f25ea31caf81b2323956283f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/GraphViz/zipball/a906a90a9f230535f25ea31caf81b2323956283f", + "reference": "a906a90a9f230535f25ea31caf81b2323956283f", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/", + "tests/unit" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "time": "2016-02-02T13:00:08+00:00" + }, { "name": "phpdocumentor/reflection-common", "version": "1.0.1", @@ -4810,16 +5855,16 @@ }, { "name": "phpunit/php-file-iterator", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "e20525b0c2945c7c317fff95660698cb3d2a53bc" + "reference": "cecbc684605bb0cc288828eb5d65d93d5c676d3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/e20525b0c2945c7c317fff95660698cb3d2a53bc", - "reference": "e20525b0c2945c7c317fff95660698cb3d2a53bc", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cecbc684605bb0cc288828eb5d65d93d5c676d3c", + "reference": "cecbc684605bb0cc288828eb5d65d93d5c676d3c", "shasum": "" }, "require": { @@ -4853,7 +5898,7 @@ "filesystem", "iterator" ], - "time": "2018-05-28T12:13:49+00:00" + "time": "2018-06-11T11:44:00+00:00" }, { "name": "phpunit/php-text-template", @@ -4996,16 +6041,16 @@ }, { "name": "phpunit/phpunit", - "version": "7.2.2", + "version": "7.2.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "3cf0836680bf5c365c627e8566d46c9e1f544db9" + "reference": "400a3836ee549ae6f665323ac3f21e27eac7155f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3cf0836680bf5c365c627e8566d46c9e1f544db9", - "reference": "3cf0836680bf5c365c627e8566d46c9e1f544db9", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/400a3836ee549ae6f665323ac3f21e27eac7155f", + "reference": "400a3836ee549ae6f665323ac3f21e27eac7155f", "shasum": "" }, "require": { @@ -5021,7 +6066,7 @@ "php": "^7.1", "phpspec/prophecy": "^1.7", "phpunit/php-code-coverage": "^6.0.7", - "phpunit/php-file-iterator": "^2.0", + "phpunit/php-file-iterator": "^2.0.1", "phpunit/php-text-template": "^1.2.1", "phpunit/php-timer": "^2.0", "sebastian/comparator": "^3.0", @@ -5076,7 +6121,7 @@ "testing", "xunit" ], - "time": "2018-06-01T07:54:27+00:00" + "time": "2018-06-21T13:13:39+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -5125,16 +6170,16 @@ }, { "name": "sebastian/comparator", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "ed5fd2281113729f1ebcc64d101ad66028aeb3d5" + "reference": "591a30922f54656695e59b1f39501aec513403da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/ed5fd2281113729f1ebcc64d101ad66028aeb3d5", - "reference": "ed5fd2281113729f1ebcc64d101ad66028aeb3d5", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/591a30922f54656695e59b1f39501aec513403da", + "reference": "591a30922f54656695e59b1f39501aec513403da", "shasum": "" }, "require": { @@ -5185,20 +6230,20 @@ "compare", "equality" ], - "time": "2018-04-18T13:33:00+00:00" + "time": "2018-06-14T15:05:28+00:00" }, { "name": "sebastian/diff", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "e09160918c66281713f1c324c1f4c4c3037ba1e8" + "reference": "366541b989927187c4ca70490a35615d3fef2dce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/e09160918c66281713f1c324c1f4c4c3037ba1e8", - "reference": "e09160918c66281713f1c324c1f4c4c3037ba1e8", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/366541b989927187c4ca70490a35615d3fef2dce", + "reference": "366541b989927187c4ca70490a35615d3fef2dce", "shasum": "" }, "require": { @@ -5241,7 +6286,7 @@ "unidiff", "unified diff" ], - "time": "2018-02-01T13:45:15+00:00" + "time": "2018-06-10T07:54:39+00:00" }, { "name": "sebastian/environment", diff --git a/config/app.php b/config/app.php index a281d980..b426fa53 100644 --- a/config/app.php +++ b/config/app.php @@ -151,6 +151,7 @@ return [ * Package Service Providers... */ Greggilbert\Recaptcha\RecaptchaServiceProvider::class, + Jackiedo\DotenvEditor\DotenvEditorServiceProvider::class, /* * Application Service Providers... @@ -211,6 +212,7 @@ return [ 'View' => Illuminate\Support\Facades\View::class, 'Recaptcha' => Greggilbert\Recaptcha\Facades\Recaptcha::class, + 'DotenvEditor' => Jackiedo\DotenvEditor\Facades\DotenvEditor::class, ], ]; diff --git a/config/dotenv-editor.php b/config/dotenv-editor.php new file mode 100644 index 00000000..583039c6 --- /dev/null +++ b/config/dotenv-editor.php @@ -0,0 +1,27 @@ + true, + + /* + |---------------------------------------------------------------------- + | Backup location + |---------------------------------------------------------------------- + | + | This value is used when you backup your file. This value is the sub + | path from root folder of project application. + */ + + 'backupPath' => base_path('storage/dotenv-editor/backups/') + +); diff --git a/config/image-optimizer.php b/config/image-optimizer.php index 241dc199..6e97d8ef 100644 --- a/config/image-optimizer.php +++ b/config/image-optimizer.php @@ -49,5 +49,5 @@ return [ * If set to `true` all output of the optimizer binaries will be appended to the default log. * You can also set this to a class that implements `Psr\Log\LoggerInterface`. */ - 'log_optimizer_activity' => true, + 'log_optimizer_activity' => false, ]; diff --git a/config/pixelfed.php b/config/pixelfed.php index c825643a..3e9782ac 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.1.0', + 'version' => '0.1.2', /* |-------------------------------------------------------------------------- @@ -77,6 +77,17 @@ return [ 'activitypub_enabled' => env('ACTIVITY_PUB', false), + /* + |-------------------------------------------------------------------------- + | Account file size limit + |-------------------------------------------------------------------------- + | + | Update the max account size, the per user limit of files in KB. + | + | + */ + 'max_account_size' => env('MAX_ACCOUNT_SIZE', 100000), + /* |-------------------------------------------------------------------------- | Photo file size limit diff --git a/database/migrations/2018_04_22_233721_create_web_subs_table.php b/database/migrations/2018_04_22_233721_create_web_subs_table.php new file mode 100644 index 00000000..cd91ca4d --- /dev/null +++ b/database/migrations/2018_04_22_233721_create_web_subs_table.php @@ -0,0 +1,36 @@ +bigIncrements('id'); + $table->bigInteger('follower_id')->unsigned()->index(); + $table->bigInteger('following_id')->unsigned()->index(); + $table->string('profile_url')->index(); + $table->timestamp('approved_at')->nullable(); + $table->unique(['follower_id', 'following_id', 'profile_url']); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('web_subs'); + } +} diff --git a/database/migrations/2018_04_26_003259_create_import_jobs_table.php b/database/migrations/2018_04_26_003259_create_import_jobs_table.php new file mode 100644 index 00000000..447deaad --- /dev/null +++ b/database/migrations/2018_04_26_003259_create_import_jobs_table.php @@ -0,0 +1,38 @@ +increments('id'); + $table->bigInteger('profile_id')->unsigned(); + $table->string('service')->default('instagram'); + $table->string('uuid')->nullable(); + $table->string('storage_path')->nullable(); + $table->tinyInteger('stage')->unsigned()->default(0); + $table->text('media_json')->nullable(); + $table->timestamp('completed_at')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('import_jobs'); + } +} diff --git a/database/migrations/2018_06_22_062621_create_report_comments_table.php b/database/migrations/2018_06_22_062621_create_report_comments_table.php new file mode 100644 index 00000000..51594cc8 --- /dev/null +++ b/database/migrations/2018_06_22_062621_create_report_comments_table.php @@ -0,0 +1,35 @@ +increments('id'); + $table->bigInteger('report_id')->unsigned()->index(); + $table->bigInteger('profile_id')->unsigned(); + $table->bigInteger('user_id')->unsigned(); + $table->text('comment'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('report_comments'); + } +} diff --git a/database/migrations/2018_06_22_062628_create_report_logs_table.php b/database/migrations/2018_06_22_062628_create_report_logs_table.php new file mode 100644 index 00000000..74551aed --- /dev/null +++ b/database/migrations/2018_06_22_062628_create_report_logs_table.php @@ -0,0 +1,37 @@ +increments('id'); + $table->bigInteger('profile_id')->unsigned(); + $table->bigInteger('item_id')->unsigned()->nullable(); + $table->string('item_type')->nullable(); + $table->string('action')->nullable(); + $table->boolean('system_message')->default(false); + $table->json('metadata')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('report_logs'); + } +} diff --git a/database/migrations/2018_07_05_010303_create_account_logs_table.php b/database/migrations/2018_07_05_010303_create_account_logs_table.php new file mode 100644 index 00000000..1d200733 --- /dev/null +++ b/database/migrations/2018_07_05_010303_create_account_logs_table.php @@ -0,0 +1,40 @@ +bigIncrements('id'); + $table->bigInteger('user_id')->unsigned()->index(); + $table->bigInteger('item_id')->unsigned()->nullable(); + $table->string('item_type')->nullable(); + $table->string('action')->nullable(); + $table->string('message')->nullable(); + $table->string('link')->nullable(); + $table->string('ip_address')->nullable(); + $table->string('user_agent')->nullable(); + $table->json('metadata')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('account_logs'); + } +} diff --git a/database/migrations/2018_07_12_054015_create_user_settings_table.php b/database/migrations/2018_07_12_054015_create_user_settings_table.php new file mode 100644 index 00000000..21d67200 --- /dev/null +++ b/database/migrations/2018_07_12_054015_create_user_settings_table.php @@ -0,0 +1,50 @@ +bigIncrements('id'); + $table->bigInteger('user_id')->unsigned()->unique(); + $table->string('role')->default('user'); + $table->boolean('crawlable')->default(true); + $table->boolean('show_guests')->default(true); + $table->boolean('show_discover')->default(true); + $table->boolean('public_dm')->default(false); + $table->boolean('hide_cw_search')->default(true); + $table->boolean('hide_blocked_search')->default(true); + $table->boolean('always_show_cw')->default(false); + $table->boolean('compose_media_descriptions')->default(false); + $table->boolean('reduce_motion')->default(false); + $table->boolean('optimize_screen_reader')->default(false); + $table->boolean('high_contrast_mode')->default(false); + $table->boolean('video_autoplay')->default(false); + $table->boolean('send_email_new_follower')->default(false); + $table->boolean('send_email_new_follower_request')->default(true); + $table->boolean('send_email_on_share')->default(false); + $table->boolean('send_email_on_like')->default(false); + $table->boolean('send_email_on_mention')->default(false); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('user_settings'); + } +} diff --git a/database/migrations/2018_07_15_011916_add_2fa_to_users_table.php b/database/migrations/2018_07_15_011916_add_2fa_to_users_table.php new file mode 100644 index 00000000..ad77b5c6 --- /dev/null +++ b/database/migrations/2018_07_15_011916_add_2fa_to_users_table.php @@ -0,0 +1,38 @@ +boolean('2fa_enabled')->default(false); + $table->string('2fa_secret')->nullable(); + $table->json('2fa_backup_codes')->nullable(); + $table->timestamp('2fa_setup_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('2fa_enabled'); + $table->dropColumn('2fa_secret'); + $table->dropColumn('2fa_backup_codes'); + $table->dropColumn('2fa_setup_at'); + }); + } +} diff --git a/database/migrations/2018_07_15_013106_create_user_filters_table.php b/database/migrations/2018_07_15_013106_create_user_filters_table.php new file mode 100644 index 00000000..ef13bc98 --- /dev/null +++ b/database/migrations/2018_07_15_013106_create_user_filters_table.php @@ -0,0 +1,41 @@ +bigIncrements('id'); + $table->bigInteger('user_id')->unsigned()->index(); + $table->bigInteger('filterable_id')->unsigned(); + $table->string('filterable_type'); + $table->string('filter_type')->default('block')->index(); + $table->unique([ + 'user_id', + 'filterable_id', + 'filterable_type', + 'filter_type' + ], 'filter_unique'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('user_filters'); + } +} diff --git a/public/img/pixelfed-icon-color.svg b/public/img/pixelfed-icon-color.svg new file mode 100644 index 00000000..67eba7d8 --- /dev/null +++ b/public/img/pixelfed-icon-color.svg @@ -0,0 +1,26 @@ + + + + 04/icon/color/svg/pixelfed-icon-color + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/assets/js/components/passport/AuthorizedClients.vue b/resources/assets/js/components/passport/AuthorizedClients.vue new file mode 100644 index 00000000..11a06892 --- /dev/null +++ b/resources/assets/js/components/passport/AuthorizedClients.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/resources/assets/js/components/passport/Clients.vue b/resources/assets/js/components/passport/Clients.vue new file mode 100644 index 00000000..5cd68f26 --- /dev/null +++ b/resources/assets/js/components/passport/Clients.vue @@ -0,0 +1,350 @@ + + + + + diff --git a/resources/assets/js/components/passport/PersonalAccessTokens.vue b/resources/assets/js/components/passport/PersonalAccessTokens.vue new file mode 100644 index 00000000..14541a29 --- /dev/null +++ b/resources/assets/js/components/passport/PersonalAccessTokens.vue @@ -0,0 +1,298 @@ + + + + + diff --git a/resources/views/layouts/partial/footer.blade.php b/resources/views/layouts/partial/footer.blade.php index 90d9c07c..d5dd33bc 100644 --- a/resources/views/layouts/partial/footer.blade.php +++ b/resources/views/layouts/partial/footer.blade.php @@ -1,18 +1,16 @@