@@ -49,14 +49,14 @@ |
||
49 | 49 | } |
50 | 50 | |
51 | 51 | switch ($_GET['token']) { |
52 | - case "SELF-REGISTER": |
|
53 | - $token = "SELF-REGISTER"; |
|
54 | - $checkval = \core\UserManagement::TOKENSTATUS_OK_NEW; |
|
55 | - $federation = \config\ConfAssistant::CONSORTIUM['selfservice_registration']; |
|
56 | - break; |
|
57 | - default: |
|
58 | - $token = $validator->token(filter_input(INPUT_GET,'token',FILTER_SANITIZE_STRING)); |
|
59 | - $checkval = $usermgmt->checkTokenValidity($token); |
|
52 | + case "SELF-REGISTER": |
|
53 | + $token = "SELF-REGISTER"; |
|
54 | + $checkval = \core\UserManagement::TOKENSTATUS_OK_NEW; |
|
55 | + $federation = \config\ConfAssistant::CONSORTIUM['selfservice_registration']; |
|
56 | + break; |
|
57 | + default: |
|
58 | + $token = $validator->token(filter_input(INPUT_GET,'token',FILTER_SANITIZE_STRING)); |
|
59 | + $checkval = $usermgmt->checkTokenValidity($token); |
|
60 | 60 | } |
61 | 61 | |
62 | 62 | if ($checkval < 0) { |
@@ -98,98 +98,98 @@ |
||
98 | 98 | } |
99 | 99 | |
100 | 100 | switch ($operationMode) { |
101 | - case OPERATION_MODE_EDIT: |
|
102 | - $idp = $validator->existingIdP($_GET['inst_id']); |
|
103 | - // editing IdPs is done from within the popup. When we're done, send the |
|
104 | - // user back to the popup (append the result of the operation later) |
|
105 | - $redirectDestination = "manageAdmins.inc.php?inst_id=" . $idp->identifier . "&"; |
|
106 | - if (count($validAddresses) == 0) { |
|
107 | - header("Location: $redirectDestination" . "invitation=INVALIDSYNTAX"); |
|
108 | - exit(1); |
|
109 | - } |
|
110 | - // is the user primary admin of this IdP? |
|
111 | - $is_owner = $idp->isPrimaryOwner($_SESSION['user']); |
|
112 | - // check if he is (also) federation admin for the federation this IdP is in. His invitations have more blessing then. |
|
113 | - $fedadmin = $userObject->isFederationAdmin($idp->federation); |
|
114 | - // check if he is either one, if not, complain |
|
115 | - if (!$is_owner && !$fedadmin) { |
|
116 | - echo "<p>" . sprintf(_("Something's wrong... you are a %s admin, but not for the %s the requested %s belongs to!"), $uiElements->nomenclatureFed, $uiElements->nomenclatureFed, $uiElements->nomenclatureParticipant) . "</p>"; |
|
117 | - exit(1); |
|
118 | - } |
|
101 | + case OPERATION_MODE_EDIT: |
|
102 | + $idp = $validator->existingIdP($_GET['inst_id']); |
|
103 | + // editing IdPs is done from within the popup. When we're done, send the |
|
104 | + // user back to the popup (append the result of the operation later) |
|
105 | + $redirectDestination = "manageAdmins.inc.php?inst_id=" . $idp->identifier . "&"; |
|
106 | + if (count($validAddresses) == 0) { |
|
107 | + header("Location: $redirectDestination" . "invitation=INVALIDSYNTAX"); |
|
108 | + exit(1); |
|
109 | + } |
|
110 | + // is the user primary admin of this IdP? |
|
111 | + $is_owner = $idp->isPrimaryOwner($_SESSION['user']); |
|
112 | + // check if he is (also) federation admin for the federation this IdP is in. His invitations have more blessing then. |
|
113 | + $fedadmin = $userObject->isFederationAdmin($idp->federation); |
|
114 | + // check if he is either one, if not, complain |
|
115 | + if (!$is_owner && !$fedadmin) { |
|
116 | + echo "<p>" . sprintf(_("Something's wrong... you are a %s admin, but not for the %s the requested %s belongs to!"), $uiElements->nomenclatureFed, $uiElements->nomenclatureFed, $uiElements->nomenclatureParticipant) . "</p>"; |
|
117 | + exit(1); |
|
118 | + } |
|
119 | 119 | |
120 | - $prettyprintname = $idp->name; |
|
121 | - $newtokens = $mgmt->createTokens($fedadmin, $validAddresses, $idp); |
|
122 | - $loggerInstance->writeAudit($_SESSION['user'], "NEW", "IdP " . $idp->identifier . " - Token created for " . implode(",", $validAddresses)); |
|
123 | - $introtext = "CO-ADMIN"; |
|
124 | - $participant_type = $idp->type; |
|
125 | - break; |
|
126 | - case OPERATION_MODE_NEWUNLINKED: |
|
127 | - $redirectDestination = "../overview_federation.php?"; |
|
128 | - if (count($validAddresses) == 0) { |
|
129 | - header("Location: $redirectDestination"."invitation=INVALIDSYNTAX"); |
|
130 | - exit(1); |
|
131 | - } |
|
132 | - // run an input check and conversion of the raw inputs... just in case |
|
133 | - $newinstname = $validator->string($_POST['name']); |
|
134 | - $newcountry = $validator->string($_POST['country']); |
|
135 | - $participant_type = $validator->partType($_POST['participant_type']); |
|
136 | - $new_idp_authorized_fedadmin = $userObject->isFederationAdmin($newcountry); |
|
137 | - if ($new_idp_authorized_fedadmin !== TRUE) { |
|
138 | - throw new Exception("Something's wrong... you want to create a new " . $uiElements->nomenclatureParticipant . ", but are not a " . $uiElements->nomenclatureFed . " admin for the " . $uiElements->nomenclatureFed . " it should be in!"); |
|
139 | - } |
|
140 | - $federation = $validator->existingFederation($newcountry); |
|
141 | - $prettyprintname = $newinstname; |
|
142 | - $introtext = "NEW-FED"; |
|
143 | - // send the user back to his federation overview page, append the result of the operation later |
|
144 | - // do the token creation magic |
|
145 | - $newtokens = $mgmt->createTokens(TRUE, $validAddresses, $newinstname, 0, $newcountry, $participant_type); |
|
146 | - $loggerInstance->writeAudit($_SESSION['user'], "NEW", "ORG FUTURE - Token created for $participant_type " . implode(",", $validAddresses)); |
|
147 | - break; |
|
148 | - case OPERATION_MODE_NEWFROMDB: |
|
149 | - $redirectDestination = "../overview_federation.php?"; |
|
150 | - if (count($validAddresses) == 0) { |
|
151 | - header("Location: $redirectDestination"."invitation=INVALIDSYNTAX"); |
|
152 | - exit(1); |
|
153 | - } |
|
154 | - // a real external DB entry was submitted and all the required parameters are there |
|
155 | - $newexternalid = $validator->string($_POST['externals']); |
|
156 | - $extinfo = $catInstance->getExternalDBEntityDetails($newexternalid); |
|
157 | - $new_idp_authorized_fedadmin = $userObject->isFederationAdmin($extinfo['country']); |
|
158 | - if ($new_idp_authorized_fedadmin !== TRUE) { |
|
159 | - throw new Exception("Something's wrong... you want to create a new " . $uiElements->nomenclatureParticipant . ", but are not a " . $uiElements->nomenclatureFed . " admin for the " . $uiElements->nomenclatureFed . " it should be in!"); |
|
160 | - } |
|
161 | - $federation = $validator->existingFederation($extinfo['country']); |
|
162 | - $newcountry = $extinfo['country']; |
|
163 | - // see if the inst name is defined in the currently set language; if not, pick its English name; if N/A, pick the last in the list |
|
164 | - $prettyprintname = ""; |
|
165 | - foreach ($extinfo['names'] as $lang => $name) { |
|
166 | - if ($lang == $languageInstance->getLang()) { |
|
167 | - $prettyprintname = $name; |
|
120 | + $prettyprintname = $idp->name; |
|
121 | + $newtokens = $mgmt->createTokens($fedadmin, $validAddresses, $idp); |
|
122 | + $loggerInstance->writeAudit($_SESSION['user'], "NEW", "IdP " . $idp->identifier . " - Token created for " . implode(",", $validAddresses)); |
|
123 | + $introtext = "CO-ADMIN"; |
|
124 | + $participant_type = $idp->type; |
|
125 | + break; |
|
126 | + case OPERATION_MODE_NEWUNLINKED: |
|
127 | + $redirectDestination = "../overview_federation.php?"; |
|
128 | + if (count($validAddresses) == 0) { |
|
129 | + header("Location: $redirectDestination"."invitation=INVALIDSYNTAX"); |
|
130 | + exit(1); |
|
168 | 131 | } |
169 | - } |
|
170 | - if ($prettyprintname == "" && isset($extinfo['names']['en'])) { |
|
171 | - $prettyprintname = $extinfo['names']['en']; |
|
172 | - } |
|
173 | - if ($prettyprintname == "") { |
|
174 | - foreach ($extinfo['names'] as $name) { |
|
175 | - $prettyprintname = $name; |
|
132 | + // run an input check and conversion of the raw inputs... just in case |
|
133 | + $newinstname = $validator->string($_POST['name']); |
|
134 | + $newcountry = $validator->string($_POST['country']); |
|
135 | + $participant_type = $validator->partType($_POST['participant_type']); |
|
136 | + $new_idp_authorized_fedadmin = $userObject->isFederationAdmin($newcountry); |
|
137 | + if ($new_idp_authorized_fedadmin !== TRUE) { |
|
138 | + throw new Exception("Something's wrong... you want to create a new " . $uiElements->nomenclatureParticipant . ", but are not a " . $uiElements->nomenclatureFed . " admin for the " . $uiElements->nomenclatureFed . " it should be in!"); |
|
176 | 139 | } |
177 | - } |
|
178 | - $participant_type = $extinfo['type']; |
|
179 | - // fill the rest of the text |
|
180 | - $introtext = "EXISTING-FED"; |
|
181 | - // do the token creation magic |
|
182 | - $newtokens = $mgmt->createTokens(TRUE, $validAddresses, $prettyprintname, $newexternalid); |
|
183 | - $loggerInstance->writeAudit($_SESSION['user'], "NEW", "IdP FUTURE - Token created for " . implode(",", $validAddresses)); |
|
184 | - break; |
|
185 | - default: // includes OPERATION_MODE_INVALID |
|
186 | - // second param is TRUE, so the variable *will* contain a string |
|
187 | - // i.e. ignore Scrutinizer type warning later |
|
188 | - $wrongcontent = print_r($_POST, TRUE); |
|
189 | - echo "<pre>Wrong parameters in POST: |
|
140 | + $federation = $validator->existingFederation($newcountry); |
|
141 | + $prettyprintname = $newinstname; |
|
142 | + $introtext = "NEW-FED"; |
|
143 | + // send the user back to his federation overview page, append the result of the operation later |
|
144 | + // do the token creation magic |
|
145 | + $newtokens = $mgmt->createTokens(TRUE, $validAddresses, $newinstname, 0, $newcountry, $participant_type); |
|
146 | + $loggerInstance->writeAudit($_SESSION['user'], "NEW", "ORG FUTURE - Token created for $participant_type " . implode(",", $validAddresses)); |
|
147 | + break; |
|
148 | + case OPERATION_MODE_NEWFROMDB: |
|
149 | + $redirectDestination = "../overview_federation.php?"; |
|
150 | + if (count($validAddresses) == 0) { |
|
151 | + header("Location: $redirectDestination"."invitation=INVALIDSYNTAX"); |
|
152 | + exit(1); |
|
153 | + } |
|
154 | + // a real external DB entry was submitted and all the required parameters are there |
|
155 | + $newexternalid = $validator->string($_POST['externals']); |
|
156 | + $extinfo = $catInstance->getExternalDBEntityDetails($newexternalid); |
|
157 | + $new_idp_authorized_fedadmin = $userObject->isFederationAdmin($extinfo['country']); |
|
158 | + if ($new_idp_authorized_fedadmin !== TRUE) { |
|
159 | + throw new Exception("Something's wrong... you want to create a new " . $uiElements->nomenclatureParticipant . ", but are not a " . $uiElements->nomenclatureFed . " admin for the " . $uiElements->nomenclatureFed . " it should be in!"); |
|
160 | + } |
|
161 | + $federation = $validator->existingFederation($extinfo['country']); |
|
162 | + $newcountry = $extinfo['country']; |
|
163 | + // see if the inst name is defined in the currently set language; if not, pick its English name; if N/A, pick the last in the list |
|
164 | + $prettyprintname = ""; |
|
165 | + foreach ($extinfo['names'] as $lang => $name) { |
|
166 | + if ($lang == $languageInstance->getLang()) { |
|
167 | + $prettyprintname = $name; |
|
168 | + } |
|
169 | + } |
|
170 | + if ($prettyprintname == "" && isset($extinfo['names']['en'])) { |
|
171 | + $prettyprintname = $extinfo['names']['en']; |
|
172 | + } |
|
173 | + if ($prettyprintname == "") { |
|
174 | + foreach ($extinfo['names'] as $name) { |
|
175 | + $prettyprintname = $name; |
|
176 | + } |
|
177 | + } |
|
178 | + $participant_type = $extinfo['type']; |
|
179 | + // fill the rest of the text |
|
180 | + $introtext = "EXISTING-FED"; |
|
181 | + // do the token creation magic |
|
182 | + $newtokens = $mgmt->createTokens(TRUE, $validAddresses, $prettyprintname, $newexternalid); |
|
183 | + $loggerInstance->writeAudit($_SESSION['user'], "NEW", "IdP FUTURE - Token created for " . implode(",", $validAddresses)); |
|
184 | + break; |
|
185 | + default: // includes OPERATION_MODE_INVALID |
|
186 | + // second param is TRUE, so the variable *will* contain a string |
|
187 | + // i.e. ignore Scrutinizer type warning later |
|
188 | + $wrongcontent = print_r($_POST, TRUE); |
|
189 | + echo "<pre>Wrong parameters in POST: |
|
190 | 190 | " . htmlspecialchars(/** @scrutinizer ignore-type */ $wrongcontent) . " |
191 | 191 | </pre>"; |
192 | - exit(1); |
|
192 | + exit(1); |
|
193 | 193 | } |
194 | 194 | |
195 | 195 | // send, and invalidate the token immediately if the mail could not be sent! |
@@ -156,12 +156,12 @@ |
||
156 | 156 | } |
157 | 157 | if (isset($_POST['command'])) { |
158 | 158 | switch ($_POST['command']) { |
159 | - case web\lib\common\FormElements::BUTTON_CLOSE: |
|
160 | - header("Location: overview_org.php?inst_id=" . $my_inst->identifier); |
|
161 | - exit(0); |
|
162 | - default: |
|
163 | - header("Location: overview_org.php?inst_id=" . $my_inst->identifier); |
|
164 | - exit(0); |
|
159 | + case web\lib\common\FormElements::BUTTON_CLOSE: |
|
160 | + header("Location: overview_org.php?inst_id=" . $my_inst->identifier); |
|
161 | + exit(0); |
|
162 | + default: |
|
163 | + header("Location: overview_org.php?inst_id=" . $my_inst->identifier); |
|
164 | + exit(0); |
|
165 | 165 | } |
166 | 166 | } |
167 | 167 | $vlan = $deployment->getAttributes("managedsp:vlan")[0]['value'] ?? NULL; |
@@ -40,80 +40,80 @@ discard block |
||
40 | 40 | } |
41 | 41 | |
42 | 42 | switch ($_POST['submitbutton']) { |
43 | - case web\lib\common\FormElements::BUTTON_DELETE: |
|
44 | - if (!isset($_GET['profile_id'])) { |
|
45 | - throw new Exception("Can only delete a profile that exists and is named!"); |
|
46 | - } |
|
47 | - $profileToBeDel = $validator->existingProfile($_GET['profile_id'], $my_inst->identifier); |
|
48 | - $profileToBeDel->destroy(); |
|
49 | - $loggerInstance->writeAudit($_SESSION['user'], "DEL", "Profile " . $profileToBeDel->identifier); |
|
50 | - header("Location: overview_org.php?inst_id=$my_inst->identifier"); |
|
51 | - exit; |
|
52 | - case web\lib\common\FormElements::BUTTON_SAVE: |
|
53 | - if (isset($_GET['profile_id'])) { |
|
54 | - $profile = $validator->existingProfile($_GET['profile_id'], $my_inst->identifier); |
|
55 | - echo $deco->pageheader(sprintf(_("%s: Edit Profile - Result"), \config\Master::APPEARANCE['productname']), "ADMIN-IDP"); |
|
56 | - } else { |
|
57 | - $profile = $my_inst->newProfile(core\AbstractProfile::PROFILETYPE_RADIUS); |
|
58 | - $loggerInstance->writeAudit($_SESSION['user'], "NEW", "IdP " . $my_inst->identifier . " - Profile created"); |
|
59 | - echo $deco->pageheader(sprintf(_("%s: Profile wizard (step 3 completed)"), \config\Master::APPEARANCE['productname']), "ADMIN-IDP"); |
|
60 | - } |
|
61 | - if (!$profile instanceof \core\ProfileRADIUS) { |
|
62 | - throw new Exception("This page should only be called to submit RADIUS Profile information!"); |
|
63 | - } |
|
64 | -// extended input checks |
|
65 | - $realm = FALSE; |
|
66 | - if (isset($_POST['realm']) && $_POST['realm'] != "") { |
|
67 | - $realm = $validator->realm(filter_input(INPUT_POST, 'realm', FILTER_SANITIZE_STRING)); |
|
68 | - } |
|
43 | + case web\lib\common\FormElements::BUTTON_DELETE: |
|
44 | + if (!isset($_GET['profile_id'])) { |
|
45 | + throw new Exception("Can only delete a profile that exists and is named!"); |
|
46 | + } |
|
47 | + $profileToBeDel = $validator->existingProfile($_GET['profile_id'], $my_inst->identifier); |
|
48 | + $profileToBeDel->destroy(); |
|
49 | + $loggerInstance->writeAudit($_SESSION['user'], "DEL", "Profile " . $profileToBeDel->identifier); |
|
50 | + header("Location: overview_org.php?inst_id=$my_inst->identifier"); |
|
51 | + exit; |
|
52 | + case web\lib\common\FormElements::BUTTON_SAVE: |
|
53 | + if (isset($_GET['profile_id'])) { |
|
54 | + $profile = $validator->existingProfile($_GET['profile_id'], $my_inst->identifier); |
|
55 | + echo $deco->pageheader(sprintf(_("%s: Edit Profile - Result"), \config\Master::APPEARANCE['productname']), "ADMIN-IDP"); |
|
56 | + } else { |
|
57 | + $profile = $my_inst->newProfile(core\AbstractProfile::PROFILETYPE_RADIUS); |
|
58 | + $loggerInstance->writeAudit($_SESSION['user'], "NEW", "IdP " . $my_inst->identifier . " - Profile created"); |
|
59 | + echo $deco->pageheader(sprintf(_("%s: Profile wizard (step 3 completed)"), \config\Master::APPEARANCE['productname']), "ADMIN-IDP"); |
|
60 | + } |
|
61 | + if (!$profile instanceof \core\ProfileRADIUS) { |
|
62 | + throw new Exception("This page should only be called to submit RADIUS Profile information!"); |
|
63 | + } |
|
64 | + // extended input checks |
|
65 | + $realm = FALSE; |
|
66 | + if (isset($_POST['realm']) && $_POST['realm'] != "") { |
|
67 | + $realm = $validator->realm(filter_input(INPUT_POST, 'realm', FILTER_SANITIZE_STRING)); |
|
68 | + } |
|
69 | 69 | |
70 | - $anon = FALSE; |
|
71 | - if (isset($_POST['anon_support'])) { |
|
72 | - $anon = $validator->boolean($_POST['anon_support']); |
|
73 | - } |
|
70 | + $anon = FALSE; |
|
71 | + if (isset($_POST['anon_support'])) { |
|
72 | + $anon = $validator->boolean($_POST['anon_support']); |
|
73 | + } |
|
74 | 74 | |
75 | - $anonLocal = "anonymous"; |
|
76 | - if (isset($_POST['anon_local'])) { |
|
77 | - $anonLocal = $validator->string(filter_input(INPUT_POST, 'anon_local', FILTER_SANITIZE_STRING)); |
|
78 | - } else { // get the old anon outer id from DB. People don't appreciate "forgetting" it when unchecking anon id |
|
79 | - $local = $profile->getAttributes("internal:anon_local_value"); |
|
80 | - if (isset($local[0])) { |
|
81 | - $anonLocal = $local[0]['value']; |
|
75 | + $anonLocal = "anonymous"; |
|
76 | + if (isset($_POST['anon_local'])) { |
|
77 | + $anonLocal = $validator->string(filter_input(INPUT_POST, 'anon_local', FILTER_SANITIZE_STRING)); |
|
78 | + } else { // get the old anon outer id from DB. People don't appreciate "forgetting" it when unchecking anon id |
|
79 | + $local = $profile->getAttributes("internal:anon_local_value"); |
|
80 | + if (isset($local[0])) { |
|
81 | + $anonLocal = $local[0]['value']; |
|
82 | + } |
|
82 | 83 | } |
83 | - } |
|
84 | 84 | |
85 | - $checkuser = FALSE; |
|
86 | - if (isset($_POST['checkuser_support'])) { |
|
87 | - $checkuser = $validator->boolean($_POST['checkuser_support']); |
|
88 | - } |
|
85 | + $checkuser = FALSE; |
|
86 | + if (isset($_POST['checkuser_support'])) { |
|
87 | + $checkuser = $validator->boolean($_POST['checkuser_support']); |
|
88 | + } |
|
89 | 89 | |
90 | - $checkuser_name1 = "anonymous"; |
|
91 | - if (isset($_POST['checkuser_local'])) { |
|
92 | - $checkuser_name1 = $validator->string($_POST['checkuser_local']); |
|
93 | - } else { // get the old value from profile settings. People don't appreciate "forgetting" it when unchecking |
|
94 | - $checkuser_name1 = $profile->getAttributes("internal:checkuser_value")[0]['value']; |
|
95 | - } |
|
96 | -// it's a RADIUS username; and it's displayed later on. Be sure it contains no |
|
97 | -// "interesting" HTML characters before further processing |
|
98 | - $checkuser_name = htmlentities($checkuser_name1); |
|
90 | + $checkuser_name1 = "anonymous"; |
|
91 | + if (isset($_POST['checkuser_local'])) { |
|
92 | + $checkuser_name1 = $validator->string($_POST['checkuser_local']); |
|
93 | + } else { // get the old value from profile settings. People don't appreciate "forgetting" it when unchecking |
|
94 | + $checkuser_name1 = $profile->getAttributes("internal:checkuser_value")[0]['value']; |
|
95 | + } |
|
96 | + // it's a RADIUS username; and it's displayed later on. Be sure it contains no |
|
97 | + // "interesting" HTML characters before further processing |
|
98 | + $checkuser_name = htmlentities($checkuser_name1); |
|
99 | 99 | |
100 | - $verify = FALSE; |
|
101 | - $hint = FALSE; |
|
102 | - $redirect = FALSE; |
|
103 | - if (isset($_POST['verify_support'])) { |
|
104 | - $verify = $validator->boolean($_POST['verify_support']); |
|
105 | - } |
|
106 | - if (isset($_POST['hint_support'])) { |
|
107 | - $hint = $validator->boolean($_POST['hint_support']); |
|
108 | - } |
|
109 | - if (isset($_POST['redirect'])) { |
|
110 | - $redirect = $validator->boolean($_POST['redirect']); |
|
111 | - } |
|
112 | - ?> |
|
113 | - <h1><?php |
|
114 | - $tablecaption = _("Submitted attributes for this profile"); |
|
115 | - echo $tablecaption; |
|
116 | - ?></h1> |
|
100 | + $verify = FALSE; |
|
101 | + $hint = FALSE; |
|
102 | + $redirect = FALSE; |
|
103 | + if (isset($_POST['verify_support'])) { |
|
104 | + $verify = $validator->boolean($_POST['verify_support']); |
|
105 | + } |
|
106 | + if (isset($_POST['hint_support'])) { |
|
107 | + $hint = $validator->boolean($_POST['hint_support']); |
|
108 | + } |
|
109 | + if (isset($_POST['redirect'])) { |
|
110 | + $redirect = $validator->boolean($_POST['redirect']); |
|
111 | + } |
|
112 | + ?> |
|
113 | + <h1><?php |
|
114 | + $tablecaption = _("Submitted attributes for this profile"); |
|
115 | + echo $tablecaption; |
|
116 | + ?></h1> |
|
117 | 117 | <table> |
118 | 118 | <caption><?php echo $tablecaption; ?></caption> |
119 | 119 | <tr> |
@@ -121,245 +121,245 @@ discard block |
||
121 | 121 | <th class="wai-invisible" scope="col"><?php echo _("Details"); ?></th> |
122 | 122 | </tr> |
123 | 123 | <?php |
124 | - $uiElements = new web\lib\admin\UIElements(); |
|
125 | - // set realm info, if submitted |
|
126 | - if ($realm !== FALSE) { |
|
127 | - $profile->setRealm($anonLocal . "@" . $realm); |
|
128 | - echo $uiElements->boxOkay(sprintf(_("Realm: <strong>%s</strong>"), $realm)); |
|
129 | - } else { |
|
130 | - $profile->setRealm(""); |
|
131 | - } |
|
132 | - // set anon ID, if submitted |
|
133 | - if ($anon !== FALSE) { |
|
134 | - if ($realm === FALSE) { |
|
135 | - echo $uiElements->boxError(_("Anonymous Outer Identities cannot be turned on: realm is missing!")); |
|
124 | + $uiElements = new web\lib\admin\UIElements(); |
|
125 | + // set realm info, if submitted |
|
126 | + if ($realm !== FALSE) { |
|
127 | + $profile->setRealm($anonLocal . "@" . $realm); |
|
128 | + echo $uiElements->boxOkay(sprintf(_("Realm: <strong>%s</strong>"), $realm)); |
|
136 | 129 | } else { |
137 | - $profile->setAnonymousIDSupport(true); |
|
138 | - echo $uiElements->boxOkay(sprintf(_("Anonymous Identity support is <strong>%s</strong>, the anonymous outer identity is <strong>%s</strong>"), _("ON"), $profile->realm)); |
|
130 | + $profile->setRealm(""); |
|
139 | 131 | } |
140 | - } else { |
|
141 | - $profile->setAnonymousIDSupport(false); |
|
142 | - echo $uiElements->boxOkay(sprintf(_("Anonymous Identity support is <strong>%s</strong>"), _("OFF"))); |
|
143 | - if ($verify === FALSE) { // no anon outer ID, and no realm suffix verification? Bad idea! |
|
144 | - echo $uiElements->boxWarning(_("Without Anonymous Identity, the actual username will be used as outer identity and be the basis for request routing. For that to work, the username must have a correct realm suffix. Yet, realm suffix verification has been turned OFF. Supplicants will not verify that usernames contain a realm, and errors such as username 'johndoe' which will not work in roaming scenarios will not be prohibited. Consider checking the box 'Enforce realm suffix in username'!")); |
|
145 | - } |
|
146 | - } |
|
147 | - |
|
148 | - if ($checkuser !== FALSE) { |
|
149 | - if ($realm === FALSE) { |
|
150 | - echo $uiElements->boxError(_("Realm check username cannot be configured: realm is missing!")); |
|
132 | + // set anon ID, if submitted |
|
133 | + if ($anon !== FALSE) { |
|
134 | + if ($realm === FALSE) { |
|
135 | + echo $uiElements->boxError(_("Anonymous Outer Identities cannot be turned on: realm is missing!")); |
|
136 | + } else { |
|
137 | + $profile->setAnonymousIDSupport(true); |
|
138 | + echo $uiElements->boxOkay(sprintf(_("Anonymous Identity support is <strong>%s</strong>, the anonymous outer identity is <strong>%s</strong>"), _("ON"), $profile->realm)); |
|
139 | + } |
|
151 | 140 | } else { |
152 | - $profile->setRealmcheckUser(true, $checkuser_name); |
|
153 | - echo $uiElements->boxOkay(sprintf(_("Special username for realm check is <strong>%s</strong>, the value is <strong>%s</strong>"), _("ON"), $checkuser_name . "@" . $realm)); |
|
141 | + $profile->setAnonymousIDSupport(false); |
|
142 | + echo $uiElements->boxOkay(sprintf(_("Anonymous Identity support is <strong>%s</strong>"), _("OFF"))); |
|
143 | + if ($verify === FALSE) { // no anon outer ID, and no realm suffix verification? Bad idea! |
|
144 | + echo $uiElements->boxWarning(_("Without Anonymous Identity, the actual username will be used as outer identity and be the basis for request routing. For that to work, the username must have a correct realm suffix. Yet, realm suffix verification has been turned OFF. Supplicants will not verify that usernames contain a realm, and errors such as username 'johndoe' which will not work in roaming scenarios will not be prohibited. Consider checking the box 'Enforce realm suffix in username'!")); |
|
145 | + } |
|
154 | 146 | } |
155 | - } else { |
|
156 | - $profile->setRealmCheckUser(false); |
|
157 | - echo $uiElements->boxOkay(_("No special username for realm checks is configured.")); |
|
158 | - } |
|
159 | 147 | |
160 | - if ($verify !== FALSE) { |
|
161 | - $profile->setInputVerificationPreference($verify, $hint); |
|
162 | - $extratext = ""; |
|
163 | - if (!empty($realm)) { |
|
164 | - if ($hint !== FALSE) { |
|
165 | - $extratext = " " . sprintf(_("The realm portion MUST be exactly '...@%s'."), $realm); |
|
148 | + if ($checkuser !== FALSE) { |
|
149 | + if ($realm === FALSE) { |
|
150 | + echo $uiElements->boxError(_("Realm check username cannot be configured: realm is missing!")); |
|
166 | 151 | } else { |
167 | - $extratext = " " . sprintf(_("The realm portion MUST end with '%s' but sub-realms of it are allowed (i.e. 'user@%s' and 'user@<...>.%s' are both acceptable)."), $realm, $realm, $realm); |
|
152 | + $profile->setRealmcheckUser(true, $checkuser_name); |
|
153 | + echo $uiElements->boxOkay(sprintf(_("Special username for realm check is <strong>%s</strong>, the value is <strong>%s</strong>"), _("ON"), $checkuser_name . "@" . $realm)); |
|
168 | 154 | } |
155 | + } else { |
|
156 | + $profile->setRealmCheckUser(false); |
|
157 | + echo $uiElements->boxOkay(_("No special username for realm checks is configured.")); |
|
169 | 158 | } |
170 | - echo $uiElements->boxOkay(_("Where possible, supplicants will verify that username inputs contain a syntactically correct realm.") . $extratext); |
|
171 | - } else { |
|
172 | - $profile->setInputVerificationPreference(false, false); |
|
173 | - } |
|
174 | - |
|
175 | - echo $optionParser->processSubmittedFields($profile, $_POST, $_FILES); |
|
176 | 159 | |
177 | - if ($redirect !== FALSE) { |
|
178 | - if (!isset($_POST['redirect_target']) || $_POST['redirect_target'] == "") { |
|
179 | - echo $uiElements->boxError(_("Redirection can't be activated - you did not specify a target location!")); |
|
180 | - } elseif (!preg_match("/^(http|https):\/\//", $_POST['redirect_target'])) { |
|
181 | - echo $uiElements->boxError(_("Redirection can't be activated - the target needs to be a complete URL starting with http:// or https:// !")); |
|
182 | - } else { |
|
183 | - $profile->addAttribute("device-specific:redirect", 'C', $_POST['redirect_target']); |
|
184 | - // check if there is a device-level redirect which effectively disables profile-level redirect, and warn if so |
|
185 | - $redirects = $profile->getAttributes("device-specific:redirect"); |
|
186 | - $deviceSpecificFound = FALSE; |
|
187 | - foreach ($redirects as $oneRedirect) { |
|
188 | - if ($oneRedirect["level"] == \core\Options::LEVEL_METHOD) { |
|
189 | - $deviceSpecificFound = TRUE; |
|
160 | + if ($verify !== FALSE) { |
|
161 | + $profile->setInputVerificationPreference($verify, $hint); |
|
162 | + $extratext = ""; |
|
163 | + if (!empty($realm)) { |
|
164 | + if ($hint !== FALSE) { |
|
165 | + $extratext = " " . sprintf(_("The realm portion MUST be exactly '...@%s'."), $realm); |
|
166 | + } else { |
|
167 | + $extratext = " " . sprintf(_("The realm portion MUST end with '%s' but sub-realms of it are allowed (i.e. 'user@%s' and 'user@<...>.%s' are both acceptable)."), $realm, $realm, $realm); |
|
190 | 168 | } |
191 | 169 | } |
192 | - if ($deviceSpecificFound) { |
|
193 | - echo $uiElements->boxWarning(sprintf(_("Redirection set to <strong>%s</strong>, but will be ignored due to existing device-level redirect."), htmlspecialchars($_POST['redirect_target']))); |
|
194 | - } else { |
|
195 | - echo $uiElements->boxOkay(sprintf(_("Redirection set to <strong>%s</strong>"), htmlspecialchars($_POST['redirect_target']))); |
|
196 | - } |
|
170 | + echo $uiElements->boxOkay(_("Where possible, supplicants will verify that username inputs contain a syntactically correct realm.") . $extratext); |
|
171 | + } else { |
|
172 | + $profile->setInputVerificationPreference(false, false); |
|
197 | 173 | } |
198 | - } else { |
|
199 | - echo $uiElements->boxOkay(_("Redirection is <strong>OFF</strong>")); |
|
200 | - } |
|
201 | 174 | |
202 | - $loggerInstance->writeAudit($_SESSION['user'], "MOD", "Profile " . $profile->identifier . " - attributes changed"); |
|
203 | - // reload the profile to ingest new CA and server names if any; before checking EAP completeness |
|
204 | - $reloadedProfileNr1 = \core\ProfileFactory::instantiate($profile->identifier); |
|
205 | - foreach (\core\common\EAP::listKnownEAPTypes() as $a) { |
|
206 | - if ($a->getIntegerRep() == \core\common\EAP::INTEGER_SILVERBULLET) { // do not allow adding silverbullet via the backdoor |
|
207 | - continue; |
|
208 | - } |
|
209 | - if (isset($_POST[$a->getPrintableRep()]) && isset($_POST[$a->getPrintableRep() . "-priority"]) && is_numeric($_POST[$a->getPrintableRep() . "-priority"])) { |
|
210 | - $priority = (int) $_POST[$a->getPrintableRep() . "-priority"]; |
|
211 | - // add EAP type to profile as requested, but ... |
|
212 | - $reloadedProfileNr1->addSupportedEapMethod($a, $priority); |
|
213 | - $loggerInstance->writeAudit($_SESSION['user'], "MOD", "Profile " . $reloadedProfileNr1->identifier . " - supported EAP types changed"); |
|
214 | - // see if we can enable the EAP type, or if info is missing |
|
215 | - $eapcompleteness = $reloadedProfileNr1->isEapTypeDefinitionComplete($a); |
|
216 | - if ($eapcompleteness === true) { |
|
217 | - echo $uiElements->boxOkay(_("Supported EAP Type: ") . "<strong>" . $a->getPrintableRep() . "</strong>"); |
|
175 | + echo $optionParser->processSubmittedFields($profile, $_POST, $_FILES); |
|
176 | + |
|
177 | + if ($redirect !== FALSE) { |
|
178 | + if (!isset($_POST['redirect_target']) || $_POST['redirect_target'] == "") { |
|
179 | + echo $uiElements->boxError(_("Redirection can't be activated - you did not specify a target location!")); |
|
180 | + } elseif (!preg_match("/^(http|https):\/\//", $_POST['redirect_target'])) { |
|
181 | + echo $uiElements->boxError(_("Redirection can't be activated - the target needs to be a complete URL starting with http:// or https:// !")); |
|
218 | 182 | } else { |
219 | - $warntext = ""; |
|
220 | - if (is_array($eapcompleteness)) { |
|
221 | - foreach ($eapcompleteness as $item) { |
|
222 | - $warntext .= "<strong>" . $uiElements->displayName($item) . "</strong> "; |
|
183 | + $profile->addAttribute("device-specific:redirect", 'C', $_POST['redirect_target']); |
|
184 | + // check if there is a device-level redirect which effectively disables profile-level redirect, and warn if so |
|
185 | + $redirects = $profile->getAttributes("device-specific:redirect"); |
|
186 | + $deviceSpecificFound = FALSE; |
|
187 | + foreach ($redirects as $oneRedirect) { |
|
188 | + if ($oneRedirect["level"] == \core\Options::LEVEL_METHOD) { |
|
189 | + $deviceSpecificFound = TRUE; |
|
223 | 190 | } |
224 | 191 | } |
225 | - echo $uiElements->boxWarning(sprintf(_("Supported EAP Type: <strong>%s</strong> is missing required information %s !"), $a->getPrintableRep(), $warntext) . "<br/>" . _("The EAP type was added to the profile, but you need to complete the missing information before we can produce installers for you.")); |
|
192 | + if ($deviceSpecificFound) { |
|
193 | + echo $uiElements->boxWarning(sprintf(_("Redirection set to <strong>%s</strong>, but will be ignored due to existing device-level redirect."), htmlspecialchars($_POST['redirect_target']))); |
|
194 | + } else { |
|
195 | + echo $uiElements->boxOkay(sprintf(_("Redirection set to <strong>%s</strong>"), htmlspecialchars($_POST['redirect_target']))); |
|
196 | + } |
|
226 | 197 | } |
198 | + } else { |
|
199 | + echo $uiElements->boxOkay(_("Redirection is <strong>OFF</strong>")); |
|
227 | 200 | } |
228 | - } |
|
229 | - // re-instantiate $profile again, we need to do final checks on the |
|
230 | - // full set of new information |
|
231 | - $reloadedProfileNr2 = \core\ProfileFactory::instantiate($profile->identifier); |
|
232 | - $significantChanges = \core\AbstractProfile::significantChanges($profile, $reloadedProfileNr2); |
|
233 | - if (count($significantChanges) > 0) { |
|
234 | - $myInstOriginal = new \core\IdP($profile->institution); |
|
235 | - // send a notification/alert mail to someone we know is in charge |
|
236 | - $text = _("To whom it may concern,") . "\n\n"; |
|
237 | - /// were made to the *Identity Provider* *LU* / integer number of IdP / (previously known as) Name |
|
238 | - $text .= sprintf(_("significant changes were made to a RADIUS deployment profile of the %s %s / %s / '%s'."), $ui->nomenclatureIdP, strtoupper($myInstOriginal->federation), $myInstOriginal->identifier, $myInstOriginal->name) . "\n\n"; |
|
239 | - if (isset($significantChanges[\core\AbstractProfile::CA_CLASH_ADDED])) { |
|
240 | - $text .= _("WARNING! A new trusted root CA was added, and it has the exact same name as a previously existing root CA. This may (but does not necessarily) mean that this is an attempt to insert an unauthorised trust root by disguising as the genuine one. The details are below:") . "\n\n"; |
|
241 | - $text .= $significantChanges[\core\AbstractProfile::CA_CLASH_ADDED] . "\n\n"; |
|
242 | - } |
|
243 | - if (isset($significantChanges[\core\AbstractProfile::CA_ADDED])) { |
|
244 | - $text .= _("A new trusted root CA was added. The details are below:") . "\n\n"; |
|
245 | - $text .= $significantChanges[\core\AbstractProfile::CA_ADDED] . "\n\n"; |
|
246 | - } |
|
247 | - if (isset($significantChanges[\core\AbstractProfile::SERVERNAME_ADDED])) { |
|
248 | - $text .= _("A new acceptable server name for the authentication server was added. The details are below:") . "\n\n"; |
|
249 | - $text .= $significantChanges[\core\AbstractProfile::SERVERNAME_ADDED] . "\n\n"; |
|
201 | + |
|
202 | + $loggerInstance->writeAudit($_SESSION['user'], "MOD", "Profile " . $profile->identifier . " - attributes changed"); |
|
203 | + // reload the profile to ingest new CA and server names if any; before checking EAP completeness |
|
204 | + $reloadedProfileNr1 = \core\ProfileFactory::instantiate($profile->identifier); |
|
205 | + foreach (\core\common\EAP::listKnownEAPTypes() as $a) { |
|
206 | + if ($a->getIntegerRep() == \core\common\EAP::INTEGER_SILVERBULLET) { // do not allow adding silverbullet via the backdoor |
|
207 | + continue; |
|
208 | + } |
|
209 | + if (isset($_POST[$a->getPrintableRep()]) && isset($_POST[$a->getPrintableRep() . "-priority"]) && is_numeric($_POST[$a->getPrintableRep() . "-priority"])) { |
|
210 | + $priority = (int) $_POST[$a->getPrintableRep() . "-priority"]; |
|
211 | + // add EAP type to profile as requested, but ... |
|
212 | + $reloadedProfileNr1->addSupportedEapMethod($a, $priority); |
|
213 | + $loggerInstance->writeAudit($_SESSION['user'], "MOD", "Profile " . $reloadedProfileNr1->identifier . " - supported EAP types changed"); |
|
214 | + // see if we can enable the EAP type, or if info is missing |
|
215 | + $eapcompleteness = $reloadedProfileNr1->isEapTypeDefinitionComplete($a); |
|
216 | + if ($eapcompleteness === true) { |
|
217 | + echo $uiElements->boxOkay(_("Supported EAP Type: ") . "<strong>" . $a->getPrintableRep() . "</strong>"); |
|
218 | + } else { |
|
219 | + $warntext = ""; |
|
220 | + if (is_array($eapcompleteness)) { |
|
221 | + foreach ($eapcompleteness as $item) { |
|
222 | + $warntext .= "<strong>" . $uiElements->displayName($item) . "</strong> "; |
|
223 | + } |
|
224 | + } |
|
225 | + echo $uiElements->boxWarning(sprintf(_("Supported EAP Type: <strong>%s</strong> is missing required information %s !"), $a->getPrintableRep(), $warntext) . "<br/>" . _("The EAP type was added to the profile, but you need to complete the missing information before we can produce installers for you.")); |
|
226 | + } |
|
227 | + } |
|
250 | 228 | } |
251 | - $text .= _("This mail is merely a cross-check because these changes can be security-relevant. If the change was expected, you do not need to take any action.") . "\n\n"; |
|
252 | - $text .= _("Greetings, ") . "\n\n" . \config\Master::APPEARANCE['productname_long']; |
|
253 | - // (currently, send hard-wired to NRO - future: for linked insts, check eduroam DBv2 and send to registered admins directly) |
|
254 | - $fed = new core\Federation($myInstOriginal->federation); |
|
255 | - $loggerInstance->debug(2, $myInstOriginal->federation, "FED: ", "\n"); |
|
256 | - foreach ($fed->listFederationAdmins() as $id) { |
|
257 | - $user = new core\User($id); |
|
258 | - $mailaddr = $user->getAttributes("user:email")[0]['value']; |
|
259 | - $loggerInstance->debug(2, $mailaddr, "FED MAIL: ", "\n"); |
|
260 | - $user->sendMailToUser(sprintf(_("%s: Significant Changes made to %s"), \config\Master::APPEARANCE['productname'], $ui->nomenclatureIdP), $text); |
|
229 | + // re-instantiate $profile again, we need to do final checks on the |
|
230 | + // full set of new information |
|
231 | + $reloadedProfileNr2 = \core\ProfileFactory::instantiate($profile->identifier); |
|
232 | + $significantChanges = \core\AbstractProfile::significantChanges($profile, $reloadedProfileNr2); |
|
233 | + if (count($significantChanges) > 0) { |
|
234 | + $myInstOriginal = new \core\IdP($profile->institution); |
|
235 | + // send a notification/alert mail to someone we know is in charge |
|
236 | + $text = _("To whom it may concern,") . "\n\n"; |
|
237 | + /// were made to the *Identity Provider* *LU* / integer number of IdP / (previously known as) Name |
|
238 | + $text .= sprintf(_("significant changes were made to a RADIUS deployment profile of the %s %s / %s / '%s'."), $ui->nomenclatureIdP, strtoupper($myInstOriginal->federation), $myInstOriginal->identifier, $myInstOriginal->name) . "\n\n"; |
|
239 | + if (isset($significantChanges[\core\AbstractProfile::CA_CLASH_ADDED])) { |
|
240 | + $text .= _("WARNING! A new trusted root CA was added, and it has the exact same name as a previously existing root CA. This may (but does not necessarily) mean that this is an attempt to insert an unauthorised trust root by disguising as the genuine one. The details are below:") . "\n\n"; |
|
241 | + $text .= $significantChanges[\core\AbstractProfile::CA_CLASH_ADDED] . "\n\n"; |
|
242 | + } |
|
243 | + if (isset($significantChanges[\core\AbstractProfile::CA_ADDED])) { |
|
244 | + $text .= _("A new trusted root CA was added. The details are below:") . "\n\n"; |
|
245 | + $text .= $significantChanges[\core\AbstractProfile::CA_ADDED] . "\n\n"; |
|
246 | + } |
|
247 | + if (isset($significantChanges[\core\AbstractProfile::SERVERNAME_ADDED])) { |
|
248 | + $text .= _("A new acceptable server name for the authentication server was added. The details are below:") . "\n\n"; |
|
249 | + $text .= $significantChanges[\core\AbstractProfile::SERVERNAME_ADDED] . "\n\n"; |
|
250 | + } |
|
251 | + $text .= _("This mail is merely a cross-check because these changes can be security-relevant. If the change was expected, you do not need to take any action.") . "\n\n"; |
|
252 | + $text .= _("Greetings, ") . "\n\n" . \config\Master::APPEARANCE['productname_long']; |
|
253 | + // (currently, send hard-wired to NRO - future: for linked insts, check eduroam DBv2 and send to registered admins directly) |
|
254 | + $fed = new core\Federation($myInstOriginal->federation); |
|
255 | + $loggerInstance->debug(2, $myInstOriginal->federation, "FED: ", "\n"); |
|
256 | + foreach ($fed->listFederationAdmins() as $id) { |
|
257 | + $user = new core\User($id); |
|
258 | + $mailaddr = $user->getAttributes("user:email")[0]['value']; |
|
259 | + $loggerInstance->debug(2, $mailaddr, "FED MAIL: ", "\n"); |
|
260 | + $user->sendMailToUser(sprintf(_("%s: Significant Changes made to %s"), \config\Master::APPEARANCE['productname'], $ui->nomenclatureIdP), $text); |
|
261 | + } |
|
261 | 262 | } |
262 | - } |
|
263 | - $reloadedProfileNr2->prepShowtime(); |
|
263 | + $reloadedProfileNr2->prepShowtime(); |
|
264 | 264 | |
265 | - // do OpenRoaming initial diagnostic checks |
|
266 | - // numbers correspond to RFC7585Tests::OVERALL_LEVEL |
|
267 | - $resultLevel = \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_NO; |
|
268 | - if (sizeof($reloadedProfileNr2->getAttributes("media:openroaming")) > 0) { |
|
269 | - $resultLevel = \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_GOOD; // assume all is well, degrade if we have concrete findings to suggest otherwise |
|
270 | - $tag = "aaa+auth:radius.tls.tcp"; |
|
271 | - // do we know the realm at all? Notice if not. |
|
272 | - if (!isset($reloadedProfileNr2->getAttributes("internal:realm")[0]['value'])) { |
|
273 | - echo $uiElements->boxRemark(_("The profile information does not include the realm, so no DNS checks for OpenRoaming can be executed.")); |
|
274 | - $resultLevel = min([$resultLevel, \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_NOTE]); |
|
265 | + // do OpenRoaming initial diagnostic checks |
|
266 | + // numbers correspond to RFC7585Tests::OVERALL_LEVEL |
|
267 | + $resultLevel = \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_NO; |
|
268 | + if (sizeof($reloadedProfileNr2->getAttributes("media:openroaming")) > 0) { |
|
269 | + $resultLevel = \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_GOOD; // assume all is well, degrade if we have concrete findings to suggest otherwise |
|
270 | + $tag = "aaa+auth:radius.tls.tcp"; |
|
271 | + // do we know the realm at all? Notice if not. |
|
272 | + if (!isset($reloadedProfileNr2->getAttributes("internal:realm")[0]['value'])) { |
|
273 | + echo $uiElements->boxRemark(_("The profile information does not include the realm, so no DNS checks for OpenRoaming can be executed.")); |
|
274 | + $resultLevel = min([$resultLevel, \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_NOTE]); |
|
275 | 275 | |
276 | - } else { |
|
277 | - $dnsChecks = new \core\diag\RFC7585Tests($reloadedProfileNr2->getAttributes("internal:realm")[0]['value'], $tag); |
|
278 | - $relevantNaptrRecords = $dnsChecks->relevantNAPTR(); |
|
279 | - if ($relevantNaptrRecords <= 0) { |
|
280 | - echo $uiElements->boxError(_("There is no relevant DNS NAPTR record ($tag) for this realm. OpenRoaming will not work.")); |
|
281 | - $resultLevel = min([$resultLevel, \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_ERROR]); |
|
282 | 276 | } else { |
283 | - $recordCompliance = $dnsChecks->relevantNAPTRcompliance(); |
|
284 | - if ($recordCompliance != core\diag\AbstractTest::RETVAL_OK) { |
|
285 | - echo $uiElements->boxWarning(_("The DNS NAPTR record ($tag) for this realm is not syntax conform. OpenRoaming will likely not work.")); |
|
286 | - $resultLevel = min([$resultLevel, \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_WARN]); |
|
287 | - } |
|
288 | - $fed = new \core\Federation($my_inst->federation); |
|
289 | - // check if target is the expected one, if set by NRO |
|
290 | - $hasCustomTarget = $fed->getAttributes("fed:openroaming_customtarget"); |
|
291 | - if (sizeof($hasCustomTarget) > 0) { |
|
292 | - foreach ($dnsChecks->NAPTR_records as $orpointer) { |
|
293 | - if ($orpointer["replacement"] != $hasCustomTarget[0]['value']) { |
|
294 | - echo $uiElements->boxRemark(_("The SRV target of an OpenRoaming NAPTR record is unexpected.")); |
|
295 | - $resultLevel = min([$resultLevel, \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_NOTE]); |
|
277 | + $dnsChecks = new \core\diag\RFC7585Tests($reloadedProfileNr2->getAttributes("internal:realm")[0]['value'], $tag); |
|
278 | + $relevantNaptrRecords = $dnsChecks->relevantNAPTR(); |
|
279 | + if ($relevantNaptrRecords <= 0) { |
|
280 | + echo $uiElements->boxError(_("There is no relevant DNS NAPTR record ($tag) for this realm. OpenRoaming will not work.")); |
|
281 | + $resultLevel = min([$resultLevel, \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_ERROR]); |
|
282 | + } else { |
|
283 | + $recordCompliance = $dnsChecks->relevantNAPTRcompliance(); |
|
284 | + if ($recordCompliance != core\diag\AbstractTest::RETVAL_OK) { |
|
285 | + echo $uiElements->boxWarning(_("The DNS NAPTR record ($tag) for this realm is not syntax conform. OpenRoaming will likely not work.")); |
|
286 | + $resultLevel = min([$resultLevel, \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_WARN]); |
|
287 | + } |
|
288 | + $fed = new \core\Federation($my_inst->federation); |
|
289 | + // check if target is the expected one, if set by NRO |
|
290 | + $hasCustomTarget = $fed->getAttributes("fed:openroaming_customtarget"); |
|
291 | + if (sizeof($hasCustomTarget) > 0) { |
|
292 | + foreach ($dnsChecks->NAPTR_records as $orpointer) { |
|
293 | + if ($orpointer["replacement"] != $hasCustomTarget[0]['value']) { |
|
294 | + echo $uiElements->boxRemark(_("The SRV target of an OpenRoaming NAPTR record is unexpected.")); |
|
295 | + $resultLevel = min([$resultLevel, \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_NOTE]); |
|
296 | + } |
|
296 | 297 | } |
297 | 298 | } |
298 | - } |
|
299 | - $srvResolution = $dnsChecks->relevantNAPTRsrvResolution(); |
|
300 | - $hostnameResolution = $dnsChecks->relevantNAPTRhostnameResolution(); |
|
299 | + $srvResolution = $dnsChecks->relevantNAPTRsrvResolution(); |
|
300 | + $hostnameResolution = $dnsChecks->relevantNAPTRhostnameResolution(); |
|
301 | 301 | |
302 | - if ($srvResolution <= 0) { |
|
303 | - echo $uiElements->boxError(_("The DNS SRV target for NAPTR $tag does not resolve. OpenRoaming will not work.")); |
|
304 | - $resultLevel = min([$resultLevel, \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_ERROR]); |
|
305 | - } elseif ($hostnameResolution <= 0) { |
|
306 | - echo $uiElements->boxError(_("The DNS hostnames in the SRV records do not resolve to actual host IPs. OpenRoaming will not work.")); |
|
307 | - $resultLevel = min([$resultLevel, \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_ERROR]); |
|
308 | - } |
|
309 | - // connect to all IPs we found and see if they are really an OpenRoaming server |
|
310 | - $allHostsOkay = TRUE; |
|
311 | - $oneHostOkay = FALSE; |
|
312 | - $testCandidates = []; |
|
313 | - foreach ($dnsChecks->NAPTR_hostname_records as $oneServer) { |
|
314 | - $testCandidates[$oneServer['hostname']][] = ($oneServer['family'] == "IPv4" ? $oneServer['IP'] : "[" . $oneServer['IP'] . "]") . ":" . $oneServer['port']; |
|
315 | - } |
|
316 | - foreach ($testCandidates as $oneHost => $listOfIPs) { |
|
317 | - $connectionTests = new core\diag\RFC6614Tests(array_values($listOfIPs), $oneHost, "openroaming"); |
|
318 | - // for now (no OpenRoaming client certs available) only run server-side tests |
|
319 | - foreach ($listOfIPs as $oneIP) { |
|
320 | - $connectionResult = $connectionTests->cApathCheck($oneIP); |
|
321 | - if ($connectionResult != core\diag\AbstractTest::RETVAL_OK || ( isset($connectionTests->TLS_CA_checks_result['cert_oddity']) && count($connectionTests->TLS_CA_checks_result['cert_oddity']) > 0)) { |
|
322 | - $allHostsOkay = FALSE; |
|
323 | - } else { |
|
324 | - $oneHostOkay = TRUE; |
|
302 | + if ($srvResolution <= 0) { |
|
303 | + echo $uiElements->boxError(_("The DNS SRV target for NAPTR $tag does not resolve. OpenRoaming will not work.")); |
|
304 | + $resultLevel = min([$resultLevel, \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_ERROR]); |
|
305 | + } elseif ($hostnameResolution <= 0) { |
|
306 | + echo $uiElements->boxError(_("The DNS hostnames in the SRV records do not resolve to actual host IPs. OpenRoaming will not work.")); |
|
307 | + $resultLevel = min([$resultLevel, \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_ERROR]); |
|
308 | + } |
|
309 | + // connect to all IPs we found and see if they are really an OpenRoaming server |
|
310 | + $allHostsOkay = TRUE; |
|
311 | + $oneHostOkay = FALSE; |
|
312 | + $testCandidates = []; |
|
313 | + foreach ($dnsChecks->NAPTR_hostname_records as $oneServer) { |
|
314 | + $testCandidates[$oneServer['hostname']][] = ($oneServer['family'] == "IPv4" ? $oneServer['IP'] : "[" . $oneServer['IP'] . "]") . ":" . $oneServer['port']; |
|
315 | + } |
|
316 | + foreach ($testCandidates as $oneHost => $listOfIPs) { |
|
317 | + $connectionTests = new core\diag\RFC6614Tests(array_values($listOfIPs), $oneHost, "openroaming"); |
|
318 | + // for now (no OpenRoaming client certs available) only run server-side tests |
|
319 | + foreach ($listOfIPs as $oneIP) { |
|
320 | + $connectionResult = $connectionTests->cApathCheck($oneIP); |
|
321 | + if ($connectionResult != core\diag\AbstractTest::RETVAL_OK || ( isset($connectionTests->TLS_CA_checks_result['cert_oddity']) && count($connectionTests->TLS_CA_checks_result['cert_oddity']) > 0)) { |
|
322 | + $allHostsOkay = FALSE; |
|
323 | + } else { |
|
324 | + $oneHostOkay = TRUE; |
|
325 | + } |
|
325 | 326 | } |
326 | 327 | } |
327 | - } |
|
328 | - if (!$allHostsOkay) { |
|
329 | - if (!$oneHostOkay) { |
|
330 | - echo $uiElements->boxError(_("When connecting to the discovered OpenRoaming endpoints, they all had errors. OpenRoaming will likely not work.")); |
|
331 | - $resultLevel = min([$resultLevel, \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_ERROR]); |
|
332 | - } else { |
|
333 | - echo $uiElements->boxWarning(_("When connecting to the discovered OpenRoaming endpoints, only a subset of endpoints had no errors.")); |
|
334 | - $resultLevel = min([$resultLevel, \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_WARN]); |
|
328 | + if (!$allHostsOkay) { |
|
329 | + if (!$oneHostOkay) { |
|
330 | + echo $uiElements->boxError(_("When connecting to the discovered OpenRoaming endpoints, they all had errors. OpenRoaming will likely not work.")); |
|
331 | + $resultLevel = min([$resultLevel, \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_ERROR]); |
|
332 | + } else { |
|
333 | + echo $uiElements->boxWarning(_("When connecting to the discovered OpenRoaming endpoints, only a subset of endpoints had no errors.")); |
|
334 | + $resultLevel = min([$resultLevel, \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_WARN]); |
|
335 | + } |
|
335 | 336 | } |
336 | 337 | } |
337 | 338 | } |
338 | - } |
|
339 | 339 | |
340 | - if (!$dnsChecks->allResponsesSecure) { |
|
341 | - echo $uiElements->boxWarning(_("At least one DNS response was NOT secured using DNSSEC. OpenRoaming ANPs may refuse to connect to the endpoint.")); |
|
342 | - $resultLevel = min([$resultLevel, \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_WARN]); |
|
340 | + if (!$dnsChecks->allResponsesSecure) { |
|
341 | + echo $uiElements->boxWarning(_("At least one DNS response was NOT secured using DNSSEC. OpenRoaming ANPs may refuse to connect to the endpoint.")); |
|
342 | + $resultLevel = min([$resultLevel, \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_WARN]); |
|
343 | + } |
|
344 | + if ($resultLevel == \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_GOOD) { |
|
345 | + echo $uiElements->boxOkay(_("Initial diagnostics regarding the DNS part of OpenRoaming (including DNSSEC) were successful.")); |
|
346 | + } |
|
343 | 347 | } |
344 | - if ($resultLevel == \core\AbstractProfile::OVERALL_OPENROAMING_LEVEL_GOOD) { |
|
345 | - echo $uiElements->boxOkay(_("Initial diagnostics regarding the DNS part of OpenRoaming (including DNSSEC) were successful.")); |
|
346 | - } |
|
347 | - } |
|
348 | - $reloadedProfileNr2->setOpenRoamingReadinessInfo($resultLevel); |
|
349 | - ?> |
|
348 | + $reloadedProfileNr2->setOpenRoamingReadinessInfo($resultLevel); |
|
349 | + ?> |
|
350 | 350 | </table> |
351 | 351 | <br/> |
352 | 352 | <form method='post' action='overview_org.php?inst_id=<?php echo $my_inst->identifier; ?>' accept-charset='UTF-8'> |
353 | 353 | <button type='submit'><?php echo _("Continue to dashboard"); ?></button> |
354 | 354 | </form> |
355 | 355 | <?php |
356 | - if (count($reloadedProfileNr2->getEapMethodsinOrderOfPreference(1)) > 0) { |
|
357 | - echo "<form method='post' action='overview_installers.php?inst_id=$my_inst->identifier&profile_id=$reloadedProfileNr2->identifier' accept-charset='UTF-8'> |
|
356 | + if (count($reloadedProfileNr2->getEapMethodsinOrderOfPreference(1)) > 0) { |
|
357 | + echo "<form method='post' action='overview_installers.php?inst_id=$my_inst->identifier&profile_id=$reloadedProfileNr2->identifier' accept-charset='UTF-8'> |
|
358 | 358 | <button type='submit'>" . _("Continue to Installer Fine-Tuning and Download") . "</button> |
359 | 359 | </form>"; |
360 | - } |
|
361 | - echo $deco->footer(); |
|
362 | - break; |
|
363 | - default: |
|
364 | - throw new Exception("Unknown submit value received."); |
|
360 | + } |
|
361 | + echo $deco->footer(); |
|
362 | + break; |
|
363 | + default: |
|
364 | + throw new Exception("Unknown submit value received."); |
|
365 | 365 | } |
@@ -84,149 +84,149 @@ discard block |
||
84 | 84 | } |
85 | 85 | |
86 | 86 | switch ($inputDecoded['ACTION']) { |
87 | - case web\lib\admin\API::ACTION_NEWINST: |
|
88 | - // create the inst, no admin, no attributes |
|
89 | - $typeRaw = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_INSTTYPE); |
|
90 | - if ($typeRaw === FALSE) { |
|
91 | - throw new Exception("We did not receive a valid participant type!"); |
|
92 | - } |
|
93 | - $type = $validator->partType($typeRaw); |
|
94 | - $idp = new \core\IdP($fed->newIdP($type, "PENDING", "API")); |
|
95 | - // now add all submitted attributes |
|
96 | - $inputs = $adminApi->uglify($scrubbedParameters); |
|
97 | - $optionParser->processSubmittedFields($idp, $inputs["POST"], $inputs["FILES"]); |
|
98 | - $adminApi->returnSuccess([web\lib\admin\API::AUXATTRIB_CAT_INST_ID => $idp->identifier]); |
|
99 | - break; |
|
100 | - case web\lib\admin\API::ACTION_DELINST: |
|
101 | - try { |
|
102 | - $idp = $validator->existingIdP($adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_INST_ID), NULL, $fed); |
|
103 | - } catch (Exception $e) { |
|
104 | - $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "IdP identifier does not exist!"); |
|
105 | - exit(1); |
|
106 | - } |
|
107 | - $idp->destroy(); |
|
108 | - $adminApi->returnSuccess([]); |
|
109 | - break; |
|
110 | - case web\lib\admin\API::ACTION_ADMIN_LIST: |
|
111 | - try { |
|
112 | - $idp = $validator->existingIdP($adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_INST_ID), NULL, $fed); |
|
113 | - } catch (Exception $e) { |
|
114 | - $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "IdP identifier does not exist!"); |
|
115 | - exit(1); |
|
116 | - } |
|
117 | - $adminApi->returnSuccess($idp->listOwners()); |
|
118 | - break; |
|
119 | - case web\lib\admin\API::ACTION_ADMIN_ADD: |
|
120 | - // IdP in question |
|
121 | - try { |
|
122 | - $idp = $validator->existingIdP($adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_INST_ID), NULL, $fed); |
|
123 | - } catch (Exception $e) { |
|
124 | - $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "IdP identifier does not exist!"); |
|
125 | - exit(1); |
|
126 | - } |
|
127 | - // here is the token |
|
128 | - $mgmt = new core\UserManagement(); |
|
129 | - // we know we have an admin ID but scrutinizer wants this checked more explicitly |
|
130 | - $admin = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_ADMINID); |
|
131 | - if ($admin === FALSE) { |
|
132 | - throw new Exception("A required parameter is missing, and this wasn't caught earlier?!"); |
|
133 | - } |
|
134 | - $newtokens = $mgmt->createTokens(true, [$admin], $idp); |
|
135 | - $URL = "https://" . $_SERVER['SERVER_NAME'] . dirname($_SERVER['SCRIPT_NAME']) . "/action_enrollment.php?token=" . array_keys($newtokens)[0]; |
|
136 | - $success = ["TOKEN URL" => $URL, "TOKEN" => array_keys($newtokens)[0]]; |
|
137 | - // done with the essentials - display in response. But if we also have an email address, send it there |
|
138 | - $email = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_TARGETMAIL); |
|
139 | - if ($email !== FALSE) { |
|
140 | - $sent = \core\common\OutsideComm::adminInvitationMail($email, "EXISTING-FED", array_keys($newtokens)[0], $idp->name, $fed, $idp->type); |
|
141 | - $success["EMAIL SENT"] = $sent["SENT"]; |
|
142 | - if ($sent["SENT"] === TRUE) { |
|
143 | - $success["EMAIL TRANSPORT SECURE"] = $sent["TRANSPORT"]; |
|
87 | + case web\lib\admin\API::ACTION_NEWINST: |
|
88 | + // create the inst, no admin, no attributes |
|
89 | + $typeRaw = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_INSTTYPE); |
|
90 | + if ($typeRaw === FALSE) { |
|
91 | + throw new Exception("We did not receive a valid participant type!"); |
|
144 | 92 | } |
145 | - } |
|
146 | - $adminApi->returnSuccess($success); |
|
147 | - break; |
|
148 | - case web\lib\admin\API::ACTION_ADMIN_DEL: |
|
149 | - // IdP in question |
|
150 | - try { |
|
151 | - $idp = $validator->existingIdP($adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_INST_ID), NULL, $fed); |
|
152 | - } catch (Exception $e) { |
|
153 | - $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "IdP identifier does not exist!"); |
|
154 | - exit(1); |
|
155 | - } |
|
156 | - $currentAdmins = $idp->listOwners(); |
|
157 | - $toBeDeleted = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_ADMINID); |
|
158 | - if ($toBeDeleted === FALSE) { |
|
159 | - throw new Exception("A required parameter is missing, and this wasn't caught earlier?!"); |
|
160 | - } |
|
161 | - $found = FALSE; |
|
162 | - foreach ($currentAdmins as $oneAdmin) { |
|
163 | - if ($oneAdmin['MAIL'] == $toBeDeleted) { |
|
164 | - $found = TRUE; |
|
165 | - $mgmt = new core\UserManagement(); |
|
166 | - $mgmt->removeAdminFromIdP($idp, $oneAdmin['ID']); |
|
93 | + $type = $validator->partType($typeRaw); |
|
94 | + $idp = new \core\IdP($fed->newIdP($type, "PENDING", "API")); |
|
95 | + // now add all submitted attributes |
|
96 | + $inputs = $adminApi->uglify($scrubbedParameters); |
|
97 | + $optionParser->processSubmittedFields($idp, $inputs["POST"], $inputs["FILES"]); |
|
98 | + $adminApi->returnSuccess([web\lib\admin\API::AUXATTRIB_CAT_INST_ID => $idp->identifier]); |
|
99 | + break; |
|
100 | + case web\lib\admin\API::ACTION_DELINST: |
|
101 | + try { |
|
102 | + $idp = $validator->existingIdP($adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_INST_ID), NULL, $fed); |
|
103 | + } catch (Exception $e) { |
|
104 | + $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "IdP identifier does not exist!"); |
|
105 | + exit(1); |
|
167 | 106 | } |
168 | - } |
|
169 | - if ($found) { |
|
107 | + $idp->destroy(); |
|
170 | 108 | $adminApi->returnSuccess([]); |
171 | - } |
|
172 | - $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "The admin with ID $toBeDeleted is not associated to IdP " . $idp->identifier); |
|
173 | - break; |
|
174 | - case web\lib\admin\API::ACTION_STATISTICS_FED: |
|
175 | - $detail = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_DETAIL); |
|
176 | - $adminApi->returnSuccess($fed->downloadStats("array", $detail)); |
|
177 | - break; |
|
178 | - case \web\lib\admin\API::ACTION_FEDERATION_LISTIDP: |
|
179 | - $retArray = []; |
|
180 | - $noLogo = null; |
|
181 | - $idpIdentifier = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_INST_ID); |
|
182 | - $logoFlag = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::FLAG_NOLOGO); |
|
183 | - $detail = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_DETAIL); |
|
184 | - $idpStatFlag = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::FLAG_ADD_STATS); |
|
185 | - if ($logoFlag === "TRUE") { |
|
186 | - $noLogo = 'general:logo_file'; |
|
187 | - } |
|
188 | - if ($idpIdentifier === FALSE) { |
|
189 | - $allIdPs = $fed->listIdentityProviders(0); |
|
190 | - if ($idpStatFlag === "TRUE") { |
|
191 | - $fedStats = $fed->downloadStats('array', $detail); |
|
192 | - } |
|
193 | - foreach ($allIdPs as $instanceId => $oneIdP) { |
|
194 | - $theIdP = $oneIdP["instance"]; |
|
195 | - $retArray[$instanceId] = $theIdP->getAttributes(null, $noLogo); |
|
196 | - if ($idpStatFlag === "TRUE") { |
|
197 | - $retArray[$instanceId]['STAT'] = $fedStats[$instanceId]; |
|
109 | + break; |
|
110 | + case web\lib\admin\API::ACTION_ADMIN_LIST: |
|
111 | + try { |
|
112 | + $idp = $validator->existingIdP($adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_INST_ID), NULL, $fed); |
|
113 | + } catch (Exception $e) { |
|
114 | + $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "IdP identifier does not exist!"); |
|
115 | + exit(1); |
|
116 | + } |
|
117 | + $adminApi->returnSuccess($idp->listOwners()); |
|
118 | + break; |
|
119 | + case web\lib\admin\API::ACTION_ADMIN_ADD: |
|
120 | + // IdP in question |
|
121 | + try { |
|
122 | + $idp = $validator->existingIdP($adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_INST_ID), NULL, $fed); |
|
123 | + } catch (Exception $e) { |
|
124 | + $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "IdP identifier does not exist!"); |
|
125 | + exit(1); |
|
126 | + } |
|
127 | + // here is the token |
|
128 | + $mgmt = new core\UserManagement(); |
|
129 | + // we know we have an admin ID but scrutinizer wants this checked more explicitly |
|
130 | + $admin = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_ADMINID); |
|
131 | + if ($admin === FALSE) { |
|
132 | + throw new Exception("A required parameter is missing, and this wasn't caught earlier?!"); |
|
133 | + } |
|
134 | + $newtokens = $mgmt->createTokens(true, [$admin], $idp); |
|
135 | + $URL = "https://" . $_SERVER['SERVER_NAME'] . dirname($_SERVER['SCRIPT_NAME']) . "/action_enrollment.php?token=" . array_keys($newtokens)[0]; |
|
136 | + $success = ["TOKEN URL" => $URL, "TOKEN" => array_keys($newtokens)[0]]; |
|
137 | + // done with the essentials - display in response. But if we also have an email address, send it there |
|
138 | + $email = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_TARGETMAIL); |
|
139 | + if ($email !== FALSE) { |
|
140 | + $sent = \core\common\OutsideComm::adminInvitationMail($email, "EXISTING-FED", array_keys($newtokens)[0], $idp->name, $fed, $idp->type); |
|
141 | + $success["EMAIL SENT"] = $sent["SENT"]; |
|
142 | + if ($sent["SENT"] === TRUE) { |
|
143 | + $success["EMAIL TRANSPORT SECURE"] = $sent["TRANSPORT"]; |
|
198 | 144 | } |
199 | 145 | } |
200 | - } else { |
|
146 | + $adminApi->returnSuccess($success); |
|
147 | + break; |
|
148 | + case web\lib\admin\API::ACTION_ADMIN_DEL: |
|
149 | + // IdP in question |
|
201 | 150 | try { |
202 | - $thisIdP = $validator->existingIdP($idpIdentifier, NULL, $fed); |
|
151 | + $idp = $validator->existingIdP($adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_INST_ID), NULL, $fed); |
|
203 | 152 | } catch (Exception $e) { |
204 | 153 | $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "IdP identifier does not exist!"); |
205 | 154 | exit(1); |
206 | 155 | } |
207 | - $retArray[$idpIdentifier] = $thisIdP->getAttributes(null, $noLogo); |
|
208 | - foreach ($thisIdP->listProfiles() as $oneProfile) { |
|
209 | - $retArray[$idpIdentifier]["PROFILES"][$oneProfile->identifier] = $oneProfile->getAttributes(null, $noLogo); |
|
156 | + $currentAdmins = $idp->listOwners(); |
|
157 | + $toBeDeleted = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_ADMINID); |
|
158 | + if ($toBeDeleted === FALSE) { |
|
159 | + throw new Exception("A required parameter is missing, and this wasn't caught earlier?!"); |
|
210 | 160 | } |
211 | - } |
|
212 | - foreach ($retArray as $instNumber => $oneInstData) { |
|
213 | - foreach ($oneInstData as $attribNumber => $oneAttrib) { |
|
214 | - if ($oneAttrib['name'] == "general:logo_file") { |
|
215 | - // JSON doesn't cope well with raw binary data, so b64 it |
|
216 | - $retArray[$instNumber][$attribNumber]['value'] = base64_encode($oneAttrib['value']); |
|
161 | + $found = FALSE; |
|
162 | + foreach ($currentAdmins as $oneAdmin) { |
|
163 | + if ($oneAdmin['MAIL'] == $toBeDeleted) { |
|
164 | + $found = TRUE; |
|
165 | + $mgmt = new core\UserManagement(); |
|
166 | + $mgmt->removeAdminFromIdP($idp, $oneAdmin['ID']); |
|
167 | + } |
|
168 | + } |
|
169 | + if ($found) { |
|
170 | + $adminApi->returnSuccess([]); |
|
171 | + } |
|
172 | + $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "The admin with ID $toBeDeleted is not associated to IdP " . $idp->identifier); |
|
173 | + break; |
|
174 | + case web\lib\admin\API::ACTION_STATISTICS_FED: |
|
175 | + $detail = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_DETAIL); |
|
176 | + $adminApi->returnSuccess($fed->downloadStats("array", $detail)); |
|
177 | + break; |
|
178 | + case \web\lib\admin\API::ACTION_FEDERATION_LISTIDP: |
|
179 | + $retArray = []; |
|
180 | + $noLogo = null; |
|
181 | + $idpIdentifier = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_INST_ID); |
|
182 | + $logoFlag = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::FLAG_NOLOGO); |
|
183 | + $detail = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_DETAIL); |
|
184 | + $idpStatFlag = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::FLAG_ADD_STATS); |
|
185 | + if ($logoFlag === "TRUE") { |
|
186 | + $noLogo = 'general:logo_file'; |
|
187 | + } |
|
188 | + if ($idpIdentifier === FALSE) { |
|
189 | + $allIdPs = $fed->listIdentityProviders(0); |
|
190 | + if ($idpStatFlag === "TRUE") { |
|
191 | + $fedStats = $fed->downloadStats('array', $detail); |
|
217 | 192 | } |
218 | - if ($attribNumber == "PROFILES") { |
|
219 | - // scan for included fed:logo_file and b64 escape it, t2oo |
|
220 | - foreach ($oneAttrib as $profileNumber => $profileContent) { |
|
221 | - foreach ($profileContent as $oneProfileIterator => $oneProfileContent) { |
|
222 | - if ($oneProfileContent['name'] == "fed:logo_file" || $oneProfileContent['name'] == "general:logo_file" || $oneProfileContent['name'] == "eap:ca_file") { |
|
223 | - $retArray[$instNumber]["PROFILES"][$profileNumber][$oneProfileIterator]['value'] = base64_encode($oneProfileContent['value']); |
|
224 | - } |
|
225 | - } |
|
193 | + foreach ($allIdPs as $instanceId => $oneIdP) { |
|
194 | + $theIdP = $oneIdP["instance"]; |
|
195 | + $retArray[$instanceId] = $theIdP->getAttributes(null, $noLogo); |
|
196 | + if ($idpStatFlag === "TRUE") { |
|
197 | + $retArray[$instanceId]['STAT'] = $fedStats[$instanceId]; |
|
198 | + } |
|
199 | + } |
|
200 | + } else { |
|
201 | + try { |
|
202 | + $thisIdP = $validator->existingIdP($idpIdentifier, NULL, $fed); |
|
203 | + } catch (Exception $e) { |
|
204 | + $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "IdP identifier does not exist!"); |
|
205 | + exit(1); |
|
206 | + } |
|
207 | + $retArray[$idpIdentifier] = $thisIdP->getAttributes(null, $noLogo); |
|
208 | + foreach ($thisIdP->listProfiles() as $oneProfile) { |
|
209 | + $retArray[$idpIdentifier]["PROFILES"][$oneProfile->identifier] = $oneProfile->getAttributes(null, $noLogo); |
|
210 | + } |
|
211 | + } |
|
212 | + foreach ($retArray as $instNumber => $oneInstData) { |
|
213 | + foreach ($oneInstData as $attribNumber => $oneAttrib) { |
|
214 | + if ($oneAttrib['name'] == "general:logo_file") { |
|
215 | + // JSON doesn't cope well with raw binary data, so b64 it |
|
216 | + $retArray[$instNumber][$attribNumber]['value'] = base64_encode($oneAttrib['value']); |
|
217 | + } |
|
218 | + if ($attribNumber == "PROFILES") { |
|
219 | + // scan for included fed:logo_file and b64 escape it, t2oo |
|
220 | + foreach ($oneAttrib as $profileNumber => $profileContent) { |
|
221 | + foreach ($profileContent as $oneProfileIterator => $oneProfileContent) { |
|
222 | + if ($oneProfileContent['name'] == "fed:logo_file" || $oneProfileContent['name'] == "general:logo_file" || $oneProfileContent['name'] == "eap:ca_file") { |
|
223 | + $retArray[$instNumber]["PROFILES"][$profileNumber][$oneProfileIterator]['value'] = base64_encode($oneProfileContent['value']); |
|
224 | + } |
|
225 | + } |
|
226 | + } |
|
226 | 227 | } |
227 | 228 | } |
228 | 229 | } |
229 | - } |
|
230 | 230 | |
231 | 231 | /* |
232 | 232 | $retArray[$idpIdentifier] = []; |
@@ -237,102 +237,102 @@ discard block |
||
237 | 237 | * |
238 | 238 | */ |
239 | 239 | |
240 | - $adminApi->returnSuccess($retArray); |
|
241 | - break; |
|
242 | - case \web\lib\admin\API::ACTION_NEWPROF_RADIUS: |
|
243 | - // fall-through intended: both get mostly identical treatment |
|
244 | - case web\lib\admin\API::ACTION_NEWPROF_SB: |
|
245 | - try { |
|
246 | - $idp = $validator->existingIdP($adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_INST_ID), NULL, $fed); |
|
247 | - } catch (Exception $e) { |
|
248 | - $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "IdP identifier does not exist!"); |
|
249 | - exit(1); |
|
250 | - } |
|
251 | - if ($inputDecoded['ACTION'] == web\lib\admin\API::ACTION_NEWPROF_RADIUS) { |
|
252 | - $type = "RADIUS"; |
|
253 | - } else { |
|
254 | - $type = "SILVERBULLET"; |
|
255 | - } |
|
256 | - $profile = $idp->newProfile($type); |
|
257 | - if ($profile === NULL) { |
|
258 | - $adminApi->returnError(\web\lib\admin\API::ERROR_INTERNAL_ERROR, "Unable to create a new Profile, for no apparent reason. Please contact support."); |
|
259 | - exit(1); |
|
260 | - } |
|
261 | - $inputs = $adminApi->uglify($scrubbedParameters); |
|
262 | - $optionParser->processSubmittedFields($profile, $inputs["POST"], $inputs["FILES"]); |
|
263 | - if ($inputDecoded['ACTION'] == web\lib\admin\API::ACTION_NEWPROF_SB) { |
|
264 | - // auto-accept ToU? |
|
265 | - if ($adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_TOU) !== FALSE) { |
|
266 | - $profile->addAttribute("hiddenprofile:tou_accepted", NULL, 1); |
|
267 | - } |
|
268 | - // we're done at this point |
|
269 | - $adminApi->returnSuccess([\web\lib\admin\API::AUXATTRIB_CAT_PROFILE_ID => $profile->identifier]); |
|
240 | + $adminApi->returnSuccess($retArray); |
|
270 | 241 | break; |
271 | - } |
|
272 | - if (!$profile instanceof core\ProfileRADIUS) { |
|
273 | - throw new Exception("Can't be. This is only here to convince Scrutinizer that we're really talking RADIUS."); |
|
274 | - } |
|
275 | - /* const AUXATTRIB_PROFILE_REALM = 'ATTRIB-PROFILE-REALM'; |
|
276 | - const AUXATTRIB_PROFILE_OUTERVALUE = 'ATTRIB-PROFILE-OUTERVALUE'; */ |
|
277 | - $realm = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_PROFILE_REALM); |
|
278 | - $outer = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_PROFILE_OUTERVALUE); |
|
279 | - if ($realm !== FALSE) { |
|
280 | - if ($outer === FALSE) { |
|
281 | - $outer = ""; |
|
282 | - $profile->setAnonymousIDSupport(FALSE); |
|
242 | + case \web\lib\admin\API::ACTION_NEWPROF_RADIUS: |
|
243 | + // fall-through intended: both get mostly identical treatment |
|
244 | + case web\lib\admin\API::ACTION_NEWPROF_SB: |
|
245 | + try { |
|
246 | + $idp = $validator->existingIdP($adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_INST_ID), NULL, $fed); |
|
247 | + } catch (Exception $e) { |
|
248 | + $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "IdP identifier does not exist!"); |
|
249 | + exit(1); |
|
250 | + } |
|
251 | + if ($inputDecoded['ACTION'] == web\lib\admin\API::ACTION_NEWPROF_RADIUS) { |
|
252 | + $type = "RADIUS"; |
|
283 | 253 | } else { |
284 | - $outer = $outer . "@"; |
|
285 | - $profile->setAnonymousIDSupport(TRUE); |
|
254 | + $type = "SILVERBULLET"; |
|
286 | 255 | } |
287 | - $profile->setRealm($outer . $realm); |
|
288 | - } |
|
289 | - /* const AUXATTRIB_PROFILE_TESTUSER = 'ATTRIB-PROFILE-TESTUSER'; */ |
|
290 | - $testuser = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_PROFILE_TESTUSER); |
|
291 | - if ($testuser !== FALSE) { |
|
292 | - $profile->setRealmCheckUser(TRUE, $testuser); |
|
293 | - } |
|
294 | - /* const AUXATTRIB_PROFILE_INPUT_HINT = 'ATTRIB-PROFILE-HINTREALM'; |
|
256 | + $profile = $idp->newProfile($type); |
|
257 | + if ($profile === NULL) { |
|
258 | + $adminApi->returnError(\web\lib\admin\API::ERROR_INTERNAL_ERROR, "Unable to create a new Profile, for no apparent reason. Please contact support."); |
|
259 | + exit(1); |
|
260 | + } |
|
261 | + $inputs = $adminApi->uglify($scrubbedParameters); |
|
262 | + $optionParser->processSubmittedFields($profile, $inputs["POST"], $inputs["FILES"]); |
|
263 | + if ($inputDecoded['ACTION'] == web\lib\admin\API::ACTION_NEWPROF_SB) { |
|
264 | + // auto-accept ToU? |
|
265 | + if ($adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_TOU) !== FALSE) { |
|
266 | + $profile->addAttribute("hiddenprofile:tou_accepted", NULL, 1); |
|
267 | + } |
|
268 | + // we're done at this point |
|
269 | + $adminApi->returnSuccess([\web\lib\admin\API::AUXATTRIB_CAT_PROFILE_ID => $profile->identifier]); |
|
270 | + break; |
|
271 | + } |
|
272 | + if (!$profile instanceof core\ProfileRADIUS) { |
|
273 | + throw new Exception("Can't be. This is only here to convince Scrutinizer that we're really talking RADIUS."); |
|
274 | + } |
|
275 | + /* const AUXATTRIB_PROFILE_REALM = 'ATTRIB-PROFILE-REALM'; |
|
276 | + const AUXATTRIB_PROFILE_OUTERVALUE = 'ATTRIB-PROFILE-OUTERVALUE'; */ |
|
277 | + $realm = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_PROFILE_REALM); |
|
278 | + $outer = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_PROFILE_OUTERVALUE); |
|
279 | + if ($realm !== FALSE) { |
|
280 | + if ($outer === FALSE) { |
|
281 | + $outer = ""; |
|
282 | + $profile->setAnonymousIDSupport(FALSE); |
|
283 | + } else { |
|
284 | + $outer = $outer . "@"; |
|
285 | + $profile->setAnonymousIDSupport(TRUE); |
|
286 | + } |
|
287 | + $profile->setRealm($outer . $realm); |
|
288 | + } |
|
289 | + /* const AUXATTRIB_PROFILE_TESTUSER = 'ATTRIB-PROFILE-TESTUSER'; */ |
|
290 | + $testuser = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_PROFILE_TESTUSER); |
|
291 | + if ($testuser !== FALSE) { |
|
292 | + $profile->setRealmCheckUser(TRUE, $testuser); |
|
293 | + } |
|
294 | + /* const AUXATTRIB_PROFILE_INPUT_HINT = 'ATTRIB-PROFILE-HINTREALM'; |
|
295 | 295 | const AUXATTRIB_PROFILE_INPUT_VERIFY = 'ATTRIB-PROFILE-VERIFYREALM'; */ |
296 | - $hint = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_PROFILE_INPUT_HINT); |
|
297 | - $enforce = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_PROFILE_INPUT_VERIFY); |
|
298 | - if ($enforce !== FALSE) { |
|
299 | - $profile->setInputVerificationPreference($enforce, $hint); |
|
300 | - } |
|
301 | - /* const AUXATTRIB_PROFILE_EAPTYPE */ |
|
302 | - $iterator = 1; |
|
303 | - foreach ($scrubbedParameters as $oneParam) { |
|
304 | - if ($oneParam['NAME'] == web\lib\admin\API::AUXATTRIB_PROFILE_EAPTYPE && is_int($oneParam["VALUE"])) { |
|
305 | - $type = new \core\common\EAP($oneParam["VALUE"]); |
|
306 | - $profile->addSupportedEapMethod($type, $iterator); |
|
307 | - $iterator = $iterator + 1; |
|
296 | + $hint = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_PROFILE_INPUT_HINT); |
|
297 | + $enforce = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_PROFILE_INPUT_VERIFY); |
|
298 | + if ($enforce !== FALSE) { |
|
299 | + $profile->setInputVerificationPreference($enforce, $hint); |
|
308 | 300 | } |
309 | - } |
|
310 | - // reinstantiate $profile freshly from DB - it was updated in the process |
|
311 | - $profileFresh = new core\ProfileRADIUS($profile->identifier); |
|
312 | - $profileFresh->prepShowtime(); |
|
313 | - $adminApi->returnSuccess([\web\lib\admin\API::AUXATTRIB_CAT_PROFILE_ID => $profileFresh->identifier]); |
|
314 | - break; |
|
315 | - case web\lib\admin\API::ACTION_ENDUSER_NEW: |
|
316 | - // fall-through intentional, those two actions are doing nearly identical things |
|
317 | - case web\lib\admin\API::ACTION_ENDUSER_CHANGEEXPIRY: |
|
318 | - $prof_id = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_PROFILE_ID); |
|
319 | - if ($prof_id === FALSE) { |
|
320 | - exit(1); |
|
321 | - } |
|
322 | - $evaluation = $adminApi->commonSbProfileChecks($fed, $prof_id); |
|
323 | - if ($evaluation === FALSE) { |
|
324 | - exit(1); |
|
325 | - } |
|
326 | - list($idp, $profile) = $evaluation; |
|
327 | - $user = $validator->string($adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_USERNAME)); |
|
328 | - $expiryRaw = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_EXPIRY); |
|
329 | - if ($expiryRaw === FALSE) { |
|
330 | - $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "The expiry date wasn't found in the request."); |
|
301 | + /* const AUXATTRIB_PROFILE_EAPTYPE */ |
|
302 | + $iterator = 1; |
|
303 | + foreach ($scrubbedParameters as $oneParam) { |
|
304 | + if ($oneParam['NAME'] == web\lib\admin\API::AUXATTRIB_PROFILE_EAPTYPE && is_int($oneParam["VALUE"])) { |
|
305 | + $type = new \core\common\EAP($oneParam["VALUE"]); |
|
306 | + $profile->addSupportedEapMethod($type, $iterator); |
|
307 | + $iterator = $iterator + 1; |
|
308 | + } |
|
309 | + } |
|
310 | + // reinstantiate $profile freshly from DB - it was updated in the process |
|
311 | + $profileFresh = new core\ProfileRADIUS($profile->identifier); |
|
312 | + $profileFresh->prepShowtime(); |
|
313 | + $adminApi->returnSuccess([\web\lib\admin\API::AUXATTRIB_CAT_PROFILE_ID => $profileFresh->identifier]); |
|
331 | 314 | break; |
332 | - } |
|
333 | - $expiry = new DateTime($expiryRaw); |
|
334 | - try { |
|
335 | - switch ($inputDecoded['ACTION']) { |
|
315 | + case web\lib\admin\API::ACTION_ENDUSER_NEW: |
|
316 | + // fall-through intentional, those two actions are doing nearly identical things |
|
317 | + case web\lib\admin\API::ACTION_ENDUSER_CHANGEEXPIRY: |
|
318 | + $prof_id = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_PROFILE_ID); |
|
319 | + if ($prof_id === FALSE) { |
|
320 | + exit(1); |
|
321 | + } |
|
322 | + $evaluation = $adminApi->commonSbProfileChecks($fed, $prof_id); |
|
323 | + if ($evaluation === FALSE) { |
|
324 | + exit(1); |
|
325 | + } |
|
326 | + list($idp, $profile) = $evaluation; |
|
327 | + $user = $validator->string($adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_USERNAME)); |
|
328 | + $expiryRaw = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_EXPIRY); |
|
329 | + if ($expiryRaw === FALSE) { |
|
330 | + $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "The expiry date wasn't found in the request."); |
|
331 | + break; |
|
332 | + } |
|
333 | + $expiry = new DateTime($expiryRaw); |
|
334 | + try { |
|
335 | + switch ($inputDecoded['ACTION']) { |
|
336 | 336 | case web\lib\admin\API::ACTION_ENDUSER_NEW: |
337 | 337 | $retval = $profile->addUser($user, $expiry); |
338 | 338 | break; |
@@ -345,7 +345,7 @@ discard block |
||
345 | 345 | $retval = 1; // function doesn't have any failure vectors not raising an Exception and doesn't return a value |
346 | 346 | } |
347 | 347 | break; |
348 | - } |
|
348 | + } |
|
349 | 349 | } catch (Exception $e) { |
350 | 350 | $adminApi->returnError(web\lib\admin\API::ERROR_INTERNAL_ERROR, "The operation failed. Maybe a duplicate username, or malformed expiry date?"); |
351 | 351 | exit(1); |
@@ -356,25 +356,25 @@ discard block |
||
356 | 356 | } |
357 | 357 | $adminApi->returnSuccess([web\lib\admin\API::AUXATTRIB_SB_USERNAME => $user, \web\lib\admin\API::AUXATTRIB_SB_USERID => $retval]); |
358 | 358 | break; |
359 | - case \web\lib\admin\API::ACTION_ENDUSER_DEACTIVATE: |
|
360 | - // fall-through intended: both actions are very similar |
|
361 | - case \web\lib\admin\API::ACTION_TOKEN_NEW: |
|
362 | - $profile_id = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_PROFILE_ID); |
|
363 | - if ($profile_id === FALSE) { |
|
364 | - exit(1); |
|
365 | - } |
|
366 | - $evaluation = $adminApi->commonSbProfileChecks($fed, $profile_id); |
|
367 | - if ($evaluation === FALSE) { |
|
368 | - exit(1); |
|
369 | - } |
|
370 | - list($idp, $profile) = $evaluation; |
|
371 | - $userId = $validator->integer($adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_USERID)); |
|
372 | - if ($userId === FALSE) { |
|
373 | - $adminApi->returnError(\web\lib\admin\API::ERROR_INVALID_PARAMETER, "User ID is not an integer."); |
|
374 | - exit(1); |
|
375 | - } |
|
376 | - $additionalInfo = []; |
|
377 | - switch ($inputDecoded['ACTION']) { // this is where the two differ |
|
359 | + case \web\lib\admin\API::ACTION_ENDUSER_DEACTIVATE: |
|
360 | + // fall-through intended: both actions are very similar |
|
361 | + case \web\lib\admin\API::ACTION_TOKEN_NEW: |
|
362 | + $profile_id = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_PROFILE_ID); |
|
363 | + if ($profile_id === FALSE) { |
|
364 | + exit(1); |
|
365 | + } |
|
366 | + $evaluation = $adminApi->commonSbProfileChecks($fed, $profile_id); |
|
367 | + if ($evaluation === FALSE) { |
|
368 | + exit(1); |
|
369 | + } |
|
370 | + list($idp, $profile) = $evaluation; |
|
371 | + $userId = $validator->integer($adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_USERID)); |
|
372 | + if ($userId === FALSE) { |
|
373 | + $adminApi->returnError(\web\lib\admin\API::ERROR_INVALID_PARAMETER, "User ID is not an integer."); |
|
374 | + exit(1); |
|
375 | + } |
|
376 | + $additionalInfo = []; |
|
377 | + switch ($inputDecoded['ACTION']) { // this is where the two differ |
|
378 | 378 | case \web\lib\admin\API::ACTION_ENDUSER_DEACTIVATE: |
379 | 379 | $result = $profile->deactivateUser($userId); |
380 | 380 | break; |
@@ -407,7 +407,7 @@ discard block |
||
407 | 407 | } |
408 | 408 | } |
409 | 409 | break; |
410 | - } |
|
410 | + } |
|
411 | 411 | |
412 | 412 | if ($result !== TRUE) { |
413 | 413 | $adminApi->returnError(\web\lib\admin\API::ERROR_INVALID_PARAMETER, "These parameters did not lead to an existing, active user."); |
@@ -415,69 +415,69 @@ discard block |
||
415 | 415 | } |
416 | 416 | $adminApi->returnSuccess($additionalInfo); |
417 | 417 | break; |
418 | - case \web\lib\admin\API::ACTION_ENDUSER_IDENTIFY: |
|
419 | - $profile_id = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_PROFILE_ID); |
|
420 | - if ($profile_id === FALSE) { |
|
421 | - exit(1); |
|
422 | - } |
|
423 | - $evaluation = $adminApi->commonSbProfileChecks($fed, $profile_id); |
|
424 | - if ($evaluation === FALSE) { |
|
425 | - exit(1); |
|
426 | - } |
|
427 | - list($idp, $profile) = $evaluation; |
|
428 | - $userId = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_USERID); |
|
429 | - $userName = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_USERNAME); |
|
430 | - $certSerial = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_CERTSERIAL); |
|
431 | - $certCN = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_CERTCN); |
|
432 | - if ($userId === FALSE && $userName === FALSE && $certSerial === FALSE && $certCN === FALSE) { |
|
433 | - // we need at least one of those |
|
434 | - $adminApi->returnError(\web\lib\admin\API::ERROR_MISSING_PARAMETER, "At least one of User ID, Username, certificate serial, or certificate CN is required."); |
|
435 | - break; |
|
436 | - } |
|
437 | - if ($certSerial !== FALSE) { // we got a cert serial |
|
438 | - $serial = explode(":", $certSerial); |
|
439 | - $cert = new \core\SilverbulletCertificate($serial[1], $serial[0]); |
|
418 | + case \web\lib\admin\API::ACTION_ENDUSER_IDENTIFY: |
|
419 | + $profile_id = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_PROFILE_ID); |
|
420 | + if ($profile_id === FALSE) { |
|
421 | + exit(1); |
|
440 | 422 | } |
441 | - if ($certCN !== FALSE) { // we got a cert CN |
|
442 | - $cert = new \core\SilverbulletCertificate($certCN); |
|
443 | - } |
|
444 | - if ($cert !== NULL) { // we found a cert; verify it and extract userId |
|
445 | - if ($cert->status == \core\SilverbulletCertificate::CERTSTATUS_INVALID) { |
|
446 | - return $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "Certificate not found."); |
|
423 | + $evaluation = $adminApi->commonSbProfileChecks($fed, $profile_id); |
|
424 | + if ($evaluation === FALSE) { |
|
425 | + exit(1); |
|
447 | 426 | } |
448 | - if ($cert->profileId != $profile->identifier) { |
|
449 | - return $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "Certificate does not belong to this profile."); |
|
427 | + list($idp, $profile) = $evaluation; |
|
428 | + $userId = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_USERID); |
|
429 | + $userName = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_USERNAME); |
|
430 | + $certSerial = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_CERTSERIAL); |
|
431 | + $certCN = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_CERTCN); |
|
432 | + if ($userId === FALSE && $userName === FALSE && $certSerial === FALSE && $certCN === FALSE) { |
|
433 | + // we need at least one of those |
|
434 | + $adminApi->returnError(\web\lib\admin\API::ERROR_MISSING_PARAMETER, "At least one of User ID, Username, certificate serial, or certificate CN is required."); |
|
435 | + break; |
|
450 | 436 | } |
451 | - $userId = $cert->userId; |
|
452 | - } |
|
453 | - if ($userId !== FALSE) { |
|
454 | - $userList = $profile->getUserById($userId); |
|
455 | - } |
|
456 | - if ($userName !== FALSE) { |
|
457 | - $userList = $profile->getUserByName($userName); |
|
458 | - } |
|
459 | - if (count($userList) === 1) { |
|
460 | - foreach ($userList as $oneUserId => $oneUserName) { |
|
461 | - return $adminApi->returnSuccess([web\lib\admin\API::AUXATTRIB_SB_USERNAME => $oneUserName, \web\lib\admin\API::AUXATTRIB_SB_USERID => $oneUserId]); |
|
437 | + if ($certSerial !== FALSE) { // we got a cert serial |
|
438 | + $serial = explode(":", $certSerial); |
|
439 | + $cert = new \core\SilverbulletCertificate($serial[1], $serial[0]); |
|
440 | + } |
|
441 | + if ($certCN !== FALSE) { // we got a cert CN |
|
442 | + $cert = new \core\SilverbulletCertificate($certCN); |
|
462 | 443 | } |
463 | - } |
|
464 | - $adminApi->returnError(\web\lib\admin\API::ERROR_INVALID_PARAMETER, "No matching user found in this profile."); |
|
465 | - break; |
|
466 | - case \web\lib\admin\API::ACTION_ENDUSER_LIST: |
|
467 | - // fall-through: those two are similar |
|
468 | - case \web\lib\admin\API::ACTION_TOKEN_LIST: |
|
469 | - $profile_id = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_PROFILE_ID); |
|
470 | - if ($profile_id === FALSE) { |
|
471 | - exit(1); |
|
472 | - } |
|
473 | - $evaluation = $adminApi->commonSbProfileChecks($fed, $profile_id); |
|
474 | - if ($evaluation === FALSE) { |
|
475 | - exit(1); |
|
476 | - } |
|
477 | - list($idp, $profile) = $evaluation; |
|
478 | - $allUsers = $profile->listAllUsers(); |
|
479 | - // this is where they differ |
|
480 | - switch ($inputDecoded['ACTION']) { |
|
444 | + if ($cert !== NULL) { // we found a cert; verify it and extract userId |
|
445 | + if ($cert->status == \core\SilverbulletCertificate::CERTSTATUS_INVALID) { |
|
446 | + return $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "Certificate not found."); |
|
447 | + } |
|
448 | + if ($cert->profileId != $profile->identifier) { |
|
449 | + return $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "Certificate does not belong to this profile."); |
|
450 | + } |
|
451 | + $userId = $cert->userId; |
|
452 | + } |
|
453 | + if ($userId !== FALSE) { |
|
454 | + $userList = $profile->getUserById($userId); |
|
455 | + } |
|
456 | + if ($userName !== FALSE) { |
|
457 | + $userList = $profile->getUserByName($userName); |
|
458 | + } |
|
459 | + if (count($userList) === 1) { |
|
460 | + foreach ($userList as $oneUserId => $oneUserName) { |
|
461 | + return $adminApi->returnSuccess([web\lib\admin\API::AUXATTRIB_SB_USERNAME => $oneUserName, \web\lib\admin\API::AUXATTRIB_SB_USERID => $oneUserId]); |
|
462 | + } |
|
463 | + } |
|
464 | + $adminApi->returnError(\web\lib\admin\API::ERROR_INVALID_PARAMETER, "No matching user found in this profile."); |
|
465 | + break; |
|
466 | + case \web\lib\admin\API::ACTION_ENDUSER_LIST: |
|
467 | + // fall-through: those two are similar |
|
468 | + case \web\lib\admin\API::ACTION_TOKEN_LIST: |
|
469 | + $profile_id = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_PROFILE_ID); |
|
470 | + if ($profile_id === FALSE) { |
|
471 | + exit(1); |
|
472 | + } |
|
473 | + $evaluation = $adminApi->commonSbProfileChecks($fed, $profile_id); |
|
474 | + if ($evaluation === FALSE) { |
|
475 | + exit(1); |
|
476 | + } |
|
477 | + list($idp, $profile) = $evaluation; |
|
478 | + $allUsers = $profile->listAllUsers(); |
|
479 | + // this is where they differ |
|
480 | + switch ($inputDecoded['ACTION']) { |
|
481 | 481 | case \web\lib\admin\API::ACTION_ENDUSER_LIST: |
482 | 482 | $adminApi->returnSuccess($allUsers); |
483 | 483 | break; |
@@ -496,123 +496,123 @@ discard block |
||
496 | 496 | $infoSet[$oneTokenObject->userId] = [\web\lib\admin\API::AUXATTRIB_TOKEN => $oneTokenObject->invitationTokenString, "STATUS" => $oneTokenObject->invitationTokenStatus]; |
497 | 497 | } |
498 | 498 | $adminApi->returnSuccess($infoSet); |
499 | - } |
|
500 | - break; |
|
501 | - case \web\lib\admin\API::ACTION_TOKEN_REVOKE: |
|
502 | - $tokenRaw = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_TOKEN); |
|
503 | - if ($tokenRaw === FALSE) { |
|
504 | - exit(1); |
|
505 | - } |
|
506 | - $token = new core\SilverbulletInvitation($tokenRaw); |
|
507 | - if ($token->invitationTokenStatus !== core\SilverbulletInvitation::SB_TOKENSTATUS_VALID && $token->invitationTokenStatus !== core\SilverbulletInvitation::SB_TOKENSTATUS_PARTIALLY_REDEEMED) { |
|
508 | - $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "This is not a currently valid token."); |
|
509 | - exit(1); |
|
510 | - } |
|
511 | - $token->revokeInvitation(); |
|
512 | - $adminApi->returnSuccess([]); |
|
513 | - break; |
|
514 | - case \web\lib\admin\API::ACTION_CERT_LIST: |
|
515 | - $prof_id = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_PROFILE_ID); |
|
516 | - $user_id = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_USERID); |
|
517 | - if ($prof_id === FALSE || !is_int($user_id)) { |
|
518 | - exit(1); |
|
519 | - } |
|
520 | - $evaluation = $adminApi->commonSbProfileChecks($fed, $prof_id); |
|
521 | - if ($evaluation === FALSE) { |
|
522 | - exit(1); |
|
523 | - } |
|
524 | - list($idp, $profile) = $evaluation; |
|
525 | - $invitations = $profile->userStatus($user_id); |
|
526 | - // now pull out cert information from the object |
|
527 | - $certs = []; |
|
528 | - foreach ($invitations as $oneInvitation) { |
|
529 | - $certs = array_merge($certs, $oneInvitation->associatedCertificates); |
|
530 | - } |
|
531 | - // extract relevant subset of information from cert objects |
|
532 | - $certDetails = []; |
|
533 | - foreach ($certs as $cert) { |
|
534 | - $certDetails[$cert->ca_type . ":" . $cert->serial] = ["ISSUED" => $cert->issued, "EXPIRY" => $cert->expiry, "STATUS" => $cert->status, "DEVICE" => $cert->device, "CN" => $cert->username, "ANNOTATION" => $cert->annotation]; |
|
535 | - } |
|
536 | - $adminApi->returnSuccess($certDetails); |
|
537 | - break; |
|
538 | - case \web\lib\admin\API::ACTION_CERT_REVOKE: |
|
539 | - $prof_id = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_PROFILE_ID); |
|
540 | - if ($prof_id === FALSE) { |
|
541 | - exit(1); |
|
542 | - } |
|
543 | - $evaluation = $adminApi->commonSbProfileChecks($fed, $prof_id); |
|
544 | - if ($evaluation === FALSE) { |
|
545 | - exit(1); |
|
546 | - } |
|
547 | - list($idp, $profile) = $evaluation; |
|
548 | - // tear apart the serial |
|
549 | - $serialRaw = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_CERTSERIAL); |
|
550 | - if ($serialRaw === FALSE) { |
|
551 | - exit(1); |
|
552 | - } |
|
553 | - $serial = explode(":", $serialRaw); |
|
554 | - $cert = new \core\SilverbulletCertificate($serial[1], $serial[0]); |
|
555 | - if ($cert->status == \core\SilverbulletCertificate::CERTSTATUS_INVALID) { |
|
556 | - $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "Serial not found."); |
|
557 | - } |
|
558 | - if ($cert->profileId != $profile->identifier) { |
|
559 | - $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "Serial does not belong to this profile."); |
|
560 | - } |
|
561 | - $cert->revokeCertificate(); |
|
562 | - $adminApi->returnSuccess([]); |
|
499 | + } |
|
563 | 500 | break; |
564 | - case \web\lib\admin\API::ACTION_CERT_ANNOTATE: |
|
565 | - $prof_id = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_PROFILE_ID); |
|
566 | - if ($prof_id === FALSE) { |
|
567 | - exit(1); |
|
568 | - } |
|
569 | - $evaluation = $adminApi->commonSbProfileChecks($fed, $prof_id); |
|
570 | - if ($evaluation === FALSE) { |
|
571 | - exit(1); |
|
572 | - } |
|
573 | - list($idp, $profile) = $evaluation; |
|
574 | - // tear apart the serial |
|
575 | - $serialRaw = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_CERTSERIAL); |
|
576 | - if ($serialRaw === FALSE) { |
|
577 | - exit(1); |
|
578 | - } |
|
579 | - $serial = explode(":", $serialRaw); |
|
580 | - $cert = new \core\SilverbulletCertificate($serial[1], $serial[0]); |
|
581 | - if ($cert->status == \core\SilverbulletCertificate::CERTSTATUS_INVALID) { |
|
582 | - $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "Serial not found."); |
|
583 | - } |
|
584 | - if ($cert->profileId != $profile->identifier) { |
|
585 | - $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "Serial does not belong to this profile."); |
|
586 | - } |
|
587 | - $annotationRaw = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_CERTANNOTATION); |
|
588 | - if ($annotationRaw === FALSE) { |
|
589 | - $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "Unable to extract annotation."); |
|
501 | + case \web\lib\admin\API::ACTION_TOKEN_REVOKE: |
|
502 | + $tokenRaw = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_TOKEN); |
|
503 | + if ($tokenRaw === FALSE) { |
|
504 | + exit(1); |
|
505 | + } |
|
506 | + $token = new core\SilverbulletInvitation($tokenRaw); |
|
507 | + if ($token->invitationTokenStatus !== core\SilverbulletInvitation::SB_TOKENSTATUS_VALID && $token->invitationTokenStatus !== core\SilverbulletInvitation::SB_TOKENSTATUS_PARTIALLY_REDEEMED) { |
|
508 | + $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "This is not a currently valid token."); |
|
509 | + exit(1); |
|
510 | + } |
|
511 | + $token->revokeInvitation(); |
|
512 | + $adminApi->returnSuccess([]); |
|
590 | 513 | break; |
591 | - } |
|
592 | - $annotation = json_decode($annotationRaw, TRUE); |
|
593 | - $cert->annotate($annotation); |
|
594 | - $adminApi->returnSuccess([]); |
|
595 | - |
|
596 | - break; |
|
597 | - case web\lib\admin\API::ACTION_STATISTICS_INST: |
|
598 | - $retArray = []; |
|
599 | - $idpIdentifier = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_INST_ID); |
|
600 | - if ($idpIdentifier === FALSE) { |
|
601 | - throw new Exception("A required parameter is missing, and this wasn't caught earlier?!"); |
|
602 | - } else { |
|
603 | - try { |
|
604 | - $thisIdP = $validator->existingIdP($idpIdentifier, NULL, $fed); |
|
605 | - } catch (Exception $e) { |
|
606 | - $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "IdP identifier does not exist!"); |
|
514 | + case \web\lib\admin\API::ACTION_CERT_LIST: |
|
515 | + $prof_id = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_PROFILE_ID); |
|
516 | + $user_id = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_USERID); |
|
517 | + if ($prof_id === FALSE || !is_int($user_id)) { |
|
607 | 518 | exit(1); |
608 | 519 | } |
609 | - $retArray[$idpIdentifier] = []; |
|
610 | - foreach ($thisIdP->listProfiles() as $oneProfile) { |
|
611 | - $retArray[$idpIdentifier][$oneProfile->identifier] = $oneProfile->getUserDownloadStats(); |
|
520 | + $evaluation = $adminApi->commonSbProfileChecks($fed, $prof_id); |
|
521 | + if ($evaluation === FALSE) { |
|
522 | + exit(1); |
|
612 | 523 | } |
613 | - } |
|
614 | - $adminApi->returnSuccess($retArray); |
|
615 | - break; |
|
616 | - default: |
|
617 | - $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_ACTION, "Not implemented yet."); |
|
524 | + list($idp, $profile) = $evaluation; |
|
525 | + $invitations = $profile->userStatus($user_id); |
|
526 | + // now pull out cert information from the object |
|
527 | + $certs = []; |
|
528 | + foreach ($invitations as $oneInvitation) { |
|
529 | + $certs = array_merge($certs, $oneInvitation->associatedCertificates); |
|
530 | + } |
|
531 | + // extract relevant subset of information from cert objects |
|
532 | + $certDetails = []; |
|
533 | + foreach ($certs as $cert) { |
|
534 | + $certDetails[$cert->ca_type . ":" . $cert->serial] = ["ISSUED" => $cert->issued, "EXPIRY" => $cert->expiry, "STATUS" => $cert->status, "DEVICE" => $cert->device, "CN" => $cert->username, "ANNOTATION" => $cert->annotation]; |
|
535 | + } |
|
536 | + $adminApi->returnSuccess($certDetails); |
|
537 | + break; |
|
538 | + case \web\lib\admin\API::ACTION_CERT_REVOKE: |
|
539 | + $prof_id = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_PROFILE_ID); |
|
540 | + if ($prof_id === FALSE) { |
|
541 | + exit(1); |
|
542 | + } |
|
543 | + $evaluation = $adminApi->commonSbProfileChecks($fed, $prof_id); |
|
544 | + if ($evaluation === FALSE) { |
|
545 | + exit(1); |
|
546 | + } |
|
547 | + list($idp, $profile) = $evaluation; |
|
548 | + // tear apart the serial |
|
549 | + $serialRaw = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_CERTSERIAL); |
|
550 | + if ($serialRaw === FALSE) { |
|
551 | + exit(1); |
|
552 | + } |
|
553 | + $serial = explode(":", $serialRaw); |
|
554 | + $cert = new \core\SilverbulletCertificate($serial[1], $serial[0]); |
|
555 | + if ($cert->status == \core\SilverbulletCertificate::CERTSTATUS_INVALID) { |
|
556 | + $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "Serial not found."); |
|
557 | + } |
|
558 | + if ($cert->profileId != $profile->identifier) { |
|
559 | + $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "Serial does not belong to this profile."); |
|
560 | + } |
|
561 | + $cert->revokeCertificate(); |
|
562 | + $adminApi->returnSuccess([]); |
|
563 | + break; |
|
564 | + case \web\lib\admin\API::ACTION_CERT_ANNOTATE: |
|
565 | + $prof_id = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_PROFILE_ID); |
|
566 | + if ($prof_id === FALSE) { |
|
567 | + exit(1); |
|
568 | + } |
|
569 | + $evaluation = $adminApi->commonSbProfileChecks($fed, $prof_id); |
|
570 | + if ($evaluation === FALSE) { |
|
571 | + exit(1); |
|
572 | + } |
|
573 | + list($idp, $profile) = $evaluation; |
|
574 | + // tear apart the serial |
|
575 | + $serialRaw = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_CERTSERIAL); |
|
576 | + if ($serialRaw === FALSE) { |
|
577 | + exit(1); |
|
578 | + } |
|
579 | + $serial = explode(":", $serialRaw); |
|
580 | + $cert = new \core\SilverbulletCertificate($serial[1], $serial[0]); |
|
581 | + if ($cert->status == \core\SilverbulletCertificate::CERTSTATUS_INVALID) { |
|
582 | + $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "Serial not found."); |
|
583 | + } |
|
584 | + if ($cert->profileId != $profile->identifier) { |
|
585 | + $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "Serial does not belong to this profile."); |
|
586 | + } |
|
587 | + $annotationRaw = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_SB_CERTANNOTATION); |
|
588 | + if ($annotationRaw === FALSE) { |
|
589 | + $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "Unable to extract annotation."); |
|
590 | + break; |
|
591 | + } |
|
592 | + $annotation = json_decode($annotationRaw, TRUE); |
|
593 | + $cert->annotate($annotation); |
|
594 | + $adminApi->returnSuccess([]); |
|
595 | + |
|
596 | + break; |
|
597 | + case web\lib\admin\API::ACTION_STATISTICS_INST: |
|
598 | + $retArray = []; |
|
599 | + $idpIdentifier = $adminApi->firstParameterInstance($scrubbedParameters, web\lib\admin\API::AUXATTRIB_CAT_INST_ID); |
|
600 | + if ($idpIdentifier === FALSE) { |
|
601 | + throw new Exception("A required parameter is missing, and this wasn't caught earlier?!"); |
|
602 | + } else { |
|
603 | + try { |
|
604 | + $thisIdP = $validator->existingIdP($idpIdentifier, NULL, $fed); |
|
605 | + } catch (Exception $e) { |
|
606 | + $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_PARAMETER, "IdP identifier does not exist!"); |
|
607 | + exit(1); |
|
608 | + } |
|
609 | + $retArray[$idpIdentifier] = []; |
|
610 | + foreach ($thisIdP->listProfiles() as $oneProfile) { |
|
611 | + $retArray[$idpIdentifier][$oneProfile->identifier] = $oneProfile->getUserDownloadStats(); |
|
612 | + } |
|
613 | + } |
|
614 | + $adminApi->returnSuccess($retArray); |
|
615 | + break; |
|
616 | + default: |
|
617 | + $adminApi->returnError(web\lib\admin\API::ERROR_INVALID_ACTION, "Not implemented yet."); |
|
618 | 618 | } |
619 | 619 | \ No newline at end of file |