Project

General

Profile

Download (17.8 KB) Statistics
| Branch: | Tag: | Revision:
1 f1f60c92 Ermal Luçi
<?php
2
/* $Id$ */
3
/*
4 7a5fe50d Phil Davis
	Copyright (C) 2008 Ermal Luçi
5 f1f60c92 Ermal Luçi
	All rights reserved.
6
7
	Redistribution and use in source and binary forms, with or without
8
	modification, are permitted provided that the following conditions are met:
9
10
	1. Redistributions of source code must retain the above copyright notice,
11
	   this list of conditions and the following disclaimer.
12
13
	2. Redistributions in binary form must reproduce the above copyright
14
	   notice, this list of conditions and the following disclaimer in the
15
	   documentation and/or other materials provided with the distribution.
16
17
	THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18
	INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
19
	AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
20
	AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
21
	OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23
	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
	POSSIBILITY OF SUCH DAMAGE.
27
*/
28 1d333258 Scott Ullrich
/*
29
	pfSense_BUILDER_BINARIES:	/bin/rm
30
	pfSense_MODULE:	dyndns
31
*/
32 f1f60c92 Ermal Luçi
33 6b07c15a Matthew Grooms
##|+PRIV
34
##|*IDENT=page-services-dynamicdnsclient
35
##|*NAME=Services: Dynamic DNS client page
36
##|*DESCR=Allow access to the 'Services: Dynamic DNS client' page.
37
##|*MATCH=services_dyndns_edit.php*
38
##|-PRIV
39
40 ee2db55f Ermal Lu?i
/* returns true if $uname is a valid DynDNS username */
41
function is_dyndns_username($uname) {
42
        if (!is_string($uname))
43
                return false;
44
        
45
        if (preg_match("/[^a-z0-9\-.@_:]/i", $uname))
46
                return false;
47
        else
48
                return true;
49
}
50
51 f1f60c92 Ermal Luçi
require("guiconfig.inc");
52
53
if (!is_array($config['dyndnses']['dyndns'])) {
54
	$config['dyndnses']['dyndns'] = array();
55
}
56
57
$a_dyndns = &$config['dyndnses']['dyndns'];
58
59
$id = $_GET['id'];
60
if (isset($_POST['id']))
61
	$id = $_POST['id'];
62
63
if (isset($id) && isset($a_dyndns[$id])) {
64
	$pconfig['username'] = $a_dyndns[$id]['username'];
65
	$pconfig['password'] = $a_dyndns[$id]['password'];
66
	$pconfig['host'] = $a_dyndns[$id]['host'];
67
	$pconfig['mx'] = $a_dyndns[$id]['mx'];
68
	$pconfig['type'] = $a_dyndns[$id]['type'];
69 acdfc164 Ermal Luçi
	$pconfig['enable'] = !isset($a_dyndns[$id]['enable']);
70 f1f60c92 Ermal Luçi
	$pconfig['interface'] = $a_dyndns[$id]['interface'];
71
	$pconfig['wildcard'] = isset($a_dyndns[$id]['wildcard']);
72 c8c90b81 Phil Davis
	$pconfig['verboselog'] = isset($a_dyndns[$id]['verboselog']);
73 cd132e86 Edson Brandi
	$pconfig['zoneid'] = $a_dyndns[$id]['zoneid'];
74
	$pconfig['ttl'] = isset($a_dyndns[$id]['ttl']);
75 37f3e704 Matt Corallo
	$pconfig['updateurl'] = $a_dyndns[$id]['updateurl'];
76
	$pconfig['resultmatch'] = $a_dyndns[$id]['resultmatch'];
77
	$pconfig['requestif'] = $a_dyndns[$id]['requestif'];
78 f1f60c92 Ermal Luçi
	$pconfig['descr'] = $a_dyndns[$id]['descr'];
79
}
80
81
if ($_POST) {
82
83
	unset($input_errors);
84
	$pconfig = $_POST;
85 d9cc4b24 gnhb
	
86 0030036f gnhb
	if(($pconfig['type'] == "freedns" || $pconfig['type'] == "namecheap") && $_POST['username'] == "")
87
		$_POST['username'] = "none"; 
88 f1f60c92 Ermal Luçi
89
	/* input validation */
90
	$reqdfields = array();
91
	$reqdfieldsn = array();
92 37f3e704 Matt Corallo
	$reqdfields = array("type");
93
	$reqdfieldsn = array(gettext("Service type"));
94
	if ($pconfig['type'] != "custom") {
95
		$reqdfields[] = "host";
96
		$reqdfieldsn[] = gettext("Hostname");
97
		$reqdfields[] = "password";
98
		$reqdfieldsn[] = gettext("Password");
99
 		$reqdfields[] = "username";
100
 		$reqdfieldsn[] = gettext("Username");
101
	}else{
102
		$reqdfields[] = "updateurl";
103
		$reqdfieldsn[] = gettext("Update URL");
104
 	}
105 f1f60c92 Ermal Luçi
106
	do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors);
