Project

General

Profile

Download (36.5 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/* $Id$ */
3
/*
4
    pkg_edit.php
5
    Copyright (C) 2004-2010 Scott Ullrich <sullrich@gmail.com>
6
    All rights reserved.
7

    
8
    Redistribution and use in source and binary forms, with or without
9
    modification, are permitted provided that the following conditions are met:
10

    
11
    1. Redistributions of source code must retain the above copyright notice,
12
       this list of conditions and the following disclaimer.
13

    
14
    2. Redistributions in binary form must reproduce the above copyright
15
       notice, this list of conditions and the following disclaimer in the
16
       documentation and/or other materials provided with the distribution.
17

    
18
    THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
19
    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
20
    AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
21
    AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
22
    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23
    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24
    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25
    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26
    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
    POSSIBILITY OF SUCH DAMAGE.
28
*/
29
/*
30
	pfSense_BUILDER_BINARIES:	/sbin/ifconfig
31
	pfSense_MODULE:	pkgs
32
*/
33

    
34
##|+PRIV
35
##|*IDENT=page-package-edit
36
##|*NAME=Package: Edit page
37
##|*DESCR=Allow access to the 'Package: Edit' page.
38
##|*MATCH=pkg_edit.php*
39
##|-PRIV
40

    
41
ini_set('max_execution_time', '0');
42

    
43
require("guiconfig.inc");
44
require_once("functions.inc");
45
require_once("filter.inc");
46
require_once("shaper.inc");
47
require_once("pkg-utils.inc");
48

    
49
/* dummy stubs needed by some code that was MFC'd */
50
function pfSenseHeader($location) { header("Location: " . $location); }
51

    
52
function gentitle_pkg($pgname) {
53
	global $pfSense_config;
54
	return $pfSense_config['system']['hostname'] . "." . $pfSense_config['system']['domain'] . " - " . $pgname;
55
}
56

    
57
$xml = htmlspecialchars($_GET['xml']);
58
if($_POST['xml']) $xml = htmlspecialchars($_POST['xml']);
59

    
60
if($xml == "") {
61
            print_info_box_np(gettext("ERROR: No package defined."));
62
            die;
63
} else {
64
            $pkg = parse_xml_config_pkg("/usr/local/pkg/" . $xml, "packagegui");
65
}
66

    
67
if($pkg['include_file'] <> "") {
68
	require_once($pkg['include_file']);
69
}
70

    
71
if (!isset($pkg['adddeleteeditpagefields']))
72
	$only_edit = true;
73
else
74
	$only_edit = false;
75

    
76
$package_name = $pkg['menu'][0]['name'];
77
$section      = $pkg['menu'][0]['section'];
78
$config_path  = $pkg['configpath'];
79
$name         = $pkg['name'];
80
$title        = $pkg['title'];
81
$pgtitle      = $title;
82

    
83
$id = $_GET['id'];
84
if (isset($_POST['id']))
85
	$id = htmlspecialchars($_POST['id']);
86

    
87
// Not posting?  Then user is editing a record. There must be a valid id
88
// when editing a record.
89
if(!$id && !$_POST)
90
	$id = "0";
91

    
92
if(!is_numeric($id)) {
93
	Header("Location: /");
94
	exit;
95
}
96

    
97
if($pkg['custom_php_global_functions'] <> "")
98
        eval($pkg['custom_php_global_functions']);
99

    
100
// grab the installedpackages->package_name section.
101
if(!is_array($config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config']))
102
	$config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config'] = array();
103

    
104
// If the first entry in the array is an empty <config/> tag, kill it.
105
if ((count($config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config']) > 0) 
106
	&& ($config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config'][0] == ""))
107
	array_shift($config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config']);
108

    
109
$a_pkg = &$config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config'];
110

    
111
if($_GET['savemsg'] <> "")
112
	$savemsg = htmlspecialchars($_GET['savemsg']);
113

    
114
if($pkg['custom_php_command_before_form'] <> "")
115
	eval($pkg['custom_php_command_before_form']);
116

    
117
if ($_POST) {
118
	conf_mount_rw();
119

    
120
	if($_POST['act'] == "del") {
121
		if($pkg['custom_delete_php_command']) {
122
		    if($pkg['custom_php_command_before_form'] <> "")
123
			    eval($pkg['custom_php_command_before_form']);
124
		    eval($pkg['custom_delete_php_command']);
125
		}
126
		write_config($pkg['delete_string']);
127
		// resync the configuration file code if defined.
128
		if($pkg['custom_php_resync_config_command'] <> "") {
129
			if($pkg['custom_php_command_before_form'] <> "")
130
				eval($pkg['custom_php_command_before_form']);
131
			eval($pkg['custom_php_resync_config_command']);
132
		}
133
	} else {
134
		if($pkg['custom_add_php_command']) {
135
			if($pkg['donotsave'] <> "" or $pkg['preoutput'] <> "") {
136
			?>
137

    
138
<?php include("head.inc"); ?>
139
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
140
<?php include("fbegin.inc"); ?>
141
<?php
142
			}
143
			if($pkg['preoutput']) echo "<pre>";
144
			eval($pkg['custom_add_php_command']);
145
			if($pkg['preoutput']) echo "</pre>";
146
		}
147
	}
148

    
149
	// donotsave is enabled.  lets simply exit.
150
	if($pkg['donotsave'] <> "") exit;
151

    
152
	$firstfield = "";
153
	$rows = 0;
154

    
155
	$input_errors = array();
156
	$reqfields = array();
157
	$reqfieldsn = array();
158
	foreach ($pkg['fields']['field'] as $field) {
159
		if (($field['type'] == 'input') && isset($field['required'])) {
160
			if($field['fieldname'])
161
				$reqfields[] = $field['fieldname'];
162
			if($field['fielddescr'])	
163
				$reqfieldsn[] = $field['fielddescr'];
164
		}
165
	}
166
	do_input_validation($_POST, $reqfields, $reqfieldsn, &$input_errors);
167

    
168
	if ($pkg['custom_php_validation_command'])
169
		eval($pkg['custom_php_validation_command']);
170

    
171
	// store values in xml configration file.
172
	if (!$input_errors) {
173
		$pkgarr = array();
174
		foreach ($pkg['fields']['field'] as $fields) {
175
			if($fields['type'] == "sorting")
176
				continue;
177
			if($fields['type'] == "listtopic")
178
				continue;
179
			if($fields['type'] == "rowhelper") {
180
				// save rowhelper items.
181
				for($x=0; $x<99; $x++) { // XXX: this really should be passed from the form.
182
				                         // XXX: this really is not helping embedded platforms.
183
					foreach($fields['rowhelper']['rowhelperfield'] as $rowhelperfield) {
184
						if($firstfield == "")  {
185
						  $firstfield = $rowhelperfield['fieldname'];
186
						} else {
187
						  if($firstfield == $rowhelperfield['fieldname']) $rows++;
188
						}
189
						$fieldname = str_replace("\\", "", $rowhelperfield['fieldname']);
190
						$comd = "\$value = \$_POST['" . $fieldname . $x . "'];";
191
						eval($comd);
192
						if($value <> "") {
193
							$comd = "\$pkgarr['row'][" . $x . "]['" . $fieldname . "'] = \"" . $value . "\";";
194
							//echo($comd . "<br>");
195
							eval($comd);
196
						}
197
					}
198
				}
199
			} else {
200
				$fieldname  = $fields['fieldname'];
201
				if ($fieldname == "interface_array") {
202
					$fieldvalue = $_POST[$fieldname];
203
				} elseif (is_array($_POST[$fieldname])) {
204
					$fieldvalue = implode(',', $_POST[$fieldname]);
205
				} else {
206
					$fieldvalue = trim($_POST[$fieldname]);
207
					if ($fields['encoding'] == 'base64')
208
						$fieldvalue = base64_encode($fieldvalue);
209
				}
210
				if($fieldname)
211
					$pkgarr[$fieldname] = $fieldvalue;
212
			}
213
		}
214

    
215
		if (isset($id) && $a_pkg[$id])
216
			$a_pkg[$id] = $pkgarr;
217
		else
218
			$a_pkg[] = $pkgarr;
219

    
220
		write_config($pkg['addedit_string']);
221
		// late running code
222
		if($pkg['custom_add_php_command_late'] <> "") {
223
		    eval($pkg['custom_add_php_command_late']);
224
		}
225

    
226
		if (isset($pkg['filter_rules_needed'])) 
227
			filter_configure();
228

    
229
		// resync the configuration file code if defined.
230
		if($pkg['custom_php_resync_config_command'] <> "") {
231
		    eval($pkg['custom_php_resync_config_command']);
232
		}
233

    
234
		parse_package_templates();
235

    
236
		/* if start_command is defined, restart w/ this */
237
		if($pkg['start_command'] <> "")
238
		    exec($pkg['start_command'] . ">/dev/null 2&>1");
239

    
240
		/* if restart_command is defined, restart w/ this */
241
		if($pkg['restart_command'] <> "")
242
		    exec($pkg['restart_command'] . ">/dev/null 2&>1");
243

    
244
		if($pkg['aftersaveredirect'] <> "") {
245
		    pfSenseHeader($pkg['aftersaveredirect']);
246
		} elseif(!$pkg['adddeleteeditpagefields']) {
247
		    pfSenseHeader("pkg_edit.php?xml={$xml}&id=0");
248
		} elseif(!$pkg['preoutput']) {
249
		    pfSenseHeader("pkg.php?xml=" . $xml);
250
		}
251
		conf_mount_ro();
252
		exit;
253
	} else {
254
		$get_from_post = true;
255
	}
256

    
257
	conf_mount_ro();
258
}
259

    
260
if($pkg['title'] <> "") {
261
	$edit = ($only_edit ? '' : ": " .  gettext("Edit"));
262
	$title = $pkg['title'] . $edit;
263
}
264
else
265
	$title = gettext("Package Editor");
266

    
267
$pgtitle = $title;
268
include("head.inc");
269

    
270
if ($pkg['custom_php_after_head_command'])
271
	eval($pkg['custom_php_after_head_command']);
272

    
273
?>
274

    
275
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
276
<?php if($pkg['fields']['field'] <> "") { ?>
277
<script language="JavaScript">
278
<!--
279

    
280
	window.onDomReady = DomReady;
281
	function DomReady(fn) {
282
		if(document.addEventListener) { //W3C
283
			document.addEventListener("DOMContentLoaded", fn, false);
284
		} else { // IE
285
			document.onreadystatechange = function(){readyState(fn)}
286
		}
287
	}
288
	function readyState(fn) {
289
		//dom is ready for interaction
290
		if(document.readyState == "complete") {
291
			fn();
292
		}
293
	}
294
								        
295
	window.onDomReady(enablechange);
296

    
297
function enablechange() {
298
<?php
299
foreach ($pkg['fields']['field'] as $field) {
300
	if (isset($field['enablefields']) or isset($field['checkenablefields'])) {
301
		echo "\tif (document.iform.elements[\"{$field['fieldname']}\"].checked == false) {\n";
302

    
303
		if (isset($field['enablefields'])) {
304
			foreach (explode(',', $field['enablefields']) as $enablefield) {
305
				echo "\t\tif(document.iform.elements[\"$enablefield\"]){\n";
306
				echo "\t\t\tdocument.iform.elements[\"$enablefield\"].disabled = 1;\n";
307
				echo "\t\t}else{\n";
308
				echo "\t\t\tdocument.iform.elements[\"$enablefield".'[]'."\"].disabled = 1;\n";
309
				echo "\t\t}\n";
310
			}
311
		}
312

    
313
		if (isset($field['checkenablefields'])) {
314
			foreach (explode(',', $field['checkenablefields']) as $checkenablefield) {
315
				echo "\t\tif(document.iform.elements[\"$checkenablefield\"]){\n";
316
				echo "\t\t\tdocument.iform.elements[\"$checkenablefield\"].checked = 0;\n";
317
				echo "\t\t}else{\n";
318
				echo "\t\t\tdocument.iform.elements[\"$checkenablefield".'[]'."\"].checked = 0;\n";
319
				echo "\t\t}\n";
320
			}
321
		}
322

    
323
		echo "\t}\n\telse {\n";
324

    
325
		if (isset($field['enablefields'])) {
326
			foreach (explode(',', $field['enablefields']) as $enablefield) {
327
				echo "\t\tif(document.iform.elements[\"$enablefield\"]){\n";
328
				echo "\t\t\tdocument.iform.elements[\"$enablefield\"].disabled = 0;\n";
329
				echo "\t\t}else{\n";
330
				echo "\t\t\tdocument.iform.elements[\"$enablefield".'[]'."\"].disabled = 0;\n";
331
				echo "\t\t}\n";
332
			}
333
		}
334

    
335
		if (isset($field['checkenablefields'])) {
336
			foreach(explode(',', $field['checkenablefields']) as $checkenablefield) {
337
				echo "\t\tif(document.iform.elements[\"$checkenablefield\"]){\n";
338
				echo "\t\t\tdocument.iform.elements[\"$checkenablefield\"].checked = 1;\n";
339
				echo "\t\t}else{\n";
340
				echo "\t\t\tdocument.iform.elements[\"$checkenablefield".'[]'."\"].checked = 1;\n";
341
				echo "\t\t}\n";
342
			}
343
		}
344

    
345
		echo "\t}\n";
346
	}
347
}
348
?>
349
}
350
//-->
351
</script>
352
<?php } ?>
353
<script type="text/javascript" language="javascript" src="/javascript/row_helper_dynamic.js">
354
</script>
355

    
356
<?php include("fbegin.inc"); ?>
357
<?php if (!empty($input_errors)) print_input_errors($input_errors); ?>
358
<form name="iform" action="pkg_edit.php" method="post">
359
<input type="hidden" name="xml" value="<?= $xml ?>">
360
<?php if ($savemsg) print_info_box($savemsg); ?>
361
<table width="100%" border="0" cellpadding="0" cellspacing="0">
362
<?php
363
if ($pkg['tabs'] <> "") {
364
	$tab_array = array();
365
	foreach($pkg['tabs']['tab'] as $tab) {
366
		if($tab['tab_level'])
367
			$tab_level = $tab['tab_level'];
368
		else
369
			$tab_level = 1;
370
		if(isset($tab['active'])) {
371
			$active = true;
372
		} else {
373
			$active = false;
374
		}
375
		if(isset($tab['no_drop_down']))
376
			$no_drop_down = true;
377
		$urltmp = "";
378
		if($tab['url'] <> "") $urltmp = $tab['url'];
379
		if($tab['xml'] <> "") $urltmp = "pkg_edit.php?xml=" . $tab['xml'];
380

    
381
 		$addresswithport = getenv("HTTP_HOST");
382
		$colonpos = strpos($addresswithport, ":");
383
		if ($colonpos !== False) {
384
			//my url is actually just the IP address of the pfsense box
385
			$myurl = substr($addresswithport, 0, $colonpos);
386
		} else {
387
			$myurl = $addresswithport;
388
		}
389
		// eval url so that above $myurl item can be processed if need be.
390
		$url = str_replace('$myurl', $myurl, $urltmp);
391

    
392
		$tab_array[$tab_level][] = array(
393
						$tab['text'],
394
						$active,
395
						$url
396
					);
397
    	}
398

    
399
	ksort($tab_array);
400
	foreach($tab_array as $tab) {
401
		echo '<tr><td>';
402
		display_top_tabs($tab, $no_drop_down);
403
		echo '</td></tr>';
404
	}
405
}
406
?>
407
<tr><td><div id="mainarea"><table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0">
408
<?php
409
	$cols = 0;
410
	$savevalue = gettext("Save");
411
	if($pkg['savetext'] <> "") $savevalue = $pkg['savetext'];
412
	/* If a package's XML has <advanced_options/> configured, then setup 
413
	 * the table rows for the fields that have <advancedfield/> set.
414
	 * These fields will be placed below other fields in a seprate area titled 'Advanced Features'.
415
	 * These advanced fields are not normally configured and generally left to default to 'default settings'.
416
	 */
417
	if ($pkg['advanced_options'] == "enabled") {
418
		$adv_enabled = true;
419
		$advanced .= "<td>&nbsp;</td>";
420
		$advanced .= "<tr><td colspan=\"2\" class=\"listtopic\">". gettext("Advanced features") . "<br/></td></tr>\n";
421
	}
422

    
423
	foreach ($pkg['fields']['field'] as $pkga) {
424
		if ($pkga['type'] == "sorting") 
425
			continue;
426

    
427
		if ($pkga['type'] == "listtopic") {
428
			if(isset($pkga['advancedfield']) && $adv_enabled) {
429
				$advanced .= "<td>&nbsp;</td>";
430
				$advanced .= "<tr><td colspan=\"2\" class=\"listtopic\">" . $pkga['name'] . "<br></td></tr>\n";
431
			} else {
432
				echo "<td>&nbsp;</td>";
433
				echo "<tr><td colspan=\"2\" class=\"listtopic\">" . $pkga['name'] . "<br></td></tr>\n";
434
			}
435
			continue;
436
		}	
437
	
438
		if(!$pkga['combinefieldsend']) {
439
			if(isset($pkga['advancedfield']) && $adv_enabled)
440
				$advanced .= "<tr valign=\"top\">";
441
			else
442
		  		echo "<tr valign=\"top\">";
443
		}
444

    
445
		$size = "";
446

    
447
		if(!$pkga['dontdisplayname']) {
448
			unset($req);
449
			if (isset($pkga['required']))
450
				$req = 'req';
451
			if(isset($pkga['advancedfield']) && $adv_enabled) {
452
				$advanced .= "<td width=\"22%\" class=\"vncell{$req}\">";
453
				$advanced .= fixup_string($pkga['fielddescr']);
454
				$advanced .= "</td>";
455
			} else {
456
				echo "<td width=\"22%\" class=\"vncell{$req}\">";
457
				echo fixup_string($pkga['fielddescr']);
458
				echo "</td>";
459
			}
460
		}
461

    
462
		if(!$pkga['dontcombinecells'])
463
			if(isset($pkga['advancedfield']) && $adv_enabled)
464
				$advanced .= "<td class=\"vtable\">";
465
			else
466
				echo "<td class=\"vtable\">";
467
		// if user is editing a record, load in the data.
468
		$fieldname = $pkga['fieldname'];
469
		if ($get_from_post) {
470
			$value = $_POST[$fieldname];
471
			if (is_array($value)) $value = implode(',', $value);
472
		} else {
473
			if (isset($id) && $a_pkg[$id])
474
				$value = $a_pkg[$id][$fieldname];
475
			else
476
				$value = $pkga['default_value'];
477
		}
478

    
479
		if($pkga['type'] == "input") {
480
			if($pkga['size']) $size = " size='" . $pkga['size'] . "' ";
481
			if(isset($pkga['advancedfield']) && $adv_enabled) {
482
				$js_array[] = $pkga['fieldname'];
483
				$advanced .= display_advanced_field($pkga['fieldname']);
484
				$advanced .= "<input " . $size . " id='" . $pkga['fieldname'] . "' name='" . $pkga['fieldname'] . "' class='formfld unknown' value='" . $value . "'>\n";
485
				$advanced .= "<br>" . fixup_string($pkga['description']) . "\n";
486
				$advanced .= "</div>\n";
487
			} else {
488
				echo "<input " . $size . " id='" . $pkga['fieldname'] . "' name='" . $pkga['fieldname'] . "' class='formfld unknown' value='" . $value . "'>\n";
489
				echo "<br>" . fixup_string($pkga['description']) . "\n";
490
			}
491
		} else if($pkga['type'] == "password") {
492
			if($pkga['size']) $size = " size='" . $pkga['size'] . "' ";		
493
			if(isset($pkga['advancedfield']) && $adv_enabled) {
494
				$js_array[] = $pkga['fieldname'];
495
				$advanced .= display_advanced_field($pkga['fieldname']);
496
				$advanced .= "<input " . $size . " id='" . $pkga['fieldname'] . "' type='password' " . $size . " name='" . $pkga['fieldname'] . "' class='formfld pwd' value='" . $value . "'>\n";
497
				$advanced .= "<br>" . fixup_string($pkga['description']) . "\n";
498
				$advanced .= "</div>\n";
499
			} else {
500
				echo "<input " . $size . " id='" . $pkga['fieldname'] . "' type='password' " . $size . " name='" . $pkga['fieldname'] . "' class='formfld pwd' value='" . $value . "'>\n";
501
				echo "<br>" . fixup_string($pkga['description']) . "\n";
502
			}
503
		} else if($pkga['type'] == "select") {
504
			$fieldname = $pkga['fieldname'];
505
			if (isset($pkga['multiple'])) {
506
      	$multiple = 'multiple="multiple"';
507
				$items = explode(',', $value);
508
				$fieldname .= "[]";
509
			} else {
510
				$multiple = '';
511
				$items = array($value);
512
			}
513
			$size = (isset($pkga['size']) ? "size=\"{$pkga['size']}\"" : '');
514
			$onchange = (isset($pkga['onchange']) ? "onchange=\"{$pkga['onchange']}\"" : '');
515

    
516
			if(isset($pkga['advancedfield']) && $adv_enabled) {
517
				$js_array[] = $pkga['fieldname'];
518
				$advanced .= display_advanced_field($pkga['fieldname']);
519
				$advanced .= "<select id='" . $pkga['fieldname'] . "' $multiple $size $onchange id=\"$fieldname\" name=\"$fieldname\">\n";
520
				foreach ($pkga['options']['option'] as $opt) {
521
					$selected = '';
522
					if (in_array($opt['value'], $items)) $selected = 'selected="selected"';
523
						$advanced .= "\t<option name=\"{$opt['name']}\" value=\"{$opt['value']}\" $selected>{$opt['name']}</option>\n";
524
				}
525
				$advanced .= "</select>\n<br />\n" . fixup_string($pkga['description']) . "\n";
526
				$advanced .= "</div>\n";
527
			} else {
528
				echo "<select id='" . $pkga['fieldname'] . "' $multiple $size $onchange id=\"$fieldname\" name=\"$fieldname\">\n";
529
				foreach ($pkga['options']['option'] as $opt) {
530
					$selected = '';
531
					if (in_array($opt['value'], $items)) $selected = 'selected="selected"';
532
					echo "\t<option name=\"{$opt['name']}\" value=\"{$opt['value']}\" $selected>{$opt['name']}</option>\n";
533
				}
534
				echo "</select>\n<br />\n" . fixup_string($pkga['description']) . "\n";
535
			}
536

    
537
		} else if($pkga['type'] == "select_source") {
538
			$fieldname = $pkga['fieldname'];
539
			if (isset($pkga['multiple'])) {
540
				$multiple = 'multiple="multiple"';
541
				$items = explode(',', $value);
542
				$fieldname .= "[]";
543
			} else {
544
				$multiple = '';
545
				$items = array($value);
546
			}
547
			$size = (isset($pkga['size']) ? "size=\"{$pkga['size']}\"" : '');
548
			$onchange = (isset($pkga['onchange']) ? "onchange=\"{$pkga['onchange']}\"" : '');
549

    
550
			if(isset($pkga['advancedfield']) && $adv_enabled) {
551
				$js_array[] = $pkga['fieldname'];
552
				$advanced .= display_advanced_field($pkga['fieldname']);
553
				$advanced .= "<select id='" . $pkga['fieldname'] . "' $multiple $size $onchange id=\"{$fieldname}\" name=\"{$fieldname}\">\n";
554
				$advanced .= "</div>\n";
555
			} else {
556
				echo "<select id='" . $pkga['fieldname'] . "' $multiple $size $onchange id=\"$fieldname\" name=\"$fieldname\">\n";
557
			}
558
			$source_url = $pkga['source'];
559
			eval("\$pkg_source_txt = &$source_url;");
560
			foreach ($pkg_source_txt as $opt) {
561
				$selected = '';
562
				if($pkga['source_name']) {
563
					$source_name = $opt[$pkga['source_name']];
564
				} else {
565
					$source_name = $opt[$pkga['name']];
566
				}
567
				if($pkga['source_value']) {
568
					$source_value = $opt[$pkga['source_value']];
569
				} else {
570
					$source_value = $opt[$pkga['value']];
571
				}
572
				if (in_array($source_value, $items)) $selected = 'selected="selected"';
573
					if(isset($pkga['advancedfield']) && $adv_enabled)
574
						$advanced .= "\t<option name=\"{$source_name}\" value=\"{$source_value}\" $selected>{$source_name}</option>\n";
575
					else
576
						echo "\t<option name=\"{$source_name}\" value=\"{$source_value}\" $selected>{$source_name}</option>\n";
577
			}
578

    
579
			if(isset($pkga['advancedfield']) && $adv_enabled)
580
				$advanced .= "</select>\n<br />\n" . fixup_string($pkga['description']) . "\n";
581
			else
582
				echo "</select>\n<br />\n" . fixup_string($pkga['description']) . "\n";		
583
		} else if($pkga['type'] == "vpn_selection") {
584
			if(isset($pkga['advancedfield']) && $adv_enabled) {
585
				$js_array[] = $pkga['fieldname'];
586
				$advanced .= display_advanced_field($pkga['fieldname']);
587
				$advanced .= "<select id='" . $pkga['fieldname'] . "' name='" . $vpn['name'] . "'>\n";
588
				foreach ($config['ipsec']['phase1'] as $vpn) {
589
					$advanced .= "\t<option value=\"" . $vpn['descr'] . "\">" . $vpn['descr'] . "</option>\n";
590
				}
591
				$advanced .= "</select>\n";
592
				$advanced .= "<br>" . fixup_string($pkga['description']) . "\n";
593
				$advanced .= "</div>\n";
594
			} else {
595
				echo "<select id='" . $pkga['fieldname'] . "' name='" . $vpn['name'] . "'>\n";
596
				foreach ($config['ipsec']['phase1'] as $vpn) {
597
					echo "\t<option value=\"" . $vpn['descr'] . "\">" . $vpn['descr'] . "</option>\n";
598
				}
599
				echo "</select>\n";
600
				echo "<br>" . fixup_string($pkga['description']) . "\n";
601
			}
602
		} else if($pkga['type'] == "checkbox") {
603
			$checkboxchecked = "";
604
			if($value == "on") $checkboxchecked = " CHECKED";
605
			if (isset($pkga['enablefields']) || isset($pkga['checkenablefields']))
606
				$onclick = ' onclick="javascript:enablechange();"';
607
			if(isset($pkga['advancedfield']) && $adv_enabled) {
608
				$js_array[] = $pkga['fieldname'];
609
				$advanced .= display_advanced_field($pkga['fieldname']);
610
				$advanced .= "<input id='" . $pkga['fieldname'] . "' type='checkbox' name='" . $pkga['fieldname'] . "'" . $checkboxchecked . $onclick . ">\n";
611
				$advanced .= "<br>" . fixup_string($pkga['description']) . "\n";
612
				$advanced .= "</div>\n";
613
			} else {
614
				echo "<input id='" . $pkga['fieldname'] . "' type='checkbox' name='" . $pkga['fieldname'] . "'" . $checkboxchecked . $onclick . ">\n";
615
				echo "<br>" . fixup_string($pkga['description']) . "\n";
616
			}
617
		} else if($pkga['type'] == "textarea") {
618
			if($pkga['rows']) $rows = " rows='" . $pkga['rows'] . "' ";
619
			if($pkga['cols']) $cols = " cols='" . $pkga['cols'] . "' ";
620
			if($pkga['wrap'] == "off") { $wrap = 'wrap="off" style="white-space:nowrap;"'; } else { $wrap = ''; }		  
621
			if (($pkga['encoding'] == 'base64') && !$get_from_post && !empty($value)) $value = base64_decode($value);
622
			if(isset($pkga['advancedfield']) && $adv_enabled) {
623
				$js_array[] = $pkga['fieldname'];
624
				$advanced .= display_advanced_field($pkga['fieldname']);
625
				$advanced .= "<textarea " . $rows . $cols . " name='" . $pkga['fieldname'] . "' ".$wrap.">" . $value . "</textarea>\n";
626
				$advanced .= "<br>" . fixup_string($pkga['description']) . "\n";
627
				$advanced .= "</div>\n";
628
			} else {
629
				echo "<textarea " . $rows . $cols . " name='" . $pkga['fieldname'] . "' ".$wrap.">" . $value . "</textarea>\n";
630
				echo "<br>" . fixup_string($pkga['description']) . "\n";
631
			}
632
		} else if($pkga['type'] == "interfaces_selection") {
633
			$size = ($pkga['size'] ? "size=\"{$pkga['size']}\"" : '');
634
			$multiple = '';
635
			$fieldname = $pkga['fieldname'];
636
			if (isset($pkga['multiple'])) {
637
				$fieldname .= '[]';
638
				$multiple = 'multiple';
639
			}
640
			if(isset($pkga['advancedfield']) && $adv_enabled) {
641
				$js_array[] = $pkga['fieldname'];
642
				$advanced .= display_advanced_field($pkga['fieldname']);
643
				$advanced .= "<select id='" . $pkga['fieldname'] . "' name=\"$fieldname\" $size $multiple>\n";
644
			} else {
645
				echo "<select id='" . $pkga['fieldname'] . "' name=\"$fieldname\" $size $multiple>\n";
646
			}
647
			$ifaces = get_configured_interface_with_descr();
648
			$additional_ifaces = $pkga['add_to_interfaces_selection'];
649
			if (!empty($additional_ifaces))
650
				$ifaces = array_merge($ifaces, explode(',', $additional_ifaces));
651
			if(is_array($value))
652
				$values = $value;
653
			else
654
				$values  =  explode(',',  $value);
655
			$ifaces["lo0"] = "loopback";
656
			foreach($ifaces as $ifname => $iface) {
657
				$selected = (in_array($ifname, $values) ? 'selected' : '');
658
				if(isset($pkga['advancedfield']) && $adv_enabled)
659
					$advanced .= "<option value=\"$ifname\" $selected>$iface</option>\n";
660
				else
661
					echo "<option value=\"$ifname\" $selected>$iface</option>\n";
662
			}
663
			if(isset($pkga['advancedfield']) && $adv_enabled) {
664
				$advanced .= "</select>\n<br />" . fixup_string($pkga['description']) . "\n";
665
				$advanced .= "</div>\n";
666
			} else {
667
				echo "</select>\n<br />" . fixup_string($pkga['description']) . "\n";
668
			}
669
		} else if($pkga['type'] == "radio") {
670
			if(isset($pkga['advancedfield']) && $adv_enabled)
671
				$advanced .= "<input type='radio' id='" . $pkga['fieldname'] . "' name='" . $pkga['fieldname'] . "' value='" . $value . "'>";
672
			else
673
				echo "<input type='radio' id='" . $pkga['fieldname'] . "' name='" . $pkga['fieldname'] . "' value='" . $value . "'>";
674
		} else if($pkga['type'] == "rowhelper") {
675
		?>
676
			<script type="text/javascript" language='javascript'>
677
			<!--
678
			<?php
679
				$rowcounter = 0;
680
				$fieldcounter = 0;
681
				foreach($pkga['rowhelper']['rowhelperfield'] as $rowhelper) {
682
					echo "rowname[" . $fieldcounter . "] = \"" . $rowhelper['fieldname'] . "\";\n";
683
					echo "rowtype[" . $fieldcounter . "] = \"" . $rowhelper['type'] . "\";\n";
684
					$fieldcounter++;
685
				}
686
			?>
687
			-->
688
			</script>
689
			<table name="maintable" id="maintable">
690
			<tr>
691
			<?php
692
				foreach($pkga['rowhelper']['rowhelperfield'] as $rowhelper) {
693
				  echo "<td><b>" . fixup_string($rowhelper['fielddescr']) . "</td>\n";
694
				}
695
				echo "</tr>";
696

    
697
				echo "<tr>";
698
				  // XXX: traverse saved fields, add back needed rows.
699
				echo "</tr>";
700

    
701
				echo "<tr>\n";
702
				$rowcounter = 0;
703
				$trc = 0;
704
				if(isset($a_pkg[$id]['row'])) {
705
					foreach($a_pkg[$id]['row'] as $row) {
706
					/*
707
					 * loop through saved data for record if it exists, populating rowhelper
708
					 */
709
						foreach($pkga['rowhelper']['rowhelperfield'] as $rowhelper) {
710
							unset($value);
711
							if($rowhelper['value'] <> "") $value = $rowhelper['value'];
712
							$fieldname = $rowhelper['fieldname'];
713
							// if user is editing a record, load in the data.
714
							if (isset($id) && $a_pkg[$id]) {
715
								$value = $row[$fieldname];
716
							}
717
							$options = "";
718
							$type = $rowhelper['type'];
719
							$fieldname = $rowhelper['fieldname'];
720
							if($type == "option")
721
								$options = &$rowhelper['options']['option'];
722
							if($rowhelper['size']) 
723
								$size = $rowhelper['size'];
724
							else if ($pkga['size'])
725
								$size = $pkga['size'];
726
							else
727
								$size = "8";
728
							display_row($rowcounter, $value, $fieldname, $type, $rowhelper, $size);
729
							// javascript helpers for row_helper_dynamic.js
730
							echo "</td>\n";
731
							echo "<script language=\"JavaScript\">\n";
732
							echo "<!--\n";
733
							echo "newrow[" . $trc . "] = \"" . $text . "\";\n";
734
							echo "-->\n";
735
							echo "</script>\n";
736
							$text = "";
737
							$trc++;
738
						}
739

    
740
						$rowcounter++;
741
						echo "<td>";
742
						echo "<a onclick=\"removeRow(this); return false;\" href=\"#\"><img border=\"0\" src=\"./themes/".$g['theme']."/images/icons/icon_x.gif\" /></a>";
743
						echo "</td>\n";
744
						echo "</tr>\n";
745
					}
746
				}
747
				if($trc == 0) {
748
					/*
749
					 *  no records loaded.
750
                                         *  just show a generic line non-populated with saved data
751
                                         */
752
                                        foreach($pkga['rowhelper']['rowhelperfield'] as $rowhelper) {
753
						if($rowhelper['value'] <> "") $value = $rowhelper['value'];
754
						$fieldname = $rowhelper['fieldname'];
755
						$options = "";
756
						$type = $rowhelper['type'];
757
						$fieldname = $rowhelper['fieldname'];
758
						if($type == "option") $options = &$rowhelper['options']['option'];
759
						if($rowhelper['size'] <> "")
760
							$size = $rowhelper['size'];
761
						else if ($pkga['size'])
762
							$size = $pkga['size'];
763
						else
764
							$size = 8;
765
						display_row($rowcounter, $value, $fieldname, $type, $rowhelper, $size);
766
						// javascript helpers for row_helper_dynamic.js
767
						echo "</td>\n";
768
						echo "<script language=\"JavaScript\">\n";
769
						echo "<!--\n";
770
						echo "newrow[" . $trc . "] = \"" . $text . "\";\n";
771
						echo "-->\n";
772
						echo "</script>\n";
773
						$text = "";
774
						$trc++;
775
					}
776

    
777
					$rowcounter++;
778
					echo "<td>";
779
					echo "<a onclick=\"removeRow(this); return false;\" href=\"#\"><img border=\"0\" src=\"./themes/".$g['theme']."/images/icons/icon_x.gif\" /></a>";
780
					echo "</td>\n";
781
					echo "</tr>\n";
782
				}
783
			?>
784

    
785
			  <tbody></tbody>
786
			</table>
787

    
788
		<?php if ($pkga['size']): ?>
789
			<br><a onClick="javascript:addRowTo('maintable', <?=$pkga['size'];?>); return false;" href="#"><img border="0" src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif"></a>
790
		<?php else: ?>
791
			<br><a onClick="javascript:addRowTo('maintable'); return false;" href="#"><img border="0" src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif"></a>
792
		<?php endif; ?>
793
		<script language="JavaScript">
794
		<!--
795
		field_counter_js = <?= $fieldcounter ?>;
796
		rows = <?= $rowcounter ?>;
797
		totalrows = <?php echo $rowcounter; ?>;
798
		loaded = <?php echo $rowcounter; ?>;
799
		//typesel_change();
800
		//-->
801
		</script>
802

    
803
		<?php
804
	      }
805
	      if($pkga['typehint']) echo " " . $pkga['typehint'];
806
	     ?>
807

    
808
      <?php
809
	  if(!$pkga['combinefieldsbegin']) echo "</td></tr>";
810
      $i++;
811
  }
812
 ?>
813
  <tr>
814
	<td>&nbsp;</td>
815
  </tr>
816
  <tr>
817
    <td width="22%" valign="top">&nbsp;</td>
818
    <td width="78%">
819
<?php
820
if($pkg['note'] != "")
821
	echo "<p><span class=\"red\"><strong>" . gettext("Note") . ":</strong></span> {$pkg['note']}</p>";
822
//if (isset($id) && $a_pkg[$id]) // We'll always have a valid ID in our hands
823
      echo "<input name=\"id\" type=\"hidden\" value=\"$id\">";
824
?>
825
      <input name="Submit" type="submit" class="formbtn" value="<?= $savevalue ?>">
826
<?php if (!$only_edit): ?>
827
      <input class="formbtn" type="button" value="<?=gettext("Cancel");?>" onclick="history.back()">
828
<?php endif; ?>
829
    </td>
830
  </tr>
831
<?php if (isset($advanced)) { 
832
				echo $advanced;
833
?>
834
	<tr>
835
		<td width="22%" valign="top">&nbsp;</td>
836
		<td width="78%">
837
			<input name="Submit" type="submit" class="formbtn" value="<?= $savevalue ?>">
838
			<?php if (!$only_edit): ?>
839
				<input class="formbtn" type="button" value="<?=gettext("Cancel");?>" onclick="history.back()">
840
			<?php endif; ?>
841
		</td>
842
	</tr>
843
<?php
844
		}
845
?>
846
</table>
847
</div></tr></td>
848
</table>
849
</form>
850

    
851
<?php if ($pkg['custom_php_after_form_command']) eval($pkg['custom_php_after_form_command']); ?>
852

    
853
<?php
854
	/* JavaScript to handle the advanced fields. */
855
	if ($pkg['advanced_options'] == "enabled") {
856
		echo "<script type=\"text/javascript\">\n";
857
		foreach($js_array as $advfieldname) {
858
			echo "function show_" . $advfieldname . "() {\n";
859
			echo "document.getElementById('showadv_{$advfieldname}').innerHTML='';\n";
860
			echo "aodiv = document.getElementById('show_{$advfieldname}');\n";
861
			echo "aodiv.style.display = 'block';\n";
862
			echo "}\n\n";
863
		}
864
		echo "</script>\n";
865
	}
866
?>
867

    
868
<?php include("fend.inc"); ?>
869
</body>
870
</html>
871

    
872
<?php
873
/*
874
 * ROW Helpers function
875
 */
876
function display_row($trc, $value, $fieldname, $type, $rowhelper, $size) {
877
	global $text, $config;
878
	echo "<td>\n";
879
	if($type == "input") {
880
		echo "<input size='" . $size . "' name='" . $fieldname . $trc . "' id='" . $fieldname . $trc . "' class='formfld unknown' value='" . $value . "'>\n";
881
	} else if($type == "checkbox") {
882
		if($value)
883
			echo "<input size='" . $size . "' type='checkbox' id='" . $fieldname . $trc . "' name='" . $fieldname . $trc . "' value='ON' CHECKED>\n";
884
		else
885
			echo "<input size='" . $size . "' type='checkbox' id='" . $fieldname . $trc . "' name='" . $fieldname . $trc . "' value='ON'>\n";
886
	} else if($type == "password") {
887
		echo "<input size='" . $size . "' type='password' id='" . $fieldname . $trc . "' name='" . $fieldname . $trc . "' class='formfld pwd' value='" . $value . "'>\n";
888
	} else if($type == "textarea") {
889
		echo "<textarea rows='2' cols='12' id='" . $fieldname . $trc . "' class='formfld unknown' name='" . $fieldname . $trc . "'>" . $value . "</textarea>\n";
890
	} else if($type == "select") {
891
		echo "<select id='" . $fieldname . $trc . "' name='" . $fieldname . $trc . "'>\n";
892
		foreach($rowhelper['options']['option'] as $rowopt) {
893
			$selected = "";
894
			if($rowopt['value'] == $value) $selected = " SELECTED";
895
			$text .= "<option value='" . $rowopt['value'] . "'" . $selected . ">" . $rowopt['name'] . "</option>";
896
			echo "<option value='" . $rowopt['value'] . "'" . $selected . ">" . $rowopt['name'] . "</option>\n";
897
		}
898
		echo "</select>\n";
899
	} else if($type == "select_source") {
900
		echo "<select id='" . $fieldname . $trc . "' name='" . $fieldname . $trc . "'>\n";
901
		$source_url = $rowhelper['source'];
902
		eval("\$pkg_source_txt = &$source_url;");
903
		foreach($pkg_source_txt as $opt) {
904
			$selected = "";
905
			if($rowhelper['source_name']) {
906
				$source_name = $opt[$rowhelper['source_name']];
907
		    	} else {
908
				$source_name = $opt[$rowhelper['name']];
909
		    	}
910
		  	if($rowhelper['source_value']) {
911
				$source_value = $opt[$rowhelper['source_value']];
912
		  	} else {
913
				$source_value = $opt[$rowhelper['value']];
914
		  	}
915
			if($source_value == $value) 
916
				$selected = " SELECTED";
917
			$text .= "<option value='" . $source_value . "'" . $selected . ">" . $source_name . "</option>";
918
			echo "<option value='" . $source_value . "'" . $selected . ">" . $source_name . "</option>\n";
919
		}
920
		echo "</select>\n";		
921
	}
922
}
923

    
924
function fixup_string($string) {
925
	global $config;
926
	// fixup #1: $myurl -> http[s]://ip_address:port/
927
	$https = "";
928
	$port = $config['system']['webguiport'];
929
	if($port <> "443" and $port <> "80")
930
		$urlport = ":" . $port;
931
	else
932
		$urlport = "";
933

    
934
	if($config['system']['webgui']['protocol'] == "https") $https = "s";
935
	$myurl = "http" . $https . "://" . getenv("HTTP_HOST") . $urlport;
936
	$newstring = str_replace("\$myurl", $myurl, $string);
937
	$string = $newstring;
938
	// fixup #2: $wanip
939
	$curwanip = get_interface_ip();
940
	$newstring = str_replace("\$wanip", $curwanip, $string);
941
	$string = $newstring;
942
	// fixup #3: $lanip
943
	$lancfg = $config['interfaces']['lan'];
944
	$lanip = $lancfg['ipaddr'];
945
	$newstring = str_replace("\$lanip", $lanip, $string);
946
	$string = $newstring;
947
	// fixup #4: fix'r'up here.
948
	return $newstring;
949
}
950

    
951
/*
952
 *  Parse templates if they are defined
953
 */
954
function parse_package_templates() {
955
	global $pkg, $config;
956
	$rows = 0;
957
	if($pkg['templates']['template'] <> "")
958
	    foreach($pkg['templates']['template'] as $pkg_template_row) {
959
		$filename = $pkg_template_row['filename'];
960
		$template_text = $pkg_template_row['templatecontents'];
961
		$firstfield = "";
962
		/* calculate total row helpers count */
963
		foreach ($pkg['fields']['field'] as $fields) {
964
			if($fields['type'] == "rowhelper") {
965
				// save rowhelper items.
966
                                $row_helper_total_rows = 0;
967
				for($x=0; $x<99; $x++) { // XXX: this really should be passed from the form.
968
					foreach($fields['rowhelper']['rowhelperfield'] as $rowhelperfield) {
969
						if($firstfield == "")  {
970
						  $firstfield = $rowhelperfield['fieldname'];
971
						} else {
972
						  if($firstfield == $rowhelperfield['fieldname']) $rows++;
973
						}
974
						$comd = "\$value = \$_POST['" . $rowhelperfield['fieldname'] . $x . "'];";
975
						$value = "";
976
						eval($comd);
977
						if($value <> "") {
978
						    //$template_text = str_replace($fieldname . "_fieldvalue", $fieldvalue, $template_text);
979
						} else {
980
						    $row_helper_total_rows = $rows;
981
						    break;
982
						}
983
					}
984
				}
985
			}
986
		}
987

    
988
		/* replace $domain_total_rows with total rows */
989
		$template_text = str_replace("$domain_total_rows", $row_helper_total_rows, $template_text);
990

    
991
		/* change fields defined as fieldname_fieldvalue to their value */
992
		foreach ($pkg['fields']['field'] as $fields) {
993
			if($fields['type'] == "rowhelper") {
994
				// save rowhelper items.
995
				for($x=0; $x<99; $x++) { // XXX: this really should be passed from the form.
996
					$row_helper_data = "";
997
					$isfirst = 0;
998
					foreach($fields['rowhelper']['rowhelperfield'] as $rowhelperfield) {
999
						if($firstfield == "")  {
1000
						  $firstfield = $rowhelperfield['fieldname'];
1001
						} else {
1002
						  if($firstfield == $rowhelperfield['fieldname']) $rows++;
1003
						}
1004
						$comd = "\$value = \$_POST['" . $rowhelperfield['fieldname'] . $x . "'];";
1005
						eval($comd);
1006
						if($value <> "") {
1007
						    if($isfirst == 1) $row_helper_data .= "  " ;
1008
						    $row_helper_data .= $value;
1009
						    $isfirst = 1;
1010
						}
1011
						$sep = "";
1012
						ereg($rowhelperfield['fieldname'] . "_fieldvalue\[(.*)\]", $template_text, $sep);
1013
						foreach ($sep as $se) $seperator = $se;
1014
						if($seperator <> "") {
1015
						    $row_helper_data = ereg_replace("  ", $seperator, $row_helper_data);
1016
						    $template_text = ereg_replace("\[" . $seperator . "\]", "", $template_text);
1017
						}
1018
						$template_text = str_replace($rowhelperfield['fieldname'] . "_fieldvalue", $row_helper_data, $template_text);
1019
					}
1020
				}
1021
			} else {
1022
				$fieldname  = $fields['fieldname'];
1023
				$fieldvalue = $_POST[$fieldname];
1024
				$template_text = str_replace($fieldname . "_fieldvalue", $fieldvalue, $template_text);
1025
			}
1026
		}
1027

    
1028
		/* replace cr's */
1029
		$template_text = str_replace("\\n", "\n", $template_text);
1030

    
1031
		/* write out new template file */
1032
		$fout = fopen($filename,"w");
1033
		fwrite($fout, $template_text);
1034
		fclose($fout);
1035
	    }
1036
}
1037

    
1038
/* Return html div fields */
1039
function display_advanced_field($fieldname) {
1040
	$div = "<div id='showadv_" . $fieldname . "'>\n";
1041
	$div .= "<input type='button' onClick='show_" . $fieldname . "()' value='" . gettext("Advanced") . "'></input> - " . gettext("Show advanced option") ."</div>\n";
1042
	$div .= "<div id='show_" . $fieldname . "' style='display:none'>\n";
1043
	return $div;
1044
}
1045

    
1046
?>
(119-119/226)