Project

General

Profile

Download (35.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($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
							if($rowhelper['value'] <> "") $value = $rowhelper['value'];
679
							$fieldname = $rowhelper['fieldname'];
680
							// if user is editing a record, load in the data.
681
							if (isset($id) && $a_pkg[$id]) {
682
								$value = $row[$fieldname];
683
							}
684
							$options = "";
685
							$type = $rowhelper['type'];
686
							$fieldname = $rowhelper['fieldname'];
687
							if($type == "option")
688
								$options = &$rowhelper['options']['option'];
689
							if($rowhelper['size']) 
690
								$size = $rowhelper['size'];
691
							else if ($pkga['size'])
692
								$size = $pkga['size'];
693
							else
694
								$size = "8";
695
							display_row($rowcounter, $value, $fieldname, $type, $rowhelper, $size);
696
							// javascript helpers for row_helper_dynamic.js
697
							echo "</td>\n";
698
							echo "<script language=\"JavaScript\">\n";
699
							echo "<!--\n";
700
							echo "newrow[" . $trc . "] = \"" . $text . "\";\n";
701
							echo "-->\n";
702
							echo "</script>\n";
703
							$text = "";
704
							$trc++;
705
						}
706

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

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

    
752
			  <tbody></tbody>
753
			</table>
754

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

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

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

    
804
<?php if ($pkg['custom_php_after_form_command']) eval($pkg['custom_php_after_form_command']); ?>
805

    
806
<?php
807
	/* JavaScript to handle the advanced fields. */
808
	if ($pkg['advanced_options'] == "enabled") {
809
		echo "<script type=\"text/javascript\">\n";
810
		foreach($js_array as $advfieldname) {
811
			echo "function show_" . $advfieldname . "() {\n";
812
			echo "document.getElementById('showadv_{$advfieldname}').innerHTML='';\n";
813
			echo "aodiv = document.getElementById('show_{$advfieldname}');\n";
814
			echo "aodiv.style.display = 'block';\n";
815
			echo "}\n\n";
816
		}
817
		echo "</script>\n";
818
	}
819
?>
820

    
821
<?php include("fend.inc"); ?>
822
</body>
823
</html>
824

    
825
<?php
826
/*
827
 * ROW Helpers function
828
 */
829
function display_row($trc, $value, $fieldname, $type, $rowhelper, $size) {
830
	global $text, $config;
831
	echo "<td>\n";
832
	if($type == "input") {
833
		echo "<input size='" . $size . "' name='" . $fieldname . $trc . "' id='" . $fieldname . $trc . "' value='" . $value . "'>\n";
834
	} else if($type == "checkbox") {
835
		if($value)
836
			echo "<input size='" . $size . "' type='checkbox' id='" . $fieldname . $trc . "' name='" . $fieldname . $trc . "' value='ON' CHECKED>\n";
837
		else
838
			echo "<input size='" . $size . "' type='checkbox' id='" . $fieldname . $trc . "' name='" . $fieldname . $trc . "' value='ON'>\n";
839
	} else if($type == "password") {
840
		echo "<input size='" . $size . "' type='password' id='" . $fieldname . $trc . "' name='" . $fieldname . $trc . "' class='formfld pwd' value='" . $value . "'>\n";
841
	} else if($type == "textarea") {
842
		echo "<textarea rows='2' cols='12' id='" . $fieldname . $trc . "' class='formfld unknown' name='" . $fieldname . $trc . "'>" . $value . "</textarea>\n";
843
	} else if($type == "select") {
844
		echo "<select id='" . $fieldname . $trc . "' name='" . $fieldname . $trc . "'>\n";
845
		foreach($rowhelper['options']['option'] as $rowopt) {
846
			$selected = "";
847
			if($rowopt['value'] == $value) $selected = " SELECTED";
848
			$text .= "<option value='" . $rowopt['value'] . "'" . $selected . ">" . $rowopt['name'] . "</option>";
849
			echo "<option value='" . $rowopt['value'] . "'" . $selected . ">" . $rowopt['name'] . "</option>\n";
850
		}
851
		echo "</select>\n";
852
	} else if($type == "select_source") {
853
		echo "<select id='" . $fieldname . $trc . "' name='" . $fieldname . $trc . "'>\n";
854
		$source_url = $rowhelper['source'];
855
		eval("\$pkg_source_txt = &$source_url;");
856
		foreach($pkg_source_txt as $opt) {
857
			$selected = "";
858
			if($rowhelper['source_name']) {
859
				$source_name = $opt[$rowhelper['source_name']];
860
		    	} else {
861
				$source_name = $opt[$rowhelper['name']];
862
		    	}
863
		  	if($rowhelper['source_value']) {
864
				$source_value = $opt[$rowhelper['source_value']];
865
		  	} else {
866
				$source_value = $opt[$rowhelper['value']];
867
		  	}
868
			if($source_value == $value) 
869
				$selected = " SELECTED";
870
			$text .= "<option value='" . $source_value . "'" . $selected . ">" . $source_name . "</option>";
871
			echo "<option value='" . $source_value . "'" . $selected . ">" . $source_name . "</option>\n";
872
		}
873
		echo "</select>\n";		
874
	}
875
}
876

    
877
function fixup_string($string) {
878
	global $config;
879
	// fixup #1: $myurl -> http[s]://ip_address:port/
880
	$https = "";
881
	$port = $config['system']['webguiport'];
882
	if($port <> "443" and $port <> "80")
883
		$urlport = ":" . $port;
884
	else
885
		$urlport = "";
886

    
887
	if($config['system']['webgui']['protocol'] == "https") $https = "s";
888
	$myurl = "http" . $https . "://" . getenv("HTTP_HOST") . $urlport;
889
	$newstring = str_replace("\$myurl", $myurl, $string);
890
	$string = $newstring;
891
	// fixup #2: $wanip
892
	$curwanip = get_interface_ip();
893
	$newstring = str_replace("\$wanip", $curwanip, $string);
894
	$string = $newstring;
895
	// fixup #3: $lanip
896
	$lancfg = $config['interfaces']['lan'];
897
	$lanip = $lancfg['ipaddr'];
898
	$newstring = str_replace("\$lanip", $lanip, $string);
899
	$string = $newstring;
900
	// fixup #4: fix'r'up here.
901
	return $newstring;
902
}
903

    
904
/*
905
 *  Parse templates if they are defined
906
 */
907
function parse_package_templates() {
908
	global $pkg, $config;
909
	$rows = 0;
910
	if($pkg['templates']['template'] <> "")
911
	    foreach($pkg['templates']['template'] as $pkg_template_row) {
912
		$filename = $pkg_template_row['filename'];
913
		$template_text = $pkg_template_row['templatecontents'];
914
		$firstfield = "";
915
		/* calculate total row helpers count */
916
		foreach ($pkg['fields']['field'] as $fields) {
917
			if($fields['type'] == "rowhelper") {
918
				// save rowhelper items.
919
                                $row_helper_total_rows = 0;
920
				for($x=0; $x<99; $x++) { // XXX: this really should be passed from the form.
921
					foreach($fields['rowhelper']['rowhelperfield'] as $rowhelperfield) {
922
						if($firstfield == "")  {
923
						  $firstfield = $rowhelperfield['fieldname'];
924
						} else {
925
						  if($firstfield == $rowhelperfield['fieldname']) $rows++;
926
						}
927
						$comd = "\$value = \$_POST['" . $rowhelperfield['fieldname'] . $x . "'];";
928
						$value = "";
929
						eval($comd);
930
						if($value <> "") {
931
						    //$template_text = str_replace($fieldname . "_fieldvalue", $fieldvalue, $template_text);
932
						} else {
933
						    $row_helper_total_rows = $rows;
934
						    break;
935
						}
936
					}
937
				}
938
			}
939
		}
940

    
941
		/* replace $domain_total_rows with total rows */
942
		$template_text = str_replace("$domain_total_rows", $row_helper_total_rows, $template_text);
943

    
944
		/* change fields defined as fieldname_fieldvalue to their value */
945
		foreach ($pkg['fields']['field'] as $fields) {
946
			if($fields['type'] == "rowhelper") {
947
				// save rowhelper items.
948
				for($x=0; $x<99; $x++) { // XXX: this really should be passed from the form.
949
					$row_helper_data = "";
950
					$isfirst = 0;
951
					foreach($fields['rowhelper']['rowhelperfield'] as $rowhelperfield) {
952
						if($firstfield == "")  {
953
						  $firstfield = $rowhelperfield['fieldname'];
954
						} else {
955
						  if($firstfield == $rowhelperfield['fieldname']) $rows++;
956
						}
957
						$comd = "\$value = \$_POST['" . $rowhelperfield['fieldname'] . $x . "'];";
958
						eval($comd);
959
						if($value <> "") {
960
						    if($isfirst == 1) $row_helper_data .= "  " ;
961
						    $row_helper_data .= $value;
962
						    $isfirst = 1;
963
						}
964
						$sep = "";
965
						ereg($rowhelperfield['fieldname'] . "_fieldvalue\[(.*)\]", $template_text, $sep);
966
						foreach ($sep as $se) $seperator = $se;
967
						if($seperator <> "") {
968
						    $row_helper_data = ereg_replace("  ", $seperator, $row_helper_data);
969
						    $template_text = ereg_replace("\[" . $seperator . "\]", "", $template_text);
970
						}
971
						$template_text = str_replace($rowhelperfield['fieldname'] . "_fieldvalue", $row_helper_data, $template_text);
972
					}
973
				}
974
			} else {
975
				$fieldname  = $fields['fieldname'];
976
				$fieldvalue = $_POST[$fieldname];
977
				$template_text = str_replace($fieldname . "_fieldvalue", $fieldvalue, $template_text);
978
			}
979
		}
980

    
981
		/* replace cr's */
982
		$template_text = str_replace("\\n", "\n", $template_text);
983

    
984
		/* write out new template file */
985
		$fout = fopen($filename,"w");
986
		fwrite($fout, $template_text);
987
		fclose($fout);
988
	    }
989
}
990

    
991
/* Return html div fields */
992
function display_advanced_field($fieldname) {
993
	$div = "<div id='showadv_" . $fieldname . "'>\n";
994
	$div .= "<input type='button' onClick='show_" . $fieldname . "()' value='" . gettext("Advanced") . "'></input> - " . gettext("Show advanced option") ."</div>\n";
995
	$div .= "<div id='show_" . $fieldname . "' style='display:none'>\n";
996
	return $div;
997
}
998

    
999
?>
(116-116/219)