Project

General

Profile

Download (36.2 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">
265
<?php if($pkg['fields']['field'] <> "") { ?>
266
<script language="JavaScript">
267
<!--
268

    
269
	window.onDomReady = DomReady;
270
	function DomReady(fn) {
271
		if(document.addEventListener) { //W3C
272
			document.addEventListener("DOMContentLoaded", fn, false);
273
		} else { // IE
274
			document.onreadystatechange = function(){readyState(fn)}
275
		}
276
	}
277
	function readyState(fn) {
278
		//dom is ready for interaction
279
		if(document.readyState == "complete") {
280
			fn();
281
		}
282
	}
283
								        
284
	window.onDomReady(enablechange);
285

    
286
function enablechange() {
287
<?php
288
foreach ($pkg['fields']['field'] as $field) {
289
	if (isset($field['enablefields']) or isset($field['checkenablefields'])) {
290
		echo "\tif (document.iform.elements[\"{$field['fieldname']}\"].checked == false) {\n";
291

    
292
		if (isset($field['enablefields'])) {
293
			foreach (explode(',', $field['enablefields']) as $enablefield) {
294
				echo "\t\tif(document.iform.elements[\"$enablefield\"]){\n";
295
				echo "\t\t\tdocument.iform.elements[\"$enablefield\"].disabled = 1;\n";
296
				echo "\t\t}else{\n";
297
				echo "\t\t\tdocument.iform.elements[\"$enablefield".'[]'."\"].disabled = 1;\n";
298
				echo "\t\t}\n";
299
			}
300
		}
301

    
302
		if (isset($field['checkenablefields'])) {
303
			foreach (explode(',', $field['checkenablefields']) as $checkenablefield) {
304
				echo "\t\tif(document.iform.elements[\"$checkenablefield\"]){\n";
305
				echo "\t\t\tdocument.iform.elements[\"$checkenablefield\"].checked = 0;\n";
306
				echo "\t\t}else{\n";
307
				echo "\t\t\tdocument.iform.elements[\"$checkenablefield".'[]'."\"].checked = 0;\n";
308
				echo "\t\t}\n";
309
			}
310
		}
311

    
312
		echo "\t}\n\telse {\n";
313

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

    
324
		if (isset($field['checkenablefields'])) {
325
			foreach(explode(',', $field['checkenablefields']) as $checkenablefield) {
326
				echo "\t\tif(document.iform.elements[\"$checkenablefield\"]){\n";
327
				echo "\t\t\tdocument.iform.elements[\"$checkenablefield\"].checked = 1;\n";
328
				echo "\t\t}else{\n";
329
				echo "\t\t\tdocument.iform.elements[\"$checkenablefield".'[]'."\"].checked = 1;\n";
330
				echo "\t\t}\n";
331
			}
332
		}
333

    
334
		echo "\t}\n";
335
	}
336
}
337
?>
338
}
339
//-->
340
</script>
341
<?php } ?>
342
<script type="text/javascript" language="javascript" src="/javascript/row_helper_dynamic.js">
343
</script>
344

    
345
<?php include("fbegin.inc"); ?>
346
<?php if (!empty($input_errors)) print_input_errors($input_errors); ?>
347
<form name="iform" action="pkg_edit.php" method="post">
348
<input type="hidden" name="xml" value="<?= $xml ?>">
349
<?php if ($savemsg) print_info_box($savemsg); ?>
350
<table width="100%" border="0" cellpadding="0" cellspacing="0">
351
<?php
352
if ($pkg['tabs'] <> "") {
353
	$tab_array = array();
354
	foreach($pkg['tabs']['tab'] as $tab) {
355
		if($tab['tab_level'])
356
			$tab_level = $tab['tab_level'];
357
		else
358
			$tab_level = 1;
359
		if(isset($tab['active'])) {
360
			$active = true;
361
		} else {
362
			$active = false;
363
		}
364
		$urltmp = "";
365
		if($tab['url'] <> "") $urltmp = $tab['url'];
366
		if($tab['xml'] <> "") $urltmp = "pkg_edit.php?xml=" . $tab['xml'];
367

    
368
 		$addresswithport = getenv("HTTP_HOST");
369
		$colonpos = strpos($addresswithport, ":");
370
		if ($colonpos !== False) {
371
			//my url is actually just the IP address of the pfsense box
372
			$myurl = substr($addresswithport, 0, $colonpos);
373
		} else {
374
			$myurl = $addresswithport;
375
		}
376
		// eval url so that above $myurl item can be processed if need be.
377
		$url = str_replace('$myurl', $myurl, $urltmp);
378

    
379
		$tab_array[$tab_level][] = array(
380
						$tab['text'],
381
						$active,
382
						$url
383
					);
384
    	}
385

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

    
410
	foreach ($pkg['fields']['field'] as $pkga) {
411
		if ($pkga['type'] == "sorting") 
412
			continue;
413

    
414
		if ($pkga['type'] == "listtopic") {
415
			if(isset($pkga['advancedfield']) && $adv_enabled) {
416
				$advanced .= "<td>&nbsp;</td>";
417
				$advanced .= "<tr><td colspan=\"2\" class=\"listtopic\">" . $pkga['name'] . "<br></td></tr>\n";
418
			} else {
419
				echo "<td>&nbsp;</td>";
420
				echo "<tr><td colspan=\"2\" class=\"listtopic\">" . $pkga['name'] . "<br></td></tr>\n";
421
			}
422
			continue;
423
		}	
424
	
425
		if(!$pkga['combinefieldsend']) {
426
			if(isset($pkga['advancedfield']) && $adv_enabled)
427
				$advanced .= "<tr valign=\"top\">";
428
			else
429
		  		echo "<tr valign=\"top\">";
430
		}
431

    
432
		$size = "";
433

    
434
		if(!$pkga['dontdisplayname']) {
435
			unset($req);
436
			if (isset($pkga['required']))
437
				$req = 'req';
438
			if(isset($pkga['advancedfield']) && $adv_enabled) {
439
				$advanced .= "<td width=\"22%\" class=\"vncell{$req}\">";
440
				$advanced .= fixup_string($pkga['fielddescr']);
441
				$advanced .= "</td>";
442
			} else {
443
				echo "<td width=\"22%\" class=\"vncell{$req}\">";
444
				echo fixup_string($pkga['fielddescr']);
445
				echo "</td>";
446
			}
447
		}
448

    
449
		if(!$pkga['dontcombinecells'])
450
			if(isset($pkga['advancedfield']) && $adv_enabled)
451
				$advanced .= "<td class=\"vtable\">";
452
			else
453
				echo "<td class=\"vtable\">";
454
		// if user is editing a record, load in the data.
455
		$fieldname = $pkga['fieldname'];
456
		if ($get_from_post) {
457
			$value = $_POST[$fieldname];
458
			if (is_array($value)) $value = implode(',', $value);
459
		} else {
460
			if (isset($id) && $a_pkg[$id])
461
				$value = $a_pkg[$id][$fieldname];
462
			else
463
				$value = $pkga['default_value'];
464
		}
465

    
466
		if($pkga['type'] == "input") {
467
			if($pkga['size']) $size = " size='" . $pkga['size'] . "' ";
468
			if(isset($pkga['advancedfield']) && $adv_enabled) {
469
				$js_array[] = $pkga['fieldname'];
470
				$advanced .= display_advanced_field($pkga['fieldname']);
471
				$advanced .= "<input " . $size . " id='" . $pkga['fieldname'] . "' name='" . $pkga['fieldname'] . "' class='formfld unknown' value='" . $value . "'>\n";
472
				$advanced .= "<br>" . fixup_string($pkga['description']) . "\n";
473
				$advanced .= "</div>\n";
474
			} else {
475
				echo "<input " . $size . " id='" . $pkga['fieldname'] . "' name='" . $pkga['fieldname'] . "' class='formfld unknown' value='" . $value . "'>\n";
476
				echo "<br>" . fixup_string($pkga['description']) . "\n";
477
			}
478
		} else if($pkga['type'] == "password") {
479
			if($pkga['size']) $size = " size='" . $pkga['size'] . "' ";		
480
			if(isset($pkga['advancedfield']) && $adv_enabled) {
481
				$js_array[] = $pkga['fieldname'];
482
				$advanced .= display_advanced_field($pkga['fieldname']);
483
				$advanced .= "<input " . $size . " id='" . $pkga['fieldname'] . "' type='password' " . $size . " name='" . $pkga['fieldname'] . "' class='formfld pwd' value='" . $value . "'>\n";
484
				$advanced .= "<br>" . fixup_string($pkga['description']) . "\n";
485
				$advanced .= "</div>\n";
486
			} else {
487
				echo "<input " . $size . " id='" . $pkga['fieldname'] . "' type='password' " . $size . " name='" . $pkga['fieldname'] . "' class='formfld pwd' value='" . $value . "'>\n";
488
				echo "<br>" . fixup_string($pkga['description']) . "\n";
489
			}
490
		} else if($pkga['type'] == "select") {
491
			$fieldname = $pkga['fieldname'];
492
			if (isset($pkga['multiple'])) {
493
      	$multiple = 'multiple="multiple"';
494
				$items = explode(',', $value);
495
				$fieldname .= "[]";
496
			} else {
497
				$multiple = '';
498
				$items = array($value);
499
			}
500
			$size = (isset($pkga['size']) ? "size=\"{$pkga['size']}\"" : '');
501
			$onchange = (isset($pkga['onchange']) ? "onchange=\"{$pkga['onchange']}\"" : '');
502

    
503
			if(isset($pkga['advancedfield']) && $adv_enabled) {
504
				$js_array[] = $pkga['fieldname'];
505
				$advanced .= display_advanced_field($pkga['fieldname']);
506
				$advanced .= "<select id='" . $pkga['fieldname'] . "' $multiple $size $onchange id=\"$fieldname\" name=\"$fieldname\">\n";
507
				foreach ($pkga['options']['option'] as $opt) {
508
					$selected = '';
509
					if (in_array($opt['value'], $items)) $selected = 'selected="selected"';
510
						$advanced .= "\t<option name=\"{$opt['name']}\" value=\"{$opt['value']}\" $selected>{$opt['name']}</option>\n";
511
				}
512
				$advanced .= "</select>\n<br />\n" . fixup_string($pkga['description']) . "\n";
513
				$advanced .= "</div>\n";
514
			} else {
515
				echo "<select id='" . $pkga['fieldname'] . "' $multiple $size $onchange id=\"$fieldname\" name=\"$fieldname\">\n";
516
				foreach ($pkga['options']['option'] as $opt) {
517
					$selected = '';
518
					if (in_array($opt['value'], $items)) $selected = 'selected="selected"';
519
					echo "\t<option name=\"{$opt['name']}\" value=\"{$opt['value']}\" $selected>{$opt['name']}</option>\n";
520
				}
521
				echo "</select>\n<br />\n" . fixup_string($pkga['description']) . "\n";
522
			}
523

    
524
		} else if($pkga['type'] == "select_source") {
525
			$fieldname = $pkga['fieldname'];
526
			if (isset($pkga['multiple'])) {
527
				$multiple = 'multiple="multiple"';
528
				$items = explode(',', $value);
529
				$fieldname .= "[]";
530
			} else {
531
				$multiple = '';
532
				$items = array($value);
533
			}
534
			$size = (isset($pkga['size']) ? "size=\"{$pkga['size']}\"" : '');
535
			$onchange = (isset($pkga['onchange']) ? "onchange=\"{$pkga['onchange']}\"" : '');
536

    
537
			if(isset($pkga['advancedfield']) && $adv_enabled) {
538
				$js_array[] = $pkga['fieldname'];
539
				$advanced .= display_advanced_field($pkga['fieldname']);
540
				$advanced .= "<select id='" . $pkga['fieldname'] . "' $multiple $size $onchange id=\"{$fieldname}\" name=\"{$fieldname}\">\n";
541
				$advanced .= "</div>\n";
542
			} else {
543
				echo "<select id='" . $pkga['fieldname'] . "' $multiple $size $onchange id=\"$fieldname\" name=\"$fieldname\">\n";
544
			}
545
			$source_url = $pkga['source'];
546
			eval("\$pkg_source_txt = &$source_url;");
547
			foreach ($pkg_source_txt as $opt) {
548
				$selected = '';
549
				if($pkga['source_name']) {
550
					$source_name = $opt[$pkga['source_name']];
551
				} else {
552
					$source_name = $opt[$pkga['name']];
553
				}
554
				if($pkga['source_value']) {
555
					$source_value = $opt[$pkga['source_value']];
556
				} else {
557
					$source_value = $opt[$pkga['value']];
558
				}
559
				if (in_array($source_value, $items)) $selected = 'selected="selected"';
560
					if(isset($pkga['advancedfield']) && $adv_enabled)
561
						$advanced .= "\t<option name=\"{$source_name}\" value=\"{$source_value}\" $selected>{$source_name}</option>\n";
562
					else
563
						echo "\t<option name=\"{$source_name}\" value=\"{$source_value}\" $selected>{$source_name}</option>\n";
564
			}
565

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

    
683
				echo "<tr>";
684
				  // XXX: traverse saved fields, add back needed rows.
685
				echo "</tr>";
686

    
687
				echo "<tr>\n";
688
				$rowcounter = 0;
689
				$trc = 0;
690
				if(isset($a_pkg[$id]['row'])) {
691
					foreach($a_pkg[$id]['row'] as $row) {
692
					/*
693
					 * loop through saved data for record if it exists, populating rowhelper
694
					 */
695
						foreach($pkga['rowhelper']['rowhelperfield'] as $rowhelper) {
696
							unset($value);
697
							if($rowhelper['value'] <> "") $value = $rowhelper['value'];
698
							$fieldname = $rowhelper['fieldname'];
699
							// if user is editing a record, load in the data.
700
							if (isset($id) && $a_pkg[$id]) {
701
								$value = $row[$fieldname];
702
							}
703
							$options = "";
704
							$type = $rowhelper['type'];
705
							$fieldname = $rowhelper['fieldname'];
706
							if($type == "option")
707
								$options = &$rowhelper['options']['option'];
708
							if($rowhelper['size']) 
709
								$size = $rowhelper['size'];
710
							else if ($pkga['size'])
711
								$size = $pkga['size'];
712
							else
713
								$size = "8";
714
							display_row($rowcounter, $value, $fieldname, $type, $rowhelper, $size);
715
							// javascript helpers for row_helper_dynamic.js
716
							echo "</td>\n";
717
							echo "<script language=\"JavaScript\">\n";
718
							echo "<!--\n";
719
							echo "newrow[" . $trc . "] = \"" . $text . "\";\n";
720
							echo "-->\n";
721
							echo "</script>\n";
722
							$text = "";
723
							$trc++;
724
						}
725

    
726
						$rowcounter++;
727
						echo "<td>";
728
						echo "<input type=\"image\" src=\"./themes/".$g['theme']."/images/icons/icon_x.gif\" onclick=\"removeRow(this); return false;\" value=\"" . gettext("Delete") . "\">";
729
						echo "</td>\n";
730
						echo "</tr>\n";
731
					}
732
				}
733
				if($trc == 0) {
734
					/*
735
					 *  no records loaded.
736
                                         *  just show a generic line non-populated with saved data
737
                                         */
738
                                        foreach($pkga['rowhelper']['rowhelperfield'] as $rowhelper) {
739
						if($rowhelper['value'] <> "") $value = $rowhelper['value'];
740
						$fieldname = $rowhelper['fieldname'];
741
						$options = "";
742
						$type = $rowhelper['type'];
743
						$fieldname = $rowhelper['fieldname'];
744
						if($type == "option") $options = &$rowhelper['options']['option'];
745
						if($rowhelper['size'] <> "")
746
							$size = $rowhelper['size'];
747
						else if ($pkga['size'])
748
							$size = $pkga['size'];
749
						else
750
							$size = 8;
751
						display_row($rowcounter, $value, $fieldname, $type, $rowhelper, $size);
752
						// javascript helpers for row_helper_dynamic.js
753
						echo "</td>\n";
754
						echo "<script language=\"JavaScript\">\n";
755
						echo "<!--\n";
756
						echo "newrow[" . $trc . "] = \"" . $text . "\";\n";
757
						echo "-->\n";
758
						echo "</script>\n";
759
						$text = "";
760
						$trc++;
761
					}
762

    
763
					$rowcounter++;
764
					echo "<td>";
765
					echo "<input type=\"image\" src=\"./themes/".$g['theme']."/images/icons/icon_x.gif\" onclick=\"removeRow(this); return false;\" value=\"" . gettext("Delete") . "\">";
766
					echo "</td>\n";
767
					echo "</tr>\n";
768
				}
769
			?>
770

    
771
			  <tbody></tbody>
772
			</table>
773

    
774
		<?php if ($pkga['size']): ?>
775
			<br><a onClick="javascript:addRowTo('maintable', <?=$pkga['size'];?>); return false;" href="#"><img border="0" src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif"></a>
776
		<?php else: ?>
777
			<br><a onClick="javascript:addRowTo('maintable'); return false;" href="#"><img border="0" src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif"></a>
778
		<?php endif; ?>
779
		<script language="JavaScript">
780
		<!--
781
		field_counter_js = <?= $fieldcounter ?>;
782
		rows = <?= $rowcounter ?>;
783
		totalrows = <?php echo $rowcounter; ?>;
784
		loaded = <?php echo $rowcounter; ?>;
785
		//typesel_change();
786
		//-->
787
		</script>
788

    
789
		<?php
790
	      }
791
	      if($pkga['typehint']) echo " " . $pkga['typehint'];
792
	     ?>
793

    
794
      <?php
795
	  if(!$pkga['combinefieldsbegin']) echo "</td></tr>";
796
      $i++;
797
  }
798
 ?>
799
  <tr>
800
	<td>&nbsp;</td>
801
  </tr>
802
  <tr>
803
    <td width="22%" valign="top">&nbsp;</td>
804
    <td width="78%">
805
<?php
806
if($pkg['note'] != "")
807
	echo "<p><span class=\"red\"><strong>" . gettext("Note") . ":</strong></span> {$pkg['note']}</p>";
808
//if (isset($id) && $a_pkg[$id]) // We'll always have a valid ID in our hands
809
      echo "<input name=\"id\" type=\"hidden\" value=\"$id\">";
810
?>
811
      <input name="Submit" type="submit" class="formbtn" value="<?= $savevalue ?>">
812
<?php if (!$only_edit): ?>
813
      <input class="formbtn" type="button" value="<?=gettext("Cancel");?>" onclick="history.back()">
814
<?php endif; ?>
815
    </td>
816
  </tr>
817
<?php if (isset($advanced)) { 
818
				echo $advanced;
819
?>
820
	<tr>
821
		<td width="22%" valign="top">&nbsp;</td>
822
		<td width="78%">
823
			<input name="Submit" type="submit" class="formbtn" value="<?= $savevalue ?>">
824
			<?php if (!$only_edit): ?>
825
				<input class="formbtn" type="button" value="<?=gettext("Cancel");?>" onclick="history.back()">
826
			<?php endif; ?>
827
		</td>
828
	</tr>
829
<?php
830
		}
831
?>
832
</table>
833
</div></tr></td>
834
</table>
835
</form>
836

    
837
<?php if ($pkg['custom_php_after_form_command']) eval($pkg['custom_php_after_form_command']); ?>
838

    
839
<?php
840
	/* JavaScript to handle the advanced fields. */
841
	if ($pkg['advanced_options'] == "enabled") {
842
		echo "<script type=\"text/javascript\">\n";
843
		foreach($js_array as $advfieldname) {
844
			echo "function show_" . $advfieldname . "() {\n";
845
			echo "document.getElementById('showadv_{$advfieldname}').innerHTML='';\n";
846
			echo "aodiv = document.getElementById('show_{$advfieldname}');\n";
847
			echo "aodiv.style.display = 'block';\n";
848
			echo "}\n\n";
849
		}
850
		echo "</script>\n";
851
	}
852
?>
853

    
854
<?php include("fend.inc"); ?>
855
</body>
856
</html>
857

    
858
<?php
859
/*
860
 * ROW Helpers function
861
 */
862
function display_row($trc, $value, $fieldname, $type, $rowhelper, $size) {
863
	global $text, $config;
864
	echo "<td>\n";
865
	if($type == "input") {
866
		echo "<input size='" . $size . "' name='" . $fieldname . $trc . "' id='" . $fieldname . $trc . "' value='" . $value . "'>\n";
867
	} else if($type == "checkbox") {
868
		if($value)
869
			echo "<input size='" . $size . "' type='checkbox' id='" . $fieldname . $trc . "' name='" . $fieldname . $trc . "' value='ON' CHECKED>\n";
870
		else
871
			echo "<input size='" . $size . "' type='checkbox' id='" . $fieldname . $trc . "' name='" . $fieldname . $trc . "' value='ON'>\n";
872
	} else if($type == "password") {
873
		echo "<input size='" . $size . "' type='password' id='" . $fieldname . $trc . "' name='" . $fieldname . $trc . "' class='formfld pwd' value='" . $value . "'>\n";
874
	} else if($type == "textarea") {
875
		echo "<textarea rows='2' cols='12' id='" . $fieldname . $trc . "' class='formfld unknown' name='" . $fieldname . $trc . "'>" . $value . "</textarea>\n";
876
	} else if($type == "select") {
877
		echo "<select id='" . $fieldname . $trc . "' name='" . $fieldname . $trc . "'>\n";
878
		foreach($rowhelper['options']['option'] as $rowopt) {
879
			$selected = "";
880
			if($rowopt['value'] == $value) $selected = " SELECTED";
881
			$text .= "<option value='" . $rowopt['value'] . "'" . $selected . ">" . $rowopt['name'] . "</option>";
882
			echo "<option value='" . $rowopt['value'] . "'" . $selected . ">" . $rowopt['name'] . "</option>\n";
883
		}
884
		echo "</select>\n";
885
	} else if($type == "select_source") {
886
		echo "<select id='" . $fieldname . $trc . "' name='" . $fieldname . $trc . "'>\n";
887
		$source_url = $rowhelper['source'];
888
		eval("\$pkg_source_txt = &$source_url;");
889
		foreach($pkg_source_txt as $opt) {
890
			$selected = "";
891
			if($rowhelper['source_name']) {
892
				$source_name = $opt[$rowhelper['source_name']];
893
		    	} else {
894
				$source_name = $opt[$rowhelper['name']];
895
		    	}
896
		  	if($rowhelper['source_value']) {
897
				$source_value = $opt[$rowhelper['source_value']];
898
		  	} else {
899
				$source_value = $opt[$rowhelper['value']];
900
		  	}
901
			if($source_value == $value) 
902
				$selected = " SELECTED";
903
			$text .= "<option value='" . $source_value . "'" . $selected . ">" . $source_name . "</option>";
904
			echo "<option value='" . $source_value . "'" . $selected . ">" . $source_name . "</option>\n";
905
		}
906
		echo "</select>\n";		
907
	}
908
}
909

    
910
function fixup_string($string) {
911
	global $config;
912
	// fixup #1: $myurl -> http[s]://ip_address:port/
913
	$https = "";
914
	$port = $config['system']['webguiport'];
915
	if($port <> "443" and $port <> "80")
916
		$urlport = ":" . $port;
917
	else
918
		$urlport = "";
919

    
920
	if($config['system']['webgui']['protocol'] == "https") $https = "s";
921
	$myurl = "http" . $https . "://" . getenv("HTTP_HOST") . $urlport;
922
	$newstring = str_replace("\$myurl", $myurl, $string);
923
	$string = $newstring;
924
	// fixup #2: $wanip
925
	$curwanip = get_interface_ip();
926
	$newstring = str_replace("\$wanip", $curwanip, $string);
927
	$string = $newstring;
928
	// fixup #3: $lanip
929
	$lancfg = $config['interfaces']['lan'];
930
	$lanip = $lancfg['ipaddr'];
931
	$newstring = str_replace("\$lanip", $lanip, $string);
932
	$string = $newstring;
933
	// fixup #4: fix'r'up here.
934
	return $newstring;
935
}
936

    
937
/*
938
 *  Parse templates if they are defined
939
 */
940
function parse_package_templates() {
941
	global $pkg, $config;
942
	$rows = 0;
943
	if($pkg['templates']['template'] <> "")
944
	    foreach($pkg['templates']['template'] as $pkg_template_row) {
945
		$filename = $pkg_template_row['filename'];
946
		$template_text = $pkg_template_row['templatecontents'];
947
		$firstfield = "";
948
		/* calculate total row helpers count */
949
		foreach ($pkg['fields']['field'] as $fields) {
950
			if($fields['type'] == "rowhelper") {
951
				// save rowhelper items.
952
                                $row_helper_total_rows = 0;
953
				for($x=0; $x<99; $x++) { // XXX: this really should be passed from the form.
954
					foreach($fields['rowhelper']['rowhelperfield'] as $rowhelperfield) {
955
						if($firstfield == "")  {
956
						  $firstfield = $rowhelperfield['fieldname'];
957
						} else {
958
						  if($firstfield == $rowhelperfield['fieldname']) $rows++;
959
						}
960
						$comd = "\$value = \$_POST['" . $rowhelperfield['fieldname'] . $x . "'];";
961
						$value = "";
962
						eval($comd);
963
						if($value <> "") {
964
						    //$template_text = str_replace($fieldname . "_fieldvalue", $fieldvalue, $template_text);
965
						} else {
966
						    $row_helper_total_rows = $rows;
967
						    break;
968
						}
969
					}
970
				}
971
			}
972
		}
973

    
974
		/* replace $domain_total_rows with total rows */
975
		$template_text = str_replace("$domain_total_rows", $row_helper_total_rows, $template_text);
976

    
977
		/* change fields defined as fieldname_fieldvalue to their value */
978
		foreach ($pkg['fields']['field'] as $fields) {
979
			if($fields['type'] == "rowhelper") {
980
				// save rowhelper items.
981
				for($x=0; $x<99; $x++) { // XXX: this really should be passed from the form.
982
					$row_helper_data = "";
983
					$isfirst = 0;
984
					foreach($fields['rowhelper']['rowhelperfield'] as $rowhelperfield) {
985
						if($firstfield == "")  {
986
						  $firstfield = $rowhelperfield['fieldname'];
987
						} else {
988
						  if($firstfield == $rowhelperfield['fieldname']) $rows++;
989
						}
990
						$comd = "\$value = \$_POST['" . $rowhelperfield['fieldname'] . $x . "'];";
991
						eval($comd);
992
						if($value <> "") {
993
						    if($isfirst == 1) $row_helper_data .= "  " ;
994
						    $row_helper_data .= $value;
995
						    $isfirst = 1;
996
						}
997
						$sep = "";
998
						ereg($rowhelperfield['fieldname'] . "_fieldvalue\[(.*)\]", $template_text, $sep);
999
						foreach ($sep as $se) $seperator = $se;
1000
						if($seperator <> "") {
1001
						    $row_helper_data = ereg_replace("  ", $seperator, $row_helper_data);
1002
						    $template_text = ereg_replace("\[" . $seperator . "\]", "", $template_text);
1003
						}
1004
						$template_text = str_replace($rowhelperfield['fieldname'] . "_fieldvalue", $row_helper_data, $template_text);
1005
					}
1006
				}
1007
			} else {
1008
				$fieldname  = $fields['fieldname'];
1009
				$fieldvalue = $_POST[$fieldname];
1010
				$template_text = str_replace($fieldname . "_fieldvalue", $fieldvalue, $template_text);
1011
			}
1012
		}
1013

    
1014
		/* replace cr's */
1015
		$template_text = str_replace("\\n", "\n", $template_text);
1016

    
1017
		/* write out new template file */
1018
		$fout = fopen($filename,"w");
1019
		fwrite($fout, $template_text);
1020
		fclose($fout);
1021
	    }
1022
}
1023

    
1024
/* Return html div fields */
1025
function display_advanced_field($fieldname) {
1026
	$div = "<div id='showadv_" . $fieldname . "'>\n";
1027
	$div .= "<input type='button' onClick='show_" . $fieldname . "()' value='" . gettext("Advanced") . "'></input> - " . gettext("Show advanced option") ."</div>\n";
1028
	$div .= "<div id='show_" . $fieldname . "' style='display:none'>\n";
1029
	return $div;
1030
}
1031

    
1032
?>
(116-116/220)