Project

General

Profile

Download (13.2 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/*
3
	$Id: system_groupmanager.php
4
*/
5
/* ====================================================================
6
 *	Copyright (c)  2004-2015  Electric Sheep Fencing, LLC. All rights reserved.
7
 *  Copyright (c)  2005 Paul Taylor <paultaylor@winn-dixie.com>
8
 *  Copyright (c)  2003-2005 Manuel Kasper <mk@neon1.net>
9
 *
10
 *	Redistribution and use in source and binary forms, with or without modification,
11
 *	are permitted provided that the following conditions are met:
12
 *
13
 *	1. Redistributions of source code must retain the above copyright notice,
14
 *		this list of conditions and the following disclaimer.
15
 *
16
 *	2. Redistributions in binary form must reproduce the above copyright
17
 *		notice, this list of conditions and the following disclaimer in
18
 *		the documentation and/or other materials provided with the
19
 *		distribution.
20
 *
21
 *	3. All advertising materials mentioning features or use of this software
22
 *		must display the following acknowledgment:
23
 *		"This product includes software developed by the pfSense Project
24
 *		 for use in the pfSense software distribution. (http://www.pfsense.org/).
25
 *
26
 *	4. The names "pfSense" and "pfSense Project" must not be used to
27
 *		 endorse or promote products derived from this software without
28
 *		 prior written permission. For written permission, please contact
29
 *		 coreteam@pfsense.org.
30
 *
31
 *	5. Products derived from this software may not be called "pfSense"
32
 *		nor may "pfSense" appear in their names without prior written
33
 *		permission of the Electric Sheep Fencing, LLC.
34
 *
35
 *	6. Redistributions of any form whatsoever must retain the following
36
 *		acknowledgment:
37
 *
38
 *	"This product includes software developed by the pfSense Project
39
 *	for use in the pfSense software distribution (http://www.pfsense.org/).
40
 *
41
 *	THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
42
 *	EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43
 *	IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
44
 *	PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE pfSense PROJECT OR
45
 *	ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
46
 *	SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
47
 *	NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
48
 *	LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49
 *	HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
50
 *	STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
51
 *	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
52
 *	OF THE POSSIBILITY OF SUCH DAMAGE.
53
 *
54
 *	====================================================================
55
 *
56
 */
57
/*
58
	pfSense_MODULE: auth
59
*/
60

    
61
##|+PRIV
62
##|*IDENT=page-system-groupmanager
63
##|*NAME=System: Group manager page
64
##|*DESCR=Allow access to the 'System: Group manager' page.
65
##|*MATCH=system_groupmanager.php*
66
##|-PRIV
67

    
68
require("guiconfig.inc");
69

    
70
$pgtitle = array(gettext("System"), gettext("Group manager"));
71

    
72
if (!is_array($config['system']['group'])) {
73
	$config['system']['group'] = array();
74
}
75

    
76
$a_group = &$config['system']['group'];
77

    
78
unset($id);
79
if (isset($_POST['groupid']) && is_numericint($_POST['groupid'])) {
80
	$id = $_POST['groupid'];
81
}
82

    
83
if (isset($_GET['groupid']) && is_numericint($_GET['groupid'])) {
84
	$id = $_GET['groupid'];
85
}
86

    
87
$act = (isset($_GET['act']) ? $_GET['act'] : '');
88

    
89
if ($act == "delgroup") {
90

    
91
	if (!isset($id) || !isset($_GET['groupname']) || !isset($a_group[$id]) || ($_GET['groupname'] != $a_group[$id]['name'])) {
92
		pfSenseHeader("system_groupmanager.php");
93
		exit;
94
	}
95

    
96
	conf_mount_rw();
97
	local_group_del($a_group[$id]);
98
	conf_mount_ro();
99
	$groupdeleted = $a_group[$id]['name'];
100
	unset($a_group[$id]);
101
	write_config();
102
	$savemsg = gettext("Group") . " {$groupdeleted} " .
103
		gettext("successfully deleted") . "<br />";
104
}
105

    
106
if ($act == "delpriv") {
107

    
108
	if (!isset($id) || !isset($a_group[$id])) {
109
		pfSenseHeader("system_groupmanager.php");
110
		exit;
111
	}
112

    
113
	$privdeleted = $priv_list[$a_group[$id]['priv'][$_POST['privid']]]['name'];
114
	unset($a_group[$id]['priv'][$_GET['privid']]);
115

    
116
	if (is_array($a_group[$id]['member'])) {
117
		foreach ($a_group[$id]['member'] as $uid) {
118
			$user = getUserEntryByUID($uid);
119
			if ($user) {
120
				local_user_set($user);
121
			}
122
		}
123
	}
124

    
125
	write_config();
126
	$act = "edit";
127
	$savemsg = gettext("Privilege") . " {$privdeleted} " .
128
		gettext("successfully deleted") . "<br />";
129
}
130

    
131
if ($act == "edit") {
132
	if (isset($id) && isset($a_group[$id])) {
133
		$pconfig['name'] = $a_group[$id]['name'];
134
		$pconfig['gid'] = $a_group[$id]['gid'];
135
		$pconfig['gtype'] = $a_group[$id]['scope'];
136
		$pconfig['description'] = $a_group[$id]['description'];
137
		$pconfig['members'] = $a_group[$id]['member'];
138
		$pconfig['priv'] = $a_group[$id]['priv'];
139
	}
140
}
141

    
142
if (isset($_GET['dellall_x'])) {
143

    
144
	$del_groups = $_GET['delete_check'];
145

    
146
	if (!empty($del_groups)) {
147
		foreach ($del_groups as $groupid) {
148
			if (isset($a_group[$groupid]) && $a_group[$groupid]['scope'] != "system") {
149
				conf_mount_rw();
150
				local_group_del($a_group[$groupid]);
151
				conf_mount_ro();
152
				unset($a_group[$groupid]);
153
			}
154
		}
155
		$savemsg = gettext("Selected groups removed successfully!");
156
		write_config($savemsg);
157
	}
158
}
159

    
160
if (isset($_POST['save'])) {
161
	unset($input_errors);
162
	$pconfig = $_POST;
163

    
164
	/* input validation */
165
	$reqdfields = explode(" ", "groupname");
166
	$reqdfieldsn = array(gettext("Group Name"));
167

    
168
	do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
169

    
170
	if (preg_match("/[^a-zA-Z0-9\.\-_ ]/", $_POST['groupname'])) {
171
		$input_errors[] = gettext("The group name contains invalid characters.");
172
	}
173

    
174
	if (strlen($_POST['groupname']) > 16) {
175
		$input_errors[] = gettext("The group name is longer than 16 characters.");
176
	}
177

    
178
	if (!$input_errors && !(isset($id) && $a_group[$id])) {
179
		/* make sure there are no dupes */
180
		foreach ($a_group as $group) {
181
			if ($group['name'] == $_POST['groupname']) {
182
				$input_errors[] = gettext("Another entry with the same group name already exists.");
183
				break;
184
			}
185
		}
186
	}
187

    
188
	if (!$input_errors) {
189
		$group = array();
190
		if (isset($id) && $a_group[$id]) {
191
			$group = $a_group[$id];
192
		}
193

    
194
		$group['name'] = $_POST['groupname'];
195
		$group['description'] = $_POST['description'];
196

    
197
		if (empty($_POST['members'])) {
198
			unset($group['member']);
199
		} else if ($group['gid'] != 1998) { // all group
200
			$group['member'] = $_POST['members'];
201
		}
202

    
203
		if (isset($id) && $a_group[$id]) {
204
			$a_group[$id] = $group;
205
		} else {
206
			$group['gid'] = $config['system']['nextgid']++;
207
			$a_group[] = $group;
208
		}
209

    
210
		conf_mount_rw();
211
		local_group_set($group);
212
		conf_mount_ro();
213

    
214
		/* Refresh users in this group since their privileges may have changed. */
215
		if (is_array($group['member'])) {
216
			$a_user = &$config['system']['user'];
217
			foreach ($a_user as & $user) {
218
				if (in_array($user['uid'], $group['member'])) {
219
					local_user_set($user);
220
				}
221
			}
222
		}
223

    
224
		write_config();
225

    
226
		header("Location: system_groupmanager.php");
227
		exit;
228
	}
229
}
230

    
231
function build_priv_table() {
232
	global $a_group, $id;
233

    
234
	$privhtml = '<div class="table-responsive">';
235
	$privhtml .=	'<table class="table table-striped table-hover table-condensed">';
236
	$privhtml .=		'<thead>';
237
	$privhtml .=			'<th>' . gettext('Name') . '</th>';
238
	$privhtml .=			'<th>' . gettext('Description') . '</th>';
239
	$privhtml .=		'</thead>';
240
	$privhtml .=		'<tbody>';
241

    
242
	foreach (get_user_privdesc($a_group[$id]) as $i => $priv) {
243
		$privhtml .=		'<tr>';
244
		$privhtml .=			'<td>' . htmlspecialchars($priv['name']) . '</td>';
245
		$privhtml .=			'<td>' . htmlspecialchars($priv['descr']) . '</td>';
246
		$privhtml .=		'</tr>';
247
	}
248

    
249
	$privhtml .=		'</tbody>';
250
	$privhtml .=	'</table>';
251
	$privhtml .= '</div>';
252

    
253
	$privhtml .= '<nav class="action-buttons">';
254
	$privhtml .=	'<a href="system_groupmanager_addprivs.php?groupid=' . $id . '" class="btn btn-success">' . gettext("Add") . '</a>';
255
	$privhtml .= '</nav>';
256

    
257
	return($privhtml);
258
}
259

    
260
include("head.inc");
261

    
262
if ($input_errors)
263
	print_input_errors($input_errors);
264
if ($savemsg)
265
	print_info_box($savemsg);
266

    
267
$tab_array = array();
268
$tab_array[] = array(gettext("Users"), false, "system_usermanager.php");
269
$tab_array[] = array(gettext("Groups"), true, "system_groupmanager.php");
270
$tab_array[] = array(gettext("Settings"), false, "system_usermanager_settings.php");
271
$tab_array[] = array(gettext("Servers"), false, "system_authservers.php");
272
display_top_tabs($tab_array);
273

    
274
if (!($_GET['act'] == "new" || $_GET['act'] == "edit"))
275
{
276
?>
277
	<div class="table-responsive">
278
		<table class="table table-striped table-hover">
279
			<thead>
280
				<tr>
281
					<th><?=gettext("Group name")?></th>
282
					<th><?=gettext("Description")?></th>
283
					<th><?=gettext("Member Count")?></th>
284
					<th><?=gettext("Actions")?></th>
285
				</tr>
286
			</thead>
287
			<tbody>
288
<?php
289
	foreach($a_group as $i => $group):
290
		if ($group["name"] == "all")
291
			$groupcount = count($config['system']['user']);
292
		else
293
			$groupcount = count($group['member']);
294
?>
295
				<tr>
296
					<td>
297
						<?=htmlspecialchars($group['name'])?>
298
					</td>
299
					<td>
300
						<?=htmlspecialchars($group['description'])?>
301
					</td>
302
					<td>
303
						<?=$groupcount?>
304
					</td>
305
					<td>
306
						<a class="fa fa-pencil" title="<?=gettext("Edit group"); ?>" href="?act=edit&amp;groupid=<?=$i?>"></a>
307
						<?php if($group['scope'] != "system"): ?>
308
							<a class="fa fa-trash"	title="<?=gettext("Delete group")?>" href="?act=delgroup&amp;groupid=<?=$i?>&amp;groupname=<?=$group['name']?>" onclick="return confirm('<?=gettext("Are you sure you want to delete this group?")?>')"></a>
309
						<?php endif;?>
310
					</td>
311
				</tr>
312
<?php
313
	endforeach;
314
?>
315
			</tbody>
316
		</table>
317
	</div>
318

    
319
	<nav class="action-buttons" style="margin-top: 10px;">
320
		<a href="?act=new" class="btn btn-success btn-sm">
321
			<i class="fa fa-plus" style="font-size:15px; vertical-align: middle; margin-right: 6px;"></i>
322
			<?=gettext("Add")?>
323
		</a>
324
	</nav>
325
<?php
326
	include('foot.inc');
327
	exit;
328
}
329

    
330
require_once('classes/Form.class.php');
331
$form = new Form;
332
$form->setAction('system_groupmanager.php?act=edit');
333
$form->addGlobal(new Form_Input(
334
	'groupid',
335
	null,
336
	'hidden',
337
	$id
338
));
339

    
340
if (isset($id) && $a_group[$id]){
341
	$form->addGlobal(new Form_Input(
342
		'id',
343
		null,
344
		'hidden',
345
		$id
346
	));
347

    
348
	$form->addGlobal(new Form_Input(
349
		'gid',
350
		null,
351
		'hidden',
352
		$pconfig['gid']
353
	));
354
}
355

    
356
$section = new Form_Section('Group properties');
357

    
358
if ($_GET['act'] != "new")
359
{
360
	$section->addInput(new Form_StaticText(
361
		'Defined by',
362
		strtoupper($pconfig['gtype'])
363
	));
364
}
365

    
366
$section->addInput($input = new Form_Input(
367
	'groupname',
368
	'Group name',
369
	'text',
370
	$pconfig['name']
371
));
372

    
373
if ($pconfig['gtype'] == "system")
374
	$input->setReadonly();
375

    
376
$section->addInput(new Form_Input(
377
	'description',
378
	'Description',
379
	'text',
380
	$pconfig['description']
381
))->setHelp('Group description, for your own information only');
382

    
383
$form->add($section);
384
if ($pconfig['gid'] != 1998) // all users group
385
{
386
	// ==== Group membership ==================================================
387
	$group = new Form_Group('Group membership');
388

    
389
	// Make a list of all the groups configured on the system, and a list of
390
	// those which this user is a member of
391
	$systemGroups = array();
392
	$usersGroups = array();
393

    
394
	foreach ($config['system']['user'] as $user) {
395
		if (is_array($pconfig['members']) && in_array($user['uid'], $pconfig['members']))
396
			$usersGroups[ $user['uid'] ] = $user['name'];	// Add it to the user's list
397
		else
398
			$systemGroups[ $user['uid'] ] = $user['name']; // Add it to the 'not a member of' list
399
	}
400

    
401
	$group->add(new Form_Select(
402
		'notmembers',
403
		null,
404
		array_combine((array)$pconfig['groups'], (array)$pconfig['groups']),
405
		$systemGroups,
406
		true
407
	))->setHelp('Not members');
408

    
409
	$group->add(new Form_Select(
410
		'members',
411
		null,
412
		array_combine((array)$pconfig['groups'], (array)$pconfig['groups']),
413
		$usersGroups,
414
		true
415
	))->setHelp('Members');
416

    
417
	$section->add($group);
418

    
419
	$group = new Form_Group('');
420

    
421
	$group->add(new Form_Button(
422
		'movetoenabled',
423
		'Move to "Members" >'
424
	))->removeClass('btn-primary')->addClass('btn-default btn-sm');
425

    
426
	$group->add(new Form_Button(
427
		'movetodisabled',
428
		'< Move to "Not members'
429
	))->removeClass('btn-primary')->addClass('btn-default btn-sm');
430

    
431
	$group->setHelp('Hold down CTRL (pc)/COMMAND (mac) key to select multiple items');
432
	$section->add($group);
433

    
434
}
435

    
436
if ($_GET['act'] != "new")
437
{
438
	$section = new Form_Section('Assigned Privileges');
439

    
440
	$section->addInput(new Form_StaticText(
441
		null,
442
		build_priv_table()
443
	));
444

    
445

    
446
	$form->add($section);
447
}
448

    
449
print $form;
450
?>
451
<script>
452
//<![CDATA[
453
events.push(function(){
454

    
455
	// Select every option in the specified multiselect
456
	function AllServers(id, selectAll) {
457
	   for (i = 0; i < id.length; i++)	   {
458
		   id.eq(i).prop('selected', selectAll);
459
	   }
460
	}
461

    
462
	// Move all selected options from one multiselect to another
463
	function moveOptions(From, To)	{
464
		var len = From.length;
465
		var option, value;
466

    
467
		if(len > 1) {
468
			for(i=0; i<len; i++) {
469
				if(From.eq(i).is(':selected')) {
470
					option = From.eq(i).val();
471
					value = From.eq(i).text();
472
					To.append(new Option(value, option));
473
					From.eq(i).remove();
474
				}
475
			}
476
		}
477
	}
478

    
479
	// Make buttons plain buttons, not submit
480
	$("#movetodisabled").prop('type','button');
481
	$("#movetoenabled").prop('type','button');
482

    
483

    
484
	// On click . .
485
	$("#movetodisabled").click(function() {
486
		moveOptions($('[name="members[]"] option'), $('[name="notmembers[]"]'));
487
	});
488

    
489
	$("#movetoenabled").click(function() {
490
		moveOptions($('[name="notmembers[]"] option'), $('[name="members[]"]'));
491
	});
492

    
493
	// On submit mark all the user's groups as "selected"
494
	$('form').submit(function(){
495
		AllServers($('[name="members[]"] option'), true);
496
	});
497
});
498
//]]>
499
</script>
500
<?php
501
include('foot.inc');
(206-206/234)