Project

General

Profile

Download (40.7 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
		if ($get_from_post) {
539
			$value = $_POST[$fieldname];
540
			if (is_array($value)) $value = implode(',', $value);
541
		} else {
542
			if (isset($id) && $a_pkg[$id])
543
				$value = $a_pkg[$id][$fieldname];
544
			else
545
				$value = $pkga['default_value'];
546
		}
547
		switch($pkga['type']){
548
			case "input":
549
				$size = ($pkga['size'] ? " size='{$pkga['size']}' " : "");
550
				$input = "<input {$size} id='{$pkga['fieldname']}' name='{$pkga['fieldname']}' class='formfld unknown' value=\"" . htmlspecialchars($value) ."\" />\n";
551
				$input .= "<br />" . fixup_string($pkga['description']) . "\n";
552
				if(isset($pkga['advancedfield']) && isset($adv_filed_count)) {
553
					$js_array[] = $pkga['fieldname'];
554
					$advanced .= display_advanced_field($pkga['fieldname']).$input ."</div>\n";
555
					}
556
				else
557
					echo $input;
558
				break;
559

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
740
				echo $input;
741
				echo $script;
742
                                break;
743

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

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

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

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

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

    
852
					$rowcounter = 0;
853
					$trc = 0;
854

    
855
					//Use assigned $a_pkg or create an empty array to enter loop
856
					if(isset($a_pkg[$id][$rowhelpername]))
857
						$saved_rows=$a_pkg[$id][$rowhelpername];
858
					else
859
						$saved_rows[]=array();
860

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

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

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

    
972
</table>
973
</div></td></tr>
974
</table>
975
</form>
976

    
977
<?php if ($pkg['custom_php_after_form_command']) eval($pkg['custom_php_after_form_command']); ?>
978

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

    
995
<?php include("fend.inc"); ?>
996
</body>
997
</html>
998

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

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

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

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

    
1139
		/* replace cr's */
1140
		$template_text = str_replace("\\n", "\n", $template_text);
1141

    
1142
		/* write out new template file */
1143
		$fout = fopen($filename,"w");
1144
		fwrite($fout, $template_text);
1145
		fclose($fout);
1146
	    }
1147
}
1148

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

    
1157
?>
(131-131/256)