diff options
Diffstat (limited to 'src/usr/local/www/services_dyndns_edit.php')
-rw-r--r-- | src/usr/local/www/services_dyndns_edit.php | 485 |
1 files changed, 485 insertions, 0 deletions
diff --git a/src/usr/local/www/services_dyndns_edit.php b/src/usr/local/www/services_dyndns_edit.php new file mode 100644 index 0000000..a619ce9 --- /dev/null +++ b/src/usr/local/www/services_dyndns_edit.php @@ -0,0 +1,485 @@ +<?php +/* $Id$ */ +/* + services_dyndns_edit.php + + Copyright (C) 2008 Ermal Luçi + Copyright (C) 2013-2015 Electric Sheep Fencing, LP + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ +/* + pfSense_BUILDER_BINARIES: /bin/rm + pfSense_MODULE: dyndns +*/ + +##|+PRIV +##|*IDENT=page-services-dynamicdnsclient +##|*NAME=Services: Dynamic DNS client page +##|*DESCR=Allow access to the 'Services: Dynamic DNS client' page. +##|*MATCH=services_dyndns_edit.php* +##|-PRIV + +/* returns true if $uname is a valid DynDNS username */ +function is_dyndns_username($uname) { + if (!is_string($uname)) { + return false; + } + + if (preg_match("/[^a-z0-9\-\+.@_:]/i", $uname)) { + return false; + } else { + return true; + } +} + +require("guiconfig.inc"); + +if (!is_array($config['dyndnses']['dyndns'])) { + $config['dyndnses']['dyndns'] = array(); +} + +$a_dyndns = &$config['dyndnses']['dyndns']; + +if (is_numericint($_GET['id'])) { + $id = $_GET['id']; +} +if (isset($_POST['id']) && is_numericint($_POST['id'])) { + $id = $_POST['id']; +} + +if (isset($id) && isset($a_dyndns[$id])) { + $pconfig['username'] = $a_dyndns[$id]['username']; + $pconfig['password'] = $a_dyndns[$id]['password']; + $pconfig['host'] = $a_dyndns[$id]['host']; + $pconfig['mx'] = $a_dyndns[$id]['mx']; + $pconfig['type'] = $a_dyndns[$id]['type']; + $pconfig['enable'] = !isset($a_dyndns[$id]['enable']); + $pconfig['interface'] = $a_dyndns[$id]['interface']; + $pconfig['wildcard'] = isset($a_dyndns[$id]['wildcard']); + $pconfig['verboselog'] = isset($a_dyndns[$id]['verboselog']); + $pconfig['curl_ipresolve_v4'] = isset($a_dyndns[$id]['curl_ipresolve_v4']); + $pconfig['curl_ssl_verifypeer'] = isset($a_dyndns[$id]['curl_ssl_verifypeer']); + $pconfig['zoneid'] = $a_dyndns[$id]['zoneid']; + $pconfig['ttl'] = $a_dyndns[$id]['ttl']; + $pconfig['updateurl'] = $a_dyndns[$id]['updateurl']; + $pconfig['resultmatch'] = $a_dyndns[$id]['resultmatch']; + $pconfig['requestif'] = $a_dyndns[$id]['requestif']; + $pconfig['descr'] = $a_dyndns[$id]['descr']; +} + +if ($_POST) { + + unset($input_errors); + $pconfig = $_POST; + + if (($pconfig['type'] == "freedns" || $pconfig['type'] == "namecheap") && $_POST['username'] == "") { + $_POST['username'] = "none"; + } + + /* input validation */ + $reqdfields = array(); + $reqdfieldsn = array(); + $reqdfields = array("type"); + $reqdfieldsn = array(gettext("Service type")); + if ($pconfig['type'] != "custom" && $pconfig['type'] != "custom-v6") { + $reqdfields[] = "host"; + $reqdfieldsn[] = gettext("Hostname"); + $reqdfields[] = "passwordfld"; + $reqdfieldsn[] = gettext("Password"); + $reqdfields[] = "username"; + $reqdfieldsn[] = gettext("Username"); + } else { + $reqdfields[] = "updateurl"; + $reqdfieldsn[] = gettext("Update URL"); + } + + do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors); + + if (isset($_POST['host']) && in_array("host", $reqdfields)) { + /* Namecheap can have a @. in hostname */ + if ($pconfig['type'] == "namecheap" && substr($_POST['host'], 0, 2) == '@.') { + $host_to_check = substr($_POST['host'], 2); + } else { + $host_to_check = $_POST['host']; + } + + if ($pconfig['type'] != "custom" && $pconfig['type'] != "custom-v6") { + if (!is_domain($host_to_check)) { + $input_errors[] = gettext("The hostname contains invalid characters."); + } + } + + unset($host_to_check); + } + if (($_POST['mx'] && !is_domain($_POST['mx']))) { + $input_errors[] = gettext("The MX contains invalid characters."); + } + if ((in_array("username", $reqdfields) && $_POST['username'] && !is_dyndns_username($_POST['username'])) || ((in_array("username", $reqdfields)) && ($_POST['username'] == ""))) { + $input_errors[] = gettext("The username contains invalid characters."); + } + + if (!$input_errors) { + $dyndns = array(); + $dyndns['type'] = $_POST['type']; + $dyndns['username'] = $_POST['username']; + $dyndns['password'] = $_POST['passwordfld']; + $dyndns['host'] = $_POST['host']; + $dyndns['mx'] = $_POST['mx']; + $dyndns['wildcard'] = $_POST['wildcard'] ? true : false; + $dyndns['verboselog'] = $_POST['verboselog'] ? true : false; + $dyndns['curl_ipresolve_v4'] = $_POST['curl_ipresolve_v4'] ? true : false; + $dyndns['curl_ssl_verifypeer'] = $_POST['curl_ssl_verifypeer'] ? true : false; + /* In this place enable means disabled */ + if ($_POST['enable']) { + unset($dyndns['enable']); + } else { + $dyndns['enable'] = true; + } + $dyndns['interface'] = $_POST['interface']; + $dyndns['zoneid'] = $_POST['zoneid']; + $dyndns['ttl'] = $_POST['ttl']; + $dyndns['updateurl'] = $_POST['updateurl']; + // Trim hard-to-type but sometimes returned characters + $dyndns['resultmatch'] = trim($_POST['resultmatch'], "\t\n\r"); + ($dyndns['type'] == "custom" || $dyndns['type'] == "custom-v6") ? $dyndns['requestif'] = $_POST['requestif'] : $dyndns['requestif'] = $_POST['interface']; + $dyndns['descr'] = $_POST['descr']; + $dyndns['force'] = isset($_POST['force']); + + if ($dyndns['username'] == "none") { + $dyndns['username'] = ""; + } + + if (isset($id) && $a_dyndns[$id]) { + $a_dyndns[$id] = $dyndns; + } else { + $a_dyndns[] = $dyndns; + $id = count($a_dyndns) - 1; + } + + $dyndns['id'] = $id; + //Probably overkill, but its better to be safe + for ($i = 0; $i < count($a_dyndns); $i++) { + $a_dyndns[$i]['id'] = $i; + } + + write_config(); + + services_dyndns_configure_client($dyndns); + + header("Location: services_dyndns.php"); + exit; + } +} + +$pgtitle = array(gettext("Services"), gettext("Dynamic DNS client")); +include("head.inc"); + +?> + +<body link="#0000CC" vlink="#0000CC" alink="#0000CC"> +<?php include("fbegin.inc"); ?> +<?php if ($input_errors) print_input_errors($input_errors); ?> +<?php if ($savemsg) print_info_box($savemsg); ?> +<script type="text/javascript"> +//<![CDATA[ +function _onTypeChange(type) { + switch (type) { + case "custom": + case "custom-v6": + document.getElementById("_resulttr").style.display = ''; + document.getElementById("_urltr").style.display = ''; + document.getElementById("_requestiftr").style.display = ''; + document.getElementById("_curloptions").style.display = ''; + document.getElementById("_hostnametr").style.display = 'none'; + document.getElementById("_mxtr").style.display = 'none'; + document.getElementById("_wildcardtr").style.display = 'none'; + document.getElementById("r53_zoneid").style.display='none'; + document.getElementById("r53_ttl").style.display='none'; + break; + case "dnsimple": + case "route53": + document.getElementById("_resulttr").style.display = 'none'; + document.getElementById("_urltr").style.display = 'none'; + document.getElementById("_requestiftr").style.display = 'none'; + document.getElementById("_curloptions").style.display = 'none'; + document.getElementById("_hostnametr").style.display = ''; + document.getElementById("_mxtr").style.display = ''; + document.getElementById("_wildcardtr").style.display = ''; + document.getElementById("r53_zoneid").style.display=''; + document.getElementById("r53_ttl").style.display=''; + break; + default: + document.getElementById("_resulttr").style.display = 'none'; + document.getElementById("_urltr").style.display = 'none'; + document.getElementById("_requestiftr").style.display = 'none'; + document.getElementById("_curloptions").style.display = 'none'; + document.getElementById("_hostnametr").style.display = ''; + document.getElementById("_mxtr").style.display = ''; + document.getElementById("_wildcardtr").style.display = ''; + document.getElementById("r53_zoneid").style.display='none'; + document.getElementById("r53_ttl").style.display='none'; + } +} +//]]> +</script> +<form action="services_dyndns_edit.php" method="post" name="iform" id="iform"> + <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="dynamic dns edit"> + <tr> + <td colspan="2" valign="top" class="optsect_t"> + <table border="0" cellspacing="0" cellpadding="0" width="100%" summary="title"> + <tr> + <td class="optsect_s"><strong><?=gettext("Dynamic DNS client");?></strong></td> + </tr> + </table> + </td> + </tr> + <tr> + <td width="22%" valign="top" class="vncell"><?=gettext("Disable");?></td> + <td width="78%" class="vtable"> + <input name="enable" type="checkbox" id="enable" value="<?=gettext("yes");?>" <?php if ($pconfig['enable']) echo "checked=\"checked\""; ?> /> + </td> + </tr> + <tr> + <td width="22%" valign="top" class="vncellreq"><?=gettext("Service type");?></td> + <td width="78%" class="vtable"> + <select name="type" class="formselect" id="type" onchange="_onTypeChange(this.options[this.selectedIndex].value);"> + <?php + $types = explode(",", DYNDNS_PROVIDER_DESCRIPTIONS); + $vals = explode(" ", DYNDNS_PROVIDER_VALUES); + $j = 0; + for ($j = 0; $j < count($vals); $j++): + ?> + <option value="<?=$vals[$j];?>" <?php if ($vals[$j] == $pconfig['type']) echo "selected=\"selected\"";?>> + <?=htmlspecialchars($types[$j]);?> + </option> + <?php + endfor; + ?> + </select> + </td> + </tr> + <tr> + <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface to monitor");?></td> + <td width="78%" class="vtable"> + <select name="interface" class="formselect" id="interface"> + <?php + $iflist = get_configured_interface_with_descr(); + foreach ($iflist as $if => $ifdesc) { + echo "<option value=\"{$if}\""; + if ($pconfig['interface'] == $if) { + echo "selected=\"selected\""; + } + echo ">{$ifdesc}</option>\n"; + } + unset($iflist); + $grouplist = return_gateway_groups_array(); + foreach ($grouplist as $name => $group) { + echo "<option value=\"{$name}\""; + if ($pconfig['interface'] == $name) { + echo "selected=\"selected\""; + } + echo ">GW Group {$name}</option>\n"; + } + unset($grouplist); + ?> + </select> + </td> + </tr> + <tr id="_requestiftr"> + <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface to send update from");?></td> + <td width="78%" class="vtable"> + <select name="requestif" class="formselect" id="requestif"> + <?php + $iflist = get_configured_interface_with_descr(); + foreach ($iflist as $if => $ifdesc) { + echo "<option value=\"{$if}\""; + if ($pconfig['requestif'] == $if) { + echo "selected=\"selected\""; + } + echo ">{$ifdesc}</option>\n"; + } + unset($iflist); + $grouplist = return_gateway_groups_array(); + foreach ($grouplist as $name => $group) { + echo "<option value=\"{$name}\""; + if ($pconfig['requestif'] == $name) { + echo "selected=\"selected\""; + } + echo ">GW Group {$name}</option>\n"; + } + unset($grouplist); + ?> + </select> + <br /><?=gettext("Note: This is almost always the same as the Interface to Monitor.");?> + </td> + </tr> + <tr id="_hostnametr"> + <td width="22%" valign="top" class="vncellreq"><?=gettext("Hostname");?></td> + <td width="78%" class="vtable"> + <input name="host" type="text" class="formfld unknown" id="host" size="30" value="<?=htmlspecialchars($pconfig['host']);?>" /> + <br /> + <span class="vexpl"> + <span class="red"> + <strong><?=gettext("Note:");?><br /></strong> + </span> + <?=gettext("Enter the complete host/domain name. example: myhost.dyndns.org");?><br /> + <?=gettext("he.net tunnelbroker: Enter your tunnel ID");?><br /> + <?=gettext("GleSYS: Enter your record ID");?><br /> + <?=gettext("DNSimple: Enter only the domain name");?><br /> + <?=gettext("DNS Made Easy: Enter your record ID separated by commas if more than one at a time");?> + </span> + </td> + </tr> + <tr id="_mxtr"> + <td width="22%" valign="top" class="vncell"><?=gettext("MX"); ?></td> + <td width="78%" class="vtable"> + <input name="mx" type="text" class="formfld unknown" id="mx" size="30" value="<?=htmlspecialchars($pconfig['mx']);?>" /> + <br /> + <?=gettext("Note: With DynDNS service you can only use a hostname, not an IP address.");?> + <br /> + <?=gettext("Set this option only if you need a special MX record. Not all services support this.");?> + </td> + </tr> + <tr id="_wildcardtr"> + <td width="22%" valign="top" class="vncell"><?=gettext("Wildcards"); ?></td> + <td width="78%" class="vtable"> + <input name="wildcard" type="checkbox" id="wildcard" value="yes" <?php if ($pconfig['wildcard']) echo "checked=\"checked\""; ?> /> + <?=gettext("Enable ");?><?=gettext("Wildcard"); ?> + </td> + </tr> + <tr id="_verboselogtr"> + <td width="22%" valign="top" class="vncell"><?=gettext("Verbose logging"); ?></td> + <td width="78%" class="vtable"> + <input name="verboselog" type="checkbox" id="verboselog" value="yes" <?php if ($pconfig['verboselog']) echo "checked=\"checked\""; ?> /> + <?=gettext("Enable ");?><?=gettext("verbose logging"); ?> + </td> + </tr> + <tr id="_curloptions"> + <td width="22%" valign="top" class="vncell"><?=gettext("CURL options"); ?></td> + <td width="78%" class="vtable"> + <input name="curl_ipresolve_v4" type="checkbox" id="curl_ipresolve_v4" value="yes" <?php if ($pconfig['curl_ipresolve_v4']) echo "checked=\"checked\""; ?> /> + <?=gettext("Force IPv4 resolving"); ?><br /> + <input name="curl_ssl_verifypeer" type="checkbox" id="curl_ssl_verifypeer" value="yes" <?php if ($pconfig['curl_ssl_verifypeer']) echo "checked=\"checked\""; ?> /> + <?=gettext("Verify SSL peer"); ?> + </td> + </tr> + <tr id="_usernametr"> + <td width="22%" valign="top" class="vncellreq"><?=gettext("Username");?></td> + <td width="78%" class="vtable"> + <input name="username" type="text" class="formfld user" id="username" size="20" value="<?=htmlspecialchars($pconfig['username']);?>" /> + <br /><?=gettext("Username is required for all types except Namecheap, FreeDNS and Custom Entries.");?> + <br /><?=gettext("Route 53: Enter your Access Key ID.");?> + <br /><?=gettext("GleSYS: Enter your API user.");?> + <br /><?=gettext("For Custom Entries, Username and Password represent HTTP Authentication username and passwords.");?> + </td> + </tr> + <tr> + <td width="22%" valign="top" class="vncellreq"><?=gettext("Password");?></td> + <td width="78%" class="vtable"> + <input name="passwordfld" type="password" class="formfld pwd" id="passwordfld" size="20" value="<?=htmlspecialchars($pconfig['password']);?>" /> + <br /> + <?=gettext("FreeDNS (freedns.afraid.org): Enter your \"Authentication Token\" provided by FreeDNS.");?> + <br /><?=gettext("Route 53: Enter your Secret Access Key.");?> + <br /><?=gettext("GleSYS: Enter your API key.");?> + <br /><?=gettext("DNSimple: Enter your API token.");?> + </td> + </tr> + <tr id="r53_zoneid" style="display:none"> + <td width="22%" valign="top" class="vncellreq"><?=gettext("Zone ID");?></td> + <td width="78%" class="vtable"> + <input name="zoneid" type="text" class="formfld user" id="zoneid" size="20" value="<?=htmlspecialchars($pconfig['zoneid']);?>" /> + <br /><?=gettext("Enter Zone ID that you received when you created your domain in Route 53.");?> + <br /><?=gettext("DNSimple: Enter the Record ID of record to update.");?> + </td> + </tr> + <tr id="_urltr"> + <td width="22%" valign="top" class="vncell"><?=gettext("Update URL");?></td> + <td width="78%" class="vtable"> + <input name="updateurl" type="text" class="formfld unknown" id="updateurl" size="60" value="<?=htmlspecialchars($pconfig['updateurl']);?>" /> + <br /><?=gettext("This is the only field required by for Custom Dynamic DNS, and is only used by Custom Entries.");?> + <br /><?=gettext("If you need the new IP to be included in the request, put %IP% in its place.");?> + </td> + </tr> + <tr id="_resulttr"> + <td width="22%" valign="top" class="vncell"><?=gettext("Result Match");?></td> + <td width="78%" class="vtable"> + <textarea name="resultmatch" class="formpre" id="resultmatch" cols="65" rows="7"><?=htmlspecialchars($pconfig['resultmatch']);?></textarea> + <br /><?=gettext("This field is only used by Custom Dynamic DNS Entries.");?> + <br /><?=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.");?> + <br /><?=gettext("If you need the new IP to be included in the request, put %IP% in its place.");?> + <br /><?=gettext("If you need to include multiple possible values, separate them with a |. If your provider includes a |, escape it with \\|");?> + <br /><?=gettext("Tabs (\\t), newlines (\\n) and carriage returns (\\r) at the beginning or end of the returned results are removed before comparison.");?> + </td> + </tr> + <tr id="r53_ttl" style="display:none"> + <td width="22%" valign="top" class="vncellreq"><?=gettext("TTL");?></td> + <td width="78%" class="vtable"> + <input name="ttl" type="text" class="formfld user" id="ttl" size="20" value="<?=htmlspecialchars($pconfig['ttl']);?>" /> + <br /><?=gettext("Choose TTL for your dns record.");?> + </td> + </tr> + <tr> + <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td> + <td width="78%" class="vtable"> + <input name="descr" type="text" class="formfld unknown" id="descr" size="60" value="<?=htmlspecialchars($pconfig['descr']);?>" /> + </td> + </tr> + <tr> + <td width="22%" valign="top"> </td> + <td width="78%"> + <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" onclick="enable_change(true)" /> + <a href="services_dyndns.php"><input name="cancel" type="button" class="formbtn" value="<?=gettext("Cancel");?>" /></a> + <?php if (isset($id) && $a_dyndns[$id]): ?> + <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" /> + <input name="force" type="submit" class="formbtn" value="<?=gettext("Save & Force Update");?>" onclick="enable_change(true)" /> + <?php endif; ?> + </td> + </tr> + <tr> + <td width="22%" valign="top"> </td> + <td width="78%"> + <span class="vexpl"> + <span class="red"> + <strong> + <?=gettext("Note:");?><br /> + </strong> + </span> + <?php printf(gettext("You must configure a DNS server in %sSystem: + General setup%s or allow the DNS server list to be overridden + by DHCP/PPP on WAN for dynamic DNS updates to work."), '<a href="system.php">', '</a>');?> + </span> + </td> + </tr> + </table> +</form> +<?php include("fend.inc"); ?> + +<script type="text/javascript"> +//<![CDATA[ +_onTypeChange("<?php echo $pconfig['type']; ?>"); +//]]> +</script> + +</body> +</html> |