Skip to content

Commit 1fc6155

Browse files
Mihkel Kivisildmrts
authored andcommitted
Add support for organization certificates
WE2-999 Signed-off-by: Mihkel Kivisild <[email protected]>
1 parent 159c575 commit 1fc6155

File tree

5 files changed

+73
-86
lines changed

5 files changed

+73
-86
lines changed

composer.lock

Lines changed: 20 additions & 20 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

example/composer.lock

Lines changed: 21 additions & 21 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

example/src/Auth.php

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,16 @@ class Auth
3838
{
3939
private $config;
4040

41-
public function __construct($config) {
41+
public function __construct($config)
42+
{
4243
$this->config = $config;
4344
}
4445

4546
public function trustedIntermediateCACertificates(): array
4647
{
47-
return CertificateLoader::loadCertificatesFromResources(
48-
__DIR__ . "/../certificates/esteid2018.der.crt"
49-
);
48+
$directory = __DIR__ . "/../certificates/";
49+
$certificates = glob($directory . "*.der.crt");
50+
return CertificateLoader::loadCertificatesFromResources(...$certificates);
5051
}
5152

5253
public function generator(): ChallengeNonceGenerator
@@ -87,11 +88,14 @@ public function getNonce()
8788

8889
private function getPrincipalNameFromCertificate(X509 $userCertificate): string
8990
{
90-
try {
91-
return CertificateData::getSubjectGivenName($userCertificate) . " " . CertificateData::getSubjectSurname($userCertificate);
92-
} catch (Exception $e) {
93-
return CertificateData::getSubjectCN($userCertificate);
91+
$surname = CertificateData::getSubjectSurname($userCertificate);
92+
$givenname = CertificateData::getSubjectGivenName($userCertificate);
93+
if ($surname && $givenname) {
94+
$principalName = $givenname . " " . $surname;
95+
} else {
96+
$principalName = CertificateData::getSubjectCN($userCertificate);
9497
}
98+
return $principalName;
9599
}
96100

97101
/**
@@ -103,7 +107,7 @@ public function validate()
103107
{
104108
// Header names must be treated as case-insensitive (according to RFC2616) so we convert them to lowercase
105109
$headers = array_change_key_case(getallheaders(), CASE_LOWER);
106-
110+
107111
if (!isset($headers["x-csrf-token"]) || ($headers["x-csrf-token"] != $_SESSION["csrf-token"])) {
108112
header("HTTP/1.0 405 Method Not Allowed");
109113
echo "CSRF token missing, unable to process your request";

src/certificate/CertificateData.php

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
namespace web_eid\web_eid_authtoken_validation_php\certificate;
2828

2929
use phpseclib3\File\X509;
30-
use UnexpectedValueException;
3130
use BadFunctionCallException;
3231

3332
final class CertificateData
@@ -40,66 +39,57 @@ public function __construct()
4039

4140
/**
4241
* Get commonName from x509 certificate
43-
*
44-
* @throws UnexpectedValueException
4542
*/
46-
public static function getSubjectCN(X509 $certificate): string
43+
public static function getSubjectCN(X509 $certificate): ?string
4744
{
4845
return self::getField($certificate, 'id-at-commonName');
4946
}
5047

5148
/**
5249
* Get surname from x509 certificate
53-
*
54-
* @throws UnexpectedValueException
5550
*/
56-
public static function getSubjectSurname(X509 $certificate): string
51+
public static function getSubjectSurname(X509 $certificate): ?string
5752
{
5853
return self::getField($certificate, 'id-at-surname');
5954
}
6055

6156
/**
6257
* Get given name from x509 certificate
63-
*
64-
* @throws UnexpectedValueException
6558
*/
66-
public static function getSubjectGivenName(X509 $certificate): string
59+
public static function getSubjectGivenName(X509 $certificate): ?string
6760
{
6861
return self::getField($certificate, 'id-at-givenName');
6962
}
7063

7164
/**
7265
* Get serialNumber (ID-code) from x509 certificate
73-
*
74-
* @throws UnexpectedValueException
7566
*/
76-
public static function getSubjectIdCode(X509 $certificate): string
67+
public static function getSubjectIdCode(X509 $certificate): ?string
7768
{
7869
return self::getField($certificate, 'id-at-serialNumber');
7970
}
8071

8172
/**
8273
* Get country code from x509 certificate
83-
*
84-
* @throws UnexpectedValueException
8574
*/
86-
public static function getSubjectCountryCode(X509 $certificate): string
75+
public static function getSubjectCountryCode(X509 $certificate): ?string
8776
{
8877
return self::getField($certificate, 'id-at-countryName');
8978
}
9079

9180
/**
9281
* Get specified subject field from x509 certificate
9382
*
94-
* @throws UnexpectedValueException field identifier not found
9583
* @return string
9684
*/
97-
private static function getField(X509 $certificate, string $fieldId): string
85+
private static function getField(X509 $certificate, string $fieldId): ?string
9886
{
9987
$result = $certificate->getSubjectDNProp($fieldId);
10088
if ($result) {
101-
return $result[0];
89+
return join(" ", $result);
90+
}
91+
else {
92+
return null;
10293
}
103-
throw new UnexpectedValueException("fieldId " . $fieldId . " not found in certificate subject");
10494
}
10595
}

0 commit comments

Comments
 (0)