Skip to content

Commit 7037ec7

Browse files
authored
Merge pull request #190 from OpenConext/feature/allow-validation-without-registration
Allow validation without registration
2 parents 390a6de + 6ae6002 commit 7037ec7

File tree

20 files changed

+171
-91
lines changed

20 files changed

+171
-91
lines changed

.github/workflows/test-acceptance.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,6 @@ jobs:
3030

3131
- name: Run PHPUnit WebTests
3232
run: composer web-tests
33+
34+
- name: Run Behat tests
35+
run: composer behat

composer.json

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,6 @@
133133
"/.env.vm",
134134
"/*.xml",
135135
"/*.xml.dist",
136-
"/config/routes/dev",
137-
"/config/packages/dev",
138-
"/config/packages/test",
139136
"/node_modules",
140137
"/coverage",
141138
"/build",

config/openconext/institutions.yaml.dist

Lines changed: 49 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -9,32 +9,32 @@ parameters:
99
certificates:
1010
- |
1111
-----BEGIN CERTIFICATE-----
12-
MIIEJTCCAw2gAwIBAgIJANug+o++1X5IMA0GCSqGSIb3DQEBCwUAMIGoMQswCQYD
13-
VQQGEwJOTDEQMA4GA1UECAwHVXRyZWNodDEQMA4GA1UEBwwHVXRyZWNodDEVMBMG
14-
A1UECgwMU1VSRm5ldCBCLlYuMRMwEQYDVQQLDApTVVJGY29uZXh0MRwwGgYDVQQD
15-
DBNTVVJGbmV0IERldmVsb3BtZW50MSswKQYJKoZIhvcNAQkBFhxzdXJmY29uZXh0
16-
LWJlaGVlckBzdXJmbmV0Lm5sMB4XDTE0MTAyMDEyMzkxMVoXDTE0MTExOTEyMzkx
17-
MVowgagxCzAJBgNVBAYTAk5MMRAwDgYDVQQIDAdVdHJlY2h0MRAwDgYDVQQHDAdV
18-
dHJlY2h0MRUwEwYDVQQKDAxTVVJGbmV0IEIuVi4xEzARBgNVBAsMClNVUkZjb25l
19-
eHQxHDAaBgNVBAMME1NVUkZuZXQgRGV2ZWxvcG1lbnQxKzApBgkqhkiG9w0BCQEW
20-
HHN1cmZjb25leHQtYmVoZWVyQHN1cmZuZXQubmwwggEiMA0GCSqGSIb3DQEBAQUA
21-
A4IBDwAwggEKAoIBAQDXuSSBeNJY3d4p060oNRSuAER5nLWT6AIVbv3XrXhcgSwc
22-
9m2b8u3ksp14pi8FbaNHAYW3MjlKgnLlopYIylzKD/6Ut/clEx67aO9Hpqsc0HmI
23-
P0It6q2bf5yUZ71E4CN2HtQceO5DsEYpe5M7D5i64kS2A7e2NYWVdA5Z01DqUpQG
24-
RBc+uMzOwyif6StBiMiLrZH3n2r5q5aVaXU4Vy5EE4VShv3Mp91sgXJj/v155fv0
25-
wShgl681v8yf2u2ZMb7NKnQRA4zM2Ng2EUAyy6PQ+Jbn+rALSm1YgiJdVuSlTLhv
26-
gwbiHGO2XgBi7bTHhlqSrJFK3Gs4zwIsop/XqQRBAgMBAAGjUDBOMB0GA1UdDgQW
27-
BBQCJmcoa/F7aM3jIFN7Bd4uzWRgzjAfBgNVHSMEGDAWgBQCJmcoa/F7aM3jIFN7
28-
Bd4uzWRgzjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBd80GpWKjp
29-
1J+Dgp0blVAox1s/WPWQlex9xrx1GEYbc5elp3svS+S82s7dFm2llHrrNOBt1HZV
30-
C+TdW4f+MR1xq8O5lOYjDRsosxZc/u9jVsYWYc3M9bQAx8VyJ8VGpcAK+fLqRNab
31-
YlqTnj/t9bzX8fS90sp8JsALV4g84Aj0G8RpYJokw+pJUmOpuxsZN5U84MmLPnVf
32-
mrnuCVh/HkiLNV2c8Pk8LSomg6q1M1dQUTsz/HVxcOhHLj/owwh3IzXf/KXV/E8v
33-
SYW8o4WWCAnruYOWdJMI4Z8NG1Mfv7zvb7U3FL1C/KLV04DqzALXGj+LVmxtDvux
34-
qC042apoIDQV
12+
MIIEEzCCAnsCFEow2E90q1t//LDuqkgF2zo7VNo4MA0GCSqGSIb3DQEBCwUAMEYx
13+
GzAZBgNVBAMMEkF6dXJlLU1GQSBHU1NQIElkUDEnMCUGA1UECgweRGV2ZWxvcG1l
14+
bnQgRG9ja2VyIGVudmlyb25tZW50MB4XDTIzMDUyNTA5MzMyM1oXDTI4MDUyMzA5
15+
MzMyM1owRjEbMBkGA1UEAwwSQXp1cmUtTUZBIEdTU1AgSWRQMScwJQYDVQQKDB5E
16+
ZXZlbG9wbWVudCBEb2NrZXIgZW52aXJvbm1lbnQwggGiMA0GCSqGSIb3DQEBAQUA
17+
A4IBjwAwggGKAoIBgQCWaoXdTdU3N0RL2jK/88PEN3jwyyz7AFJX64Rfx48CtCsI
18+
3Hze+0i+0KQgILsVU91kKujllFBM6N4V5PKQ+9Z5zafJeuhT80zQ9jcHVxyQoKi3
19+
0438fBGzlAKD9hGojG7DwjKopK+96Eawvu90KCxf8q7STh50n8dO6hnxWtE8RGk5
20+
a9R2cMDxEuOlvrW2B8Ih+EVCT3OmOsCQdp31TuTt5x3xLxmY/04mGGPpQi9PBV38
21+
O2uTd4G2mbqGqNGx6S6iPAMgh6u4NVmg03iqBKkFJgQvNRCdif+gMQTKEW0mJwr6
22+
2PrEQrPBoBphgCpJNF9pnEy/+mdWiKCo8lvVxiPGQaaKyoNvZEt1IROwp8Ga2gLE
23+
oFjtcMcodnLgudusDOCH6Idp0CtuTkrf3hLIxKjQMOFTCiCmOCtMlJZa9+l7Lbhz
24+
EGcJUcHH0i1k+ufqUhOSBrrfKoiohixAnW+bayqymef+Zy32YoT+/LDjoP/vyMrN
25+
nRwpwqguPMwBF+HWgwUCAwEAATANBgkqhkiG9w0BAQsFAAOCAYEAReFJH/X+PyA8
26+
cFe6RdCgyTbuRuq2rTgadKpqfhhbXlwcOTh8rEpevqFf8tequegCj7fFZgz+hIL0
27+
75ZsEcZwk2N8F8m32cVjmYHar2rLsYEkqhEc/yCUjyGffqUeZBVmdUnUM6ggGsIH
28+
qcjTvrNhmFrh3ManebvZkjvDyJCkrwUOGYvCpbFjXa4CW1Rp+I0+e7HnQeyFW3p+
29+
3T0SAmdo3eJEZLhRsMm/YLcyCW7IRTVvpTvGoxhbvQU1k6EtkhLcahA+MWVzNbgi
30+
IdHP/otSQnaLW243sxoxYm7EiuAihnQ0iRaNEzsFrx/W06G0e5rmTbWPGc4LZj6Y
31+
DKd7531SGIwqOOC1wrzrZ36iuwPm5PrZReCWH3ptR6bSszQerbQsx6wkumYN7iDZ
32+
g9EK9ADHRzfovbqOPad2s+N5iVWAOfEXGqItZcrLdW53vUOqbfXXuFt7szhtdvTW
33+
RWWQQJryrg61UmLgJcLb3xMMdZZ+D6mcXqa3v2cSzGdfO932xUzq
3534
-----END CERTIFICATE-----
35+
3636
email_domains: # A list of email domains that are used to identify registering users (addresses must match the email domain of the institution)
37-
- 'stepup.example.com'
37+
- 'dev.openconext.local'
3838
- 'institution-a.example.com'
3939
- '*.dev.openconext.local' # Wildcards are allowed
4040
is_azure_ad: true # AzureAD (Entra) does not accept a SAML subject, ADFS does require this
@@ -43,31 +43,31 @@ parameters:
4343
sso_location: 'https://azuremfa.dev.openconext.local/mock/sso' # Location of the Azure MFA endpoint
4444
certificates:
4545
- |
46-
-----BEGIN CERTIFICATE-----
47-
MIIEJTCCAw2gAwIBAgIJANug+o++1X5IMA0GCSqGSIb3DQEBCwUAMIGoMQswCQYD
48-
VQQGEwJOTDEQMA4GA1UECAwHVXRyZWNodDEQMA4GA1UEBwwHVXRyZWNodDEVMBMG
49-
A1UECgwMU1VSRm5ldCBCLlYuMRMwEQYDVQQLDApTVVJGY29uZXh0MRwwGgYDVQQD
50-
DBNTVVJGbmV0IERldmVsb3BtZW50MSswKQYJKoZIhvcNAQkBFhxzdXJmY29uZXh0
51-
LWJlaGVlckBzdXJmbmV0Lm5sMB4XDTE0MTAyMDEyMzkxMVoXDTE0MTExOTEyMzkx
52-
MVowgagxCzAJBgNVBAYTAk5MMRAwDgYDVQQIDAdVdHJlY2h0MRAwDgYDVQQHDAdV
53-
dHJlY2h0MRUwEwYDVQQKDAxTVVJGbmV0IEIuVi4xEzARBgNVBAsMClNVUkZjb25l
54-
eHQxHDAaBgNVBAMME1NVUkZuZXQgRGV2ZWxvcG1lbnQxKzApBgkqhkiG9w0BCQEW
55-
HHN1cmZjb25leHQtYmVoZWVyQHN1cmZuZXQubmwwggEiMA0GCSqGSIb3DQEBAQUA
56-
A4IBDwAwggEKAoIBAQDXuSSBeNJY3d4p060oNRSuAER5nLWT6AIVbv3XrXhcgSwc
57-
9m2b8u3ksp14pi8FbaNHAYW3MjlKgnLlopYIylzKD/6Ut/clEx67aO9Hpqsc0HmI
58-
P0It6q2bf5yUZ71E4CN2HtQceO5DsEYpe5M7D5i64kS2A7e2NYWVdA5Z01DqUpQG
59-
RBc+uMzOwyif6StBiMiLrZH3n2r5q5aVaXU4Vy5EE4VShv3Mp91sgXJj/v155fv0
60-
wShgl681v8yf2u2ZMb7NKnQRA4zM2Ng2EUAyy6PQ+Jbn+rALSm1YgiJdVuSlTLhv
61-
gwbiHGO2XgBi7bTHhlqSrJFK3Gs4zwIsop/XqQRBAgMBAAGjUDBOMB0GA1UdDgQW
62-
BBQCJmcoa/F7aM3jIFN7Bd4uzWRgzjAfBgNVHSMEGDAWgBQCJmcoa/F7aM3jIFN7
63-
Bd4uzWRgzjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBd80GpWKjp
64-
1J+Dgp0blVAox1s/WPWQlex9xrx1GEYbc5elp3svS+S82s7dFm2llHrrNOBt1HZV
65-
C+TdW4f+MR1xq8O5lOYjDRsosxZc/u9jVsYWYc3M9bQAx8VyJ8VGpcAK+fLqRNab
66-
YlqTnj/t9bzX8fS90sp8JsALV4g84Aj0G8RpYJokw+pJUmOpuxsZN5U84MmLPnVf
67-
mrnuCVh/HkiLNV2c8Pk8LSomg6q1M1dQUTsz/HVxcOhHLj/owwh3IzXf/KXV/E8v
68-
SYW8o4WWCAnruYOWdJMI4Z8NG1Mfv7zvb7U3FL1C/KLV04DqzALXGj+LVmxtDvux
69-
qC042apoIDQV
70-
-----END CERTIFICATE-----
46+
-----BEGIN CERTIFICATE-----
47+
MIIEEzCCAnsCFEow2E90q1t//LDuqkgF2zo7VNo4MA0GCSqGSIb3DQEBCwUAMEYx
48+
GzAZBgNVBAMMEkF6dXJlLU1GQSBHU1NQIElkUDEnMCUGA1UECgweRGV2ZWxvcG1l
49+
bnQgRG9ja2VyIGVudmlyb25tZW50MB4XDTIzMDUyNTA5MzMyM1oXDTI4MDUyMzA5
50+
MzMyM1owRjEbMBkGA1UEAwwSQXp1cmUtTUZBIEdTU1AgSWRQMScwJQYDVQQKDB5E
51+
ZXZlbG9wbWVudCBEb2NrZXIgZW52aXJvbm1lbnQwggGiMA0GCSqGSIb3DQEBAQUA
52+
A4IBjwAwggGKAoIBgQCWaoXdTdU3N0RL2jK/88PEN3jwyyz7AFJX64Rfx48CtCsI
53+
3Hze+0i+0KQgILsVU91kKujllFBM6N4V5PKQ+9Z5zafJeuhT80zQ9jcHVxyQoKi3
54+
0438fBGzlAKD9hGojG7DwjKopK+96Eawvu90KCxf8q7STh50n8dO6hnxWtE8RGk5
55+
a9R2cMDxEuOlvrW2B8Ih+EVCT3OmOsCQdp31TuTt5x3xLxmY/04mGGPpQi9PBV38
56+
O2uTd4G2mbqGqNGx6S6iPAMgh6u4NVmg03iqBKkFJgQvNRCdif+gMQTKEW0mJwr6
57+
2PrEQrPBoBphgCpJNF9pnEy/+mdWiKCo8lvVxiPGQaaKyoNvZEt1IROwp8Ga2gLE
58+
oFjtcMcodnLgudusDOCH6Idp0CtuTkrf3hLIxKjQMOFTCiCmOCtMlJZa9+l7Lbhz
59+
EGcJUcHH0i1k+ufqUhOSBrrfKoiohixAnW+bayqymef+Zy32YoT+/LDjoP/vyMrN
60+
nRwpwqguPMwBF+HWgwUCAwEAATANBgkqhkiG9w0BAQsFAAOCAYEAReFJH/X+PyA8
61+
cFe6RdCgyTbuRuq2rTgadKpqfhhbXlwcOTh8rEpevqFf8tequegCj7fFZgz+hIL0
62+
75ZsEcZwk2N8F8m32cVjmYHar2rLsYEkqhEc/yCUjyGffqUeZBVmdUnUM6ggGsIH
63+
qcjTvrNhmFrh3ManebvZkjvDyJCkrwUOGYvCpbFjXa4CW1Rp+I0+e7HnQeyFW3p+
64+
3T0SAmdo3eJEZLhRsMm/YLcyCW7IRTVvpTvGoxhbvQU1k6EtkhLcahA+MWVzNbgi
65+
IdHP/otSQnaLW243sxoxYm7EiuAihnQ0iRaNEzsFrx/W06G0e5rmTbWPGc4LZj6Y
66+
DKd7531SGIwqOOC1wrzrZ36iuwPm5PrZReCWH3ptR6bSszQerbQsx6wkumYN7iDZ
67+
g9EK9ADHRzfovbqOPad2s+N5iVWAOfEXGqItZcrLdW53vUOqbfXXuFt7szhtdvTW
68+
RWWQQJryrg61UmLgJcLb3xMMdZZ+D6mcXqa3v2cSzGdfO932xUzq
69+
-----END CERTIFICATE-----
70+
7171
email_domains: # A list of email domains that are used to identify registering users (addresses must match the email domain of the institution)
7272
- 'institution-b.example.com'
7373
is_azure_ad: true # AzureAD (Entra) does not accept a SAML subject, ADFS does require this