107
108
	if (($_POST['mx'] && !is_domain($_POST['mx']))) 
109 2b2a7984 Rafael Lucas
		$input_errors[] = gettext("The MX contains invalid characters.");
110 37f3e704 Matt Corallo
	if ((in_array("username", $reqdfields) && $_POST['username'] && !is_dyndns_username($_POST['username'])) || ((in_array("username", $reqdfields)) && ($_POST['username'] == ""))) 
111
 		$input_errors[] = gettext("The username contains invalid characters.");
112 f1f60c92 Ermal Luçi
113
	if (!$input_errors) {
114
		$dyndns = array();
115
		$dyndns['type'] = $_POST['type'];
116
		$dyndns['username'] = $_POST['username'];
117
		$dyndns['password'] = $_POST['password'];
118
		$dyndns['host'] = $_POST['host'];
119
		$dyndns['mx'] = $_POST['mx'];
120
		$dyndns['wildcard'] = $_POST['wildcard'] ? true : false;
121 c8c90b81 Phil Davis
		$dyndns['verboselog'] = $_POST['verboselog'] ? true : false;
122 d348160e Renato Botelho
		/* In this place enable means disabled */
123
		if ($_POST['enable'])
124
			unset($dyndns['enable']);
125
		else
126
			$dyndns['enable'] = true;
127 f1f60c92 Ermal Luçi
		$dyndns['interface'] = $_POST['interface'];
128 cd132e86 Edson Brandi
		$dyndns['zoneid'] = $_POST['zoneid'];
129
		$dyndns['ttl'] = $_POST['ttl'];
130 37f3e704 Matt Corallo
		$dyndns['updateurl'] = $_POST['updateurl'];
131
		// Trim hard-to-type but sometimes returned characters
132
		$dyndns['resultmatch'] = trim($_POST['resultmatch'], "\t\n\r");
133
		$dyndns['type'] == "custom" ? $dyndns['requestif'] = $_POST['requestif'] : $dyndns['requestif'] = $_POST['interface'];
134 f1f60c92 Ermal Luçi
		$dyndns['descr'] = $_POST['descr'];
135 f3b2b2a4 Yehuda Katz
		$dyndns['force'] = isset($_POST['force']);
136 0030036f gnhb
		
137
		if($dyndns['username'] == "none")
138
			$dyndns['username'] = "";
139 f1f60c92 Ermal Luçi
140
		if (isset($id) && $a_dyndns[$id])
141
			$a_dyndns[$id] = $dyndns;
142 37f3e704 Matt Corallo
		else {
143
 			$a_dyndns[] = $dyndns;
144
			$id = count($a_dyndns) - 1;
145
		}
146
147
		$dyndns['id'] = $id;
148
		//Probably overkill, but its better to be safe
149
		for($i = 0; $i < count($a_dyndns); $i++) {
150
			$a_dyndns[$i]['id'] = $i;
151
		}
152 f1f60c92 Ermal Luçi
153
		write_config();
154
155 f3b2b2a4 Yehuda Katz
		services_dyndns_configure_client($dyndns);
156 9c38bcea sullrich
157 07cdb9a2 Ermal Luçi
		header("Location: services_dyndns.php");
158
		exit;
159 f1f60c92 Ermal Luçi
	}
