diff --git a/src/Api.php b/src/Api.php index b078d2a..4c16bf9 100644 --- a/src/Api.php +++ b/src/Api.php @@ -42,17 +42,17 @@ class Api { $password = $password ?: config('nami.auth.password'); $groupid = $groupid ?: config('nami.auth.groupid'); - Http::withOptions(['cookies' => $this->cookie])->get(self::$url.'/ica/pages/login.jsp'); - $response = Http::asForm()->withOptions(['cookies' => $this->cookie])->post(self::$url.'/ica/rest/nami/auth/manual/sessionStartup', [ + $this->http()->get(self::$url.'/ica/pages/login.jsp'); + $response = $this->http()->asForm()->post(self::$url.'/ica/rest/nami/auth/manual/sessionStartup', [ 'Login' => 'API', 'redirectTo' => './app.jsp', 'username' => $mglnr, 'password' => $password - ])->json(); + ]); - if ($response['statusCode'] !== 0) { + if ($response->json()['statusCode'] !== 0) { $e = new LoginException(); - $e->setResponse($response); + $e->setResponse($response->json()); throw $e; } diff --git a/src/Backend/FakeBackend.php b/src/Backend/FakeBackend.php index 94beef6..5c919a3 100644 --- a/src/Backend/FakeBackend.php +++ b/src/Backend/FakeBackend.php @@ -5,10 +5,14 @@ namespace Zoomyboy\LaravelNami\Backend; use Illuminate\Http\Client\Response; use Illuminate\Support\Facades\Http; use GuzzleHttp\Psr7\Response as GuzzleResponse; +use GuzzleHttp\Cookie\SetCookie; class FakeBackend { private $members; + private $passwords; + public $groups = []; + public $loggedInAs = null; public function __construct() { $this->members = collect([]); @@ -19,6 +23,7 @@ class FakeBackend { } public function cookie($cookie) { + $this->cookie = $cookie; return $this; } @@ -35,10 +40,30 @@ class FakeBackend { return; } - throw new \Exception('no handler found for URL '.$url); + $this->urlNotFoundException($url); } public function get($url) { + if (preg_match('|/ica/rest/nami/mitglied/filtered-for-navigation/gruppierung/gruppierung/([0-9]+)/flist|', $url, $matches)) { + list($url, $groupId) = $matches; + + $members = $this->members->filter(function($m) use ($groupId) { + return $m['gruppierungId'] == $groupId; + })->map(function($member) { + return [ + "entries_id" => $member['id'], + "id" => $member['id'], + "entries_mitgliedsNummer" => $member['id'], + ]; + }); + return $this->response([ + "success" => true, + 'data' => $members, + "responseType" => "OK", + "metaData" => [] + ]); + } + if (preg_match('|/ica/rest/nami/mitglied/filtered-for-navigation/gruppierung/gruppierung/([0-9]+)/([0-9]+)|', $url, $matches)) { list($url, $groupId, $memberId) = $matches; @@ -51,6 +76,80 @@ class FakeBackend { 'data' => $member ]))); } + + if ($url === 'https://nami.dpsg.de/ica/pages/login.jsp') { + return; + } + + if ($url === 'https://nami.dpsg.de/ica/rest/nami/gruppierungen/filtered-for-navigation/gruppierung/node/root') { + $groups = collect(data_get($this->groups, $this->loggedInAs))->map(function($group) { + return [ + "descriptor" => "Solingen-Wald, Silva 100105", + "name" => "", + "representedClass" => "de.iconcept.nami.entity.org.Gruppierung", + "id" => $group + ]; + })->toArray(); + + return $this->response([ + "success" => true, + "data" => $groups, + "responseType" => "OK" + ]); + } + + $this->urlNotFoundException($url); + } + + public function post($url, $data) { + if ($url === 'https://nami.dpsg.de/ica/rest/nami/auth/manual/sessionStartup') { + if (!data_get($data, 'username') || !data_get($data, 'password')) { + return $this->wrongLoginResponse(); + } + + if ($this->passwords[data_get($data, 'username')] === data_get($data, 'password')) { + $this->loggedInAs = data_get($data, 'username'); + $this->cookie->setCookie(tap(SetCookie::fromString('JSESSIONID=rZMBv1McDAJ-KukQ6BboJBTq.srv-nami06; path=/ica'), function($cookie) { + $cookie->setDomain('nami.dpsg.de'); + })); + return $this->response([ + "statusCode" => 0, + ]); + } + } + + $this->urlNotFoundException($url); + } + + private function wrongLoginResponse() { + return $this->response([ + "servicePrefix" => null, + "methodCall" => null, + "response" => null, + "statusCode" => 3000, + "statusMessage" => "Benutzer nicht gefunden oder Passwort falsch.", + "apiSessionName" => "JSESSIONID", + "apiSessionToken" => "qrjlt_YFVhtRPU-epc-58AB1", + "minorNumber" => 0, + "majorNumber" => 0, + ]); + } + + public function response($data) { + return new Response(new GuzzleResponse(200, [], json_encode($data))); + } + + public function fakeNamiPassword($mglnr, $password, $groups) { + $this->passwords[$mglnr] = $password; + $this->groups[$mglnr] = $groups; + } + + public function asForm() { + return $this; + } + + public function urlNotFoundException($url) { + throw new \Exception('no handler found for URL '.$url); } } diff --git a/src/FakesNami.php b/src/FakesNami.php index 97328e8..7fdd3ce 100644 --- a/src/FakesNami.php +++ b/src/FakesNami.php @@ -25,4 +25,8 @@ trait FakesNami { } } + public function fakeNamiPassword($mglnr, $password, $groups) { + Backend::fakeNamiPassword($mglnr, $password, $groups); + } + } diff --git a/src/Providers/NamiUserProvider.php b/src/Providers/NamiUserProvider.php index fc5d128..a1f836f 100644 --- a/src/Providers/NamiUserProvider.php +++ b/src/Providers/NamiUserProvider.php @@ -43,8 +43,9 @@ class NamiUserProvider implements UserProvider { return false; } - Cache::forever('member.'.$credentials['mglnr'], [ - 'data' => $data, + Cache::forever('namicookie-'.$credentials['mglnr'], [ + 'data' => $data->toArray(), + 'cookie' => $api->cookie->toArray(), 'credentials' => $credentials ]);