config/openconext/parameters.yaml.dist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ parameters:
1919
saml_idp_publickey: '/config/azuremfa/azuremfa_idp.crt'
2020
saml_idp_privatekey: '/config/azuremfa/azuremfa_idp.key'
2121
saml_metadata_publickey: '/config/azuremfa/azuremfa_idp.crt'
22-
saml_metadata_privatekey: '/config/axuremfa/azuremfa_idp.key'
22+
saml_metadata_privatekey: '/config/azuremfa/azuremfa_idp.key'
2323
saml_remote_sp_entity_id: 'https://gateway.dev.openconext.local/gssp/azuremfa/metadata'
2424
saml_remote_sp_certificate: '/config/gateway/gateway_gssp_sp.crt'
2525
saml_remote_sp_acs: 'https://gateway.dev.openconext.local/gssp/azuremfa/consume-assertion'

config/openconext/parameters.yaml.test.dist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ parameters:
1616
saml_idp_publickey: '/config/azuremfa/azuremfa_idp.crt'
1717
saml_idp_privatekey: '/config/azuremfa/azuremfa_idp.key'
1818
saml_metadata_publickey: '/config/azuremfa/azuremfa_idp.crt'
19-
saml_metadata_privatekey: '/config/axuremfa/azuremfa_idp.key'
19+
saml_metadata_privatekey: '/config/azuremfa/azuremfa_idp.key'
2020
saml_remote_sp_entity_id: 'https://gateway.dev.openconext.local/gssp/azuremfa/metadata'
2121
saml_remote_sp_certificate: '/config/gateway/gateway_gssp_sp.crt'
2222
saml_remote_sp_acs: 'https://gateway.dev.openconext.local/gssp/azuremfa/consume-assertion'