160
}
161
162 2b2a7984 Rafael Lucas
$pgtitle = array(gettext("Services"),gettext("Dynamic DNS client"));
163 f1f60c92 Ermal Luçi
include("head.inc");
164
165
?>
166
167
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
168
<?php include("fbegin.inc"); ?>
169
<?php if ($input_errors) print_input_errors($input_errors); ?>
170
<?php if ($savemsg) print_info_box($savemsg); ?>
171 37f3e704 Matt Corallo
<script type="text/javascript">
172
function _onTypeChange(type){ 
173
	switch(type) {
174
		case "custom":
175
			document.getElementById("_resulttr").style.display = '';
176
			document.getElementById("_urltr").style.display = '';
177
			document.getElementById("_requestiftr").style.display = '';
178
			document.getElementById("_hostnametr").style.display = 'none';
179
			document.getElementById("_mxtr").style.display = 'none';
180
			document.getElementById("_wildcardtr").style.display = 'none';
181
			document.getElementById("r53_zoneid").style.display='none';
182
			document.getElementById("r53_ttl").style.display='none';
183
			break;
184
		case "route53":
185
			document.getElementById("_resulttr").style.display = 'none';
186
			document.getElementById("_urltr").style.display = 'none';
187
			document.getElementById("_requestiftr").style.display = 'none';
188
			document.getElementById("_hostnametr").style.display = '';
189
			document.getElementById("_mxtr").style.display = '';
190
			document.getElementById("_wildcardtr").style.display = '';
191
			document.getElementById("r53_zoneid").style.display='';
192
			document.getElementById("r53_ttl").style.display='';
193
			break;
194
		default:
195
			document.getElementById("_resulttr").style.display = 'none';
196
			document.getElementById("_urltr").style.display = 'none';
197
			document.getElementById("_requestiftr").style.display = 'none';
198
			document.getElementById("_hostnametr").style.display = '';
199
			document.getElementById("_mxtr").style.display = '';
200
			document.getElementById("_wildcardtr").style.display = '';
201
			document.getElementById("r53_zoneid").style.display='none';
202
			document.getElementById("r53_ttl").style.display='none';
203
	}
204
}
205
</script>
206 f1f60c92 Ermal Luçi
<form action="services_dyndns_edit.php" method="post" name="iform" id="iform">
207
              <table width="100%" border="0" cellpadding="6" cellspacing="0">
208
                <tr>
209
                  <td colspan="2" valign="top" class="optsect_t">
210
				  <table border="0" cellspacing="0" cellpadding="0" width="100%">
211 2b2a7984 Rafael Lucas
				  <tr><td class="optsect_s"><strong><?=gettext("Dynamic DNS client");?></strong></td></tr>
212 f1f60c92 Ermal Luçi
				  </table>
213
				  </td>
214
                </tr>
215
                <tr>
216 2b2a7984 Rafael Lucas
                  <td width="22%" valign="top" class="vncell"><?=gettext("Disable");?></td>
217 f1f60c92 Ermal Luçi
				  <td width="78%" class="vtable">
218 2b2a7984 Rafael Lucas
				    <input name="enable" type="checkbox" id="enable" value="<?=gettext("yes");?>" <?php if ($pconfig['enable']) echo "checked"; ?>>
219 f1f60c92 Ermal Luçi
				  </td>
220
                </tr>
221
                <tr>
222 2b2a7984 Rafael Lucas
                  <td width="22%" valign="top" class="vncellreq"><?=gettext("Service type");?></td>
223 f1f60c92 Ermal Luçi
                  <td width="78%" class="vtable">
224 37f3e704 Matt Corallo
			<select name="type" class="formselect" id="type" onchange="_onTypeChange(this.options[this.selectedIndex].value);">
225 f1f60c92 Ermal Luçi
                      <?php
226 7a5fe50d Phil Davis
						$types = explode(",", DYNDNS_PROVIDER_DESCRIPTIONS);
