]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/blobdiff - html/cgi-bin/ovpnmain.cgi
Merge remote-tracking branch 'alfh/feature_vnstat_1.11' into beyond-next
[people/teissler/ipfire-2.x.git] / html / cgi-bin / ovpnmain.cgi
index 165f3511c45472ac91aaaa0f1890a4ddff17c41c..ceb63d45669ab1799292b5b3ccb9ccffa237eba7 100644 (file)
@@ -2,7 +2,7 @@
 ###############################################################################
 #                                                                             #
 # IPFire.org - A linux based firewall                                         #
-# Copyright (C) 2007-2011  IPFire Team  <info@ipfire.org>                     #
+# Copyright (C) 2007-2013  IPFire Team  <info@ipfire.org>                     #
 #                                                                             #
 # This program is free software: you can redistribute it and/or modify        #
 # it under the terms of the GNU General Public License as published by        #
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.       #
 #                                                                             #
 ###############################################################################
-
+###
+# Based on IPFireCore 76
+###
 use CGI;
 use CGI qw/:standard/;
 use Net::DNS;
 use Net::Ping;
+use Net::Telnet;
 use File::Copy;
 use File::Temp qw/ tempfile tempdir /;
 use strict;
 use Archive::Zip qw(:ERROR_CODES :CONSTANTS);
+use Sort::Naturally;
 require '/var/ipfire/general-functions.pl';
 require "${General::swroot}/lang.pl";
 require "${General::swroot}/header.pl";
@@ -36,7 +40,7 @@ require "${General::swroot}/countries.pl";
 #use warnings;
 #use CGI::Carp 'fatalsToBrowser';
 #workaround to suppress a warning when a variable is used only once
-my @dummy = ( ${Header::colourgreen} );
+my @dummy = ( ${Header::colourgreen}, ${Header::colourblue} );
 undef (@dummy);
 
 my %color = ();
@@ -47,6 +51,9 @@ my %mainsettings = ();
 ###
 ### Initialize variables
 ###
+my %ccdconfhash=();
+my %ccdroutehash=();
+my %ccdroute2hash=();
 my %netsettings=();
 my %cgiparams=();
 my %vpnsettings=();
@@ -57,6 +64,12 @@ my %selected=();
 my $warnmessage = '';
 my $errormessage = '';
 my %settings=();
+my $routes_push_file = '';
+my $confighost="${General::swroot}/fwhosts/customhosts";
+my $configgrp="${General::swroot}/fwhosts/customgroups";
+my $customnet="${General::swroot}/fwhosts/customnetworks";
+my $name;
+my $col="";
 &General::readhash("${General::swroot}/ethernet/settings", \%netsettings);
 $cgiparams{'ENABLED'} = 'off';
 $cgiparams{'ENABLED_BLUE'} = 'off';
@@ -67,12 +80,23 @@ $cgiparams{'COMPRESSION'} = 'off';
 $cgiparams{'ONLY_PROPOSED'} = 'off';
 $cgiparams{'ACTION'} = '';
 $cgiparams{'CA_NAME'} = '';
+$cgiparams{'DH_NAME'} = 'dh1024.pem';
+$cgiparams{'DHLENGHT'} = '';
 $cgiparams{'DHCP_DOMAIN'} = '';
 $cgiparams{'DHCP_DNS'} = '';
 $cgiparams{'DHCP_WINS'} = '';
+$cgiparams{'ROUTES_PUSH'} = '';
 $cgiparams{'DCOMPLZO'} = 'off';
 $cgiparams{'MSSFIX'} = '';
-
+$cgiparams{'number'} = '';
+$cgiparams{'PMTU_DISCOVERY'} = '';
+$cgiparams{'DAUTH'} = '';
+$cgiparams{'DCIPHER'} = '';
+$routes_push_file = "${General::swroot}/ovpn/routes_push";
+unless (-e $routes_push_file)    { system("touch $routes_push_file"); }
+unless (-e "${General::swroot}/ovpn/ccd.conf")    { system("touch ${General::swroot}/ovpn/ccd.conf"); }
+unless (-e "${General::swroot}/ovpn/ccdroute")    { system("touch ${General::swroot}/ovpn/ccdroute"); }
+unless (-e "${General::swroot}/ovpn/ccdroute2")    { system("touch ${General::swroot}/ovpn/ccdroute2"); }
 
 &Header::getcgihash(\%cgiparams, {'wantfile' => 1, 'filevar' => 'FH'});
 
@@ -109,21 +133,6 @@ sub sizeformat{
     return("$newsize $units[$i]");
 }
 
-sub valid_dns_host {
-       my $hostname = $_[0];
-       unless ($hostname) { return "No hostname"};
-       my $res = new Net::DNS::Resolver;
-       my $query = $res->search("$hostname");
-       if ($query) {
-               foreach my $rr ($query->answer) {
-                       ## Potential bug - we are only looking at A records:
-                       return 0 if $rr->type eq "A";
-               }
-       } else {
-               return $res->errorstring;
-       }
-}
-
 sub cleanssldatabase
 {
     if (open(FILE, ">${General::swroot}/ovpn/certs/serial")) {
@@ -162,49 +171,29 @@ sub deletebackupcert
                unlink ("${General::swroot}/ovpn/certs/$hexvalue.pem");
        }
 }
-
 sub checkportfw {
-    my $KEY2 = $_[0]; # key2
-    my $SRC_PORT = $_[1]; # src_port
-    my $PROTOCOL = $_[2]; # protocol
-    my $SRC_IP = $_[3]; # sourceip
-
-    my $pfwfilename = "${General::swroot}/portfw/config";
-    open(FILE, $pfwfilename) or die 'Unable to open config file.';
-    my @pfwcurrent = <FILE>;
-    close(FILE);
-    my $pfwkey1 = 0; # used for finding last sequence number used 
-    foreach my $pfwline (@pfwcurrent)
-    {
-       my @pfwtemp = split(/\,/,$pfwline);
-
-       chomp ($pfwtemp[8]);
-       if ($KEY2 eq "0"){ # if key2 is 0 then it is a portfw addition
-               if ( $SRC_PORT eq $pfwtemp[3] &&
-                       $PROTOCOL eq $pfwtemp[2] &&
-                       $SRC_IP eq $pfwtemp[7])
-               {
-                        $errormessage = "$Lang::tr{'source port in use'} $SRC_PORT";
-               }
-               # Check if key2 = 0, if it is then it is a port forward entry and we want the sequence number
-               if ( $pfwtemp[1] eq "0") {
-                       $pfwkey1=$pfwtemp[0];
-               }
-               # Darren Critchley - Duplicate or overlapping Port range check
-               if ($pfwtemp[1] eq "0" && 
-                       $PROTOCOL eq $pfwtemp[2] &&
-                       $SRC_IP eq $pfwtemp[7] &&
-                       $errormessage eq '') 
-               {
-                       &portchecks($SRC_PORT, $pfwtemp[5]);            
-#                      &portchecks($pfwtemp[3], $pfwtemp[5]);
-#                      &portchecks($pfwtemp[3], $SRC_IP);
+       my $DPORT = shift;
+       my $DPROT = shift;
+       my %natconfig =();
+       my $confignat = "${General::swroot}/firewall/config";
+       $DPROT= uc ($DPROT);
+       &General::readhasharray($confignat, \%natconfig);
+       foreach my $key (sort keys %natconfig){
+               my @portarray = split (/\|/,$natconfig{$key}[30]);
+               foreach my $value (@portarray){
+                       if ($value =~ /:/i){
+                               my ($a,$b) = split (":",$value);
+                               if ($DPROT eq $natconfig{$key}[12] && $DPORT gt $a && $DPORT lt $b){
+                                       $errormessage= "$Lang::tr{'source port in use'} $DPORT";
+                               }
+                       }else{
+                               if ($DPROT eq $natconfig{$key}[12] && $DPORT eq $value){
+                                       $errormessage= "$Lang::tr{'source port in use'} $DPORT";
+                               }
+                       }
                }
        }
-    }
-#    $errormessage="$KEY2 $SRC_PORT $PROTOCOL $SRC_IP";
-
-    return;
+       return;
 }
 
 sub checkportoverlap
@@ -236,42 +225,16 @@ sub checkportinc
                return 0; 
        }
 }
-# Darren Critchley - Duplicate or overlapping Port range check
-sub portchecks
-{
-       my $p1 = $_[0]; # New port range
-       my $p2 = $_[1]; # existing port range
-#      $_ = $_[0];
-       our ($prtrange1, $prtrange2);
-       $prtrange1 = 0;
-#      if (m/:/ && $prtrange1 == 1) { # comparing two port ranges
-#              unless (&checkportoverlap($p1,$p2)) {
-#                      $errormessage = "$Lang::tr{'source port overlaps'} $p1";
-#              }
-#      }
-       if (m/:/ && $prtrange1 == 0 && $errormessage eq '') { # compare one port to a range
-               unless (&checkportinc($p2,$p1)) {
-                       $errormessage = "$Lang::tr{'srcprt within existing'} $p1";
-               }
-       }
-       $prtrange1 = 1;
-       if (! m/:/ && $prtrange1 == 1 && $errormessage eq '') { # compare one port to a range
-               unless (&checkportinc($p1,$p2)) {
-                       $errormessage = "$Lang::tr{'srcprt range overlaps'} $p2";
-               }
-       }
-       return;
-}
 
-# Darren Critchley - certain ports are reserved for IPFire 
-# TCP 67,68,81,222,445
+# Darren Critchley - certain ports are reserved for IPFire
+# TCP 67,68,81,222,444
 # UDP 67,68
 # Params passed in -> port, rangeyn, protocol
 sub disallowreserved
 {
        # port 67 and 68 same for tcp and udp, don't bother putting in an array
        my $msg = "";
-       my @tcp_reserved = (81,222,445);
+       my @tcp_reserved = (81,222,444);
        my $prt = $_[0]; # the port or range
        my $ryn = $_[1]; # tells us whether or not it is a port range
        my $prot = $_[2]; # protocol
@@ -307,10 +270,13 @@ sub disallowreserved
        return;
 }
 
