diff --git a/app/AccountLog.php b/app/AccountLog.php new file mode 100644 index 000000000..f5ccedd9a --- /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 497bc94ee..6314accc8 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 9f03ef728..3ef8ef272 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 83f844da6..af596e02c 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 29711945d..8c2e1ce94 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 1b0a12e63..000000000 --- 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 4e25bd236..05299b1a6 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 4beb45418..48ca6150a 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 31603176b..e90f47895 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 04ee1fb1b..b9ff791dd 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 a57f84acb..dc0e1cdaa 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 000000000..db65c3580 --- /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 000000000..dcc0db282 --- /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 9d53fd8b1..8eccd726f 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 c9dff4d59..d04a7dd54 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 7c9138965..7ac547f32 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 e91042830..6f2a1dfca 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 009ed2cbf..91475ca7d 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 fca6152c3..d05aed739 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 000000000..5d364e1e9 --- /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 7ceac0564..3d15b2036 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 000000000..1f95c8136 --- /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 000000000..a0fefcaa5 --- /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 000000000..417cc9850 --- /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 000000000..959bae65b --- /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 000000000..1d0580afe --- /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 000000000..ad5129a91 --- /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 38edc3e9d..a3fb76fb7 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 000000000..071f2eeb4 --- /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 a281d980b..b426fa531 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 000000000..583039c63 --- /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 241dc199b..6e97d8eff 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 c825643a7..3e9782ac8 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 000000000..cd91ca4d1 --- /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 000000000..447deaada --- /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 000000000..51594cc85 --- /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 000000000..74551aed1 --- /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 000000000..1d2007330 --- /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 000000000..21d672000 --- /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 000000000..ad77b5c60 --- /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 000000000..ef13bc981 --- /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 000000000..67eba7d8e Binary files /dev/null and b/public/img/pixelfed-icon-color.svg differ diff --git a/resources/assets/js/components/passport/AuthorizedClients.vue b/resources/assets/js/components/passport/AuthorizedClients.vue new file mode 100644 index 000000000..11a068922 --- /dev/null +++ b/resources/assets/js/components/passport/AuthorizedClients.vue @@ -0,0 +1,107 @@ + + + +Name | +Scopes | ++ |
---|---|---|
+ {{ token.client.name }} + | + + ++ + {{ token.scopes.join(', ') }} + + | + + ++ + Revoke + + | +
+ You have not created any OAuth clients. +
+ +Client ID | +Name | +Secret | ++ | + |
---|---|---|---|---|
+ {{ client.id }} + | + + ++ {{ client.name }} + | + + +
+ {{ client.secret }}
+ |
+
+
+ + + Edit + + | + + ++ + Delete + + | +
+ You have not created any personal access tokens. +
+ + +Name | ++ |
---|---|
+ {{ token.name }} + | + + ++ + Delete + + | +