#!/bin/sh -ef

alterator_api_version=1
po_domain="alterator-sysconfig"
proxy_conf_file=/etc/sysconfig/network

kwriteconf=/usr/bin/kwriteconfig5
kconfdir=/etc/kf5/xdg
kioslaverc=$kconfdir/kioslaverc
kproxygroup='Proxy Settings'

. alterator-sh-functions
. shell-config

write_kio_proxy_key() {
	local key="$1"
	local value="$2"
	$kwriteconf --file "$kioslaverc" --group "$kproxygroup" --key "$key" "$value"
}

write_kio_proxy_conf() {
	local url="$1"
	local port="$2"
	[ -n "$port" ] && url="$url $port"

	# kwriteconfig5 creates file with 0600 access rights,
	# but 0644 is required for user-accessible config
	touch "$kioslaverc"

	if [ -n "$1" ]; then
		# Use manualy specified proxy configuration
		write_kio_proxy_key 'ProxyType' '1'
		write_kio_proxy_key 'NoProxyFor' "$in_noproxy"
		write_kio_proxy_key 'Proxy Config Script' ''
		write_kio_proxy_key 'ReversedException' 'false'
		write_kio_proxy_key 'ftpProxy' "ftp://$url"
		write_kio_proxy_key 'httpProxy' "http://$url"
		write_kio_proxy_key 'httpsProxy' "http://$url"
		write_kio_proxy_key 'socksProxy' "socks://$url"
	else
		# No Proxy
		write_kio_proxy_key 'ProxyType' '0'
	fi
}

write_proxy_for_others() {
	# KDEs proxy settings module
	[ -x "$kwriteconf" ] && [ -d "$kconfdir" ] && write_kio_proxy_conf "$1" "$2"
}

on_message()
{
    case "$in_action" in
	type)
	    write_type_item server hostname-or-ip
	    write_type_item port tcp-port
	    ;;
	read)
	    local url="$(shell_config_get "$proxy_conf_file" HTTP_PROXY)"
	    local noproxy="$(shell_config_get "$proxy_conf_file" NO_PROXY | sed 's/"//g')"

	    url="${url##http://}"

	    local auth="${url%%@*}"
	    [ "$auth" != "$url" ] || auth=""
	    url="${url##*@}"
	    local passwd="$(decode-url-component "${auth##*:}")"
	    local login="$(decode-url-component "${auth%%:*}")"

	    port="${url##*:}"
	    [ "$port" != "$url" ] || port=""
	    url="$(decode-url-component ${url%%:*})"

	    write_string_param server "$url"
	    write_string_param port "$port"
	    write_string_param login "$login"
	    write_string_param passwd "$passwd"
	    write_string_param noproxy "$noproxy"
	    ;;
	write)
	    if [ -n "$in_server" ]; then
		local url="$in_server"
		[ -z "$in_login" -o -z "$in_passwd" ] ||
		    url="$(encode-url-component "$in_login"):$(encode-url-component "$in_passwd")@$url"

		write_proxy_for_others "$url" "$in_port"

		[ -z "$in_port" ] ||
		    url="$url:$in_port"

		shell_config_set "$proxy_conf_file" HTTP_PROXY "http://$url"
		shell_config_set "$proxy_conf_file" HTTPS_PROXY "http://$url"
		shell_config_set "$proxy_conf_file" FTP_PROXY "http://$url"
		shell_config_set "$proxy_conf_file" NO_PROXY "\"$in_noproxy\""
	    else
		shell_config_set "$proxy_conf_file" HTTP_PROXY ""
		shell_config_set "$proxy_conf_file" HTTPS_PROXY ""
		shell_config_set "$proxy_conf_file" FTP_PROXY ""
		shell_config_set "$proxy_conf_file" NO_PROXY ""
		write_proxy_for_others
	    fi
	    ;;
    esac
}

message_loop
