Passed
Push — release_2_1 ( 81e271...fc59fc )
by Tomasz
12:32
created
web/admin/action_enrollment.php 1 patch
Switch Indentation   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -49,14 +49,14 @@
 block discarded – undo
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) {
Please login to merge, or discard this patch.
web/admin/inc/sendinvite.inc.php 1 patch
Switch Indentation   +87 added lines, -87 removed lines patch added patch discarded remove patch
@@ -98,98 +98,98 @@
 block discarded – undo
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!
Please login to merge, or discard this patch.
web/admin/edit_hotspot.php 1 patch
Switch Indentation   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -156,12 +156,12 @@
 block discarded – undo
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;
Please login to merge, or discard this patch.
web/admin/edit_profile_result.php 1 patch
Switch Indentation   +268 added lines, -268 removed lines patch added patch discarded remove patch
@@ -40,80 +40,80 @@  discard block
 block discarded – undo
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
 block discarded – undo
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
 }
Please login to merge, or discard this patch.
web/admin/API.php 1 patch
Switch Indentation   +412 added lines, -412 removed lines patch added patch discarded remove patch
@@ -84,149 +84,149 @@  discard block
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
Please login to merge, or discard this patch.