###############################################################################
use strict;
+use experimental 'smartmatch';
# enable only the following on debugging purpose
#use warnings;
my %color = ();
my %mainsettings = ();
&General::readhash("${General::swroot}/main/settings", \%mainsettings);
-&General::readhash("/srv/web/ipfire/html/themes/".$mainsettings{'THEME'}."/include/colors.txt", \%color);
+&General::readhash("/srv/web/ipfire/html/themes/ipfire/include/colors.txt", \%color);
# Config file for basic configuration.
my $settingsfile = "${General::swroot}/ddns/settings";
$settings{'DOMAIN'} = '';
$settings{'LOGIN'} = '';
$settings{'PASSWORD'} = '';
+$settings{'TOKEN'} = '';
$settings{'ENABLED'} = '';
$settings{'PROXY'} = '';
$settings{'SERVICE'} = '';
$settings{'ACTION'} = '';
-# Get supported ddns providers.
-my @providers = &GetProviders();
+# Get all supported ddns providers.
+my @providers = &GetProviders("all");
+
+# Get provider which support a token based authentication mechanism.
+my @token_provider = &GetProviders("token-providers");
# Hook to regenerate the configuration files, if cgi got called from command line.
if ($ENV{"REMOTE_ADDR"} eq "") {
$errormessage = $Lang::tr{'password not set'};
}
+ # Check if a token has been given for provider which support tokens.
+ if (($settings{'SERVICE'} ~~ @token_provider) && ($settings{'TOKEN'} eq '')) {
+ $errormessage = $Lang::tr{'token not set'};
+ }
+
# Go furter if there was no error.
if (!$errormessage) {
# Splitt hostname field into 2 parts for storrage.
$settings{'ENABLED'} = 'off';
}
+ # Handle token provider.
+ if($settings{'SERVICE'} ~~ @token_provider) {
+ # Clear username and password if they contain values.
+ undef($settings{'LOGIN'});
+ undef($settings{'PASSWORD'});
+
+ # Assign the token as a password for saving.
+ $settings{'PASSWORD'} = $settings{'TOKEN'};
+ }
+
# Handle adding new accounts.
if ($settings{'ACTION'} eq $Lang::tr{'add'}) {
# Open /var/ipfire/ddns/config for writing.
# Write out notice to logfile.
&General::log($Lang::tr{'ddns hostname modified'});
}
- undef $settings{'ID'};
+ # Clear settings hash.
+ %settings = '';
# Update ddns config file.
&GenerateDDNSConfigFile();
$settings{'WILDCARDS'} = $temp[4];
$settings{'LOGIN'} = $temp[5];
$settings{'PASSWORD'} = $temp[6];
+ $settings{'TOKEN'} = $temp[6];
$settings{'ENABLED'} = $temp[7];
}
}
&Header::openpage($Lang::tr{'dynamic dns'}, 1, '');
+
+### Java Script ###
+print"<script>\n";
+
+# Generate Java Script Array which contains the provider that support token.
+my $line = "";
+$line = join("', '", @token_provider);
+
+print "\t// Array which contains the providers that support token.\n";
+print "\ttoken_provider = ['$line']\;\n\n";
+
+print <<END
+ // Java Script function to swap the text input fields for
+ // username and password or token.
+ var update_auth = function() {
+ if(inArray(\$('#SERVICE').val(), token_provider)) {
+ \$('.username').hide();
+ \$('.password').hide();
+ \$('.token').show();
+ } else {
+ \$('.username').show();
+ \$('.password').show();
+ \$('.token').hide();
+ }
+ };
+
+ // Java Script function to check if a given value is part of
+ // an array.
+ function inArray(value,array) {
+ var count=array.length;
+
+ for(var i=0;i<count;i++) {
+ if(array[i]===value){
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ // JQuery function to call corresponding function when
+ // the service provider is changed or the page is loaded for showing/hiding
+ // the username/password or token area.
+ \$(document).ready(function() {
+ \$('#SERVICE').change(update_auth);
+ update_auth();
+ });
+
+</script>
+END
+;
+
&Header::openbigbox('100%', 'left', '', $errormessage);
# Read file for general ddns settings.
END
;
# Generate dropdown menu for service selection.
- print"<select size='1' name='SERVICE'>\n";
+ print"<select size='1' name='SERVICE' id='SERVICE'>\n";
my $selected;
<tr>
<td class='base'>$Lang::tr{'enabled'}</td>
<td><input type='checkbox' name='ENABLED' $checked{'ENABLED'}{'on'} /></td>
- <td class='base'>$Lang::tr{'username'}</td>
- <td><input type='text' name='LOGIN' value='$settings{'LOGIN'}' /></td>
+
+ <td class='username'>$Lang::tr{'username'}</td>
+ <td class='username'><input type='text' name='LOGIN' value='$settings{'LOGIN'}' /></td>
+
+ <td class='token' style='display:none'>$Lang::tr{'token'}</td>
+ <td class='token' style='display:none'><input type='text' name='TOKEN' value='$settings{'TOKEN'}' /></td>
</tr>
- <tr>
+ <tr class='password'>
<td class='base'></td>
<td></td>
<td class='base'>$Lang::tr{'password'}</td>
my $use_token = 0;
# Handle token based auth for various providers.
- if ($provider ~~ ["dns.lightningwirelabs.com", "entrydns.net", "regfish.com",
- "spdns.de", "zzzz.io"] && $username eq "token") {
+ if ($provider ~~ @token_provider) {
$use_token = 1;
+ }
# Handle token auth for freedns.afraid.org and regfish.com.
- } elsif ($provider ~~ ["freedns.afraid.org", "regfish.com"] && $password eq "") {
+ if ($provider ~~ ["freedns.afraid.org", "regfish.com"] && $password eq "") {
$use_token = 1;
$password = $username;
}
# Function which generates an array (@providers) which contains the supported providers.
-sub GetProviders {
- # Get supported providers.
- open(PROVIDERS, "/usr/bin/ddns list-providers |");
+sub GetProviders ($) {
+ my ($type) = @_;
+
+ # Set default type to get all providers
+ $type = $type ? $type : "all";
+
+ # Check if the requested type is "token-providers".
+ if ($type eq "token-providers") {
+ # Call ddns util to only get providers which supports token based auth.
+ open(PROVIDERS, "/usr/bin/ddns list-token-providers |");
+ } else {
+ # Get all supported providers.
+ open(PROVIDERS, "/usr/bin/ddns list-providers |");
+ }
# Create new array to store the providers.
my @providers = ();