Skip to content

Commit a08c168

Browse files
committed
Support X509 cert comments
1 parent 2cc0576 commit a08c168

File tree

4 files changed

+63
-51
lines changed

4 files changed

+63
-51
lines changed

lib/Saml2/Utils.php

+18-16
Original file line numberDiff line numberDiff line change
@@ -208,27 +208,29 @@ public static function treeCopyReplace(DomNode $targetNode, DomNode $sourceNode,
208208
/**
209209
* Returns a x509 cert (adding header & footer if required).
210210
*
211-
* @param string $cert A x509 unformated cert
212-
* @param bool $heads True if we want to include head and footer
211+
* @param string $x509cert A x509 unformated cert
212+
* @param bool $heads True if we want to include head and footer
213213
*
214214
* @return string $x509 Formatted cert
215215
*/
216+
public static function formatCert($x509cert, $heads = true)
217+
{
218+
if (is_null($x509cert)) {
219+
return;
220+
}
216221

217-
public static function formatCert($cert, $heads = true)
218-
{
219-
$x509cert = str_replace(array("\x0D", "\r", "\n"), "", $cert);
220-
if (!empty($x509cert)) {
221-
$x509cert = str_replace('-----BEGIN CERTIFICATE-----', "", $x509cert);
222-
$x509cert = str_replace('-----END CERTIFICATE-----', "", $x509cert);
223-
$x509cert = str_replace(' ', '', $x509cert);
224-
225-
if ($heads) {
226-
$x509cert = "-----BEGIN CERTIFICATE-----\n".chunk_split($x509cert, 64, "\n")."-----END CERTIFICATE-----\n";
227-
}
222+
if (strpos($x509cert, '-----BEGIN CERTIFICATE-----') !== false) {
223+
$x509cert = static::getStringBetween($x509cert, '-----BEGIN CERTIFICATE-----', '-----END CERTIFICATE-----');
224+
}
228225

229-
}
230-
return $x509cert;
231-
}
226+
$x509cert = str_replace(array("\x0d", "\r", "\n", " "), '', $x509cert);
227+
228+
if ($heads && $x509cert !== '') {
229+
$x509cert = "-----BEGIN CERTIFICATE-----\n".chunk_split($x509cert, 64, "\n")."-----END CERTIFICATE-----\n";
230+
}
231+
232+
return $x509cert;
233+
}
232234

233235
/**
234236
* Returns a private key (adding header & footer if required).

tests/certs/with.comment.crt

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# certificate comments should be ignored
2+
-----BEGIN CERTIFICATE-----
3+
MIICgTCCAeoCCQCbOlrWDdX7FTANBgkqhkiG9w0BAQUFADCBhDELMAkGA1UEBhMC
4+
Tk8xGDAWBgNVBAgTD0FuZHJlYXMgU29sYmVyZzEMMAoGA1UEBxMDRm9vMRAwDgYD
5+
VQQKEwdVTklORVRUMRgwFgYDVQQDEw9mZWlkZS5lcmxhbmcubm8xITAfBgkqhkiG
6+
9w0BCQEWEmFuZHJlYXNAdW5pbmV0dC5ubzAeFw0wNzA2MTUxMjAxMzVaFw0wNzA4
7+
MTQxMjAxMzVaMIGEMQswCQYDVQQGEwJOTzEYMBYGA1UECBMPQW5kcmVhcyBTb2xi
8+
ZXJnMQwwCgYDVQQHEwNGb28xEDAOBgNVBAoTB1VOSU5FVFQxGDAWBgNVBAMTD2Zl
9+
aWRlLmVybGFuZy5ubzEhMB8GCSqGSIb3DQEJARYSYW5kcmVhc0B1bmluZXR0Lm5v
10+
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDivbhR7P516x/S3BqKxupQe0LO
11+
NoliupiBOesCO3SHbDrl3+q9IbfnfmE04rNuMcPsIxB161TdDpIesLCn7c8aPHIS
12+
KOtPlAeTZSnb8QAu7aRjZq3+PbrP5uW3TcfCGPtKTytHOge/OlJbo078dVhXQ14d
13+
1EDwXJW1rRXuUt4C8QIDAQABMA0GCSqGSIb3DQEBBQUAA4GBACDVfp86HObqY+e8
14+
BUoWQ9+VMQx1ASDohBjwOsg2WykUqRXF+dLfcUH9dWR63CtZIKFDbStNomPnQz7n
15+
bK+onygwBspVEbnHuUihZq3ZUdmumQqCw4Uvs/1Uvq3orOo/WJVhTyvLgFVK2Qar
16+
Q4/67OZfHd7R+POBXhophSMv1ZOo
17+
-----END CERTIFICATE-----

tests/src/OneLogin/Saml2/AuthTest.php

+22-34
Original file line numberDiff line numberDiff line change
@@ -817,22 +817,16 @@ public function testProcessSLORequestRelayState()
817817
$_GET['SAMLRequest'] = $message;
818818
$_GET['RelayState'] = 'http://relaystate.com';
819819

820-
try {
821-
$this->_auth->setStrict(true);
822-
$this->_auth->processSLO(false);
823-
$this->assertFalse(true);
824-
} catch (Exception $e) {
825-
$this->assertContains('Cannot modify header information', $e->getMessage());
826-
$trace = $e->getTrace();
827-
$targetUrl = getUrlFromRedirect($trace);
828-
$parsedQuery = getParamsFromUrl($targetUrl);
820+
$this->_auth->setStrict(true);
821+
$targetUrl = $this->_auth->processSLO(false, null, false, null, true);
829822

830-
$sloUrl = $this->_settingsInfo['idp']['singleLogoutService']['url'];
831-
$this->assertContains($sloUrl, $targetUrl);
832-
$this->assertArrayHasKey('SAMLResponse', $parsedQuery);
833-
$this->assertArrayHasKey('RelayState', $parsedQuery);
834-
$this->assertEquals('http://relaystate.com', $parsedQuery['RelayState']);
835-
}
823+
$parsedQuery = getParamsFromUrl($targetUrl);
824+
825+
$sloResponseUrl = $this->_settingsInfo['idp']['singleLogoutService']['responseUrl'];
826+
$this->assertContains($sloResponseUrl, $targetUrl);
827+
$this->assertArrayHasKey('SAMLResponse', $parsedQuery);
828+
$this->assertArrayHasKey('RelayState', $parsedQuery);
829+
$this->assertEquals('http://relaystate.com', $parsedQuery['RelayState']);
836830
}
837831

838832
/**
@@ -860,28 +854,22 @@ public function testProcessSLORequestSignedResponse()
860854
$plainMessage = str_replace('http://stuff.com/endpoints/endpoints/sls.php', $currentURL, $plainMessage);
861855
$message = base64_encode(gzdeflate($plainMessage));
862856

857+
unset($_GET['SAMLResponse']);
863858
$_GET['SAMLRequest'] = $message;
864859
$_GET['RelayState'] = 'http://relaystate.com';
865860

866-
try {
867-
$auth->setStrict(true);
868-
$auth->processSLO(false);
869-
$this->assertFalse(true);
870-
} catch (Exception $e) {
871-
$this->assertContains('Cannot modify header information', $e->getMessage());
872-
$trace = $e->getTrace();
873-
$targetUrl = getUrlFromRedirect($trace);
874-
$parsedQuery = getParamsFromUrl($targetUrl);
875-
876-
$sloUrl = $settingsInfo['idp']['singleLogoutService']['url'];
877-
$this->assertContains($sloUrl, $targetUrl);
878-
$this->assertArrayHasKey('SAMLResponse', $parsedQuery);
879-
$this->assertArrayHasKey('RelayState', $parsedQuery);
880-
$this->assertArrayHasKey('SigAlg', $parsedQuery);
881-
$this->assertArrayHasKey('Signature', $parsedQuery);
882-
$this->assertEquals('http://relaystate.com', $parsedQuery['RelayState']);
883-
$this->assertEquals(XMLSecurityKey::RSA_SHA1, $parsedQuery['SigAlg']);
884-
}
861+
$auth->setStrict(true);
862+
$targetUrl = $auth->processSLO(false, null, false, null, true);
863+
$parsedQuery = getParamsFromUrl($targetUrl);
864+
865+
$sloUrl = $settingsInfo['idp']['singleLogoutService']['responseUrl'];
866+
$this->assertContains($sloUrl, $targetUrl);
867+
$this->assertArrayHasKey('SAMLResponse', $parsedQuery);
868+
$this->assertArrayHasKey('RelayState', $parsedQuery);
869+
$this->assertArrayHasKey('SigAlg', $parsedQuery);
870+
$this->assertArrayHasKey('Signature', $parsedQuery);
871+
$this->assertEquals('http://relaystate.com', $parsedQuery['RelayState']);
872+
$this->assertEquals(XMLSecurityKey::RSA_SHA1, $parsedQuery['SigAlg']);
885873
}
886874

887875
/**

tests/src/OneLogin/Saml2/UtilsTest.php

+6-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public function testLoadXML()
4646
try {
4747
$res1 = OneLogin_Saml2_Utils::loadXML($dom, $metadataUnloaded);
4848
$this->assertFalse($res1);
49-
} catch (Exception $e) {
49+
} catch (\Exception $e) {
5050
$this->assertEquals('DOMDocument::loadXML(): Premature end of data in tag EntityDescriptor line 1 in Entity, line: 1', $e->getMessage());
5151
}
5252

@@ -206,6 +206,11 @@ public function testFormatCert()
206206
$this->assertNotContains('-----END CERTIFICATE-----', $formatedCert6);
207207
$this->assertEquals(strlen($cert2), 860);
208208

209+
$cert = file_get_contents(TEST_ROOT.'/certs/with.comment.crt');
210+
$formatedCert7 = OneLogin_Saml2_Utils::formatCert($cert, true);
211+
$this->assertContains('-----BEGIN CERTIFICATE-----', $formatedCert7);
212+
$this->assertContains('-----END CERTIFICATE-----', $formatedCert7);
213+
$this->assertNotContains('comments', $formatedCert7);
209214
}
210215

211216
/**

0 commit comments

Comments
 (0)