config/routes/smoketest/demo.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
controllers:
2+
resource: ../../../dev/Controller/
3+
type: attribute

config/services_dev.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ services:
1818

1919
Dev\Mock\MockConfiguration:
2020
arguments:
21-
$identityProviderEntityId: 'https://azuremfa.stepup.example.com/mock/idp/metadata'
22-
$serviceProviderEntityId: 'https://azuremfa.stepup.example.com/saml/metadata'
21+
$identityProviderEntityId: 'https://azuremfa.dev.openconext.local/mock/idp/metadata'
22+
$serviceProviderEntityId: 'https://azuremfa.dev.openconext.local/saml/metadata'
2323
$privateKeyPath: '%saml_idp_privatekey%'
2424
$publicCertPath: '%saml_idp_publickey%'
2525

config/services_smoketest.yaml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
services:
2+
_defaults:
3+
autowire: true
4+
autoconfigure: true
5+
6+
Surfnet\AzureMfa\Test\Features\:
7+
resource: '../tests/Functional/Features/*'
8+
exclude:
9+
- '../tests/Functional/Features/bootstrap'
10+
11+
# makes classes in src/ available to be used as services
12+
# this creates a service per class whose id is the fully-qualified class name
13+
Dev\:
14+
resource: '../dev/*'
15+
exclude: '../dev/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
16+
17+
# controllers are imported separately to make sure services can be injected
18+
# as action arguments even if you don't extend any base controller class
19+
Dev\Controller\:
20+
resource: '../dev/Controller'
21+
tags: ['controller.service_arguments']
22+
23+
Dev\Mock\MockConfiguration:
24+
arguments:
25+
$identityProviderEntityId: 'https://azuremfa.dev.openconext.local/mock/idp/metadata'
26+
$serviceProviderEntityId: 'https://azuremfa.dev.openconext.local/saml/metadata'
27+
$privateKeyPath: '%saml_idp_privatekey%'
28+
$publicCertPath: '%saml_idp_publickey%'
29+
30+
# add more service definitions when explicit configuration is needed
31+
# please note that last definitions always *replace* previous ones

