1
|
|
|
<?php |
2
|
|
|
/* |
3
|
|
|
* ***************************************************************************** |
4
|
|
|
* Contributions to this work were made on behalf of the GÉANT project, a |
5
|
|
|
* project that has received funding from the European Union’s Framework |
6
|
|
|
* Programme 7 under Grant Agreements No. 238875 (GN3) and No. 605243 (GN3plus), |
7
|
|
|
* Horizon 2020 research and innovation programme under Grant Agreements No. |
8
|
|
|
* 691567 (GN4-1) and No. 731122 (GN4-2). |
9
|
|
|
* On behalf of the aforementioned projects, GEANT Association is the sole owner |
10
|
|
|
* of the copyright in all material which was developed by a member of the GÉANT |
11
|
|
|
* project. GÉANT Vereniging (Association) is registered with the Chamber of |
12
|
|
|
* Commerce in Amsterdam with registration number 40535155 and operates in the |
13
|
|
|
* UK as a branch of GÉANT Vereniging. |
14
|
|
|
* |
15
|
|
|
* Registered office: Hoekenrode 3, 1102BR Amsterdam, The Netherlands. |
16
|
|
|
* UK branch address: City House, 126-130 Hills Road, Cambridge CB2 1PQ, UK |
17
|
|
|
* |
18
|
|
|
* License: see the web/copyright.inc.php file in the file structure or |
19
|
|
|
* <base_url>/copyright.php after deploying the software |
20
|
|
|
*/ |
21
|
|
|
|
22
|
|
|
/** |
23
|
|
|
* This page displays the dashboard overview of an entire IdP. |
24
|
|
|
* |
25
|
|
|
* @author Stefan Winter <[email protected]> |
26
|
|
|
*/ |
27
|
|
|
?> |
28
|
|
|
<?php |
29
|
|
|
require_once dirname(dirname(dirname(__FILE__))) . "/config/_config.php"; |
30
|
|
|
|
31
|
|
|
function displaySilverbulletPropertyWidget(&$theProfile, $readonly, &$uiElements) { |
32
|
|
|
?> |
33
|
|
|
<div style='padding-bottom:20px;'> |
34
|
|
|
<h2><?php echo $theProfile->name; ?></h2> |
35
|
|
|
<?php |
36
|
|
|
$maxusers = $theProfile->getAttributes("internal:silverbullet_maxusers"); |
37
|
|
|
$completeness = $theProfile->isEapTypeDefinitionComplete(new core\common\EAP(core\common\EAP::INTEGER_SILVERBULLET)); |
38
|
|
|
// do we have all info needed for showtime? particularly: support email |
39
|
|
|
if (is_array($completeness)) { |
40
|
|
|
?> |
41
|
|
|
<div class='notacceptable'> |
42
|
|
|
<?php echo _("Information needed!"); ?> |
43
|
|
|
<ul style='margin:1px'> |
44
|
|
|
<?php |
45
|
|
|
foreach ($completeness as $missing_attrib) { |
46
|
|
|
echo "<li>" . $uiElements->displayName($missing_attrib) . "</li>"; |
47
|
|
|
} |
48
|
|
|
?> |
49
|
|
|
</ul> |
50
|
|
|
</div> |
51
|
|
|
<?php |
52
|
|
|
} else { |
53
|
|
|
echo sprintf(_("You can create up to %d users."), $maxusers[0]['value']) . "<br/>" . sprintf(_("Their credentials will carry the name <strong>%s</strong>."), $theProfile->realm); |
54
|
|
|
} |
55
|
|
|
?> |
56
|
|
|
<br/> |
57
|
|
|
<br/> |
58
|
|
|
<?php |
59
|
|
|
if ($readonly === FALSE) { |
60
|
|
|
?> |
61
|
|
|
<form action='edit_silverbullet.php?inst_id=<?php echo $theProfile->institution; ?>&profile_id=<?php echo $theProfile->identifier; ?>' method='POST'> |
62
|
|
|
<button <?php echo ( is_array($completeness) ? "disabled" : "" ); ?> type='submit' name='sb_action' value='sb_edit'><?php echo _("Manage User Base"); ?></button> |
63
|
|
|
</form> |
64
|
|
|
<?php |
65
|
|
|
} |
66
|
|
|
?> |
67
|
|
|
</div> |
68
|
|
|
<?php |
69
|
|
|
} |
70
|
|
|
|
71
|
|
|
/** |
72
|
|
|
* display an infocard with overview data of a RADIUS profile |
73
|
|
|
* |
74
|
|
|
* @param \core\Profile $theProfile the profile we display |
75
|
|
|
* @param boolean $readonly are we in readonly mode? No edit buttons then... |
76
|
|
|
* @param \web\lib\admin\UIElements $uiElements some UI elements |
77
|
|
|
* @param string $editMode 'fullaccess', 'readonly' |
78
|
|
|
* @throws Exception |
79
|
|
|
*/ |
80
|
|
|
function displayRadiusPropertyWidget(&$theProfile, $readonly, &$uiElements, $editMode) { |
81
|
|
|
?> |
82
|
|
|
<div style='padding-bottom:20px;'> |
83
|
|
|
<?php $profile_name = $theProfile->name; ?> |
84
|
|
|
<div style='margin-bottom:10px; display:block;'> |
85
|
|
|
<h2 style='overflow:auto; display:inline; padding-bottom: 10px;'><?php printf(_("Profile: %s"), $profile_name); ?></h2> |
86
|
|
|
</div> |
87
|
|
|
<?php |
88
|
|
|
// see if there are any profile-level overrides |
89
|
|
|
$attribs = $theProfile->getAttributes(); |
90
|
|
|
// write things into a buffer; we need some function calls to determine |
91
|
|
|
// readiness - but want to display it before! |
92
|
|
|
$has_overrides = FALSE; |
93
|
|
|
foreach ($attribs as $attrib) { |
94
|
|
|
if ($attrib['level'] == \core\Options::LEVEL_PROFILE && !preg_match("/^(internal:|profile:name|profile:description|eap:)/", $attrib['name'])) { |
95
|
|
|
$has_overrides = TRUE; |
96
|
|
|
} |
97
|
|
|
} |
98
|
|
|
$buffer_eaptypediv = "<div style='margin-bottom:40px; float:left;'>" . _("<strong>EAP Types</strong> (in order of preference):") . "<br/>"; |
99
|
|
|
$typelist = $theProfile->getEapMethodsinOrderOfPreference(); |
100
|
|
|
$allcomplete = TRUE; |
101
|
|
|
foreach ($typelist as $eaptype) { |
102
|
|
|
$buffer_eaptypediv .= $eaptype->getPrintableRep(); |
103
|
|
|
$completeness = $theProfile->isEapTypeDefinitionComplete($eaptype); |
104
|
|
|
if ($completeness === true) { |
105
|
|
|
$buffer_eaptypediv .= " <div class='acceptable'>" . _("OK") . "</div>"; |
106
|
|
|
} else { |
107
|
|
|
$buffer_eaptypediv .= " <div class='notacceptable'>"; |
108
|
|
|
$buffer_eaptypediv .= _("Information needed!"); |
109
|
|
|
if (is_array($completeness)) { |
110
|
|
|
$buffer_eaptypediv .= "<ul style='margin:1px'>"; |
111
|
|
|
foreach ($completeness as $missing_attrib) { |
112
|
|
|
$buffer_eaptypediv .= "<li>" . $uiElements->displayName($missing_attrib) . "</li>"; |
113
|
|
|
} |
114
|
|
|
$buffer_eaptypediv .= "</ul>"; |
115
|
|
|
} |
116
|
|
|
$buffer_eaptypediv .= "</div>"; |
117
|
|
|
$allcomplete = FALSE; |
118
|
|
|
} |
119
|
|
|
$attribs = $theProfile->getAttributes(); |
120
|
|
|
$justOnce = FALSE; |
121
|
|
|
foreach ($attribs as $attrib) { |
122
|
|
|
if ($attrib['level'] == \core\Options::LEVEL_METHOD && !preg_match("/^internal:/", $attrib['name']) && !$justOnce) { |
123
|
|
|
$justOnce = TRUE; |
124
|
|
|
$buffer_eaptypediv .= "<img src='../resources/images/icons/Tabler/square-rounded-letter-e-blue.svg' alt='" . _("Options on EAP Method/Device level are in effect.") . "'>"; |
125
|
|
|
} |
126
|
|
|
} |
127
|
|
|
$buffer_eaptypediv .= "<br/>"; |
128
|
|
|
} |
129
|
|
|
$buffer_eaptypediv .= "</div>"; |
130
|
|
|
|
131
|
|
|
$buffer_headline = "<div style='float:right;padding-left:10px'>"; |
132
|
|
|
$readiness = $theProfile->readinessLevel(); |
133
|
|
|
if ($has_overrides) { |
134
|
|
|
$buffer_headline .= $uiElements->boxRemark("", _("Option override on profile level is in effect."), TRUE); |
135
|
|
|
} |
136
|
|
|
$buffer_headline .= "<br/>"; |
137
|
|
|
if (!$allcomplete) { |
138
|
|
|
$buffer_headline .= $uiElements->boxError("", _("The information in this profile is incomplete."), TRUE); |
139
|
|
|
} |
140
|
|
|
switch ($readiness) { |
141
|
|
|
case core\AbstractProfile::READINESS_LEVEL_SHOWTIME: |
142
|
|
|
$buffer_headline .= $uiElements->boxOkay("", _("This profile is shown on the user download interface."), TRUE); |
143
|
|
|
break; |
144
|
|
|
case core\AbstractProfile::READINESS_LEVEL_SUFFICIENTCONFIG: |
145
|
|
|
$buffer_headline .= $uiElements->boxWarning("", sprintf(_("This profile is NOT shown on the user download interface, even though we have enough information to show. To enable the profile, add the attribute \"%s\" and tick the corresponding box."), $uiElements->displayName("profile:production")), TRUE); |
146
|
|
|
} |
147
|
|
|
if ($theProfile->isRedirected()) { |
148
|
|
|
$iconData = $uiElements->iconData('PROFILES_REDIRECTED'); |
149
|
|
|
$iconData['text'] = _("Profile redirected"); |
150
|
|
|
$buffer_headline .= "<br/>" . $uiElements->catIcon(($iconData)); |
151
|
|
|
|
152
|
|
|
} |
153
|
|
|
|
154
|
|
|
$certStatus = $theProfile->certificateStatus(); |
155
|
|
|
switch ($certStatus) { |
156
|
|
|
case core\AbstractProfile::CERT_STATUS_OK: |
157
|
|
|
$iconData = $uiElements->iconData('CERT_STATUS_OK'); |
158
|
|
|
$buffer_headline .= "<br/>" . $uiElements->catIcon(($iconData)); |
159
|
|
|
break; |
160
|
|
|
case core\AbstractProfile::CERT_STATUS_WARN: |
161
|
|
|
$iconData = $uiElements->iconData('CERT_STATUS_WARN'); |
162
|
|
|
$buffer_headline .= "<br/>" . $uiElements->catIcon(($iconData)); |
163
|
|
|
break; |
164
|
|
|
case core\AbstractProfile::CERT_STATUS_ERROR: |
165
|
|
|
$iconData = $uiElements->iconData('CERT_STATUS_ERROR'); |
166
|
|
|
$buffer_headline .= "<br/>" . $uiElements->catIcon(($iconData)); |
167
|
|
|
break; |
168
|
|
|
} |
169
|
|
|
$buffer_headline .= "</div>"; |
170
|
|
|
|
171
|
|
|
echo $buffer_headline; |
172
|
|
|
echo $buffer_eaptypediv; |
173
|
|
|
|
174
|
|
|
$has_eaptypes = count($theProfile->getEapMethodsInOrderOfPreference(1)); |
175
|
|
|
$hasRealmArray = $theProfile->getAttributes("internal:realm"); |
176
|
|
|
$has_realm = $hasRealmArray[0]['value']; |
177
|
|
|
|
178
|
|
|
// our own base location, to give to diag URLs |
179
|
|
|
if (isset($_SERVER['HTTPS'])) { |
180
|
|
|
$link = 'https://'; |
181
|
|
|
} else { |
182
|
|
|
$link = 'http://'; |
183
|
|
|
} |
184
|
|
|
$link .= $_SERVER['SERVER_NAME']; |
185
|
|
|
?> |
186
|
|
|
<div class='profilemodulebuttons' style='float:right;'> |
187
|
|
|
<?php |
188
|
|
|
if (\config\Master::FUNCTIONALITY_LOCATIONS['DIAGNOSTICS'] !== NULL) { |
189
|
|
|
if (\config\Master::FUNCTIONALITY_LOCATIONS['DIAGNOSTICS'] == "LOCAL") { |
190
|
|
|
$diagUrl = "../diag/"; |
191
|
|
|
} else { |
192
|
|
|
$diagUrl = \config\Master::FUNCTIONALITY_LOCATIONS['DIAGNOSTICS'] . "/diag/"; |
193
|
|
|
} |
194
|
|
|
?> |
195
|
|
|
<form action='<?php echo $diagUrl . "action_realmcheck.php?inst_id=" . $theProfile->institution . "&profile_id=" . $theProfile->identifier ?>' method='post' accept-charset='UTF-8'> |
196
|
|
|
<input type='hidden' name='comefrom' value='<?php echo htmlspecialchars($link . $_SERVER['SCRIPT_NAME']); ?>'/> |
197
|
|
|
<button type='submit' name='profile_action' value='check' <?php echo ($has_realm ? "" : "disabled='disabled'"); ?> title='<?php echo _("The realm can only be checked if you configure the realm!"); ?>'> |
198
|
|
|
<?php echo _("Check realm reachability"); ?> |
199
|
|
|
</button> |
200
|
|
|
</form> |
201
|
|
|
<?php |
202
|
|
|
} |
203
|
|
|
?> |
204
|
|
|
<form action='overview_installers.php?inst_id=<?php echo $theProfile->institution; ?>&profile_id=<?php echo $theProfile->identifier; ?>' method='post' accept-charset='UTF-8'> |
205
|
|
|
<button type='submit' name='profile_action' value='check' <?php echo ($has_eaptypes ? "" : "disabled='disabled'"); ?> title='<?php echo _("You have not fully configured any supported EAP types!"); ?>'> |
206
|
|
|
<?php echo _("Installer Fine-Tuning and Download"); ?> |
207
|
|
|
</button> |
208
|
|
|
</form> |
209
|
|
|
</div> |
210
|
|
|
<div class='buttongroupprofilebox' style='clear:both; display: flex;'> |
211
|
|
|
<?php |
212
|
|
|
if ($editMode == 'readonly') { |
213
|
|
|
$editLabel = _("View"); |
214
|
|
|
} |
215
|
|
|
if ($editMode == 'fullaccess') { |
216
|
|
|
$editLabel = _("Edit"); |
217
|
|
|
} |
218
|
|
|
if ($readonly === FALSE) { ?> |
219
|
|
|
<div style='margin-right: 200px; display: ruby'> |
220
|
|
|
<form action='edit_profile.php?inst_id=<?php echo $theProfile->institution; ?>&profile_id=<?php echo $theProfile->identifier; ?>' method='post' accept-charset='UTF-8'> |
221
|
|
|
<hr/> |
222
|
|
|
<button type='submit' name='profile_action' value='edit'><?php echo $editLabel; ?></button> |
|
|
|
|
223
|
|
|
</form> |
224
|
|
|
<?php if ($editMode == 'fullaccess') { ?> |
225
|
|
|
<form action='edit_profile_result.php?inst_id=<?php echo $theProfile->institution; ?>&profile_id=<?php echo $theProfile->identifier; ?>' method='post' accept-charset='UTF-8'> |
226
|
|
|
<button class='delete' type='submit' name='submitbutton' value='<?php echo web\lib\common\FormElements::BUTTON_DELETE; ?>' onclick="return confirm('<?php echo sprintf(_("Do you really want to delete the profile %s?"), $profile_name); ?>')"> |
227
|
|
|
<?php echo _("Delete") ?> |
228
|
|
|
</button> |
229
|
|
|
</form> |
230
|
|
|
|
231
|
|
|
<form action='duplicate_profile.php?inst_id=<?php echo $theProfile->institution; ?>&profile_id=<?php echo $theProfile->identifier; ?>' method='post' accept-charset='UTF-8'> |
232
|
|
|
<button type='submit' name='profile_duplicate'> |
233
|
|
|
<?php echo _("Duplicate this profile"); ?> |
234
|
|
|
</button> |
235
|
|
|
</form> |
236
|
|
|
<?php } ?> |
237
|
|
|
</div> |
238
|
|
|
<?php |
239
|
|
|
} |
240
|
|
|
if ($readiness == core\AbstractProfile::READINESS_LEVEL_SHOWTIME) { |
241
|
|
|
?> |
242
|
|
|
<div style='display: flex;'> |
243
|
|
|
<?php |
244
|
|
|
$idpLevelUrl = $link . dirname(dirname($_SERVER['SCRIPT_NAME'])) . "?idp=" . $theProfile->institution; |
245
|
|
|
$displayurl = $idpLevelUrl . "&profile=" . $theProfile->identifier; |
246
|
|
|
$QRurl = $idpLevelUrl . "&profile=" . $theProfile->identifier; |
247
|
|
|
$qrCode = new \chillerlan\QRCode\QRCode(new \chillerlan\QRCode\QROptions([ |
248
|
|
|
'outputType' => \chillerlan\QRCode\QRCode::OUTPUT_IMAGE_PNG, |
249
|
|
|
'eccLevel' => \chillerlan\QRCode\QRCode::ECC_H, |
250
|
|
|
'scale' => web\lib\admin\UIElements::QRCODE_PIXELS_PER_SYMBOL, |
251
|
|
|
'imageBase64' => false, |
252
|
|
|
])); |
253
|
|
|
echo "<a href='$displayurl' style='white-space: nowrap; text-align: center;'>"; |
254
|
|
|
$rawQr = $qrCode->render($QRurl); |
255
|
|
|
if (empty($rawQr)) { |
256
|
|
|
throw new Exception("Something went seriously wrong during QR code generation!"); |
257
|
|
|
} |
258
|
|
|
$uri = "data:image/png;base64," . base64_encode($uiElements->pngInjectConsortiumLogo($rawQr, web\lib\admin\UIElements::QRCODE_PIXELS_PER_SYMBOL)); |
259
|
|
|
$size = getimagesize($uri); |
260
|
|
|
echo "<img width='" . ($size[0] / 4) . "' height='" . ($size[1] / 4) . "' src='$uri' alt='QR-code'/>"; |
261
|
|
|
|
262
|
|
|
//echo "<nobr>$displayurl</nobr></a>"; |
263
|
|
|
echo "<p>$displayurl</p></a>"; |
264
|
|
|
?> |
265
|
|
|
</div> |
266
|
|
|
<?php |
267
|
|
|
} |
268
|
|
|
?> |
269
|
|
|
</div> |
270
|
|
|
</div> |
271
|
|
|
<?php |
272
|
|
|
} |
273
|
|
|
|
274
|
|
|
/** |
275
|
|
|
* displays an infocard about a Managed SP deployment |
276
|
|
|
* |
277
|
|
|
* @param \core\DeploymentManaged $deploymentObject the deployment to work with |
278
|
|
|
* @throws Exception |
279
|
|
|
*/ |
280
|
|
|
function displayDeploymentPropertyWidget(&$deploymentObject) { |
281
|
|
|
// RADIUS status icons |
282
|
|
|
$radiusMessages = [ |
283
|
|
|
\core\AbstractDeployment::RADIUS_OK => ['icon' => '../resources/images/icons/Tabler/square-rounded-check-filled-green.svg', 'text' => _("Successfully set profile")], |
284
|
|
|
\core\AbstractDeployment::RADIUS_FAILURE => ['icon' => '../resources/images/icons/Tabler/square-rounded-x-filled-red.svg', 'text' => _("Some problem occurred during profile update")], |
285
|
|
|
]; |
286
|
|
|
|
287
|
|
|
$radius_status = array(); |
288
|
|
|
$radius_status[0] = $deploymentObject->radius_status_1; |
289
|
|
|
$radius_status[1] = $deploymentObject->radius_status_2; |
290
|
|
|
$retry = $deploymentObject->checkRADIUSHostandConfigDaemon(); |
291
|
|
|
if (is_array($retry)) { |
292
|
|
|
foreach ($retry as $id => $stat) { |
293
|
|
|
if ($stat) { |
294
|
|
|
$response = $deploymentObject->setRADIUSconfig($id, 1); |
|
|
|
|
295
|
|
|
} |
296
|
|
|
} |
297
|
|
|
} |
298
|
|
|
?> |
299
|
|
|
<div style='display: table-row_id;'> |
300
|
|
|
<div class='profilebox' style='display: table-cell;'> |
301
|
|
|
<h2><?php |
302
|
|
|
switch ($deploymentObject->consortium) { |
303
|
|
|
case "eduroam": |
304
|
|
|
$displayname = config\ConfAssistant::CONSORTIUM['name'] . " " . core\DeploymentManaged::PRODUCTNAME; |
305
|
|
|
break; |
306
|
|
|
case "OpenRoaming": |
307
|
|
|
$displayname = "OpenRoaming ANP"; |
308
|
|
|
break; |
309
|
|
|
default: |
310
|
|
|
throw new Exception("We are supposed to operate on a roaming consortium we don't know."); |
311
|
|
|
} |
312
|
|
|
echo $displayname . " (<span style='color:" . ( $deploymentObject->status == \core\AbstractDeployment::INACTIVE ? "red;'>" . _("inactive") : "green;'>" . _("active") ) . "</span>)"; |
313
|
|
|
?></h2> |
314
|
|
|
<table> |
315
|
|
|
<caption><?php echo _("Deployment Details"); ?></caption> |
316
|
|
|
<tr> |
317
|
|
|
<th class='wai-invisible' scope='col'><?php echo("Server IP addresses"); ?></th> |
318
|
|
|
<th class='wai-invisible' scope='col'><?php echo("Server Port label"); ?></th> |
319
|
|
|
<th class='wai-invisible' scope='col'><?php echo("Server Port value"); ?></th> |
320
|
|
|
<th class='wai-invisible' scope='col'><?php echo("Deployment Status"); ?></th> |
321
|
|
|
</tr> |
322
|
|
|
<tr> |
323
|
|
|
<td><strong><?php echo _("Your primary RADIUS server") ?></strong><br/> |
324
|
|
|
<?php |
325
|
|
|
if ($deploymentObject->host1_v4 !== NULL) { |
326
|
|
|
echo _("IPv4") . ": " . $deploymentObject->host1_v4; |
327
|
|
|
} |
328
|
|
|
if ($deploymentObject->host1_v4 !== NULL && $deploymentObject->host1_v6 !== NULL) { |
329
|
|
|
echo "<br/>"; |
330
|
|
|
} |
331
|
|
|
if ($deploymentObject->host1_v6 !== NULL) { |
332
|
|
|
echo _("IPv6") . ": " . $deploymentObject->host1_v6; |
333
|
|
|
} |
334
|
|
|
?> |
335
|
|
|
</td> |
336
|
|
|
<td><?php echo _("RADIUS port number: ") ?></td> |
337
|
|
|
<td><?php echo $deploymentObject->port1; ?></td> |
338
|
|
|
<td> |
339
|
|
|
<?php |
340
|
|
|
echo "<img src='" . $radiusMessages[$deploymentObject->radius_status_1]['icon'] . |
341
|
|
|
"' alt='" . $radiusMessages[$deploymentObject->radius_status_1]['text'] . |
342
|
|
|
"' title='" . $radiusMessages[$deploymentObject->radius_status_1]['text'] . "' class='cat-icon'>"; |
343
|
|
|
?> |
344
|
|
|
</td> |
345
|
|
|
</tr> |
346
|
|
|
<tr> |
347
|
|
|
<td><strong><?php echo _("Your backup RADIUS server") ?><br/></strong> |
348
|
|
|
<?php |
349
|
|
|
if ($deploymentObject->host2_v4 !== NULL) { |
350
|
|
|
echo _("IPv4") . ": " . $deploymentObject->host2_v4; |
351
|
|
|
} |
352
|
|
|
if ($deploymentObject->host2_v4 !== NULL && $deploymentObject->host2_v6 !== NULL) { |
353
|
|
|
echo "<br/>"; |
354
|
|
|
} |
355
|
|
|
if ($deploymentObject->host2_v6 !== NULL) { |
356
|
|
|
echo _("IPv6") . ": " . $deploymentObject->host2_v6; |
357
|
|
|
} |
358
|
|
|
?></td> |
359
|
|
|
<td><?php echo _("RADIUS port number: ") ?></td> |
360
|
|
|
<td><?php echo $deploymentObject->port2; ?></td> |
361
|
|
|
<td> |
362
|
|
|
<?php |
363
|
|
|
echo "<img src='" . $radiusMessages[$deploymentObject->radius_status_2]['icon'] . |
364
|
|
|
"' alt='" . $radiusMessages[$deploymentObject->radius_status_2]['text'] . |
365
|
|
|
"' title='" . $radiusMessages[$deploymentObject->radius_status_2]['text'] . "' class='cat-icon'>"; |
366
|
|
|
?> |
367
|
|
|
</td> |
368
|
|
|
</tr> |
369
|
|
|
|
370
|
|
|
<tr> |
371
|
|
|
<td><strong><?php echo _("RADIUS shared secret"); ?></strong></td> |
372
|
|
|
<td><?php echo $deploymentObject->secret; ?></td> |
373
|
|
|
</tr> |
374
|
|
|
<tr><td colspan="4"><hr></td></tr> |
375
|
|
|
<?php if ($opname = $deploymentObject->getAttributes("managedsp:operatorname")[0]['value'] ?? NULL) { ?> |
376
|
|
|
<tr> |
377
|
|
|
<td><strong><?php echo _("Custom Operator-Name"); ?></strong></td> |
378
|
|
|
<td><?php echo $opname; ?></td> |
379
|
|
|
</tr> |
380
|
|
|
<?php |
381
|
|
|
} |
382
|
|
|
if ($vlan = $deploymentObject->getAttributes("managedsp:vlan")[0]['value'] ?? NULL) { |
383
|
|
|
?> |
384
|
|
|
<tr> |
385
|
|
|
<td><strong><?php echo _("VLAN tag for own users"); ?></strong></td> |
386
|
|
|
<td><?php echo $vlan; ?></td> |
387
|
|
|
</tr> |
388
|
|
|
<?php } ?> |
389
|
|
|
<?php |
390
|
|
|
$allRealms = array_values(array_unique(array_column($deploymentObject->getAttributes("managedsp:realmforvlan"), "value"))); |
391
|
|
|
if (!empty($allRealms)) { |
392
|
|
|
?> |
393
|
|
|
<tr> |
394
|
|
|
<td><strong><?php echo _("Realm to be considered own users"); ?></strong></td> |
395
|
|
|
<td><?php echo implode(', ', $allRealms); ?></td> |
396
|
|
|
</tr> |
397
|
|
|
<?php |
398
|
|
|
} |
399
|
|
|
?> |
400
|
|
|
</table> |
401
|
|
|
<div class='buttongroupprofilebox' style='clear:both;'> |
402
|
|
|
<form action='edit_hotspot.php?inst_id=<?php echo $deploymentObject->institution; ?>&deployment_id=<?php echo $deploymentObject->identifier; ?>' method='post' accept-charset='UTF-8'> |
403
|
|
|
<br/> |
404
|
|
|
<button type='submit' name='profile_action' style='cursor:pointer;' value='edit'><?php echo _("Advanced Configuration"); ?></button> |
405
|
|
|
</form> |
406
|
|
|
<?php if ($deploymentObject->status == \core\AbstractDeployment::ACTIVE) { ?> |
407
|
|
|
<form action='edit_hotspot.php?inst_id=<?php echo $deploymentObject->institution; ?>&deployment_id=<?php echo $deploymentObject->identifier; ?>' method='post' accept-charset='UTF-8'> |
408
|
|
|
<button class='delete' type='submit' style='cursor:pointer;' name='submitbutton' value='<?php echo web\lib\common\FormElements::BUTTON_DELETE; ?>' onclick="return confirm('<?php printf(_("Do you really want to deactivate the %s deployment?"), core\DeploymentManaged::PRODUCTNAME); ?>')"> |
409
|
|
|
<?php echo _("Deactivate"); ?> |
410
|
|
|
</button> |
411
|
|
|
<?php |
412
|
|
|
if (isset($_GET['res']) && is_array($_GET['res'])) { |
413
|
|
|
$res = array_count_values($_GET['res']); |
414
|
|
|
if (array_key_exists('FAILURE', $res) && $res['FAILURE'] > 0) { |
415
|
|
|
echo '<br>'; |
416
|
|
|
if ($res['FAILURE'] == 2) { |
417
|
|
|
echo ' <span style="color: red;">' . _("Activation failure.") . '</span>'; |
418
|
|
|
} else { |
419
|
|
|
if (isset($_GET['res'][1]) && $_GET['res']['1'] == 'FAILURE') { |
420
|
|
|
echo ' <span style="color: red;">' . _("Activation failure for your primary RADIUS server.") . '</span>'; |
421
|
|
|
} else { |
422
|
|
|
echo ' <span style="color: red;">' . _("Activation failure for your backup RADIUS server.") . '</span>'; |
423
|
|
|
} |
424
|
|
|
} |
425
|
|
|
} |
426
|
|
|
} |
427
|
|
|
?> |
428
|
|
|
</form> |
429
|
|
|
<?php |
430
|
|
|
} elseif (count($deploymentObject->getAttributes("hiddenmanagedsp:tou_accepted")) == 0) { |
431
|
|
|
?> |
432
|
|
|
<form action='edit_hotspot.php?inst_id=<?php echo $deploymentObject->institution; ?>&deployment_id=<?php echo $deploymentObject->identifier; ?>' method='post' accept-charset='UTF-8'> |
433
|
|
|
<button class='delete' style='background-color: yellow; color: black;' type='submit' name='submitbutton' value='<?php echo web\lib\common\FormElements::BUTTON_TERMSOFUSE_NEEDACCEPTANCE; ?>'> |
434
|
|
|
<?php echo _("Accept Terms of Use"); ?> |
435
|
|
|
</button> |
436
|
|
|
</form> |
437
|
|
|
<div align="right"> |
438
|
|
|
<form action='edit_hotspot.php?inst_id=<?php echo $deploymentObject->institution; ?>&deployment_id=<?php echo $deploymentObject->identifier; ?>' method='post' accept-charset='UTF-8'> |
439
|
|
|
<button class='delete' style='background-color: yellow; color: black' type='submit' name='submitbutton' value='<?php echo web\lib\common\FormElements::BUTTON_REMOVESP; ?>' onclick="return confirm('<?php printf(_("Do you really want to remove this %s deployment?"), core\DeploymentManaged::PRODUCTNAME); ?>')"> |
440
|
|
|
<?php echo _("Remove deployment"); ?> |
441
|
|
|
</button> |
442
|
|
|
</form> |
443
|
|
|
</div> |
444
|
|
|
<?php |
445
|
|
|
} else { |
446
|
|
|
?> |
447
|
|
|
<form action='edit_hotspot.php?inst_id=<?php echo $deploymentObject->institution; ?>&deployment_id=<?php echo $deploymentObject->identifier; ?>' method='post' accept-charset='UTF-8'> |
448
|
|
|
<button class='delete' style='background-color: green;' type='submit' name='submitbutton' value='<?php echo web\lib\common\FormElements::BUTTON_ACTIVATE; ?>'> |
449
|
|
|
<?php echo _("Activate"); ?> |
450
|
|
|
</button> |
451
|
|
|
<?php |
452
|
|
|
if (isset($_GET['res']) && is_array($_GET['res'])) { |
453
|
|
|
$res = array_count_values($_GET['res']); |
454
|
|
|
if ($res['FAILURE'] > 0) { |
455
|
|
|
echo '<br>'; |
456
|
|
|
if ($res['FAILURE'] == 2) { |
457
|
|
|
echo ' <span style="color: red;">' . _("Failure during deactivation, your request is queued for handling") . '</span>'; |
458
|
|
|
} else { |
459
|
|
|
if (isset($_GET['res'][1]) && $_GET['res']['1'] == 'FAILURE') { |
460
|
|
|
echo ' <span style="color: red;">' . _("Deactivation failure for your primary RADIUS server, your request is queued.") . '</span>'; |
461
|
|
|
} else { |
462
|
|
|
echo ' <span style="color: red;">' . _("Deactivation failure for your backup RADIUS server, your request is queued.") . '</span>'; |
463
|
|
|
} |
464
|
|
|
} |
465
|
|
|
} |
466
|
|
|
} |
467
|
|
|
?> |
468
|
|
|
</form> |
469
|
|
|
<div align="right"> |
470
|
|
|
<form action='edit_hotspot.php?inst_id=<?php echo $deploymentObject->institution; ?>&deployment_id=<?php echo $deploymentObject->identifier; ?>' method='post' accept-charset='UTF-8'> |
471
|
|
|
<button class='delete' style='background-color: yellow; color: black' type='submit' name='submitbutton' value='<?php echo web\lib\common\FormElements::BUTTON_REMOVESP; ?>' onclick="return confirm('<?php printf(_("Do you really want to remove this %s deployment?"), core\DeploymentManaged::PRODUCTNAME); ?>')"> |
472
|
|
|
<?php echo _("Remove deployment"); ?> |
473
|
|
|
</button> |
474
|
|
|
</form> |
475
|
|
|
</div> |
476
|
|
|
<?php |
477
|
|
|
} |
478
|
|
|
?> |
479
|
|
|
</div> |
480
|
|
|
</div> |
481
|
|
|
<div style='width:20px;'></div> <!-- QR code space, reserved --> |
482
|
|
|
<div style='display: table-cell; min-width:200px;'> |
483
|
|
|
<?php $tablecaption = _("Hotspot Usage Statistics");?> |
484
|
|
|
<h1><?php echo $tablecaption; ?></h1> |
485
|
|
|
<h2><?php echo _("5 most recent authentications");?></h2> |
486
|
|
|
<p><?php echo _("(AP Identifier is a /-separated tuple of NAS-Identifier/NAS-IP-Address/NAS-IPv6-Address/Called-Station-Id)");?></p> |
487
|
|
|
<table class='authrecord'> |
488
|
|
|
<caption><?php echo $tablecaption;?></caption> |
489
|
|
|
<tr style='text-align: left;'> |
490
|
|
|
<th scope="col"><strong><?php echo _("Timestamp (UTC)");?></strong></th> |
491
|
|
|
<th scope="col"><strong><?php echo _("Realm");?></strong></th> |
492
|
|
|
<th scope="col"><strong><?php echo _("MAC Address");?></strong></th> |
493
|
|
|
<th scope="col"><strong><?php echo _("Chargeable-User-Identity");?></strong></th> |
494
|
|
|
<th scope="col"><strong><?php echo _("Result");?></strong></th> |
495
|
|
|
<th scope="col"><strong><?php echo _("AP Identifier");?></strong></th> |
496
|
|
|
</tr> |
497
|
|
|
<?php |
498
|
|
|
$userAuthData = $deploymentObject->retrieveStatistics(0,5); |
499
|
|
|
foreach ($userAuthData as $oneRecord) { |
500
|
|
|
echo "<tr class='".($oneRecord['result'] == "OK" ? "auth-success" : "auth-fail" )."'>" |
501
|
|
|
. "<td>".$oneRecord['activity_time']."</td>" |
502
|
|
|
. "<td>".$oneRecord['realm']."</td>" |
503
|
|
|
. "<td>".$oneRecord['mac']."</td>" |
504
|
|
|
. "<td>".$oneRecord['cui']."</td>" |
505
|
|
|
. "<td>".($oneRecord['result'] == "OK" ? _("Success") : _("Failure"))."</td>" |
506
|
|
|
. "<td>".$oneRecord['ap_id']."</td>" |
507
|
|
|
. "</tr>"; |
508
|
|
|
} |
509
|
|
|
?> |
510
|
|
|
</table> |
511
|
|
|
<div style='display: ruby;'><form action="inc/deploymentStats.inc.php?inst_id=<?php echo $deploymentObject->institution; ?>&deployment_id=<?php echo $deploymentObject->identifier; ?>" onsubmit='popupRedirectWindow(this); return false;' accept-charset='UTF-8' method='post'> |
512
|
|
|
<button type='submit' id='stats-hour' name='stats' value='HOUR'><?php echo _("Last hour"); ?></button> |
513
|
|
|
</form> |
514
|
|
|
<form action="inc/deploymentStats.inc.php?inst_id=<?php echo $deploymentObject->institution; ?>&deployment_id=<?php echo $deploymentObject->identifier; ?>" onsubmit='popupRedirectWindow(this); return false;' accept-charset='UTF-8' method='post'> |
515
|
|
|
<button type='submit' id='stats-month' name='stats' value='MONTH'><?php echo _("Last 30 days"); ?></button> |
516
|
|
|
</form> |
517
|
|
|
<form action="inc/deploymentStats.inc.php?inst_id=<?php echo $deploymentObject->institution; ?>&deployment_id=<?php echo $deploymentObject->identifier; ?>" onsubmit='popupRedirectWindow(this); return false;' accept-charset='UTF-8' method='post'> |
518
|
|
|
<button type='submit' id='stats-full' name='stats' value='FULL'><?php echo _("Last 6 months"); ?></button> |
519
|
|
|
</form> |
520
|
|
|
</div> |
521
|
|
|
</div><!-- statistics space --> |
522
|
|
|
</div> |
523
|
|
|
<!-- dummy div to keep a little distance--> |
524
|
|
|
<div style='height:20px'></div> |
525
|
|
|
<?php |
526
|
|
|
} |
527
|
|
|
|
528
|
|
|
/** |
529
|
|
|
* displays a eduroam DB entry for SPs. Not implemented yet. |
530
|
|
|
* |
531
|
|
|
* @param \core\DeploymentClassic $deploymentObject the deployment to work with |
532
|
|
|
*/ |
533
|
|
|
function displayClassicHotspotPropertyWidget($deploymentObject) { |
|
|
|
|
534
|
|
|
|
535
|
|
|
} |
536
|
|
|
|
537
|
|
|
$deco = new \web\lib\admin\PageDecoration(); |
538
|
|
|
$validator = new \web\lib\common\InputValidation(); |
539
|
|
|
$uiElements = new web\lib\admin\UIElements(); |
540
|
|
|
|
541
|
|
|
echo $deco->defaultPagePrelude(sprintf(_("%s: %s Dashboard"), \config\Master::APPEARANCE['productname'], $uiElements->nomenclatureParticipant)); |
542
|
|
|
require_once "inc/click_button_js.php"; |
543
|
|
|
|
544
|
|
|
// let's check if the inst handle actually exists in the DB |
545
|
|
|
[$my_inst, $editMode] = $validator->existingIdPInt($_GET['inst_id'], $_SESSION['user']); |
546
|
|
|
|
547
|
|
|
$myfed = new \core\Federation($my_inst->federation); |
548
|
|
|
|
549
|
|
|
// delete stored realm |
550
|
|
|
|
551
|
|
|
if (isset($_SESSION['check_realm'])) { |
552
|
|
|
unset($_SESSION['check_realm']); |
553
|
|
|
} |
554
|
|
|
$mapCode = web\lib\admin\AbstractMap::instance($my_inst, TRUE); |
555
|
|
|
echo $mapCode->htmlHeadCode(); |
556
|
|
|
?> |
557
|
|
|
<script src="js/XHR.js" type="text/javascript"></script> |
558
|
|
|
<script src="js/popup_redirect.js" type="text/javascript"></script> |
559
|
|
|
<script type="text/javascript" src="../external/jquery/jquery-ui.js"></script> |
560
|
|
|
<link rel="stylesheet" type="text/css" href="../external/jquery/jquery-ui.css" /> |
561
|
|
|
<script> |
562
|
|
|
$(document).ready(function() { |
563
|
|
|
$("img.cat-icon").tooltip(); |
564
|
|
|
}); |
565
|
|
|
</script> |
566
|
|
|
|
567
|
|
|
<body <?php echo $mapCode->bodyTagCode(); ?>> |
568
|
|
|
<?php |
569
|
|
|
echo $deco->productheader("ADMIN-PARTICIPANT"); |
570
|
|
|
|
571
|
|
|
// Sanity check complete. Show what we know about this IdP. |
572
|
|
|
$idpoptions = $my_inst->getAttributes(); |
573
|
|
|
if ($editMode == 'readonly') { |
574
|
|
|
$editLabel = _("View ..."); |
575
|
|
|
} |
576
|
|
|
if ($editMode == 'fullaccess') { |
577
|
|
|
$editLabel = _("Edit ..."); |
578
|
|
|
} |
579
|
|
|
?> |
580
|
|
|
<h1><?php echo sprintf(_("%s Overview"), $uiElements->nomenclatureParticipant); ?></h1> |
581
|
|
|
<hr/> |
582
|
|
|
<div> |
583
|
|
|
<h2 style='display: flex;'><?php echo sprintf(_("%s general settings"), $uiElements->nomenclatureParticipant); ?> |
584
|
|
|
<form action='edit_participant.php?inst_id=<?php echo $my_inst->identifier; ?>' method='post' accept-charset='UTF-8'> |
585
|
|
|
<button type='submit' name='submitbutton' value='<?php echo \web\lib\common\FormElements::BUTTON_EDIT; ?>'><?php echo $editLabel; ?></button> |
586
|
|
|
</form> |
587
|
|
|
</h2> |
588
|
|
|
<?php |
589
|
|
|
echo $uiElements->instLevelInfoBoxes($my_inst); |
590
|
|
|
?> |
591
|
|
|
<?php |
592
|
|
|
foreach ($idpoptions as $optionname => $optionvalue) { |
593
|
|
|
if ($optionvalue['name'] == "general:geo_coordinates") { |
594
|
|
|
echo '<div class="infobox">'; |
595
|
|
|
echo $mapCode->htmlShowtime(); |
596
|
|
|
echo '</div>'; |
597
|
|
|
break; |
598
|
|
|
} |
599
|
|
|
} |
600
|
|
|
?> |
601
|
|
|
|
602
|
|
|
</div> |
603
|
|
|
<hr/> |
604
|
|
|
<?php |
605
|
|
|
$readonly = \config\Master::DB['INST']['readonly']; |
606
|
|
|
if (preg_match("/IdP/", $my_inst->type)) { |
607
|
|
|
?> |
608
|
|
|
<h2 style='display: flex;'><?php printf(_("%s: %s Deployment Details"), $uiElements->nomenclatureParticipant, $uiElements->nomenclatureIdP); ?> |
609
|
|
|
<?php |
610
|
|
|
$profiles_for_this_idp = $my_inst->listProfiles(); |
611
|
|
|
if ($readonly === FALSE) { |
612
|
|
|
|
613
|
|
|
// the opportunity to add a new silverbullet profile is only shown if |
614
|
|
|
// a) there is no SB profile yet |
615
|
|
|
// b) federation wants this to happen |
616
|
|
|
// first find out if we already have SB profiles |
617
|
|
|
$sbProfileExists = FALSE; |
618
|
|
|
foreach ($profiles_for_this_idp as $profilecount => $profile_list) { |
619
|
|
|
switch (get_class($profile_list)) { |
620
|
|
|
case "core\ProfileSilverbullet": |
621
|
|
|
$sbProfileExists = TRUE; |
622
|
|
|
break; |
623
|
|
|
default: |
624
|
|
|
} |
625
|
|
|
} |
626
|
|
|
|
627
|
|
|
if (\config\Master::FUNCTIONALITY_LOCATIONS['CONFASSISTANT_SILVERBULLET'] == "LOCAL" && count($myfed->getAttributes("fed:silverbullet")) > 0 && $sbProfileExists === FALSE) { |
628
|
|
|
// the button is greyed out if there's no support email address configured... |
629
|
|
|
$hasMail = count($my_inst->getAttributes("support:email")); |
630
|
|
|
?> |
631
|
|
|
<form action='edit_silverbullet.php?inst_id=<?php echo $my_inst->identifier; ?>' method='post' accept-charset='UTF-8'> |
632
|
|
|
<button type='submit' <?php echo ($hasMail > 0 ? "" : "disabled"); ?> name='profile_action' value='new'> |
633
|
|
|
<?php echo sprintf(_("Add %s profile ..."), \core\ProfileSilverbullet::PRODUCTNAME); ?> |
634
|
|
|
</button> |
635
|
|
|
</form> |
636
|
|
|
<?php |
637
|
|
|
} |
638
|
|
|
?> |
639
|
|
|
|
640
|
|
|
<?php |
641
|
|
|
// adding a normal profile is always possible if we're configured for it |
642
|
|
|
if (\config\Master::FUNCTIONALITY_LOCATIONS['CONFASSISTANT_RADIUS'] == "LOCAL" && $editMode === 'fullaccess') { |
643
|
|
|
?> |
644
|
|
|
<form action='edit_profile.php?inst_id=<?php echo $my_inst->identifier; ?>' method='post' accept-charset='UTF-8'> |
645
|
|
|
<div> |
646
|
|
|
<button type='submit' name='profile_action' value='new'> |
647
|
|
|
<?php echo _("New RADIUS/EAP profile (manual setup) ..."); ?> |
648
|
|
|
</button> |
649
|
|
|
</div> |
650
|
|
|
</form> |
651
|
|
|
<form method='post' action='inc/profileAutodetectCA.inc.php?inst_id=<?php echo $my_inst->identifier; ?>' onsubmit='popupRedirectWindow(this); return false;' accept-charset='UTF-8'> |
652
|
|
|
<div> |
653
|
|
|
<button type='submit' name='profile_action' value='new'> |
654
|
|
|
<?php echo _("New RADIUS/EAP profile (autodetect server details) ..."); ?> |
655
|
|
|
</button> |
656
|
|
|
</div> |
657
|
|
|
</form> |
658
|
|
|
<?php |
659
|
|
|
} |
660
|
|
|
} |
661
|
|
|
?> |
662
|
|
|
</h2> |
663
|
|
|
<?php if(count($profiles_for_this_idp) > 1 && $readonly === FALSE && $editMode === 'fullaccess') { ?> |
664
|
|
|
<form method='post' action='sort_profiles.php?inst_id=<?php echo $my_inst->identifier; ?>' accept-charset='UTF-8'> |
665
|
|
|
<div> |
666
|
|
|
<button type='submit' name='profile_sorting'> |
667
|
|
|
<?php echo _("Change the order of profiles"); ?> |
668
|
|
|
</button> |
669
|
|
|
</div> |
670
|
|
|
</form> <p> |
671
|
|
|
<?php } |
672
|
|
|
if (count($profiles_for_this_idp) == 0) { // no profiles yet. |
673
|
|
|
printf(_("There are not yet any profiles for your %s."), $uiElements->nomenclatureIdP); |
674
|
|
|
} |
675
|
|
|
// if there is one profile and it is of type Silver Bullet, display a very |
676
|
|
|
// simple widget with just a "Manage" button |
677
|
|
|
foreach ($profiles_for_this_idp as $profilecount => $profile_list) { |
678
|
|
|
?> |
679
|
|
|
<div style='display: table-row_id; margin-bottom: 20px;'> |
680
|
|
|
<div class='profilebox' style='display: table-cell; min-width: 650px;'> |
681
|
|
|
<?php |
682
|
|
|
switch (get_class($profile_list)) { |
683
|
|
|
case "core\ProfileSilverbullet": |
684
|
|
|
displaySilverbulletPropertyWidget($profile_list, $readonly, $uiElements); |
685
|
|
|
break; |
686
|
|
|
case "core\ProfileRADIUS": |
687
|
|
|
displayRadiusPropertyWidget($profile_list, $readonly, $uiElements, $editMode); |
688
|
|
|
break; |
689
|
|
|
default: |
690
|
|
|
throw new Exception("We were asked to operate on something that is neither a RADIUS nor Silverbullet profile!"); |
691
|
|
|
} |
692
|
|
|
?> |
693
|
|
|
</div> |
694
|
|
|
<!-- dummy width to keep a little distance --> |
695
|
|
|
<div style='width:20px;'></div> |
696
|
|
|
<div style='display: table-cell; min-width:200px;'> |
697
|
|
|
<p> |
698
|
|
|
<strong><?php echo _("User Downloads"); ?></strong> |
699
|
|
|
</p> |
700
|
|
|
<table class="downloads"> |
701
|
|
|
<tr><td></td> |
702
|
|
|
<?php |
703
|
|
|
echo "<td>"._("global")."</td><td>"._("this month")."</td></tr>"; |
704
|
|
|
$stats = $profile_list->getUserDownloadStats(); |
705
|
|
|
foreach ($stats as $dev => $count) { |
706
|
|
|
echo "<tr><td><strong>$dev</strong></td><td>".$count['current']."</td><td>".$count['monthly']."</td></tr>"; |
707
|
|
|
} |
708
|
|
|
?> |
709
|
|
|
</table> |
710
|
|
|
</div> |
711
|
|
|
</div> |
712
|
|
|
<!-- dummy div to keep a little distance--> |
713
|
|
|
<div style='height:20px'></div> |
714
|
|
|
<?php |
715
|
|
|
} |
716
|
|
|
?> |
717
|
|
|
<hr/> |
718
|
|
|
<?php |
719
|
|
|
} |
720
|
|
|
if (\config\Master::FUNCTIONALITY_LOCATIONS['CONFASSISTANT_SILVERBULLET'] == "LOCAL" && count($myfed->getAttributes("fed:silverbullet")) > 0) { |
721
|
|
|
if (preg_match("/SP/", $my_inst->type)) { |
722
|
|
|
?> |
723
|
|
|
<h2 style='display: flex;'><?php printf(_("%s: %s Deployment Details"), $uiElements->nomenclatureParticipant, $uiElements->nomenclatureHotspot); ?> |
724
|
|
|
<?php |
725
|
|
|
if ($readonly === FALSE && $editMode === 'fullaccess') { |
726
|
|
|
if (\config\Master::FUNCTIONALITY_LOCATIONS['CONFASSISTANT_SILVERBULLET'] == "LOCAL" && count($myfed->getAttributes("fed:silverbullet")) > 0) { |
727
|
|
|
// the button is greyed out if there's no support email address configured... |
728
|
|
|
$hasMail = count($my_inst->getAttributes("support:email")); |
729
|
|
|
?> |
730
|
|
|
<form action='edit_hotspot.php?inst_id=<?php echo $my_inst->identifier; ?>' method='post' accept-charset='UTF-8'> |
731
|
|
|
<div> |
732
|
|
|
<input type="hidden" name="consortium" value="eduroam"/> |
733
|
|
|
<button type='submit' <?php echo ($hasMail > 0 ? "" : "disabled"); ?> name='profile_action' value='new'> |
734
|
|
|
<?php echo sprintf(_("Add %s deployment ..."), \config\ConfAssistant::CONSORTIUM['name'] . " " . \core\DeploymentManaged::PRODUCTNAME); ?> |
735
|
|
|
</button> |
736
|
|
|
<span style='color: red;'> |
737
|
|
|
<?php if ($hasMail == 0) { |
738
|
|
|
echo _("Helpdesk mail address is required but missing!"); |
739
|
|
|
} |
740
|
|
|
?> |
741
|
|
|
</span> |
742
|
|
|
</div> |
743
|
|
|
</form> |
744
|
|
|
|
745
|
|
|
<?php |
746
|
|
|
/* |
747
|
|
|
if (count($myfed->getAttributes("fed:openroaming")) > 0) { |
748
|
|
|
?> |
749
|
|
|
|
750
|
|
|
<form action='edit_hotspot.php?inst_id=<?php echo $my_inst->identifier; ?>' method='post' accept-charset='UTF-8'> |
751
|
|
|
<div> |
752
|
|
|
<input type="hidden" name="consortium" value="OpenRoaming"/> |
753
|
|
|
<button type='submit' <?php echo ($hasMail > 0 ? "" : "disabled"); ?> name='profile_action' value='new'> |
754
|
|
|
<?php echo sprintf(_("Add %s deployment ..."), "OpenRoaming ANP"); ?> |
755
|
|
|
</button> |
756
|
|
|
|
757
|
|
|
</div> |
758
|
|
|
</form> |
759
|
|
|
<?php |
760
|
|
|
} |
761
|
|
|
*/ |
762
|
|
|
} |
763
|
|
|
} |
764
|
|
|
?> |
765
|
|
|
</h2> |
766
|
|
|
<?php |
767
|
|
|
$hotspotProfiles = $my_inst->listDeployments(); |
768
|
|
|
if (count($hotspotProfiles) == 0) { // no profiles yet. |
769
|
|
|
echo sprintf(_("There are not yet any known deployments for your %s."), $uiElements->nomenclatureHotspot); |
770
|
|
|
} |
771
|
|
|
|
772
|
|
|
foreach ($hotspotProfiles as $counter => $deploymentObject) { |
773
|
|
|
switch (get_class($deploymentObject)) { |
774
|
|
|
case "core\DeploymentManaged": |
775
|
|
|
displayDeploymentPropertyWidget($deploymentObject); |
776
|
|
|
break; |
777
|
|
|
case "core\DeploymentClassic": |
778
|
|
|
displayClassicHotspotPropertyWidget($deploymentObject); |
779
|
|
|
break; |
780
|
|
|
default: |
781
|
|
|
throw new Exception("We were asked to operate on something that is neither a classic nor a Managed hotspot deployment!"); |
782
|
|
|
} |
783
|
|
|
} |
784
|
|
|
} |
785
|
|
|
} |
786
|
|
|
echo $deco->footer(); |
787
|
|
|
|
788
|
|
|
|