diff --git a/app/Http/Controllers/IndieAuthController.php b/app/Http/Controllers/IndieAuthController.php deleted file mode 100644 index 188a1a68..00000000 --- a/app/Http/Controllers/IndieAuthController.php +++ /dev/null @@ -1,94 +0,0 @@ -client = $client; - } - - /** - * Begin the indie auth process. This method ties in to the login page - * from our micropub client. Here we then query the user’s homepage - * for their authorisation endpoint, and redirect them there with a - * unique secure state value. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Routing\RedirectResponse redirect - */ - public function start(Request $request) - { - $url = normalize_url($request->input('me')); - $authorizationEndpoint = $this->client->discoverAuthorizationEndpoint($url); - if ($authorizationEndpoint != null) { - $state = bin2hex(openssl_random_pseudo_bytes(16)); - session(['state' => $state]); - $authorizationURL = $this->client->buildAuthorizationURL( - $authorizationEndpoint, - $url, - route('indieauth-callback'), //redirect_uri - route('micropub-client'), //client_id - $state - ); - if ($authorizationURL) { - return redirect($authorizationURL); - } - - return redirect(route('micropub-client'))->with('error', 'Error building authorization URL'); - } - - return redirect(route('micropub-client'))->with('error', 'Unable to determine authorisation endpoint'); - } - - /** - * Once they have verified themselves through the authorisation endpoint - * the next step is register/login the user. - * - * @param \Illuminate\Http\Rrequest $request - * @return \Illuminate\Routing\RedirectResponse redirect - */ - public function callback(Request $request) - { - if ($request->session()->get('state') != $request->input('state')) { - return redirect(route('micropub-client'))->with( - 'error', - 'Invalid state value returned from indieauth server' - ); - } - - $url = normalize_url($request->input('me')); - $indiewebUser = IndieWebUser::firstOrCreate(['me' => $url]); - $request->session()->put(['me' => $url]); - - return redirect(route('micropub-client')); - } - - /** - * Log out the user, flush the session data. - * - * @return \Illuminate\Routing\RedirectResponse redirect - */ - public function logout(Request $request) - { - $request->session()->flush(); - - return redirect(route('micropub-client')); - } -} diff --git a/app/Http/Controllers/MicropubClientController.php b/app/Http/Controllers/MicropubClientController.php deleted file mode 100644 index 96974b7e..00000000 --- a/app/Http/Controllers/MicropubClientController.php +++ /dev/null @@ -1,548 +0,0 @@ -indieClient = $indieClient; - $this->guzzleClient = $guzzleClient; - } - - /** - * Display the new notes form. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\View\Factory view - */ - public function create(Request $request) - { - //initiate varaibles - $indiewebUser = null; - $syndication = null; - $mediaEndpoint = null; - $mediaURLs = null; - $url = $request->session()->get('me'); - if ($url) { - $indiewebUser = IndieWebUser::where('me', $url)->first(); - } - if ($indiewebUser) { - $syndication = $this->parseSyndicationTargets($indiewebUser->syndication); - $mediaEndpoint = $indiewebUser->mediaEndpoint ?? null; - $mediaURLs = $request->session()->get('media-links'); - } - - return view('micropub.create', compact('url', 'syndication', 'mediaEndpoint', 'mediaURLs')); - } - - /** - * Process an upload to the media endpoint. - * - * @param Illuminate\Http\Request $request - * @return Illuminate\Http\Response - */ - public function processMedia(Request $request) - { - if ($request->hasFile('files') == false) { - return back()->with('error', 'No files uploaded'); - } - - $user = IndieWebUser::where('me', $request->session()->get('me'))->firstOrFail(); - if ($user->mediaEndpoint == null || $user->token == null) { - return back()->with('error', 'No user token or known endpoint'); - } - - $mediaURLs = []; - foreach ($request->file('files') as $file) { - try { - $response = $this->guzzleClient->request('POST', $user->mediaEndpoint, [ - 'headers' => [ - 'Authorization' => 'Bearer ' . $user->token, - ], - 'multipart' => [ - [ - 'name' => 'file', - 'contents' => fopen($file->path(), 'r'), - 'filename' => $file->getClientOriginalName(), - ], - ], - ]); - } catch (ClientException | ServerException $e) { - continue; - } - - $mediaURLs[] = $response->getHeader('Location')[0]; - } - - $storedMediaURLs = $request->session()->get('media-links') ?? []; - $mediaURLsToSave = array_merge($storedMediaURLs, $mediaURLs); - $request->session()->put('media-links', $mediaURLsToSave); - - return redirect()->route('micropub-client'); - } - - public function clearLinks(Request $request) - { - $request->session()->forget('media-links'); - - return redirect(route('micropub-client')); - } - - /** - * Post the notes content to the relavent micropub API endpoint. - * - * @todo make sure this works with multiple syndication targets - * - * @param \Illuminate\Http\Request $request - * @return mixed - */ - public function store(Request $request) - { - $url = normalize_url($request->session()->get('me')); - $user = IndieWebUser::where('me', $url)->firstOrFail(); - - if ($user->token == null) { - return redirect()->route('micropub-client')->with('error', 'You haven’t requested a token yet'); - } - - $micropubEndpoint = $this->indieClient->discoverMicropubEndpoint($url); - if (! $micropubEndpoint) { - return redirect()->route('micropub-client')->with('error', 'Unable to determine micropub API endpoint'); - } - - $headers = [ - 'Authorization' => 'Bearer ' . $user->token, - ]; - - if ($user->syntax == 'html') { - $multipart = [ - [ - 'name' => 'h', - 'contents' => 'entry', - ], - [ - 'name' => 'content', - 'contents' => $request->input('content'), - ], - ]; - if ($request->hasFile('photo')) { - $photos = $request->file('photo'); - foreach ($photos as $photo) { - $multipart[] = [ - 'name' => 'photo[]', - 'contents' => fopen($photo->path(), 'r'), - 'filename' => $photo->getClientOriginalName(), - ]; - } - } - if ($request->input('in-reply-to') != '') { - $multipart[] = [ - 'name' => 'in-reply-to', - 'contents' => $request->input('in-reply-to'), - ]; - } - if ($request->input('mp-syndicate-to')) { - foreach ($request->input('mp-syndicate-to') as $syn) { - $multipart[] = [ - 'name' => 'mp-syndicate-to[]', - 'contents' => $syn, - ]; - } - } - if ($request->input('location')) { - if ($request->input('location') !== 'no-location') { - $multipart[] = [ - 'name' => 'location', - 'contents' => $request->input('location'), - ]; - } - } - if ($request->input('media')) { - foreach ($request->input('media') as $media) { - $multipart[] = [ - 'name' => 'photo[]', - 'contents' => $media, - ]; - } - } - try { - $response = $this->guzzleClient->post($micropubEndpoint, [ - 'multipart' => $multipart, - 'headers' => $headers, - ]); - } catch (\GuzzleHttp\Exception\BadResponseException $e) { - return redirect()->route('micropub-client')->with( - 'error', - 'There was a bad response from the micropub endpoint.' - ); - } - - if ($response->getStatusCode() == 201) { - $request->session()->forget('media-links'); - $location = $response->getHeader('Location'); - if (is_array($location)) { - return redirect($location[0]); - } - - return redirect($location); - } - } - - if ($user->syntax == 'json') { - $json = []; - $json['type'] = ['h-entry']; - $json['properties'] = ['content' => [$request->input('content')]]; - - if ($request->input('in-reply-to') != '') { - $json['properties']['in-reply-to'][] = $request->input('in-reply-to'); - } - if ($request->input('mp-syndicate-to')) { - foreach ($request->input('mp-syndicate-to') as $syn) { - $json['properties']['mp-syndicate-to'][] = $syn; - } - } - if ($request->input('location')) { - if ($request->input('location') !== 'no-location') { - $json['properties']['location'][] = $request->input('location'); - } - } - if ($request->input('media')) { - $json['properties']['photo'] = []; - foreach ($request->input('media') as $media) { - $json['properties']['photo'][] = $media; - } - } - - try { - $response = $this->guzzleClient->post($micropubEndpoint, [ - 'json' => $json, - 'headers' => $headers, - ]); - } catch (\GuzzleHttp\Exception\BadResponseException $e) { - return redirect()->route('micropub-client')->with( - 'error', - 'There was a bad response from the micropub endpoint.' - ); - } - - if ($response->getStatusCode() == 201) { - $request->session()->forget('media-links'); - $location = $response->getHeader('Location'); - if (is_array($location)) { - return redirect($location[0]); - } - - return redirect($location); - } - } - - return redirect()->route('micropub-client')->with('error', 'Endpoint didn’t create the note.'); - } - - /** - * Show currently stored configuration values. - * - * @param Illuminate\Http\Request $request - * @return view - */ - public function config(Request $request) - { - //default values - $data = [ - 'me' => '', - 'token' => 'none', - 'syndication' => 'none defined', - 'media-endpoint' => 'none defined', - 'syntax' => 'html', - ]; - if ($request->session()->has('me')) { - $data['me'] = normalize_url($request->session()->get('me')); - $user = IndieWebUser::where('me', $request->session()->get('me'))->firstOrFail(); - $data['token'] = $user->token ?? 'none defined'; - $data['syndication'] = $user->syndication ?? 'none defined'; - $data['media-endpoint'] = $user->mediaEndpoint ?? 'none defined'; - $data['syntax'] = $user->syntax; - } - - return view('micropub.config', compact('data')); - } - - /** - * Get a new token. - * - * @param Illuminate\Http\Request $request - * @return view - */ - public function getNewToken(Request $request) - { - if ($request->session()->has('me')) { - $url = normalize_url($request->session()->get('me')); - $authozationEndpoint = $this->indieClient->discoverAuthorizationEndpoint($url); - if ($authozationEndpoint) { - $state = bin2hex(random_bytes(16)); - $request->session()->put('state', $state); - $authorizationURL = $this->indieClient->buildAuthorizationURL( - $authozationEndpoint, - $url, - route('micropub-client-get-new-token-callback'), // redirect_uri - route('micropub-client'), //client_id - $state, - 'create update' // scope needs to be a setting - ); - - return redirect($authorizationURL); - } - - return redirect()->route('micropub-config')->with('error', 'Unable to find authorisation endpoint'); - } - - return redirect()->route('micropub-config')->with('error', 'You aren’t logged in'); - } - - /** - * The callback for getting a token. - */ - public function getNewTokenCallback(Request $request) - { - if ($request->input('state') !== $request->session()->get('state')) { - return redirect()->route('micropub-config')->with('error', 'The state didn’t match.'); - } - $tokenEndpoint = $this->indieClient->discoverTokenEndpoint(normalize_url($request->input('me'))); - if ($tokenEndpoint) { - $token = $this->indieClient->getAccessToken( - $tokenEndpoint, - $request->input('code'), - $request->input('me'), - route('micropub-client-get-new-token-callback'), // redirect_uri - route('micropub-client') // client_id - ); - if (array_key_exists('access_token', $token)) { - $url = normalize_url($token['me']); - $user = IndieWebUser::where('me', $url)->firstOrFail(); - $user->token = $token['access_token']; - $user->save(); - - return redirect()->route('micropub-config'); - } - - return redirect()->route('micropub-config')->with('error', 'Error getting token from the endpoint'); - } - - return redirect()->route('micropub-config')->with('error', 'Unable to find token endpoint'); - } - - /** - * Query the micropub endpoint and store response. - * - * @param Illuminate\Http\Request $request - * @return redirect - */ - public function queryEndpoint(Request $request) - { - $url = normalize_url($request->session()->get('me')); - $user = IndieWebUser::where('me', $url)->firstOrFail(); - $token = $user->token; - $micropubEndpoint = $this->indieClient->discoverMicropubEndpoint($url); - if ($micropubEndpoint) { - try { - $response = $this->guzzleClient->get($micropubEndpoint, [ - 'headers' => ['Authorization' => 'Bearer ' . $token], - 'query' => 'q=config', - ]); - } catch (ClientException | ServerException $e) { - return back(); - } - $body = (string) $response->getBody(); - $data = json_decode($body, true); - - if (array_key_exists('syndicate-to', $data)) { - $user->syndication = json_encode($data['syndicate-to']); - } - - if (array_key_exists('media-endpoint', $data)) { - $user->mediaEndpoint = $data['media-endpoint']; - } - $user->save(); - - return back(); - } - } - - /** - * Update the syntax setting. - * - * @param Illuminate\Http\Request $request - * @return Illuminate\Http\RedirectResponse - * @todo validate input - */ - public function updateSyntax(Request $request) - { - $user = IndieWebUser::where('me', $request->session()->get('me'))->firstOrFail(); - $user->syntax = $request->syntax; - $user->save(); - - return redirect()->route('micropub-config'); - } - - /** - * Create a new place. - * - * @param \Illuminate\Http\Request $request - * @return mixed - */ - public function newPlace(Request $request) - { - $url = normalize_url($request->session()->get('me')); - $user = IndieWebUser::where('me', $url)->firstOrFail(); - - if ($user->token === null) { - return response()->json([ - 'error' => true, - 'error_description' => 'No known token', - ], 400); - } - - $micropubEndpoint = $this->indieClient->discoverMicropubEndpoint($url); - if (! $micropubEndpoint) { - return response()->json([ - 'error' => true, - 'error_description' => 'Could not determine the micropub endpoint.', - ], 400); - } - - $formParams = [ - 'h' => 'card', - 'name' => $request->input('place-name'), - 'description' => $request->input('place-description'), - 'geo' => 'geo:' . $request->input('place-latitude') . ',' . $request->input('place-longitude'), - ]; - $headers = [ - 'Authorization' => 'Bearer ' . $user->token, - ]; - try { - $response = $this->guzzleClient->request('POST', $micropubEndpoint, [ - 'form_params' => $formParams, - 'headers' => $headers, - ]); - } catch (ClientException $e) { - return response()->json([ - 'error' => true, - 'error_description' => 'Unable to create the new place', - ], 400); - } - $place = $response->getHeader('Location')[0]; - - return response()->json([ - 'uri' => $place, - 'name' => $request->input('place-name'), - 'latitude' => $request->input('place-latitude'), - 'longitude' => $request->input('place-longitude'), - ]); - } - - /** - * Make a request to the micropub endpoint requesting any nearby places. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Http\Response - */ - public function nearbyPlaces(Request $request) - { - $url = normalize_url($request->session()->get('me')); - $user = IndieWebUser::where('me', $url)->firstOrFail(); - - if ($user->token === null) { - return response()->json([ - 'error' => true, - 'error_description' => 'No known token', - ], 400); - } - - $micropubEndpoint = $this->indieClient->discoverMicropubEndpoint($url); - - if (! $micropubEndpoint) { - return response()->json([ - 'error' => true, - 'error_description' => 'No known endpoint', - ], 400); - } - - try { - $query = 'geo:' . $request->input('latitude') . ',' . $request->input('longitude'); - if ($request->input('u') !== null) { - $query .= ';u=' . $request->input('u'); - } - $response = $this->guzzleClient->get($micropubEndpoint, [ - 'headers' => ['Authorization' => 'Bearer ' . $user->token], - 'query' => ['q' => $query], - ]); - } catch (\GuzzleHttp\Exception\BadResponseException $e) { - return response()->json([ - 'error' => true, - 'error_description' => 'The endpoint ' . $micropubEndpoint . ' returned a non-good response', - ], 400); - } - - return response($response->getBody(), 200) - ->header('Content-Type', 'application/json'); - } - - /** - * Parse the syndication targets JSON into a an array. - * - * @param string|null - * @return array|null - */ - private function parseSyndicationTargets($syndicationTargets = null) - { - if ($syndicationTargets === null || $syndicationTargets === '') { - return; - } - $syndicateTo = []; - $data = json_decode($syndicationTargets, true); - if (array_key_exists('uid', $data)) { - $syndicateTo[] = [ - 'target' => $data['uid'], - 'name' => $data['name'], - ]; - } - foreach ($data as $syn) { - if (array_key_exists('uid', $syn)) { - $syndicateTo[] = [ - 'target' => $syn['uid'], - 'name' => $syn['name'], - ]; - } - } - - return $syndicateTo; - } - - /** - * Parse the media-endpoint retrieved from querying a micropub endpoint. - * - * @param string|null - * @return string - */ - private function parseMediaEndpoint($queryResponse = null) - { - if ($queryResponse === null) { - return; - } - - $data = json_decode($queryResponse, true); - if (array_key_exists('media-endpoint', $data)) { - return $data['media-endpoint']; - } - } -} diff --git a/app/IndieWebUser.php b/app/IndieWebUser.php deleted file mode 100644 index d35fa1b5..00000000 --- a/app/IndieWebUser.php +++ /dev/null @@ -1,15 +0,0 @@ -client = new Client(); - } - - /** - * Given a domain, determing the assocaited authorization endpoint, - * if one exists. - * - * @param string The domain - * @return string|null - */ - public function getAuthorizationEndpoint(string $domain): ?string - { - $endpoint = $this->client->discoverAuthorizationEndpoint($this->client->normalizeMeURL($domain)); - if ($endpoint === false) { - return null; - } - - return $endpoint; - } - - /** - * Given an authorization endpoint, build the appropriate authorization URL. - * - * @param string $authEndpoint - * @param string $domain - * @return string - */ - public function buildAuthorizationURL(string $authEndpoint, string $domain): string - { - $state = bin2hex(openssl_random_pseudo_bytes(16)); - session(['state' => $state]); - $redirectURL = route('indieauth-callback'); - $clientId = route('micropub-client'); - $authorizationURL = $this->client->buildAuthorizationURL( - $authEndpoint, - $this->client->normalizeMeURL($domain), - $redirectURL, - $clientId, - $state - ); - - return $authorizationURL; - } - - /** - * Discover the token endpoint for a given domain. - * - * @param string The domain - * @return string|null - */ - public function getTokenEndpoint(string $domain): ?string - { - return $this->client->discoverTokenEndpoint($this->client->normalizeMeURL($domain)); - } - - /** - * Retrieve a token from the token endpoint. - * - * @param array The relavent data - * @return array - */ - public function getAccessToken(array $data): array - { - return $this->client->getAccessToken( - $data['endpoint'], - $data['code'], - $data['me'], - $data['redirect_url'], - $data['client_id'], - $data['state'] - ); - } - - /** - * Determine the Authorization endpoint, then verify the suplied code is - * valid. - * - * @param array The data. - * @return array|null - */ - public function verifyIndieAuthCode(array $data): ?array - { - $authEndpoint = $this->client->discoverAuthorizationEndpoint($data['me']); - if ($authEndpoint) { - return $this->client->verifyIndieAuthCode( - $authEndpoint, - $data['code'], - $data['me'], - $data['redirect_url'], - $data['client_id'], - $data['state'] - ); - } - } - - /** - * Determine the micropub endpoint. - * - * @param string $domain - * @return string|null The endpoint - */ - public function discoverMicropubEndpoint(string $domain): ?string - { - return $this->client->discoverMicropubEndpoint($this->client->normalizeMeURL($domain)); - } -} diff --git a/changelog.md b/changelog.md index 30ac8e33..8dc24eaf 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,8 @@ # Changelog +## Version {next} + - No more built-in micropub client + ## Version 0.10 (20017-10-13) - Bookmarks! - They can only be added via micropub diff --git a/routes/web.php b/routes/web.php index d5b07e7f..dc9142cb 100644 --- a/routes/web.php +++ b/routes/web.php @@ -120,26 +120,6 @@ Route::group(['domain' => config('url.longurl')], function () { Route::get('/{bookmark}', 'BookmarksController@show'); }); - // Micropub Client - Route::group(['prefix' => 'micropub'], function () { - Route::get('/create', 'MicropubClientController@create')->name('micropub-client'); - Route::post('/', 'MicropubClientController@store')->name('micropub-client-post'); - Route::get('/config', 'MicropubClientController@config')->name('micropub-config'); - Route::get('/get-new-token', 'MicropubClientController@getNewToken')->name('micropub-client-get-new-token'); - Route::get('/get-new-token/callback', 'MicropubClientController@getNewTokenCallback')->name('micropub-client-get-new-token-callback'); - Route::get('/query-endpoint', 'MicropubClientController@queryEndpoint')->name('micropub-query-action'); - Route::post('/update-syntax', 'MicropubClientController@updateSyntax')->name('micropub-update-syntax'); - Route::get('/places', 'MicropubClientController@nearbyPlaces'); - Route::post('/places', 'MicropubClientController@newPlace'); - Route::post('/media', 'MicropubClientController@processMedia')->name('process-media'); - Route::get('/media/clearlinks', 'MicropubClientController@clearLinks'); - }); - - // IndieAuth - Route::post('indieauth/start', 'IndieAuthController@start')->name('indieauth-start'); - Route::get('indieauth/callback', 'IndieAuthController@callback')->name('indieauth-callback'); - Route::get('logout', 'IndieAuthController@logout')->name('indieauth-logout'); - // Token Endpoint Route::post('api/token', 'TokenEndpointController@create'); diff --git a/tests/Feature/IndieAuthControllerTest.php b/tests/Feature/IndieAuthControllerTest.php deleted file mode 100644 index 5461db9d..00000000 --- a/tests/Feature/IndieAuthControllerTest.php +++ /dev/null @@ -1,49 +0,0 @@ -call('POST', '/indieauth/start', ['me' => 'http://example.org']); - $this->assertSame(route('micropub-client'), $response->headers->get('Location')); - } - - /** - * Now we test the `start` method as a whole. - * - * @return void - */ - public function test_indieauthcontroller_begin_auth_redirects_to_endpoint() - { - $response = $this->call('POST', '/indieauth/start', ['me' => config('app.url')]); - $this->assertSame( - 'https://indieauth.com/auth?me=', - substr($response->headers->get('Location'), 0, 30) - ); - } - - /** - * Test the `callback` method. - * - * @return void - */ - public function test_indieauthcontroller_callback_method_gives_error_with_mismatched_state() - { - $response = $this->withSession(['state' => 'state-session']) - ->call( - 'GET', - 'indieauth/callback', - ['me', config('app.url'), 'state' => 'request-session'] - ); - $response->assertSessionHas(['error' => 'Invalid state value returned from indieauth server']); - } -} diff --git a/tests/Feature/MicropubClientControllerTest.php b/tests/Feature/MicropubClientControllerTest.php deleted file mode 100644 index a73ed6a0..00000000 --- a/tests/Feature/MicropubClientControllerTest.php +++ /dev/null @@ -1,55 +0,0 @@ - 'http://example.org/a'], 'Created'), - ]); - - $stack = HandlerStack::create($mock); - // add the history middleware to the stack - $stack->push($history); - $client = new Client(['handler' => $stack]); - - $this->app->instance(Client::class, $client); - - $response = $this->post( - '/micropub', - [ - 'content' => 'Hello Fred', - 'in-reply-to' => 'https://fredbloggs.com/note/abc', - 'mp-syndicate-to' => ['https://twitter.com/jonnybarnes', 'https://facebook.com/jonnybarnes'], - ] - ); - - $expected = '{"type":["h-entry"],"properties":{"content":["Hello Fred"],"in-reply-to":["https:\/\/fredbloggs.com\/note\/abc"],"mp-syndicate-to":["https:\/\/twitter.com\/jonnybarnes","https:\/\/facebook.com\/jonnybarnes"]}}'; - - if (count($container) === 0) { - $this->fail(); - } - - foreach ($container as $transaction) { - $this->assertEquals($expected, $transaction['request']->getBody()->getContents()); - } - */ - $this->assertTrue(true); - } -} diff --git a/tests/Feature/TokenEndpointTest.php b/tests/Feature/TokenEndpointTest.php index cf6565d4..93208248 100644 --- a/tests/Feature/TokenEndpointTest.php +++ b/tests/Feature/TokenEndpointTest.php @@ -24,8 +24,8 @@ class TokenEndpointTest extends TestCase $response = $this->post('/api/token', [ 'me' => config('app.url'), 'code' => 'abc123', - 'redirect_uri' => route('indieauth-callback'), - 'client_id' => route('micropub-client'), + 'redirect_uri' => config('app.url') . '/indieauth-callback', + 'client_id' => config('app.url') . '/micropub-client', 'state' => mt_rand(1000, 10000), ]); parse_str($response->content(), $output); diff --git a/tests/Unit/IndieAuthServiceTest.php b/tests/Unit/IndieAuthServiceTest.php deleted file mode 100644 index f65c5cf4..00000000 --- a/tests/Unit/IndieAuthServiceTest.php +++ /dev/null @@ -1,75 +0,0 @@ -getAuthorizationEndpoint(config('app.url')); - $this->assertEquals('https://indieauth.com/auth', $result); - } - - /** - * Test the getAuthorizationEndpoint method returns null on failure. - * - * @return void - */ - public function test_indieauthservice_getauthorizationendpoint_method_returns_null_on_failure() - { - $service = new IndieAuthService(); - $result = $service->getAuthorizationEndpoint('http://example.org'); - $this->assertEquals(null, $result); - } - - /** - * Test that the Service build the correct redirect URL. - * - * @return void - */ - public function test_indieauthservice_builds_correct_redirect_url() - { - $service = new IndieAuthService(); - $result = $service->buildAuthorizationURL( - 'https://indieauth.com/auth', - config('app.url') - ); - $this->assertEquals( - 'https://indieauth.com/auth?me=', - substr($result, 0, 30) - ); - } - - /** - * Test the getTokenEndpoint method. - * - * @return void - */ - public function test_indieauthservice_gettokenendpoint_method() - { - $service = new IndieAuthService(); - $result = $service->getTokenEndpoint(config('app.url')); - $this->assertEquals(config('app.url') . '/api/token', $result); - } - - /** - * Test the discoverMicropubEndpoint method. - * - * @return void - */ - public function test_indieauthservice_discovermicropubendpoint_method() - { - $service = new IndieAuthService(); - $result = $service->discoverMicropubEndpoint(config('app.url')); - $this->assertEquals(config('app.url') . '/api/post', $result); - } -}