From 48a5360d0d6abe26c38f7f4394290eec4e865fcd Mon Sep 17 00:00:00 2001 From: Raphael Dannecker Date: Tue, 25 Feb 2025 16:10:55 +0100 Subject: [PATCH] Initial commit --- .htaccess | 6 + README.md | 18 ++ callback.php | 30 +++ card.php | 91 +++++++++ composer.json | 7 + config/config.php.sample | 30 +++ genkey.php | 10 + idcard-print.php | 199 +++++++++++++++++++ idcard.php | 192 +++++++++++++++++++ img/checked.svg | 333 ++++++++++++++++++++++++++++++++ img/expired.svg | 10 + img/fvs-background-print.png | Bin 0 -> 5055 bytes img/fvs-background.png | Bin 0 -> 9852 bytes img/fvs-background.svg | 92 +++++++++ img/logo-fvs.png | Bin 0 -> 40852 bytes img/logo-fvs.svg | 359 +++++++++++++++++++++++++++++++++++ img/pdf.svg | 21 ++ img/signature_invalid.svg | 124 ++++++++++++ index.php | 27 +++ logout.php | 6 + qrcode.php | 51 +++++ verify.php | 81 ++++++++ 22 files changed, 1687 insertions(+) create mode 100644 .htaccess create mode 100644 README.md create mode 100644 callback.php create mode 100644 card.php create mode 100644 composer.json create mode 100644 config/config.php.sample create mode 100755 genkey.php create mode 100644 idcard-print.php create mode 100644 idcard.php create mode 100644 img/checked.svg create mode 100644 img/expired.svg create mode 100644 img/fvs-background-print.png create mode 100644 img/fvs-background.png create mode 100644 img/fvs-background.svg create mode 100644 img/logo-fvs.png create mode 100644 img/logo-fvs.svg create mode 100644 img/pdf.svg create mode 100644 img/signature_invalid.svg create mode 100644 index.php create mode 100644 logout.php create mode 100644 qrcode.php create mode 100644 verify.php diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..57e0048 --- /dev/null +++ b/.htaccess @@ -0,0 +1,6 @@ + + Order Allow,Deny + Deny from all + +RedirectMatch 404 /\.git +RedirectMatch 404 /keys diff --git a/README.md b/README.md new file mode 100644 index 0000000..130096c --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# StudentCard + +PHP application to create and verify a student card. + +## Install: + + git clone https://git.codeberg.org/digitalsouveraeneschule/studentcard.git + +## Create keys + + php genkey.php + +## Configure + + cd config + cp config.php.sample config.php + +edit config.php diff --git a/callback.php b/callback.php new file mode 100644 index 0000000..368c1b1 --- /dev/null +++ b/callback.php @@ -0,0 +1,30 @@ +setRedirectURL($CONFIG['baseurl'] . 'callback.php'); + +// get token +$oidc->authenticate(); + +// store user data in session +$_SESSION['id_token'] = $oidc->getIdToken(); +foreach ($CONFIG['oidc']['mappings'] as $key => $value) { + $_SESSION[$key] = $oidc->requestUserInfo($value); +} + +if (! $_SESSION['doe'] ) { + $_SESSION['doe'] = $CONFIG['default_doe']; +} + +// redirect to home +header('Location: card.php'); +?> diff --git a/card.php b/card.php new file mode 100644 index 0000000..ac2dfb5 --- /dev/null +++ b/card.php @@ -0,0 +1,91 @@ + $value) { + $data[$key] = $_SESSION[$key]; +} + +if ($CONFIG['version'] === '0.1') { + $data_json = json_encode($data); + $data_crypt = sodium_crypto_box_seal($data_json, sodium_crypto_sign_ed25519_pk_to_curve25519($public_key)); + $message['verify'] = 'ausweis.steinbeis.schule'; + $message['data'] = sodium_bin2base64($data_crypt, SODIUM_BASE64_VARIANT_URLSAFE); + $message['signature'] = sodium_bin2base64(sodium_crypto_sign_detached($message['verify'] . $message['data'], $private_key), SODIUM_BASE64_VARIANT_URLSAFE); + $message_encoded = urlencode(json_encode($message)); +} elseif ($CONFIG['version'] === '0.2') { + $data_json = json_encode($data); + $data_crypt = sodium_crypto_box_seal($data_json, sodium_crypto_sign_ed25519_pk_to_curve25519($public_key)); + $message_encoded = sodium_bin2base64(sodium_crypto_sign($data_crypt, $private_key), SODIUM_BASE64_VARIANT_URLSAFE); +} elseif ($CONFIG['version'] === '0.3') { + $nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES); + $keypair = sodium_crypto_box_keypair_from_secretkey_and_publickey( + sodium_crypto_sign_ed25519_sk_to_curve25519($private_key), + sodium_crypto_sign_ed25519_pk_to_curve25519($public_key)); + $data_json = json_encode($data); + $data_crypt = sodium_crypto_box($data_json, $nonce, $keypair); + $data_crypt = sodium_crypto_box_seal($data_json, sodium_crypto_sign_ed25519_pk_to_curve25519($public_key)); + $message_encoded = sodium_bin2base64(sodium_crypto_sign($data_crypt, $private_key), SODIUM_BASE64_VARIANT_URLSAFE); +} + +//echo $message_encoded . "\n Length:" . strlen($message_encoded); +//$message_encoded = urlencode(gzcompress(json_encode($message),9)); + +//echo "data_json: " . $data_json . "\n"; +//echo "data_crypt: " . $data_crypt . "\n"; +//echo "message: "; +//var_dump($message); +//echo "\n"; +/////// sodium_crypto_sign_ed25519_sk_to_curve25519($private_key) +//echo "Message: ".$message_encoded; + +$url = $CONFIG['baseurl'] . 'verify.php?v=' . $CONFIG['version'] . '&d=' . $message_encoded; + +// url is needed by qrcode.php +$_SESSION['url'] = $url; + +$verified = true; + +if (isset($_GET['pdf'])) { + $pdf=true; + ob_start(); + include('idcard-print.php'); + $out = ob_get_contents(); + ob_end_clean(); + $html2pdf = new Html2Pdf(orientation:'L', format:Array(96,65), margins:Array(5,5,5,0)); + //$html2pdf = new Html2Pdf(orientation:'L', format:'BUSINESS_CARD',margins:Array(0,0,0,0)); + $html2pdf->writeHTML($out); + $html2pdf->output('schuelerausweis.pdf','D'); +} else { + include('idcard.php'); +} + +?> diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..6e6b1c9 --- /dev/null +++ b/composer.json @@ -0,0 +1,7 @@ +{ + "require": { + "jumbojett/openid-connect-php": "^1.0", + "endroid/qr-code": "^6.0", + "spipu/html2pdf": "^5.3" + } +} diff --git a/config/config.php.sample b/config/config.php.sample new file mode 100644 index 0000000..d0ae71f --- /dev/null +++ b/config/config.php.sample @@ -0,0 +1,30 @@ + '0.2', + 'default_doe' => '31.07.2025', + 'baseurl' => 'https://ausweis.example.com/', + 'oidc' => array( + 'url' => 'https://idam.example.com/realms/schoolrealm/', + 'clientid' => 'ausweis', + 'secret' => 'secret', + 'mappings' => array( + 'firstname' => 'given_name', + 'lastname' => 'family_name', + 'birthdate' => 'birthdate', + 'id' => 'sophomorixUnid', + 'role' => 'sophomorixRole', + 'doe' => 'doe' + ) + ), + 'ldap' => array( + 'bind_user' => 'cn=global-binduser,OU=Management,OU=GLOBAL,DC=linuxmuster,DC=lan', + 'bind_passwd' => 'secret', + 'base_dn' => 'OU=default-school,OU=SCHOOLS,DC=linuxmuster,DC=lan', + 'url' => 'ldaps://server.example.com:636', + 'filter_id' => '(&(obdjectclass=person)(sophomorixUnid=%s)(!(sophomorixAdminClass=attic)))', + 'filter_name' => '(&(objectclass=person)(givenName=%s)(sn=%s)(sophomorixBirthdate=%s)(!(sophomorixAdminClass=attic)))' + ) +); + +?> diff --git a/genkey.php b/genkey.php new file mode 100755 index 0000000..e7cb2ae --- /dev/null +++ b/genkey.php @@ -0,0 +1,10 @@ + diff --git a/idcard-print.php b/idcard-print.php new file mode 100644 index 0000000..226a340 --- /dev/null +++ b/idcard-print.php @@ -0,0 +1,199 @@ + + + + + + Schülerausweis + + + +
+
+
Identity Card
+ +
+
+
+ Name
+
+
+
+ Date of Birth
+
+
+
+ Date of Expiry
+
+ +
+
+
+ Gewerbliche Schule I
+ Karlstraße 40
+ D-72764 Reutlingen
+ www.steinbeis.schule
+ info@steinbeis.schule
+ +49 7121 485 111 +
+ + + + + +
+
+ '; } ?> + '; } ?> + '; } ?> +
+
+
+ +
+ +
+
+
+
+
+ + diff --git a/idcard.php b/idcard.php new file mode 100644 index 0000000..39ce938 --- /dev/null +++ b/idcard.php @@ -0,0 +1,192 @@ + + + + + + Schülerausweis + + + +
+
+
+
+
Identity Card
+
+ +
+
+
+
+ + Name +
+
+ + Date of Birth +
+
+ + Date of Expiry +
+
Nur gültig mit amtlichem Lichtbildausweis
Only valid with official photo Identity Card
+
+
+
+ Gewerbliche Schule I
+ Karlstraße 40
+ D-72764 Reutlingen
+ www.steinbeis.schule
+ info@steinbeis.schule
+ +49 7121 485 111 +
+
+
+ '; + } elseif (isset($valid) && !$valid) { + echo 'ungültig'; + } elseif (isset($pdf)) { + echo ''; + } else { + echo 'QR Code'; + } + } else { + echo 'Signatur ist ungültig'; + } ?> +
+
+
+
'; + echo 'verify'; + } else { + } + } else { + echo 'Die Signatur ist ungültig'; + } ?> +
+
+ " . date('H:i:s'); ?> +
+
+
+
+
+
+ + diff --git a/img/checked.svg b/img/checked.svg new file mode 100644 index 0000000..ba52a94 --- /dev/null +++ b/img/checked.svg @@ -0,0 +1,333 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/expired.svg b/img/expired.svg new file mode 100644 index 0000000..155da70 --- /dev/null +++ b/img/expired.svg @@ -0,0 +1,10 @@ + + + + + + EXPIRED + + + + diff --git a/img/fvs-background-print.png b/img/fvs-background-print.png new file mode 100644 index 0000000000000000000000000000000000000000..fd4231aaa51a909a16c0d2c5c239dd28de02a0be GIT binary patch literal 5055 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 literal 0 HcmV?d00001 diff --git a/img/fvs-background.png b/img/fvs-background.png new file mode 100644 index 0000000000000000000000000000000000000000..e7fedd97997cf43c48d6415ff4c0e94fd1e5221c GIT binary patch literal 9852 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 + diff --git a/img/logo-fvs.png b/img/logo-fvs.png new file mode 100644 index 0000000000000000000000000000000000000000..49aa9b3e861514d9e80612bcd0db84d865505462 GIT binary patch literal 40852 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 literal 0 HcmV?d00001 diff --git a/img/logo-fvs.svg b/img/logo-fvs.svg new file mode 100644 index 0000000..bba1040 --- /dev/null +++ b/img/logo-fvs.svg @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/pdf.svg b/img/pdf.svg new file mode 100644 index 0000000..666f219 --- /dev/null +++ b/img/pdf.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/img/signature_invalid.svg b/img/signature_invalid.svg new file mode 100644 index 0000000..170cc1f --- /dev/null +++ b/img/signature_invalid.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/index.php b/index.php new file mode 100644 index 0000000..ccffdee --- /dev/null +++ b/index.php @@ -0,0 +1,27 @@ +setRedirectURL($CONFIG['baseurl'] . 'callback.php'); + +// check if user is logged in +if (isset($_SESSION['id_token'])) { + header('Location: card.php'); + /*echo "Willkommen,"; + echo '
Ausweis anzeigen'; + echo '
Ausweis download (pdf)'; + echo '
Abmelden';*/ +} else { + // redirect to keycloak login + $oidc->authenticate(); +} + +?> diff --git a/logout.php b/logout.php new file mode 100644 index 0000000..cd9f82a --- /dev/null +++ b/logout.php @@ -0,0 +1,6 @@ + diff --git a/qrcode.php b/qrcode.php new file mode 100644 index 0000000..8d2bebf --- /dev/null +++ b/qrcode.php @@ -0,0 +1,51 @@ +setSize(300); // Größe des QR-Codes +//$qrCode->setMargin(0); // Rand um den QR-Code + +// generate QR-Code as png +$writer = new PngWriter(); +$result = $writer->write($qrCode); + +// set header +header('Content-Type: '.$result->getMimeType()); +header('Content-Disposition: inline; filename="qrcode.png"'); + +// output QR-Code +echo $result->getString(); +?> diff --git a/verify.php b/verify.php new file mode 100644 index 0000000..1179306 --- /dev/null +++ b/verify.php @@ -0,0 +1,81 @@ +