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
							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)) { 
799
				echo $advanced;
800
?>
801
	<tr>
802
		<td width="22%" valign="top">&nbsp;</td>
803
		<td width="78%">
804
			<input name="Submit" type="submit" class="formbtn" value="<?= $savevalue ?>">
805
			<?php if (!$only_edit): ?>
806
				<input class="formbtn" type="button" value="<?=gettext("Cancel");?>" onclick="history.back()">
807
			<?php endif; ?>
808
		</td>
809
	</tr>
810
<?php
811
		}
812
?>
813
</table>
814
</div></tr></td>
815
</table>
816
</form>
817

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

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

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

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

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

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

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

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

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

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

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

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

    
1013
?>
(116-116/219)