dev/Controller/MockAzureMfaController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public function __construct(
4343
#[Route(path: '/mock/sso', name: 'mock_sso')]
4444
public function sso(Request $request): SymfonyResponse
4545
{
46-
if (!in_array($this->getParameter('kernel.environment'), ['test', 'dev'])) {
46+
if (!in_array($this->getParameter('kernel.environment'), ['test', 'dev', 'smoketest'])) {
4747
throw new Exception('Invalid environment encountered.');
4848
}
4949

src/Surfnet/AzureMfa/Domain/UserId.php

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,17 @@ public function __construct(private readonly string $userId)
4444
throw new InvalidUserIdException('An empty id was specified');
4545
}
4646

47+
$emailAddress = $this->userId;
48+
4749
$pos = strpos($userId, self::SEPARATOR);
48-
if ($pos === false) {
49-
throw new InvalidUserIdException('An invalid id was specified');
50-
}
51-
$emailAddress = substr($userId, $pos + 1);
52-
$uniquePrefix = substr($userId, 0, $pos);
50+
if ($pos !== false) {
51+
$emailAddress = substr($userId, $pos + 1);
52+
$uniquePrefix = substr($userId, 0, $pos);
5353

54-
$match = preg_match(self::VALID_UNIQUE_ID, $uniquePrefix);
55-
if ($match !== 1) {
56-
throw new InvalidUserIdException('An invalid id was specified');
54+
$match = preg_match(self::VALID_UNIQUE_ID, $uniquePrefix);
55+
if ($match !== 1) {
56+
throw new InvalidUserIdException('An invalid id was specified');
57+
}
5758
}
5859

5960
try {

0 commit comments

Comments
 (0)