/*
 * GProFTPD - A GTK+ frontend for the ProFTPD standalone server.
 * Copyright (C) 2001 - 2006 Magnus Loef (Magnus-swe) <magnus-swe@telia.com>
 *
 * 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
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA.
 *
 */




#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "widgets.h"
#include "gettext.h"
#include "reread_conf.h"
#include "show_info.h"
#include "apply_server_settings.h"
#include "allocate.h"
#include "populate_servers.h"
#include "populate_server_settings.h"
#include "select_first_server.h"
#include "populate_conf_tab.h"


extern char global_server_address[1024];
extern char global_server_port[1024];
extern char global_server_type[1024];

extern int use_tls;

extern int activated;


void apply_server_settings(struct w *widgets)
{
    /* Change the selected servers configuration. */
    FILE *fp;
    long conf_size;
    gint active_index;
    gchar *address_line, *port_line;
    int address_match = 0, port_match = 0;
    gchar *info;
        
    int configuration_changed = 0;
    char *change_srv_ident;
    char *old_buffer, *config, *temp_server, *conf_line, *address_buffer, *port_buffer;
    gchar *old_server_ident;

    G_CONST_RETURN gchar *server_name;
    G_CONST_RETURN gchar *server_port;
    G_CONST_RETURN gchar *admin_email;
    G_CONST_RETURN gchar *passive_port_1;
    G_CONST_RETURN gchar *passive_port_2;
    G_CONST_RETURN gchar *masquerade_address;
    G_CONST_RETURN gchar *max_connect;
    G_CONST_RETURN gchar *idle_timeout; /* TimeoutIdle and TimeoutNoTransfer */
    G_CONST_RETURN gchar *server_ident;
    G_CONST_RETURN gchar *server_user;
    G_CONST_RETURN gchar *server_group;
    G_CONST_RETURN gchar *fake_username;
    G_CONST_RETURN gchar *fake_groupname;
    G_CONST_RETURN gchar *max_login_attempts;
    G_CONST_RETURN gchar *login_timeout;
    G_CONST_RETURN gchar *upload_bandwidth;
    G_CONST_RETURN gchar *download_bandwidth;
    G_CONST_RETURN gchar *systemlog;
    G_CONST_RETURN gchar *default_username_length;
    G_CONST_RETURN gchar *default_password_length;
    G_CONST_RETURN gchar *default_home_path;
    G_CONST_RETURN gchar *default_upload_path;
    G_CONST_RETURN gchar *default_html_path;

    /* TLS Entries */
    G_CONST_RETURN gchar *tls_protocols = NULL;
    G_CONST_RETURN gchar *tls_logfile = NULL;
    G_CONST_RETURN gchar *tls_certfile = NULL;


    /* Get settings from the entries */
    server_name = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_entry[0]));
    server_ident = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_entry[1]));
    masquerade_address = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_entry[2]));
    admin_email = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_entry[3]));
    default_home_path = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_entry[4]));
    default_upload_path = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_entry[5]));
    default_html_path = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_entry[6]));
    systemlog = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_entry[8]));
    server_user = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_entry[9]));
    server_group = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_entry[10]));
    fake_username = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_entry[11]));
    fake_groupname = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_entry[12]));

    /* Get values from the spinbuttons */
    server_port = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_spinbutton[0]));
    passive_port_1 = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_spinbutton[1]));
    passive_port_2 = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_spinbutton[2]));

    max_connect = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_spinbutton[3]));
    max_login_attempts = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_spinbutton[4]));
    login_timeout = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_spinbutton[5]));
    idle_timeout = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_spinbutton[6]));

    default_username_length = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_spinbutton[7]));
    default_password_length = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_spinbutton[8]));
    upload_bandwidth = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_spinbutton[9]));
    download_bandwidth = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_spinbutton[10]));

    /* Save the old server ident so we know if we should 
     * repopulate the server treeview */
    old_server_ident = g_strdup_printf("%s", server_ident);


    if( use_tls )
    {
	/* Get values from the TLS entries */
	tls_protocols = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_entry[13]));
	tls_logfile = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_entry[14]));
	tls_certfile = gtk_entry_get_text(GTK_ENTRY(widgets->server_set_entry[15]));

	/* Should we change the certificate entries as well ? */
    }




    address_buffer = allocate(8192+15);
    port_buffer = allocate(8192+3);               

    if( strstr((char *)global_server_type, "Virtualhost") )
      sprintf(address_buffer, "<VirtualHost %s>\n", global_server_address); 
   
    sprintf(port_buffer, "Port %s\n", global_server_port);


    if( strlen(address_buffer) == 0 && strstr((char *)global_server_type, "Virtualhost") ) 
    {
	info = g_strdup_printf(_("Refusing to change a server without a specified name.\n"));
	show_info(info);
	g_free(info);
	free(address_buffer);
	free(port_buffer);
        g_free(old_server_ident);
        return;
    }

    if( strlen(port_buffer) == 0 ) 
    {
	info = g_strdup_printf(_("Refusing to change a server without a specified port.\n"));
	show_info(info);
	g_free(info);
	free(address_buffer);
	free(port_buffer);
        g_free(old_server_ident);
        return;
    }

    /* Change the configuration for the selected server */
    if((fp=fopen(PROFTPD_CONF, "r"))==NULL)
    {
	info = g_strdup_printf(_("Cant open proftpd.conf here: \n%s\n"), PROFTPD_CONF);
	show_info(info);
	g_free(info);
	free(address_buffer);
	free(port_buffer);
        g_free(old_server_ident);
        return;
    }
    fseek(fp, 0, SEEK_END);
    conf_size = ftell(fp);
    rewind(fp);

    config = allocate(conf_size+16384); /* Additional bytes */
    old_buffer = allocate(conf_size);
    temp_server = allocate(conf_size);
    conf_line = allocate(8192);
    change_srv_ident = allocate(8192);


