Project

General

Profile

Download (35.8 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($pkg['custom_php_global_functions'] <> "")
93
        eval($pkg['custom_php_global_functions']);
94

    
95
// grab the installedpackages->package_name section.
96
if(!is_array($config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config']))
97
	$config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config'] = array();
98

    
99
// If the first entry in the array is an empty <config/> tag, kill it.
100
if ((count($config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config']) > 0) 
101
	&& ($config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config'][0] == ""))
102
	array_shift($config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config']);
103

    
104
$a_pkg = &$config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config'];
105

    
106
if($_GET['savemsg'] <> "")
107
	$savemsg = htmlspecialchars($_GET['savemsg']);
108

    
109
if($pkg['custom_php_command_before_form'] <> "")
110
	eval($pkg['custom_php_command_before_form']);
111

    
112
if ($_POST) {
113
	if($_POST['act'] == "del") {
114
		if($pkg['custom_delete_php_command']) {
115
		    if($pkg['custom_php_command_before_form'] <> "")
116
			    eval($pkg['custom_php_command_before_form']);
117
		    eval($pkg['custom_delete_php_command']);
118
		}
119
		write_config($pkg['delete_string']);
120
		// resync the configuration file code if defined.
121
		if($pkg['custom_php_resync_config_command'] <> "") {
122
			if($pkg['custom_php_command_before_form'] <> "")
123
				eval($pkg['custom_php_command_before_form']);
124
			eval($pkg['custom_php_resync_config_command']);
125
		}
126
	} else {
127
		if($pkg['custom_add_php_command']) {
128
			if($pkg['donotsave'] <> "" or $pkg['preoutput'] <> "") {
129
			?>
130

    
131
<?php include("head.inc"); ?>
132
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
133
<?php include("fbegin.inc"); ?>
134
<?php
135
			}
136
			if($pkg['preoutput']) echo "<pre>";
137
			eval($pkg['custom_add_php_command']);
138
			if($pkg['preoutput']) echo "</pre>";
139
		}
140
	}
141

    
142
	// donotsave is enabled.  lets simply exit.
143
	if($pkg['donotsave'] <> "") exit;
144

    
145
	$firstfield = "";
146
	$rows = 0;
147

    
148
	$input_errors = array();
149
	$reqfields = array();
150
	$reqfieldsn = array();
151
	foreach ($pkg['fields']['field'] as $field) {
152
		if (($field['type'] == 'input') && isset($field['required'])) {
153
			if($field['fieldname'])
154
				$reqfields[] = $field['fieldname'];
155
			if($field['fielddescr'])	
156
				$reqfieldsn[] = $field['fielddescr'];
157
		}
158
	}
159
	do_input_validation($_POST, $reqfields, $reqfieldsn, &$input_errors);
160

    
161
	if ($pkg['custom_php_validation_command'])
162
		eval($pkg['custom_php_validation_command']);
163

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

    
207
		if (isset($id) && $a_pkg[$id])
208
			$a_pkg[$id] = $pkgarr;
209
		else
210
			$a_pkg[] = $pkgarr;
211

    
212
		write_config($pkg['addedit_string']);
213
		// late running code
214
		if($pkg['custom_add_php_command_late'] <> "") {
215
		    eval($pkg['custom_add_php_command_late']);
216
		}
217

    
218
		if (isset($pkg['filter_rules_needed'])) 
219
			filter_configure();
220

    
221
		// resync the configuration file code if defined.
222
		if($pkg['custom_php_resync_config_command'] <> "") {
223
		    eval($pkg['custom_php_resync_config_command']);
224
		}
225

    
226
		parse_package_templates();
227

    
228
		/* if start_command is defined, restart w/ this */
229
		if($pkg['start_command'] <> "")
230
		    exec($pkg['start_command'] . ">/dev/null 2&>1");
231

    
232
		/* if restart_command is defined, restart w/ this */
233
		if($pkg['restart_command'] <> "")
234
		    exec($pkg['restart_command'] . ">/dev/null 2&>1");
235

    
236
		if($pkg['aftersaveredirect'] <> "") {
237
		    pfSenseHeader($pkg['aftersaveredirect']);
238
		} elseif(!$pkg['adddeleteeditpagefields']) {
239
		    pfSenseHeader("pkg_edit.php?xml={$xml}&id=0");
240
		} elseif(!$pkg['preoutput']) {
241
		    pfSenseHeader("pkg.php?xml=" . $xml);
242
		}
243
		exit;
244
	} else {
245
		$get_from_post = true;
246
	}
247
}
248

    
249
if($pkg['title'] <> "") {
250
	$edit = ($only_edit ? '' : ": " .  gettext("Edit"));
251
	$title = $pkg['title'] . $edit;
252
}
253
else
254
	$title = gettext("Package Editor");
255

    
256
$pgtitle = $title;
257
include("head.inc");
258

    
259
if ($pkg['custom_php_after_head_command'])
260
	eval($pkg['custom_php_after_head_command']);
261

    
262
?>
263

    
264
<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onLoad="enablechange();">
265
<?php if($pkg['fields']['field'] <> "") { ?>
266
<script language="JavaScript">
267
<!--
268
function enablechange() {
269
<?php
270
foreach ($pkg['fields']['field'] as $field) {
271
	if (isset($field['enablefields']) or isset($field['checkenablefields'])) {
272
		echo "\tif (document.iform.elements[\"{$field['fieldname']}\"].checked == false) {\n";
273

    
274
		if (isset($field['enablefields'])) {
275
			foreach (explode(',', $field['enablefields']) as $enablefield) {
276
				echo "\t\tif(document.iform.elements[\"$enablefield\"]){\n";
277
				echo "\t\t\tdocument.iform.elements[\"$enablefield\"].disabled = 1;\n";
278
				echo "\t\t}else{\n";
279
				echo "\t\t\tdocument.iform.elements[\"$enablefield".'[]'."\"].disabled = 1;\n";
280
				echo "\t\t}\n";
281
			}
282
		}
283

    
284
		if (isset($field['checkenablefields'])) {
285
			foreach (explode(',', $field['checkenablefields']) as $checkenablefield) {
286
				echo "\t\tif(document.iform.elements[\"$checkenablefield\"]){\n";
287
				echo "\t\t\tdocument.iform.elements[\"$checkenablefield\"].checked = 0;\n";
288
				echo "\t\t}else{\n";
289
				echo "\t\t\tdocument.iform.elements[\"$checkenablefield".'[]'."\"].checked = 0;\n";
290
				echo "\t\t}\n";
291
			}
292
		}
293

    
294
		echo "\t}\n\telse {\n";
295

    
296
		if (isset($field['enablefields'])) {
297
			foreach (explode(',', $field['enablefields']) as $enablefield) {
298
				echo "\t\tif(document.iform.elements[\"$enablefield\"]){\n";
299
				echo "\t\t\tdocument.iform.elements[\"$enablefield\"].disabled = 0;\n";
300
				echo "\t\t}else{\n";
301
				echo "\t\t\tdocument.iform.elements[\"$enablefield".'[]'."\"].disabled = 0;\n";
302
				echo "\t\t}\n";
303
			}
304
		}
305

    
306
		if (isset($field['checkenablefields'])) {
307
			foreach(explode(',', $field['checkenablefields']) as $checkenablefield) {
308
				echo "\t\tif(document.iform.elements[\"$checkenablefield\"]){\n";
309
				echo "\t\t\tdocument.iform.elements[\"$checkenablefield\"].checked = 1;\n";
310
				echo "\t\t}else{\n";
311
				echo "\t\t\tdocument.iform.elements[\"$checkenablefield".'[]'."\"].checked = 1;\n";
312
				echo "\t\t}\n";
313
			}
314
		}
315

    
316
		echo "\t}\n";
317
	}
318
}
319
?>
320
}
321
//-->
322
</script>
323
<?php } ?>
324
<script type="text/javascript" language="javascript" src="/javascript/row_helper_dynamic.js">
325
</script>
326

    
327
<?php include("fbegin.inc"); ?>
328
<?php if (!empty($input_errors)) print_input_errors($input_errors); ?>
329
<form name="iform" action="pkg_edit.php" method="post">
330
<input type="hidden" name="xml" value="<?= $xml ?>">
331
<?php if ($savemsg) print_info_box($savemsg); ?>
332
<table width="100%" border="0" cellpadding="0" cellspacing="0">
333
<?php
334
if ($pkg['tabs'] <> "") {
335
	$tab_array = array();
336
	foreach($pkg['tabs']['tab'] as $tab) {
337
		if($tab['tab_level'])
338
			$tab_level = $tab['tab_level'];
339
		else
340
			$tab_level = 1;
341
		if(isset($tab['active'])) {
342
			$active = true;
343
		} else {
344
			$active = false;
345
		}
346
		$urltmp = "";
347
		if($tab['url'] <> "") $urltmp = $tab['url'];
348
		if($tab['xml'] <> "") $urltmp = "pkg_edit.php?xml=" . $tab['xml'];
349

    
350
 		$addresswithport = getenv("HTTP_HOST");
351
		$colonpos = strpos($addresswithport, ":");
352
		if ($colonpos !== False) {
353
			//my url is actually just the IP address of the pfsense box
354
			$myurl = substr($addresswithport, 0, $colonpos);
355
		} else {
356
			$myurl = $addresswithport;
357
		}
358
		// eval url so that above $myurl item can be processed if need be.
359
		$url = str_replace('$myurl', $myurl, $urltmp);
360

    
361
		$tab_array[$tab_level][] = array(
362
						$tab['text'],
363
						$active,
364
						$url
365
					);
366
    	}
367

    
368
	ksort($tab_array);
369
	foreach($tab_array as $tab) {
370
   		echo '<tr><td>';
371
    	display_top_tabs($tab);
372
   		echo '</td></tr>';
373
	}
374
}
375
?>
376
<tr><td><div id="mainarea"><table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0">
377
<?php
378
	$cols = 0;
379
	$savevalue = gettext("Save");
380
	if($pkg['savetext'] <> "") $savevalue = $pkg['savetext'];
381
	/* If a package's XML has <advanced_options/> configured, then setup 
382
	 * the table rows for the fields that have <advancedfield/> set.
383
	 * These fields will be placed below other fields in a seprate area titled 'Advanced Features'.
384
	 * These advanced fields are not normally configured and generally left to default to 'default settings'.
385
	 */
386
	if ($pkg['advanced_options'] == "enabled") {
387
		$adv_enabled = true;
388
		$advanced .= "<td>&nbsp;</td>";
389
		$advanced .= "<tr><td colspan=\"2\" class=\"listtopic\">". gettext("Advanced features") . "<br/></td></tr>\n";
390
	}
391

    
392
	foreach ($pkg['fields']['field'] as $pkga) {
393
		if ($pkga['type'] == "sorting") 
394
			continue;
395

    
396
		if ($pkga['type'] == "listtopic") {
397
			if(isset($pkga['advancedfield']) && $adv_enabled) {
398
				$advanced .= "<td>&nbsp;</td>";
399
				$advanced .= "<tr><td colspan=\"2\" class=\"listtopic\">" . $pkga['name'] . "<br></td></tr>\n";
400
			} else {
401
				echo "<td>&nbsp;</td>";
402
				echo "<tr><td colspan=\"2\" class=\"listtopic\">" . $pkga['name'] . "<br></td></tr>\n";
403
			}
404
			continue;
405
		}	
406
	
407
		if(!$pkga['combinefieldsend']) {
408
			if(isset($pkga['advancedfield']) && $adv_enabled)
409
				$advanced .= "<tr valign=\"top\">";
410
			else
411
		  		echo "<tr valign=\"top\">";
412
		}
413

    
414
		$size = "";
415

    
416
		if(!$pkga['dontdisplayname']) {
417
			unset($req);
418
			if (isset($pkga['required']))
419
				$req = 'req';
420
			if(isset($pkga['advancedfield']) && $adv_enabled) {
421
				$advanced .= "<td width=\"22%\" class=\"vncell{$req}\">";
422
				$advanced .= fixup_string($pkga['fielddescr']);
423
				$advanced .= "</td>";
424
			} else {
425
				echo "<td width=\"22%\" class=\"vncell{$req}\">";
426
				echo fixup_string($pkga['fielddescr']);
427
				echo "</td>";
428
			}
429
		}
430

    
431
		if(!$pkga['dontcombinecells'])
432
			if(isset($pkga['advancedfield']) && $adv_enabled)
433
				$advanced .= "<td class=\"vtable\">";
434
			else
435
				echo "<td class=\"vtable\">";
436
		// if user is editing a record, load in the data.
437
		$fieldname = $pkga['fieldname'];
438
		if ($get_from_post) {
439
			$value = $_POST[$fieldname];
440
			if (is_array($value)) $value = implode(',', $value);
441
		} else {
442
			if (isset($id) && $a_pkg[$id])
443
				$value = $a_pkg[$id][$fieldname];
444
			else
445
				$value = $pkga['default_value'];
446
		}
447

    
448
		if($pkga['type'] == "input") {
449
			if($pkga['size']) $size = " size='" . $pkga['size'] . "' ";
450
			if(isset($pkga['advancedfield']) && $adv_enabled) {
451
				$js_array[] = $pkga['fieldname'];
452
				$advanced .= display_advanced_field($pkga['fieldname']);
453
				$advanced .= "<input " . $size . " id='" . $pkga['fieldname'] . "' name='" . $pkga['fieldname'] . "' class='formfld unknown' value='" . $value . "'>\n";
454
				$advanced .= "<br>" . fixup_string($pkga['description']) . "\n";
455
				$advanced .= "</div>\n";
456
			} else {
457
				echo "<input " . $size . " id='" . $pkga['fieldname'] . "' name='" . $pkga['fieldname'] . "' class='formfld unknown' value='" . $value . "'>\n";
458
				echo "<br>" . fixup_string($pkga['description']) . "\n";
459
			}
460
		} else if($pkga['type'] == "password") {
461
			if($pkga['size']) $size = " size='" . $pkga['size'] . "' ";		
462
			if(isset($pkga['advancedfield']) && $adv_enabled) {
463
				$js_array[] = $pkga['fieldname'];
464
				$advanced .= display_advanced_field($pkga['fieldname']);
465
				$advanced .= "<input " . $size . " id='" . $pkga['fieldname'] . "' type='password' " . $size . " name='" . $pkga['fieldname'] . "' class='formfld pwd' value='" . $value . "'>\n";
466
				$advanced .= "<br>" . fixup_string($pkga['description']) . "\n";
467
				$advanced .= "</div>\n";
468
			} else {
469
				echo "<input " . $size . " id='" . $pkga['fieldname'] . "' type='password' " . $size . " name='" . $pkga['fieldname'] . "' class='formfld pwd' value='" . $value . "'>\n";
470
				echo "<br>" . fixup_string($pkga['description']) . "\n";
471
			}
472
		} else if($pkga['type'] == "select") {
473
			$fieldname = $pkga['fieldname'];
474
			if (isset($pkga['multiple'])) {
475
      	$multiple = 'multiple="multiple"';
476
				$items = explode(',', $value);
477
				$fieldname .= "[]";
478
			} else {
479
				$multiple = '';
480
				$items = array($value);
481
			}
482
			$size = (isset($pkga['size']) ? "size=\"{$pkga['size']}\"" : '');
483
			$onchange = (isset($pkga['onchange']) ? "onchange=\"{$pkga['onchange']}\"" : '');
484

    
485
			if(isset($pkga['advancedfield']) && $adv_enabled) {
486
				$js_array[] = $pkga['fieldname'];
487
				$advanced .= display_advanced_field($pkga['fieldname']);
488
				$advanced .= "<select id='" . $pkga['fieldname'] . "' $multiple $size $onchange id=\"$fieldname\" name=\"$fieldname\">\n";
489
				foreach ($pkga['options']['option'] as $opt) {
490
					$selected = '';
491
					if (in_array($opt['value'], $items)) $selected = 'selected="selected"';
492
						$advanced .= "\t<option name=\"{$opt['name']}\" value=\"{$opt['value']}\" $selected>{$opt['name']}</option>\n";
493
				}
494
				$advanced .= "</select>\n<br />\n" . fixup_string($pkga['description']) . "\n";
495
				$advanced .= "</div>\n";
496
			} else {
497
				echo "<select id='" . $pkga['fieldname'] . "' $multiple $size $onchange id=\"$fieldname\" name=\"$fieldname\">\n";
498
				foreach ($pkga['options']['option'] as $opt) {
499
					$selected = '';
500
					if (in_array($opt['value'], $items)) $selected = 'selected="selected"';
501
					echo "\t<option name=\"{$opt['name']}\" value=\"{$opt['value']}\" $selected>{$opt['name']}</option>\n";
502
				}
503
				echo "</select>\n<br />\n" . fixup_string($pkga['description']) . "\n";
504
			}
505

    
506
		} else if($pkga['type'] == "select_source") {
507
			$fieldname = $pkga['fieldname'];
508
			if (isset($pkga['multiple'])) {
509
				$multiple = 'multiple="multiple"';
510
				$items = explode(',', $value);
511
				$fieldname .= "[]";
512
			} else {
513
				$multiple = '';
514
				$items = array($value);
515
			}
516
			$size = (isset($pkga['size']) ? "size=\"{$pkga['size']}\"" : '');
517
			$onchange = (isset($pkga['onchange']) ? "onchange=\"{$pkga['onchange']}\"" : '');
518

    
519
			if(isset($pkga['advancedfield']) && $adv_enabled) {
520
				$js_array[] = $pkga['fieldname'];
521
				$advanced .= display_advanced_field($pkga['fieldname']);
522
				$advanced .= "<select id='" . $pkga['fieldname'] . "' $multiple $size $onchange id=\"{$fieldname}\" name=\"{$fieldname}\">\n";
523
				$advanced .= "</div>\n";
524
			} else {
525
				echo "<select id='" . $pkga['fieldname'] . "' $multiple $size $onchange id=\"$fieldname\" name=\"$fieldname\">\n";
526
			}
527
			$source_url = $pkga['source'];
528
			eval("\$pkg_source_txt = &$source_url;");
529
			foreach ($pkg_source_txt as $opt) {
530
				$selected = '';
531
				if($pkga['source_name']) {
532
					$source_name = $opt[$pkga['source_name']];
533
				} else {
534
					$source_name = $opt[$pkga['name']];
535
				}
536
				if($pkga['source_value']) {
537
					$source_value = $opt[$pkga['source_value']];
538
				} else {
539
					$source_value = $opt[$pkga['value']];
540
				}
541
				if (in_array($opt['value'], $items)) $selected = 'selected="selected"';
542
					if(isset($pkga['advancedfield']) && $adv_enabled)
543
						$advanced .= "\t<option name=\"{$source_name}\" value=\"{$source_value}\" $selected>{$source_name}</option>\n";
544
					else
545
						echo "\t<option name=\"{$source_name}\" value=\"{$source_value}\" $selected>{$source_name}</option>\n";
546
			}
547

    
548
			if(isset($pkga['advancedfield']) && $adv_enabled)
549
				$advanced .= "</select>\n<br />\n" . fixup_string($pkga['description']) . "\n";
550
			else
551
				echo "</select>\n<br />\n" . fixup_string($pkga['description']) . "\n";		
552
		} else if($pkga['type'] == "vpn_selection") {
553
			if(isset($pkga['advancedfield']) && $adv_enabled) {
554
				$js_array[] = $pkga['fieldname'];
555
				$advanced .= display_advanced_field($pkga['fieldname']);
556
				$advanced .= "<select id='" . $pkga['fieldname'] . "' name='" . $vpn['name'] . "'>\n";
557
				foreach ($config['ipsec']['phase1'] as $vpn) {
558
					$advanced .= "\t<option value=\"" . $vpn['descr'] . "\">" . $vpn['descr'] . "</option>\n";
559
				}
560
				$advanced .= "</select>\n";
561
				$advanced .= "<br>" . fixup_string($pkga['description']) . "\n";
562
				$advanced .= "</div>\n";
563
			} else {
564
				echo "<select id='" . $pkga['fieldname'] . "' name='" . $vpn['name'] . "'>\n";
565
				foreach ($config['ipsec']['phase1'] as $vpn) {
566
					echo "\t<option value=\"" . $vpn['descr'] . "\">" . $vpn['descr'] . "</option>\n";
567
				}
568
				echo "</select>\n";
569
				echo "<br>" . fixup_string($pkga['description']) . "\n";
570
			}
571
		} else if($pkga['type'] == "checkbox") {
572
			$checkboxchecked = "";
573
			if($value == "on") $checkboxchecked = " CHECKED";
574
			if (isset($pkga['enablefields']) || isset($pkga['checkenablefields']))
575
				$onclick = ' onclick="javascript:enablechange();"';
576
			if(isset($pkga['advancedfield']) && $adv_enabled) {
577
				$js_array[] = $pkga['fieldname'];
578
				$advanced .= display_advanced_field($pkga['fieldname']);
579
				$advanced .= "<input id='" . $pkga['fieldname'] . "' type='checkbox' name='" . $pkga['fieldname'] . "'" . $checkboxchecked . $onclick . ">\n";
580
				$advanced .= "<br>" . fixup_string($pkga['description']) . "\n";
581
				$advanced .= "</div>\n";
582
			} else {
583
				echo "<input id='" . $pkga['fieldname'] . "' type='checkbox' name='" . $pkga['fieldname'] . "'" . $checkboxchecked . $onclick . ">\n";
584
				echo "<br>" . fixup_string($pkga['description']) . "\n";
585
			}
586
		} else if($pkga['type'] == "textarea") {
587
			if($pkga['rows']) $rows = " rows='" . $pkga['rows'] . "' ";
588
			if($pkga['cols']) $cols = " cols='" . $pkga['cols'] . "' ";
589
			if($pkga['wrap'] == "off") { $wrap = 'wrap="off" style="white-space:nowrap;"'; } else { $wrap = ''; }		  
590
			if (($pkga['encoding'] == 'base64') && !$get_from_post && !empty($value)) $value = base64_decode($value);
591
			if(isset($pkga['advancedfield']) && $adv_enabled) {
592
				$js_array[] = $pkga['fieldname'];
593
				$advanced .= display_advanced_field($pkga['fieldname']);
594
				$advanced .= "<textarea " . $rows . $cols . " name='" . $pkga['fieldname'] . "' ".$wrap.">" . $value . "</textarea>\n";
595
				$advanced .= "<br>" . fixup_string($pkga['description']) . "\n";
596
				$advanced .= "</div>\n";
597
			} else {
598
				echo "<textarea " . $rows . $cols . " name='" . $pkga['fieldname'] . "' ".$wrap.">" . $value . "</textarea>\n";
599
				echo "<br>" . fixup_string($pkga['description']) . "\n";
600
			}
601
		} else if($pkga['type'] == "interfaces_selection") {
602
			$size = ($pkga['size'] ? "size=\"{$pkga['size']}\"" : '');
603
			$multiple = '';
604
			$fieldname = $pkga['fieldname'];
605
			if (isset($pkga['multiple'])) {
606
				$fieldname .= '[]';
607
				$multiple = 'multiple';
608
			}
609
			if(isset($pkga['advancedfield']) && $adv_enabled) {
610
				$js_array[] = $pkga['fieldname'];
611
				$advanced .= display_advanced_field($pkga['fieldname']);
612
				$advanced .= "<select id='" . $pkga['fieldname'] . "' name=\"$fieldname\" $size $multiple>\n";
613
			} else {
614
				echo "<select id='" . $pkga['fieldname'] . "' name=\"$fieldname\" $size $multiple>\n";
615
			}
616
			$ifaces = get_configured_interface_with_descr();
617
			$additional_ifaces = $pkga['add_to_interfaces_selection'];
618
			if (!empty($additional_ifaces))
619
				$ifaces = array_merge($ifaces, explode(',', $additional_ifaces));
620
			if(is_array($value))
621
				$values = $value;
622
			else
623
				$values  =  explode(',',  $value);
624
			foreach($ifaces as $ifname => $iface) {
625
				$selected = (in_array($ifname, $values) ? 'selected' : '');
626
				if(isset($pkga['advancedfield']) && $adv_enabled)
627
					$advanced .= "<option value=\"$ifname\" $selected>$iface</option>\n";
628
				else
629
					echo "<option value=\"$ifname\" $selected>$iface</option>\n";
630
			}
631
			if(isset($pkga['advancedfield']) && $adv_enabled) {
632
				$advanced .= "</select>\n<br />" . fixup_string($pkga['description']) . "\n";
633
				$advanced .= "</div>\n";
634
			} else {
635
				echo "</select>\n<br />" . fixup_string($pkga['description']) . "\n";
636
			}
637
		} else if($pkga['type'] == "radio") {
638
			if(isset($pkga['advancedfield']) && $adv_enabled)
639
				$advanced .= "<input type='radio' id='" . $pkga['fieldname'] . "' name='" . $pkga['fieldname'] . "' value='" . $value . "'>";
640
			else
641
				echo "<input type='radio' id='" . $pkga['fieldname'] . "' name='" . $pkga['fieldname'] . "' value='" . $value . "'>";
642
		} else if($pkga['type'] == "rowhelper") {
643
		?>
644
			<script type="text/javascript" language='javascript'>
645
			<!--
646
			<?php
647
				$rowcounter = 0;
648
				$fieldcounter = 0;
649
				foreach($pkga['rowhelper']['rowhelperfield'] as $rowhelper) {
650
					echo "rowname[" . $fieldcounter . "] = \"" . $rowhelper['fieldname'] . "\";\n";
651
					echo "rowtype[" . $fieldcounter . "] = \"" . $rowhelper['type'] . "\";\n";
652
					$fieldcounter++;
653
				}
654
			?>
655
			-->
656
			</script>
657
			<table name="maintable" id="maintable">
658
			<tr>
659
			<?php
660
				foreach($pkga['rowhelper']['rowhelperfield'] as $rowhelper) {
661
				  echo "<td><b>" . fixup_string($rowhelper['fielddescr']) . "</td>\n";
662
				}
663
				echo "</tr>";
664

    
665
				echo "<tr>";
666
				  // XXX: traverse saved fields, add back needed rows.
667
				echo "</tr>";
668

    
669
				echo "<tr>\n";
670
				$rowcounter = 0;
671
				$trc = 0;
672
				if(isset($a_pkg[$id]['row'])) {
673
					foreach($a_pkg[$id]['row'] as $row) {
674
					/*
675
					 * loop through saved data for record if it exists, populating rowhelper
676
					 */
677
						foreach($pkga['rowhelper']['rowhelperfield'] as $rowhelper) {
678
							unset($value);
679
							if($rowhelper['value'] <> "") $value = $rowhelper['value'];
680
							$fieldname = $rowhelper['fieldname'];
681
							// if user is editing a record, load in the data.
682
							if (isset($id) && $a_pkg[$id]) {
683
								$value = $row[$fieldname];
684
							}
685
							$options = "";
686
							$type = $rowhelper['type'];
687
							$fieldname = $rowhelper['fieldname'];
688
							if($type == "option")
689
								$options = &$rowhelper['options']['option'];
690
							if($rowhelper['size']) 
691
								$size = $rowhelper['size'];
692
							else if ($pkga['size'])
693
								$size = $pkga['size'];
694
							else
695
								$size = "8";
696
							display_row($rowcounter, $value, $fieldname, $type, $rowhelper, $size);
697
							// javascript helpers for row_helper_dynamic.js
698
							echo "</td>\n";
699
							echo "<script language=\"JavaScript\">\n";
700
							echo "<!--\n";
701
							echo "newrow[" . $trc . "] = \"" . $text . "\";\n";
702
							echo "-->\n";
703
							echo "</script>\n";
704
							$text = "";
705
							$trc++;
706
						}
707

    
708
						$rowcounter++;
709
						echo "<td>";
710
						echo "<input type=\"image\" src=\"./themes/".$g['theme']."/images/icons/icon_x.gif\" onclick=\"removeRow(this); return false;\" value=\"" . gettext("Delete") . "\">";
711
						echo "</td>\n";
712
						echo "</tr>\n";
713
					}
714
				}
715
				if($trc == 0) {
716
					/*
717
					 *  no records loaded.
718
                                         *  just show a generic line non-populated with saved data
719
                                         */
720
                                        foreach($pkga['rowhelper']['rowhelperfield'] as $rowhelper) {
721
						if($rowhelper['value'] <> "") $value = $rowhelper['value'];
722
						$fieldname = $rowhelper['fieldname'];
723
						$options = "";
724
						$type = $rowhelper['type'];
725
						$fieldname = $rowhelper['fieldname'];
726
						if($type == "option") $options = &$rowhelper['options']['option'];
727
						if($rowhelper['size'] <> "")
728
							$size = $rowhelper['size'];
729
						else if ($pkga['size'])
730
							$size = $pkga['size'];
731
						else
732
							$size = 8;
733
						display_row($rowcounter, $value, $fieldname, $type, $rowhelper, $size);
734
						// javascript helpers for row_helper_dynamic.js
735
						echo "</td>\n";
736
						echo "<script language=\"JavaScript\">\n";
737
						echo "<!--\n";
738
						echo "newrow[" . $trc . "] = \"" . $text . "\";\n";
739
						echo "-->\n";
740
						echo "</script>\n";
741
						$text = "";
742
						$trc++;
743
					}
744

    
745
					$rowcounter++;
746
					echo "<td>";
747
					echo "<input type=\"image\" src=\"./themes/".$g['theme']."/images/icons/icon_x.gif\" onclick=\"removeRow(this); return false;\" value=\"" . gettext("Delete") . "\">";
748
					echo "</td>\n";
749
					echo "</tr>\n";
750
				}
751
			?>
752

    
753
			  <tbody></tbody>
754
			</table>
755

    
756
		<?php if ($pkga['size']): ?>
757
			<br><a onClick="javascript:addRowTo('maintable', <?=$pkga['size'];?>); return false;" href="#"><img border="0" src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif"></a>
758
		<?php else: ?>
759
			<br><a onClick="javascript:addRowTo('maintable'); return false;" href="#"><img border="0" src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif"></a>
760
		<?php endif; ?>
761
		<script language="JavaScript">
762
		<!--
763
		field_counter_js = <?= $fieldcounter ?>;
764
		rows = <?= $rowcounter ?>;
765
		totalrows = <?php echo $rowcounter; ?>;
766
		loaded = <?php echo $rowcounter; ?>;
767
		//typesel_change();
768
		//-->
769
		</script>
770

    
771
		<?php
772
	      }
773
	      if($pkga['typehint']) echo " " . $pkga['typehint'];
774
	     ?>
775

    
776
      <?php
777
	  if(!$pkga['combinefieldsbegin']) echo "</td></tr>";
778
      $i++;
779
  }
780
 ?>
781
  <tr>
782
	<td>&nbsp;</td>
783
  </tr>
784
  <tr>
785
    <td width="22%" valign="top">&nbsp;</td>
786
    <td width="78%">
787
<?php
788
if($pkg['note'] != "")
789
	echo "<p><span class=\"red\"><strong>" . gettext("Note") . ":</strong></span> {$pkg['note']}</p>";
790
//if (isset($id) && $a_pkg[$id]) // We'll always have a valid ID in our hands
791
      echo "<input name=\"id\" type=\"hidden\" value=\"$id\">";
792
?>
793
      <input name="Submit" type="submit" class="formbtn" value="<?= $savevalue ?>">
794
<?php if (!$only_edit): ?>
795
      <input class="formbtn" type="button" value="<?=gettext("Cancel");?>" onclick="history.back()">
796
<?php endif; ?>
797
    </td>
798
  </tr>
799
<?php if (isset($advanced)) { 
800
				echo $advanced;
801
?>
802
	<tr>
803
		<td width="22%" valign="top">&nbsp;</td>
804
		<td width="78%">
805
			<input name="Submit" type="submit" class="formbtn" value="<?= $savevalue ?>">
806
			<?php if (!$only_edit): ?>
807
				<input class="formbtn" type="button" value="<?=gettext("Cancel");?>" onclick="history.back()">
808
			<?php endif; ?>
809
		</td>
810
	</tr>
811
<?php
812
		}
813
?>
814
</table>
815
</div></tr></td>
816
</table>
817
</form>
818

    
819
<?php if ($pkg['custom_php_after_form_command']) eval($pkg['custom_php_after_form_command']); ?>
820

    
821
<?php
822
	/* JavaScript to handle the advanced fields. */
823
	if ($pkg['advanced_options'] == "enabled") {
824
		echo "<script type=\"text/javascript\">\n";
825
		foreach($js_array as $advfieldname) {
826
			echo "function show_" . $advfieldname . "() {\n";
827
			echo "document.getElementById('showadv_{$advfieldname}').innerHTML='';\n";
828
			echo "aodiv = document.getElementById('show_{$advfieldname}');\n";
829
			echo "aodiv.style.display = 'block';\n";
830
			echo "}\n\n";
831
		}
832
		echo "</script>\n";
833
	}
834
?>
835

    
836
<?php include("fend.inc"); ?>
837
</body>
838
</html>
839

    
840
<?php
841
/*
842
 * ROW Helpers function
843
 */
844
function display_row($trc, $value, $fieldname, $type, $rowhelper, $size) {
845
	global $text, $config;
846
	echo "<td>\n";
847
	if($type == "input") {
848
		echo "<input size='" . $size . "' name='" . $fieldname . $trc . "' id='" . $fieldname . $trc . "' value='" . $value . "'>\n";
849
	} else if($type == "checkbox") {
850
		if($value)
851
			echo "<input size='" . $size . "' type='checkbox' id='" . $fieldname . $trc . "' name='" . $fieldname . $trc . "' value='ON' CHECKED>\n";
852
		else
853
			echo "<input size='" . $size . "' type='checkbox' id='" . $fieldname . $trc . "' name='" . $fieldname . $trc . "' value='ON'>\n";
854
	} else if($type == "password") {
855
		echo "<input size='" . $size . "' type='password' id='" . $fieldname . $trc . "' name='" . $fieldname . $trc . "' class='formfld pwd' value='" . $value . "'>\n";
856
	} else if($type == "textarea") {
857
		echo "<textarea rows='2' cols='12' id='" . $fieldname . $trc . "' class='formfld unknown' name='" . $fieldname . $trc . "'>" . $value . "</textarea>\n";
858
	} else if($type == "select") {
859
		echo "<select id='" . $fieldname . $trc . "' name='" . $fieldname . $trc . "'>\n";
860
		foreach($rowhelper['options']['option'] as $rowopt) {
861
			$selected = "";
862
			if($rowopt['value'] == $value) $selected = " SELECTED";
863
			$text .= "<option value='" . $rowopt['value'] . "'" . $selected . ">" . $rowopt['name'] . "</option>";
864
			echo "<option value='" . $rowopt['value'] . "'" . $selected . ">" . $rowopt['name'] . "</option>\n";
865
		}
866
		echo "</select>\n";
867
	} else if($type == "select_source") {
868
		echo "<select id='" . $fieldname . $trc . "' name='" . $fieldname . $trc . "'>\n";
869
		$source_url = $rowhelper['source'];
870
		eval("\$pkg_source_txt = &$source_url;");
871
		foreach($pkg_source_txt as $opt) {
872
			$selected = "";
873
			if($rowhelper['source_name']) {
874
				$source_name = $opt[$rowhelper['source_name']];
875
		    	} else {
876
				$source_name = $opt[$rowhelper['name']];
877
		    	}
878
		  	if($rowhelper['source_value']) {
879
				$source_value = $opt[$rowhelper['source_value']];
880
		  	} else {
881
				$source_value = $opt[$rowhelper['value']];
882
		  	}
883
			if($source_value == $value) 
884
				$selected = " SELECTED";
885
			$text .= "<option value='" . $source_value . "'" . $selected . ">" . $source_name . "</option>";
886
			echo "<option value='" . $source_value . "'" . $selected . ">" . $source_name . "</option>\n";
887
		}
888
		echo "</select>\n";		
889
	}
890
}
891

    
892
function fixup_string($string) {
893
	global $config;
894
	// fixup #1: $myurl -> http[s]://ip_address:port/
895
	$https = "";
896
	$port = $config['system']['webguiport'];
897
	if($port <> "443" and $port <> "80")
898
		$urlport = ":" . $port;
899
	else
900
		$urlport = "";
901

    
902
	if($config['system']['webgui']['protocol'] == "https") $https = "s";
903
	$myurl = "http" . $https . "://" . getenv("HTTP_HOST") . $urlport;
904
	$newstring = str_replace("\$myurl", $myurl, $string);
905
	$string = $newstring;
906
	// fixup #2: $wanip
907
	$curwanip = get_interface_ip();
908
	$newstring = str_replace("\$wanip", $curwanip, $string);
909
	$string = $newstring;
910
	// fixup #3: $lanip
911
	$lancfg = $config['interfaces']['lan'];
912
	$lanip = $lancfg['ipaddr'];
913
	$newstring = str_replace("\$lanip", $lanip, $string);
914
	$string = $newstring;
915
	// fixup #4: fix'r'up here.
916
	return $newstring;
917
}
918

    
919
/*
920
 *  Parse templates if they are defined
921
 */
922
function parse_package_templates() {
923
	global $pkg, $config;
924
	$rows = 0;
925
	if($pkg['templates']['template'] <> "")
926
	    foreach($pkg['templates']['template'] as $pkg_template_row) {
927
		$filename = $pkg_template_row['filename'];
928
		$template_text = $pkg_template_row['templatecontents'];
929
		$firstfield = "";
930
		/* calculate total row helpers count */
931
		foreach ($pkg['fields']['field'] as $fields) {
932
			if($fields['type'] == "rowhelper") {
933
				// save rowhelper items.
934
                                $row_helper_total_rows = 0;
935
				for($x=0; $x<99; $x++) { // XXX: this really should be passed from the form.
936
					foreach($fields['rowhelper']['rowhelperfield'] as $rowhelperfield) {
937
						if($firstfield == "")  {
938
						  $firstfield = $rowhelperfield['fieldname'];
939
						} else {
940
						  if($firstfield == $rowhelperfield['fieldname']) $rows++;
941
						}
942
						$comd = "\$value = \$_POST['" . $rowhelperfield['fieldname'] . $x . "'];";
943
						$value = "";
944
						eval($comd);
945
						if($value <> "") {
946
						    //$template_text = str_replace($fieldname . "_fieldvalue", $fieldvalue, $template_text);
947
						} else {
948
						    $row_helper_total_rows = $rows;
949
						    break;
950
						}
951
					}
952
				}
953
			}
954
		}
955

    
956
		/* replace $domain_total_rows with total rows */
957
		$template_text = str_replace("$domain_total_rows", $row_helper_total_rows, $template_text);
958

    
959
		/* change fields defined as fieldname_fieldvalue to their value */
960
		foreach ($pkg['fields']['field'] as $fields) {
961
			if($fields['type'] == "rowhelper") {
962
				// save rowhelper items.
963
				for($x=0; $x<99; $x++) { // XXX: this really should be passed from the form.
964
					$row_helper_data = "";
965
					$isfirst = 0;
966
					foreach($fields['rowhelper']['rowhelperfield'] as $rowhelperfield) {
967
						if($firstfield == "")  {
968
						  $firstfield = $rowhelperfield['fieldname'];
969
						} else {
970
						  if($firstfield == $rowhelperfield['fieldname']) $rows++;
971
						}
972
						$comd = "\$value = \$_POST['" . $rowhelperfield['fieldname'] . $x . "'];";
973
						eval($comd);
974
						if($value <> "") {
975
						    if($isfirst == 1) $row_helper_data .= "  " ;
976
						    $row_helper_data .= $value;
977
						    $isfirst = 1;
978
						}
979
						$sep = "";
980
						ereg($rowhelperfield['fieldname'] . "_fieldvalue\[(.*)\]", $template_text, $sep);
981
						foreach ($sep as $se) $seperator = $se;
982
						if($seperator <> "") {
983
						    $row_helper_data = ereg_replace("  ", $seperator, $row_helper_data);
984
						    $template_text = ereg_replace("\[" . $seperator . "\]", "", $template_text);
985
						}
986
						$template_text = str_replace($rowhelperfield['fieldname'] . "_fieldvalue", $row_helper_data, $template_text);
987
					}
988
				}
989
			} else {
990
				$fieldname  = $fields['fieldname'];
991
				$fieldvalue = $_POST[$fieldname];
992
				$template_text = str_replace($fieldname . "_fieldvalue", $fieldvalue, $template_text);
993
			}
994
		}
995

    
996
		/* replace cr's */
997
		$template_text = str_replace("\\n", "\n", $template_text);
998

    
999
		/* write out new template file */
1000
		$fout = fopen($filename,"w");
1001
		fwrite($fout, $template_text);
1002
		fclose($fout);
1003
	    }
1004
}
1005

    
1006
/* Return html div fields */
1007
function display_advanced_field($fieldname) {
1008
	$div = "<div id='showadv_" . $fieldname . "'>\n";
1009
	$div .= "<input type='button' onClick='show_" . $fieldname . "()' value='" . gettext("Advanced") . "'></input> - " . gettext("Show advanced option") ."</div>\n";
1010
	$div .= "<div id='show_" . $fieldname . "' style='display:none'>\n";
1011
	return $div;
1012
}
1013

    
1014
?>
(116-116/219)