227
						$vals = explode(" ", DYNDNS_PROVIDER_VALUES);
228 f1f60c92 Ermal Luçi
						$j = 0; for ($j = 0; $j < count($vals); $j++): ?>
229
                      <option value="<?=$vals[$j];?>" <?php if ($vals[$j] == $pconfig['type']) echo "selected";?>>
230
                      <?=htmlspecialchars($types[$j]);?>
231
                      </option>
232
                      <?php endfor; ?>
233
                    </select></td>
234
				</tr>
235
				<tr>
236 2b2a7984 Rafael Lucas
				   <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface to monitor");?></td>  
237 f1f60c92 Ermal Luçi
				   <td width="78%" class="vtable">
238
				   <select name="interface" class="formselect" id="interface">
239 3e1eec58 smos
				<?php
240
					$iflist = get_configured_interface_with_descr();					
241
				   	foreach ($iflist as $if => $ifdesc) {
242
						echo "<option value=\"{$if}\"";
243
						if ($pconfig['interface'] == $if)
244
							echo "selected";
245
						echo ">{$ifdesc}</option>\n";
246
					}
247
					$grouplist = return_gateway_groups_array();
248
				   	foreach ($grouplist as $name => $group) {
249
						echo "<option value=\"{$name}\"";
250
						if ($pconfig['interface'] == $name)
251
							echo "selected";
252
						echo ">GW Group {$name}</option>\n";
253
					}
254
				?>
255 f1f60c92 Ermal Luçi
					</select>
256
					</td>
257
					</td>
258
				</tr>	
259 37f3e704 Matt Corallo
				<tr id="_requestiftr">
260
				   <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface to send update from");?></td>  
261
				   <td width="78%" class="vtable">
262
				   <select name="requestif" class="formselect" id="requestif">
263
				   <?php $iflist = get_configured_interface_with_descr();
264
				   		foreach ($iflist as $if => $ifdesc):?>
265
							<option value="<?=$if;?>" <?php if ($pconfig['requestif'] == $if) echo "selected";?>><?=$ifdesc;?></option>
266
					<?php endforeach; ?>
267
					</select>
268
					<br/><?= gettext("Note: This is almost always the same as the Interface to Monitor.");?>
269
					</td>
270
					</td>
271
				</tr>
272
                <tr id="_hostnametr">
273 2b2a7984 Rafael Lucas
                  <td width="22%" valign="top" class="vncellreq"><?=gettext("Hostname");?></td>
274 f1f60c92 Ermal Luçi
                  <td width="78%" class="vtable">
275
                    <input name="host" type="text" class="formfld unknown" id="host" size="30" value="<?=htmlspecialchars($pconfig['host']);?>">
276
                    <br>
277
				    <span class="vexpl">
278 16457bdd Renato Botelho
				    <span class="red"><strong><?=gettext("Note:");?><br></strong>
279 f1f60c92 Ermal Luçi
				    </span>
280 38a481ad jim-p
					<?=gettext("Enter the complete host/domain name.  example:  myhost.dyndns.org");?><br/>
281
					<?=gettext("For he.net tunnelbroker, enter your tunnel ID");?>
282 f1f60c92 Ermal Luçi
				    </span>
283
		          </td>
284
				</tr>
285 37f3e704 Matt Corallo
                <tr id="_mxtr">
286 50bfcec0 Carlos Eduardo Ramos
                  <td width="22%" valign="top" class="vncell"><?=gettext("MX"); ?></td>
287 f1f60c92 Ermal Luçi
                  <td width="78%" class="vtable">
288
                    <input name="mx" type="text" class="formfld unknown" id="mx" size="30" value="<?=htmlspecialchars($pconfig['mx']);?>">
289
                    <br>
290 2b2a7984 Rafael Lucas
					<?=gettext("Note: With DynDNS service you can only use a hostname, not an IP address.");?>
291 f1f60c92 Ermal Luçi
					<br>
292 2b2a7984 Rafael Lucas
                    <?=gettext("Set this option only if you need a special MX record. Not".
293
                   " all services support this.");?></td>