/* ------------- Change the standard server ----------- */

    if( strstr("Default server", (char *)global_server_type) )
    {
	configuration_changed=1;

	if( conf_size > 1 )
	while(fgets(old_buffer, conf_size, fp)!=NULL)
	{
	    if( strlen(old_buffer) > 4000 )
	    {
		info = g_strdup_printf(_("A line with over 8000 chars is not valid in: %s\n"), PROFTPD_CONF);
		show_info(info);
		g_free(info);
    		free(address_buffer);
		free(port_buffer);
		free(old_buffer);
		free(config);
		free(temp_server);
		free(conf_line);
		free(change_srv_ident);
                g_free(old_server_ident);
		fclose(fp);
		return;
	    }


	    /* Change matching server directives otherwise just gather them */
	    if( strstr(old_buffer, "<VirtualHost") || strstr(old_buffer, "<Anonymous") )
	    {
	        strcat(config, old_buffer);
	        /* When <Anonymous or <VirtualHost is found we collect all other lines to the end */
	        while(fgets(old_buffer, conf_size, fp)!=NULL)
	           strcat(config, old_buffer);
	    }
	    else
	    if( strstr(old_buffer, "ServerName") )
    	    {          	
    	        sprintf(conf_line, "ServerName \"%s\"\n", server_name);
    	        strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "ServerIdent") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[0]));
		if( active_index == 0 )
		  sprintf(conf_line, "ServerIdent on \"%s\"\n", server_ident);
		else
		  sprintf(conf_line, "ServerIdent off \"%s\"\n", server_ident);

    		strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "MasqueradeAddress") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[1]));
		if( active_index == 0 && strlen(masquerade_address) > 4 )
		  sprintf(conf_line, "MasqueradeAddress %s\n", masquerade_address);
		else
		  if( strlen(masquerade_address) > 4 )
		    sprintf(conf_line, "#MasqueradeAddress %s\n", masquerade_address);
		else
		  sprintf(conf_line, "#MasqueradeAddress None\n");

	        strcat(config, conf_line);
	    }
	    else

