diff --git a/resources/autoload.php b/resources/autoload.php index af41edfc..32a8ebf7 100644 --- a/resources/autoload.php +++ b/resources/autoload.php @@ -19,6 +19,7 @@ require_once __DIR__ . "/lib/UnityConfig.php"; require_once __DIR__ . "/lib/UnityWebhook.php"; require_once __DIR__ . "/lib/UnityRedis.php"; +require_once __DIR__ . "/lib/UnityGithub.php"; // run init script require __DIR__ . "/init.php"; diff --git a/resources/init.php b/resources/init.php index c1f8fd79..812eed42 100644 --- a/resources/init.php +++ b/resources/init.php @@ -12,6 +12,7 @@ use UnityWebPortal\lib\UnityUser; use UnityWebPortal\lib\UnityRedis; use UnityWebPortal\lib\UnityWebhook; +use UnityWebPortal\lib\UnityGithub; // // Initialize Session @@ -84,6 +85,8 @@ $CONFIG["site"]["url"] . $CONFIG["site"]["prefix"] ); +$GITHUB = new UnityGithub(); + // // SSO Init // diff --git a/resources/lib/UnityGithub.php b/resources/lib/UnityGithub.php new file mode 100644 index 00000000..e9898cee --- /dev/null +++ b/resources/lib/UnityGithub.php @@ -0,0 +1,31 @@ +key attribute + // if bad URL or no such user, returns status=404 object + // if no keys, returns [] + if ((!is_array($keys)) || (count($keys) == 0)) { + return []; + } + // phpcs:disable + return array_map(function($x){return $x->key;}, $keys); + // phpcs:enable + } +} diff --git a/resources/lib/UnitySite.php b/resources/lib/UnitySite.php index 4fff371c..1b3acb88 100644 --- a/resources/lib/UnitySite.php +++ b/resources/lib/UnitySite.php @@ -25,31 +25,6 @@ public static function removeTrailingWhitespace($arr) return $out; } - public static function getGithubKeys($username) - { - $url = "https://api.github.com/users/$username/keys"; - $headers = array( - "User-Agent: Unity Cluster User Portal" - ); - - $curl = curl_init(); - curl_setopt($curl, CURLOPT_URL, $url); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); - $keys = json_decode(curl_exec($curl), false); - curl_close($curl); - - // normally returns array of objects each with a ->key attribute - // if bad URL or no such user, returns status=404 object - // if no keys, returns [] - if ((!is_array($keys)) || (count($keys) == 0)) { - return []; - } - // phpcs:disable - return array_map(function($x){return $x->key;}, $keys); - // phpcs:enable - } - public static function testValidSSHKey($key_str) { // key loader still throws, these just mute warnings for phpunit diff --git a/test/functional/SSHKeyAddTest.php b/test/functional/SSHKeyAddTest.php new file mode 100644 index 00000000..4bf76781 --- /dev/null +++ b/test/functional/SSHKeyAddTest.php @@ -0,0 +1,117 @@ + "addKey", + "add_type" => "paste", + "key" => $key + ] + ); + } + } + + private function addSshKeysImport(array $keys): void { + foreach ($keys as $key) { + $tmp = tmpfile(); + $tmp_path = stream_get_meta_data($tmp)["uri"]; + fwrite($tmp, $key); + $_FILES["keyfile"] = ["tmp_name" => $tmp_path]; + try { + post( + __DIR__ . "/../../webroot/panel/account.php", + ["form_type" => "addKey", "add_type" => "import"] + ); + } finally { + unlink($tmp_path); + unset($_FILES["keyfile"]); + } + } + } + + private function addSshKeysGenerate(array $keys): void { + foreach ($keys as $key) { + post( + __DIR__ . "/../../webroot/panel/account.php", + [ + "form_type" => "addKey", + "add_type" => "generate", + "gen_key" => $key + ] + ); + } + } + + private function addSshKeysGithub(array $keys): void { + global $GITHUB; + $oldGithub = $GITHUB; + $GITHUB = $this->createMock(UnityGithub::class); + $GITHUB->method("getSshPublicKeys")->willReturn($keys); + try { + post( + __DIR__ . "/../../webroot/panel/account.php", + [ + "form_type" => "addKey", + "add_type" => "github", + "gh_user" => "foobar" + ] + ); + } finally { + $GITHUB = $oldGithub; + } + } + + public static function provider() { + $validKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB+XqO25MUB9x/pS04I3JQ7rMGboWyGXh0GUzkOrTi7a foobar"; + $invalidKey = "foobar"; + $methods = [ + "addSshKeysPaste", + "addSshKeysImport", + "addSshKeysGenerate", + "addSshKeysGithub" + ]; + $output = []; + foreach ($methods as $method) { + $output = array_merge($output, [ + [$method, 0, []], + [$method, 0, [$invalidKey]], + [$method, 1, [$validKey]], + [$method, 1, [$validKey, $invalidKey]], + [$method, 1, [$validKey, $validKey]], + ]); + } + return $output; + } + + public function getKeyCount() + { + global $USER; + return count($USER->getSSHKeys(true)); + } + + #[DataProvider("provider")] + public function testAddSshKeys(string $methodName, int $expectedKeysAdded, array $keys) + { + global $USER; + switchUser(...getUserHasNoSshKeys()); + $numKeysBefore = $this->getKeyCount($USER); + $this->assertEquals(0, $numKeysBefore); + try { + call_user_func([SSHKeyAddTest::class, $methodName], $keys); + // $method($keys); + $numKeysAfter = $this->getKeyCount($USER); + $this->assertEquals($expectedKeysAdded, ($numKeysAfter - $numKeysBefore)); + } finally { + $USER->setSSHKeys([]); + } + } +} diff --git a/test/phpunit-bootstrap.php b/test/phpunit-bootstrap.php index 9a4ab363..04bf52d6 100644 --- a/test/phpunit-bootstrap.php +++ b/test/phpunit-bootstrap.php @@ -13,6 +13,7 @@ require_once __DIR__ . "/../resources/lib/UnityConfig.php"; require_once __DIR__ . "/../resources/lib/UnityWebhook.php"; require_once __DIR__ . "/../resources/lib/UnityRedis.php"; +require_once __DIR__ . "/../resources/lib/UnityGithub.php"; global $HTTP_HEADER_TEST_INPUTS; $HTTP_HEADER_TEST_INPUTS = [ @@ -43,7 +44,7 @@ function switchUser(string $eppn, string $given_name, string $sn, string $mail): void { - global $CONFIG, $REDIS, $LDAP, $SQL, $MAILER, $WEBHOOK, $SITE, $SSO, $OPERATOR, $USER, $SEND_PIMESG_TO_ADMINS, $LOC_HEADER, $LOC_FOOTER; + global $CONFIG, $REDIS, $LDAP, $SQL, $MAILER, $WEBHOOK, $GITHUB, $SITE, $SSO, $OPERATOR, $USER, $SEND_PIMESG_TO_ADMINS, $LOC_HEADER, $LOC_FOOTER; session_write_close(); session_id(str_replace(["_", "@", "."], "-", $eppn)); // session_start will be called on the first post() @@ -58,7 +59,7 @@ function switchUser(string $eppn, string $given_name, string $sn, string $mail): function post(string $phpfile, array $post_data): void { - global $CONFIG, $REDIS, $LDAP, $SQL, $MAILER, $WEBHOOK, $SITE, $SSO, $OPERATOR, $USER, $SEND_PIMESG_TO_ADMINS, $LOC_HEADER, $LOC_FOOTER; + global $CONFIG, $REDIS, $LDAP, $SQL, $MAILER, $WEBHOOK, $GITHUB, $SITE, $SSO, $OPERATOR, $USER, $SEND_PIMESG_TO_ADMINS, $LOC_HEADER, $LOC_FOOTER; $_SERVER["REQUEST_METHOD"] = "POST"; $_POST = $post_data; ob_start(); @@ -89,6 +90,11 @@ function getUserHasNotRequestedAccountDeletionHasNoGroups() return ["user2@org1.test", "foo", "bar", "user2@org1.test"]; } +function getUserHasNoSshKeys() +{ + return ["user3@org1.test", "foo", "bar", "user3@org1.test"]; +} + function getUserNotPiNotRequestedBecomePi() { return ["user2@org1.test", "foo", "bar", "user2@org1.test"]; diff --git a/test/unit/UnityGithubTest.php b/test/unit/UnityGithubTest.php new file mode 100644 index 00000000..d36841b3 --- /dev/null +++ b/test/unit/UnityGithubTest.php @@ -0,0 +1,32 @@ +assertEquals($expected, $GITHUB->getSshPublicKeys($username)); + } +} diff --git a/test/unit/UnitySiteTest.php b/test/unit/UnitySiteTest.php index bc220cce..1694e44a 100644 --- a/test/unit/UnitySiteTest.php +++ b/test/unit/UnitySiteTest.php @@ -9,18 +9,67 @@ class UnitySiteTest extends TestCase { public static function SSHKeyProvider() { - return [ - [false, ""], - [false, "foobar"], - [false, "1"], - [false, '{"key": "value"}'], - [true, "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB+XqO25MUB9x/pS04I3JQ7rMGboWyGXh0GUzkOrTi7a"], - [false, " ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB+XqO25MUB9x/pS04I3JQ7rMGboWyGXh0GUzkOrTi7a "], - //phpcs:disable - [true, "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJNqo8NKTfXgCsaE3ly0tDCfwFuFgJiftup0bIZnRi5bP5QgDN5BFeJfEUPSY/s/GL2hUAjkz3ytGqvadt84W7w="], - [true, "ssh-rsa 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"], - //phpcs:enable + global $HTTP_HEADER_TEST_INPUTS; + $validKeys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB+XqO25MUB9x/pS04I3JQ7rMGboWyGXh0GUzkOrTi7a", + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB+XqO25MUB9x/pS04I3JQ7rMGboWyGXh0GUzkOrTi7a foobar", + "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBF/dSI9/7YWeyB8wa4rEWRdeb9pQbrGxZwYFV2ulr0agXdbiJIApp0MWDYlIc9XI+4Y+cVAj66PQ2YaRz44BV+o=", + "ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBOr8ZnJPs/mP/1c74P8NsiPL2pq/vKo6u0vtkgqgyZjqJJpPS5rP6EFJkT8DI0Fx9/70jvyH8wGK6tx+/gNElMlZ6P2RyHbDvL4Nh2LAEW3BQ2lbULyElP/ZeXIEQzPxng==", + "ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAFmNNrz+B6exxuReTXQJzXUzJ4zB5JTuB8Xtcr79P4tk4SlA5a5ufQlsqMdPRhA76KFaLmONGF1e+vwcQWsj/MbRQE0H56tkZRNa+ch5/YI6iKSffkzpRKogl/uTP4rlpRb1vppsURRYxQ2JBzLYolj8VUV+N0sCwM+8maiOGJYuc4dlQ==", + "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC6RjRhmaBfCN9l9qsnjplvatK/a7zb2tdbg7kDj8mWXfbC1zkELLLX/L+5hAySbm8QXPgr18CqcyV9LqK+vJ/aPHRNo3E/mp14pxp0nHpPlMzUV8ybl2uk2kBMXWRweOYfAcA5eJToHVAXJEVBvcwDI1WVG9Nfo5w1UhGSqcn4oQ==", + implode("", [ + "ssh-rsa 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", + "HYVsQ3ySfQ==", + ]) ]; + $validKeysArgs = array_map(function($x){return [true, $x];}, $validKeys); + $invalidKeysArgs = array_map(function($x){return [false, $x];}, $HTTP_HEADER_TEST_INPUTS); + return $validKeysArgs + $invalidKeysArgs; } #[DataProvider("SSHKeyProvider")] @@ -30,26 +79,4 @@ public function testTestValidSSHKey(bool $expected, string $key) $this->assertEquals($expected, $SITE->testValidSSHKey($key)); } - public static function providerTestGetGithubKeys() - { - return [ - # empty - ["", []], - # nonexistent user - ["asdfkljhasdflkjashdflkjashdflkasjd", []], - # user with no keys - ["sheldor1510", []], - # user with 1 key - //phpcs:disable - ["simonLeary42", ["ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDGRl6JWPj+Gq2Lz9GjYdUl4/unLoFOyfgeiII1CxutpabPByRJbeuonR0zTpn51tZeYuAUOJBOeKt+Lj4i4UDGl6igpdXXSwkBXl7jxfRPwJ6WuTkDx7Z8ynwnqlDV2q089q4OX/b/uuHgsIhIBwrouKsRQaZIqTbwNMfiqQ2zl14V0KMrTPzOiwR6Q+hqSaR5Z29WKE7ff/OWzSC3/0T6avCmcCbQaRPJdVM+QC17B0vl8FzPwRjorMngwZ0cImdQ/0Ww1d12YAL7UWp1c2egfnthKP3MuQZnNF8ixsAk1eIIwTRdiI87BOoorW8NXhxXmhyheRCsFwyP4LJBqyUVoZJ0UYyk0AO4G9EStnfpiz8YXGK+M1G4tUrWgzs1cdjlHtgCWUmITtgabnYCC4141m7n4GZTk2H/lSrJcvAs3JEiwLTj1lzeGgzeSsz/XKsnOJyzjEVr2Jp3iT+J9PbQpfS0SxTCIGgxMqllovv79pfsF/zc+vaxqSShyHW7oyn7hLMHM60LO/IIX1RWGL3rD9ecXx2pXXQ1RhIkVteIi13XkFt+KW00cstFlAd3EHCoY/XorShd2jeID7tpnYlmNfotYUs6IKefvpNC0PWkh5UXFEv3SUfw4Wd8O0DiHfhkrhxn1W/GajqSIlZ5DKgPzFg8EHexv8lSa7WJg0H3YQ=="]] - //phpcs:enable - ]; - } - - #[DataProvider("providerTestGetGithubKeys")] - public function testGetGithubKeys(string $username, array $expected) - { - $SITE = new UnitySite(); - $this->assertEquals($expected, $SITE->getGithubKeys($username)); - } } diff --git a/tools/docker-dev/identity/bootstrap.ldif b/tools/docker-dev/identity/bootstrap.ldif index ab65e620..9b5553ff 100644 --- a/tools/docker-dev/identity/bootstrap.ldif +++ b/tools/docker-dev/identity/bootstrap.ldif @@ -13980,7 +13980,6 @@ objectclass: posixAccount objectclass: top objectclass: ldapPublicKey sn: Surname -sshpublickey: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3Rk+JhKNK4BL6EfvBpFpAklfvbhQYu5F4T3MBS+SErUn//UgVoW9Mam1H8F3cA0pkYbzgCeak9qOTvgOAoG6TihZj5ltCBWTdVJzhoAARYuJQ9mERunOndIp69helEK/lXsl++zdUb+znX3QT+oyeyb28+l96gBc8yspgUAmp1UAgR9vxoonNR33/w9D0OGa7y7W6kAhZ/itqVbHtqemZ4GB99jcsJ1ZRXbEgIJxa2Dbi+LHV4zVku7nHiFi8VVzvxejGeK545yh/Ox7JDi1Cglv43bIHlWPEz3biU9F7tevaZDV85Il2NuXN+lLVC/j1Tm9P38emMRiNN7uGDr9v uid: user3_org1_test uidnumber: 1018 diff --git a/webroot/panel/account.php b/webroot/panel/account.php index 8bc02a15..23a7a918 100644 --- a/webroot/panel/account.php +++ b/webroot/panel/account.php @@ -38,7 +38,7 @@ break; case "github": $gh_user = $_POST["gh_user"]; - $keys = UnitySite::getGithubKeys($gh_user); + $keys = $GITHUB->getSshPublicKeys($gh_user); foreach ($keys as $key) { if (UnitySite::testValidSSHKey($key)) { array_push($added_keys, $key);