294 f1f60c92 Ermal Luçi
				</tr>
295 37f3e704 Matt Corallo
                <tr id="_wildcardtr">
296 50bfcec0 Carlos Eduardo Ramos
                  <td width="22%" valign="top" class="vncell"><?=gettext("Wildcards"); ?></td>
297 f1f60c92 Ermal Luçi
                  <td width="78%" class="vtable">
298
                    <input name="wildcard" type="checkbox" id="wildcard" value="yes" <?php if ($pconfig['wildcard']) echo "checked"; ?>>
299 50bfcec0 Carlos Eduardo Ramos
                    <?=gettext("Enable ");?><?=gettext("Wildcard"); ?></td>
300 f1f60c92 Ermal Luçi
				</tr>
301 c8c90b81 Phil Davis
                <tr id="_verboselogtr">
302
                  <td width="22%" valign="top" class="vncell"><?=gettext("Verbose logging"); ?></td>
303
                  <td width="78%" class="vtable">
304
                    <input name="verboselog" type="checkbox" id="verboselog" value="yes" <?php if ($pconfig['verboselog']) echo "checked"; ?>>
305
                    <?=gettext("Enable ");?><?=gettext("verbose logging"); ?></td>
306
				</tr>
307 37f3e704 Matt Corallo
                <tr id="_usernametr">
308 2b2a7984 Rafael Lucas
                  <td width="22%" valign="top" class="vncellreq"><?=gettext("Username");?></td>
309 f1f60c92 Ermal Luçi
                  <td width="78%" class="vtable">
310
                    <input name="username" type="text" class="formfld user" id="username" size="20" value="<?=htmlspecialchars($pconfig['username']);?>">
311 37f3e704 Matt Corallo
                    <br/><?= gettext("Username is required for all types except Namecheap, FreeDNS and Custom Entries.");?>
312 cd132e86 Edson Brandi
		    <br/><?= gettext("Route 53: Enter your Access Key ID.");?>
313 37f3e704 Matt Corallo
		    <br/><?= gettext("For Custom Entries, Username and Password represent HTTP Authentication username and passwords.");?>
314 f1f60c92 Ermal Luçi
                  </td>
315
                </tr>
316
                <tr>
317 2b2a7984 Rafael Lucas
                  <td width="22%" valign="top" class="vncellreq"><?=gettext("Password");?></td>
318 f1f60c92 Ermal Luçi
                  <td width="78%" class="vtable">
319
                    <input name="password" type="password" class="formfld pwd" id="password" size="20" value="<?=htmlspecialchars($pconfig['password']);?>">
320 d9cc4b24 gnhb
                    <br/>
321
                    <?=gettext("FreeDNS (freedns.afraid.org): Enter your \"Authentication Token\" provided by FreeDNS.");?>
322 cd132e86 Edson Brandi
		    <br/><?= gettext("Route 53: Enter your Secret Access Key.");?>
323
                  </td>
324
                </tr>
325
326
                <tr id="r53_zoneid" style="display:none">
327
                  <td width="22%" valign="top" class="vncellreq"><?=gettext("Zone ID");?></td>
328
                  <td width="78%" class="vtable">
329
                    <input name="zoneid" type="text" class="formfld user" id="zoneid" size="20" value="<?=htmlspecialchars($pconfig['zoneid']);?>">
330
                    <br/><?= gettext("Enter Zone ID that you received when you created your domain in Route 53.");?>
331 f1f60c92 Ermal Luçi
                  </td>
332
                </tr>
333 37f3e704 Matt Corallo
                <tr id="_urltr">
334
                  <td width="22%" valign="top" class="vncell"><?=gettext("Update URL");?></td>
335
                  <td width="78%" class="vtable">
336
                    <input name="updateurl" type="text" class="formfld unknown" id="updateurl" size="60" value="<?=htmlspecialchars($pconfig['updateurl']);?>">
337
                    <br/><?= gettext("This is the only field required by for Custom Dynamic DNS, and is only used by Custom Entries.");?>
338
			<br/>