+
 sub writeserverconf {
-    my %sovpnsettings = ();    
+    my %sovpnsettings = ();  
+    my @temp = ();  
     &General::readhash("${General::swroot}/ovpn/settings", \%sovpnsettings);
-
+    &read_routepushfile;
+    
     open(CONF,    ">${General::swroot}/ovpn/server.conf") or die "Unable to open ${General::swroot}/ovpn/server.conf: $!";
     flock CONF, 2;
     print CONF "#OpenVPN Server conf\n";
@@ -320,34 +286,83 @@ sub writeserverconf {
     print CONF "#DAN prepare OpenVPN for listening on blue and orange\n";
     print CONF ";local $sovpnsettings{'VPN_IP'}\n";
     print CONF "dev $sovpnsettings{'DDEVICE'}\n";
-    print CONF "$sovpnsettings{'DDEVICE'}-mtu $sovpnsettings{'DMTU'}\n";
     print CONF "proto $sovpnsettings{'DPROTOCOL'}\n";
     print CONF "port $sovpnsettings{'DDEST_PORT'}\n";
     print CONF "script-security 3 system\n";
     print CONF "ifconfig-pool-persist /var/ipfire/ovpn/ovpn-leases.db 3600\n";
+    print CONF "client-config-dir /var/ipfire/ovpn/ccd\n";
     print CONF "tls-server\n";
-    print CONF "ca /var/ipfire/ovpn/ca/cacert.pem\n";
-    print CONF "cert /var/ipfire/ovpn/certs/servercert.pem\n";
-    print CONF "key /var/ipfire/ovpn/certs/serverkey.pem\n";
-    print CONF "dh /var/ipfire/ovpn/ca/dh1024.pem\n";
+    print CONF "ca ${General::swroot}/ovpn/ca/cacert.pem\n";
+    print CONF "cert ${General::swroot}/ovpn/certs/servercert.pem\n";
+    print CONF "key ${General::swroot}/ovpn/certs/serverkey.pem\n";
+       print CONF "dh ${General::swroot}/ovpn/ca/dh1024.pem\n";
     my @tempovpnsubnet = split("\/",$sovpnsettings{'DOVPN_SUBNET'});
     print CONF "server $tempovpnsubnet[0] $tempovpnsubnet[1]\n";
-    print CONF "push \"route $netsettings{'GREEN_NETADDRESS'} $netsettings{'GREEN_NETMASK'}\"\n";
-    if ($sovpnsettings{CLIENT2CLIENT} eq 'on') {
+    #print CONF "push \"route $netsettings{'GREEN_NETADDRESS'} $netsettings{'GREEN_NETMASK'}\"\n";
+
+    # Check if we are using mssfix, fragment or mtu-disc and set the corretct mtu of 1500.
+    # If we doesn't use one of them, we can use the configured mtu value.
+    if ($sovpnsettings{'MSSFIX'} eq 'on') 
+       { print CONF "$sovpnsettings{'DDEVICE'}-mtu 1500\n"; }
+    elsif ($sovpnsettings{'FRAGMENT'} ne '' && $sovpnsettings{'DPROTOCOL'} ne 'tcp') 
+       { print CONF "$sovpnsettings{'DDEVICE'}-mtu 1500\n"; }
+    elsif (($sovpnsettings{'PMTU_DISCOVERY'} eq 'yes') ||
+       ($sovpnsettings{'PMTU_DISCOVERY'} eq 'maybe') ||
+       ($sovpnsettings{'PMTU_DISCOVERY'} eq 'no' ))
+       { print CONF "$sovpnsettings{'DDEVICE'}-mtu 1500\n"; } 
+    else 
+       { print CONF "$sovpnsettings{'DDEVICE'}-mtu $sovpnsettings{'DMTU'}\n"; }
+
+    if ($vpnsettings{'ROUTES_PUSH'} ne '') {
+               @temp = split(/\n/,$vpnsettings{'ROUTES_PUSH'});
+               foreach (@temp)
+               {
+                       @tempovpnsubnet = split("\/",&General::ipcidr2msk($_));
+                       print CONF "push \"route " . $tempovpnsubnet[0]. " " .  $tempovpnsubnet[1] . "\"\n";
+               }
+       }
+# a.marx ccd
+       my %ccdconfhash=();
+       &General::readhasharray("${General::swroot}/ovpn/ccd.conf", \%ccdconfhash);
+       foreach my $key (keys %ccdconfhash) {
+               my $a=$ccdconfhash{$key}[1];
+               my ($b,$c) = split (/\//, $a);
+               print CONF "route $b ".&General::cidrtosub($c)."\n";
+       }
+       my %ccdroutehash=();
+       &General::readhasharray("${General::swroot}/ovpn/ccdroute", \%ccdroutehash);
+       foreach my $key (keys %ccdroutehash) {
+               foreach my $i ( 1 .. $#{$ccdroutehash{$key}}){
+                       my ($a,$b)=split (/\//,$ccdroutehash{$key}[$i]);
+                       print CONF "route $a $b\n";
+               }
+       }
+# ccd end
+
+       if ($sovpnsettings{CLIENT2CLIENT} eq 'on') {
        print CONF "client-to-client\n";
     }
     if ($sovpnsettings{MSSFIX} eq 'on') {
-       print CONF "mssfix\n";
+               print CONF "mssfix\n";
     }
     if ($sovpnsettings{FRAGMENT} ne '' && $sovpnsettings{'DPROTOCOL'} ne 'tcp') {
-       print CONF "fragment $sovpnsettings{'FRAGMENT'}\n";
+               print CONF "fragment $sovpnsettings{'FRAGMENT'}\n";
+    }
+
+    # Check if a valid operating mode has been choosen and use it.
+    if (($sovpnsettings{'PMTU_DISCOVERY'} eq 'yes') ||
+       ($sovpnsettings{'PMTU_DISCOVERY'} eq 'maybe') ||
+       ($sovpnsettings{'PMTU_DISCOVERY'} eq 'no' )) {
+               print CONF "mtu-disc $sovpnsettings{'PMTU_DISCOVERY'}\n";
     }
+
     if ($sovpnsettings{KEEPALIVE_1} > 0 && $sovpnsettings{KEEPALIVE_2} > 0) {  
        print CONF "keepalive $sovpnsettings{'KEEPALIVE_1'} $sovpnsettings{'KEEPALIVE_2'}\n";
     }  
     print CONF "status-version 1\n";
     print CONF "status /var/log/ovpnserver.log 30\n";
     print CONF "cipher $sovpnsettings{DCIPHER}\n";
+       print CONF "auth $sovpnsettings{DAUTH}\n";
     if ($sovpnsettings{DCOMPLZO} eq 'on') {
         print CONF "comp-lzo\n";
     }
@@ -372,7 +387,7 @@ sub writeserverconf {
     if ($sovpnsettings{DHCP_WINS} ne '') {
        print CONF "max-clients $sovpnsettings{MAX_CLIENTS}\n";
     }  
-    print CONF "tls-verify /var/ipfire/ovpn/verify\n";
+    print CONF "tls-verify /usr/lib/openvpn/verify\n";
     print CONF "crl-verify /var/ipfire/ovpn/crls/cacrl.pem\n";
     print CONF "user nobody\n";
     print CONF "group nobody\n";
@@ -387,7 +402,7 @@ sub writeserverconf {
     
     close(CONF);
 }    
-#
+
 sub emptyserverlog{
     if (open(FILE, ">/var/log/ovpnserver.log")) {
        flock FILE, 2;
@@ -397,6 +412,274 @@ sub emptyserverlog{
 
 }
 
+sub delccdnet 
+{
+       my %ccdconfhash = ();
+       my %ccdhash = ();
+       my $ccdnetname=$_[0];
+       if (-f "${General::swroot}/ovpn/ovpnconfig"){
+               &General::readhasharray("${General::swroot}/ovpn/ovpnconfig", \%ccdhash);
+               foreach my $key (keys %ccdhash) {
+                       if ($ccdhash{$key}[32] eq $ccdnetname) {
+                               $errormessage=$Lang::tr{'ccd err hostinnet'};
+                               return;
+                       }
+               }
+       }
+       &General::readhasharray("${General::swroot}/ovpn/ccd.conf", \%ccdconfhash);
+       foreach my $key (keys %ccdconfhash) {
+                       if ($ccdconfhash{$key}[0] eq $ccdnetname){
+                               delete $ccdconfhash{$key};
+                       }
+       }
+       &General::writehasharray("${General::swroot}/ovpn/ccd.conf", \%ccdconfhash);
+       
+       &writeserverconf;
+       return 0;
+}
+
+sub addccdnet
+{
+       my %ccdconfhash=();
+       my @ccdconf=();
+       my $ccdname=$_[0];
+       my $ccdnet=$_[1];
+       my $subcidr;
+       my @ip2=();
+       my $checkup;
+       my $ccdip;
+       my $baseaddress;
+       
+       
+       #check name     
+       if ($ccdname eq '') 
+       {
+               $errormessage=$errormessage.$Lang::tr{'ccd err name'}."<br>";
+               return
+       }
+       
+       if(!&General::validhostname($ccdname))
+       {
+               $errormessage=$Lang::tr{'ccd err invalidname'};
+               return;
+       }
+               
+       ($ccdip,$subcidr) = split (/\//,$ccdnet);
+       $subcidr=&General::iporsubtocidr($subcidr);
+       #check subnet
+       if ($subcidr > 30)
+       {
+               $errormessage=$Lang::tr{'ccd err invalidnet'};
+               return;
+       }
+       #check ip
+       if (!&General::validipandmask($ccdnet)){
+               $errormessage=$Lang::tr{'ccd err invalidnet'};
+               return;
+       }
+       
+       $errormessage=&General::checksubnets($ccdname,$ccdnet);
+       
+               
+       if (!$errormessage) {
+               my %ccdconfhash=();
+               $baseaddress=&General::getnetworkip($ccdip,$subcidr);
+               &General::readhasharray("${General::swroot}/ovpn/ccd.conf", \%ccdconfhash);
+               my $key = &General::findhasharraykey (\%ccdconfhash);
+               foreach my $i (0 .. 1) { $ccdconfhash{$key}[$i] = "";}
+               $ccdconfhash{$key}[0] = $ccdname;
+               $ccdconfhash{$key}[1] = $baseaddress."/".$subcidr;
+               &General::writehasharray("${General::swroot}/ovpn/ccd.conf", \%ccdconfhash);
+               &writeserverconf;
+               $cgiparams{'ccdname'}='';
+               $cgiparams{'ccdsubnet'}='';
+               return 1;
+       }
+}
+
+sub modccdnet
+{
+       
+       my $newname=$_[0];
+       my $oldname=$_[1];
+       my %ccdconfhash=();
+       my %ccdhash=();
+       &General::readhasharray("${General::swroot}/ovpn/ccd.conf", \%ccdconfhash);
+       foreach my $key (keys %ccdconfhash) {
+               if ($ccdconfhash{$key}[0] eq $oldname) {
+                       foreach my $key1 (keys %ccdconfhash) {
+                               if ($ccdconfhash{$key1}[0] eq $newname){
+                                       $errormessage=$errormessage.$Lang::tr{'ccd err netadrexist'};
+                                       return;
+                               }else{
+                                       $ccdconfhash{$key}[0]= $newname;
+                                       &General::writehasharray("${General::swroot}/ovpn/ccd.conf", \%ccdconfhash);
+                                       last;
+                               }
+                       }
+               }
+       }
+       
+       &General::readhasharray("${General::swroot}/ovpn/ovpnconfig", \%ccdhash);
+               foreach my $key (keys %ccdhash) {
+                       if ($ccdhash{$key}[32] eq $oldname) {
+                               $ccdhash{$key}[32]=$newname;
+                               &General::writehasharray("${General::swroot}/ovpn/ovpnconfig", \%ccdhash);
+                               last;
+                       }
+               }
+       
+       return 0;
+}
+sub ccdmaxclients
+{
+       my $ccdnetwork=$_[0];
+       my @octets=();
+       my @subnet=();
+       @octets=split("\/",$ccdnetwork);
+       @subnet= split /\./, &General::cidrtosub($octets[1]);
+       my ($a,$b,$c,$d,$e);
+       $a=256-$subnet[0];
+       $b=256-$subnet[1];
+       $c=256-$subnet[2];
+       $d=256-$subnet[3];
+       $e=($a*$b*$c*$d)/4;
+       return $e-1;
+}
+
+sub getccdadresses 
+{
+       my $ipin=$_[0];
+       my ($ip1,$ip2,$ip3,$ip4)=split  /\./, $ipin;
+       my $cidr=$_[1];
+       chomp($cidr);
+       my $count=$_[2];
+       my $hasip=$_[3];
+       chomp($hasip);
+       my @iprange=();
+       my %ccdhash=();
+       &General::readhasharray("${General::swroot}/ovpn/ovpnconfig", \%ccdhash);
+       $iprange[0]=$ip1.".".$ip2.".".$ip3.".".2;
+       for (my $i=1;$i<=$count;$i++) {
+               my $tmpip=$iprange[$i-1];
+               my $stepper=$i*4;
+               $iprange[$i]= &General::getnextip($tmpip,4);
+       }
+       my $r=0;
+       foreach my $key (keys %ccdhash) {
+               $r=0;
+               foreach  my $tmp (@iprange){
+                       my ($net,$sub) = split (/\//,$ccdhash{$key}[33]);
+                       if ($net eq $tmp) {
+                               if ( $hasip ne  $ccdhash{$key}[33] ){
+                                       splice (@iprange,$r,1);
+                               }
+                       }
+                       $r++;
+               }
+       }
+       return @iprange;
+}
+
+sub fillselectbox
+{
+       my $boxname=$_[1];
+       my ($ccdip,$subcidr) = split("/",$_[0]); 
+       my $tz=$_[2];
+       my @allccdips=&getccdadresses($ccdip,$subcidr,&ccdmaxclients($ccdip."/".$subcidr),$tz);
+       print"<select name='$boxname' STYLE='font-family : arial; font-size : 9pt; width:130px;' >";
+       foreach (@allccdips) {
+               my $ip=$_."/30";
+               chomp($ip);
+               print "<option value='$ip' ";
+               if ( $ip eq $cgiparams{$boxname} ){
+                       print"selected";
+               }
+               print ">$ip</option>";
+       }
+       print "</select>";
+}
+
+sub hostsinnet
+{
+       my $name=$_[0];
+       my %ccdhash=();
+       my $i=0;
+       &General::readhasharray("${General::swroot}/ovpn/ovpnconfig", \%ccdhash);
+       foreach my $key (keys %ccdhash) {
+               if ($ccdhash{$key}[32] eq $name){ $i++;}
+       }
+       return $i;
+}
+
+sub check_routes_push
+{
+                       my $val=$_[0];
+                       my ($ip,$cidr) = split (/\//, $val);
+                       ##check for existing routes in routes_push
+                       if (-e "${General::swroot}/ovpn/routes_push") {
+                               open(FILE,"${General::swroot}/ovpn/routes_push");
+                               while (<FILE>) {
+                                       $_=~s/\s*$//g;
+                                       
+                                       my ($ip2,$cidr2) = split (/\//,"$_");
+                                       my $val2=$ip2."/".&General::iporsubtodec($cidr2);
+                                       
+                                       if($val eq $val2){
+                                               return 0;
+                                       }
+                                       #subnetcheck
+                                       if (&General::IpInSubnet ($ip,$ip2,&General::iporsubtodec($cidr2))){
+                                               return 0;
+                                       }
+                               };
+                               close(FILE);
+                       }
+       return 1;
+}
+
+sub check_ccdroute
+{
+       my %ccdroutehash=();
+       my $val=$_[0];
+       my ($ip,$cidr) = split (/\//, $val);
+       #check for existing routes in ccdroute
+       &General::readhasharray("${General::swroot}/ovpn/ccdroute", \%ccdroutehash);
+       foreach my $key (keys %ccdroutehash) {
+               foreach my $i (1 .. $#{$ccdroutehash{$key}}) {
+                       if (&General::iporsubtodec($val) eq $ccdroutehash{$key}[$i] && $ccdroutehash{$key}[0] ne $cgiparams{'NAME'}){
+                               return 0;
+                       }
+                       my ($ip2,$cidr2) = split (/\//,$ccdroutehash{$key}[$i]);
+                       #subnetcheck
+                       if (&General::IpInSubnet ($ip,$ip2,$cidr2)&& $ccdroutehash{$key}[0] ne $cgiparams{'NAME'} ){
+                               return 0;
+                       }
+               }
+       }
+       return 1;
+}
+sub check_ccdconf
+{
+       my %ccdconfhash=();
+       my $val=$_[0];
+       my ($ip,$cidr) = split (/\//, $val);
+       #check for existing routes in ccdroute
+       &General::readhasharray("${General::swroot}/ovpn/ccd.conf", \%ccdconfhash);
+       foreach my $key (keys %ccdconfhash) {
+               if (&General::iporsubtocidr($val) eq $ccdconfhash{$key}[1]){
+                               return 0;
+                       }
+                       my ($ip2,$cidr2) = split (/\//,$ccdconfhash{$key}[1]);
+                       #subnetcheck
+                       if (&General::IpInSubnet ($ip,$ip2,&General::cidrtosub($cidr2))){
+                               return 0;
+                       }
+               
+       }
+       return 1;
+}
+
 ###
 # m.a.d net2net
 ###
@@ -410,7 +693,30 @@ sub validdotmask
        if (($mask =~ /\./ )) { return 0; }     
   return 1;
 }
+
+# -------------------------------------------------------------------
+
+sub write_routepushfile
+{
+       open(FILE, ">$routes_push_file");
+       flock(FILE, 2);
+       if ($vpnsettings{'ROUTES_PUSH'} ne '') {
+               print FILE $vpnsettings{'ROUTES_PUSH'};
+       }
+       close(FILE); 
+}
+
+sub read_routepushfile
+{
+       if (-e "$routes_push_file") {
+               open(FILE,"$routes_push_file");
+               delete $vpnsettings{'ROUTES_PUSH'};
+               while (<FILE>) { $vpnsettings{'ROUTES_PUSH'} .= $_ };
+               close(FILE);
+               $cgiparams{'ROUTES_PUSH'} = $vpnsettings{'ROUTES_PUSH'};
+               
+       }
+}
 
 
 #hier die refresh page
@@ -448,11 +754,11 @@ if ($cgiparams{'ACTION'} eq $Lang::tr{'start ovpn server'} ||
        &emptyserverlog();      
     }   
 #    #restart openvpn server
-    if ($cgiparams{'ACTION'} eq $Lang::tr{'restart ovpn server'}){
+#    if ($cgiparams{'ACTION'} eq $Lang::tr{'restart ovpn server'}){
 #workarund, till SIGHUP also works when running as nobody    
-       system('/usr/local/bin/openvpnctrl', '-r');     
-       &emptyserverlog();      
-    }       
+#      system('/usr/local/bin/openvpnctrl', '-r');     
+#      &emptyserverlog();      
+#    }       
 }
 
 ###
@@ -473,6 +779,10 @@ if ($cgiparams{'ACTION'} eq $Lang::tr{'save-adv-options'}) {
     $vpnsettings{'DHCP_DOMAIN'} = $cgiparams{'DHCP_DOMAIN'};
     $vpnsettings{'DHCP_DNS'} = $cgiparams{'DHCP_DNS'};
     $vpnsettings{'DHCP_WINS'} = $cgiparams{'DHCP_WINS'};
+    $vpnsettings{'ROUTES_PUSH'} = $cgiparams{'ROUTES_PUSH'};
+    $vpnsettings{'PMTU_DISCOVERY'} = $cgiparams{'PMTU_DISCOVERY'};
+    $vpnsettings{'DAUTH'} = $cgiparams{'DAUTH'};
+    my @temp=();
     
     if ($cgiparams{'FRAGMENT'} eq '') {
        delete $vpnsettings{'FRAGMENT'};
@@ -489,8 +799,19 @@ if ($cgiparams{'ACTION'} eq $Lang::tr{'save-adv-options'}) {
     } else {
        $vpnsettings{'MSSFIX'} = $cgiparams{'MSSFIX'};
     }
+
+    if (($cgiparams{'PMTU_DISCOVERY'} eq 'yes') ||
+        ($cgiparams{'PMTU_DISCOVERY'} eq 'maybe') ||
+        ($cgiparams{'PMTU_DISCOVERY'} eq 'no' )) {
+
+       if (($cgiparams{'MSSFIX'} eq 'on') || ($cgiparams{'FRAGMENT'} ne '')) {
+               $errormessage = $Lang::tr{'ovpn mtu-disc with mssfix or fragment'};
+               goto ADV_ERROR;
+       }
+    }
+               
     if ($cgiparams{'DHCP_DOMAIN'} ne ''){
-       unless (&General::validfqdn($cgiparams{'DHCP_DOMAIN'}) || &General::validip($cgiparams{'DHCP_DOMAIN'})) {
+       unless (&General::validdomainname($cgiparams{'DHCP_DOMAIN'}) || &General::validip($cgiparams{'DHCP_DOMAIN'})) {
                $errormessage = $Lang::tr{'invalid input for dhcp domain'};
        goto ADV_ERROR;
        }
@@ -504,9 +825,59 @@ if ($cgiparams{'ACTION'} eq $Lang::tr{'save-adv-options'}) {
     if ($cgiparams{'DHCP_WINS'} ne ''){
        unless (&General::validfqdn($cgiparams{'DHCP_WINS'}) || &General::validip($cgiparams{'DHCP_WINS'})) {
                $errormessage = $Lang::tr{'invalid input for dhcp wins'};
-       goto ADV_ERROR;
+               goto ADV_ERROR;
        }
     }
+    if ($cgiparams{'ROUTES_PUSH'} ne ''){
+       @temp = split(/\n/,$cgiparams{'ROUTES_PUSH'});
+       undef $vpnsettings{'ROUTES_PUSH'};
+       
+       foreach my $tmpip (@temp)
+       {
+               s/^\s+//g; s/\s+$//g;
+               
+               if ($tmpip)
+               {
+                       $tmpip=~s/\s*$//g; 
+                       unless (&General::validipandmask($tmpip)) {
+                               $errormessage = "$tmpip ".$Lang::tr{'ovpn errmsg invalid ip or mask'};
+                               goto ADV_ERROR;
+                       }
+                       my ($ip, $cidr) = split("\/",&General::ipcidr2msk($tmpip));
+                       
+                       if ($ip eq $netsettings{'GREEN_NETADDRESS'} && $cidr eq $netsettings{'GREEN_NETMASK'}) {
+                               $errormessage = $Lang::tr{'ovpn errmsg green already pushed'};
+                               goto ADV_ERROR;
+                       }
+# a.marx ccd                   
+                       my %ccdroutehash=();
+                       &General::readhasharray("${General::swroot}/ovpn/ccdroute", \%ccdroutehash);
+                       foreach my $key (keys %ccdroutehash) {
+                               foreach my $i (1 .. $#{$ccdroutehash{$key}}) { 
+                                       if ( $ip."/".$cidr eq $ccdroutehash{$key}[$i] ){
+                                               $errormessage="Route $ip\/$cidr ".$Lang::tr{'ccd err inuse'}." $ccdroutehash{$key}[0]" ;
+                                               goto ADV_ERROR;
+                                       }
+                                       my ($ip2,$cidr2) = split(/\//,$ccdroutehash{$key}[$i]);
+                                       if (&General::IpInSubnet ($ip,$ip2,$cidr2)){
+                                               $errormessage="Route $ip\/$cidr ".$Lang::tr{'ccd err inuse'}." $ccdroutehash{$key}[0]" ;
+                                               goto ADV_ERROR;
+                                       }
+                               }
+                       }
+                       
+# ccd end
+                       
+                       $vpnsettings{'ROUTES_PUSH'} .= $tmpip."\n";
+               }
+       }
+    &write_routepushfile;
+       undef $vpnsettings{'ROUTES_PUSH'};
+    }
+       else {
+       undef $vpnsettings{'ROUTES_PUSH'};
+       &write_routepushfile;
+    }
     if ((length($cgiparams{'MAX_CLIENTS'}) == 0) || (($cgiparams{'MAX_CLIENTS'}) < 1 ) || (($cgiparams{'MAX_CLIENTS'}) > 255 )) {
         $errormessage = $Lang::tr{'invalid input for max clients'};
         goto ADV_ERROR;
@@ -541,7 +912,7 @@ if ($cgiparams{'ACTION'} eq $Lang::tr{'save'} && $cgiparams{'TYPE'} eq 'net' &&
 
 my @remsubnet = split(/\//,$cgiparams{'REMOTE_SUBNET'});
 my @ovsubnettemp =  split(/\./,$cgiparams{'OVPN_SUBNET'});
-my $ovsubnet =  "@ovsubnettemp[0].@ovsubnettemp[1].@ovsubnettemp[2]";
+my $ovsubnet =  "$ovsubnettemp[0].$ovsubnettemp[1].$ovsubnettemp[2]";
 my $tunmtu =  '';
 
 unless(-d "${General::swroot}/ovpn/n2nconf/"){mkdir "${General::swroot}/ovpn/n2nconf", 0755 or die "Unable to create dir $!";}
@@ -559,12 +930,16 @@ unless(-d "${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}"){mkdir "${General
   print SERVERCONF "persist-key\n";
   print SERVERCONF "script-security 2\n";
   print SERVERCONF "# IP/DNS for remote Server Gateway\n"; 
+
+  if ($cgiparams{'REMOTE'} ne '') {
   print SERVERCONF "remote $cgiparams{'REMOTE'}\n";
+  }
+
   print SERVERCONF "float\n";
   print SERVERCONF "# IP adresses of the VPN Subnet\n"; 
   print SERVERCONF "ifconfig $ovsubnet.1 $ovsubnet.2\n"; 
   print SERVERCONF "# Client Gateway Network\n"; 
-  print SERVERCONF "route @remsubnet[0] @remsubnet[1]\n";
+  print SERVERCONF "route $remsubnet[0] $remsubnet[1]\n";
   print SERVERCONF "# tun Device\n"; 
   print SERVERCONF "dev tun\n"; 
   print SERVERCONF "# Port and Protokol\n"; 
@@ -582,18 +957,30 @@ unless(-d "${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}"){mkdir "${General
   print SERVERCONF "# Paketsize\n";
   if ($cgiparams{'MTU'} eq '') {$tunmtu = '1500'} else {$tunmtu = $cgiparams{'MTU'}};
   print SERVERCONF "tun-mtu $tunmtu\n";
-  if ($cgiparams{'FRAGMENT'} ne '')  {print SERVERCONF "fragment $cgiparams{'FRAGMENT'}\n";}
-  if ($cgiparams{'MSSFIX'} eq 'on') {print SERVERCONF "mssfix\n";}
+  if ($cgiparams{'FRAGMENT'} ne '') {print SERVERCONF "fragment $cgiparams{'FRAGMENT'}\n";} 
+  if ($cgiparams{'MSSFIX'} eq 'on') {print SERVERCONF "mssfix\n"; }; 
+  }
+
+  # Check if a valid operating mode has been choosen and use it.
+  if (($cgiparams{'PMTU_DISCOVERY'} eq 'yes') ||
+      ($cgiparams{'PMTU_DISCOVERY'} eq 'maybe') ||
+      ($cgiparams{'PMTU_DISCOVERY'} eq 'no' )) {
+       if(($cgiparams{'MSSFIX'} ne 'on') || ($cgiparams{'FRAGMENT'} eq '')) {
+               if($cgiparams{'MTU'} eq '1500') {
+                       print SERVERCONF "mtu-disc $cgiparams{'PMTU_DISCOVERY'}\n";
+               }
+       }
   }
-   
   print SERVERCONF "# Auth. Server\n"; 
   print SERVERCONF "tls-server\n"; 
   print SERVERCONF "ca ${General::swroot}/ovpn/ca/cacert.pem\n"; 
   print SERVERCONF "cert ${General::swroot}/ovpn/certs/servercert.pem\n"; 
   print SERVERCONF "key ${General::swroot}/ovpn/certs/serverkey.pem\n"; 
-  print SERVERCONF "dh ${General::swroot}/ovpn/ca/dh1024.pem\n"; 
+  print SERVERCONF "dh ${General::swroot}/ovpn/ca/dh1024.pem\n";
   print SERVERCONF "# Cipher\n"; 
-  print SERVERCONF "cipher AES-256-CBC\n"; 
+  print SERVERCONF "cipher $cgiparams{'DCIPHER'}\n";
+  print SERVERCONF "# HMAC algorithm\n";
+  print SERVERCONF "auth $cgiparams{'DAUTH'}\n";
   if ($cgiparams{'COMPLZO'} eq 'on') {
    print SERVERCONF "# Enable Compression\n";
    print SERVERCONF "comp-lzo\r\n";
@@ -606,7 +993,8 @@ unless(-d "${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}"){mkdir "${General
   print SERVERCONF "daemon $cgiparams{'NAME'}n2n\n"; 
   print SERVERCONF "writepid /var/run/$cgiparams{'NAME'}n2n.pid\n"; 
   print SERVERCONF "# Activate Management Interface and Port\n"; 
-  print SERVERCONF "#management localhost 4711\n";
+  if ($cgiparams{'OVPN_MGMT'} eq '') {print SERVERCONF "management localhost $cgiparams{'DEST_PORT'}\n"}
+  else {print SERVERCONF "management localhost $cgiparams{'OVPN_MGMT'}\n"};
   close(SERVERCONF);
 
 }
@@ -617,11 +1005,12 @@ unless(-d "${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}"){mkdir "${General
 
 if ($cgiparams{'ACTION'} eq $Lang::tr{'save'} && $cgiparams{'TYPE'} eq 'net' && $cgiparams{'SIDE'} eq 'client')
 {
+
         my @ovsubnettemp =  split(/\./,$cgiparams{'OVPN_SUBNET'});
-        my $ovsubnet =  "@ovsubnettemp[0].@ovsubnettemp[1].@ovsubnettemp[2]";
+        my $ovsubnet =  "$ovsubnettemp[0].$ovsubnettemp[1].$ovsubnettemp[2]";
         my @remsubnet =  split(/\//,$cgiparams{'REMOTE_SUBNET'});
         my $tunmtu =  '';
-           
+                   
 unless(-d "${General::swroot}/ovpn/n2nconf/"){mkdir "${General::swroot}/ovpn/n2nconf", 0755 or die "Unable to create dir $!";}
 unless(-d "${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}"){mkdir "${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}", 0770 or die "Unable to create dir $!";}
   
@@ -642,7 +1031,7 @@ unless(-d "${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}"){mkdir "${General
   print CLIENTCONF "# IP adresses of the VPN Subnet\n"; 
   print CLIENTCONF "ifconfig $ovsubnet.2 $ovsubnet.1\n"; 
   print CLIENTCONF "# Server Gateway Network\n"; 
-  print CLIENTCONF "route @remsubnet[0] @remsubnet[1]\n"; 
+  print CLIENTCONF "route $remsubnet[0] $remsubnet[1]\n"; 
   print CLIENTCONF "# tun Device\n"; 
   print CLIENTCONF "dev tun\n"; 
   print CLIENTCONF "# Port and Protokol\n"; 
@@ -653,7 +1042,6 @@ unless(-d "${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}"){mkdir "${General
   print CLIENTCONF "# Packet size\n";
   if ($cgiparams{'MTU'} eq '') {$tunmtu = '1400'} else {$tunmtu = $cgiparams{'MTU'}};
   print CLIENTCONF "tun-mtu $tunmtu\n";
-  print CLIENTCONF "ns-cert-type server\n";
   }
   
   if ($cgiparams{'PROTOCOL'} eq 'udp') {
@@ -661,19 +1049,33 @@ unless(-d "${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}"){mkdir "${General
   print CLIENTCONF "# Paketsize\n";
   if ($cgiparams{'MTU'} eq '') {$tunmtu = '1500'} else {$tunmtu = $cgiparams{'MTU'}};
   print CLIENTCONF "tun-mtu $tunmtu\n";
-  if ($cgiparams{'FRAGMENT'} ne '')  {print CLIENTCONF "fragment $cgiparams{'FRAGMENT'}\n";}
-  if ($cgiparams{'MSSFIX'} eq 'on') {print CLIENTCONF "mssfix\n";}
+  if ($cgiparams{'FRAGMENT'} ne '') {print CLIENTCONF "fragment $cgiparams{'FRAGMENT'}\n";}
+  if ($cgiparams{'MSSFIX'} eq 'on') {print CLIENTCONF "mssfix\n"; }; 
   }
-     
+
+  # Check if a valid operating mode has been choosen and use it.
+  if (($cgiparams{'PMTU_DISCOVERY'} eq 'yes') ||
+      ($cgiparams{'PMTU_DISCOVERY'} eq 'maybe') ||
+      ($cgiparams{'PMTU_DISCOVERY'} eq 'no' )) {
+        if(($cgiparams{'MSSFIX'} ne 'on') || ($cgiparams{'FRAGMENT'} eq '')) {
+               if ($cgiparams{'MTU'} eq '1500') {
+                       print CLIENTCONF "mtu-disc $cgiparams{'PMTU_DISCOVERY'}\n";
+               }
+        }
+  }
+  print CLIENTCONF "ns-cert-type server\n";   
   print CLIENTCONF "# Auth. Client\n"; 
   print CLIENTCONF "tls-client\n"; 
   print CLIENTCONF "# Cipher\n"; 
-  print CLIENTCONF "cipher AES-256-CBC\n"; 
+  print CLIENTCONF "cipher $cgiparams{'DCIPHER'}\n";
+  print CLIENTCONF "# HMAC algorithm\n";
+  print CLIENTCONF "auth $cgiparams{'DAUTH'}\n";
   print CLIENTCONF "pkcs12 ${General::swroot}/ovpn/certs/$cgiparams{'NAME'}.p12\r\n";
   if ($cgiparams{'COMPLZO'} eq 'on') {
    print CLIENTCONF "# Enable Compression\n";
    print CLIENTCONF "comp-lzo\r\n";
-     }
+  }
   print CLIENTCONF "# Debug Level\n"; 
   print CLIENTCONF "verb 3\n"; 
   print CLIENTCONF "# Tunnel check\n"; 
@@ -682,7 +1084,8 @@ unless(-d "${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}"){mkdir "${General
   print CLIENTCONF "daemon $cgiparams{'NAME'}n2n\n";
   print CLIENTCONF "writepid /var/run/$cgiparams{'NAME'}n2n.pid\n"; 
   print CLIENTCONF "# Activate Management Interface and Port\n"; 
-  print CLIENTCONF "# management localhost 4711\n";
+  if ($cgiparams{'OVPN_MGMT'} eq '') {print CLIENTCONF "management localhost $cgiparams{'DEST_PORT'}\n"}
+  else {print CLIENTCONF "management localhost $cgiparams{'OVPN_MGMT'}\n"};
   close(CLIENTCONF);
 
 }
@@ -702,21 +1105,16 @@ if ($cgiparams{'ACTION'} eq $Lang::tr{'save'} && $cgiparams{'TYPE'} eq '' && $cg
        goto SETTINGS_ERROR;
        }
     }
-    if ($cgiparams{'ENABLED'} eq 'on'){
-       &disallowreserved($cgiparams{'DDEST_PORT'},0,$cgiparams{'DPROTOCOL'},"dest");
-    }  
     if ($errormessage) { goto SETTINGS_ERROR; }
-    
-    
+
     if ($cgiparams{'ENABLED'} eq 'on'){
-       &checkportfw(0,$cgiparams{'DDEST_PORT'},$cgiparams{'DPROTOCOL'},'0.0.0.0');
+       &checkportfw($cgiparams{'DDEST_PORT'},$cgiparams{'DPROTOCOL'});
     }
-       
     if ($errormessage) { goto SETTINGS_ERROR; }
     
     if (! &General::validipandmask($cgiparams{'DOVPN_SUBNET'})) {
             $errormessage = $Lang::tr{'ovpn subnet is invalid'};
-       goto SETTINGS_ERROR;
+                       goto SETTINGS_ERROR;
     }
     my @tmpovpnsubnet = split("\/",$cgiparams{'DOVPN_SUBNET'});
     
@@ -772,6 +1170,7 @@ if ($cgiparams{'ACTION'} eq $Lang::tr{'save'} && $cgiparams{'TYPE'} eq '' && $cg
        $errormessage = $Lang::tr{'invalid port'};
        goto SETTINGS_ERROR;
     }
+
     $vpnsettings{'ENABLED_BLUE'} = $cgiparams{'ENABLED_BLUE'};
     $vpnsettings{'ENABLED_ORANGE'} =$cgiparams{'ENABLED_ORANGE'};
     $vpnsettings{'ENABLED'} = $cgiparams{'ENABLED'};
@@ -796,7 +1195,7 @@ SETTINGS_ERROR:
 ###
 ### Reset all step 2
 ###
-}elsif ($cgiparams{'ACTION'} eq $Lang::tr{'reset'} && $cgiparams{'AREUSURE'} eq 'yes') {
+}elsif ($cgiparams{'ACTION'} eq $Lang::tr{'remove x509'} && $cgiparams{'AREUSURE'} eq 'yes') {
     my $file = '';
     &General::readhasharray("${General::swroot}/ovpn/ovpnconfig", \%confighash);
 
@@ -806,37 +1205,64 @@ SETTINGS_ERROR:
        }
     }
     while ($file = glob("${General::swroot}/ovpn/ca/*")) {
-       unlink $file
+               unlink $file
     }
     while ($file = glob("${General::swroot}/ovpn/certs/*")) {
-       unlink $file
+               unlink $file
     }
     while ($file = glob("${General::swroot}/ovpn/crls/*")) {
-       unlink $file
+               unlink $file
     }
-    &cleanssldatabase();
+       &cleanssldatabase();
     if (open(FILE, ">${General::swroot}/ovpn/caconfig")) {
         print FILE "";
         close FILE;
     }
-    &General::writehasharray("${General::swroot}/ovpn/ovpnconfig", \%confighash);
-    #&writeserverconf();
+       if (open(FILE, ">${General::swroot}/ovpn/ccdroute")) {
+               print FILE "";
+               close FILE;
+       }
+       if (open(FILE, ">${General::swroot}/ovpn/ccdroute2")) {
+               print FILE "";
+               close FILE;
+       }
+       while ($file = glob("${General::swroot}/ovpn/ccd/*")) {
+               unlink $file
+       }
+       if (open(FILE, ">${General::swroot}/ovpn/ovpn-leases.db")) {
+               print FILE "";
+               close FILE;
+       }
+       if (open(FILE, ">${General::swroot}/ovpn/ovpnconfig")) {
+               print FILE "";
+               close FILE;
+       }
+       while ($file = glob("${General::swroot}/ovpn/n2nconf/*")) {
+               system ("rm -rf $file")
+       }
 ###
 ### Reset all step 1
 ###
-}elsif ($cgiparams{'ACTION'} eq $Lang::tr{'reset'}) {
+}elsif ($cgiparams{'ACTION'} eq $Lang::tr{'remove x509'}) {
     &Header::showhttpheaders();
-    &Header::openpage($Lang::tr{'vpn configuration main'}, 1, '');
-    &Header::openbigbox('100%', 'LEFT', '', '');
-    &Header::openbox('100%', 'LEFT', $Lang::tr{'are you sure'});
-    print <<END
-       <table><form method='post'><input type='hidden' name='AREUSURE' value='yes' />
-           <tr><td align='center'>             
-               <b><font color='${Header::colourred}'>$Lang::tr{'capswarning'}</font></b>: 
-               $Lang::tr{'resetting the vpn configuration will remove the root ca, the host certificate and all certificate based connections'}
-           <tr><td align='center'><input type='submit' name='ACTION' value='$Lang::tr{'reset'}' />
-               <input type='submit' name='ACTION' value='$Lang::tr{'cancel'}' /></td></tr>
-       </form></table>
+    &Header::openpage($Lang::tr{'ovpn'}, 1, '');
+    &Header::openbigbox('100%', 'left', '', '');
+    &Header::openbox('100%', 'left', $Lang::tr{'are you sure'});
+    print <<END;
+       <form method='post'>
+               <table width='100%'>
+                       <tr>
+                               <td align='center'>
+                               <input type='hidden' name='AREUSURE' value='yes' />
+                               <b><font color='${Header::colourred}'>$Lang::tr{'capswarning'}</font></b>: 
+                               $Lang::tr{'resetting the vpn configuration will remove the root ca, the host certificate and all certificate based connections'}</td>
+                       </tr>
+                       <tr>
+                               <td align='center'><input type='submit' name='ACTION' value='$Lang::tr{'remove x509'}' />
+                               <input type='submit' name='ACTION' value='$Lang::tr{'cancel'}' /></td>
+                       </tr>
+               </table>
+       </form>
 END
     ;
     &Header::closebox();
@@ -844,6 +1270,107 @@ END
     &Header::closepage();
     exit (0);
 
+###
+### Generate DH key step 2
+###
+} elsif ($cgiparams{'ACTION'} eq $Lang::tr{'generate dh key'} && $cgiparams{'AREUSURE'} eq 'yes') {
+       # Delete if old key exists
+    if (-f "${General::swroot}/ovpn/ca/$cgiparams{'DH_NAME'}") {
+        unlink "${General::swroot}/ovpn/ca/$cgiparams{'DH_NAME'}";
+       }
+       # Create Diffie Hellmann Parameter
+       system('/usr/bin/openssl', 'dhparam', '-rand', '/proc/interrupts:/proc/net/rt_cache',
+       '-out', "${General::swroot}/ovpn/ca/dh1024.pem", "$cgiparams{'DHLENGHT'}");
+       if ($?) {
+               $errormessage = "$Lang::tr{'openssl produced an error'}: $?";
+               unlink ("${General::swroot}/ovpn/ca/dh1024.pem");
+       }
+
+###
+### Generate DH key step 1
+###
+} elsif ($cgiparams{'ACTION'} eq $Lang::tr{'generate dh key'}) {
+       &Header::showhttpheaders();
+       &Header::openpage($Lang::tr{'ovpn'}, 1, '');
+       &Header::openbigbox('100%', 'LEFT', '', '');
+       &Header::openbox('100%', 'LEFT', "$Lang::tr{'gen dh'}:");
+       print <<END;
+       <table width='100%'>
+       <tr>
+               <td width='15%'> </td> <td width='15%'></td> <td width='65%'></td>
+    </tr>
+       <tr>
+               <td class='base'>$Lang::tr{'ovpn dh'}:</td>
+               <td align='center'>
+               <form method='post'><input type='hidden' name='AREUSURE' value='yes' />
+               <input type='hidden' name='KEY' value='$cgiparams{'KEY'}' />
+                       <select name='DHLENGHT'>
+                               <option value='1024' $selected{'DHLENGHT'}{'1024'}>1024 $Lang::tr{'bit'}</option>
+                               <option value='2048' $selected{'DHLENGHT'}{'2048'}>2048 $Lang::tr{'bit'}</option>
+                               <option value='3072' $selected{'DHLENGHT'}{'3072'}>3072 $Lang::tr{'bit'}</option>
+                               <option value='4096' $selected{'DHLENGHT'}{'4096'}>4096 $Lang::tr{'bit'}</option>
+                       </select>
+               </td>
+       </tr>
+       <tr><td colspan='4'><br></td></tr>
+       </table>
+       <table width='100%'>
+       <tr>
+               <b><font color='${Header::colourred}'>$Lang::tr{'capswarning'}:</font></b>
+               $Lang::tr{'dh key warn'}
+               </td>
+       </tr>
+       <tr>
+               <td align='center'><input type='submit' name='ACTION' value='$Lang::tr{'generate dh key'}' /></td>
+               </form>
+       </tr>
+       </table>
+
+END
+       ;
+       &Header::closebox();
+       print "<div align='center'><a href='/cgi-bin/ovpnmain.cgi'>$Lang::tr{'back'}</a></div>";
+       &Header::closebigbox();
+       &Header::closepage();
+       exit (0);
+
+###
+### Upload DH key
+###
+} elsif ($cgiparams{'ACTION'} eq $Lang::tr{'upload dh key'}) {
+    if ($cgiparams{'DH_NAME'} !~ /dh1024.pem/) {
+        $errormessage = $Lang::tr{'dh name is invalid'};
+        goto UPLOADCA_ERROR;
+       }
+    if (ref ($cgiparams{'FH'}) ne 'Fh') {
+         $errormessage = $Lang::tr{'there was no file upload'};
+         goto UPLOADCA_ERROR;
+    }
+       # Move uploaded dh key to a temporary file
+    (my $fh, my $filename) = tempfile( );
+    if (copy ($cgiparams{'FH'}, $fh) != 1) {
+        $errormessage = $!;
+           goto UPLOADCA_ERROR;
+    }
+       my $temp = `/usr/bin/openssl dhparam -text -in $filename`;
+    if ($temp !~ /DH Parameters: \((1024|2048|3072|4096) bit\)/) {
+        $errormessage = $Lang::tr{'not a valid dh key'};
+        unlink ($filename);
+        goto UPLOADCA_ERROR;
+    } else {
+    # Delete if old key exists
+    if (-f "${General::swroot}/ovpn/ca/$cgiparams{'DH_NAME'}") {
+        unlink "${General::swroot}/ovpn/ca/$cgiparams{'DH_NAME'}";
+       }
+    move($filename, "${General::swroot}/ovpn/ca/$cgiparams{'DH_NAME'}");
+               if ($? ne 0) {
+                       $errormessage = "$Lang::tr{'certificate file move failed'}: $!";
+                       unlink ($filename);
+                       goto UPLOADCA_ERROR;
+               }
+    }
+
+
 ###
 ### Upload CA Certificate
 ###
@@ -862,7 +1389,7 @@ END
 
     if ($cgiparams{'CA_NAME'} eq 'ca') {
        $errormessage = $Lang::tr{'name is invalid'};
-       goto UPLOAD_CA_ERROR;
+       goto UPLOADCA_ERROR;
     }
 
     # Check if there is no other entry with this name
@@ -920,7 +1447,7 @@ END
 
     if ( -f "${General::swroot}/ovpn/ca/$cahash{$cgiparams{'KEY'}}[0]cert.pem") {
        &Header::showhttpheaders();
-       &Header::openpage($Lang::tr{'vpn configuration main'}, 1, '');
+       &Header::openpage($Lang::tr{'ovpn'}, 1, '');
        &Header::openbigbox('100%', 'LEFT', '', $errormessage);
        &Header::openbox('100%', 'LEFT', "$Lang::tr{'ca certificate'}:");
        my $output = `/usr/bin/openssl x509 -text -in ${General::swroot}/ovpn/ca/$cahash{$cgiparams{'KEY'}}[0]cert.pem`;
@@ -997,10 +1524,10 @@ END
        }
        if ($assignedcerts) {
            &Header::showhttpheaders();
-           &Header::openpage($Lang::tr{'vpn configuration main'}, 1, '');
+           &Header::openpage($Lang::tr{'ovpn'}, 1, '');
            &Header::openbigbox('100%', 'LEFT', '', $errormessage);
            &Header::openbox('100%', 'LEFT', $Lang::tr{'are you sure'});
-           print <<END
+           print <<END;
                <table><form method='post'><input type='hidden' name='AREUSURE' value='yes' />
                       <input type='hidden' name='KEY' value='$cgiparams{'KEY'}' />
                    <tr><td align='center'>
@@ -1032,7 +1559,7 @@ END
     $cgiparams{'ACTION'} eq $Lang::tr{'show host certificate'}) {
     my $output;
     &Header::showhttpheaders();
-    &Header::openpage($Lang::tr{'vpn configuration main'}, 1, '');
+    &Header::openpage($Lang::tr{'ovpn'}, 1, '');
     &Header::openbigbox('100%', 'LEFT', '', '');
     if ($cgiparams{'ACTION'} eq $Lang::tr{'show root certificate'}) {
        &Header::openbox('100%', 'LEFT', "$Lang::tr{'root certificate'}:");
@@ -1298,7 +1825,7 @@ END
            }
        } else {        # child
            unless (exec ('/usr/bin/openssl', 'req', '-x509', '-nodes', '-rand', '/proc/interrupts:/proc/net/rt_cache',
-                       '-days', '999999', '-newkey', 'rsa:2048',
+                       '-days', '999999', '-newkey', 'rsa:4096',
                        '-keyout', "${General::swroot}/ovpn/ca/cakey.pem",
                        '-out', "${General::swroot}/ovpn/ca/cacert.pem",
                        '-config',"${General::swroot}/ovpn/openssl/ovpn.cnf")) {
@@ -1329,7 +1856,7 @@ END
            }
        } else {        # child
            unless (exec ('/usr/bin/openssl', 'req', '-nodes', '-rand', '/proc/interrupts:/proc/net/rt_cache',
-                       '-newkey', 'rsa:1024',
+                       '-newkey', 'rsa:2048',
                        '-keyout', "${General::swroot}/ovpn/certs/serverkey.pem",
                        '-out', "${General::swroot}/ovpn/certs/serverreq.pem",
                        '-extensions', 'server',
@@ -1381,8 +1908,7 @@ END
        }
        # Create Diffie Hellmann Parameter
        system('/usr/bin/openssl', 'dhparam', '-rand', '/proc/interrupts:/proc/net/rt_cache',
-              '-out', "${General::swroot}/ovpn/ca/dh1024.pem",
-              '1024' );
+              '-out', "${General::swroot}/ovpn/ca/dh1024.pem", "$cgiparams{'DHLENGHT'}");
        if ($?) {
            $errormessage = "$Lang::tr{'openssl produced an error'}: $?";
            unlink ("${General::swroot}/ovpn/certs/serverkey.pem");
@@ -1400,7 +1926,7 @@ END
     ROOTCERT_ERROR:
     if ($cgiparams{'ACTION'} ne '') {
        &Header::showhttpheaders();
-       &Header::openpage($Lang::tr{'vpn configuration main'}, 1, '');
+       &Header::openpage($Lang::tr{'ovpn'}, 1, '');
        &Header::openbigbox('100%', 'LEFT', '', '');
        if ($errormessage) {
            &Header::openbox('100%', 'LEFT', $Lang::tr{'error messages'});
@@ -1409,7 +1935,7 @@ END
            &Header::closebox();
        }
        &Header::openbox('100%', 'LEFT', "$Lang::tr{'generate root/host certificates'}:");
-       print <<END
+    print <<END;
        <form method='post' enctype='multipart/form-data'>
        <table width='100%' border='0' cellspacing='1' cellpadding='0'>
        <tr><td width='30%' class='base'>$Lang::tr{'organization name'}:</td>
@@ -1442,19 +1968,35 @@ END
            }
            print ">$country</option>";
        }
-       print <<END
-           </select></td>
-           <td colspan='2'>&nbsp;</td></tr>
+    print <<END;
+       </select></td>
+       <tr><td class='base'>$Lang::tr{'ovpn dh'}:</td>
+               <td class='base'><select name='DHLENGHT'>
+                               <option value='1024' $selected{'DHLENGHT'}{'1024'}>1024 $Lang::tr{'bit'}</option>
+                               <option value='2048' $selected{'DHLENGHT'}{'2048'}>2048 $Lang::tr{'bit'}</option>
+                               <option value='3072' $selected{'DHLENGHT'}{'3072'}>3072 $Lang::tr{'bit'}</option>
+                               <option value='4096' $selected{'DHLENGHT'}{'4096'}>4096 $Lang::tr{'bit'}</option>
+                       </select>
+               </td>
+       </tr>
+
        <tr><td>&nbsp;</td>
            <td><input type='submit' name='ACTION' value='$Lang::tr{'generate root/host certificates'}' /></td>
            <td>&nbsp;</td><td>&nbsp;</td></tr> 
        <tr><td class='base' colspan='4' align='left'>
            <img src='/blob.gif' valign='top' alt='*' />&nbsp;$Lang::tr{'this field may be blank'}</td></tr>
-       <tr><td class='base' colspan='4' align='left'>
-           <b><font color='${Header::colourred}'>$Lang::tr{'capswarning'}</font></b>: 
-           $Lang::tr{'generating the root and host certificates may take a long time. it can take up to several minutes on older hardware. please be patient'}
-       </td></tr>
-       <tr><td colspan='4' bgcolor='#000000'><img src='/images/null.gif' width='1' height='1' border='0' /></td></tr>
+       <tr><td colspan='4'><br><br></td></tr>
+       <tr><td class='base' colspan='4' align='center'>
+           <b><font color='${Header::colourred}'>$Lang::tr{'capswarning'}:</font></b>
+               $Lang::tr{'ovpn generating the root and host certificates'}
+               </td>
+       </tr>
+       <tr><td class='base' colspan='4' align='center'>
+               $Lang::tr{'dh key warn'}
+               </td>
+       </tr>
+
+       <tr><td colspan='4'><hr></td></tr>
        <tr><td class='base' nowrap='nowrap'>$Lang::tr{'upload p12 file'}:</td>
            <td nowrap='nowrap'><input type='file' name='FH' size='32'></td>
            <td colspan='2'>&nbsp;</td></tr>
@@ -1465,12 +2007,13 @@ END
            <td><input type='submit' name='ACTION' value='$Lang::tr{'upload p12 file'}' /></td>
             <td colspan='2'>&nbsp;</td></tr>
        <tr><td class='base' colspan='4' align='left'>
-           <img src='/blob.gif' valign='top' al='*' >&nbsp;$Lang::tr{'this field may be blank'}</td></tr>
+           <img src='/blob.gif' valign='top' al='*' >&nbsp;$Lang::tr{'this field may be blank'}</td>
+       </tr>
        </form></table>
 END
        ;
        &Header::closebox();
-
+       print "<div align='center'><a href='/cgi-bin/ovpnmain.cgi'>$Lang::tr{'back'}</a></div>";
        &Header::closebigbox();
        &Header::closepage();
         exit(0)
@@ -1499,29 +2042,26 @@ END
     my $n2nactive = `/bin/ps ax|grep $confighash{$cgiparams{'KEY'}}[1]|grep -v grep|awk \'{print \$1}\'`;
     
     if ($confighash{$cgiparams{'KEY'}}) {
+               if ($confighash{$cgiparams{'KEY'}}[0] eq 'off') {
+                       $confighash{$cgiparams{'KEY'}}[0] = 'on';
+                       &General::writehasharray("${General::swroot}/ovpn/ovpnconfig", \%confighash);
 
-
-       if ($confighash{$cgiparams{'KEY'}}[0] eq 'off') {
-           $confighash{$cgiparams{'KEY'}}[0] = 'on';
-           &General::writehasharray("${General::swroot}/ovpn/ovpnconfig", \%confighash);
-
-     if ($confighash{$cgiparams{'KEY'}}[3] eq 'net'){
+                       if ($confighash{$cgiparams{'KEY'}}[3] eq 'net'){
                  system('/usr/local/bin/openvpnctrl', '-sn2n', $confighash{$cgiparams{'KEY'}}[1]);
-          }
-  } else {
+                       }
+               } else {
 
-           $confighash{$cgiparams{'KEY'}}[0] = 'off';
-      &General::writehasharray("${General::swroot}/ovpn/ovpnconfig", \%confighash);
+                       $confighash{$cgiparams{'KEY'}}[0] = 'off';
+                       &General::writehasharray("${General::swroot}/ovpn/ovpnconfig", \%confighash);
 
-          if ($confighash{$cgiparams{'KEY'}}[3] eq 'net'){
+                       if ($confighash{$cgiparams{'KEY'}}[3] eq 'net'){
                     if ($n2nactive ne ''){                             
-                    system('/usr/local/bin/openvpnctrl', '-kn2n', $confighash{$cgiparams{'KEY'}}[1]);
-           }
+                                               system('/usr/local/bin/openvpnctrl', '-kn2n', $confighash{$cgiparams{'KEY'}}[1]);
+                                       }
  
-          } else {
+                       } else {
                  $errormessage = $Lang::tr{'invalid key'};
-          }
+                       }
       }
   }
 
@@ -1549,9 +2089,10 @@ if ($confighash{$cgiparams{'KEY'}}[3] eq 'net'){
         my $zippathname = "$zippath$zipname";
         $clientovpn = "$confighash{$cgiparams{'KEY'}}[1].conf";  
         my @ovsubnettemp =  split(/\./,$confighash{$cgiparams{'KEY'}}[27]);
-        my $ovsubnet =  "@ovsubnettemp[0].@ovsubnettemp[1].@ovsubnettemp[2]";
+        my $ovsubnet =  "$ovsubnettemp[0].$ovsubnettemp[1].$ovsubnettemp[2]";
         my $tunmtu = ''; 
         my @remsubnet = split(/\//,$confighash{$cgiparams{'KEY'}}[8]);
+        my $n2nfragment = '';
         
     open(CLIENTCONF, ">$tempdir/$clientovpn") or die "Unable to open tempfile: $!";
     flock CLIENTCONF, 2;
@@ -1582,7 +2123,6 @@ if ($confighash{$cgiparams{'KEY'}}[3] eq 'net'){
    print CLIENTCONF "# Packet size\n";
    if ($confighash{$cgiparams{'KEY'}}[31] eq '') {$tunmtu = '1400'} else {$tunmtu = $confighash{$cgiparams{'KEY'}}[31]};
    print CLIENTCONF "tun-mtu $tunmtu\n";
-   print CLIENTCONF "ns-cert-type server\n";
    }
   
    if ($confighash{$cgiparams{'KEY'}}[28] eq 'udp') {
@@ -1590,19 +2130,30 @@ if ($confighash{$cgiparams{'KEY'}}[3] eq 'net'){
    print CLIENTCONF "# Paketsize\n";
    if ($confighash{$cgiparams{'KEY'}}[31] eq '') {$tunmtu = '1500'} else {$tunmtu = $confighash{$cgiparams{'KEY'}}[31]};
    print CLIENTCONF "tun-mtu $tunmtu\n";
-   if ($cgiparams{'FRAGMENT'} ne '')  {print CLIENTCONF "fragment $cgiparams{'FRAGMENT'}\n";}
+   if ($confighash{$cgiparams{'KEY'}}[24] ne '') {print CLIENTCONF "fragment $confighash{$cgiparams{'KEY'}}[24]\n";}
    if ($confighash{$cgiparams{'KEY'}}[23] eq 'on') {print CLIENTCONF "mssfix\n";}
    }
-      
-   print CLIENTCONF "# Auth. Client\n"; 
+   if (($confighash{$cgiparams{'KEY'}}[38] eq 'yes') ||
+       ($confighash{$cgiparams{'KEY'}}[38] eq 'maybe') ||
+       ($confighash{$cgiparams{'KEY'}}[38] eq 'no' )) {
+       if (($confighash{$cgiparams{'KEY'}}[23] ne 'on') || ($confighash{$cgiparams{'KEY'}}[24] eq '')) {
+               if ($tunmtu eq '1500' ) {
+                       print CLIENTCONF "mtu-disc $confighash{$cgiparams{'KEY'}}[38]\n";
+               }
+       }
+   }
+   print CLIENTCONF "ns-cert-type server\n";   
+   print CLIENTCONF "# Auth. Client\n"; 
    print CLIENTCONF "tls-client\n"; 
    print CLIENTCONF "# Cipher\n"; 
-   print CLIENTCONF "cipher AES-256-CBC\n"; 
+   print CLIENTCONF "cipher $confighash{$cgiparams{'KEY'}}[40]\n";
+   print CLIENTCONF "# HMAC algorithm\n";
+   print CLIENTCONF "auth $confighash{$cgiparams{'KEY'}}[39]\n";
     if ($confighash{$cgiparams{'KEY'}}[4] eq 'cert' && -f "${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1].p12") { 
         print CLIENTCONF "pkcs12 ${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1].p12\r\n";
      $zip->addFile( "${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1].p12", "$confighash{$cgiparams{'KEY'}}[1].p12") or die "Can't add file $confighash{$cgiparams{'KEY'}}[1].p12\n";
    } 
-    if ($confighash{$cgiparams{'KEY'}}[30] eq 'on') {
+   if ($confighash{$cgiparams{'KEY'}}[30] eq 'on') {
    print CLIENTCONF "# Enable Compression\n";
    print CLIENTCONF "comp-lzo\r\n";
      }
@@ -1614,7 +2165,8 @@ if ($confighash{$cgiparams{'KEY'}}[3] eq 'net'){
    print CLIENTCONF "daemon $confighash{$cgiparams{'KEY'}}[1]n2n\n"; 
    print CLIENTCONF "writepid /var/run/$confighash{$cgiparams{'KEY'}}[1]n2n.pid\n"; 
    print CLIENTCONF "# Activate Management Interface and Port\n"; 
-   print CLIENTCONF "# management localhost 4711\n";
+   if ($confighash{$cgiparams{'KEY'}}[22] eq '') {print CLIENTCONF "management localhost $confighash{$cgiparams{'KEY'}}[29]\n"}
+    else {print CLIENTCONF "management localhost $confighash{$cgiparams{'KEY'}}[22]\n"};
    print CLIENTCONF "# remsub $confighash{$cgiparams{'KEY'}}[11]\n";
   
 
@@ -1645,12 +2197,26 @@ else
     
     my $zip = Archive::Zip->new();
     
-    print CLIENTCONF "#OpenVPN Server conf\r\n";
+    print CLIENTCONF "#OpenVPN Client conf\r\n";
     print CLIENTCONF "tls-client\r\n";
     print CLIENTCONF "client\r\n";
+    print CLIENTCONF "nobind\r\n";
     print CLIENTCONF "dev $vpnsettings{'DDEVICE'}\r\n";
     print CLIENTCONF "proto $vpnsettings{'DPROTOCOL'}\r\n";
-    print CLIENTCONF "$vpnsettings{'DDEVICE'}-mtu $vpnsettings{'DMTU'}\r\n";
+
+    # Check if we are using fragment, mssfix or mtu-disc and set MTU to 1500
+    # or use configured value.
+    if ($vpnsettings{FRAGMENT} ne '' && $vpnsettings{DPROTOCOL} ne 'tcp' )
+       { print CLIENTCONF "$vpnsettings{'DDEVICE'}-mtu 1500\r\n"; }
+    elsif ($vpnsettings{MSSFIX} eq 'on')
+       { print CLIENTCONF "$vpnsettings{'DDEVICE'}-mtu 1500\r\n"; }
+    elsif (($vpnsettings{'PMTU_DISCOVERY'} eq 'yes') ||
+           ($vpnsettings{'PMTU_DISCOVERY'} eq 'maybe') ||
+           ($vpnsettings{'PMTU_DISCOVERY'} eq 'no' )) 
+       { print CLIENTCONF "$vpnsettings{'DDEVICE'}-mtu 1500\r\n"; }
+    else
+       { print CLIENTCONF "$vpnsettings{'DDEVICE'}-mtu $vpnsettings{'DMTU'}\r\n"; }
+
     if ( $vpnsettings{'ENABLED'} eq 'on'){
        print CLIENTCONF "remote $vpnsettings{'VPN_IP'} $vpnsettings{'DDEST_PORT'}\r\n";
        if ( $vpnsettings{'ENABLED_BLUE'} eq 'on' && (&haveBlueNet())){ 
@@ -1682,6 +2248,7 @@ else
        $zip->addFile( "${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1]cert.pem", "$confighash{$cgiparams{'KEY'}}[1]cert.pem") or die "Can't add file $confighash{$cgiparams{'KEY'}}[1]cert.pem\n";    
     }
     print CLIENTCONF "cipher $vpnsettings{DCIPHER}\r\n";
+       print CLIENTCONF "auth $vpnsettings{DAUTH}\r\n";
     if ($vpnsettings{DCOMPLZO} eq 'on') {
         print CLIENTCONF "comp-lzo\r\n";
     }
@@ -1694,6 +2261,15 @@ else
     if ($vpnsettings{FRAGMENT} ne '' && $vpnsettings{DPROTOCOL} ne 'tcp' ) {
        print CLIENTCONF "fragment $vpnsettings{'FRAGMENT'}\r\n";
     }
+
+    # Check if a valid operating mode has been choosen and use it.
+    if (($vpnsettings{'PMTU_DISCOVERY'} eq 'yes') ||
+        ($vpnsettings{'PMTU_DISCOVERY'} eq 'maybe') ||
+        ($vpnsettings{'PMTU_DISCOVERY'} eq 'no' )) {
+       if(($vpnsettings{MSSFIX} ne 'on') || ($vpnsettings{FRAGMENT} eq '')) {
+               print CLIENTCONF "mtu-disc $vpnsettings{'PMTU_DISCOVERY'}\r\n";
+       }
+    }
     close(CLIENTCONF);
         
     $zip->addFile( "$tempdir/$clientovpn", $clientovpn) or die "Can't add file $clientovpn\n";
@@ -1730,26 +2306,58 @@ else
 # m.a.d net2net
 ###
 
- if ($confighash{$cgiparams{'KEY'}}[3] eq 'net') {
-
+if ($confighash{$cgiparams{'KEY'}}[3] eq 'net') {
        my $conffile = glob("${General::swroot}/ovpn/n2nconf/$confighash{$cgiparams{'KEY'}}[1]/$confighash{$cgiparams{'KEY'}}[1].conf");
-  my $certfile = glob("${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1].p12");
-  unlink ($certfile) or die "Removing $certfile fail: $!";
-  unlink ($conffile) or die "Removing $conffile fail: $!";
-  rmdir ("${General::swroot}/ovpn/n2nconf/$confighash{$cgiparams{'KEY'}}[1]") || die "Kann Verzeichnis nicht loeschen: $!";
-  
+       my $certfile = glob("${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1].p12");
+       unlink ($certfile);
+       unlink ($conffile);
+
+       if (-e "${General::swroot}/ovpn/n2nconf/$confighash{$cgiparams{'KEY'}}[1]") {
+               rmdir ("${General::swroot}/ovpn/n2nconf/$confighash{$cgiparams{'KEY'}}[1]") || die "Kann Verzeichnis nicht loeschen: $!";
+       }
 }
 
   unlink ("${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1]cert.pem");
-       unlink ("${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1].p12");
+  unlink ("${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1].p12");
+
+# A.Marx CCD delete ccd files and routes
+
+       
+       if (-f "${General::swroot}/ovpn/ccd/$confighash{$cgiparams{'KEY'}}[2]")
+       {
+               unlink "${General::swroot}/ovpn/ccd/$confighash{$cgiparams{'KEY'}}[2]";
+       }
+       
+       &General::readhasharray("${General::swroot}/ovpn/ccdroute", \%ccdroutehash);
+       foreach my $key (keys %ccdroutehash) {
+               if ($ccdroutehash{$key}[0] eq $confighash{$cgiparams{'KEY'}}[1]){
+                       delete $ccdroutehash{$key};
+               }
+       }
+       &General::writehasharray("${General::swroot}/ovpn/ccdroute", \%ccdroutehash);
+       
+       &General::readhasharray("${General::swroot}/ovpn/ccdroute2", \%ccdroute2hash);
+       foreach my $key (keys %ccdroute2hash) {
+               if ($ccdroute2hash{$key}[0] eq $confighash{$cgiparams{'KEY'}}[1]){
+                       delete $ccdroute2hash{$key};
+               }
+       }
+       &General::writehasharray("${General::swroot}/ovpn/ccdroute2", \%ccdroute2hash);
+       &writeserverconf;
+       
+       
+# CCD end 
+
+       
        delete $confighash{$cgiparams{'KEY'}};
        my $temp2 = `/usr/bin/openssl ca -gencrl -out ${General::swroot}/ovpn/crls/cacrl.pem -config ${General::swroot}/ovpn/openssl/ovpn.cnf`;
        &General::writehasharray("${General::swroot}/ovpn/ovpnconfig", \%confighash);
+
        #&writeserverconf();
     } else {
        $errormessage = $Lang::tr{'invalid key'};
     }
-
+       &General::firewall_reload();
 
 ###
 ### Download PKCS12 file
@@ -1770,7 +2378,7 @@ else
 
     if ( -f "${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1]cert.pem") {
        &Header::showhttpheaders();
-       &Header::openpage($Lang::tr{'vpn configuration main'}, 1, '');
+       &Header::openpage($Lang::tr{'ovpn'}, 1, '');
        &Header::openbigbox('100%', 'LEFT', '', '');
        &Header::openbox('100%', 'LEFT', "$Lang::tr{'certificate'}:");
        my $output = `/usr/bin/openssl x509 -text -in ${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1]cert.pem`;
@@ -1782,6 +2390,29 @@ else
        &Header::closepage();
        exit(0);
     }
+
+###
+### Display Diffie-Hellman key
+###
+} elsif ($cgiparams{'ACTION'} eq $Lang::tr{'show dh'}) {
+
+    if (! -e "${General::swroot}/ovpn/ca/dh1024.pem") {
+               $errormessage = $Lang::tr{'not present'};
+       } else {
+               &Header::showhttpheaders();
+               &Header::openpage($Lang::tr{'ovpn'}, 1, '');
+               &Header::openbigbox('100%', 'LEFT', '', '');
+               &Header::openbox('100%', 'LEFT', "$Lang::tr{'dh'}:");
+               my $output = `/usr/bin/openssl dhparam -text -in ${General::swroot}/ovpn/ca/dh1024.pem`;
+               $output = &Header::cleanhtml($output,"y");
+               print "<pre>$output</pre>\n";
+               &Header::closebox();
+               print "<div align='center'><a href='/cgi-bin/ovpnmain.cgi'>$Lang::tr{'back'}</a></div>";
+               &Header::closebigbox();
+               &Header::closepage();
+               exit(0);
+    }
+
 ###
 ### Display Certificate Revoke List
 ###
@@ -1790,7 +2421,7 @@ else
 
     if ( -f "${General::swroot}/ovpn/crls/cacrl.pem") {
        &Header::showhttpheaders();
-       &Header::openpage($Lang::tr{'vpn configuration main'}, 1, '');
+       &Header::openpage($Lang::tr{'ovpn'}, 1, '');
        &Header::openbigbox('100%', 'LEFT', '', '');
        &Header::openbox('100%', 'LEFT', "$Lang::tr{'crl'}:");
        my $output = `/usr/bin/openssl crl -text -noout -in ${General::swroot}/ovpn/crls/cacrl.pem`;
@@ -1811,24 +2442,32 @@ else
     %cgiparams = ();
     %cahash = ();
     %confighash = ();
+    my $disabled;
     &General::readhash("${General::swroot}/ovpn/settings", \%cgiparams);
-
+    read_routepushfile;
+       
+       
 #    if ($cgiparams{'CLIENT2CLIENT'} eq '') {
 #      $cgiparams{'CLIENT2CLIENT'} =  'on';     
 #    }
 ADV_ERROR:
     if ($cgiparams{'MAX_CLIENTS'} eq '') {
-       $cgiparams{'MAX_CLIENTS'} =  '100';     
+               $cgiparams{'MAX_CLIENTS'} =  '100';
     }
-    
     if ($cgiparams{'KEEPALIVE_1'} eq '') {
-       $cgiparams{'KEEPALIVE_1'} =  '10';     
+               $cgiparams{'KEEPALIVE_1'} =  '10';
     }
     if ($cgiparams{'KEEPALIVE_2'} eq '') {
-       $cgiparams{'KEEPALIVE_2'} =  '60';     
+               $cgiparams{'KEEPALIVE_2'} =  '60';
     }
     if ($cgiparams{'LOG_VERB'} eq '') {
-       $cgiparams{'LOG_VERB'} =  '3';     
+               $cgiparams{'LOG_VERB'} =  '3';
+    }
+    if ($cgiparams{'PMTU_DISCOVERY'} eq '') {
+               $cgiparams{'PMTU_DISCOVERY'} = 'off';
+    }
+    if ($cgiparams{'DAUTH'} eq '') {
+               $cgiparams{'DAUTH'} = 'SHA1';
     }
     $checked{'CLIENT2CLIENT'}{'off'} = '';
     $checked{'CLIENT2CLIENT'}{'on'} = '';
@@ -1836,10 +2475,10 @@ ADV_ERROR:
     $checked{'REDIRECT_GW_DEF1'}{'off'} = '';
     $checked{'REDIRECT_GW_DEF1'}{'on'} = '';
     $checked{'REDIRECT_GW_DEF1'}{$cgiparams{'REDIRECT_GW_DEF1'}} = 'CHECKED';
-    $selected{'ENGINES'}{$cgiparams{'ENGINES'}} = 'SELECTED';
     $checked{'MSSFIX'}{'off'} = '';
     $checked{'MSSFIX'}{'on'} = '';
     $checked{'MSSFIX'}{$cgiparams{'MSSFIX'}} = 'CHECKED';
+    $checked{'PMTU_DISCOVERY'}{$cgiparams{'PMTU_DISCOVERY'}} = 'checked=\'checked\'';
     $selected{'LOG_VERB'}{'1'} = '';
     $selected{'LOG_VERB'}{'2'} = '';
     $selected{'LOG_VERB'}{'3'} = '';
@@ -1853,9 +2492,14 @@ ADV_ERROR:
     $selected{'LOG_VERB'}{'11'} = '';
     $selected{'LOG_VERB'}{'0'} = '';
     $selected{'LOG_VERB'}{$cgiparams{'LOG_VERB'}} = 'SELECTED';
+    $selected{'DAUTH'}{'whirlpool'} = '';
+    $selected{'DAUTH'}{'SHA512'} = '';
+    $selected{'DAUTH'}{'SHA384'} = '';
+    $selected{'DAUTH'}{'SHA256'} = '';
+    $selected{'DAUTH'}{'ecdsa-with-SHA1'} = '';
+    $selected{'DAUTH'}{'SHA1'} = '';
+    $selected{'DAUTH'}{$cgiparams{'DAUTH'}} = 'SELECTED';
 
-
-    
     &Header::showhttpheaders();
     &Header::openpage($Lang::tr{'status ovpn'}, 1, '');
     &Header::openbigbox('100%', 'LEFT', '', $errormessage);    
@@ -1866,107 +2510,162 @@ ADV_ERROR:
        &Header::closebox();
     }
     &Header::openbox('100%', 'LEFT', $Lang::tr{'advanced server'});
-    print <<END
+    print <<END;
     <form method='post' enctype='multipart/form-data'>
-    <table width='100%'>
-    <tr>
-       <td colspan='4'><b>$Lang::tr{'dhcp-options'}</b></td>
+<table width='100%' border=0>
+       <tr>
+               <td colspan='4'><b>$Lang::tr{'dhcp-options'}</b></td>
     </tr>
     <tr>
-       <td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='30%'></td>
+               <td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='30%'></td>
     </tr>      
     <tr>               
-       <td class='base'>Domain</td>
-        <td><input type='TEXT' name='DHCP_DOMAIN' value='$cgiparams{'DHCP_DOMAIN'}' size='30' /></td>
+               <td class='base'>Domain</td>
+        <td><input type='TEXT' name='DHCP_DOMAIN' value='$cgiparams{'DHCP_DOMAIN'}' size='30'  /></td>
     </tr>
     <tr>       
-       <td class='base'>DNS</td>
-       <td><input type='TEXT' name='DHCP_DNS' value='$cgiparams{'DHCP_DNS'}' size='30' /></td>
+               <td class='base'>DNS</td>
+               <td><input type='TEXT' name='DHCP_DNS' value='$cgiparams{'DHCP_DNS'}' size='30' /></td>
     </tr>      
     <tr>       
-       <td class='base'>WINS</td>
-       <td><input type='TEXT' name='DHCP_WINS' value='$cgiparams{'DHCP_WINS'}' size='30' /></td>
+               <td class='base'>WINS</td>
+               <td><input type='TEXT' name='DHCP_WINS' value='$cgiparams{'DHCP_WINS'}' size='30' /></td>
+       </tr>
+    <tr>
+               <td colspan='4'><b>$Lang::tr{'ovpn routes push options'}</b></td>
+    </tr>
+    <tr>       
+               <td class='base'>$Lang::tr{'ovpn routes push'}</td>
+               <td colspan='2'>
+               <textarea name='ROUTES_PUSH' cols='26' rows='6' wrap='off'>
+END
+;
+
+if ($cgiparams{'ROUTES_PUSH'} ne '')
+{
+       print $cgiparams{'ROUTES_PUSH'};
+}
+
+print <<END;
+</textarea></td>
+</tr>
     </tr>
 </table>
 <hr size='1'>
-    <table width='100%'>
+<table width='100%'>
     <tr>
-       <td class'base'><b>$Lang::tr{'misc-options'}</b></td>
+               <td class'base'><b>$Lang::tr{'misc-options'}</b></td>
     </tr>
     <tr>
-       <td width='20%'></td> <td width='15%'> </td><td width='15%'> </td><td width='50%'></td>
+               <td width='20%'></td> <td width='15%'> </td><td width='15%'> </td><td width='15%'></td><td width='35%'></td>
     </tr>
     <tr>
-       <td class='base'>Client-To-Client</td>
-       <td><input type='checkbox' name='CLIENT2CLIENT' $checked{'CLIENT2CLIENT'}{'on'} /></td>
+               <td class='base'>Client-To-Client</td>
+               <td><input type='checkbox' name='CLIENT2CLIENT' $checked{'CLIENT2CLIENT'}{'on'} /></td>
     </tr>
     <tr>       
-       <td class='base'>Redirect-Gateway def1</td>
-       <td><input type='checkbox' name='REDIRECT_GW_DEF1' $checked{'REDIRECT_GW_DEF1'}{'on'} /></td>
+               <td class='base'>Redirect-Gateway def1</td>
+               <td><input type='checkbox' name='REDIRECT_GW_DEF1' $checked{'REDIRECT_GW_DEF1'}{'on'} /></td>
     </tr>
     <tr>       
         <td class='base'>Max-Clients</td>
         <td><input type='text' name='MAX_CLIENTS' value='$cgiparams{'MAX_CLIENTS'}' size='10' /></td>
     </tr>      
-       <tr>
-         <td class='base'>Keppalive <br />
+       <tr>
+         <td class='base'>Keepalive <br />
            (ping/ping-restart)</td>
          <td><input type='TEXT' name='KEEPALIVE_1' value='$cgiparams{'KEEPALIVE_1'}' size='10' /></td>
          <td><input type='TEXT' name='KEEPALIVE_2' value='$cgiparams{'KEEPALIVE_2'}' size='10' /></td>
     </tr>
-       <tr>
+       <tr>
          <td class='base'>fragment <br></td>
          <td><input type='TEXT' name='FRAGMENT' value='$cgiparams{'FRAGMENT'}' size='10' /></td>
-        <td>Default: <span class="base">1300</span></td>
-      </tr>
-       <tr>
+       </tr>
+       <tr>
          <td class='base'>mssfix</td>
          <td><input type='checkbox' name='MSSFIX' $checked{'MSSFIX'}{'on'} /></td>
-         <td>Default: on</td>
-         </tr> 
+       </tr>
+       <tr>
+               <td class='base'>$Lang::tr{'ovpn mtu-disc'}</td>
+               <td><input type='radio' name='PMTU_DISCOVERY' value='yes' $checked{'PMTU_DISCOVERY'}{'yes'} /> $Lang::tr{'ovpn mtu-disc yes'}</td>
+               <td><input type='radio' name='PMTU_DISCOVERY' value='maybe' $checked{'PMTU_DISCOVERY'}{'maybe'} /> $Lang::tr{'ovpn mtu-disc maybe'}</td>
+               <td><input type='radio' name='PMTU_DISCOVERY' value='no' $checked{'PMTU_DISCOVERY'}{'no'} /> $Lang::tr{'ovpn mtu-disc no'}</td>
+               <td><input type='radio' name='PMTU_DISCOVERY' value='off' $checked{'PMTU_DISCOVERY'}{'off'} /> $Lang::tr{'ovpn mtu-disc off'}</td>
+       </tr>
 </table>
 
-<!--
 <hr size='1'>
-    <table width='100%'>
+<table width='100%'>
     <tr>
<td class'base'><b>Crypto-Engines</b></td>
              <td class'base'><b>$Lang::tr{'log-options'}</b></td>
     </tr>
     <tr>
-       <td width='15%'></td> <td width='30%'> </td><td width='25%'> </td><td width='30%'></td>
-    </tr>      
-    <tr><td class='base'>Engines:</td>        
-        <td><select name='ENGINES'><option value="none" $selected{'ENGINES'}{'none'}>none</option>
-                                   <option value="cryptodev" $selected{'ENGINES'}{'cryptodev'}>cryptodev</option>
-                                   <option value="padlock" $selected{'ENGINES'}{'padlock'}>padlock</option>
+               <td width='20%'></td> <td width='30%'> </td><td width='25%'> </td><td width='25%'></td>
+    </tr>
+
+    <tr><td class='base'>VERB</td>
+        <td><select name='LOG_VERB'>
+                               <option value='0'  $selected{'LOG_VERB'}{'0'}>0</option>
+                               <option value='1'  $selected{'LOG_VERB'}{'1'}>1</option>
+                               <option value='2'  $selected{'LOG_VERB'}{'2'}>2</option>
+                               <option value='3'  $selected{'LOG_VERB'}{'3'}>3</option>
+                               <option value='4'  $selected{'LOG_VERB'}{'4'}>4</option>
+                               <option value='5'  $selected{'LOG_VERB'}{'5'}>5</option>
+                               <option value='6'  $selected{'LOG_VERB'}{'6'}>6</option>
+                               <option value='7'  $selected{'LOG_VERB'}{'7'}>7</option>
+                               <option value='8'  $selected{'LOG_VERB'}{'8'}>8</option>
+                               <option value='9'  $selected{'LOG_VERB'}{'9'}>9</option>
+                               <option value='10' $selected{'LOG_VERB'}{'10'}>10</option>
+                               <option value='11' $selected{'LOG_VERB'}{'11'}>11</option>
                        </select>
-               </td>   
+               </td>
+       </tr>
 </table>
--->
+
 <hr size='1'>
-    <table width='100%'>
-    <tr>
-       <td class'base'><b>$Lang::tr{'log-options'}</b></td>
-    </tr>
+<table width='100%'>
     <tr>
-       <td width='15%'></td> <td width='30%'> </td><td width='25%'> </td><td width='30%'></td>
+               <td class'base'><b>$Lang::tr{'ovpn crypt options'}</b></td>
+       </tr>
+       <tr>
+               <td width='20%'></td> <td width='30%'> </td><td width='25%'> </td><td width='25%'></td>
     </tr>      
-       
-    <tr><td class='base'>VERB</td>        
-        <td><select name='LOG_VERB'><option value='1'  $selected{'LOG_VERB'}{'1'}>1</option>
-                                   <option value='2'  $selected{'LOG_VERB'}{'2'}>2</option>
-                                   <option value='3'  $selected{'LOG_VERB'}{'3'}>3</option>
-                                   <option value='4'  $selected{'LOG_VERB'}{'4'}>4</option>
-                                   <option value='5'  $selected{'LOG_VERB'}{'5'}>5</option>
-                                   <option value='6'  $selected{'LOG_VERB'}{'6'}>6</option>                                                                
-                                   <option value='7'  $selected{'LOG_VERB'}{'7'}>7</option>
-                                   <option value='8'  $selected{'LOG_VERB'}{'8'}>8</option>
-                                   <option value='9'  $selected{'LOG_VERB'}{'9'}>9</option>
-                                   <option value='10' $selected{'LOG_VERB'}{'10'}>10</option>
-                                   <option value='11' $selected{'LOG_VERB'}{'11'}>11</option>
-                                   <option value='0'  $selected{'LOG_VERB'}{'0'}>0</option></select></td>      
-</table>
-<hr size='1'>
+    <tr><td class='base'>$Lang::tr{'ovpn ha'}</td>
+               <td><select name='DAUTH'>
+                               <option value='whirlpool'               $selected{'DAUTH'}{'whirlpool'}>Whirlpool (512 $Lang::tr{'bit'})</option>
+                               <option value='SHA512'                  $selected{'DAUTH'}{'SHA512'}>SHA2 (512 $Lang::tr{'bit'})</option>
+                               <option value='SHA384'                  $selected{'DAUTH'}{'SHA384'}>SHA2 (384 $Lang::tr{'bit'})</option>
+                               <option value='SHA256'                  $selected{'DAUTH'}{'SHA256'}>SHA2 (256 $Lang::tr{'bit'})</option>
+                               <option value='ecdsa-with-SHA1'         $selected{'DAUTH'}{'ecdsa-with-SHA1'}>ECDSA-SHA1 (160 $Lang::tr{'bit'})</option>
+                               <option value='SHA1'                    $selected{'DAUTH'}{'SHA1'}>SHA1 (160 $Lang::tr{'bit'})</option>
+                       </select>
+               </td>
+               <td>Default: <span class="base">SHA1 (160 $Lang::tr{'bit'})</span></td>
+</table><hr>
+
+END
+
+if ( -e "/var/run/openvpn.pid"){
+print" <br><b><font color='#990000'>$Lang::tr{'attention'}:</b></font><br>
+               $Lang::tr{'server restart'}<br><br>
+               <hr>";
+               print<<END
+<table width='100%'>
+<tr>
+    <td>&nbsp;</td>
+    <td allign='center'><input type='submit' name='ACTION' value='$Lang::tr{'save-adv-options'}' disabled='disabled' /></td>
+    <td allign='center'><input type='submit' name='ACTION' value='$Lang::tr{'cancel-adv-options'}' /></td>
+    <td>&nbsp;</td>    
+</tr>
+</table>    
+</form>
+END
+;              
+               
+               
+}else{
+
+print<<END
 <table width='100%'>
 <tr>
     <td>&nbsp;</td>
@@ -1978,13 +2677,135 @@ ADV_ERROR:
 </form>
 END
 ;                                 
-
+}
     &Header::closebox();
 #    print "<div align='center'><a href='/cgi-bin/ovpnmain.cgi'>$Lang::tr{'back'}</a></div>";
     &Header::closebigbox();
     &Header::closepage();
     exit(0);
        
+
+# A.Marx CCD   Add,delete or edit CCD net
+
+} elsif ($cgiparams{'ACTION'} eq $Lang::tr{'ccd net'} || 
+               $cgiparams{'ACTION'} eq $Lang::tr{'ccd add'} ||  
+               $cgiparams{'ACTION'} eq "kill" || 
+               $cgiparams{'ACTION'} eq "edit" ||
+               $cgiparams{'ACTION'} eq 'editsave'){
+       &Header::showhttpheaders();
+       &Header::openpage($Lang::tr{'ccd net'}, 1, '');
+       &Header::openbigbox('100%', 'LEFT', '', '');
+
+       if ($cgiparams{'ACTION'} eq "kill"){
+               &delccdnet($cgiparams{'net'});
+       }
+       
+       if ($cgiparams{'ACTION'} eq 'editsave'){
+               my ($a,$b) =split (/\|/,$cgiparams{'ccdname'});
+               if ( $a ne $b){ &modccdnet($a,$b);}
+               $cgiparams{'ccdname'}='';
+               $cgiparams{'ccdsubnet'}='';
+       }
+       
+       if ($cgiparams{'ACTION'} eq $Lang::tr{'ccd add'}) {
+               &addccdnet($cgiparams{'ccdname'},$cgiparams{'ccdsubnet'});
+       }
+       if ($errormessage) {
+           &Header::openbox('100%', 'LEFT', $Lang::tr{'error messages'});
+           print "<class name='base'>$errormessage";
+           print "&nbsp;</class>";
+           &Header::closebox();                
+       }
+if ($cgiparams{'ACTION'} eq "edit"){
+       
+       &Header::openbox('100%', 'LEFT', $Lang::tr{'ccd modify'});
+
+    print <<END;
+    <table width='100%' border=0>
+    <tr><form method='post'>
+       <td width='10%' nowrap='nowrap'>$Lang::tr{'ccd name'}:</td><td><input type='TEXT' name='ccdname' value='$cgiparams{'ccdname'}' /></td>
+       <td width='8%'>$Lang::tr{'ccd subnet'}:</td><td><input type='TEXT' name='ccdsubnet' value='$cgiparams{'ccdsubnet'}' readonly /></td></tr>
+       <tr><td colspan='4' align='right'><hr><input type='submit' value='$Lang::tr{'save'}' /><input type='hidden' name='ACTION' value='editsave'/>
+       <input type='hidden' name='ccdname' value='$cgiparams{'ccdname'}'/><input type='submit' value='$Lang::tr{'cancel'}' />
+       </td></tr>
+       </table></form>
+END
+;
+       &Header::closebox();
+
+       &Header::openbox('100%', 'LEFT',$Lang::tr{'ccd net'} );
+    print <<END;
+    <table width='100%' border='0'  cellpadding='0' cellspacing='1'>
+    <tr>
+       <td class='boldbase' align='center'><b>$Lang::tr{'ccd name'}</td><td class='boldbase' align='center'><b>$Lang::tr{'network'}</td><td class='boldbase' width='15%' align='center'><b>$Lang::tr{'ccd used'}</td><td width='3%'></td><td width='3%'></td></tr>
+END
+;
+}
+else{
+       if (! -e "/var/run/openvpn.pid"){
+       &Header::openbox('100%', 'LEFT', $Lang::tr{'ccd add'});
+               print <<END;
+           <table width='100%' border='0'>
+           <tr><form method='post'>
+               <td colspan='4'>$Lang::tr{'ccd hint'}<br><br></td></tr>
+               <tr>
+               <td width='10%' nowrap='nwrap'>$Lang::tr{'ccd name'}:</td><td><input type='TEXT' name='ccdname' value='$cgiparams{'ccdname'}' /></td>
+               <td width='8%'>$Lang::tr{'ccd subnet'}:</td><td><input type='TEXT' name='ccdsubnet' value='$cgiparams{'ccdsubnet'}' /></td></tr>
+               <tr><td colspan=4><hr /></td></tr><tr>
+               <td colspan='4' align='right'><input type='hidden' name='ACTION' value='$Lang::tr{'ccd add'}' /><input type='submit' value='$Lang::tr{'add'}' /><input type='hidden' name='DOVPN_SUBNET' value='$cgiparams{'DOVPN_SUBNET'}'/></td></tr>
+               </table></form>
+END
+       
+       &Header::closebox();
+}
+       &Header::openbox('100%', 'LEFT',$Lang::tr{'ccd net'} );
+       if ( -e "/var/run/openvpn.pid"){
+               print "<b>$Lang::tr{'attention'}:</b><br>";
+               print "$Lang::tr{'ccd noaddnet'}<br><hr>";
+       }
+       
+    print <<END;
+    <table width='100%' cellpadding='0' cellspacing='1'>
+    <tr>
+       <td class='boldbase' align='center' nowrap='nowrap' width='20%'><b>$Lang::tr{'ccd name'}</td><td class='boldbase' align='center' width='8%'><b>$Lang::tr{'network'}</td><td class='boldbase' width='8%' align='center' nowrap='nowrap'><b>$Lang::tr{'ccd used'}</td><td width='1%' align='center'></td><td width='1%' align='center'></td></tr>
+END
+;
+}
+       my %ccdconfhash=();     
+       &General::readhasharray("${General::swroot}/ovpn/ccd.conf", \%ccdconfhash);     
+       my @ccdconf=();
+       my $count=0;
+       foreach my $key (sort { uc($ccdconfhash{$a}[0]) cmp uc($ccdconfhash{$b}[0]) } keys %ccdconfhash) {
+               @ccdconf=($ccdconfhash{$key}[0],$ccdconfhash{$key}[1]);
+               $count++;
+               my $ccdhosts = &hostsinnet($ccdconf[0]);
+               if ($count % 2){ print" <tr bgcolor='$color{'color22'}'>";}
+               else{            print" <tr bgcolor='$color{'color20'}'>";}
+               print"<td>$ccdconf[0]</td><td align='center'>$ccdconf[1]</td><td align='center'>$ccdhosts/".(&ccdmaxclients($ccdconf[1])+1)."</td><td>";
+        print <<END;
+               <form method='post' />
+               <input type='image' src='/images/edit.gif' align='middle' alt=$Lang::tr{'edit'} title=$Lang::tr{'edit'} />
+               <input type='hidden' name='ACTION' value='edit'/>
+               <input type='hidden' name='ccdname' value='$ccdconf[0]' />
+               <input type='hidden' name='ccdsubnet' value='$ccdconf[1]' />
+               </form></td>
+               <form method='post' />
+               <td><input type='hidden' name='ACTION' value='kill'/>
+               <input type='hidden' name='number' value='$count' />
+               <input type='hidden' name='net' value='$ccdconf[0]' />
+               <input type='image' src='/images/delete.gif' align='middle' alt=$Lang::tr{'remove'} title=$Lang::tr{'remove'} /></form></td></tr>
+END
+;
+       }       
+       print "</table></form>";
+       &Header::closebox();
+       print "<div align='center'><a href='/cgi-bin/ovpnmain.cgi'>$Lang::tr{'back'}</a></div>";
+       &Header::closebigbox();
+       &Header::closepage();
+       exit(0);
+       
+#END CCD
+
 ###
 ### Openvpn Connections Statistics
 ###
@@ -1997,16 +2818,16 @@ END
 #
 #      <td><b>$Lang::tr{'protocol'}</b></td>
 # protocol temp removed 
-    print <<END
-    <table width='100%' border='0' cellpadding='2' cellspacing='0'>
+    print <<END;
+    <table width='100%' cellpadding='2' cellspacing='0' class='tbl'>
     <tr>
-       <td><b>$Lang::tr{'common name'}</b></td>
-       <td><b>$Lang::tr{'real address'}</b></td>
-       <td><b>$Lang::tr{'virtual address'}</b></td>
-       <td><b>$Lang::tr{'loged in at'}</b></td>
-       <td><b>$Lang::tr{'bytes sent'}</b></td>
-       <td><b>$Lang::tr{'bytes received'}</b></td>
-       <td><b>$Lang::tr{'last activity'}</b></td>
+       <th><b>$Lang::tr{'common name'}</b></th>
+       <th><b>$Lang::tr{'real address'}</b></th>
+       <th><b>$Lang::tr{'virtual address'}</b></th>
+       <th><b>$Lang::tr{'loged in at'}</b></th>
+       <th><b>$Lang::tr{'bytes sent'}</b></th>
+       <th><b>$Lang::tr{'bytes received'}</b></th>
+       <th><b>$Lang::tr{'last activity'}</b></th>
     </tr>
 END
 ;
@@ -2057,25 +2878,26 @@ END
        }
        my $user2 = @users;
        if ($user2 >= 1){
-           for (my $idx = 1; $idx <= $user2; $idx++){
+               for (my $idx = 1; $idx <= $user2; $idx++){
                                                if ($idx % 2) {
-                                       print "<tr bgcolor='$color{'color20'}'>\n";
-                               } else {
-                                       print "<tr bgcolor='$color{'color22'}'>\n";
+                                                       print "<tr>";
+                                                       $col="bgcolor='$color{'color22'}'";
+                                               } else {
+                                                       print "<tr>";
+                                                       $col="bgcolor='$color{'color20'}'";
                                                }
-                                               print "<td align='left'>$users[$idx-1]{'CommonName'}</td>";
-                                               print "<td align='left'>$users[$idx-1]{'RealAddress'}</td>";
-                                               print "<td align='left'>$users[$idx-1]{'VirtualAddress'}</td>";
-                                               print "<td align='left'>$users[$idx-1]{'Since'}</td>";
-                                               print "<td align='left'>$users[$idx-1]{'BytesSent'}</td>";
-                                               print "<td align='left'>$users[$idx-1]{'BytesReceived'}</td>";
-                                               print "<td align='left'>$users[$idx-1]{'LastRef'}</td>";
-#                      print "<td align='left'>$users[$idx-1]{'Proto'}</td>";
-           }
-       }        
+                                               print "<td align='left' $col>$users[$idx-1]{'CommonName'}</td>";
+                                               print "<td align='left' $col>$users[$idx-1]{'RealAddress'}</td>";
+                                               print "<td align='left' $col>$users[$idx-1]{'VirtualAddress'}</td>";
+                                               print "<td align='left' $col>$users[$idx-1]{'Since'}</td>";
+                                               print "<td align='left' $col>$users[$idx-1]{'BytesSent'}</td>";
+                                               print "<td align='left' $col>$users[$idx-1]{'BytesReceived'}</td>";
+                                               print "<td align='left' $col>$users[$idx-1]{'LastRef'}</td>";
+                       }
+       }
        
        print "</table>";
-       print <<END
+    print <<END;
        <table width='100%' border='0' cellpadding='2' cellspacing='0'>
        <tr><td></td></tr>
        <tr><td></td></tr>
@@ -2184,15 +3006,15 @@ END
 } elsif ($cgiparams{'ACTION'} eq $Lang::tr{'add'} && $cgiparams{'TYPE'} eq '') {
        &General::readhash("${General::swroot}/ovpn/settings", \%vpnsettings);
        &Header::showhttpheaders();
-       &Header::openpage($Lang::tr{'vpn configuration main'}, 1, '');
+       &Header::openpage($Lang::tr{'ovpn'}, 1, '');
        &Header::openbigbox('100%', 'LEFT', '', '');
        &Header::openbox('100%', 'LEFT', $Lang::tr{'connection type'});
 
 if ( -s "${General::swroot}/ovpn/settings") {
 
-       print <<END
+    print <<END;
            <b>$Lang::tr{'connection type'}:</b><br />
-           <table><form method='post' ENCTYPE="multipart/form-data">
+           <table border='0' width='100%'><form method='post' ENCTYPE="multipart/form-data">
            <tr><td><input type='radio' name='TYPE' value='host' checked /></td>
                <td class='base'>$Lang::tr{'host to net vpn'}</td></tr>
            <tr><td><input type='radio' name='TYPE' value='net' /></td>
@@ -2200,17 +3022,22 @@ if ( -s "${General::swroot}/ovpn/settings") {
                <tr><td><input type='radio' name='TYPE' value='net2net' /></td>         
                <td class='base'>$Lang::tr{'net to net vpn'} (Upload Client Package)</td></tr>
          <tr><td>&nbsp;</td><td class='base'><input type='file' name='FH' size='30'></td></tr>
-         <tr><td align='center'><input type='submit' name='ACTION' value='$Lang::tr{'add'}' /></td></tr>
+         <tr><td>&nbsp;</td><td>Import Connection Name <img src='/blob.gif' /></td></tr>
+    <tr><td>&nbsp;</td><td class='base'><input type='text' name='n2nname' size='30'>Default : Client Packagename</td></tr>
+         <tr><td colspan='3'><hr /></td></tr>
+    <tr><td align='right' colspan='3'><input type='submit' name='ACTION' value='$Lang::tr{'add'}' /></td></tr>
+         <tr><td class='base' colspan='3' align='left'><img src='/blob.gif' alt='*' />&nbsp;$Lang::tr{'this field may be blank'}</td></tr>
            </form></table>
 END
        ;
+       
 
 } else {
-       print <<END
+    print <<END;
                    <b>$Lang::tr{'connection type'}:</b><br />
-           <table><form method='post' ENCTYPE="multipart/form-data">
+           <table border='0' width='100%'><form method='post' ENCTYPE="multipart/form-data">
            <tr><td><input type='radio' name='TYPE' value='host' checked /></td> <td class='base'>$Lang::tr{'host to net vpn'}</td></tr>
-           <tr><td align='center'><input type='submit' name='ACTION' value='$Lang::tr{'add'}' /></td></tr>
+           <tr><td align='right' colspan'3'><input type='submit' name='ACTION' value='$Lang::tr{'add'}' /></td></tr>
            </form></table>
 END
        ;
@@ -2218,6 +3045,7 @@ END
 }
 
        &Header::closebox();
+       print "<div align='center'><a href='/cgi-bin/ovpnmain.cgi'>$Lang::tr{'back'}</a></div>";
        &Header::closebigbox();
        &Header::closepage();
        exit (0);
@@ -2231,11 +3059,14 @@ END
        my @firen2nconf;
        my @confdetails;
        my $uplconffilename ='';
+       my $uplconffilename2 ='';
        my $uplp12name = '';
+       my $uplp12name2 = '';
        my @rem_subnet;
        my @rem_subnet2;
        my @tmposupnet3;        
        my $key;
+       my @n2nname;
 
        &General::readhasharray("${General::swroot}/ovpn/ovpnconfig", \%confighash);    
 
@@ -2299,14 +3130,38 @@ END
 ###
 # m.a.d net2net
 ###
+  
+ if ($cgiparams{'n2nname'} ne ''){
+
+  $uplconffilename2 = "$cgiparams{'n2nname'}.conf"; 
+  $uplp12name2 = "$cgiparams{'n2nname'}.p12"; 
+  $n2nname[0] = $cgiparams{'n2nname'};
+  my @n2nname2 = split(/\./,$uplconffilename);
+  $n2nname2[0] =~ s/\n|\r//g;
+  my $input1 = "${General::swroot}/ovpn/certs/$uplp12name";
+       my $output1 = "${General::swroot}/ovpn/certs/$uplp12name2";
+       my $input2 = "$n2nname2[0]n2n";
+  my $output2 = "$n2nname[0]n2n";
+  my $filename = "$tempdir/$uplconffilename";
+  open(FILE, "< $filename") or die 'Unable to open config file.';
+       my @current = <FILE>;
+       close(FILE);
+       foreach (@current) {s/$input1/$output1/g;}
+       foreach (@current) {s/$input2/$output2/g;}
+  open (OUT, "> $filename") || die 'Unable to open config file.';
+  print OUT @current;
+  close OUT;
 
- my @n2nname = split(/\./,$uplconffilename);
+    }else{
+    $uplconffilename2 =  $uplconffilename;
+    $uplp12name2 = $uplp12name;
+    @n2nname = split(/\./,$uplconffilename);
     $n2nname[0] =~ s/\n|\r//g;
-
+   } 
     unless(-d "${General::swroot}/ovpn/n2nconf/"){mkdir "${General::swroot}/ovpn/n2nconf", 0755 or die "Unable to create dir $!";}
     unless(-d "${General::swroot}/ovpn/n2nconf/$n2nname[0]"){mkdir "${General::swroot}/ovpn/n2nconf/$n2nname[0]", 0770 or die "Unable to create dir $!";}   
 
-       move("$tempdir/$uplconffilename", "${General::swroot}/ovpn/n2nconf/$n2nname[0]/$uplconffilename");
+       move("$tempdir/$uplconffilename", "${General::swroot}/ovpn/n2nconf/$n2nname[0]/$uplconffilename2");
 
        if ($? ne 0) {
            $errormessage = "*.conf move failed: $!";
@@ -2314,7 +3169,7 @@ END
            goto N2N_ERROR;
        }
        
-       move("$tempdir/$uplp12name", "${General::swroot}/ovpn/certs/$uplp12name");
+       move("$tempdir/$uplp12name", "${General::swroot}/ovpn/certs/$uplp12name2");
        chmod 0600, "${General::swroot}/ovpn/certs/$uplp12name";
        
        if ($? ne 0) {
@@ -2325,21 +3180,27 @@ END
        
 my $complzoactive;
 my $mssfixactive;
+my $authactive;
 my $n2nfragment;
+my @n2nmtudisc = split(/ /, (grep { /^mtu-disc/ } @firen2nconf)[0]);
 my @n2nproto2 = split(/ /, (grep { /^proto/ } @firen2nconf)[0]);
-my @n2nproto = split(/-/, @n2nproto2[1]);
+my @n2nproto = split(/-/, $n2nproto2[1]);
 my @n2nport = split(/ /, (grep { /^port/ } @firen2nconf)[0]);
 my @n2ntunmtu = split(/ /, (grep { /^tun-mtu/ } @firen2nconf)[0]);
 my @n2ncomplzo = grep { /^comp-lzo/ } @firen2nconf;
 if ($n2ncomplzo[0] =~ /comp-lzo/){$complzoactive = "on";} else {$complzoactive = "off";}       
 my @n2nmssfix  = grep { /^mssfix/ } @firen2nconf;
 if ($n2nmssfix[0] =~ /mssfix/){$mssfixactive = "on";} else {$mssfixactive = "off";}
+#my @n2nmssfix = split(/ /, (grep { /^mssfix/ } @firen2nconf)[0]);
 my @n2nfragment = split(/ /, (grep { /^fragment/ } @firen2nconf)[0]);
 my @n2nremote = split(/ /, (grep { /^remote/ } @firen2nconf)[0]);
 my @n2novpnsuball = split(/ /, (grep { /^ifconfig/ } @firen2nconf)[0]);
 my @n2novpnsub =  split(/\./,$n2novpnsuball[1]);
 my @n2nremsub = split(/ /, (grep { /^route/ } @firen2nconf)[0]);
+my @n2nmgmt =  split(/ /, (grep { /^management/ } @firen2nconf)[0]);
 my @n2nlocalsub  = split(/ /, (grep { /^# remsub/ } @firen2nconf)[0]);
+my @n2ncipher = split(/ /, (grep { /^cipher/ } @firen2nconf)[0]);
+my @n2nauth = split(/ /, (grep { /^auth/ } @firen2nconf)[0]);
 
 
 ###
@@ -2357,6 +3218,10 @@ $n2nremsub[1] =~ s/\n|\r//g;
 $n2nremsub[2] =~ s/\n|\r//g;
 $n2nlocalsub[2] =~ s/\n|\r//g;
 $n2nfragment[1] =~ s/\n|\r//g;
+$n2nmgmt[2] =~ s/\n|\r//g;
+$n2nmtudisc[1] =~ s/\n|\r//g;
+$n2ncipher[1] =~ s/\n|\r//g;
+$n2nauth[1] =~ s/\n|\r//g;
 chomp ($complzoactive);
 chomp ($mssfixactive);
 
@@ -2393,7 +3258,7 @@ foreach my $dkey (keys %confighash) {
        }
 
 ###
-# Check im Dest Port is vaild
+# Check if Dest Port is vaild
 ###
 
 foreach my $dkey (keys %confighash) {
@@ -2410,26 +3275,30 @@ foreach my $dkey (keys %confighash) {
        
   $key = &General::findhasharraykey (\%confighash);
 
-       foreach my $i (0 .. 31) { $confighash{$key}[$i] = "";}
+       foreach my $i (0 .. 41) { $confighash{$key}[$i] = "";}
+
        $confighash{$key}[0] = 'off';
        $confighash{$key}[1] = $n2nname[0];
-  $confighash{$key}[2] = $n2nname[0];  
+       $confighash{$key}[2] = $n2nname[0];     
        $confighash{$key}[3] = 'net';
        $confighash{$key}[4] = 'cert';  
        $confighash{$key}[6] = 'client';                
        $confighash{$key}[8] =  $n2nlocalsub[2];
-  $confighash{$key}[10] = $n2nremote[1];
-  $confighash{$key}[11] = "$n2nremsub[1]/$n2nremsub[2]";               
+       $confighash{$key}[10] = $n2nremote[1];
+       $confighash{$key}[11] = "$n2nremsub[1]/$n2nremsub[2]";          
+       $confighash{$key}[22] = $n2nmgmt[2];
        $confighash{$key}[23] = $mssfixactive;
        $confighash{$key}[24] = $n2nfragment[1];
-  $confighash{$key}[25] = 'IPFire n2n Client';
+       $confighash{$key}[25] = 'IPFire n2n Client';
        $confighash{$key}[26] = 'red';
-  $confighash{$key}[27] = "$n2novpnsub[0].$n2novpnsub[1].$n2novpnsub[2].0/255.255.255.0";
-  $confighash{$key}[28] = $n2nproto[0];
-  $confighash{$key}[29] = $n2nport[1];
-  $confighash{$key}[30] = $complzoactive;
-  $confighash{$key}[31] = $n2ntunmtu[1];
-
+       $confighash{$key}[27] = "$n2novpnsub[0].$n2novpnsub[1].$n2novpnsub[2].0/255.255.255.0";
+       $confighash{$key}[28] = $n2nproto[0];
+       $confighash{$key}[29] = $n2nport[1];
+       $confighash{$key}[30] = $complzoactive;
+       $confighash{$key}[31] = $n2ntunmtu[1];
+       $confighash{$key}[38] = $n2nmtudisc[1]; 
+       $confighash{$key}[39] = $n2nauth[1];
+       $confighash{$key}[40] = $n2ncipher[1];
 
   &General::writehasharray("${General::swroot}/ovpn/ovpnconfig", \%confighash);
  
@@ -2449,7 +3318,7 @@ foreach my $dkey (keys %confighash) {
                &Header::openbox('100%', 'LEFT', 'import ipfire net2net config');
        }
        if ($errormessage eq ''){
-               print <<END             
+        print <<END;
                <!-- ipfire net2net config gui -->
                <table width='100%'>
                <tr><td width='25%'>&nbsp;</td><td width='25%'>&nbsp;</td></tr>
@@ -2458,14 +3327,18 @@ foreach my $dkey (keys %confighash) {
                <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'Act as'}</td><td><b>$confighash{$key}[6]</b></td></tr>                                                              
                <tr><td class='boldbase' nowrap='nowrap'>Remote Host </td><td><b>$confighash{$key}[10]</b></td></tr>
                <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'local subnet'}</td><td><b>$confighash{$key}[8]</b></td></tr>
-               <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'remote subnet'}</td><td><b>$confighash{$key}[11]</b></td></tr>
+               <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'remote subnet'}:</td><td><b>$confighash{$key}[11]</b></td></tr>
                <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'ovpn subnet'}</td><td><b>$confighash{$key}[27]</b></td></tr>
                <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'protocol'}</td><td><b>$confighash{$key}[28]</b></td></tr>
                <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'destination port'}:</td><td><b>$confighash{$key}[29]</b></td></tr>
                <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'comp-lzo'}</td><td><b>$confighash{$key}[30]</b></td></tr>
-               <tr><td class='boldbase' nowrap='nowrap'>MSSFIX </td><td><b>$confighash{$key}[23]</b></td></tr>
-               <tr><td class='boldbase' nowrap='nowrap'>Fragment </td><td><b>$confighash{$key}[24]</b></td></tr>
+               <tr><td class='boldbase' nowrap='nowrap'>MSSFIX:</td><td><b>$confighash{$key}[23]</b></td></tr>
+               <tr><td class='boldbase' nowrap='nowrap'>Fragment:</td><td><b>$confighash{$key}[24]</b></td></tr>
                <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'MTU'}</td><td><b>$confighash{$key}[31]</b></td></tr>
+               <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'ovpn mtu-disc'}:</td><td><b>$confighash{$key}[38]</b></td></tr>
+               <tr><td class='boldbase' nowrap='nowrap'>Management Port:</td><td><b>$confighash{$key}[22]</b></td></tr>
+               <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'ovpn hmac'}:</td><td><b>$confighash{$key}[39]</b></td></tr>
+               <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'cipher'}</td><td><b>$confighash{$key}[40]</b></td></tr>
                <tr><td>&nbsp;</td><td>&nbsp;</td></tr> 
     </table>
 END
@@ -2483,7 +3356,7 @@ END
        }       
        &Header::closebigbox();
        &Header::closepage();
-       exit(0);        
+       exit(0);
 
 
 ##
@@ -2526,44 +3399,218 @@ if ($confighash{$cgiparams{'KEY'}}) {
 } elsif (($cgiparams{'ACTION'} eq $Lang::tr{'add'}) ||
         ($cgiparams{'ACTION'} eq $Lang::tr{'edit'}) ||
         ($cgiparams{'ACTION'} eq $Lang::tr{'save'} && $cgiparams{'ADVANCED'} eq '')) {
-
+           
     &General::readhash("${General::swroot}/ovpn/settings", \%vpnsettings);
     &General::readhasharray("${General::swroot}/ovpn/caconfig", \%cahash);
     &General::readhasharray("${General::swroot}/ovpn/ovpnconfig", \%confighash);
 
     if ($cgiparams{'ACTION'} eq $Lang::tr{'edit'}) {
-       if (! $confighash{$cgiparams{'KEY'}}[0]) {
-           $errormessage = $Lang::tr{'invalid key'};
-           goto VPNCONF_END;
-       }
-       $cgiparams{'ENABLED'}   = $confighash{$cgiparams{'KEY'}}[0];
-       $cgiparams{'NAME'}      = $confighash{$cgiparams{'KEY'}}[1];
-       $cgiparams{'TYPE'}      = $confighash{$cgiparams{'KEY'}}[3];
-       $cgiparams{'AUTH'}      = $confighash{$cgiparams{'KEY'}}[4];
-       $cgiparams{'PSK'}       = $confighash{$cgiparams{'KEY'}}[5];
-       $cgiparams{'SIDE'}      = $confighash{$cgiparams{'KEY'}}[6];
-       $cgiparams{'LOCAL_SUBNET'} = $confighash{$cgiparams{'KEY'}}[8];
-  $cgiparams{'REMOTE'} = $confighash{$cgiparams{'KEY'}}[10];
-  $cgiparams{'REMOTE_SUBNET'} = $confighash{$cgiparams{'KEY'}}[11];
-# n2n m.a.d new fields
-  $cgiparams{'MSSFIX'} = $confighash{$cgiparams{'KEY'}}[23];
-  $cgiparams{'FRAGMENT'} = $confighash{$cgiparams{'KEY'}}[24];
-       $cgiparams{'REMARK'}    = $confighash{$cgiparams{'KEY'}}[25];
-       $cgiparams{'INTERFACE'} = $confighash{$cgiparams{'KEY'}}[26];
-#new fields    
-       $cgiparams{'OVPN_SUBNET'} = $confighash{$cgiparams{'KEY'}}[27];
-       $cgiparams{'PROTOCOL'}    = $confighash{$cgiparams{'KEY'}}[28];
-       $cgiparams{'DEST_PORT'}   = $confighash{$cgiparams{'KEY'}}[29];
-       $cgiparams{'COMPLZO'}     = $confighash{$cgiparams{'KEY'}}[30];
-       $cgiparams{'MTU'}         = $confighash{$cgiparams{'KEY'}}[31];
-
-#new fields
-#ab hiere error uebernehmen
-
-    } elsif ($cgiparams{'ACTION'} eq $Lang::tr{'save'}) {
+               if (! $confighash{$cgiparams{'KEY'}}[0]) {
+                   $errormessage = $Lang::tr{'invalid key'};
+                   goto VPNCONF_END;
+               }
+               $cgiparams{'ENABLED'}           = $confighash{$cgiparams{'KEY'}}[0];
+               $cgiparams{'NAME'}              = $confighash{$cgiparams{'KEY'}}[1];
+               $cgiparams{'TYPE'}              = $confighash{$cgiparams{'KEY'}}[3];
+               $cgiparams{'AUTH'}              = $confighash{$cgiparams{'KEY'}}[4];
+               $cgiparams{'PSK'}               = $confighash{$cgiparams{'KEY'}}[5];
+               $cgiparams{'SIDE'}              = $confighash{$cgiparams{'KEY'}}[6];
+               $cgiparams{'LOCAL_SUBNET'}      = $confighash{$cgiparams{'KEY'}}[8];
+               $cgiparams{'REMOTE'}            = $confighash{$cgiparams{'KEY'}}[10];
+               $cgiparams{'REMOTE_SUBNET'}     = $confighash{$cgiparams{'KEY'}}[11];
+               $cgiparams{'OVPN_MGMT'}         = $confighash{$cgiparams{'KEY'}}[22];
+               $cgiparams{'MSSFIX'}            = $confighash{$cgiparams{'KEY'}}[23];
+               $cgiparams{'FRAGMENT'}          = $confighash{$cgiparams{'KEY'}}[24];
+               $cgiparams{'REMARK'}            = $confighash{$cgiparams{'KEY'}}[25];
+               $cgiparams{'INTERFACE'}         = $confighash{$cgiparams{'KEY'}}[26];
+               $cgiparams{'OVPN_SUBNET'}       = $confighash{$cgiparams{'KEY'}}[27];
+               $cgiparams{'PROTOCOL'}          = $confighash{$cgiparams{'KEY'}}[28];
+               $cgiparams{'DEST_PORT'}         = $confighash{$cgiparams{'KEY'}}[29];
+               $cgiparams{'COMPLZO'}           = $confighash{$cgiparams{'KEY'}}[30];
+               $cgiparams{'MTU'}               = $confighash{$cgiparams{'KEY'}}[31];
+               $cgiparams{'CHECK1'}            = $confighash{$cgiparams{'KEY'}}[32];
+               $name=$cgiparams{'CHECK1'}      ;
+               $cgiparams{$name}               = $confighash{$cgiparams{'KEY'}}[33];
+               $cgiparams{'RG'}                = $confighash{$cgiparams{'KEY'}}[34];
+               $cgiparams{'CCD_DNS1'}          = $confighash{$cgiparams{'KEY'}}[35];
+               $cgiparams{'CCD_DNS2'}          = $confighash{$cgiparams{'KEY'}}[36];
+               $cgiparams{'CCD_WINS'}          = $confighash{$cgiparams{'KEY'}}[37];
+               $cgiparams{'PMTU_DISCOVERY'}    = $confighash{$cgiparams{'KEY'}}[38];
+               $cgiparams{'DAUTH'}             = $confighash{$cgiparams{'KEY'}}[39];
+               $cgiparams{'DCIPHER'}           = $confighash{$cgiparams{'KEY'}}[40];
+       } elsif ($cgiparams{'ACTION'} eq $Lang::tr{'save'}) {
        $cgiparams{'REMARK'} = &Header::cleanhtml($cgiparams{'REMARK'});
        
-  if ($cgiparams{'TYPE'} !~ /^(host|net)$/) {
+#A.Marx CCD check iroute field and convert it to decimal
+if ($cgiparams{'TYPE'} eq 'host') {
+       my @temp=();
+       my %ccdroutehash=();
+       my $keypoint=0;
+       my $ip;
+       my $cidr;
+       if ($cgiparams{'IR'} ne ''){
+               @temp = split("\n",$cgiparams{'IR'});
+               &General::readhasharray("${General::swroot}/ovpn/ccdroute", \%ccdroutehash);
+               #find key to use
+               foreach my $key (keys %ccdroutehash) {
+                       if ($ccdroutehash{$key}[0] eq $cgiparams{'NAME'}) {
+                               $keypoint=$key;
+                               delete $ccdroutehash{$key};
+                       }else{
+                               $keypoint = &General::findhasharraykey (\%ccdroutehash);
+                       }
+               }
+               $ccdroutehash{$keypoint}[0]=$cgiparams{'NAME'};
+               my $i=1;
+               my $val=0;
+               foreach $val (@temp){
+                       chomp($val);
+                       $val=~s/\s*$//g; 
+                       #check if iroute exists in ccdroute or if new iroute is part of an existing one
+                       foreach my $key (keys %ccdroutehash) {
+                               foreach my $oldiroute ( 1 .. $#{$ccdroutehash{$key}}){
+                                               if ($ccdroutehash{$key}[$oldiroute] eq "$val") {
+                                                       $errormessage=$errormessage.$Lang::tr{'ccd err irouteexist'};
+                                                       goto VPNCONF_ERROR;
+                                               }
+                                               my ($ip1,$cidr1) = split (/\//, $val);
+                                               $ip1 = &General::getnetworkip($ip1,&General::iporsubtocidr($cidr1));
+                                               my ($ip2,$cidr2) = split (/\//, $ccdroutehash{$key}[$oldiroute]);
+                                               if (&General::IpInSubnet ($ip1,$ip2,$cidr2)){
+                                                       $errormessage=$errormessage.$Lang::tr{'ccd err irouteexist'};
+                                                       goto VPNCONF_ERROR;
+                                               } 
+                                                                       
+                               }
+                       }
+                       if (!&General::validipandmask($val)){
+                               $errormessage=$errormessage."Route ".$Lang::tr{'ccd invalid'}." ($val)";
+                               goto VPNCONF_ERROR;
+                       }else{
+                               ($ip,$cidr) = split(/\//,$val);
+                               $ip=&General::getnetworkip($ip,&General::iporsubtocidr($cidr));
+                               $cidr=&General::iporsubtodec($cidr);
+                               $ccdroutehash{$keypoint}[$i] = $ip."/".$cidr;
+                       
+                       }
+                                                                                                                                       
+                       #check for existing network IP's
+                       if (&General::IpInSubnet ($ip,$netsettings{GREEN_NETADDRESS},$netsettings{GREEN_NETMASK}) && $netsettings{GREEN_NETADDRESS} ne '0.0.0.0')
+                       {
+                               $errormessage=$Lang::tr{'ccd err green'};
+                               goto VPNCONF_ERROR;
+                       }elsif(&General::IpInSubnet ($ip,$netsettings{RED_NETADDRESS},$netsettings{RED_NETMASK}) && $netsettings{RED_NETADDRESS} ne '0.0.0.0')
+                       {
+                               $errormessage=$Lang::tr{'ccd err red'};
+                               goto VPNCONF_ERROR;
+                       }elsif(&General::IpInSubnet ($ip,$netsettings{BLUE_NETADDRESS},$netsettings{BLUE_NETMASK}) && $netsettings{BLUE_NETADDRESS} ne '0.0.0.0' && $netsettings{BLUE_NETADDRESS} gt '')
+                       {
+                               $errormessage=$Lang::tr{'ccd err blue'};
+                               goto VPNCONF_ERROR;
+                       }elsif(&General::IpInSubnet ($ip,$netsettings{ORANGE_NETADDRESS},$netsettings{ORANGE_NETMASK}) && $netsettings{ORANGE_NETADDRESS} ne '0.0.0.0' && $netsettings{ORANGE_NETADDRESS} gt '' )
+                       {
+                               $errormessage=$Lang::tr{'ccd err orange'};
+                               goto VPNCONF_ERROR;
+                       }
+                                               
+                       if (&General::validipandmask($val)){
+                               $ccdroutehash{$keypoint}[$i] = $ip."/".$cidr;
+                       }else{
+                               $errormessage=$errormessage."Route ".$Lang::tr{'ccd invalid'}." ($ip/$cidr)";
+                               goto VPNCONF_ERROR;
+                       }
+                       $i++;
+               }
+               &General::writehasharray("${General::swroot}/ovpn/ccdroute", \%ccdroutehash);
+               &writeserverconf;
+       }else{
+               &General::readhasharray("${General::swroot}/ovpn/ccdroute", \%ccdroutehash);
+               foreach my $key (keys %ccdroutehash) {
+                       if ($ccdroutehash{$key}[0] eq $cgiparams{'NAME'}) {
+                               delete $ccdroutehash{$key};
+                               &General::writehasharray("${General::swroot}/ovpn/ccdroute", \%ccdroutehash);
+                               &writeserverconf;
+                       }
+               }       
+       }
+       undef @temp;
+       #check route field and convert it to decimal
+       my $val=0;
+       my $i=1;
+       &General::readhasharray("${General::swroot}/ovpn/ccdroute2", \%ccdroute2hash);
+       #find key to use
+       foreach my $key (keys %ccdroute2hash) {
+               if ($ccdroute2hash{$key}[0] eq $cgiparams{'NAME'}) {
+                       $keypoint=$key;
+                       delete $ccdroute2hash{$key};
+               }else{
+                       $keypoint = &General::findhasharraykey (\%ccdroute2hash);
+                       &General::writehasharray("${General::swroot}/ovpn/ccdroute", \%ccdroutehash);
+                       &writeserverconf;
+               }
+       }
+       $ccdroute2hash{$keypoint}[0]=$cgiparams{'NAME'};
+       if ($cgiparams{'IFROUTE'} eq ''){$cgiparams{'IFROUTE'} = $Lang::tr{'ccd none'};}
+       @temp = split(/\|/,$cgiparams{'IFROUTE'});
+       my %ownnet=();
+       &General::readhash("${General::swroot}/ethernet/settings", \%ownnet);
+       foreach $val (@temp){
+               chomp($val);
+               $val=~s/\s*$//g; 
+               if ($val eq $Lang::tr{'green'})
+               {
+                       $val=$ownnet{GREEN_NETADDRESS}."/".$ownnet{GREEN_NETMASK};
+               }
+               if ($val eq $Lang::tr{'blue'})
+               {
+                       $val=$ownnet{BLUE_NETADDRESS}."/".$ownnet{BLUE_NETMASK};
+               }
+               if ($val eq $Lang::tr{'orange'})
+               {
+                       $val=$ownnet{ORANGE_NETADDRESS}."/".$ownnet{ORANGE_NETMASK};
+               }
+               my ($ip,$cidr) = split (/\//, $val);
+               
+               if ($val ne $Lang::tr{'ccd none'})
+               {       
+                       if (! &check_routes_push($val)){$errormessage=$errormessage."Route $val ".$Lang::tr{'ccd err routeovpn2'}." ($val)";goto VPNCONF_ERROR;}
+                       if (! &check_ccdroute($val)){$errormessage=$errormessage."<br>Route $val ".$Lang::tr{'ccd err inuse'}." ($val)" ;goto VPNCONF_ERROR;}
+                       if (! &check_ccdconf($val)){$errormessage=$errormessage."<br>Route $val ".$Lang::tr{'ccd err routeovpn'}." ($val)";goto VPNCONF_ERROR;}
+                       if (&General::validipandmask($val)){
+                               $val=$ip."/".&General::iporsubtodec($cidr);
+                               $ccdroute2hash{$keypoint}[$i] = $val;
+                       }else{
+                               $errormessage=$errormessage."Route ".$Lang::tr{'ccd invalid'}." ($val)";
+                               goto VPNCONF_ERROR;
+                       }
+               }else{
+                       $ccdroute2hash{$keypoint}[$i]='';
+               }
+               $i++;
+       }       
+       &General::writehasharray("${General::swroot}/ovpn/ccdroute2", \%ccdroute2hash);
+
+       #check dns1 ip
+       if ($cgiparams{'CCD_DNS1'} ne '' &&  ! &General::validip($cgiparams{'CCD_DNS1'})) {
+                       $errormessage=$errormessage."<br>".$Lang::tr{'invalid input for dhcp dns'}." 1";
+                       goto VPNCONF_ERROR;
+       }
+       #check dns2 ip
+       if ($cgiparams{'CCD_DNS2'} ne '' &&  ! &General::validip($cgiparams{'CCD_DNS2'})) {
+                       $errormessage=$errormessage."<br>".$Lang::tr{'invalid input for dhcp dns'}." 2";
+                       goto VPNCONF_ERROR;
+       }
+       #check wins ip
+       if ($cgiparams{'CCD_WINS'} ne '' &&  ! &General::validip($cgiparams{'CCD_WINS'})) {
+                       $errormessage=$errormessage."<br>".$Lang::tr{'invalid input for dhcp wins'};
+                       goto VPNCONF_ERROR;
+       }
+}
+
+#CCD End
+
+       
+ if ($cgiparams{'TYPE'} !~ /^(host|net)$/) {
            $errormessage = $Lang::tr{'connection type is invalid'};
            if ($cgiparams{'TYPE'} eq 'net') {
       unlink ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Removing Configfile fail: $!";
@@ -2605,55 +3652,117 @@ if ($confighash{$cgiparams{'KEY'}}) {
 ###
 
 if ($cgiparams{'TYPE'} eq 'net') {
-               
-    if ($cgiparams{'DEST_PORT'} eq  $vpnsettings{'DDEST_PORT'}) {
-                       $errormessage = 'The Destination Port is used by the OpenVPN Server please change';
+       if ($cgiparams{'DEST_PORT'} eq  $vpnsettings{'DDEST_PORT'}) {
+                       $errormessage = $Lang::tr{'openvpn destination port used'};
+                       unlink ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Removing Configfile fail: $!";
+           rmdir ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}") || die "Removing Directory fail: $!";
+      goto VPNCONF_ERROR;                      
+               }
+    #Bugfix 10357
+    foreach my $key (sort keys %confighash){
+               if ( ($confighash{$key}[22] eq $cgiparams{'DEST_PORT'} && $cgiparams{'NAME'} ne $confighash{$key}[1]) || ($confighash{$key}[29] eq $cgiparams{'DEST_PORT'} && $cgiparams{'NAME'} ne $confighash{$key}[1])){
+                       $errormessage = $Lang::tr{'openvpn destination port used'};
+                       unlink ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Removing Configfile fail: $!";
+           rmdir ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}") || die "Removing Directory fail: $!";
+      goto VPNCONF_ERROR;      
+               }
+       }
+    if ($cgiparams{'DEST_PORT'} eq  '') {
+                       $errormessage = $Lang::tr{'invalid port'};
                        unlink ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Removing Configfile fail: $!";
            rmdir ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}") || die "Removing Directory fail: $!";
       goto VPNCONF_ERROR;                      
                }
 
+    # Check if the input for the transfer net is valid.
+    if (!&General::validipandmask($cgiparams{'OVPN_SUBNET'})){
+                       $errormessage = $Lang::tr{'ccd err invalidnet'};
+                       unlink ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Removing Configfile fail: $!";
+           rmdir ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}") || die "Removing Directory fail: $!";
+                       goto VPNCONF_ERROR;
+               }
+
     if ($cgiparams{'OVPN_SUBNET'} eq  $vpnsettings{'DOVPN_SUBNET'}) {
-                       $errormessage = 'The OpenVPN Subnet is used by the OpenVPN Server please change';
+                       $errormessage = $Lang::tr{'openvpn subnet is used'};
                        unlink ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Removing Configfile fail: $!";
            rmdir ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}") || die "Removing Directory fail: $!";
                        goto VPNCONF_ERROR;                     
                }
 
          if (($cgiparams{'PROTOCOL'} eq 'tcp') && ($cgiparams{'MSSFIX'} eq 'on')) {
-           $errormessage = 'mssfix only allowed with udp';
+           $errormessage = $Lang::tr{'openvpn mssfix allowed with udp'};
            unlink ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Removing Configfile fail: $!";
            rmdir ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}") || die "Removing Directory fail: $!";
            goto VPNCONF_ERROR;
     }
      
     if (($cgiparams{'PROTOCOL'} eq 'tcp') && ($cgiparams{'FRAGMENT'} ne '')) {
-           $errormessage = 'fragment only allowed with udp';
+           $errormessage = $Lang::tr{'openvpn fragment allowed with udp'};
            unlink ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Removing Configfile fail: $!";
            rmdir ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}") || die "Removing Directory fail: $!";
            goto VPNCONF_ERROR;
     }
 
+    if ($cgiparams{'PMTU_DISCOVERY'} ne 'off') {
+       if (($cgiparams{'FRAGMENT'} ne '') || ($cgiparams{'MSSFIX'} eq 'on')) {
+               $errormessage = $Lang::tr{'ovpn mtu-disc with mssfix or fragment'};
+               unlink ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Removing Configfile fail: $!";
+               rmdir ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}") || die "Removing Directory fail: $!";
+               goto VPNCONF_ERROR;
+       }
+    }
+
+    if (($cgiparams{'PMTU_DISCOVERY'} ne 'off') && ($cgiparams{'MTU'} ne '1500')) {
+       $errormessage = $Lang::tr{'ovpn mtu-disc and mtu not 1500'};
+       unlink ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Removing Configfile fail: $!";
+       rmdir ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}") || die "Removing Directory fail: $!";
+       goto VPNCONF_ERROR;
+    }
+
     if ( &validdotmask ($cgiparams{'LOCAL_SUBNET'}))  {
-                 $errormessage = 'Prefix not allowed for Local Subnet. Please enter Subnet Mask e.g. 255.255.255.0';
+                 $errormessage = $Lang::tr{'openvpn prefix local subnet'};
                  unlink ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Removing Configfile fail: $!";
            rmdir ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}") || die "Removing Directory fail: $!";
                  goto VPNCONF_ERROR;
                } 
     
     if ( &validdotmask ($cgiparams{'OVPN_SUBNET'}))  {
-                 $errormessage = 'Prefix not allowed for OpenVPN Subnet. Please enter Subnet Mask e.g. 255.255.255.0';
+                 $errormessage = $Lang::tr{'openvpn prefix openvpn subnet'};
                  unlink ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Removing Configfile fail: $!";
            rmdir ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}") || die "Removing Directory fail: $!";
                  goto VPNCONF_ERROR;
                } 
     
     if ( &validdotmask ($cgiparams{'REMOTE_SUBNET'}))  {
-                 $errormessage = 'Prefix not allowed for Remote Subnet. Please enter Subnet Mask e.g. 255.255.255.0';
+                 $errormessage = $Lang::tr{'openvpn prefix remote subnet'};
                  unlink ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Removing Configfile fail: $!";
            rmdir ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}") || die "Removing Directory fail: $!";
                  goto VPNCONF_ERROR;
-               } 
+               }
+       
+       if ($cgiparams{'DEST_PORT'} <= 1023) {
+               $errormessage = $Lang::tr{'ovpn port in root range'};
+                 unlink ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Removing Configfile fail: $!";
+           rmdir ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}") || die "Removing Directory fail: $!";
+                 goto VPNCONF_ERROR;
+               }
+
+       if ($cgiparams{'OVPN_MGMT'} eq '') {
+               $cgiparams{'OVPN_MGMT'} = $cgiparams{'DEST_PORT'};              
+               }
+       
+       if ($cgiparams{'OVPN_MGMT'} <= 1023) {
+               $errormessage = $Lang::tr{'ovpn mgmt in root range'};
+                 unlink ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Removing Configfile fail: $!";
+           rmdir ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}") || die "Removing Directory fail: $!";
+                 goto VPNCONF_ERROR;
+       }
+       #Check if remote subnet is used elsewhere
+       my ($n2nip,$n2nsub)=split("/",$cgiparams{'REMOTE_SUBNET'});
+       $warnmessage=&General::checksubnets('',$n2nip,'ovpn');
+       if ($warnmessage){
+               $warnmessage=$Lang::tr{'remote subnet'}." ($cgiparams{'REMOTE_SUBNET'}) <br>".$warnmessage;
+       }
 }
 
 #      if (($cgiparams{'TYPE'} eq 'net') && ($cgiparams{'SIDE'} !~ /^(left|right)$/)) {
@@ -2675,35 +3784,37 @@ if ($cgiparams{'TYPE'} eq 'net') {
            }
        }
 
-       if (($cgiparams{'TYPE'} eq 'net') && (! $cgiparams{'REMOTE'})) {
-           $errormessage = $Lang::tr{'invalid input for remote host/ip'};
-           if ($cgiparams{'TYPE'} eq 'net') {
-      unlink ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Removing Configfile fail: $!";
-           rmdir ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}") || die "Removing Directory fail: $!";
-      }
-           goto VPNCONF_ERROR;
-       }
+       # Check if a remote host/IP has been set for the client.
+       if ($cgiparams{'TYPE'} eq 'net') {
+               if ($cgiparams{'SIDE'} ne 'server' && $cgiparams{'REMOTE'} eq '') {
+                       $errormessage = $Lang::tr{'invalid input for remote host/ip'};
 
-       if ($cgiparams{'REMOTE'}) {
-           if (! &General::validip($cgiparams{'REMOTE'})) {
-               if (! &General::validfqdn ($cgiparams{'REMOTE'}))  {
-                   $errormessage = $Lang::tr{'invalid input for remote host/ip'};
-                   if ($cgiparams{'TYPE'} eq 'net') {
-        unlink ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Removing Configfile fail: $!";
-             rmdir ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}") || die "Removing Directory fail: $!";
-        }
-                   goto VPNCONF_ERROR;
-               } else {
-                   if (&valid_dns_host($cgiparams{'REMOTE'})) {
-                       $warnmessage = "$Lang::tr{'check vpn lr'} $cgiparams{'REMOTE'}. $Lang::tr{'dns check failed'}";
-                       if ($cgiparams{'TYPE'} eq 'net') {
+                       # Check if this is a N2N connection and drop temporary config.
+                       unlink ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Removing Configfile fail: $!";
+                       rmdir ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}") || die "Removing Directory fail: $!";
 
-      }
-                   }
+                       goto VPNCONF_ERROR;
                }
-           }
-       }
-       if ($cgiparams{'TYPE'} ne 'host') {
+
+               # Check if a remote host/IP has been configured - the field can be empty on the server side.
+               if ($cgiparams{'REMOTE'} ne '') {
+                       # Check if the given IP is valid - otherwise check if it is a valid domain.
+                       if (! &General::validip($cgiparams{'REMOTE'})) {
+                               # Check for a valid domain.
+                               if (! &General::validfqdn ($cgiparams{'REMOTE'}))  {
+                                       $errormessage = $Lang::tr{'invalid input for remote host/ip'};
+
+                                       # Check if this is a N2N connection and drop temporary config.
+                                       unlink ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Removing Configfile fail: $!";
+                                       rmdir ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}") || die "Removing Directory fail: $!";
+
+                                       goto VPNCONF_ERROR;
+                               }
+                       }
+               }
+       }
+
+       if ($cgiparams{'TYPE'} ne 'host') {
             unless (&General::validipandmask($cgiparams{'LOCAL_SUBNET'})) {
                    $errormessage = $Lang::tr{'local subnet is invalid'}; 
                    if ($cgiparams{'TYPE'} eq 'net') {
@@ -2768,7 +3879,7 @@ if ($cgiparams{'TYPE'} eq 'net') {
 
            # Sign the certificate request and move it
            # Sign the host certificate request
-           system('/usr/bin/openssl', 'ca', '-days', '999999',
+           system('/usr/bin/openssl', 'ca', '-days', "$cgiparams{'DAYS_VALID'}",
                '-batch', '-notext',
                '-in', $filename,
                '-out', "${General::swroot}/ovpn/certs/$cgiparams{'NAME'}cert.pem",
@@ -2863,6 +3974,8 @@ if ($cgiparams{'TYPE'} eq 'net') {
            }
            if ($cgiparams{'CERT_NAME'} !~ /^[a-zA-Z0-9 ,\.\-_]+$/) {
                $errormessage = $Lang::tr{'invalid input for name'};
+               unlink ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Removing Configfile fail: $!";
+               rmdir ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}") || die "Removing Directory fail: $!";
                goto VPNCONF_ERROR;
            }
            if ($cgiparams{'CERT_EMAIL'} ne '' && (! &General::validemail($cgiparams{'CERT_EMAIL'}))) {
@@ -2935,7 +4048,7 @@ if ($cgiparams{'TYPE'} eq 'net') {
                }
            } else {    # child
                unless (exec ('/usr/bin/openssl', 'req', '-nodes', '-rand', '/proc/interrupts:/proc/net/rt_cache',
-                       '-newkey', 'rsa:1024',
+                       '-newkey', 'rsa:2048',
                        '-keyout', "${General::swroot}/ovpn/certs/$cgiparams{'NAME'}key.pem",
                        '-out', "${General::swroot}/ovpn/certs/$cgiparams{'NAME'}req.pem",
                        '-config',"${General::swroot}/ovpn/openssl/ovpn.cnf")) {
@@ -2947,7 +4060,7 @@ if ($cgiparams{'TYPE'} eq 'net') {
            }
        
            # Sign the host certificate request
-           system('/usr/bin/openssl', 'ca', '-days', '999999',
+           system('/usr/bin/openssl', 'ca', '-days', "$cgiparams{'DAYS_VALID'}",
                '-batch', '-notext',
                '-in',  "${General::swroot}/ovpn/certs/$cgiparams{'NAME'}req.pem",
                '-out', "${General::swroot}/ovpn/certs/$cgiparams{'NAME'}cert.pem",
@@ -2999,42 +4112,127 @@ if ($cgiparams{'TYPE'} eq 'net') {
            }
        }
 
-        # Save the config
+    # Save the config
        my $key = $cgiparams{'KEY'};
+       
        if (! $key) {
            $key = &General::findhasharraykey (\%confighash);
-           foreach my $i (0 .. 31) { $confighash{$key}[$i] = "";}
+           foreach my $i (0 .. 41) { $confighash{$key}[$i] = "";}
        }
-       $confighash{$key}[0] = $cgiparams{'ENABLED'};
-       $confighash{$key}[1] = $cgiparams{'NAME'};
+       $confighash{$key}[0]            = $cgiparams{'ENABLED'};
+       $confighash{$key}[1]            = $cgiparams{'NAME'};
        if ((! $cgiparams{'KEY'}) && $cgiparams{'AUTH'} ne 'psk') {
-           $confighash{$key}[2] = $cgiparams{'CERT_NAME'};
+           $confighash{$key}[2]        = $cgiparams{'CERT_NAME'};
        }
-       $confighash{$key}[3] = $cgiparams{'TYPE'};
+       
+       $confighash{$key}[3]            = $cgiparams{'TYPE'};
        if ($cgiparams{'AUTH'} eq 'psk') {
-           $confighash{$key}[4] = 'psk';
-           $confighash{$key}[5] = $cgiparams{'PSK'};
+           $confighash{$key}[4]        = 'psk';
+           $confighash{$key}[5]        = $cgiparams{'PSK'};
        } else {
-           $confighash{$key}[4] = 'cert';
+           $confighash{$key}[4]        = 'cert';
        }
        if ($cgiparams{'TYPE'} eq 'net') {
-           $confighash{$key}[6] = $cgiparams{'SIDE'};
-           $confighash{$key}[11] = $cgiparams{'REMOTE_SUBNET'};
-       }
-       $confighash{$key}[8] = $cgiparams{'LOCAL_SUBNET'};
-       $confighash{$key}[10] = $cgiparams{'REMOTE'};
-  $confighash{$key}[23] = $cgiparams{'MSSFIX'};
-  $confighash{$key}[24] = $cgiparams{'FRAGMENT'};
-       $confighash{$key}[25] = $cgiparams{'REMARK'};
-       $confighash{$key}[26] = $cgiparams{'INTERFACE'};
+           $confighash{$key}[6]        = $cgiparams{'SIDE'};
+           $confighash{$key}[11]       = $cgiparams{'REMOTE_SUBNET'};
+       }
+       $confighash{$key}[8]            = $cgiparams{'LOCAL_SUBNET'};
+       $confighash{$key}[10]           = $cgiparams{'REMOTE'};
+       if ($cgiparams{'OVPN_MGMT'} eq '') {
+       $confighash{$key}[22]           = $confighash{$key}[29];
+       } else {
+       $confighash{$key}[22]           = $cgiparams{'OVPN_MGMT'};
+       }
+       $confighash{$key}[23]           = $cgiparams{'MSSFIX'};
+       $confighash{$key}[24]           = $cgiparams{'FRAGMENT'};
+       $confighash{$key}[25]           = $cgiparams{'REMARK'};
+       $confighash{$key}[26]           = $cgiparams{'INTERFACE'};
 # new fields   
-       $confighash{$key}[27] = $cgiparams{'OVPN_SUBNET'};
-       $confighash{$key}[28] = $cgiparams{'PROTOCOL'};
-       $confighash{$key}[29] = $cgiparams{'DEST_PORT'};
-       $confighash{$key}[30] = $cgiparams{'COMPLZO'};
-       $confighash{$key}[31] = $cgiparams{'MTU'};
-# new fileds   
+       $confighash{$key}[27]           = $cgiparams{'OVPN_SUBNET'};
+       $confighash{$key}[28]           = $cgiparams{'PROTOCOL'};
+       $confighash{$key}[29]           = $cgiparams{'DEST_PORT'};
+       $confighash{$key}[30]           = $cgiparams{'COMPLZO'};
+       $confighash{$key}[31]           = $cgiparams{'MTU'};
+       $confighash{$key}[32]           = $cgiparams{'CHECK1'};
+       $name=$cgiparams{'CHECK1'};
+       $confighash{$key}[33]           = $cgiparams{$name};
+       $confighash{$key}[34]           = $cgiparams{'RG'};
+       $confighash{$key}[35]           = $cgiparams{'CCD_DNS1'};
+       $confighash{$key}[36]           = $cgiparams{'CCD_DNS2'};
+       $confighash{$key}[37]           = $cgiparams{'CCD_WINS'};
+       $confighash{$key}[38]           = $cgiparams{'PMTU_DISCOVERY'};
+       $confighash{$key}[39]           = $cgiparams{'DAUTH'};
+       $confighash{$key}[40]           = $cgiparams{'DCIPHER'};
+
        &General::writehasharray("${General::swroot}/ovpn/ovpnconfig", \%confighash);
+       
+       if ($cgiparams{'CHECK1'} ){
+               
+               my ($ccdip,$ccdsub)=split "/",$cgiparams{$name};
+               my ($a,$b,$c,$d) = split (/\./,$ccdip);
+                       if ( -e "${General::swroot}/ovpn/ccd/$confighash{$key}[2]"){
+                               unlink "${General::swroot}/ovpn/ccd/$cgiparams{'CERT_NAME'}";
+                       }
+                       open ( CCDRWCONF,'>',"${General::swroot}/ovpn/ccd/$confighash{$key}[2]") or die "Unable to create clientconfigfile $!";
+                       print CCDRWCONF "# OpenVPN clientconfig from ccd extension by Copymaster#\n\n";
+                       if($cgiparams{'CHECK1'} eq 'dynamic'){
+                               print CCDRWCONF "#This client uses the dynamic pool\n";
+                       }else{
+                               print CCDRWCONF "#Ip address client and server\n";
+                               print CCDRWCONF "ifconfig-push $ccdip ".&General::getlastip($ccdip,1)."\n";
+                       }
+                       if ($confighash{$key}[34] eq 'on'){
+                               print CCDRWCONF "\n#Redirect Gateway: \n#All IP traffic is redirected through the vpn \n";
+                               print CCDRWCONF "push redirect-gateway\n";
+                       }
+                       &General::readhasharray("${General::swroot}/ovpn/ccdroute", \%ccdroutehash);
+                       if ($cgiparams{'IR'} ne ''){
+                               print CCDRWCONF "\n#Client routes these networks (behind Client)\n";
+                               foreach my $key (keys %ccdroutehash){
+                                       if ($ccdroutehash{$key}[0] eq $cgiparams{'NAME'}){
+                                               foreach my $i ( 1 .. $#{$ccdroutehash{$key}}){
+                                                       my ($a,$b)=split (/\//,$ccdroutehash{$key}[$i]);
+                                                       print CCDRWCONF "iroute $a $b\n";
+                                               }
+                                       }
+                               }
+                       }
+                       if ($cgiparams{'IFROUTE'} eq $Lang::tr{'ccd none'} ){$cgiparams{'IFROUTE'}='';}
+                       if ($cgiparams{'IFROUTE'} ne ''){
+                               print CCDRWCONF "\n#Client gets routes to these networks (behind IPFire)\n";
+                               foreach my $key (keys %ccdroute2hash){
+                                       if ($ccdroute2hash{$key}[0] eq $cgiparams{'NAME'}){
+                                               foreach my $i ( 1 .. $#{$ccdroute2hash{$key}}){
+                                                       if($ccdroute2hash{$key}[$i] eq $Lang::tr{'blue'}){
+                                                               my %blue=();
+                                                               &General::readhash("${General::swroot}/ethernet/settings", \%blue);
+                                                               print CCDRWCONF "push \"route $blue{BLUE_ADDRESS} $blue{BLUE_NETMASK}\n";
+                                                       }elsif($ccdroute2hash{$key}[$i] eq $Lang::tr{'orange'}){
+                                                               my %orange=();
+                                                               &General::readhash("${General::swroot}/ethernet/settings", \%orange);
+                                                               print CCDRWCONF "push \"route $orange{ORANGE_ADDRESS}  $orange{ORANGE_NETMASK}\n";
+                                                       }else{
+                                                               my ($a,$b)=split (/\//,$ccdroute2hash{$key}[$i]);
+                                                               print CCDRWCONF "push \"route $a $b\"\n";
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+                       if(($cgiparams{'CCD_DNS1'} eq '') && ($cgiparams{'CCD_DNS1'} ne '')){ $cgiparams{'CCD_DNS1'} = $cgiparams{'CCD_DNS2'};$cgiparams{'CCD_DNS2'}='';}
+                       if($cgiparams{'CCD_DNS1'} ne ''){
+                               print CCDRWCONF "\n#Client gets these nameservers\n";
+                               print CCDRWCONF "push \"dhcp-option DNS $cgiparams{'CCD_DNS1'}\" \n";
+                       }
+                       if($cgiparams{'CCD_DNS2'} ne ''){
+                               print CCDRWCONF "push \"dhcp-option DNS $cgiparams{'CCD_DNS2'}\" \n";
+                       }
+                       if($cgiparams{'CCD_WINS'} ne ''){
+                               print CCDRWCONF "\n#Client gets this WINS server\n";
+                               print CCDRWCONF "push \"dhcp-option WINS $cgiparams{'CCD_WINS'}\" \n";
+                       }
+                       close CCDRWCONF;
+       }
 
 ###
 # m.a.d n2n begin
@@ -3069,7 +4267,17 @@ if ($cgiparams{'TYPE'} eq 'net') {
        goto VPNCONF_END;
     } else {
         $cgiparams{'ENABLED'} = 'on';
-       $cgiparams{'SIDE'} = 'left';
+###
+# m.a.d n2n begin
+###    
+        $cgiparams{'MSSFIX'} = 'on';
+        $cgiparams{'FRAGMENT'} = '1300';
+        $cgiparams{'PMTU_DISCOVERY'} = 'off';
+        $cgiparams{'DAUTH'} = 'SHA1';
+###
+# m.a.d n2n end
+###    
+        $cgiparams{'SIDE'} = 'left';
        if ( ! -f "${General::swroot}/ovpn/ca/cakey.pem" ) {
            $cgiparams{'AUTH'} = 'psk';
        } elsif ( ! -f "${General::swroot}/ovpn/ca/cacert.pem") {
@@ -3125,10 +4333,40 @@ if ($cgiparams{'TYPE'} eq 'net') {
     $checked{'MSSFIX'}{'on'} = '';
     $checked{'MSSFIX'}{$cgiparams{'MSSFIX'}} = 'CHECKED';
 
+    if ($cgiparams{'PMTU_DISCOVERY'} eq '') {
+       $cgiparams{'PMTU_DISCOVERY'} = 'off';
+    }
+    $checked{'PMTU_DISCOVERY'}{$cgiparams{'PMTU_DISCOVERY'}} = 'checked=\'checked\'';
+
+    $selected{'DAUTH'}{'whirlpool'} = '';
+    $selected{'DAUTH'}{'SHA512'} = '';
+    $selected{'DAUTH'}{'SHA384'} = '';
+    $selected{'DAUTH'}{'SHA256'} = '';
+    $selected{'DAUTH'}{'ecdsa-with-SHA1'} = '';
+    $selected{'DAUTH'}{'SHA1'} = '';
+    $selected{'DAUTH'}{$cgiparams{'DAUTH'}} = 'SELECTED';
+
+    $selected{'DCIPHER'}{'CAMELLIA-256-CBC'} = '';
+    $selected{'DCIPHER'}{'CAMELLIA-192-CBC'} = '';
+    $selected{'DCIPHER'}{'CAMELLIA-128-CBC'} = '';
+    $selected{'DCIPHER'}{'AES-256-CBC'} = '';
+    $selected{'DCIPHER'}{'AES-192-CBC'} = '';
+    $selected{'DCIPHER'}{'AES-128-CBC'} = '';
+    $selected{'DCIPHER'}{'DESX-CBC'} = '';
+    $selected{'DCIPHER'}{'SEED-CBC'} = '';
+    $selected{'DCIPHER'}{'DES-EDE3-CBC'} = '';
+    $selected{'DCIPHER'}{'DES-EDE-CBC'} = '';
+    $selected{'DCIPHER'}{'CAST5-CBC'} = '';
+    $selected{'DCIPHER'}{'BF-CBC'} = '';
+    $selected{'DCIPHER'}{'RC2-CBC'} = '';
+    $selected{'DCIPHER'}{'DES-CBC'} = '';
+    $selected{'DCIPHER'}{'RC2-64-CBC'} = '';
+    $selected{'DCIPHER'}{'RC2-40-CBC'} = '';
+    $selected{'DCIPHER'}{$cgiparams{'DCIPHER'}} = 'SELECTED';
 
     if (1) {
        &Header::showhttpheaders();
-       &Header::openpage($Lang::tr{'vpn configuration main'}, 1, '');
+       &Header::openpage($Lang::tr{'ovpn'}, 1, '');
        &Header::openbigbox('100%', 'LEFT', '', $errormessage);
        if ($errormessage) {
            &Header::openbox('100%', 'LEFT', $Lang::tr{'error messages'});
@@ -3153,24 +4391,26 @@ if ($cgiparams{'TYPE'} eq 'net') {
        }
 
        &Header::openbox('100%', 'LEFT', "$Lang::tr{'connection'}:");
-       print "<table width='100%'>\n";
-       print "<tr><td width='25%' class='boldbase'>$Lang::tr{'name'}:</td>";
+       print "<table width='100%'  border='0'>\n";
+
+       print "<tr><td width='14%' class='boldbase'>$Lang::tr{'name'}: </td>";
+       
        if ($cgiparams{'TYPE'} eq 'host') {
            if ($cgiparams{'KEY'}) {
-               print "<td width='35%' class='base'><input type='hidden' name='NAME' value='$cgiparams{'NAME'}' />$cgiparams{'NAME'}</td>\n";
+               print "<td width='35%' class='base'><input type='hidden' name='NAME' value='$cgiparams{'NAME'}' />$cgiparams{'NAME'}</td>";
            } else {
                print "<td width='35%'><input type='text' name='NAME' value='$cgiparams{'NAME'}' maxlength='20' size='30' /></td>";
            }
 #          print "<tr><td>$Lang::tr{'interface'}</td>";
 #          print "<td><select name='INTERFACE'>";
 #          print "<option value='RED' $selected{'INTERFACE'}{'RED'}>RED</option>";
-#          if ($netsettings{'BLUE_DEV'} ne '') {
-#              print "<option value='BLUE' $selected{'INTERFACE'}{'BLUE'}>BLUE</option>";
-#          }
-#          print "<option value='GREEN' $selected{'INTERFACE'}{'GREEN'}>GREEN</option>";
-#          print "<option value='ORANGE' $selected{'INTERFACE'}{'ORANGE'}>ORANGE</option>";
-#          print "</select></td></tr>";
-#          print <<END
+#              if ($netsettings{'BLUE_DEV'} ne '') {
+#                      print "<option value='BLUE' $selected{'INTERFACE'}{'BLUE'}>BLUE</option>";
+#              }
+#              print "<option value='GREEN' $selected{'INTERFACE'}{'GREEN'}>GREEN</option>";
+#              print "<option value='ORANGE' $selected{'INTERFACE'}{'ORANGE'}>ORANGE</option>";
+#              print "</select></td></tr>";
+#              print <<END;
        } else {
            print "<input type='hidden' name='INTERFACE' value='red' />";
            if ($cgiparams{'KEY'}) {
@@ -3178,92 +4418,166 @@ if ($cgiparams{'TYPE'} eq 'net') {
            } else {
                print "<td width='25%'><input type='text' name='NAME' value='$cgiparams{'NAME'}' maxlength='20' /></td>";
            }
-           print <<END
+
+           print <<END;
                    <td width='25%'>&nbsp;</td>
                    <td width='25%'>&nbsp;</td></tr>
+
                <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'Act as'}</td>
-                   <td><select name='SIDE'><option value='server' $selected{'SIDE'}{'server'}>OpenVPN Server</option>
-                                           <option value='client' $selected{'SIDE'}{'client'}>OpenVPN Client</option></select></td>
+                   <td><select name='SIDE'><option value='server' $selected{'SIDE'}{'server'}>$Lang::tr{'openvpn server'}</option>
+                                           <option value='client' $selected{'SIDE'}{'client'}>$Lang::tr{'openvpn client'}</option></select></td>
+
                    <td class='boldbase'>$Lang::tr{'remote host/ip'}:</td>
                    <td><input type='TEXT' name='REMOTE' value='$cgiparams{'REMOTE'}' /></td></tr>
+
                <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'local subnet'}</td>
                    <td><input type='TEXT' name='LOCAL_SUBNET' value='$cgiparams{'LOCAL_SUBNET'}' /></td>
+
                    <td class='boldbase' nowrap='nowrap'>$Lang::tr{'remote subnet'}</td>
                    <td><input type='text' name='REMOTE_SUBNET' value='$cgiparams{'REMOTE_SUBNET'}' /></td></tr>
+
                <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'ovpn subnet'}</td>
-                   <td><input type='TEXT' name='OVPN_SUBNET' value='$cgiparams{'OVPN_SUBNET'}' /></td></tr>
+                   <td><input type='TEXT' name='OVPN_SUBNET' value='$cgiparams{'OVPN_SUBNET'}' /></td>
+
+                       <td class='boldbase'>$Lang::tr{'destination port'}:</td>
+                       <td><input type='TEXT' name='DEST_PORT' value='$cgiparams{'DEST_PORT'}' size='5' /></td>
+
                <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'protocol'}</td>
-                
-     <td><select name='PROTOCOL'><option value='udp' $selected{'PROTOCOL'}{'udp'}>UDP</option>
-                                               <option value='tcp' $selected{'PROTOCOL'}{'tcp'}>TCP</option></select></td>   
-                   
-        <td class='boldbase'>$Lang::tr{'destination port'}:</td>
-                   <td><input type='TEXT' name='DEST_PORT' value='$cgiparams{'DEST_PORT'}' size='5' /></td></tr>
-               <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'comp-lzo'} &nbsp;<img src='/blob.gif'</td>
-                   <td><input type='checkbox' name='COMPLZO' $checked{'COMPLZO'}{'on'} /></td>
-                   
-                     <tr><td class='boldbase' nowrap='nowrap'>mssfix &nbsp;<img src='/blob.gif' /></td>
-                   <td><input type='checkbox' name='MSSFIX' $checked{'MSSFIX'}{'on'} /></td>
-                   
-                     <tr><td class='boldbase' nowrap='nowrap'>Fragment &nbsp;<img src='/blob.gif' /></td>
-                   <td><input type='TEXT' name='FRAGMENT' VALUE='$cgiparams{'FRAGMENT'}'size='5' /></td>
-                   <td>Default: <span class="base">1300</span></td>
-                   
-               <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'MTU'}&nbsp;<img src='/blob.gif' /></td>
-                   <td> <input type='TEXT' name='MTU' VALUE='$cgiparams{'MTU'}'size='5' /></TD>
+                       <td><select name='PROTOCOL'><option value='udp' $selected{'PROTOCOL'}{'udp'}>UDP</option>
+                                               <option value='tcp' $selected{'PROTOCOL'}{'tcp'}>TCP</option></select></td>
+
+               <td class='boldbase' nowrap='nowrap'>Management Port ($Lang::tr{'openvpn default'}: <span class="base">$Lang::tr{'destination port'}): &nbsp;<img src='/blob.gif' /></td>
+                       <td> <input type='TEXT' name='OVPN_MGMT' VALUE='$cgiparams{'OVPN_MGMT'}'size='5' /></td>
+               </tr>
+
+               <tr><td class='boldbase'>$Lang::tr{'cipher'}</td>
+                       <td><select name='DCIPHER'>
+                                       <option value='CAMELLIA-256-CBC' $selected{'DCIPHER'}{'CAMELLIA-256-CBC'}>CAMELLIA-CBC (256 $Lang::tr{'bit'})</option>
+                                       <option value='CAMELLIA-192-CBC' $selected{'DCIPHER'}{'CAMELLIA-192-CBC'}>CAMELLIA-CBC (196 $Lang::tr{'bit'})</option>
+                                       <option value='CAMELLIA-128-CBC' $selected{'DCIPHER'}{'CAMELLIA-128-CBC'}>CAMELLIA-CBC (128 $Lang::tr{'bit'})</option>
+                                       <option value='AES-256-CBC'     $selected{'DCIPHER'}{'AES-256-CBC'}>AES-CBC (256 $Lang::tr{'bit'})</option>
+                                       <option value='AES-192-CBC'     $selected{'DCIPHER'}{'AES-192-CBC'}>AES-CBC (192 $Lang::tr{'bit'})</option>
+                                       <option value='AES-128-CBC'     $selected{'DCIPHER'}{'AES-128-CBC'}>AES-CBC (128 $Lang::tr{'bit'})</option>
+                                       <option value='DES-EDE3-CBC'    $selected{'DCIPHER'}{'DES-EDE3-CBC'}>DES-EDE3-CBC (192 $Lang::tr{'bit'})</option>
+                                       <option value='DESX-CBC'        $selected{'DCIPHER'}{'DESX-CBC'}>DESX-CBC (192 $Lang::tr{'bit'})</option>
+                                       <option value='SEED-CBC'        $selected{'DCIPHER'}{'SEED-CBC'}>SEED-CBC (128 $Lang::tr{'bit'})</option>
+                                       <option value='DES-EDE-CBC'     $selected{'DCIPHER'}{'DES-EDE-CBC'}>DES-EDE-CBC (128 $Lang::tr{'bit'})</option>
+                                       <option value='BF-CBC'          $selected{'DCIPHER'}{'BF-CBC'}>BF-CBC (128 $Lang::tr{'bit'})</option>
+                                       <option value='CAST5-CBC'       $selected{'DCIPHER'}{'CAST5-CBC'}>CAST5-CBC (128 $Lang::tr{'bit'})</option>
+                                       <option value='RC2-CBC'         $selected{'DCIPHER'}{'RC2-CBC'}>RC2-CBC (128 $Lang::tr{'bit'})</option>
+                                       <option value='DES-CBC'         $selected{'DCIPHER'}{'DES-CBC'}>DES-CBC (64 $Lang::tr{'bit'} not recommended)</option>
+                                       <option value='RC2-64-CBC'      $selected{'DCIPHER'}{'RC2-64-CBC'}>RC2-CBC (64 $Lang::tr{'bit'} not recommended)</option>
+                                       <option value='RC2-40-CBC'      $selected{'DCIPHER'}{'RC2-40-CBC'}>RC2-CBC (40 $Lang::tr{'bit'} not recommended)</option>
+                               </select>
+                       </td>
+
+                       <td class='boldbase'>$Lang::tr{'ovpn ha'}:</td>
+                       <td><select name='DAUTH'>
+                                       <option value='whirlpool'       $selected{'DAUTH'}{'whirlpool'}>Whirlpool (512 $Lang::tr{'bit'})</option>
+                                       <option value='SHA512'          $selected{'DAUTH'}{'SHA512'}>SHA2 (512 $Lang::tr{'bit'})</option>
+                                       <option value='SHA384'          $selected{'DAUTH'}{'SHA384'}>SHA2 (384 $Lang::tr{'bit'})</option>
+                                       <option value='SHA256'          $selected{'DAUTH'}{'SHA256'}>SHA2 (256 $Lang::tr{'bit'})</option>
+                                       <option value='ecdsa-with-SHA1' $selected{'DAUTH'}{'ecdsa-with-SHA1'}>ECDSA-SHA1 (160 $Lang::tr{'bit'})</option>
+                                       <option value='SHA1'            $selected{'DAUTH'}{'SHA1'}>SHA1 (160 $Lang::tr{'bit'} Default)</option>
+                               </select>
+                       </td>
+               </tr>
+
+               <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'MTU'}&nbsp;<img src='/blob.gif' /></td>
+                       <td> <input type='TEXT' name='MTU' VALUE='$cgiparams{'MTU'}'size='5' /></td>
+                       <td colspan='2'>$Lang::tr{'openvpn default'}: udp/tcp <span class="base">1500/1400</span></td>
+
+               <tr><td class='boldbase' nowrap='nowrap'>fragment: &nbsp;<img src='/blob.gif' /></td>
+                       <td><input type='TEXT' name='FRAGMENT' VALUE='$cgiparams{'FRAGMENT'}'size='5' /></td>
+                       <td>$Lang::tr{'openvpn default'}: <span class="base">1300</span></td>
+
+               <tr><td class='boldbase' nowrap='nowrap'>mssfix: &nbsp;<img src='/blob.gif' /></td>
+                       <td><input type='checkbox' name='MSSFIX' $checked{'MSSFIX'}{'on'} /></td>
+                       <td>$Lang::tr{'openvpn default'}: <span class="base">on</span></td>
+
+        <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'comp-lzo'} &nbsp;<img src='/blob.gif'</td>
+                       <td><input type='checkbox' name='COMPLZO' $checked{'COMPLZO'}{'on'} /></td>
+               </tr>
+
+               <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'ovpn mtu-disc'}:</td>
+                       <td colspan='3'>
+                               <input type='radio' name='PMTU_DISCOVERY' value='yes' $checked{'PMTU_DISCOVERY'}{'yes'} /> $Lang::tr{'ovpn mtu-disc yes'}
+                               <input type='radio' name='PMTU_DISCOVERY' value='maybe' $checked{'PMTU_DISCOVERY'}{'maybe'} /> $Lang::tr{'ovpn mtu-disc maybe'}
+                               <input type='radio' name='PMTU_DISCOVERY' value='no' $checked{'PMTU_DISCOVERY'}{'no'} /> $Lang::tr{'ovpn mtu-disc no'}
+                               <input type='radio' name='PMTU_DISCOVERY' value='off' $checked{'PMTU_DISCOVERY'}{'off'} /> $Lang::tr{'ovpn mtu-disc off'}
+                       </td>
+               </tr>
 
 END
-           ;
+;
        }
-
+#jumper
        print "<tr><td class='boldbase'>$Lang::tr{'remark title'}&nbsp;<img src='/blob.gif' /></td>";
-       print "<td colspan='3'><input type='text' name='REMARK' value='$cgiparams{'REMARK'}' size='55' maxlength='50' /></td></tr>";
+       print "<td colspan='3'><input type='text' name='REMARK' value='$cgiparams{'REMARK'}' size='55' maxlength='50' /></td></tr></table>";
        
        if ($cgiparams{'TYPE'} eq 'host') {
+      print "<tr><td>$Lang::tr{'enabled'} <input type='checkbox' name='ENABLED' $checked{'ENABLED'}{'on'} /></td>";
+    }  
 
-      print "<tr><td>$Lang::tr{'enabled'} <input type='checkbox' name='ENABLED' $checked{'ENABLED'}{'on'} /></td>\n";
-         }     
-
-#          if ($cgiparams{'KEY'}) {
-#              print "<td colspan='3'>&nbsp;</td></tr></table>";
-#          } else {
-#              print "<td colspan='3'><input type='checkbox' name='EDIT_ADVANCED' $checked{'EDIT_ADVANCED'}{'on'} /> $Lang::tr{'edit advanced settings when done'}</tr></table>";
-#          }
-#      }else{
-           print "<td colspan='3'>&nbsp;</td></tr></table>";
-#      }    
-           
-       
-
+               print"</tr></table><br><br>";
+#A.Marx CCD new client         
+if ($cgiparams{'TYPE'} eq 'host') {    
+           print "<table border='0' width='100%' cellspacing='1' cellpadding='0'><tr><td colspan='3'><hr><br><b>$Lang::tr{'ccd choose net'}</td></tr><tr><td height='20' colspan='3'></td></tr>";
+           my %vpnnet=();
+           my $vpnip;
+           &General::readhash("${General::swroot}/ovpn/settings", \%vpnnet);
+           $vpnip=$vpnnet{'DOVPN_SUBNET'};
+           &General::readhasharray("${General::swroot}/ovpn/ccd.conf", \%ccdconfhash);
+           my @ccdconf=();
+               my $count=0;
+               my $checked;
+               $checked{'check1'}{'off'} = '';
+           $checked{'check1'}{'on'} = '';
+           $checked{'check1'}{$cgiparams{'CHECK1'}} = 'CHECKED';
+           print"<tr><td align='center' width='1%' valign='top'><input type='radio' name='CHECK1' value='dynamic' checked /></td><td align='left' valign='top' width='35%'>$Lang::tr{'ccd dynrange'} ($vpnip)</td><td width='30%'>";
+           print"</td></tr></table><br><br>";
+               my $name=$cgiparams{'CHECK1'};
+               $checked{'RG'}{$cgiparams{'RG'}} = 'CHECKED';
+               
+       if (! -z "${General::swroot}/ovpn/ccd.conf"){   
+               print"<table border='0' width='100%' cellspacing='1' cellpadding='0'><tr><td width='1%'></td><td width='30%' class='boldbase' align='center'><b>$Lang::tr{'ccd name'}</td><td width='15%' class='boldbase' align='center'><b>$Lang::tr{'network'}</td><td class='boldbase' align='center' width='18%'><b>$Lang::tr{'ccd clientip'}</td></tr>";
+               foreach my $key (sort { uc($ccdconfhash{$a}[0]) cmp uc($ccdconfhash{$b}[0]) } keys %ccdconfhash) {
+                       $count++;
+                       @ccdconf=($ccdconfhash{$key}[0],$ccdconfhash{$key}[1]);
+                       if ($count % 2){print"<tr bgcolor='$color{'color22'}'>";}else{print"<tr bgcolor='$color{'color20'}'>";}
+                       print"<td align='center' width='1%'><input type='radio' name='CHECK1' value='$ccdconf[0]' $checked{'check1'}{$ccdconf[0]}/></td><td>$ccdconf[0]</td><td width='40%' align='center'>$ccdconf[1]</td><td align='left' width='10%'>";
+                       &fillselectbox($ccdconf[1],$ccdconf[0],$cgiparams{$name});
+                       print"</td></tr>";
+               }
+               print "</table><br><br><hr><br><br>";
+       }
+}
+# ccd end
        &Header::closebox();
-       
        if ($cgiparams{'KEY'} && $cgiparams{'AUTH'} eq 'psk') {
-       #    &Header::openbox('100%', 'LEFT', $Lang::tr{'authentication'});
-       #    print <<END
-       #    <table width='100%' cellpadding='0' cellspacing='5' border='0'>
-       #    <tr><td class='base' width='50%'>$Lang::tr{'use a pre-shared key'}</td>
-       #       <td class='base' width='50%'><input type='text' name='PSK' size='30' value='$cgiparams{'PSK'}' /></td></tr>
-       #    </table>
-END
-       #    ;
-       #    &Header::closebox();
-       } elsif (! $cgiparams{'KEY'}) {
+               
+               } elsif (! $cgiparams{'KEY'}) {
+               
+               
            my $disabled='';
            my $cakeydisabled='';
            my $cacrtdisabled='';
            if ( ! -f "${General::swroot}/ovpn/ca/cakey.pem" ) { $cakeydisabled = "disabled='disabled'" } else { $cakeydisabled = "" };
            if ( ! -f "${General::swroot}/ovpn/ca/cacert.pem" ) { $cacrtdisabled = "disabled='disabled'" } else { $cacrtdisabled = "" };
+           
            &Header::openbox('100%', 'LEFT', $Lang::tr{'authentication'});
  
  
  if ($cgiparams{'TYPE'} eq 'host') {
 
-print <<END
+    print <<END;
            <table width='100%' cellpadding='0' cellspacing='5' border='0'>
-           <tr><td colspan='3' bgcolor='#000000'><img src='/images/null.gif' width='1' height='1' border='0' /></td></tr>
+           
            <tr><td><input type='radio' name='AUTH' value='certreq' $checked{'AUTH'}{'certreq'} $cakeydisabled /></td><td class='base'>$Lang::tr{'upload a certificate request'}</td><td class='base' rowspan='2'><input type='file' name='FH' size='30' $cacrtdisabled></td></tr>
            <tr><td><input type='radio' name='AUTH' value='certfile' $checked{'AUTH'}{'certfile'} $cacrtdisabled /></td><td class='base'>$Lang::tr{'upload a certificate'}</td></tr>
-           <tr><td colspan='3' bgcolor='#000000'><img src='/images/null.gif' width='1' height='1' BORDER='0' /></td></tr>
+           <tr><td colspan='3'>&nbsp;</td></tr>
+      <tr><td colspan='3'><hr /></td></tr>
+      <tr><td colspan='3'>&nbsp;</td></tr>
            <tr><td><input type='radio' name='AUTH' value='certgen' $checked{'AUTH'}{'certgen'} $cakeydisabled /></td><td class='base'>$Lang::tr{'generate a certificate'}</td><td>&nbsp;</td></tr>
            <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'users fullname or system hostname'}:</td><td class='base' nowrap='nowrap'><input type='text' name='CERT_NAME' value='$cgiparams{'CERT_NAME'}' SIZE='32' $cakeydisabled /></td></tr>
            <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'users email'}:&nbsp;<img src='/blob.gif' /></td><td class='base' nowrap='nowrap'><input type='text' name='CERT_EMAIL' value='$cgiparams{'CERT_EMAIL'}' SIZE='32' $cakeydisabled /></td></tr>
@@ -3281,7 +4595,7 @@ END
 
 } else {
 
-print <<END
+    print <<END;
            <table width='100%' cellpadding='0' cellspacing='5' border='0'>
       
            <tr><td><input type='radio' name='AUTH' value='certgen' $checked{'AUTH'}{'certgen'} $cakeydisabled /></td><td class='base'>$Lang::tr{'generate a certificate'}</td><td>&nbsp;</td></tr>
@@ -3292,7 +4606,8 @@ print <<END
            <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'city'}:&nbsp;<img src='/blob.gif'></td><td class='base' nowrap='nowrap'><input type='text' name='CERT_CITY' value='$cgiparams{'CERT_CITY'}' SIZE='32' $cakeydisabled /></td></tr>
            <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'state or province'}:&nbsp;<img src='/blob.gif' /></td><td class='base' nowrap='nowrap'><input type='text' name='CERT_STATE' value='$cgiparams{'CERT_STATE'}' SIZE='32' $cakeydisabled /></td></tr>
            <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'country'}:</td><td class='base'><select name='CERT_COUNTRY' $cakeydisabled>
-
+          
+      
 END
 ;
 
@@ -3314,23 +4629,28 @@ END
 ###
 
 if ($cgiparams{'TYPE'} eq 'host') {
-           print <<END
+    print <<END;
            </select></td></tr>
 
-       <td class='base'>$Lang::tr{'valid till'} (days):</td>
+       <td>&nbsp;</td><td class='base'>$Lang::tr{'valid till'} (days):</td>
        <td class='base' nowrap='nowrap'><input type='text' name='DAYS_VALID' value='$cgiparams{'DAYS_VALID'}' size='32' $cakeydisabled /></td></tr>
    <tr><td>&nbsp;</td>
                <td class='base'>$Lang::tr{'pkcs12 file password'}:</td>
                <td class='base' nowrap='nowrap'><input type='password' name='CERT_PASS1' value='$cgiparams{'CERT_PASS1'}' size='32' $cakeydisabled /></td></tr>
            <tr><td>&nbsp;</td><td class='base'>$Lang::tr{'pkcs12 file password'}:<BR>($Lang::tr{'confirmation'})</td>
                <td class='base' nowrap='nowrap'><input type='password' name='CERT_PASS2' value='$cgiparams{'CERT_PASS2'}' size='32' $cakeydisabled /></td></tr>
+     <tr><td colspan='3'>&nbsp;</td></tr>
+     <tr><td colspan='3'><hr /></td></tr>
+     <tr><td class='base' colspan='3' align='left'><img src='/blob.gif' alt='*' />&nbsp;$Lang::tr{'this field may be blank'}</td></tr>
      </table>
 END
 }else{
-           print <<END
+    print <<END;
            </select></td></tr>
    <tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
         <tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+        <tr><td colspan='3'><hr /></td></tr>
+        <tr><td class='base' colspan='3' align='left'><img src='/blob.gif' alt='*' />&nbsp;$Lang::tr{'this field may be blank'}</td></tr>
        </table>
  
 END
@@ -3341,8 +4661,127 @@ END
 ###
            ;
            &Header::closebox();
+           
        }
 
+#A.Marx CCD new client 
+if ($cgiparams{'TYPE'} eq 'host') {
+           print"<br><br>";
+           &Header::openbox('100%', 'LEFT', "$Lang::tr{'ccd client options'}:");
+
+       
+       print <<END;
+       <table border='0' width='100%'>
+       <tr><td width='20%'>Redirect Gateway:</td><td colspan='3'><input type='checkbox' name='RG' $checked{'RG'}{'on'} /></td></tr>
+       <tr><td colspan='4'><b><br>$Lang::tr{'ccd routes'}</b></td></tr>
+       <tr><td colspan='4'>&nbsp</td></tr>
+       <tr><td valign='top'>$Lang::tr{'ccd iroute'}</td><td align='left' width='30%'><textarea name='IR' cols='26' rows='6' wrap='off'>
+END
+       
+       if ($cgiparams{'IR'} ne ''){
+               print $cgiparams{'IR'};
+       }else{
+               &General::readhasharray ("${General::swroot}/ovpn/ccdroute", \%ccdroutehash);
+               foreach my $key (keys %ccdroutehash) {
+                       if( $cgiparams{'NAME'} eq $ccdroutehash{$key}[0]){
+                               foreach my $i (1 .. $#{$ccdroutehash{$key}}) {
+                                               if ($ccdroutehash{$key}[$i] ne ''){
+                                                       print $ccdroutehash{$key}[$i]."\n";
+                                               }
+                                               $cgiparams{'IR'} .= $ccdroutehash{$key}[$i];
+                               }
+                       }
+               }
+       }
+        
+       print <<END;
+</textarea></td><td valign='top' colspan='2'>$Lang::tr{'ccd iroutehint'}</td></tr>
+       <tr><td colspan='4'><br></td></tr>
+       <tr><td valign='top' rowspan='3'>$Lang::tr{'ccd iroute2'}</td><td align='left' valign='top' rowspan='3'><select name='IFROUTE' style="width: 205px"; size='6' multiple>
+END
+       
+       my $set=0;
+       my $selorange=0;
+       my $selblue=0;
+       my $selgreen=0;
+       my $helpblue=0;
+       my $helporange=0;
+       my $other=0;
+       my $none=0;
+       my @temp=();
+       
+       our @current = ();
+       open(FILE, "${General::swroot}/main/routing") ;
+       @current = <FILE>;
+       close (FILE);
+       &General::readhasharray ("${General::swroot}/ovpn/ccdroute2", \%ccdroute2hash);         
+       #check for "none"
+       foreach my $key (keys %ccdroute2hash) {
+               if($ccdroute2hash{$key}[0] eq $cgiparams{'NAME'}){
+                       if ($ccdroute2hash{$key}[1] eq ''){
+                               $none=1;
+                               last;
+                       }
+               }
+       }
+       if ($none ne '1'){
+               print"<option>$Lang::tr{'ccd none'}</option>";
+       }else{
+               print"<option selected>$Lang::tr{'ccd none'}</option>";
+       }
+       #check if static routes are defined for client
+       foreach my $line (@current) {
+               chomp($line);   
+               $line=~s/\s*$//g;                       # remove newline
+               @temp=split(/\,/,$line);
+               $temp[1] = '' unless defined $temp[1]; # not always populated
+               my ($a,$b) = split(/\//,$temp[1]);
+               $temp[1] = $a."/".&General::iporsubtocidr($b);
+               foreach my $key (keys %ccdroute2hash) {
+                       if($ccdroute2hash{$key}[0] eq $cgiparams{'NAME'}){
+                               foreach my $i (1 .. $#{$ccdroute2hash{$key}}) {
+                                       if($ccdroute2hash{$key}[$i] eq $a."/".&General::iporsubtodec($b)){
+                                               $set=1;
+                                       }
+                               }
+                       }
+               }
+               if ($set == '1' && $#temp != -1){ print"<option selected>$temp[1]</option>";$set=0;}elsif($set == '0' && $#temp != -1){print"<option>$temp[1]</option>";}
+       }       
+       #check if green,blue,orange are defined for client
+       foreach my $key (keys %ccdroute2hash) {
+               if($ccdroute2hash{$key}[0] eq $cgiparams{'NAME'}){
+                       $other=1;
+                       foreach my $i (1 .. $#{$ccdroute2hash{$key}}) {
+                               if ($ccdroute2hash{$key}[$i] eq $netsettings{'GREEN_NETADDRESS'}."/".&General::iporsubtodec($netsettings{'GREEN_NETMASK'})){
+                                       $selgreen=1;
+                               }
+                               if (&haveBlueNet()){
+                                       if( $ccdroute2hash{$key}[$i] eq $netsettings{'BLUE_NETADDRESS'}."/".&General::iporsubtodec($netsettings{'BLUE_NETMASK'})) {
+                                               $selblue=1;
+                                       }
+                               }
+                               if (&haveOrangeNet()){
+                                       if( $ccdroute2hash{$key}[$i] eq $netsettings{'ORANGE_NETADDRESS'}."/".&General::iporsubtodec($netsettings{'ORANGE_NETMASK'}) ) {
+                                               $selorange=1;
+                                       }
+                               }
+                       }
+               }
+       }
+       if (&haveBlueNet() && $selblue == '1'){ print"<option selected>$Lang::tr{'blue'}</option>";$selblue=0;}elsif(&haveBlueNet() && $selblue == '0'){print"<option>$Lang::tr{'blue'}</option>";}
+       if (&haveOrangeNet() && $selorange == '1'){ print"<option selected>$Lang::tr{'orange'}</option>";$selorange=0;}elsif(&haveOrangeNet() && $selorange == '0'){print"<option>$Lang::tr{'orange'}</option>";}                       
+       if ($selgreen == '1' || $other == '0'){ print"<option selected>$Lang::tr{'green'}</option>";$set=0;}else{print"<option>$Lang::tr{'green'}</option>";};
+       
+       print<<END
+       </select></td><td valign='top'>DNS1:</td><td valign='top'><input type='TEXT' name='CCD_DNS1' value='$cgiparams{'CCD_DNS1'}' size='30' /></td></tr>
+       <tr valign='top'><td>DNS2:</td><td><input type='TEXT' name='CCD_DNS2' value='$cgiparams{'CCD_DNS2'}' size='30' /></td></tr>
+       <tr valign='top'><td valign='top'>WINS:</td><td><input type='TEXT' name='CCD_WINS' value='$cgiparams{'CCD_WINS'}' size='30' /></td></tr></table><br><hr>
+       
+END
+;
+     &Header::closebox();
+}
        print "<div align='center'><input type='submit' name='ACTION' value='$Lang::tr{'save'}' />";
        if ($cgiparams{'KEY'}) {
 #          print "<input type='submit' name='ACTION' value='$Lang::tr{'advanced'}' />";
@@ -3369,34 +4808,36 @@ END
     my @status = `/bin/cat /var/log/ovpnserver.log`;
 
     if ($cgiparams{'VPN_IP'} eq '' && -e "${General::swroot}/red/active") {
-       if (open(IPADDR, "${General::swroot}/red/local-ipaddress")) {
-           my $ipaddr = <IPADDR>;
-           close IPADDR;
-           chomp ($ipaddr);
-           $cgiparams{'VPN_IP'} = (gethostbyaddr(pack("C4", split(/\./, $ipaddr)), 2))[0];
-           if ($cgiparams{'VPN_IP'} eq '') {
-               $cgiparams{'VPN_IP'} = $ipaddr;
-           }
-       }
+               if (open(IPADDR, "${General::swroot}/red/local-ipaddress")) {
+                   my $ipaddr = <IPADDR>;
+                   close IPADDR;
+                   chomp ($ipaddr);
+                   $cgiparams{'VPN_IP'} = (gethostbyaddr(pack("C4", split(/\./, $ipaddr)), 2))[0];
+                   if ($cgiparams{'VPN_IP'} eq '') {
+                               $cgiparams{'VPN_IP'} = $ipaddr;
+                   }
+               }
     }
     
 #default setzen
     if ($cgiparams{'DCIPHER'} eq '') {
-       $cgiparams{'DCIPHER'} =  'BF-CBC';     
+               $cgiparams{'DCIPHER'} =  'AES-256-CBC';
     }
-#    if ($cgiparams{'DCOMPLZO'} eq '') {
-#      $cgiparams{'DCOMPLZO'} =  'on';     
-#    }
     if ($cgiparams{'DDEST_PORT'} eq '') {
-       $cgiparams{'DDEST_PORT'} =  '1194';     
+               $cgiparams{'DDEST_PORT'} =  '1194';
     }
     if ($cgiparams{'DMTU'} eq '') {
-       $cgiparams{'DMTU'} =  '1400';     
+               $cgiparams{'DMTU'} =  '1400';
+    }
+    if ($cgiparams{'MSSFIX'} eq '') {
+               $cgiparams{'MSSFIX'} = 'off';
+    }
+       if ($cgiparams{'DAUTH'} eq '') {
+               $cgiparams{'DAUTH'} = 'SHA1';
     }
     if ($cgiparams{'DOVPN_SUBNET'} eq '') {
-       $cgiparams{'DOVPN_SUBNET'} = '10.' . int(rand(256)) . '.' . int(rand(256)) . '.0/255.255.255.0';
+               $cgiparams{'DOVPN_SUBNET'} = '10.' . int(rand(256)) . '.' . int(rand(256)) . '.0/255.255.255.0';
     }
-
     $checked{'ENABLED'}{'off'} = '';
     $checked{'ENABLED'}{'on'} = '';
     $checked{'ENABLED'}{$cgiparams{'ENABLED'}} = 'CHECKED';
@@ -3413,23 +4854,37 @@ END
     $selected{'DPROTOCOL'}{'udp'} = '';
     $selected{'DPROTOCOL'}{'tcp'} = '';
     $selected{'DPROTOCOL'}{$cgiparams{'DPROTOCOL'}} = 'SELECTED';
-    
-    $selected{'DCIPHER'}{'DES-CBC'} = '';
-    $selected{'DCIPHER'}{'DES-EDE-CBC'} = '';
+
+    $selected{'DCIPHER'}{'CAMELLIA-256-CBC'} = '';
+    $selected{'DCIPHER'}{'CAMELLIA-192-CBC'} = '';
+    $selected{'DCIPHER'}{'CAMELLIA-128-CBC'} = '';
+    $selected{'DCIPHER'}{'AES-256-CBC'} = '';
+    $selected{'DCIPHER'}{'AES-192-CBC'} = '';
+    $selected{'DCIPHER'}{'AES-128-CBC'} = '';
     $selected{'DCIPHER'}{'DES-EDE3-CBC'} = '';
     $selected{'DCIPHER'}{'DESX-CBC'} = '';
+    $selected{'DCIPHER'}{'SEED-CBC'} = '';
+    $selected{'DCIPHER'}{'DES-EDE-CBC'} = '';
+    $selected{'DCIPHER'}{'CAST5-CBC'} = '';
+    $selected{'DCIPHER'}{'BF-CBC'} = '';
     $selected{'DCIPHER'}{'RC2-CBC'} = '';
-    $selected{'DCIPHER'}{'RC2-40-CBC'} = '';
+    $selected{'DCIPHER'}{'DES-CBC'} = '';
     $selected{'DCIPHER'}{'RC2-64-CBC'} = '';
-    $selected{'DCIPHER'}{'BF-CBC'} = '';
-    $selected{'DCIPHER'}{'CAST5-CBC'} = '';    
-    $selected{'DCIPHER'}{'AES-128-CBC'} = '';
-    $selected{'DCIPHER'}{'AES-192-CBC'} = '';
-    $selected{'DCIPHER'}{'AES-256-CBC'} = '';
+    $selected{'DCIPHER'}{'RC2-40-CBC'} = '';
     $selected{'DCIPHER'}{$cgiparams{'DCIPHER'}} = 'SELECTED';
+
+    $selected{'DAUTH'}{'whirlpool'} = '';
+    $selected{'DAUTH'}{'SHA512'} = '';
+    $selected{'DAUTH'}{'SHA384'} = '';
+    $selected{'DAUTH'}{'SHA256'} = '';
+    $selected{'DAUTH'}{'ecdsa-with-SHA1'} = '';
+    $selected{'DAUTH'}{'SHA1'} = '';
+    $selected{'DAUTH'}{$cgiparams{'DAUTH'}} = 'SELECTED';
+
     $checked{'DCOMPLZO'}{'off'} = '';
     $checked{'DCOMPLZO'}{'on'} = '';
     $checked{'DCOMPLZO'}{$cgiparams{'DCOMPLZO'}} = 'CHECKED';
+
 # m.a.d
     $checked{'MSSFIX'}{'off'} = '';
     $checked{'MSSFIX'}{'on'} = '';
@@ -3446,6 +4901,16 @@ END
        &Header::closebox();
     }
 
+       if ($warnmessage) {
+               &Header::openbox('100%', 'LEFT', $Lang::tr{'warning messages'});
+               print "$warnmessage<br>";
+               print "$Lang::tr{'fwdfw warn1'}<br>";
+               &Header::closebox();
+               print"<center><form method='post'><input type='submit' name='ACTION' value='$Lang::tr{'ok'}' style='width: 5em;'></form>";
+               &Header::closepage();
+               exit 0;
+       }
+
     my $sactive = "<table cellpadding='2' cellspacing='0' bgcolor='${Header::colourred}' width='50%'><tr><td align='center'><b><font color='#FFFFFF'>$Lang::tr{'stopped'}</font></b></td></tr></table>";
     my $srunning = "no";
     my $activeonrun = "";
@@ -3457,8 +4922,8 @@ END
        $activeonrun = "disabled='disabled'";
     }  
     &Header::openbox('100%', 'LEFT', $Lang::tr{'global settings'});    
-    print <<END        
-    <table width='100%'>
+       print <<END;
+    <table width='100%' border=0>
     <form method='post'>
     <td width='25%'>&nbsp;</td>
     <td width='25%'>&nbsp;</td>
@@ -3466,7 +4931,7 @@ END
     <tr><td class='boldbase'>$Lang::tr{'ovpn server status'}</td>
     <td align='left'>$sactive</td>
     <tr><td class='boldbase'>$Lang::tr{'ovpn on red'}</td>
-        <td><input type='checkbox' name='ENABLED' $checked{'ENABLED'}{'on'} /></td>
+    <td><input type='checkbox' name='ENABLED' $checked{'ENABLED'}{'on'} /></td>
 END
 ;
     if (&haveBlueNet()) {
@@ -3477,7 +4942,7 @@ END
        print "<tr><td class='boldbase'>$Lang::tr{'ovpn on orange'}</td>";
        print "<td><input type='checkbox' name='ENABLED_ORANGE' $checked{'ENABLED_ORANGE'}{'on'} /></td>";
     }  
-    print <<END        
+    print <<END;
     <tr><td class='base' nowrap='nowrap' colspan='2'>$Lang::tr{'local vpn hostname/ip'}:<br /><input type='text' name='VPN_IP' value='$cgiparams{'VPN_IP'}' size='30' /></td>
        <td class='boldbase' nowrap='nowrap' colspan='2'>$Lang::tr{'ovpn subnet'}<br /><input type='TEXT' name='DOVPN_SUBNET' value='$cgiparams{'DOVPN_SUBNET'}' size='30' /></td></tr>
     <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'ovpn device'}</td>
@@ -3490,33 +4955,43 @@ END
         <td class='boldbase'>$Lang::tr{'destination port'}:</td>
         <td><input type='TEXT' name='DDEST_PORT' value='$cgiparams{'DDEST_PORT'}' size='5' /></td></tr>
     <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'MTU'}&nbsp;</td>
-        <td> <input type='TEXT' name='DMTU' VALUE='$cgiparams{'DMTU'}'size='5' /></TD>
+        <td> <input type='TEXT' name='DMTU' VALUE='$cgiparams{'DMTU'}'size='5' /></td>
+               <td class='boldbase' nowrap='nowrap'>$Lang::tr{'cipher'}</td>
+               <td><select name='DCIPHER'>
+                               <option value='CAMELLIA-256-CBC' $selected{'DCIPHER'}{'CAMELLIA-256-CBC'}>CAMELLIA-CBC (256 $Lang::tr{'bit'})</option>
+                               <option value='CAMELLIA-192-CBC' $selected{'DCIPHER'}{'CAMELLIA-192-CBC'}>CAMELLIA-CBC (196 $Lang::tr{'bit'})</option>
+                               <option value='CAMELLIA-128-CBC' $selected{'DCIPHER'}{'CAMELLIA-128-CBC'}>CAMELLIA-CBC (128 $Lang::tr{'bit'})</option>
+                               <option value='AES-256-CBC' $selected{'DCIPHER'}{'AES-256-CBC'}>AES-CBC (256 $Lang::tr{'bit'})</option>
+                               <option value='AES-192-CBC' $selected{'DCIPHER'}{'AES-192-CBC'}>AES-CBC (192 $Lang::tr{'bit'})</option>
+                               <option value='AES-128-CBC' $selected{'DCIPHER'}{'AES-128-CBC'}>AES-CBC (128 $Lang::tr{'bit'})</option>
+                               <option value='DES-EDE3-CBC' $selected{'DCIPHER'}{'DES-EDE3-CBC'}>DES-EDE3-CBC (192 $Lang::tr{'bit'})</option>
+                               <option value='DESX-CBC' $selected{'DCIPHER'}{'DESX-CBC'}>DESX-CBC (192 $Lang::tr{'bit'})</option>
+                               <option value='SEED-CBC' $selected{'DCIPHER'}{'SEED-CBC'}>SEED-CBC (128 $Lang::tr{'bit'})</option>
+                               <option value='DES-EDE-CBC' $selected{'DCIPHER'}{'DES-EDE-CBC'}>DES-EDE-CBC (128 $Lang::tr{'bit'})</option>
+                               <option value='BF-CBC' $selected{'DCIPHER'}{'BF-CBC'}>BF-CBC (128 $Lang::tr{'bit'})</option>
+                               <option value='CAST5-CBC' $selected{'DCIPHER'}{'CAST5-CBC'}>CAST5-CBC (128 $Lang::tr{'bit'})</option>
+                               <option value='RC2-CBC' $selected{'DCIPHER'}{'RC2-CBC'}>RC2-CBC (128 $Lang::tr{'bit'})</option>
+                               <option value='DES-CBC' $selected{'DCIPHER'}{'DES-CBC'}>DES-CBC (64 $Lang::tr{'bit'} not recommended)</option>
+                               <option value='RC2-64-CBC' $selected{'DCIPHER'}{'RC2-64-CBC'}>RC2-CBC (64 $Lang::tr{'bit'} not recommended)</option>
+                               <option value='RC2-40-CBC' $selected{'DCIPHER'}{'RC2-40-CBC'}>RC2-CBC (40 $Lang::tr{'bit'} not recommended)</option>
+                       </select>
+               </td>
     <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'comp-lzo'}</td>
         <td><input type='checkbox' name='DCOMPLZO' $checked{'DCOMPLZO'}{'on'} /></td>
-        <td class='boldbase' nowrap='nowrap'>$Lang::tr{'cipher'}</td>
-        <td><select name='DCIPHER'><option value='DES-CBC' $selected{'DCIPHER'}{'DES-CBC'}>DES-CBC</option>
-                                  <option value='DES-EDE-CBC' $selected{'DCIPHER'}{'DES-EDE-CBC'}>DES-EDE-CBC</option>
-                                  <option value='DES-EDE3-CBC' $selected{'DCIPHER'}{'DES-EDE3-CBC'}>DES-EDE3-CBC</option>
-                                  <option value='DESX-CBC' $selected{'DCIPHER'}{'DESX-CBC'}>DESX-CBC</option>
-                                  <option value='RC2-CBC' $selected{'DCIPHER'}{'RC2-CBC'}>RC2-CBC</option>                                                                 
-                                  <option value='RC2-40-CBC' $selected{'DCIPHER'}{'RC2-40-CBC'}>RC2-40-CBC</option>
-                                  <option value='RC2-64-CBC' $selected{'DCIPHER'}{'RC2-64-CBC'}>RC2-64-CBC</option>
-                                  <option value='BF-CBC' $selected{'DCIPHER'}{'BF-CBC'}>BF-CBC</option>
-                                  <option value='CAST5-CBC' $selected{'DCIPHER'}{'CAST5-CBC'}>CAST5-CBC</option>
-                                  <option value='AES-128-CBC' $selected{'DCIPHER'}{'AES-128-CBC'}>AES-128-CBC</option>
-                                  <option value='AES-192-CBC' $selected{'DCIPHER'}{'AES-192-CBC'}>AES-192-CBC</option>
-                                  <option value='AES-256-CBC' $selected{'DCIPHER'}{'AES-256-CBC'}>AES-256-CBC</option></select></td>
+       </tr>
+    <tr><td colspan='4'><br><br></td></tr>
 END
 ;                                 
     
     if ( $srunning eq "yes" ) {
-       print "<tr><td align='left'><input type='submit' name='ACTION' value='$Lang::tr{'save'}' disabled='disabled' /></td>";
-       print "<td><input type='submit' name='ACTION' value='$Lang::tr{'advanced server'}' disabled='disabled'/></td>"; 
-       print "<td><input type='submit' name='ACTION' value='$Lang::tr{'stop ovpn server'}' /></td>";
-       print "<td><input type='submit' name='ACTION' value='$Lang::tr{'restart ovpn server'}' /></td></tr>";   
+       print "<tr><td align='right' colspan='4'><input type='submit' name='ACTION' value='$Lang::tr{'save'}' disabled='disabled' />";
+       print "<input type='submit' name='ACTION' value='$Lang::tr{'ccd net'}' />";
+       print "<input type='submit' name='ACTION' value='$Lang::tr{'advanced server'}' />";     
+       print "<input type='submit' name='ACTION' value='$Lang::tr{'stop ovpn server'}' /></td></tr>";
     } else{
-       print "<tr><td align='left'><input type='submit' name='ACTION' value='$Lang::tr{'save'}' /></td>";
-       print "<td><input type='submit' name='ACTION' value='$Lang::tr{'advanced server'}' /></td>";
+       print "<tr><td align='right' colspan='4'><input type='submit' name='ACTION' value='$Lang::tr{'save'}' />";
+       print "<input type='submit' name='ACTION' value='$Lang::tr{'ccd net'}' />";
+       print "<input type='submit' name='ACTION' value='$Lang::tr{'advanced server'}' />";
        if (( -e "${General::swroot}/ovpn/ca/cacert.pem" &&
             -e "${General::swroot}/ovpn/ca/dh1024.pem" &&
             -e "${General::swroot}/ovpn/certs/servercert.pem" &&
@@ -3524,275 +4999,140 @@ END
            (( $cgiparams{'ENABLED'} eq 'on') || 
            ( $cgiparams{'ENABLED_BLUE'} eq 'on') ||
            ( $cgiparams{'ENABLED_ORANGE'} eq 'on'))){
-           print "<td><input type='submit' name='ACTION' value='$Lang::tr{'start ovpn server'}' /></td>";
-           print "<td><input type='submit' name='ACTION' value='$Lang::tr{'restart ovpn server'}' /></td></tr>";       
+           print "<input type='submit' name='ACTION' value='$Lang::tr{'start ovpn server'}' /></td></tr>";
        } else {
-           print "<td><input type='submit' name='ACTION' value='$Lang::tr{'start ovpn server'}' disabled='disabled' /></td>";    
-           print "<td><input type='submit' name='ACTION' value='$Lang::tr{'restart ovpn server'}' disabled='disabled' /></td></tr>";               
+           print "<input type='submit' name='ACTION' value='$Lang::tr{'start ovpn server'}' disabled='disabled' /></td></tr>";    
        }    
     }
     print "</form></table>";
     &Header::closebox();
-    &Header::openbox('100%', 'LEFT', "$Lang::tr{'certificate authorities'}:");
-    print <<EOF#'
-    <table width='100%' border='0' cellspacing='1' cellpadding='0'>
-    <tr>
-       <td width='25%' class='boldbase' align='center'><b>$Lang::tr{'name'}</b></td>
-       <td width='65%' class='boldbase' align='center'><b>$Lang::tr{'subject'}</b></td>
-       <td width='10%' class='boldbase' colspan='3' align='center'><b>$Lang::tr{'action'}</b></td>
-    </tr>
-EOF
-    ;
-    if (-f "${General::swroot}/ovpn/ca/cacert.pem") {
-       my $casubject = `/usr/bin/openssl x509 -text -in ${General::swroot}/ovpn/ca/cacert.pem`;
-       $casubject    =~ /Subject: (.*)[\n]/;
-       $casubject    = $1;
-       $casubject    =~ s+/Email+, E+;
-       $casubject    =~ s/ ST=/ S=/;
-
-       print <<END
-       <tr bgcolor='$color{'color22'}'>
-       <td class='base'>$Lang::tr{'root certificate'}</td>
-       <td class='base'>$casubject</td>
-       <form method='post' name='frmrootcrta'><td width='3%' align='center'>
-           <input type='hidden' name='ACTION' value='$Lang::tr{'show root certificate'}' />
-           <input type='image' name='$Lang::tr{'edit'}' src='/images/info.gif' alt='$Lang::tr{'show root certificate'}' title='$Lang::tr{'show root certificate'}' width='20' height='20' border='0' />
-       </td></form>
-       <form method='post' name='frmrootcrtb'><td width='3%' align='center'>
-           <input type='image' name='$Lang::tr{'download root certificate'}' src='/images/media-floppy.png' alt='$Lang::tr{'download root certificate'}' title='$Lang::tr{'download root certificate'}' border='0' />
-           <input type='hidden' name='ACTION' value='$Lang::tr{'download root certificate'}' />
-       </td></form>
-       <td width='4%'>&nbsp;</td></tr>
-END
-       ;
-    } else {
-       # display rootcert generation buttons
-       print <<END
-       <tr bgcolor='$color{'color22'}'>
-       <td class='base'>$Lang::tr{'root certificate'}:</td>
-       <td class='base'>$Lang::tr{'not present'}</td>
-       <td colspan='3'>&nbsp;</td></tr>
-END
-       ;
-    }
-
-    if (-f "${General::swroot}/ovpn/certs/servercert.pem") {
-       my $hostsubject = `/usr/bin/openssl x509 -text -in ${General::swroot}/ovpn/certs/servercert.pem`;
-       $hostsubject    =~ /Subject: (.*)[\n]/;
-       $hostsubject    = $1;
-       $hostsubject    =~ s+/Email+, E+;
-       $hostsubject    =~ s/ ST=/ S=/;
-
-       print <<END
-       <tr bgcolor='$color{'color20'}'>
-       <td class='base'>$Lang::tr{'host certificate'}</td>
-       <td class='base'>$hostsubject</td>
-       <form method='post' name='frmhostcrta'><td width='3%' align='center'>
-           <input type='hidden' name='ACTION' value='$Lang::tr{'show host certificate'}' />
-           <input type='image' name='$Lang::tr{'show host certificate'}' src='/images/info.gif' alt='$Lang::tr{'show host certificate'}' title='$Lang::tr{'show host certificate'}' width='20' height='20' border='0' />
-       </td></form>
-       <form method='post' name='frmhostcrtb'><td width='3%' align='center'>
-           <input type='image' name='$Lang::tr{'download host certificate'}' src='/images/media-floppy.png' alt='$Lang::tr{'download host certificate'}' title='$Lang::tr{'download host certificate'}' border='0' />
-           <input type='hidden' name='ACTION' value='$Lang::tr{'download host certificate'}' />
-       </td></form>
-       <td width='4%'>&nbsp;</td></tr>
-END
-       ;
-    } else {
-       # Nothing
-       print <<END
-       <tr bgcolor='$color{'color20'}'>
-       <td width='25%' class='base'>$Lang::tr{'host certificate'}:</td>
-       <td class='base'>$Lang::tr{'not present'}</td>
-       </td><td colspan='3'>&nbsp;</td></tr>
-END
-       ;
-    }
-
-    if (! -f "${General::swroot}/ovpn/ca/cacert.pem") {
-        print "<tr><td colspan='5' align='center'><form method='post'>";
-       print "<input type='submit' name='ACTION' value='$Lang::tr{'generate root/host certificates'}' />";
-        print "</form></td></tr>\n";
-    }
-
-    if (keys %cahash > 0) {
-       foreach my $key (keys %cahash) {
-           if (($key + 1) % 2) {
-               print "<tr bgcolor='$color{'color20'}'>\n";
-           } else {
-               print "<tr bgcolor='$color{'color22'}'>\n";
-           }
-           print "<td class='base'>$cahash{$key}[0]</td>\n";
-           print "<td class='base'>$cahash{$key}[1]</td>\n";
-           print <<END
-           <form method='post' name='cafrm${key}a'><td align='center'>
-               <input type='image' name='$Lang::tr{'show ca certificate'}' src='/images/info.gif' alt='$Lang::tr{'show ca certificate'}' title='$Lang::tr{'show ca certificate'}' border='0' />
-               <input type='hidden' name='ACTION' value='$Lang::tr{'show ca certificate'}' />
-               <input type='hidden' name='KEY' value='$key' />
-           </td></form>
-           <form method='post' name='cafrm${key}b'><td align='center'>
-               <input type='image' name='$Lang::tr{'download ca certificate'}' src='/images/media-floppy.png' alt='$Lang::tr{'download ca certificate'}' title='$Lang::tr{'download ca certificate'}' border='0' />
-               <input type='hidden' name='ACTION' value='$Lang::tr{'download ca certificate'}' />
-               <input type='hidden' name='KEY' value='$key' />
-           </td></form>
-           <form method='post' name='cafrm${key}c'><td align='center'>
-               <input type='hidden' name='ACTION' value='$Lang::tr{'remove ca certificate'}' />
-               <input type='image'  name='$Lang::tr{'remove ca certificate'}' src='/images/delete.gif' alt='$Lang::tr{'remove ca certificate'}' title='$Lang::tr{'remove ca certificate'}' width='20' height='20' border='0' />
-               <input type='hidden' name='KEY' value='$key' />
-           </td></form></tr>
-END
-           ;
-       }
-    }
 
-    print "</table>";
-
-    # If the file contains entries, print Key to action icons
-    if ( -f "${General::swroot}/ovpn/ca/cacert.pem") {
-    print <<END
-    <table>
-    <tr>
-       <td class='boldbase'>&nbsp; <b>$Lang::tr{'legend'}:</b></td>
-       <td>&nbsp; &nbsp; <img src='/images/info.gif' alt='$Lang::tr{'show certificate'}' /></td>
-       <td class='base'>$Lang::tr{'show certificate'}</td>
-       <td>&nbsp; &nbsp; <img src='/images/media-floppy.png' alt='$Lang::tr{'download certificate'}' /></td>
-       <td class='base'>$Lang::tr{'download certificate'}</td>
-    </tr>
-    </table>
-END
-    ;
-    }
-    print <<END
-    <form method='post' enctype='multipart/form-data'>
-    <table width='100%' border='0' cellspacing='1' cellpadding='0'>
-    <tr><td class='base' nowrap='nowrap'>$Lang::tr{'ca name'}:</td>
-    <td nowrap='nowrap'><input type='text' name='CA_NAME' value='$cgiparams{'CA_NAME'}' size='15' />
-    <td nowrap='nowrap'><input type='file' name='FH' size='30' /></td>
-    <td nowrap='nowrap'><input type='submit' name='ACTION' value='$Lang::tr{'upload ca certificate'}' /><br /><input type='submit' name='ACTION' value='$Lang::tr{'show crl'}' /></td>    
-    </tr></table></form>
-END
-    ;
-
-    &Header::closebox();
-    if ( $srunning eq "yes" ) {    
-       print "<div align='center'><form method='post'><input type='submit' name='ACTION' value='$Lang::tr{'reset'}' disabled='disabled' /></div></form>\n";    
-    }else{
-       print "<div align='center'><form method='post'><input type='submit' name='ACTION' value='$Lang::tr{'reset'}' /></div></form>\n";
-    }      
     if ( -f "${General::swroot}/ovpn/ca/cacert.pem" ) {
-
 ###
 # m.a.d net2net
+#<td width='25%' class='boldbase' align='center'><b>$Lang::tr{'remark'}</b><br /><img src='/images/null.gif' width='125' height='1' border='0' alt='L2089' /></td>
 ###
 
-    &Header::openbox('100%', 'LEFT', $Lang::tr{'Client status and controlc' });
-    print <<END
+    &Header::openbox('100%', 'LEFT', $Lang::tr{'connection status and controlc' });
+    print <<END;
 
 
-    <table width='100%' border='0' cellspacing='1' cellpadding='0'>
+    <table width='100%' cellspacing='1' cellpadding='0' class='tbl'>
 <tr>
-    <td width='10%' class='boldbase' align='center'><b>$Lang::tr{'name'}</b></td>
-    <td width='15%' class='boldbase' align='center'><b>$Lang::tr{'type'}</b></td>
-    <td width='18%' class='boldbase' align='center'><b>$Lang::tr{'common name'}</b></td>
-    <td width='17%' class='boldbase' align='center'><b>$Lang::tr{'valid till'}</b></td>
-    <td width='25%' class='boldbase' align='center'><b>$Lang::tr{'remark'}</b><br /><img src='/images/null.gif' width='125' height='1' border='0' alt='L2089' /></td>
-    <td width='10%' class='boldbase' align='center'><b>$Lang::tr{'status'}</b></td>
-    <td width='5%' class='boldbase' colspan='6' align='center'><b>$Lang::tr{'action'}</b></td>
+    <th width='10%' class='boldbase' align='center'><b>$Lang::tr{'name'}</b></th>
+    <th width='15%' class='boldbase' align='center'><b>$Lang::tr{'type'}</b></th>
+    <th width='22%' class='boldbase' align='center'><b>$Lang::tr{'network'}</b></th>
+    <th width='20%' class='boldbase' align='center'><b>$Lang::tr{'remark'}</b></th>
+    <th width='10%' class='boldbase' align='center'><b>$Lang::tr{'status'}</b></th>
+    <th width='5%' class='boldbase' colspan='6' align='center'><b>$Lang::tr{'action'}</b></th>
 </tr>
 END
        ;
-        my $id = 0;
-        my $gif;
-        foreach my $key (keys %confighash) {
-       if ($confighash{$key}[0] eq 'on') { $gif = 'on.gif'; } else { $gif = 'off.gif'; }
-
+       my $id = 0;
+       my $gif;
+       my $col1="";
+       foreach my $key (sort { ncmp ($confighash{$a}[1],$confighash{$b}[1]) } keys %confighash) {
+       if ($confighash{$key}[0] eq 'on') { $gif = 'on.gif'; } else { $gif = 'off.gif'; }
        if ($id % 2) {
-           print "<tr bgcolor='$color{'color20'}'>\n";
-       } else {
-           print "<tr bgcolor='$color{'color22'}'>\n";
-       }
-       print "<td align='center' nowrap='nowrap'>$confighash{$key}[1]</td>";
-       print "<td align='center' nowrap='nowrap'>" . $Lang::tr{"$confighash{$key}[3]"} . " (" . $Lang::tr{"$confighash{$key}[4]"} . ")</td>";
-       if ($confighash{$key}[4] eq 'cert') {
-           print "<td align='left' nowrap='nowrap'>$confighash{$key}[2]</td>";
+               print "<tr>";
+               $col="bgcolor='$color{'color20'}'";
        } else {
-           print "<td align='left'>&nbsp;</td>";
+               print "<tr>";
+               $col="bgcolor='$color{'color22'}'";
        }
+       print "<td align='center' nowrap='nowrap' $col>$confighash{$key}[1]</td>";
+       print "<td align='center' nowrap='nowrap' $col>" . $Lang::tr{"$confighash{$key}[3]"} . " (" . $Lang::tr{"$confighash{$key}[4]"} . ")</td>";
+       #if ($confighash{$key}[4] eq 'cert') {
+           #print "<td align='left' nowrap='nowrap'>$confighash{$key}[2]</td>";
+       #} else {
+           #print "<td align='left'>&nbsp;</td>";
+       #}
        my $cavalid = `/usr/bin/openssl x509 -text -in ${General::swroot}/ovpn/certs/$confighash{$key}[1]cert.pem`;
        $cavalid    =~ /Not After : (.*)[\n]/;
        $cavalid    = $1;
-       print "<td align='center'>$cavalid</td>";
-       print "<td align='center'>$confighash{$key}[25]</td>";
-
-       my $active = "<table cellpadding='2' cellspacing='0' bgcolor='${Header::colourred}' width='100%'><tr><td align='center'><b><font color='#FFFFFF'>$Lang::tr{'capsclosed'}</font></b></td></tr></table>";
+       if ($confighash{$key}[32] eq "" && $confighash{$key}[3] eq 'net' ){$confighash{$key}[32]="net-2-net";}
+       if ($confighash{$key}[32] eq "" && $confighash{$key}[3] eq 'host' ){$confighash{$key}[32]="dynamic";}
+       print "<td align='center' $col>$confighash{$key}[32]</td>";
+       print "<td align='center' $col>$confighash{$key}[25]</td>";
+       $col1="bgcolor='${Header::colourred}'";
+       my $active = "<b><font color='#FFFFFF'>$Lang::tr{'capsclosed'}</font></b>";
 
        if ($confighash{$key}[0] eq 'off') {
-           $active = "<table cellpadding='2' cellspacing='0' bgcolor='${Header::colourblue}' width='100%'><tr><td align='center'><b><font color='#FFFFFF'>$Lang::tr{'disabled'}</font></b></td></tr></table>";
+               $col1="bgcolor='${Header::colourblue}'";
+               $active = "<b><font color='#FFFFFF'>$Lang::tr{'capsclosed'}</font></b>";
        } else {
 
 ###
 # m.a.d net2net
-###       
-       
-       if ($confighash{$key}[3] eq 'net') {
-#        my @tempovpnsubnet = split("\/",$confighash{$key}[27]);
-#                       my @ovpnip = split /\./,$tempovpnsubnet[0];
-#                         my $pingip = "";
-#               if ($confighash{$key}[6] eq 'server') {
-#                               $pingip = "$ovpnip[0].$ovpnip[1].$ovpnip[2].2";
-#                               } else {
-#                               $pingip = "$ovpnip[0].$ovpnip[1].$ovpnip[2].1";
-#                               }
-#        my $p = Net::Ping->new("udp",1);
-#        if ($p->ping($pingip)) {
-#                         $active = "<table cellpadding='2' cellspacing='0' bgcolor='${Header::colourgreen}' width='100%'><tr><td align='center'><b><font color='#FFFFFF'>$Lang::tr{'capsopen'}</font></b></td></tr></table>";
-#                         }    
-#                         $p->close(); 
-
-       if (-e "/var/run/$confighash{$key}[1]n2n.pid") {
-       $active = "<table cellpadding='2' cellspacing='0' bgcolor='${Header::colourgreen}' width='100%'><tr><td align='center'><b><font color='#FFFFFF'>$Lang::tr{'enabledtitle'}</font></b></td></tr></table>";
-       } 
-    }  
+###
 
-               my $cn;
-           my @match = ();     
-         foreach my $line (@status) {
-               chomp($line);
-               if ( $line =~ /^(.+),(\d+\.\d+\.\d+\.\d+\:\d+),(\d+),(\d+),(.+)/) {
-                   @match = split(m/^(.+),(\d+\.\d+\.\d+\.\d+\:\d+),(\d+),(\d+),(.+)/, $line);
-                   if ($match[1] ne "Common Name") {
-                       $cn = $match[1];
-                   }       
-               $cn =~ s/[_]/ /g;
-                   if ($cn eq "$confighash{$key}[2]") {
-                       $active = "<table cellpadding='2' cellspacing='0' bgcolor='${Header::colourgreen}' width='100%'><tr><td align='center'><b><font color='#FFFFFF'>$Lang::tr{'capsopen'}</font></b></td></tr></table>";
-                   }
+       if ($confighash{$key}[3] eq 'net') {
 
-      
+        if (-e "/var/run/$confighash{$key}[1]n2n.pid") {
+          my @output = "";
+          my @tustate = "";
+          my $tport = $confighash{$key}[22];
+          my $tnet = new Net::Telnet ( Timeout=>5, Errmode=>'return', Port=>$tport); 
+          if ($tport ne '') {
+          $tnet->open('127.0.0.1');
+          @output = $tnet->cmd(String => 'state', Prompt => '/(END.*\n|ERROR:.*\n)/');
+          @tustate = split(/\,/, $output[1]);
+###
+#CONNECTING    -- OpenVPN's initial state.
+#WAIT          -- (Client only) Waiting for initial response from server.
+#AUTH          -- (Client only) Authenticating with server.
+#GET_CONFIG    -- (Client only) Downloading configuration options from server.
+#ASSIGN_IP     -- Assigning IP address to virtual network interface.
+#ADD_ROUTES    -- Adding routes to system.
+#CONNECTED     -- Initialization Sequence Completed.
+#RECONNECTING  -- A restart has occurred.
+#EXITING       -- A graceful exit is in progress.
+####
+
+               if ($tustate[1] eq 'CONNECTED') {
+                       $col1="bgcolor='${Header::colourgreen}'";
+                       $active = "<b><font color='#FFFFFF'>$Lang::tr{'capsopen'}</font></b>";
+               }else {
+                       $col1="bgcolor='${Header::colourred}'";
+                       $active = "<b><font color='#FFFFFF'>$tustate[1]</font></b>";
+               }
+           }
+           }
+        }else {
+
+                               my $cn;
+                               my @match = ();
+               foreach my $line (@status) {
+                       chomp($line);
+                       if ( $line =~ /^(.+),(\d+\.\d+\.\d+\.\d+\:\d+),(\d+),(\d+),(.+)/) {
+                               @match = split(m/^(.+),(\d+\.\d+\.\d+\.\d+\:\d+),(\d+),(\d+),(.+)/, $line);
+                               if ($match[1] ne "Common Name") {
+                                       $cn = $match[1];
+                               }
+                               $cn =~ s/[_]/ /g;
+                               if ($cn eq "$confighash{$key}[2]") {
+                                       $col1="bgcolor='${Header::colourgreen}'";
+                                       $active = "<b><font color='#FFFFFF'>$Lang::tr{'capsopen'}</font></b>";
+                               }
+                       }
+               }
        }
 }
-}
 
 
-       my $disable_clientdl = "disabled='disabled'";
-       if (( $cgiparams{'ENABLED'} eq 'on') || 
-           ( $cgiparams{'ENABLED_BLUE'} eq 'on') ||
-           ( $cgiparams{'ENABLED_ORANGE'} eq 'on')){
-           $disable_clientdl = "";
-       }
-       print <<END
-       <td align='center'>$active</td>
+    print <<END;
+       <td align='center' $col1>$active</td>
                
-       <form method='post' name='frm${key}a'><td align='center'>
-           <input type='image'  name='$Lang::tr{'dl client arch'}' $disable_clientdl src='/images/openvpn.png' alt='$Lang::tr{'dl client arch'}' title='$Lang::tr{'dl client arch'}' border='0' />
-           <input type='hidden' name='ACTION' value='$Lang::tr{'dl client arch'}' $disable_clientdl />
-           <input type='hidden' name='KEY' value='$key' $disable_clientdl />
+       <form method='post' name='frm${key}a'><td align='center' $col>
+           <input type='image'  name='$Lang::tr{'dl client arch'}' src='/images/openvpn.png' alt='$Lang::tr{'dl client arch'}' title='$Lang::tr{'dl client arch'}' border='0' />
+           <input type='hidden' name='ACTION' value='$Lang::tr{'dl client arch'}' />
+           <input type='hidden' name='KEY' value='$key' />
        </td></form>
 END
        ;
        if ($confighash{$key}[4] eq 'cert') {
-           print <<END
-           <form method='post' name='frm${key}b'><td align='center'>
+           print <<END;
+           <form method='post' name='frm${key}b'><td align='center' $col>
                <input type='image' name='$Lang::tr{'show certificate'}' src='/images/info.gif' alt='$Lang::tr{'show certificate'}' title='$Lang::tr{'show certificate'}' border='0' />
                <input type='hidden' name='ACTION' value='$Lang::tr{'show certificate'}' />
                <input type='hidden' name='KEY' value='$key' />
@@ -3802,16 +5142,16 @@ END
            print "<td>&nbsp;</td>";
        }
        if ($confighash{$key}[4] eq 'cert' && -f "${General::swroot}/ovpn/certs/$confighash{$key}[1].p12") { 
-           print <<END
-           <form method='post' name='frm${key}c'><td align='center'>
+           print <<END;
+           <form method='post' name='frm${key}c'><td align='center' $col>
                <input type='image' name='$Lang::tr{'download pkcs12 file'}' src='/images/media-floppy.png' alt='$Lang::tr{'download pkcs12 file'}' title='$Lang::tr{'download pkcs12 file'}' border='0' />
                <input type='hidden' name='ACTION' value='$Lang::tr{'download pkcs12 file'}' />
                <input type='hidden' name='KEY' value='$key' />
            </td></form>
 END
        ; } elsif ($confighash{$key}[4] eq 'cert') {
-           print <<END
-           <form method='post' name='frm${key}c'><td align='center'>
+           print <<END;
+           <form method='post' name='frm${key}c'><td align='center' $col>
                <input type='image' name='$Lang::tr{'download certificate'}' src='/images/media-floppy.png' alt='$Lang::tr{'download certificate'}' title='$Lang::tr{'download certificate'}' border='0' />
                <input type='hidden' name='ACTION' value='$Lang::tr{'download certificate'}' />
                <input type='hidden' name='KEY' value='$key' />
@@ -3821,18 +5161,18 @@ END
            print "<td>&nbsp;</td>";
        }
        print <<END
-       <form method='post' name='frm${key}d'><td align='center'>
+       <form method='post' name='frm${key}d'><td align='center' $col>
            <input type='image' name='$Lang::tr{'toggle enable disable'}' src='/images/$gif' alt='$Lang::tr{'toggle enable disable'}' title='$Lang::tr{'toggle enable disable'}' border='0' />
            <input type='hidden' name='ACTION' value='$Lang::tr{'toggle enable disable'}' />
            <input type='hidden' name='KEY' value='$key' />
        </td></form>
 
-       <form method='post' name='frm${key}e'><td align='center'>
+       <form method='post' name='frm${key}e'><td align='center' $col>
            <input type='hidden' name='ACTION' value='$Lang::tr{'edit'}' />
            <input type='image' name='$Lang::tr{'edit'}' src='/images/edit.gif' alt='$Lang::tr{'edit'}' title='$Lang::tr{'edit'}' width='20' height='20' border='0'/>
            <input type='hidden' name='KEY' value='$key' />
        </td></form>
-       <form method='post' name='frm${key}f'><td align='center'>
+       <form method='post' name='frm${key}f'><td align='center' $col>
            <input type='hidden' name='ACTION' value='$Lang::tr{'remove'}' />
            <input type='image'  name='$Lang::tr{'remove'}' src='/images/delete.gif' alt='$Lang::tr{'remove'}' title='$Lang::tr{'remove'}' width='20' height='20' border='0' />
            <input type='hidden' name='KEY' value='$key' />
@@ -3846,45 +5186,215 @@ END
 
     # If the config file contains entries, print Key to action icons
     if ( $id ) {
-    print <<END
-    <table>
+    print <<END;
+    <table border='0'>
     <tr>
-       <td class='boldbase'>&nbsp; <b>$Lang::tr{'legend'}:</b></td>
-       <td>&nbsp; <img src='/images/on.gif' alt='$Lang::tr{'click to disable'}' /></td>
-       <td class='base'>$Lang::tr{'click to disable'}</td>
-       <td>&nbsp; &nbsp; <img src='/images/info.gif' alt='$Lang::tr{'show certificate'}' /></td>
-       <td class='base'>$Lang::tr{'show certificate'}</td>
-       <td>&nbsp; &nbsp; <img src='/images/edit.gif' alt='$Lang::tr{'edit'}' /></td>
-       <td class='base'>$Lang::tr{'edit'}</td>
-       <td>&nbsp; &nbsp; <img src='/images/delete.gif' alt='$Lang::tr{'remove'}' /></td>
-       <td class='base'>$Lang::tr{'remove'}</td>
+               <td class='boldbase'>&nbsp; <b>$Lang::tr{'legend'}:</b></td>
+               <td>&nbsp; <img src='/images/on.gif' alt='$Lang::tr{'click to disable'}' /></td>
+               <td class='base'>$Lang::tr{'click to disable'}</td>
+               <td>&nbsp; &nbsp; <img src='/images/info.gif' alt='$Lang::tr{'show certificate'}' /></td>
+               <td class='base'>$Lang::tr{'show certificate'}</td>
+               <td>&nbsp; &nbsp; <img src='/images/edit.gif' alt='$Lang::tr{'edit'}' /></td>
+               <td class='base'>$Lang::tr{'edit'}</td>
+               <td>&nbsp; &nbsp; <img src='/images/delete.gif' alt='$Lang::tr{'remove'}' /></td>
+               <td class='base'>$Lang::tr{'remove'}</td>
     </tr>
     <tr>
-       <td>&nbsp; </td>
-       <td>&nbsp; <img src='/images/off.gif' alt='?OFF' /></td>
-       <td class='base'>$Lang::tr{'click to enable'}</td>
-       <td> <img src='/images/media-floppy.png' alt='?FLOPPY' /></td>
-       <td class='base'>$Lang::tr{'download certificate'}</td>
-       <td> <img src='/images/openvpn.png' alt='?RELOAD'/></td>
-       <td class='base'>$Lang::tr{'dl client arch'}</td>
-    </tr>
-    </table>
+               <td>&nbsp; </td>
+               <td>&nbsp; <img src='/images/off.gif' alt='?OFF' /></td>
+               <td class='base'>$Lang::tr{'click to enable'}</td>
+               <td>&nbsp; &nbsp; <img src='/images/media-floppy.png' alt='?FLOPPY' /></td>
+               <td class='base'>$Lang::tr{'download certificate'}</td>
+               <td>&nbsp; &nbsp; <img src='/images/openvpn.png' alt='?RELOAD'/></td>
+               <td class='base'>$Lang::tr{'dl client arch'}</td>
+               </tr>
+    </table><br>
 END
     ;
     }
 
-    print <<END
+    print <<END;
     <table width='100%'>
     <form method='post'>
-    <tr><td width='50%' ><input type='submit' name='ACTION' value='$Lang::tr{'add'}' /></td>
-       <td width='50%' ><input type='submit' name='ACTION' value='$Lang::tr{'ovpn con stat'}' $activeonrun /></td></tr>
+    <tr><td align='right'>
+               <input type='submit' name='ACTION' value='$Lang::tr{'add'}' />
+               <input type='submit' name='ACTION' value='$Lang::tr{'ovpn con stat'}' $activeonrun /></td>
+       </tr>
     </form>
     </table>
 END
-    ;    
-    &Header::closebox();
-}
-&Header::closepage();
+    ;
+       &Header::closebox();
+       }
+    &Header::openbox('100%', 'LEFT', "$Lang::tr{'certificate authorities'}");
+    print <<END;
+    <table width='100%' cellspacing='1' cellpadding='0' class='tbl'>
+    <tr>
+               <th width='25%' class='boldbase' align='center'><b>$Lang::tr{'name'}</b></th>
+               <th width='65%' class='boldbase' align='center'><b>$Lang::tr{'subject'}</b></th>
+               <th width='10%' class='boldbase' colspan='3' align='center'><b>$Lang::tr{'action'}</b></th>
+    </tr>
+END
+    ;
+    my $col1="bgcolor='$color{'color22'}'";
+       my $col2="bgcolor='$color{'color20'}'";
+    if (-f "${General::swroot}/ovpn/ca/cacert.pem") {
+               my $casubject = `/usr/bin/openssl x509 -text -in ${General::swroot}/ovpn/ca/cacert.pem`;
+               $casubject    =~ /Subject: (.*)[\n]/;
+               $casubject    = $1;
+               $casubject    =~ s+/Email+, E+;
+               $casubject    =~ s/ ST=/ S=/;
+               print <<END;
+               <tr>
+                       <td class='base' $col1>$Lang::tr{'root certificate'}</td>
+                       <td class='base' $col1>$casubject</td>
+               <form method='post' name='frmrootcrta'><td width='3%' align='center' $col1>
+                       <input type='hidden' name='ACTION' value='$Lang::tr{'show root certificate'}' />
+                       <input type='image' name='$Lang::tr{'edit'}' src='/images/info.gif' alt='$Lang::tr{'show root certificate'}' title='$Lang::tr{'show root certificate'}' width='20' height='20' border='0' />
+               </td></form>
+               <form method='post' name='frmrootcrtb'><td width='3%' align='center' $col1>
+                       <input type='image' name='$Lang::tr{'download root certificate'}' src='/images/media-floppy.png' alt='$Lang::tr{'download root certificate'}' title='$Lang::tr{'download root certificate'}' border='0' />
+                       <input type='hidden' name='ACTION' value='$Lang::tr{'download root certificate'}' />
+               </td></form>
+               <td width='4%' $col1>&nbsp;</td></tr>
+END
+               ;
+    } else {
+               # display rootcert generation buttons
+               print <<END;
+               <tr>
+                       <td class='base' $col1>$Lang::tr{'root certificate'}:</td>
+                       <td class='base' $col1>$Lang::tr{'not present'}</td>
+                       <td colspan='3' $col1>&nbsp;</td></tr>
+END
+               ;
+    }
 
+    if (-f "${General::swroot}/ovpn/certs/servercert.pem") {
+               my $hostsubject = `/usr/bin/openssl x509 -text -in ${General::swroot}/ovpn/certs/servercert.pem`;
+               $hostsubject    =~ /Subject: (.*)[\n]/;
+               $hostsubject    = $1;
+               $hostsubject    =~ s+/Email+, E+;
+               $hostsubject    =~ s/ ST=/ S=/;
+
+               print <<END;
+               <tr>
+                       <td class='base' $col2>$Lang::tr{'host certificate'}</td>
+                       <td class='base' $col2>$hostsubject</td>
+               <form method='post' name='frmhostcrta'><td width='3%' align='center' $col2>
+                       <input type='hidden' name='ACTION' value='$Lang::tr{'show host certificate'}' />
+                       <input type='image' name='$Lang::tr{'show host certificate'}' src='/images/info.gif' alt='$Lang::tr{'show host certificate'}' title='$Lang::tr{'show host certificate'}' width='20' height='20' border='0' />
+               </td></form>
+               <form method='post' name='frmhostcrtb'><td width='3%' align='center' $col2>
+                       <input type='image' name="$Lang::tr{'download host certificate'}" src='/images/media-floppy.png' alt="$Lang::tr{'download host certificate'}" title="$Lang::tr{'download host certificate'}" border='0' />
+                       <input type='hidden' name='ACTION' value="$Lang::tr{'download host certificate'}" />
+               </td></form>
+               <td width='4%' $col2>&nbsp;</td></tr>
+END
+               ;
+    } else {
+               # Nothing
+               print <<END;
+               <tr>
+                       <td width='25%' class='base' $col2>$Lang::tr{'host certificate'}:</td>
+                       <td class='base' $col2>$Lang::tr{'not present'}</td>
+               </td><td colspan='3' $col2>&nbsp;</td></tr>
+END
+               ;
+    }
 
+    if (! -f "${General::swroot}/ovpn/ca/cacert.pem") {
+        print "<tr><td colspan='5' align='center'><form method='post'>";
+               print "<input type='submit' name='ACTION' value='$Lang::tr{'generate root/host certificates'}' />";
+        print "</form></td></tr>\n";
+    }
+
+    if (keys %cahash > 0) {
+               foreach my $key (keys %cahash) {
+                       if (($key + 1) % 2) {
+                               print "<tr bgcolor='$color{'color20'}'>\n";
+                       } else {
+                               print "<tr bgcolor='$color{'color22'}'>\n";
+                       }
+                       print "<td class='base'>$cahash{$key}[0]</td>\n";
+                       print "<td class='base'>$cahash{$key}[1]</td>\n";
+                       print <<END;
+                       <form method='post' name='cafrm${key}a'><td align='center'>
+                               <input type='image' name='$Lang::tr{'show ca certificate'}' src='/images/info.gif' alt='$Lang::tr{'show ca certificate'}' title='$Lang::tr{'show ca certificate'}' border='0' />
+                               <input type='hidden' name='ACTION' value='$Lang::tr{'show ca certificate'}' />
+                               <input type='hidden' name='KEY' value='$key' />
+                       </td></form>
+                       <form method='post' name='cafrm${key}b'><td align='center'>
+                               <input type='image' name='$Lang::tr{'download ca certificate'}' src='/images/media-floppy.png' alt='$Lang::tr{'download ca certificate'}' title='$Lang::tr{'download ca certificate'}' border='0' />
+                               <input type='hidden' name='ACTION' value='$Lang::tr{'download ca certificate'}' />
+                               <input type='hidden' name='KEY' value='$key' />
+                       </td></form>
+                       <form method='post' name='cafrm${key}c'><td align='center'>
+                               <input type='hidden' name='ACTION' value='$Lang::tr{'remove ca certificate'}' />
+                               <input type='image'  name='$Lang::tr{'remove ca certificate'}' src='/images/delete.gif' alt='$Lang::tr{'remove ca certificate'}' title='$Lang::tr{'remove ca certificate'}' width='20' height='20' border='0' />
+                               <input type='hidden' name='KEY' value='$key' />
+                       </td></form></tr>
+END
+                       ;
+               }
+    }
+
+    print "</table>";
+
+    # If the file contains entries, print Key to action icons
+    if ( -f "${General::swroot}/ovpn/ca/cacert.pem") {
+               print <<END;
+               <table>
+               <tr>
+                       <td class='boldbase'>&nbsp; <b>$Lang::tr{'legend'}:</b></td>
+                       <td>&nbsp; &nbsp; <img src='/images/info.gif' alt='$Lang::tr{'show certificate'}' /></td>
+                       <td class='base'>$Lang::tr{'show certificate'}</td>
+                       <td>&nbsp; &nbsp; <img src='/images/media-floppy.png' alt='$Lang::tr{'download certificate'}' /></td>
+                       <td class='base'>$Lang::tr{'download certificate'}</td>
+               </tr>
+               </table>
+END
+               ;
+    }
+
+       print <<END
+       <hr size='1'>
+       <form method='post' enctype='multipart/form-data'>
+       <table width='100%' border='0'cellspacing='1' cellpadding='0'>
+       <tr>
+               <td class='base' nowrap='nowrap'>$Lang::tr{'ca name'}:</td>
+               <td nowrap='nowrap'><input type='text' name='CA_NAME' value='$cgiparams{'CA_NAME'}' size='15' align='left'/></td>
+               <td nowrap='nowrap'><input type='file' name='FH' size='25' />
+               <td nowrap='nowrap' align='right'><input type='submit' name='ACTION' value='$Lang::tr{'upload ca certificate'}' /></td>
+       </tr>
+
+       <tr>
+               <td class='base' nowrap='nowrap'>$Lang::tr{'ovpn dh name'}:</td>
+               <td nowrap='nowrap'><input type='text' name='DH_NAME' value='$cgiparams{'DH_NAME'}' size='15' align='left'/></td>
+               <td nowrap='nowrap'><input type='file' name='FH' size='25' />
+               <td nowrap='nowrap' align='right'><input type='submit' name='ACTION' value='$Lang::tr{'upload dh key'}' /></td>
+       </tr>
+       <tr><td colspan='4'><br></td></tr>
+       <tr>
+               <td nowrap='nowrap'><input type='submit' name='ACTION' value='$Lang::tr{'generate dh key'}' /></td>
+               <td colspan='4' align='right'><input type='submit' name='ACTION' value='$Lang::tr{'show dh'}' /></td>
+       </tr>
+
+       <tr align='right'>
+               <td colspan='4' align='right' width='80%'><input type='submit' name='ACTION' value='$Lang::tr{'show crl'}' /></td>
+       </tr>
+       </table>
+END
+       ;
+
+    if ( $srunning eq "yes" ) {
+               print "<div align='center'><form method='post'><input type='submit' name='ACTION' value='$Lang::tr{'remove x509'}' disabled='disabled' /></div></form>\n";
+    } else {
+               print "<div align='center'><form method='post'><input type='submit' name='ACTION' value='$Lang::tr{'remove x509'}' /></div></form>\n";
+    }
+       &Header::closebox();
+END
+       ;
+
+&Header::closepage();