/* Deprecated in proftpd 1.3.0
		if( strstr(old_buffer, "SocketBindTight") )
		{
		    if( combo_selection(combo18) == 0 )
    		      sprintf(conf_line, "SocketBindTight on\n");
		    else
    		      sprintf(conf_line, "SocketBindTight off\n");

    		    strcat(config, conf_line);

		}
*/

	    if( strstr(old_buffer, "ServerAdmin") )
	    {
    	        sprintf(conf_line, "ServerAdmin %s\n", admin_email);
    	        strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "Port") && old_buffer[4]==' ' )
	    {
	        sprintf(conf_line, "Port %s\n", server_port);
	        strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "PassivePorts") )
	    {
	        sprintf(conf_line, "PassivePorts %s %s\n", passive_port_1, passive_port_2);
	        strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "MaxInstances") )
	    {
    	        sprintf(conf_line, "MaxInstances %s\n", max_connect);
    	        strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "TimeoutNoTransfer") )
	    {
    	        sprintf(conf_line, "TimeoutNoTransfer %s\n", idle_timeout);
    	        strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "TimeoutIdle") )
	    {
    	        sprintf(conf_line, "TimeoutIdle %s\n", idle_timeout);
    	        strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "AllowStoreRestart") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[10]));
		
		if( active_index == 0 )
    		  sprintf(conf_line, "AllowStoreRestart on\n");
		else
    		  sprintf(conf_line, "AllowStoreRestart off\n");
    		
		strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "AllowRetrieveRestart") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[11]));
    		if( active_index == 0 )
    		  sprintf(conf_line, "AllowRetrieveRestart on\n");
		else
    		  sprintf(conf_line, "AllowRetrieveRestart off\n");
    		
		strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "TransferRate RETR") )
	    {
    	        sprintf(conf_line, "TransferRate RETR %s\n", download_bandwidth);
    	        strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "TransferRate STOR") )
	    {
    	        sprintf(conf_line, "TransferRate STOR %s\n", upload_bandwidth);
    	        strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "TransferRate STOU") )
	    {
    	        sprintf(conf_line, "TransferRate STOU %s\n", upload_bandwidth);
    	        strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "TransferRate APPE") )
	    {
    	        sprintf(conf_line, "TransferRate APPE %s\n", upload_bandwidth);
    	        strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "IdentLookups") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[2]));
		if( active_index == 0 )
    		  sprintf(conf_line, "IdentLookups on\n");
		else
    		  sprintf(conf_line, "IdentLookups off\n");

    		strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "UseReverseDNS") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[3]));
		if( active_index == 0 )
    		  sprintf(conf_line, "UseReverseDNS on\n");
		else
    		  sprintf(conf_line, "UseReverseDNS off\n");

    		strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "DefaultTransferMode") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[5]));
		if( active_index == 0 )
    		  sprintf(conf_line, "DefaultTransferMode binary\n");
		else
    		  sprintf(conf_line, "DefaultTransferMode ascii\n");

    	        strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "User") && old_buffer[4]==' ' )
	    {
	        sprintf(conf_line, "User %s\n", server_user);
    	        strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "Group") && old_buffer[5]==' ' )
	    {
	        sprintf(conf_line, "Group %s\n", server_group);
    	        strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "DirFakeUser") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[8]));
		if( active_index == 0 )
    		  sprintf(conf_line, "DirFakeUser on %s\n", fake_username);
		else
    		  sprintf(conf_line, "DirFakeUser off %s\n", fake_username);

    		strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "DirFakeGroup") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[9]));
		if( active_index == 0 )
    		  sprintf(conf_line, "DirFakeGroup on %s\n", fake_groupname);
		else
    		  sprintf(conf_line, "DirFakeGroup off %s\n", fake_groupname);

    		strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "AllowForeignAddress") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[6]));
		if( active_index == 0 )
    		  sprintf(conf_line, "AllowForeignAddress on\n");
		else
    		  sprintf(conf_line, "AllowForeignAddress off\n");

    		strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "TimesGMT") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[4]));
		if( active_index == 0 )
    		  sprintf(conf_line, "TimesGMT on\n");
		else
    		  sprintf(conf_line, "TimesGMT off\n");

    		strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "MaxLoginAttempts") )
	    {
	        sprintf(conf_line, "MaxLoginAttempts %s\n", max_login_attempts);
    	        strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "TimeoutLogin") )
	    {
	        sprintf(conf_line, "TimeoutLogin %s\n", login_timeout);
    	        strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "DeleteAbortedStores") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[12]));
		if( active_index == 0 )
    		  sprintf(conf_line, "DeleteAbortedStores on\n");
		else
    		  sprintf(conf_line, "DeleteAbortedStores off\n");

    		strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "SystemLog") )
	    {
    	        sprintf(conf_line, "SystemLog %s\n", systemlog);
    	        strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "#gp_random_username_length") && strlen(default_username_length) <= 128 )
	    {
    	        sprintf(conf_line, "#gp_random_username_length %s\n", default_username_length);
    	        strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "#gp_random_password_length") && strlen(default_password_length) <= 128 )
	    {
    	        sprintf(conf_line, "#gp_random_password_length %s\n", default_password_length);
    	        strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "#gp_randomize_case") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[7]));
		if( active_index == 0 )
    		  sprintf(conf_line, "#gp_randomize_case upper\n");
		else
    		  sprintf(conf_line, "#gp_randomize_case lower\n");

    		strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "#gp_useradd_root_path") && strlen(default_home_path)<=8000 )
	    {
    	        sprintf(conf_line, "#gp_useradd_root_path %s\n", default_home_path);
    	        strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "#gp_useradd_upload_path") && strlen(default_upload_path)<=8000 )
	    {
    	        sprintf(conf_line, "#gp_useradd_upload_path %s\n", default_upload_path);
    	        strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "#gp_html_path") )
	    {
    	        sprintf(conf_line, "#gp_html_path %s\n", default_html_path);
    	        strcat(config, conf_line);
	    }
	    else

	    /* If using TLS */
	    if( use_tls && strstr(old_buffer, "TLSEngine") )
	    {
	        active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[13]));
	        if( active_index == 0 )
    		  sprintf(conf_line, "TLSEngine on\n");
		else
    		  sprintf(conf_line, "TLSEngine off\n");

    		strcat(config, conf_line);
	    }
	    else
    	    if( use_tls && strstr(old_buffer, "TLSRequired") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[14]));
		if( active_index == 0 )
    		  sprintf(conf_line, "TLSRequired on\n");
		else 
		if( active_index == 1 )
    		  sprintf(conf_line, "TLSRequired off\n");
		else
		if( active_index == 2 )
    		  sprintf(conf_line, "TLSRequired data\n");
		else
		if( active_index == 3 )
    	          sprintf(conf_line, "TLSRequired ctrl\n");

	        strcat(config, conf_line);
	    }
	    else
    	    if( use_tls && strstr(old_buffer, "TLSVerifyClient") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[15]));
		if( active_index == 0 )
    		  sprintf(conf_line, "TLSVerifyClient on\n");
		else
    		  sprintf(conf_line, "TLSVerifyClient off\n");

    	    	strcat(config, conf_line);
	    }
	    else
    	    if( use_tls && strstr(old_buffer, "TLSProtocol") )
	    {
    		sprintf(conf_line, "TLSProtocol %s\n", tls_protocols);
    	    	strcat(config, conf_line);
	    }
	    else
    	    if( use_tls && strstr(old_buffer, "TLSLog") )
	    {
    		    sprintf(conf_line, "TLSLog %s\n", tls_logfile);
    		    strcat(config, conf_line);
	    }
	    else
    	    if( use_tls && strstr(old_buffer, "TLSRSACertificateFile") )
	    {
    	        sprintf(conf_line, "TLSRSACertificateFile %s\n", tls_certfile);
    	        strcat(config, conf_line);
	    }   
	    else
	      strcat(config, old_buffer); /* Gather all other values */
	}
    	free(old_buffer);
    	free(address_buffer);
    	free(port_buffer);
    	free(temp_server);
    	free(conf_line);
    	free(change_srv_ident);
    	fclose(fp);
    }