339
			<?= gettext("If you need the new IP to be included in the request, put %IP% in its place.");?>
340
                  </td>
341
                </tr>
342
		<tr id="_resulttr">
343
                  <td width="22%" valign="top" class="vncell"><?=gettext("Result Match");?></td>
344
                  <td width="78%" class="vtable">
345
                    <textarea name="resultmatch" class="formpre" id="resultmatch" cols="65" rows="7"><?=htmlspecialchars($pconfig['resultmatch']);?></textarea>
346
                    <br/><?= gettext("This field is only used by Custom Dynamic DNS Entries.");?>
347
			<br/>
348
			<?= gettext("This field should be identical to what your DDNS Provider will return if the update succeeds, leave it blank to disable checking of returned results.");?>
349
			<br/>
350
			<?= gettext("If you need the new IP to be included in the request, put %IP% in its place.");?>
351
			<br/>
352
			<?= gettext("If you need to include multiple possible values, sperate them with a |.  If your provider includes a |, escape it with \\|");?>
353
			<br/>
354
			<?= gettext("Tabs (\\t), newlines (\\n) and carriage returns (\\r) at the beginning or end of the returned results are removed before comparison.");?>
355
                  </td>
356
                </tr>
357 cd132e86 Edson Brandi
                <tr>
358
359
                <tr id="r53_ttl" style="display:none">
360
                  <td width="22%" valign="top" class="vncellreq"><?=gettext("TTL");?></td>
361
                  <td width="78%" class="vtable">
362
                    <input name="ttl" type="text" class="formfld user" id="ttl" size="20" value="<?=htmlspecialchars($pconfig['ttl']);?>">
363
                    <br/><?= gettext("Choose TTL for your dns record.");?>
364
                  </td>
365
                </tr>
366
                <tr>
367
368
369 f1f60c92 Ermal Luçi
                <tr>
370 2b2a7984 Rafael Lucas
                  <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
371 f1f60c92 Ermal Luçi
                  <td width="78%" class="vtable">
372
                    <input name="descr" type="text" class="formfld unknown" id="descr" size="60" value="<?=htmlspecialchars($pconfig['descr']);?>">
373
                  </td>
374
                </tr>
375
                <tr>
376
                  <td width="22%" valign="top">&nbsp;</td>
377
                  <td width="78%">
378 2b2a7984 Rafael Lucas
                    <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" onClick="enable_change(true)">
379
					<a href="services_dyndns.php"><input name="cancel" type="button" class="formbtn" value="<?=gettext("Cancel");?>"></a>
380 f1f60c92 Ermal Luçi
					<?php if (isset($id) && $a_dyndns[$id]): ?>
381 225a2f0b Scott Ullrich
						<input name="id" type="hidden" value="<?=htmlspecialchars($id);?>">
382 f3b2b2a4 Yehuda Katz
						<input name="force" type="submit" class="formbtn" value="<?=gettext("Save & Force Update");?>" onClick="enable_change(true)">
383 f1f60c92 Ermal Luçi
					<?php endif; ?>
384
                  </td>
385
                </tr>
386
                <tr>
387
                  <td width="22%" valign="top">&nbsp;</td>
388 16457bdd Renato Botelho
                  <td width="78%"><span class="vexpl"><span class="red"><strong><?=gettext("Note:");?><br>
389 2b2a7984 Rafael Lucas
                    </strong></span><?php printf(gettext("You must configure a DNS server in %sSystem:
390
                    General setup%s or allow the DNS server list to be overridden
391
                    by DHCP/PPP on WAN for dynamic DNS updates to work."),'<a href="system.php">','</a>');?></span></td>
392 f1f60c92 Ermal Luçi
                </tr>
393
              </table>
394
</form>
395 9e9b596f Ermal Luçi
<?php include("fend.inc"); ?>
396 cd132e86 Edson Brandi
397
<script type="text/javascript">
398 37f3e704 Matt Corallo
_onTypeChange("<?php echo $pconfig['type']; ?>");
399 cd132e86 Edson Brandi
</script>
400
401 f1f60c92 Ermal Luçi
</body>
402
</html>