2013-06-24 13:41:48 +02:00
/ * Copyright ( c ) Citrix Systems Inc .
* All rights reserved .
*
* Redistribution and use in source and binary forms ,
* with or without modification , are permitted provided
* that the following conditions are met :
*
* * Redistributions of source code must retain the above
* copyright notice , this list of conditions and the
* following disclaimer .
* * Redistributions in binary form must reproduce the above
* copyright notice , this list of conditions and the
* following disclaimer in the documentation and / or other
* materials provided with the distribution .
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES ,
* INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL ,
* SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING ,
* BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS
* INTERRUPTION ) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY ,
* WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT ( INCLUDING
* NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE .
* /
using System ;
using System.Collections.Generic ;
using System.ComponentModel ;
using System.Drawing ;
using System.Data ;
using System.Text ;
using System.Windows.Forms ;
using XenAdmin.Properties ;
2015-08-24 13:51:46 +02:00
using XenAdmin.Actions ;
2013-06-24 13:41:48 +02:00
using XenAPI ;
using System.Text.RegularExpressions ;
2016-06-20 18:15:00 +02:00
using XenAdmin.Core ;
2013-06-24 13:41:48 +02:00
namespace XenAdmin.Dialogs.OptionsPages
{
public partial class ConnectionOptionsPage : UserControl , IOptionsPage
{
private const string ConnectionTabSettingsHeader = "Connection Tab Settings -" ;
private static readonly log4net . ILog log = log4net . LogManager . GetLogger ( System . Reflection . MethodBase . GetCurrentMethod ( ) . DeclaringType ) ;
private OptionsDialog optionsDialog ;
2016-06-20 18:15:00 +02:00
// used for preventing the event handlers (mainly the SelectUseThisProxyServer function) from being called when loading the settings into the text/check boxes
private bool built = false ;
2013-06-24 13:41:48 +02:00
public ConnectionOptionsPage ( )
{
InitializeComponent ( ) ;
build ( ) ;
}
public OptionsDialog OptionsDialog
{
set { this . optionsDialog = value ; }
}
private void build ( )
{
// Proxy server
switch ( Properties . Settings . Default . ProxySetting )
{
case 0 :
DirectConnectionRadioButton . Checked = true ;
break ;
case 1 :
UseIERadioButton . Checked = true ;
break ;
case 2 :
UseProxyRadioButton . Checked = true ;
break ;
default :
DirectConnectionRadioButton . Checked = true ;
break ;
}
2016-06-20 18:15:00 +02:00
ProxyAddressTextBox . Text = Properties . Settings . Default . ProxyAddress ;
ProxyPortTextBox . Text = Properties . Settings . Default . ProxyPort . ToString ( ) ;
BypassForServersCheckbox . Checked = Properties . Settings . Default . BypassProxyForServers ;
AuthenticationCheckBox . Checked = Properties . Settings . Default . ProvideProxyAuthentication ;
// checks for empty default username/password which starts out unencrypted
string protectedUsername = Properties . Settings . Default . ProxyUsername ;
ProxyUsernameTextBox . Text = string . IsNullOrEmpty ( protectedUsername ) ? "" : EncryptionUtils . Unprotect ( Properties . Settings . Default . ProxyUsername ) ;
string protectedPassword = Properties . Settings . Default . ProxyPassword ;
ProxyPasswordTextBox . Text = string . IsNullOrEmpty ( protectedPassword ) ? "" : EncryptionUtils . Unprotect ( Properties . Settings . Default . ProxyPassword ) ;
ConnectionTimeoutNud . Value = Properties . Settings . Default . ConnectionTimeout / 1000 ;
2013-06-24 13:41:48 +02:00
2016-06-20 18:15:00 +02:00
built = true ;
2013-06-24 13:41:48 +02:00
}
private void UseProxyRadioButton_CheckedChanged ( object sender , EventArgs e )
{
2016-06-20 18:15:00 +02:00
enableOK ( ) ;
}
private void AuthenticationCheckBox_CheckedChanged ( object sender , EventArgs e )
{
if ( ! AuthenticationCheckBox . Checked )
{
ProxyUsernameTextBox . Clear ( ) ;
ProxyPasswordTextBox . Clear ( ) ;
AuthenticationCheckBox . Checked = false ; // have to redo this as the 2 Clears above cause the checkbox to recheck
}
SelectUseThisProxyServer ( ) ;
2013-06-24 13:41:48 +02:00
enableOK ( ) ;
}
private void ProxyAddressTextBox_TextChanged ( object sender , EventArgs e )
{
2016-06-20 18:15:00 +02:00
SelectUseThisProxyServer ( ) ;
2013-06-24 13:41:48 +02:00
enableOK ( ) ;
}
private void ProxyPortTextBox_TextChanged ( object sender , EventArgs e )
{
2016-06-20 18:15:00 +02:00
SelectUseThisProxyServer ( ) ;
enableOK ( ) ;
}
private void ProxyUsernameTextBox_TextChanged ( object sender , EventArgs e )
{
SelectUseThisProxyServer ( ) ;
if ( ! AuthenticationCheckBox . Checked )
AuthenticationCheckBox . Checked = true ;
enableOK ( ) ;
}
private void ProxyPasswordTextBox_TextChanged ( object sender , EventArgs e )
{
SelectUseThisProxyServer ( ) ;
if ( ! AuthenticationCheckBox . Checked )
AuthenticationCheckBox . Checked = true ;
enableOK ( ) ;
}
private void BypassForServersCheckbox_CheckedChanged ( object sender , EventArgs e )
{
SelectUseThisProxyServer ( ) ;
2013-06-24 13:41:48 +02:00
enableOK ( ) ;
}
2016-06-20 18:15:00 +02:00
private void SelectUseThisProxyServer ( )
{
if ( ! UseProxyRadioButton . Checked & & built )
UseProxyRadioButton . Checked = true ;
}
2013-06-24 13:41:48 +02:00
private void enableOK ( )
{
if ( optionsDialog = = null )
return ;
if ( ! UseProxyRadioButton . Checked )
{
optionsDialog . okButton . Enabled = true ;
return ;
}
2016-06-20 18:15:00 +02:00
else if ( AuthenticationCheckBox . Checked & & string . IsNullOrEmpty ( ProxyUsernameTextBox . Text ) )
{
optionsDialog . okButton . Enabled = false ;
return ;
}
2013-06-24 13:41:48 +02:00
try
{
2014-11-27 16:29:29 +01:00
if ( ! Util . IsValidPort ( ProxyPortTextBox . Text ) )
{
optionsDialog . okButton . Enabled = false ;
return ;
}
2015-10-02 14:13:01 +02:00
var uriHostNameType = Uri . CheckHostName ( ProxyAddressTextBox . Text ) ;
optionsDialog . okButton . Enabled = uriHostNameType ! = UriHostNameType . Unknown & & uriHostNameType ! = UriHostNameType . IPv6 ;
return ;
2013-06-24 13:41:48 +02:00
}
catch
{
optionsDialog . okButton . Enabled = false ;
}
}
public static void Log ( )
{
log . Info ( ConnectionTabSettingsHeader ) ;
// Proxy server
log . Info ( "=== ProxySetting: " + Properties . Settings . Default . ProxySetting . ToString ( ) ) ;
log . Info ( "=== ProxyAddress: " + Properties . Settings . Default . ProxyAddress . ToString ( ) ) ;
log . Info ( "=== ProxyPort: " + Properties . Settings . Default . ProxyPort . ToString ( ) ) ;
2016-06-20 18:15:00 +02:00
log . Info ( "=== ByPassProxyForServers: " + Properties . Settings . Default . BypassProxyForServers . ToString ( ) ) ;
log . Info ( "=== ProvideProxyAuthentication: " + Properties . Settings . Default . ProvideProxyAuthentication . ToString ( ) ) ;
2013-06-24 13:41:48 +02:00
log . Info ( "=== ConnectionTimeout: " + Properties . Settings . Default . ConnectionTimeout . ToString ( ) ) ;
}
#region IOptionsPage Members
public void Save ( )
{
2016-06-20 18:15:00 +02:00
// Proxy server settings
2013-06-24 13:41:48 +02:00
HTTPHelper . ProxyStyle new_proxy_style =
DirectConnectionRadioButton . Checked ? HTTPHelper . ProxyStyle . DirectConnection :
UseIERadioButton . Checked ? HTTPHelper . ProxyStyle . SystemProxy :
HTTPHelper . ProxyStyle . SpecifiedProxy ;
if ( Properties . Settings . Default . ProxySetting ! = ( int ) new_proxy_style )
Properties . Settings . Default . ProxySetting = ( int ) new_proxy_style ;
2016-06-20 18:15:00 +02:00
if ( ProxyAddressTextBox . Text ! = Properties . Settings . Default . ProxyAddress & & ! string . IsNullOrEmpty ( ProxyAddressTextBox . Text ) )
2013-06-24 13:41:48 +02:00
Properties . Settings . Default . ProxyAddress = ProxyAddressTextBox . Text ;
2016-06-20 18:15:00 +02:00
Properties . Settings . Default . ProxyUsername = EncryptionUtils . Protect ( ProxyUsernameTextBox . Text ) ;
Properties . Settings . Default . ProxyPassword = EncryptionUtils . Protect ( ProxyPasswordTextBox . Text ) ;
try
{
int port = int . Parse ( ProxyPortTextBox . Text ) ;
if ( port ! = Properties . Settings . Default . ProxyPort )
Properties . Settings . Default . ProxyPort = port ;
}
catch
2013-06-24 13:41:48 +02:00
{
2016-06-20 18:15:00 +02:00
Properties . Settings . Default . ProxyPort = 80 ;
2013-06-24 13:41:48 +02:00
}
2016-06-20 18:15:00 +02:00
if ( BypassForServersCheckbox . Checked ! = Properties . Settings . Default . BypassProxyForServers )
Properties . Settings . Default . BypassProxyForServers = BypassForServersCheckbox . Checked ;
if ( AuthenticationCheckBox . Checked ! = Properties . Settings . Default . ProvideProxyAuthentication )
Properties . Settings . Default . ProvideProxyAuthentication = AuthenticationCheckBox . Checked ;
// timeout settings
2013-06-24 13:41:48 +02:00
int timeout = ( int ) ConnectionTimeoutNud . Value ;
if ( timeout * 1000 ! = Properties . Settings . Default . ConnectionTimeout )
{
Properties . Settings . Default . ConnectionTimeout = timeout * 1000 ;
}
Program . ReconfigureConnectionSettings ( ) ;
2015-08-24 13:51:46 +02:00
new TransferProxySettingsAction ( ( HTTPHelper . ProxyStyle ) Properties . Settings . Default . ProxySetting ,
Properties . Settings . Default . ProxyAddress ,
Properties . Settings . Default . ProxyPort ,
Properties . Settings . Default . ConnectionTimeout ,
2016-06-20 18:15:00 +02:00
false ,
2016-06-22 14:05:21 +02:00
Properties . Settings . Default . BypassProxyForServers ,
Properties . Settings . Default . ProvideProxyAuthentication ,
2016-06-22 18:10:25 +02:00
Properties . Settings . Default . ProxyUsername ,
Properties . Settings . Default . ProxyPassword ) . RunAsync ( ) ;
2013-06-24 13:41:48 +02:00
}
#endregion
#region VerticalTab Members
public override string Text
{
get { return Messages . CONNECTION ; }
}
public string SubText
{
get { return Messages . CONNECTION_DESC ; }
}
public Image Image
{
get { return Resources . _000_Network_h32bit_16 ; }
}
#endregion
}
}