Project

General

Profile

Download (40.8 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/* $Id$ */
3
/*
4
    pkg_edit.php
5
    Copyright (C) 2013-2015 Electric Sheep Fencing, LP
6
    Copyright (C) 2004-2012 Scott Ullrich <sullrich@gmail.com>
7
    All rights reserved.
8

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

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

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

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

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

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

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

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

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

    
58
function domTT_title($title_msg){
59
	if (!empty($title_msg)){
60
		$title_msg=preg_replace("/\s+/"," ",$title_msg);
61
        $title_msg=preg_replace("/'/","\'",$title_msg);
62
		return "onmouseout=\"this.style.color = ''; domTT_mouseout(this, event);\" onmouseover=\"domTT_activate(this, event, 'content', '{$title_msg}', 'trail', true, 'delay', 0, 'fade', 'both', 'fadeMax', 93, 'delay',300,'styleClass', 'niceTitle');\"";
63
	}
64
}
65

    
66
$xml = htmlspecialchars($_GET['xml']);
67
if($_POST['xml']) $xml = htmlspecialchars($_POST['xml']);
68

    
69
$xml_fullpath = realpath('/usr/local/pkg/' . $xml);
70

    
71
if ($xml == "" || $xml_fullpath === false ||
72
    substr($xml_fullpath, 0, strlen('/usr/local/pkg/')) != '/usr/local/pkg/') {
73
            print_info_box_np(gettext("ERROR: No valid package defined."));
74
            die;
75
} else {
76
            $pkg = parse_xml_config_pkg($xml_fullpath, "packagegui");
77
}
78

    
79
if($pkg['include_file'] <> "") {
80
	require_once($pkg['include_file']);
81
}
82

    
83
if (!isset($pkg['adddeleteeditpagefields']))
84
	$only_edit = true;
85
else
86
	$only_edit = false;
87

    
88
$package_name = $pkg['menu'][0]['name'];
89
$section      = $pkg['menu'][0]['section'];
90
$config_path  = $pkg['configpath'];
91
$name         = $pkg['name'];
92
$title        = $pkg['title'];
93
$pgtitle      = $title;
94

    
95
$id = $_GET['id'];
96
if (isset($_POST['id']))
97
	$id = htmlspecialchars($_POST['id']);
98

    
99
// Not posting?  Then user is editing a record. There must be a valid id
100
// when editing a record.
101
if(!$id && !$_POST)
102
	$id = "0";
103

    
104
if(!is_numeric($id)) {
105
	header("Location: /");
106
	exit;
107
}
108

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

    
112
// grab the installedpackages->package_name section.
113
if($config['installedpackages'] && !is_array($config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config']))
114
	$config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config'] = array();
115

    
116
// If the first entry in the array is an empty <config/> tag, kill it.
117
if ($config['installedpackages'] && (count($config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config']) > 0) 
118
	&& ($config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config'][0] == ""))
119
	array_shift($config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config']);
120

    
121
$a_pkg = &$config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config'];
122

    
123
if($_GET['savemsg'] <> "")
124
	$savemsg = htmlspecialchars($_GET['savemsg']);
125

    
126
if($pkg['custom_php_command_before_form'] <> "")
127
	eval($pkg['custom_php_command_before_form']);
128

    
129
if ($_POST) {
130
	$firstfield = "";
131
	$rows = 0;
132

    
133
	$input_errors = array();
134
	$reqfields = array();
135
	$reqfieldsn = array();
136
	foreach ($pkg['fields']['field'] as $field) {
137
		if (($field['type'] == 'input') && isset($field['required'])) {
138
			if($field['fieldname'])
139
				$reqfields[] = $field['fieldname'];
140
			if($field['fielddescr'])
141
				$reqfieldsn[] = $field['fielddescr'];
142
		}
143
	}
144
	do_input_validation($_POST, $reqfields, $reqfieldsn, $input_errors);
145

    
146
	if ($pkg['custom_php_validation_command'])
147
		eval($pkg['custom_php_validation_command']);
148

    
149
	if($_POST['act'] == "del") {
150
		if($pkg['custom_delete_php_command']) {
151
		    if($pkg['custom_php_command_before_form'] <> "")
152
			    eval($pkg['custom_php_command_before_form']);
153
		    eval($pkg['custom_delete_php_command']);
154
		}
155
		write_config($pkg['delete_string']);
156
		// resync the configuration file code if defined.
157
		if($pkg['custom_php_resync_config_command'] <> "") {
158
			if($pkg['custom_php_command_before_form'] <> "")
159
				eval($pkg['custom_php_command_before_form']);
160
			eval($pkg['custom_php_resync_config_command']);
161
		}
162
	} else {
163
		if(!$input_errors && $pkg['custom_add_php_command']) {
164
			if($pkg['donotsave'] <> "" or $pkg['preoutput'] <> "") {
165
			?>
166

    
167
<?php include("head.inc"); ?>
168
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
169
<?php include("fbegin.inc"); ?>
170
<?php
171
			}
172
			if($pkg['preoutput']) echo "<pre>";
173
			eval($pkg['custom_add_php_command']);
174
			if($pkg['preoutput']) echo "</pre>";
175
		}
176
	}
177

    
178
	// donotsave is enabled.  lets simply exit.
179
	if(empty($pkg['donotsave'])) {
180

    
181
		// store values in xml configration file.
182
		if (!$input_errors) {
183
			$pkgarr = array();
184
			foreach ($pkg['fields']['field'] as $fields) {
185
				switch($fields['type']){
186
					case "rowhelper":
187
						// save rowhelper items.
188
						#$rowhelpername=($fields['fieldname'] ? $fields['fieldname'] : "row");
189
						$rowhelpername="row";
190
						foreach($fields['rowhelper']['rowhelperfield'] as $rowhelperfield)
191
							foreach($_POST as $key => $value){
192
								if (preg_match("/^{$rowhelperfield['fieldname']}(\d+)$/",$key,$matches))
193
									$pkgarr[$rowhelpername][$matches[1]][$rowhelperfield['fieldname']]=$value;
194
							}
195
						break;
196
					default:
197
						$fieldname  = $fields['fieldname'];
198
						if ($fieldname == "interface_array") {
199
							$fieldvalue = $_POST[$fieldname];
200
						} elseif (is_array($_POST[$fieldname])) {
201
							$fieldvalue = implode(',', $_POST[$fieldname]);
202
						} else {
203
							$fieldvalue = trim($_POST[$fieldname]);
204
							if ($fields['encoding'] == 'base64')
205
								$fieldvalue = base64_encode($fieldvalue);
206
						}
207
						if($fieldname)
208
							$pkgarr[$fieldname] = $fieldvalue;
209
					}
210
			}
211

    
212
			if (isset($id) && $a_pkg[$id])
213
				$a_pkg[$id] = $pkgarr;
214
			else
215
				$a_pkg[] = $pkgarr;
216

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

    
223
			if (isset($pkg['filter_rules_needed']))
224
				filter_configure();
225

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

    
231
			parse_package_templates();
232

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

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

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

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

    
264
$pgtitle = $title;
265

    
266
if ($pkg['custom_php_after_head_command']) {
267
	$closehead = false;
268
	include("head.inc");
269
	eval($pkg['custom_php_after_head_command']);
270
	echo "</head>\n";
271
}
272
else
273
	include("head.inc");
274

    
275
?>
276

    
277
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
278

    
279
<?php include("fbegin.inc"); ?>
280

    
281
<script type="text/javascript" src="/javascript/autosuggest.js?rev=1"></script>
282
<script type="text/javascript" src="/javascript/suggestions.js"></script>
283

    
284
<?php if($pkg['fields']['field'] <> "") { ?>
285
<script type="text/javascript">
286
//<![CDATA[
287
	//Everything inside it will load as soon as the DOM is loaded and before the page contents are loaded
288
	jQuery(document).ready(function() {
289
		
290
		//Sortable function
291
		jQuery('#mainarea table tbody').sortable({
292
			items: 'tr.sortable',
293
			cursor: 'move',
294
			distance: 10,
295
			opacity: 0.8,
296
			helper: function(e,ui){  
297
				ui.children().each(function(){  
298
					jQuery(this).width(jQuery(this).width());  
299
				});
300
			return ui;  
301
			},
302
		});
303
		
304
		//delete current line jQuery function
305
		jQuery('#maintable td .delete').live('click', function() {
306
			//do not remove first line
307
			if (jQuery("#maintable tr").length > 2){
308
				jQuery(this).parent().parent().remove();
309
				return false;
310
			}
311
	    });
312
	    
313
		//add new line jQuery function
314
		jQuery('#mainarea table .add').click(function() {
315
			//get table size and assign as new id
316
			var c_id=jQuery("#maintable tr").length;
317
			var new_row=jQuery("table#maintable tr:last").html().replace(/(name|id)="(\w+)(\d+)"/g,"$1='$2"+c_id+"'");
318
			//apply new id to created line rowhelperid
319
			jQuery("table#maintable tr:last").after("<tr>"+new_row+"<\/tr>");
320
			return false;
321
	    });
322
		// Call enablechange function
323
		enablechange();
324
	});
325

    
326
	function enablechange() {
327
	<?php
328
	foreach ($pkg['fields']['field'] as $field) {
329
		if (isset($field['enablefields']) or isset($field['checkenablefields'])) {
330
			echo "\tif (jQuery('form[name=\"iform\"] input[name=\"{$field['fieldname']}\"]').prop('checked') == false) {\n";
331

    
332
			if (isset($field['enablefields'])) {
333
				foreach (explode(',', $field['enablefields']) as $enablefield) {
334
					echo "\t\tif (jQuery('form[name=\"iform\"] input[name=\"{$enablefield}\"]').length > 0) {\n";
335
					echo "\t\t\tjQuery('form[name=\"iform\"] input[name=\"{$enablefield}\"]').prop('disabled',true);\n";
336
					echo "\t\t}\n";
337
				}
338
			}
339

    
340
			if (isset($field['checkenablefields'])) {
341
				foreach (explode(',', $field['checkenablefields']) as $checkenablefield) {
342
					echo "\t\tif (jQuery('form[name=\"iform\"] input[name=\"{$checkenablefield}\"]').length > 0) {\n";
343
					echo "\t\t\tjQuery('form[name=\"iform\"] input[name=\"{$checkenablefield}\"]').prop('checked',true);\n";
344
					echo "\t\t}\n";
345
				}
346
			}
347

    
348
			echo "\t}\n\telse {\n";
349

    
350
			if (isset($field['enablefields'])) {
351
				foreach (explode(',', $field['enablefields']) as $enablefield) {
352
					echo "\t\tif (jQuery('form[name=\"iform\"] input[name=\"{$enablefield}\"]').length > 0) {\n";
353
					echo "\t\t\tjQuery('form[name=\"iform\"] input[name=\"{$enablefield}\"]').prop('disabled',false);\n";
354
					echo "\t\t}\n";
355
				}
356
			}
357

    
358
			if (isset($field['checkenablefields'])) {
359
				foreach(explode(',', $field['checkenablefields']) as $checkenablefield) {
360
					echo "\t\tif (jQuery('form[name=\"iform\"] input[name=\"{$checkenablefield}\"]').length > 0) {\n";
361
					echo "\t\t\tjQuery('form[name=\"iform\"] input[name=\"{$checkenablefield}\"]').prop('checked',false);\n";
362
					echo "\t\t}\n";
363
				}
364
			}
365

    
366
			echo "\t}\n";
367
		}
368
	}
369
	?>
370
}
371
//]]>
372
</script>
373
<?php } ?>
374
<script type="text/javascript" src="javascript/domTT/domLib.js"></script>
375
<script type="text/javascript" src="javascript/domTT/domTT.js"></script>
376
<script type="text/javascript" src="javascript/domTT/behaviour.js"></script>
377
<script type="text/javascript" src="javascript/domTT/fadomatic.js"></script>
378
<script type="text/javascript" src="/javascript/row_helper_dynamic.js"></script>
379

    
380
<?php if (!empty($input_errors)) print_input_errors($input_errors); ?>
381
<form name="iform" action="pkg_edit.php" method="post">
382
<input type="hidden" name="xml" value="<?= htmlspecialchars($xml) ?>" />
383
<?php if ($savemsg) print_info_box($savemsg); ?>
384
<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="package edit">
385
<?php
386
if ($pkg['tabs'] <> "") {
387
	$tab_array = array();
388
	foreach($pkg['tabs']['tab'] as $tab) {
389
		if($tab['tab_level'])
390
			$tab_level = $tab['tab_level'];
391
		else
392
			$tab_level = 1;
393
		if(isset($tab['active'])) {
394
			$active = true;
395
		} else {
396
			$active = false;
397
		}
398
		if(isset($tab['no_drop_down']))
399
			$no_drop_down = true;
400
		$urltmp = "";
401
		if($tab['url'] <> "") $urltmp = $tab['url'];
402
		if($tab['xml'] <> "") $urltmp = "pkg_edit.php?xml=" . $tab['xml'];
403

    
404
 		$addresswithport = getenv("HTTP_HOST");
405
		$colonpos = strpos($addresswithport, ":");
406
		if ($colonpos !== False) {
407
			//my url is actually just the IP address of the pfsense box
408
			$myurl = substr($addresswithport, 0, $colonpos);
409
		} else {
410
			$myurl = $addresswithport;
411
		}
412
		// eval url so that above $myurl item can be processed if need be.
413
		$url = str_replace('$myurl', $myurl, $urltmp);
414

    
415
		$tab_array[$tab_level][] = array(
416
						$tab['text'],
417
						$active,
418
						$url
419
					);
420
    	}
421

    
422
	ksort($tab_array);
423
	foreach($tab_array as $tabid => $tab) {
424
		echo '<tr><td>';
425
		display_top_tabs($tab, $no_drop_down, $tabid);
426
		echo '</td></tr>';
427
	}
428
}
429

    
430
?>
431
<tr><td><div id="mainarea"><table id="t" class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
432
<?php
433
	$cols = 0;
434
	$savevalue = gettext("Save");
435
	if($pkg['savetext'] <> "") $savevalue = $pkg['savetext'];
436
	/* If a package's XML has <advanced_options/> configured, then setup 
437
	 * the table rows for the fields that have <advancedfield/> set.
438
	 * These fields will be placed below other fields in a seprate area titled 'Advanced Features'.
439
	 * These advanced fields are not normally configured and generally left to default to 'default settings'.
440
	 */
441

    
442
	if ($pkg['advanced_options'] == "enabled") {
443
		$adv_filed_count = 0;
444
		$advanced = "<td>&nbsp;</td>";
445
		$advanced .= "<tr><td colspan=\"2\" class=\"listtopic\">". gettext("Advanced features") . "<br /></td></tr>\n";
446
		}		
447
	foreach ($pkg['fields']['field'] as $pkga) {
448
		if ($pkga['type'] == "sorting") 
449
			continue;
450

    
451
		if ($pkga['type'] == "listtopic") {
452
			$input = "<tr id='td_{$pkga['fieldname']}'><td>&nbsp;</td></tr>";
453
			$input .= "<tr id='tr_{$pkga['fieldname']}'><td colspan=\"2\" class=\"listtopic\">{$pkga['name']}<br /></td></tr>\n";
454
			if(isset($pkga['advancedfield']) && isset($adv_filed_count)) {
455
				$advanced .= $input;
456
				$adv_filed_count++;
457
				}
458
			else
459
				echo $input;
460
			continue;
461
		}
462

    
463
		if($pkga['combinefields']=="begin"){
464
			$input="<tr valign='top' id='tr_{$pkga['fieldname']}'>";
465
			if(isset($pkga['advancedfield']) && isset($adv_filed_count))
466
				$advanced .= $input;
467
			else
468
			  	echo $input;
469
			}
470

    
471
		$size = "";
472
		$colspan="";
473
		if (isset($pkga['dontdisplayname'])){
474
			$input="";
475
			// If this is in a set of combined fields and;
476
			// - it is a "begin" (case already handled above) or
477
			// - usecolspan2 is in effect (so we want to spread all the combined fields horizontally)
478
			// then we do not want this "tr" to be inserted.
479
			// Thus only insert the "tr" if the not (!) of the above condition.
480
			if (!((isset($pkga['combinefields'])) && (($pkga['combinefields'] == "begin") || (isset($pkga['usecolspan2']))))) {
481
				$input .= "<tr valign='top' id='tr_{$pkga['fieldname']}'>";
482
			}
483
			if(isset($pkga['usecolspan2']))
484
				$colspan="colspan='2'";
485
			else
486
				$input .= "<td width='22%' class='vncell{$req}'>&nbsp;</td>";
487
			if(isset($pkga['advancedfield']) && isset($adv_filed_count)) {
488
				$advanced .= $input;
489
				$adv_filed_count++;
490
				}
491
			else
492
				echo $input;
493
			}
494
		else if (!isset($pkga['placeonbottom'])){
495
			unset($req);
496
			if (isset($pkga['required']))
497
				$req = 'req';
498
			$input="";
499
			// If this is in a set of combined fields and;
500
			// - it is a "begin" (case already handled above) or
501
			// - usecolspan2 is in effect (so we want to spread all the combined fields horizontally)
502
			// then we do not want this "tr" to be inserted.
503
			// Thus only insert the "tr" if the not (!) of the above condition.
504
			if (!((isset($pkga['combinefields'])) && (($pkga['combinefields'] == "begin") || (isset($pkga['usecolspan2']))))) {
505
				$input .= "<tr>";
506
			}
507
			$input .= "<td valign='top' width=\"22%\" class=\"vncell{$req}\">";
508
			$input .= fixup_string($pkga['fielddescr']);
509
			$input .= "</td>";
510
			if(isset($pkga['advancedfield']) && isset($adv_filed_count)) {
511
				$advanced .= $input;
512
				$adv_filed_count++;
513
				}
514
			else 
515
				echo $input;
516
		}
517
		if($pkga['combinefields']=="begin"){
518
			$input="<td class=\"vncell\"><table summary=\"advanced\"><tr>";
519
			if(isset($pkga['advancedfield']) && isset($adv_filed_count))
520
				$advanced .= $input;
521
			else
522
			  	echo $input;
523
			}
524

    
525
		$class=(isset($pkga['combinefields']) ? '' : 'class="vtable"');
526
		if (!isset($pkga['placeonbottom'])){
527
			$input="<td valign='top' {$colspan} {$class}>";
528
			if(isset($pkga['advancedfield']) && isset($adv_filed_count)){
529
				$advanced .= $input;
530
				$adv_filed_count++;
531
				}
532
			else
533
				echo $input;
534
		}
535

    
536
		// if user is editing a record, load in the data.
537
		$fieldname = $pkga['fieldname'];
538
		unset($value);
539
		if ($get_from_post) {
540
			$value = $_POST[$fieldname];
541
			if (is_array($value)) $value = implode(',', $value);
542
		} else {
543
			if (isset($id) && isset($a_pkg[$id][$fieldname])) {
544
				$value = $a_pkg[$id][$fieldname];
545
			} else {
546
				if (isset($pkga['default_value'])) {
547
					$value = $pkga['default_value'];
548
				}
549
			}
550
		}
551
		switch($pkga['type']){
552
			case "input":
553
				$size = ($pkga['size'] ? " size='{$pkga['size']}' " : "");
554
				$input = "<input {$size} id='{$pkga['fieldname']}' name='{$pkga['fieldname']}' class='formfld unknown' value=\"" . htmlspecialchars($value) ."\" />\n";
555
				$input .= "<br />" . fixup_string($pkga['description']) . "\n";
556
				if(isset($pkga['advancedfield']) && isset($adv_filed_count)) {
557
					$js_array[] = $pkga['fieldname'];
558
					$advanced .= display_advanced_field($pkga['fieldname']).$input ."</div>\n";
559
					}
560
				else
561
					echo $input;
562
				break;
563

    
564
			case "password":
565
				$size = ($pkga['size'] ? " size='{$pkga['size']}' " : "");
566
				$input = "<input " . $size . " id='" . $pkga['fieldname'] . "' type='password' name='" . $pkga['fieldname'] . "' class='formfld pwd' value=\"" . htmlspecialchars($value) . "\" />\n";
567
				$input .= "<br />" . fixup_string($pkga['description']) . "\n";
568
				if(isset($pkga['advancedfield']) && isset($adv_filed_count)) {
569
					$js_array[] = $pkga['fieldname'];
570
					$advanced .= display_advanced_field($pkga['fieldname']).$input ."</div>\n";
571
					}
572
				else
573
					echo $input;
574
				break;
575

    
576
			case "info":
577
				$input = fixup_string($pkga['description']) . "\n";
578
				if(isset($pkga['advancedfield']) && isset($adv_filed_count)) {
579
					$js_array[] = $pkga['fieldname'];
580
					$advanced .= display_advanced_field($pkga['fieldname']).$input ."</div>\n";
581
					}
582
				else
583
					echo $input;
584
				break;
585

    
586
			case "select":
587
				$fieldname = $pkga['fieldname'];
588
				if (isset($pkga['multiple'])) {
589
					$multiple = 'multiple="multiple"';
590
					$items = explode(',', $value);
591
					$fieldname .= "[]";
592
				} else {
593
					$multiple = '';
594
					$items = array($value);
595
				}
596
				$size = ($pkga['size'] ? " size='{$pkga['size']}' " : "");
597
				$onchange = (isset($pkga['onchange']) ? "onchange=\"{$pkga['onchange']}\"" : '');
598
				$input = "<select id='" . $pkga['fieldname'] . "' $multiple $size $onchange name=\"$fieldname\">\n";
599
				foreach ($pkga['options']['option'] as $opt) {
600
					$selected = (in_array($opt['value'], $items) ? 'selected="selected"' : '');
601
					$input .= "\t<option value=\"{$opt['value']}\" {$selected}>{$opt['name']}</option>\n";
602
					}
603
				$input .= "</select>\n<br />\n" . fixup_string($pkga['description']) . "\n";
604
                if(isset($pkga['advancedfield']) && isset($adv_filed_count)) {
605
					$js_array[] = $pkga['fieldname'];
606
					$advanced .= display_advanced_field($pkga['fieldname']).$input;
607
					$advanced .= "</div>\n";
608
					}
609
				else
610
					echo $input;
611
				break;
612

    
613
			case "select_source":
614
				$fieldname = $pkga['fieldname'];
615
				if (isset($pkga['multiple'])) {
616
					$multiple = 'multiple="multiple"';
617
					$items = explode(',', $value);
618
					$fieldname .= "[]";
619
				} else {
620
					$multiple = '';
621
					$items = array($value);
622
				}
623
				$size = (isset($pkga['size']) ? "size=\"{$pkga['size']}\"" : '');
624
				$onchange = (isset($pkga['onchange']) ? "onchange=\"{$pkga['onchange']}\"" : '');
625
				$input = "<select id='{$pkga['fieldname']}' {$multiple} {$size} {$onchange} name=\"{$fieldname}\">\n";
626

    
627
				if(isset($pkga['advancedfield']) && isset($adv_filed_count)) {
628
					$js_array[] = $pkga['fieldname'];
629
					$advanced .= display_advanced_field($pkga['fieldname']) .$input;
630
					$advanced .= "</div>\n";
631
				} else {
632
					echo $input;
633
				}
634
				$source_url = $pkga['source'];
635
				eval("\$pkg_source_txt = &$source_url;");
636
				$input="";
637
				#check if show disable option is present on xml
638
				if(isset($pkga['show_disable_value'])){
639
					array_push($pkg_source_txt, array(($pkga['source_name']? $pkga['source_name'] : $pkga['name'])=> $pkga['show_disable_value'],
640
													  ($pkga['source_value']? $pkga['source_value'] : $pkga['value'])=> $pkga['show_disable_value']));
641
					}
642
				foreach ($pkg_source_txt as $opt) {
643
					$source_name =($pkga['source_name']? $opt[$pkga['source_name']] : $opt[$pkga['name']]);
644
					$source_value =($pkga['source_value'] ? $opt[$pkga['source_value']] : $opt[$pkga['value']]);
645
					$selected = (in_array($source_value, $items)? 'selected="selected"' : '' );
646
					$input  .= "\t<option value=\"{$source_value}\" $selected>{$source_name}</option>\n";
647
					}
648
				$input .= "</select>\n<br />\n" . fixup_string($pkga['description']) . "\n";
649
				if(isset($pkga['advancedfield']) && isset($adv_filed_count))
650
					$advanced .= $input;
651
				else
652
					echo $input;
653
				break;
654

    
655
			case "vpn_selection" :
656
				$input = "<select id='{$pkga['fieldname']}' name='{$vpn['name']}'>\n";
657
				foreach ($config['ipsec']['phase1'] as $vpn) {
658
					$input .= "\t<option value=\"{$vpn['descr']}\">{$vpn['descr']}</option>\n";
659
					}
660
				$input .= "</select>\n";
661
				$input .= "<br />" . fixup_string($pkga['description']) . "\n";
662

    
663
				if(isset($pkga['advancedfield']) && isset($adv_filed_count)) {
664
					$js_array[] = $pkga['fieldname'];
665
					$advanced .= display_advanced_field($pkga['fieldname']).$input;
666
					$advanced .= "</div>\n";
667
					}
668
				else
669
					echo $input;
670
				break;
671

    
672
			case "checkbox":
673
				$checkboxchecked =($value == "on" ? " checked=\"checked\"" : "");
674
				$onchange = (isset($pkga['onchange']) ? "onchange=\"{$pkga['onchange']}\"" : '');
675
				if (isset($pkga['enablefields']) || isset($pkga['checkenablefields']))
676
					$onclick = ' onclick="javascript:enablechange();"';
677
				$input = "<input id='{$pkga['fieldname']}' type='checkbox' name='{$pkga['fieldname']}' {$checkboxchecked} {$onclick} {$onchange} />\n";
678
				$input .= "<br />" . fixup_string($pkga['description']) . "\n";
679

    
680
				if(isset($pkga['advancedfield']) && isset($adv_filed_count)) {
681
					$js_array[] = $pkga['fieldname'];
682
					$advanced .= display_advanced_field($pkga['fieldname']).$input;
683
					$advanced .= "</div>\n";
684
					}
685
				else
686
					echo $input;
687
				break;
688

    
689
			case "textarea":
690
				if($pkga['rows'])
691
					$rows = " rows='{$pkga['rows']}' ";
692
				if($pkga['cols'])
693
					$cols = " cols='{$pkga['cols']}' ";
694
				if (($pkga['encoding'] == 'base64') && !$get_from_post && !empty($value))
695
					$value = base64_decode($value);
696
				$wrap =($pkga['wrap'] == "off" ? 'wrap="off" style="white-space:nowrap;"' : '');		  
697
				$input = "<textarea {$rows} {$cols} name='{$pkga['fieldname']}'{$wrap}>{$value}</textarea>\n";
698
				$input .= "<br />" . fixup_string($pkga['description']) . "\n";
699
				if(isset($pkga['advancedfield']) && isset($adv_filed_count)) {
700
					$js_array[] = $pkga['fieldname'];
701
					$advanced .= display_advanced_field($pkga['fieldname']).$input;
702
					$advanced .= "</div>\n";
703
					}
704
				else
705
					echo $input;
706
				break;
707

    
708
			case "aliases":
709
				// Use xml tag <typealiases> to filter type aliases
710
				$size = ($pkga['size'] ? "size=\"{$pkga['size']}\"" : '');
711
				$fieldname = $pkga['fieldname'];
712
				$a_aliases = &$config['aliases']['alias'];
713
				$addrisfirst = 0;
714
				$aliasesaddr = "";
715
				$value = "value='{$value}'";
716

    
717
				if(isset($a_aliases)) {
718
					if(!empty($pkga['typealiases'])) {
719
						foreach($a_aliases as $alias)
720
							if($alias['type'] == $pkga['typealiases']) {
721
								if($addrisfirst == 1) $aliasesaddr .= ",";
722
								$aliasesaddr .= "'" . $alias['name'] . "'";
723
								$addrisfirst = 1;
724
							}
725
					} else {
726
						foreach($a_aliases as $alias) {
727
							if($addrisfirst == 1) $aliasesaddr .= ",";
728
							$aliasesaddr .= "'" . $alias['name'] . "'";
729
							$addrisfirst = 1;
730
						}
731
					}
732
				}
733

    
734
				$input = "<input name='{$fieldname}' type='text' class='formfldalias' id='{$fieldname}' {$size} {$value} />\n<br />";
735
				$input .= fixup_string($pkga['description']) . "\n";
736

    
737
				$script = "<script type='text/javascript'>\n";
738
				$script .= "//<![CDATA[\n";
739
				$script .= "var aliasarray = new Array({$aliasesaddr})\n";
740
				$script .= "var oTextbox1 = new AutoSuggestControl(document.getElementById('{$fieldname}'), new StateSuggestions(aliasarray))\n";
741
				$script .= "//]]>\n";
742
				$script .= "</script>";
743

    
744
				echo $input;
745
				echo $script;
746
                                break;
747

    
748
			case "interfaces_selection":
749
				$ips=array();
750
				$interface_regex=(isset($pkga['hideinterfaceregex']) ? $pkga['hideinterfaceregex'] : "nointerfacestohide");
751
				if (is_array($config['interfaces']))
752
					foreach ($config['interfaces'] as $iface_key=>$iface_value){
753
						if (isset($iface_value['enable']) && ! preg_match("/$interface_regex/",$iface_key)){
754
							$iface_description=($iface_value['descr'] !="" ? strtoupper($iface_value['descr']) : strtoupper($iface_key));
755
							if (isset($pkga['showips']))
756
								$iface_description .= " address";
757
							$ips[]=array('ip'=> $iface_key, 'description'=> $iface_description);
758
							}
759
					}
760
				if (is_array($config['virtualip']) && isset($pkga['showvirtualips']))
761
					foreach ($config['virtualip']['vip'] as $vip){
762
						if (! preg_match("/$interface_regex/",$vip['interface']))
763
						$vip_description=($vip['descr'] !="" ? " ({$vip['descr']}) " : " ");
764
						  switch ($vip['mode']){
765
							case "ipalias":
766
							case "carp":
767
									$ips[]=array(   'ip'=> $vip['subnet'],'description' => "{$vip['subnet']} $vip_description");
768
								break;
769
							case "proxyarp":
770
								if ($vip['type']=="network"){
771
									$start = ip2long32(gen_subnet($vip['subnet'], $vip['subnet_bits']));
772
									$end = ip2long32(gen_subnet_max($vip['subnet'], $vip['subnet_bits']));
773
									$len = $end - $start;
774
									for ($i = 0; $i <= $len; $i++)
775
										$ips[]= array('ip'=>long2ip32($start+$i),'description'=> long2ip32($start+$i)." from {$vip['subnet']}/{$vip['subnet_bits']} {$vip_description}");
776
									}
777
								else{
778
									$ips[]= array('ip'=>$vip['subnet'],'description'=> "{$vip['subnet']} $vip_description");
779
									}
780
								break;
781
							}
782
					}
783
				sort($ips);
784
				if (isset($pkga['showlistenall']))
785
					array_unshift($ips,array('ip'=> 'All', 'description'=> 'Listen on All interfaces/ip addresses '));
786
				if (! preg_match("/$interface_regex/","loopback")){
787
					$iface_description=(isset($pkga['showips']) ? "127.0.0.1 (loopback)" : "loopback");
788
					array_push($ips,array('ip'=> 'lo0', 'description'=> $iface_description));
789
					}
790

    
791
				#show interfaces array on gui
792
				$size = ($pkga['size'] ? "size=\"{$pkga['size']}\"" : '');
793
				$multiple = '';
794
				$fieldname = $pkga['fieldname'];
795
				if (isset($pkga['multiple'])) {
796
					$fieldname .= '[]';
797
					$multiple = 'multiple="multiple"';
798
					}
799
				$input = "<select id='{$pkga['fieldname']}' name=\"{$fieldname}\" {$size} {$multiple}>\n";
800
				if(is_array($value))
801
					$values = $value;
802
				else
803
					$values  =  explode(',',  $value);
804
				foreach($ips as $iface){
805
					$selected = (in_array($iface['ip'], $values) ? 'selected="selected"' : '');
806
					$input .= "<option value=\"{$iface['ip']}\" {$selected}>{$iface['description']}</option>\n";
807
					}
808
				$input .= "</select>\n<br />" . fixup_string($pkga['description']) . "\n";
809
				if(isset($pkga['advancedfield']) && isset($adv_filed_count))
810
					$advanced .= $input;
811
				else
812
					echo $input;
813
				break;
814

    
815
			case "radio":
816
				$input = "<input type='radio' id='{$pkga['fieldname']}' name='{$pkga['fieldname']}' value='{$value}' />";
817
				if(isset($pkga['advancedfield']) && isset($adv_filed_count))
818
					$advanced .= $input;
819
				else
820
					echo $input;
821
					break;
822

    
823
			case "button":
824
				$input = "<input type='submit' id='{$pkga['fieldname']}' name='{$pkga['fieldname']}' class='formbtn' value='{$pkga['fieldname']}' />\n";
825
				if(isset($pkga['placeonbottom']))
826
					$pkg_buttons .= $input;
827
				else
828
					echo $input ."\n<br />" . fixup_string($pkga['description']) . "\n";
829
				break;
830

    
831
			case "rowhelper":
832
				#$rowhelpername=($fields['fieldname'] ? $fields['fieldname'] : "row");
833
				$rowhelpername="row";
834
				?>
835
				<script type="text/javascript">
836
				//<![CDATA[
837
				<?php
838
					$rowcounter = 0;
839
					$fieldcounter = 0;
840
					foreach($pkga['rowhelper']['rowhelperfield'] as $rowhelper) {
841
						echo "rowname[{$fieldcounter}] = \"{$rowhelper['fieldname']}\";\n";
842
						echo "rowtype[{$fieldcounter}] = \"{$rowhelper['type']}\";\n";
843
						echo "rowsize[{$fieldcounter}] = \"{$rowhelper['size']}\";\n";
844
						$fieldcounter++;
845
					}
846
				?>
847
				//]]>
848
				</script>
849
				<table id="maintable" summary="main table">
850
				<tr id='<?="tr_{$pkga['fieldname']}";?>'>
851
				<?php
852
					foreach($pkga['rowhelper']['rowhelperfield'] as $rowhelper) {
853
					  echo "<td ".domTT_title($rowhelper['description'])."><b>" . fixup_string($rowhelper['fielddescr']) . "</b></td>\n";
854
					}
855

    
856
					$rowcounter = 0;
857
					$trc = 0;
858

    
859
					//Use assigned $a_pkg or create an empty array to enter loop
860
					if(isset($a_pkg[$id][$rowhelpername]))
861
						$saved_rows=$a_pkg[$id][$rowhelpername];
862
					else
863
						$saved_rows[]=array();
864

    
865
					foreach($saved_rows as $row) {
866
						echo "</tr>\n<tr class=\"sortable\" id=\"id_{$rowcounter}\">\n";
867
						foreach($pkga['rowhelper']['rowhelperfield'] as $rowhelper) {
868
							unset($value);
869
							if($rowhelper['value'] <> "") $value = $rowhelper['value'];
870
							$fieldname = $rowhelper['fieldname'];
871
							// if user is editing a record, load in the data.
872
							if (isset($id) && $a_pkg[$id]) {
873
								$value = $row[$fieldname];
874
							}
875
							$options = "";
876
							$type = $rowhelper['type'];
877
							$description = $rowhelper['description'];
878
							$fieldname = $rowhelper['fieldname'];
879
							if($type == "option")
880
								$options = &$rowhelper['options']['option'];
881
							if($rowhelper['size']) 
882
								$size = $rowhelper['size'];
883
							else if ($pkga['size'])
884
								$size = $pkga['size'];
885
							else
886
								$size = "8";
887
							display_row($rowcounter, $value, $fieldname, $type, $rowhelper, $size);
888

    
889
							$text = "";
890
							$trc++;
891
							}
892
						$rowcounter++;
893
						echo "<td>";
894
						#echo "<a onclick=\"removeRow(this); return false;\" href=\"#\"><img border=\"0\" src=\"./themes/".$g['theme']."/images/icons/icon_x.gif\" alt=\"remove\" /></a>";
895
						echo "<a class='delete' href=\"#\"><img border='0' src='./themes/{$g['theme']}/images/icons/icon_x.gif' alt='delete' /></a>";
896
						echo "</td>\n";
897
						}
898
				?>
899
				</tr>
900
				<tbody></tbody>
901
				</table>
902
	
903
				<!-- <br /><a onclick="javascript:addRowTo('maintable'); return false;" href="#"><img border="0" src="./themes/<?#= $g['theme']; ?>/images/icons/icon_plus.gif" alt="add" /></a>-->
904
				<br /><a class="add" href="#"><img border="0" src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="add" /></a>
905
				<br /><?php if($pkga['description'] != "") echo $pkga['description']; ?>
906
				<script type="text/javascript">
907
				//<![CDATA[
908
				field_counter_js = <?= $fieldcounter ?>;
909
				rows = <?= $rowcounter ?>;
910
				totalrows = <?php echo $rowcounter; ?>;
911
				loaded = <?php echo $rowcounter; ?>;
912
				//typesel_change();
913
				//]]>
914
				</script>
915
		
916
				<?php
917
				break;
918
		    }
919
		#check typehint value
920
	   	if($pkga['typehint'])
921
	   		echo " " . $pkga['typehint'];
922
	   	#check combinefields options
923
     	if (isset($pkga['combinefields'])){
924
			// At the end of each combined-fields field we always want to end a td tag.
925
			$input = "</td>";
926
			// The tr tag end is used to end the whole set of combined fields,
927
			// but also if usecolspan2 is not in effect then we also put each combined field in its own tr.
928
			if (($pkga['combinefields'] == "end") || (!isset($pkga['usecolspan2']))) {
929
           		$input.="</tr>";
930
			}
931
			// At the end of the combined fields we finish up the table that encloses the combined fields...
932
			if ($pkga['combinefields'] == "end") {
933
           		$input.="</table></td></tr>";
934
			}
935
      		}
936
     	else{
937
			$input = "</td></tr>";
938
			if($pkga['usecolspan2'])
939
				$input.= "</tr><br />";
940
	     	}
941
   	 	if(isset($pkga['advancedfield']) && isset($adv_filed_count))
942
			$advanced .= "{$input}\n";
943
		else
944
			echo "{$input}\n";
945
		#increment counter
946
		$i++;
947
  		}
948

    
949
  	#print advanced settings if any after reading all fields
950
	if (isset($advanced) && $adv_filed_count > 0)
951
		echo $advanced;
952
  
953
	?>
954
  <tr>
955
	<td>&nbsp;</td>
956
  </tr>
957
  <tr>
958
    <td width="22%" valign="top">&nbsp;</td>
959
    <td width="78%">
960
    <div id="buttons">
961
		<?php
962
		if($pkg['note'] != ""){
963
			echo "<p><span class=\"red\"><strong>" . gettext("Note") . ":</strong></span> {$pkg['note']}</p>";
964
			}
965
		//if (isset($id) && $a_pkg[$id]) // We'll always have a valid ID in our hands
966
		echo "<input name='id' type='hidden' value=\"" . htmlspecialchars($id) . "\" />";
967
		echo "<input name='Submit' type='submit' class='formbtn' value=\"" . htmlspecialchars($savevalue) . "\" />\n{$pkg_buttons}\n";
968
		if (!$only_edit){
969
			echo "<input class=\"formbtn\" type=\"button\" value=\"".gettext("Cancel")."\" onclick=\"window.location.href='" . $_SERVER['HTTP_REFERER'] . "'\" />";
970
			}
971
		?>
972
	</div>
973
    </td>
974
  </tr>
975

    
976
</table>
977
</div></td></tr>
978
</table>
979
</form>
980

    
981
<?php if ($pkg['custom_php_after_form_command']) eval($pkg['custom_php_after_form_command']); ?>
982

    
983
<?php
984
	/* JavaScript to handle the advanced fields. */
985
	if ($pkg['advanced_options'] == "enabled") {
986
		echo "<script type=\"text/javascript\">\n";
987
		echo "//<![CDATA[\n";
988
		foreach($js_array as $advfieldname) {
989
			echo "function show_" . $advfieldname . "() {\n";
990
			echo "\tjQuery('#showadv_{$advfieldname}').empty();\n";
991
			echo "\tjQuery('#show_{$advfieldname}').css('display', 'block');\n";
992
			echo "}\n\n";
993
		}
994
		echo "//]]>\n";
995
		echo "</script>\n";
996
	}
997
?>
998

    
999
<?php include("fend.inc"); ?>
1000
</body>
1001
</html>
1002

    
1003
<?php
1004
/*
1005
 * ROW Helpers function
1006
 */
1007
function display_row($trc, $value, $fieldname, $type, $rowhelper, $size) {
1008
	global $text, $config;
1009
	echo "<td>\n";
1010
	switch($type){
1011
		case "input":
1012
			echo "<input size='{$size}' name='{$fieldname}{$trc}' id='{$fieldname}{$trc}' class='formfld unknown' value=\"" . htmlspecialchars($value) . "\" />\n";
1013
			break;
1014
		case "checkbox":
1015
			echo "<input size='{$size}' type='checkbox' id='{$fieldname}{$trc}' name='{$fieldname}{$trc}' value='ON' ".($value?"CHECKED":"")." />\n";
1016
			break;
1017
		case "password":
1018
			echo "<input size='{$size}' type='password' id='{$fieldname}{$trc}' name='{$fieldname}{$trc}' class='formfld pwd' value=\"" . htmlspecialchars($value) . "\" />\n";
1019
			break;
1020
		case "textarea":
1021
			echo "<textarea rows='2' cols='12' id='{$fieldname}{$trc}' class='formfld unknown' name='{$fieldname}{$trc}'>{$value}</textarea>\n";
1022
		case "select":
1023
			echo "<select style='height:22px;'  id='{$fieldname}{$trc}' name='{$fieldname}{$trc}' {$title}>\n";
1024
			foreach($rowhelper['options']['option'] as $rowopt) {
1025
				$text .= "<option value='{$rowopt['value']}'>{$rowopt['name']}</option>";
1026
				echo "<option value='{$rowopt['value']}'".($rowopt['value'] == $value?" selected=\"selected\"":"").">{$rowopt['name']}</option>\n";
1027
				}
1028
			echo "</select>\n";
1029
			break;
1030
		case "interfaces_selection":
1031
			$size = ($size ? "size=\"{$size}\"" : '');
1032
			$multiple = '';
1033
			if (isset($rowhelper['multiple'])) {
1034
				$fieldname .= '[]';
1035
				$multiple = "multiple=\"multiple\"";
1036
			}
1037
			echo "<select style='height:22px;' id='{$fieldname}{$trc}' name='{$fieldname}{$trc}' {$size} {$multiple}>\n";
1038
			$ifaces = get_configured_interface_with_descr();
1039
			$additional_ifaces = $rowhelper['add_to_interfaces_selection'];
1040
			if (!empty($additional_ifaces))
1041
				$ifaces = array_merge($ifaces, explode(',', $additional_ifaces));
1042
			if(is_array($value))
1043
				$values = $value;
1044
			else
1045
				$values  =  explode(',',  $value);
1046
			$ifaces["lo0"] = "loopback";
1047
			echo "<option><name></name><value></value></option>/n";
1048
			foreach($ifaces as $ifname => $iface) {
1049
				$text .="<option value=\"{$ifname}\">$iface</option>";
1050
				echo "<option value=\"{$ifname}\" ".(in_array($ifname, $values) ? 'selected="selected"' : '').">{$iface}</option>\n";
1051
				}
1052
			echo "</select>\n";
1053
			break;
1054
		case "select_source":
1055
			echo "<select style='height:22px;' id='{$fieldname}{$trc}' name='{$fieldname}{$trc}'>\n";
1056
			if(isset($rowhelper['show_disable_value']))
1057
				echo "<option value='{$rowhelper['show_disable_value']}'>{$rowhelper['show_disable_value']}</option>\n";
1058
			$source_url = $rowhelper['source'];
1059
			eval("\$pkg_source_txt = &$source_url;");
1060
			foreach($pkg_source_txt as $opt) {
1061
				$source_name = ($rowhelper['source_name'] ? $opt[$rowhelper['source_name']] : $opt[$rowhelper['name']]);
1062
				$source_value = ($rowhelper['source_value'] ? $opt[$rowhelper['source_value']] : $opt[$rowhelper['value']]);
1063
				$text .= "<option value='{$source_value}'>{$source_name}</option>";
1064
				echo "<option value='{$source_value}'".($source_value == $value?" selected=\"selected\"":"").">{$source_name}</option>\n";
1065
				}
1066
			echo "</select>\n";
1067
			break;		
1068
		}
1069
	echo "</td>\n";
1070
}
1071

    
1072
function fixup_string($string) {
1073
	global $config;
1074
	// fixup #1: $myurl -> http[s]://ip_address:port/
1075
	$https = "";
1076
	$port = $config['system']['webguiport'];
1077
	if($port <> "443" and $port <> "80")
1078
		$urlport = ":" . $port;
1079
	else
1080
		$urlport = "";
1081

    
1082
	if($config['system']['webgui']['protocol'] == "https") $https = "s";
1083
	$myurl = "http" . $https . "://" . getenv("HTTP_HOST") . $urlport;
1084
	$newstring = str_replace("\$myurl", $myurl, $string);
1085
	$string = $newstring;
1086
	// fixup #2: $wanip
1087
	$curwanip = get_interface_ip();
1088
	$newstring = str_replace("\$wanip", $curwanip, $string);
1089
	$string = $newstring;
1090
	// fixup #3: $lanip
1091
	$lancfg = $config['interfaces']['lan'];
1092
	$lanip = $lancfg['ipaddr'];
1093
	$newstring = str_replace("\$lanip", $lanip, $string);
1094
	$string = $newstring;
1095
	// fixup #4: fix'r'up here.
1096
	return $newstring;
1097
}
1098

    
1099
/*
1100
 *  Parse templates if they are defined
1101
 */
1102
function parse_package_templates() {
1103
	global $pkg, $config;
1104
	$rows = 0;
1105
	if($pkg['templates']['template'] <> "")
1106
	    foreach($pkg['templates']['template'] as $pkg_template_row) {
1107
			$filename = $pkg_template_row['filename'];
1108
			$template_text = $pkg_template_row['templatecontents'];
1109
			$firstfield = "";
1110
			/* calculate total row helpers count and */
1111
			/* change fields defined as fieldname_fieldvalue to their value */
1112
			foreach ($pkg['fields']['field'] as $fields) {
1113
				switch($fields['type']){
1114
					case "rowhelper":
1115
					// save rowhelper items.
1116
					$row_helper_total_rows = 0;
1117
					$row_helper_data = "";
1118
					foreach($fields['rowhelper']['rowhelperfield'] as $rowhelperfield)
1119
						foreach($_POST as $key => $value){
1120
							if (preg_match("/^{$rowhelperfield['fieldname']}(\d+)$/",$key,$matches)){
1121
								$row_helper_total_rows++;
1122
								$row_helper_data .= $value;
1123
								$sep = "";
1124
								ereg($rowhelperfield['fieldname'] . "_fieldvalue\[(.*)\]", $template_text, $sep);
1125
								foreach ($sep as $se) $separator = $se;
1126
								if($separator <> "") {
1127
							    	$row_helper_data = ereg_replace("  ", $separator, $row_helper_data);
1128
							    	$template_text = ereg_replace("\[{$separator}\]", "", $template_text);
1129
									}
1130
								$template_text = str_replace($rowhelperfield['fieldname'] . "_fieldvalue", $row_helper_data, $template_text);
1131
								}
1132
							}
1133
					break;
1134
				default:
1135
					$fieldname  = $fields['fieldname'];
1136
					$fieldvalue = $_POST[$fieldname];
1137
					$template_text = str_replace($fieldname . "_fieldvalue", $fieldvalue, $template_text);
1138
				}
1139
			}
1140
		/* replace $domain_total_rows with total rows */
1141
		$template_text = str_replace("$domain_total_rows", $row_helper_total_rows, $template_text);
1142

    
1143
		/* replace cr's */
1144
		$template_text = str_replace("\\n", "\n", $template_text);
1145

    
1146
		/* write out new template file */
1147
		$fout = fopen($filename,"w");
1148
		fwrite($fout, $template_text);
1149
		fclose($fout);
1150
	    }
1151
}
1152

    
1153
/* Return html div fields */
1154
function display_advanced_field($fieldname) {
1155
	$div = "<div id='showadv_{$fieldname}'>\n";
1156
	$div .= "<input type='button' onclick='show_{$fieldname}()' value='" . gettext("Advanced") . "' /> - " . gettext("Show advanced option") ."</div>\n";
1157
	$div .= "<div id='show_{$fieldname}' style='display:none'>\n";
1158
	return $div;
1159
}
1160

    
1161
?>
(126-126/251)