/* ----------------- End of default server changes ------------------ */













/* ------------ Change a virtualhost --------------- */
    if( strstr("Virtualhost", (char *)global_server_type) )
    {
	/* Setup the address and port lines to identify it with */
	address_line = g_strdup_printf("<VirtualHost %s>\n", global_server_address);
	port_line = g_strdup_printf("Port %s\n", global_server_port);

	/* Look for these address and port lines, break if they are found */
	if( conf_size > 1 )
        while(fgets(old_buffer, conf_size, fp)!=NULL)
        {
	    if( ! strcmp(old_buffer, address_line) )
	    {
		address_match = 1;

		/* Save the old server name line */
		snprintf(temp_server, 1024, "%s", old_buffer);

		/* Go to the next line where we expect Port to be */
    		while(fgets(old_buffer, conf_size, fp)!=NULL)
		    break;

		if( address_match && ! strcmp(old_buffer, port_line) )
		{
		    port_match = 1;
		    
		    /* Put the new conf settings */
		    g_free(address_line); g_free(port_line);
		    address_line = g_strdup_printf("<VirtualHost %s>\n", server_name);
		    port_line = g_strdup_printf("Port %s\n", server_port);
		    strcat(config, address_line);
		    strcat(config, port_line);
		    break;
		}
		else /* This was not the correct server */
		  {
		      address_match = 0;
		      port_match = 0;
		      /* Put back the old server and port lines */
		      strcat(config, temp_server);
		      strcat(config, old_buffer);		  
		  }
	    }
	    else
	      /* Put back all other lines */
	      strcat(config, old_buffer);
	}

	g_free(address_line); g_free(port_line);



	/* Couldnt find the server */
	if( ! address_match || ! port_match )
	{
	    printf("The virtualhost was not found, no changes where made\n");
	    free(old_buffer);
	    free(config);
	    free(address_buffer);
	    free(port_buffer);
	    free(temp_server);
	    free(conf_line);
	    free(change_srv_ident);
            g_free(old_server_ident);
	    fclose(fp);
	    return;
	}


	/* Change the rest of the values in this vhost */
	if( conf_size > 1 )
        while(fgets(old_buffer, conf_size, fp)!=NULL)
        {
	    if( strlen(old_buffer) > 4000 )
	      continue;

	    /* The end of what we want to change has been reached, 
	     * add this end line and everything else */
	    if( strstr(old_buffer, "</VirtualHost") 
	    || strstr(old_buffer, "<Anonymous")     )
	    {
		/* This server will dissapear if it has no ending */

		configuration_changed=1;

		/* Add the end of this server */
	        strcat(config, old_buffer);

		/* At the end of the VirtualHost, copy everything else  */
	    	while(fgets(old_buffer, conf_size, fp)!=NULL)
    		   strcat(config, old_buffer);
	    }
	    else
	    /* We have the server name and port in the conf already */
	    if( strstr(old_buffer, "ServerName") )
	    {
    	        sprintf(conf_line, "ServerName \"%s\"\n", server_name);
    	        strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "ServerIdent") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[0]));
		if( active_index == 0 )
		  sprintf(conf_line, "ServerIdent on \"%s\"\n", server_ident);
		else
		  sprintf(conf_line, "ServerIdent off \"%s\"\n", server_ident);

    		strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "MasqueradeAddress") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[1]));
		if( active_index == 0 && strlen(masquerade_address) > 4 )
		  sprintf(conf_line, "MasqueradeAddress %s\n", masquerade_address);
		else
		  if( strlen(masquerade_address) > 4 )
		    sprintf(conf_line, "#MasqueradeAddress %s\n", masquerade_address);
		else
		  sprintf(conf_line, "#MasqueradeAddress None\n");

	        strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "ServerAdmin") )
	    {
    	        sprintf(conf_line, "ServerAdmin %s\n", admin_email);
    	        strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "PassivePorts") )
	    {
	        sprintf(conf_line, "PassivePorts %s %s\n", passive_port_1, passive_port_2);
	        strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "MaxInstances") )
	    {
    	        sprintf(conf_line, "MaxInstances %s\n", max_connect);
    	        strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "TimeoutNoTransfer") )
	    {
    	        sprintf(conf_line, "TimeoutNoTransfer %s\n", idle_timeout);
    	        strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "TimeoutIdle") )
	    {
    	        sprintf(conf_line, "TimeoutIdle %s\n", idle_timeout);
    	        strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "AllowStoreRestart") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[10]));
		
		if( active_index == 0 )
    		  sprintf(conf_line, "AllowStoreRestart on\n");
		else
    		  sprintf(conf_line, "AllowStoreRestart off\n");
    		
		strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "AllowRetrieveRestart") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[11]));
    		if( active_index == 0 )
    		  sprintf(conf_line, "AllowRetrieveRestart on\n");
		else
    		  sprintf(conf_line, "AllowRetrieveRestart off\n");
    		
		strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "TransferRate RETR") )
	    {
    	        sprintf(conf_line, "TransferRate RETR %s\n", download_bandwidth);
    	        strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "TransferRate STOR") )
	    {
    	        sprintf(conf_line, "TransferRate STOR %s\n", upload_bandwidth);
    	        strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "TransferRate STOU") )
	    {
    	        sprintf(conf_line, "TransferRate STOU %s\n", upload_bandwidth);
    	        strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "TransferRate APPE") )
	    {
    	        sprintf(conf_line, "TransferRate APPE %s\n", upload_bandwidth);
    	        strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "IdentLookups") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[2]));
		if( active_index == 0 )
    		  sprintf(conf_line, "IdentLookups on\n");
		else
    		  sprintf(conf_line, "IdentLookups off\n");

    		strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "UseReverseDNS") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[3]));
		if( active_index == 0 )
    		  sprintf(conf_line, "UseReverseDNS on\n");
		else
    		  sprintf(conf_line, "UseReverseDNS off\n");

    		strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "DefaultTransferMode") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[5]));
		if( active_index == 0 )
    		  sprintf(conf_line, "DefaultTransferMode binary\n");
		else
    		  sprintf(conf_line, "DefaultTransferMode ascii\n");

    	        strcat(config, conf_line);
	    }
	    else
	    if( strstr(old_buffer, "User") && old_buffer[4]==' ' )
	    {
	        sprintf(conf_line, "User %s\n", server_user);
    	        strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "Group") && old_buffer[5]==' ' )
	    {
	        sprintf(conf_line, "Group %s\n", server_group);
    	        strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "DirFakeUser") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[8]));
		if( active_index == 0 )
    		  sprintf(conf_line, "DirFakeUser on %s\n", fake_username);
		else
    		  sprintf(conf_line, "DirFakeUser off %s\n", fake_username);

    		strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "DirFakeGroup") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[9]));
		if( active_index == 0 )
    		  sprintf(conf_line, "DirFakeGroup on %s\n", fake_groupname);
		else
    		  sprintf(conf_line, "DirFakeGroup off %s\n", fake_groupname);

    		strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "AllowForeignAddress") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[6]));
		if( active_index == 0 )
    		  sprintf(conf_line, "AllowForeignAddress on\n");
		else
    		  sprintf(conf_line, "AllowForeignAddress off\n");

    		strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "TimesGMT") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[4]));
		if( active_index == 0 )
    		  sprintf(conf_line, "TimesGMT on\n");
		else
    		  sprintf(conf_line, "TimesGMT off\n");

    		strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "MaxLoginAttempts") )
	    {
	        sprintf(conf_line, "MaxLoginAttempts %s\n", max_login_attempts);
    	        strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "TimeoutLogin") )
	    {
	        sprintf(conf_line, "TimeoutLogin %s\n", login_timeout);
    	        strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "DeleteAbortedStores") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[12]));
		if( active_index == 0 )
    		  sprintf(conf_line, "DeleteAbortedStores on\n");
		else
    		  sprintf(conf_line, "DeleteAbortedStores off\n");

    		strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "SystemLog") )
	    {
    	        sprintf(conf_line, "SystemLog %s\n", systemlog);
    	        strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "#gp_random_username_length") && strlen(default_username_length) <= 128 )
	    {
    	        sprintf(conf_line, "#gp_random_username_length %s\n", default_username_length);
    	        strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "#gp_random_password_length") && strlen(default_password_length) <= 128 )
	    {
    	        sprintf(conf_line, "#gp_random_password_length %s\n", default_password_length);
    	        strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "#gp_randomize_case") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[7]));
		if( active_index == 0 )
    		  sprintf(conf_line, "#gp_randomize_case upper\n");
		else
    		  sprintf(conf_line, "#gp_randomize_case lower\n");

    		strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "#gp_useradd_root_path") && strlen(default_home_path)<=8000 )
	    {
    	        sprintf(conf_line, "#gp_useradd_root_path %s\n", default_home_path);
    	        strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "#gp_useradd_upload_path") && strlen(default_upload_path)<=8000 )
	    {
    	        sprintf(conf_line, "#gp_useradd_upload_path %s\n", default_upload_path);
    	        strcat(config, conf_line);
	    }
	    else
    	    if( strstr(old_buffer, "#gp_html_path") )
	    {
    	        sprintf(conf_line, "#gp_html_path %s\n", default_html_path);
    	        strcat(config, conf_line);
	    }
	    else

	    /* If using TLS */
	    if( use_tls && strstr(old_buffer, "TLSEngine") )
	    {
	        active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[13]));
	        if( active_index == 0 )
    		  sprintf(conf_line, "TLSEngine on\n");
		else
    		  sprintf(conf_line, "TLSEngine off\n");

    		strcat(config, conf_line);
	    }
	    else
    	    if( use_tls && strstr(old_buffer, "TLSRequired") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[14]));
		if( active_index == 0 )
    		  sprintf(conf_line, "TLSRequired on\n");
		else 
		if( active_index == 1 )
    		  sprintf(conf_line, "TLSRequired data\n");
		else
		if( active_index == 2 )
    		  sprintf(conf_line, "TLSRequired ctrl\n");
		else
		if( active_index == 3 )
    	          sprintf(conf_line, "TLSRequired off\n");

	        strcat(config, conf_line);
	    }
	    else
    	    if( use_tls && strstr(old_buffer, "TLSVerifyClient") )
	    {
		active_index = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->server_set_combo[15]));
		if( active_index == 0 )
    		  sprintf(conf_line, "TLSVerifyClient on\n");
		else
    		  sprintf(conf_line, "TLSVerifyClient off\n");

    	    	strcat(config, conf_line);
	    }
	    else
    	    if( use_tls && strstr(old_buffer, "TLSProtocol") )
	    {
    		sprintf(conf_line, "TLSProtocol %s\n", tls_protocols);
    	    	strcat(config, conf_line);
	    }
	    else
    	    if( use_tls && strstr(old_buffer, "TLSLog") )
	    {
    		    sprintf(conf_line, "TLSLog %s\n", tls_logfile);
    		    strcat(config, conf_line);
	    }
	    else
    	    if( use_tls && strstr(old_buffer, "TLSRSACertificateFile") )
	    {
    	        sprintf(conf_line, "TLSRSACertificateFile %s\n", tls_certfile);
    	        strcat(config, conf_line);
	    }   
	    else
	      strcat(config, old_buffer); /* Gather all other values */
	}
	free(old_buffer);
	free(address_buffer);
	free(temp_server);
	free(port_buffer);
	free(change_srv_ident);
	free(conf_line);
        fclose(fp);
    }   /* If it was a vhost */



    /* Write the new config if any changes where made */
    if( configuration_changed )
    {
	/* Make a space left check here */
	if((fp=fopen(PROFTPD_CONF, "w+"))==NULL)
	{
            g_free(old_server_ident);
	    free(config);
    	    return;
	}
	fputs(config, fp);
	fclose(fp);
	free(config);
    }
    else
      {
	   g_free(old_server_ident);
	   free(config);
    	   return;
      }


    /* The server address, ident or port hasnt changed, dont populate_servers */
    if( ! strcmp(global_server_address, server_name) 
    &&  ! strcmp(old_server_ident, server_ident)
    &&  ! strcmp(global_server_port, server_port)    )
    {
    }
    else
      {
	 /* Populate the server treeview */
	 populate_servers(widgets);

	 /* Select the first server and set global server values */    
	 select_first_server(widgets);
      }    

    g_free(old_server_ident);

    /* Populate the server settings */    
    populate_server_settings(widgets);

    populate_conf_tab(widgets);

    /* Update the server */
    reread_conf(widgets);
}
