I have now understood how do RestorePreferences/SavePreferences work and
I have improved the patch.
Youness Alaoui wrote:
> Hi,
> Thanks for the patch and for giving a detailed explanation
> of your changes...
> however, I see two problems :
> 1 - code duplication.. it would be better to have the code
> that checks for the system configs in config.tcl after we
> loadProfile... this way, the code will be there only one...
> Also, make sure that the option for 'use system settings'
> would only be available when it is actually possible to
> check user settings (on mac, windows, do not show the
> option)..
> also note that it might be confusing if someone has old
> settings for gnome, and is using KDE, and amsn takes gnome
> settings instead of his new KDE settings... maybe check for
> the $::env(DESKTOP) variable too...
>
> Thanks again for the contribution!
>
> KaKaRoTo
>
--
Regards, Pablo.
Index: lang/langen
===================================================================
--- lang/langen (revisión: 11112)
+++ lang/langen (copia de trabajo)
@@ -940,6 +940,7 @@
subject Subject
svnversion SVN Version
syntaxerror Syntax Error
+systemconnection Use system proxy settings
tabbedglobal A tabbed window for all users in the contact list
tabbedgroups A tabbed window for users from the same group
tabbed Tabbed Windows
Index: lang/langes
===================================================================
--- lang/langes (revisión: 11112)
+++ lang/langes (copia de trabajo)
@@ -941,6 +941,7 @@
subjectrequired Asunto requerido
svnversion Versión SVN
syntaxerror Error de sintaxis
+systemconnection Usar los datos de proxy del sistema
tabbedglobal Una ventana con pestañas para todos los usuarios
tabbedgroups Una ventana con pestañas para cada grupo
tabbed Ventanas con pestañas
Index: login_screen.tcl
===================================================================
--- login_screen.tcl (revisión: 11112)
+++ login_screen.tcl (copia de trabajo)
@@ -786,6 +786,10 @@
CreateProfile $user
}
+ if {[OnUnix] && [::config::getKey usesystemproxy] == 1} {
+ load_unix_system_proxy
+ }
+
# Login with them
$self login $user $pass
}
Index: preferences.tcl
===================================================================
--- preferences.tcl (revisión: 11112)
+++ preferences.tcl (copia de trabajo)
@@ -2221,6 +2221,11 @@
grid $lfname.4.ssl -row 1 -column 2 -sticky w -pady 5 -padx 10
grid $lfname.4.socks5 -row 1 -column 3 -sticky w -pady 5 -padx 10
+ #Only show this option if the OS supports a system-wide proxy
configuration.
+ if { [OnUnix] } {
+ checkbutton $lfname.4.system -text "[trans systemconnection]"
-onvalue 1 -offvalue 0 -variable [::config::getVar usesystemproxy] -command
UpdatePreferences
+ grid $lfname.4.system -row 1 -column 4 -sticky w -pady 5 -padx
10
+ }
label $lfname.5.lserver -text "[trans server] :" -padx 5 -font sboldf
entry $lfname.5.server -font splainf -width 20 -textvariable
proxy_server
@@ -3108,11 +3113,11 @@
$lfname.lfname2.statelist.box insert end [lindex [StateList get
$idx] 0]
}
- # Fill the user's lists
- #set lfname [Rnotebook:frame $nb $Preftabs(privacy)]
+ # Fill the user's lists
+ #set lfname [Rnotebook:frame $nb $Preftabs(privacy)]
set lfname [$nb.nn getframe privacy]
set lfname [$lfname.sw.sf getframe]
- Fill_users_list "$lfname.lfname" "$lfname.lfname2"
+ Fill_users_list "$lfname.lfname" "$lfname.lfname2"
}
@@ -3120,7 +3125,9 @@
# This is where the preferences entries get enabled disabled
proc UpdatePreferences {} {
global Preftabs
-
+ global proxy_server proxy_port proxy_user proxy_pass
+ global saved_settings was_system
+
set nb .cfg.notebook
#fonts
@@ -3164,8 +3171,14 @@
$lfname.4.post configure -state normal
$lfname.4.ssl configure -state disable
$lfname.4.socks5 configure -state normal
+ $lfname.4.system configure -state normal
$lfname.5.server configure -state normal
$lfname.5.port configure -state normal
+
+ if { ![info exists was_system] } {
+ set was_system [::config::getKey usesystemproxy]
+ }
+
if { [::config::getKey proxytype] == "socks5" ||
[::config::getKey proxytype] == "http"} {
$lfname.5.user configure -state normal
$lfname.5.pass configure -state normal
@@ -3173,10 +3186,45 @@
$lfname.5.user configure -state disabled
$lfname.5.pass configure -state disabled
}
+
+ if { [::config::getKey usesystemproxy] == 1 } {
+
+ if { $was_system == 0 } {
+ set saved_settings [list $proxy_server
$proxy_port [::config::getKey proxyauthenticate] $proxy_user $proxy_pass]
+ }
+
+ load_unix_system_proxy
+ $lfname.5.server configure -state disabled
+ $lfname.5.port configure -state disabled
+ $lfname.5.user configure -state disabled
+ $lfname.5.pass configure -state disabled
+ } else {
+
+ if { [info exists saved_settings] } {
+ set proxy_server [lindex $saved_settings 0]
+ set proxy_port [lindex $saved_settings 1]
+ ::config::setKey proxyauthenticate [lindex
$saved_settings 2]
+ set proxy_user [lindex $saved_settings 3]
+ set proxy_pass [lindex $saved_settings 4]
+ } elseif { [::config::getKey usesystemproxy] == 0 &&
$was_system == 1 } {
+ set proxy_server ""
+ set proxy_port 8080
+ ::config::setKey proxyauthenticate 0
+ set proxy_user ""
+ set proxy_pass ""
+ }
+
+ }
+
+ if { $was_system == 0 || [::config::getKey usesystemproxy] == 0
} {
+ set was_system [::config::getKey usesystemproxy]
+ }
+
} else {
$lfname.4.post configure -state disabled
$lfname.4.ssl configure -state disabled
$lfname.4.socks5 configure -state disabled
+ $lfname.4.system configure -state disabled
$lfname.5.server configure -state disabled
$lfname.5.port configure -state disabled
$lfname.5.user configure -state disabled
@@ -3249,6 +3297,7 @@
proc SavePreferences {} {
global auto_path HOME2 tlsinstalled
global myconfig proxy_server proxy_port list_BLP temp_BLP Preftabs
libtls proxy_user proxy_pass pager locale_codes
+ global saved_settings was_system
set nb .cfg.notebook
@@ -3279,6 +3328,9 @@
::config::setKey proxyauthenticate 0
}
+ catch { unset saved_settings }
+ catch { unset was_system }
+
if {![string is digit [::config::getKey initialftport]] || [string
length [::config::getKey initialftport]] == 0 } {
::config::setKey initialftport 6891
}
@@ -3450,7 +3502,11 @@
if { $win != ".cfg" } { return }
global myconfig proxy_server proxy_port
-
+ global saved_settings was_system
+
+ catch { unset saved_settings }
+ catch { unset was_system }
+
::config::setAll [array get myconfig]
array unset myconfig
Index: config.tcl
===================================================================
--- config.tcl (revisión: 11112)
+++ config.tcl (copia de trabajo)
@@ -33,6 +33,7 @@
::config::setKey proxyauthenticate 0 ;# SOCKS5 use
username/password
::config::setKey proxyuser "" ;# user and password
for SOCKS5 proxy
::config::setKey proxypass "" ;#
+ ::config::setKey usesystemproxy 0 ;#System-wide proxy
configuration
::config::setKey sound 1 ;#Sound
enabled: 0|1
::config::setKey mailcommand "" ;#Command for checking
mail. Blank for hotmail
@@ -836,6 +837,205 @@
}
+
+#Original by Isma from desktop_integration plugin
+#Modified by PabloCastellano
+#######################################################################
+# It says which desktop are we using, and so, what program #
+# Return values: gnome, kde, xfce, unknown #
+#######################################################################
+proc WhichDesktop {} {
+ variable plugin_name
+ global env
+
+ # Find zenity and kdialog
+ catch {exec which zenity} zenity_path
+ catch {exec which kdialog} kdialog_path
+
+ #See which one of the programs do we have
+ set has_zenity [file executable $zenity_path ]
+ set has_kdialog [file executable $kdialog_path ]
+
+ #If we only have one of them, we choose it
+ if {$has_zenity && !$has_kdialog} {
+ status_log "Found Gnome" red
+ return "gnome"
+ } elseif {!$has_zenity && $has_kdialog} {
+ status_log "Found KDE" red
+ return "kde"
+ } elseif {!$has_zenity && !$has_kdialog} {
+ # If no program is installed, we return 'noone'
+ status_log "Found neither Gnome nor KDE" red
+ return "unknown"
+ }
+
+ # If both of them are installed, we guess the desktop
+ status_log "Found both Gnome and KDE" red
+
+ # First, see if environment var exists
+ if { [info exists env(DESKTOP_SESSION)] } {
+ set session_var $env(DESKTOP_SESSION)
+
+ if {$session_var == "gnome" || $session_var == "kde" ||
$session_var == "xfce"} {
+ return $session_var
+ }
+ }
+
+ # If the variable doesn't help, let's see the number of processes
+ if { [catch {exec ps -A | grep gnome | wc -l} n_gnome] } {
+ set n_gnome 0
+ }
+
+ if { [catch {exec ps -A | grep kde | wc -l} n_kde] } {
+ set n_kde 0
+ }
+
+ if {$n_gnome >= $n_kde} {
+ return "gnome"
+ } else {
+ return "kde"
+ }
+
+}
+
+
+#Returns a gnome gconf key
+proc get_gconf_key { key {default ""} } {
+
+ if { ! [catch { eval [concat [list "exec"] "gconftool -g $key"]} value
] } {
+ return $value
+ } else {
+ return $default
+ }
+
+}
+
+
+#Returns a kde kconf key
+proc get_kconf_key { rcfile group key {default ""} } {
+
+ set command "kreadconfig --file $rcfile --group $group --key $key
--default $default"
+ catch { eval [concat [list "exec"] $command]} value
+ return value
+
+}
+
+#///////////////////////////////////////////////////////////////////////////////
+# System-wide proxy settings by PabloCastellano
+# It first tries to get the configuration from your windows manager and if it
+# fails then it tries to get envvar $http_proxy
+# Also note that $::env(http_proxy) will only exist if amsn is launched from a
terminal
+# and that won't be updated until you open a new terminal.
+proc load_unix_system_proxy {} {
+
+ global proxy_server proxy_port proxy_user proxy_pass proxyauthenticate
+
+ set mydesktop [WhichDesktop]
+ set g_proxymode [get_gconf_key "/system/proxy/mode" PROXYERROR]
+ set k_proxymode [get_kconf_key kioslaverc "Proxy Settings" ProxyType
PROXYERROR]
+
+ if { $mydesktop == "gnome" && $g_proxymode != "PROXYERROR"} {
+
+ #Maybe use_same_proxy and autoconfig_url keys should be
considered in future.
+ status_log "systemproxy: using gconf\n" red
+
+ set usehttp [get_gconf_key "/system/http_proxy/use_http_proxy"]
+
+ if {$usehttp == "true"} {
+ #Should I check if the returned data is valid?
+ if { [::config::getKey proxytype] == "http" } {
+ set proxy_server [get_gconf_key
"/system/http_proxy/host"]
+ set proxy_port [get_gconf_key
"/system/http_proxy/port"]
+ set proxyauth [get_gconf_key
"/system/http_proxy/use_authentication"]
+ } else {
+ #socks...
+ set proxy_server [get_gconf_key "/system/proxy/socks_host"]
+ set proxy_port [get_gconf_key "/system/proxy/socks_port"]
+ set proxyauth [get_gconf_key
"/system/http_proxy/use_authentication"]
+ }
+
+ if {$proxyauth == "true"} {
+ set proxyauthenticate 1
+ set proxy_user [get_gconf_key
"/system/http_proxy/authentication_user"]
+ set proxy_pass [get_gconf_key
"/system/http_proxy/authentication_password"]
+ } else {
+ set proxyauthenticate 0
+ set proxy_user ""
+ set proxy_pass ""
+ }
+
+ } else {
+ #Configure as direct. (use_http_proxy == "false" ||
mode == "none")
+ set proxy_server ""
+ set proxy_port ""
+ set proxyauthenticate 0
+ set proxy_user ""
+ set proxy_pass ""
+ }
+
+ #TODO: Improve KDE authentication support.
+ } elseif { $mydesktop == "kde" && $k_proxymode != "PROXYERROR" } {
+
+ status_log "systemproxy: using kconf\n" red
+ set proxy [get_kconf_key kioslaverc "Proxy Settings" httpProxy]
+
+ if { $k_proxymode == 1 && $proxy != "" } {
+ #regexp. http://%s:%...@%s:%d
+ regsub
{^(?:(?:[^:/?#]+):)?(?://(?:(?:(?:([^:@]*):?([^:@]*))?@)?([^:/?#]*)(?::(\d*).*)?))?}
$proxy {"\1" "\2" "\3" "\4"} result
+ set proxy_user [lindex $result 0]
+ set proxy_pass [lindex $result 1]
+ set proxy_server [lindex $result 2]
+ set proxy_port [lindex $result 3]
+
+ set proxyauthenticate [get_kconf_key kioslaverc "Proxy
Settings" AuthMode]
+
+ } else {
+ #Configure as direct.
+ set proxy_server ""
+ set proxy_port ""
+ set proxyauthenticate 0
+ set proxy_user ""
+ set proxy_pass ""
+ }
+
+ } elseif { [info exists ::env(http_proxy)] } {
+ status_log "systemproxy: using
\$http_proxy=$::env(http_proxy)\n" red
+ #regexp. http://%s:%...@%s:%d
+ regsub
{^(?:(?:[^:/?#]+):)?(?://(?:(?:(?:([^:@]*):?([^:@]*))?@)?([^:/?#]*)(?::(\d*).*)?))?}
$::env(http_proxy) {"\1" "\2" "\3" "\4"} result
+
+ set proxy_user [lindex $result 0]
+ set proxy_pass [lindex $result 1]
+ set proxy_server [lindex $result 2]
+ set proxy_port [lindex $result 3]
+
+ if { [llength $proxy_user] == 0 } {
+ set proxyauthenticate 0
+ } else {
+ set proxyauthenticate 1
+ }
+
+ } else { #it's not gnome nor kde and ENV $http_proxy is not set. =>
Don't use proxy
+ status_log "systemproxy: couldn't find any system proxy
configuration\n" red
+
+ #Configure as direct
+ set proxy_server ""
+ set proxy_port ""
+ set proxyauthenticate 0
+ set proxy_user ""
+ set proxy_pass ""
+ }
+
+ #This is needed for autoconnect
+ ::config::setKey proxy [list $proxy_server $proxy_port]
+
+ #Print result
+ status_log "systemproxy: host is: $proxy_server\n" red
+ status_log "systemproxy: port is: $proxy_port\n" red
+ status_log "systemproxy: auth is: $proxyauthenticate\n" red
+ status_log "systemproxy: user is: $proxy_user\n" red
+ status_log "systemproxy: pass is: $proxy_pass\n" red
+}
+
proc load_config {} {
global HOME password osspecific_keys
@@ -955,6 +1155,18 @@
::ChatWindow::ShowHideChatWindowMenus . 0
}
+ #load system-wide proxy settings
+ if { [::config::getKey connectiontype] == "proxy" && [::config::getKey
usesystemproxy] == 1 } {
+
+ if { [OnUnix] } {
+ load_unix_system_proxy
+ } else {
+ status_log "connectiontype reset to direct"
+ ::config::setKey connectiontype direct
+ }
+
+ }
+
#load Snack
if {![catch {require_snack} res]} {
# TODO this is bad because it already gets called by
require_snack once...
Index: proxy.tcl
===================================================================
--- proxy.tcl (revisión: 11112)
+++ proxy.tcl (copia de trabajo)
@@ -899,7 +899,6 @@
variable proxy_session_id
# variable proxy_gateway_ip
- variable proxy_data
variable options
after cancel [list $self HTTPPoll $name]
------------------------------------------------------------------------------
_______________________________________________
Amsn-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/amsn-devel