github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/juju/osenv/proxy_windows.go (about)

     1  package osenv
     2  
     3  import (
     4          "fmt"
     5          "syscall"
     6          "unsafe"
     7  		)
     8  
     9  const(
    10  	//registry keys to modify for 32 bit and 64 bit
    11  	key = `Software\Microsoft\Windows\CurrentVersion\Internet Settings\`
    12  	key_WOW6432Node = `Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Internet Settings`
    13  
    14  	REG_NONE      uint64 = 0 // No value type
    15  	REG_SZ               = 1 // Unicode nul terminated string
    16  	REG_EXPAND_SZ        = 2 // Unicode nul terminated string
    17  	// (with environment variable references)
    18  	REG_BINARY                     = 3 // Free form binary
    19  	REG_DWORD                      = 4 // 32-bit number
    20  	REG_DWORD_LITTLE_ENDIAN        = 4 // 32-bit number (same as REG_DWORD)
    21  	REG_DWORD_BIG_ENDIAN           = 5 // 32-bit number
    22  	REG_LINK                       = 6 // Symbolic Link (unicode)
    23  	REG_MULTI_SZ                   = 7 // Multiple Unicode strings
    24  	REG_RESOURCE_LIST              = 8 // Resource list in the resource map
    25  	REG_FULL_RESOURCE_DESCRIPTOR   = 9 // Resource list in the hardware description
    26  	REG_RESOURCE_REQUIREMENTS_LIST = 10
    27  	REG_QWORD                      = 11 // 64-bit number
    28  	REG_QWORD_LITTLE_ENDIAN        = 11 // 64-bit number (same as REG_QWORD)
    29  )
    30  
    31  func getValueFromKey(key, value_name string) (value_data string, err error) {
    32  	var h syscall.Handle
    33  	err = syscall.RegOpenKeyEx(syscall.HKEY_LOCAL_MACHINE, syscall.StringToUTF16Ptr(key), 0, syscall.KEY_READ, &h)
    34  	if err != nil {
    35  		return
    36  	}
    37  	defer syscall.RegCloseKey(h)
    38  	var count uint32
    39  	var buf [124]uint16
    40  	n := uint32(len(buf))
    41  	err = syscall.RegQueryValueEx(h, syscall.StringToUTF16Ptr(value_name), nil, &count, (*byte)(unsafe.Pointer(&buf[0])), &n)
    42  	if err != nil {
    43  		return
    44  	}
    45  	value_data = syscall.UTF16ToString(buf[:])
    46  	return
    47  }
    48  
    49  func writeToKey(key, value_name string, size, value_data, value_data_type uintptr) (err error) {
    50  		var (
    51          advapi32, _ = syscall.LoadLibrary("advapi32.dll")
    52          RegSetValueEx, _ = syscall.GetProcAddress(advapi32, "RegSetValueExW")
    53  	)
    54  	var h syscall.Handle
    55  	err = syscall.RegOpenKeyEx(syscall.HKEY_LOCAL_MACHINE, syscall.StringToUTF16Ptr(key), 0, syscall.KEY_ALL_ACCESS, &h)
    56  	if err != nil {
    57  		fmt.Println(err)
    58  		return
    59  	}
    60  	defer syscall.RegCloseKey(h)
    61  	ret, _, Callerr := syscall.Syscall6(RegSetValueEx, 6,
    62  		uintptr(h),
    63  		uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(value_name))),
    64  		0,
    65  		value_data_type,
    66  		value_data,
    67  		size)
    68  	fmt.Println(ret, Callerr)
    69  
    70  	defer syscall.FreeLibrary(advapi32)
    71  	return
    72  }
    73  
    74  func EnableProxyServer(key, ProxyServer string) (){
    75  	var (enabled 	uint32 = 1
    76  		 disabled	uint32 = 0)
    77  	ProxyOverride := "<local>"
    78  	writeToKey(key, "ProxyServer", uintptr(len(ProxyServer)*2), uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(ProxyServer))),  REG_SZ)
    79  	writeToKey(key, "ProxyHttp1.1", 4, uintptr(unsafe.Pointer(&disabled)),  REG_DWORD)
    80  	writeToKey(key, "ProxyEnable", 4, uintptr(unsafe.Pointer(&enabled)),  REG_DWORD)
    81  	writeToKey(key, "MigrateProxy", 4, uintptr(unsafe.Pointer(&enabled)),  REG_DWORD)
    82  	writeToKey(key, "ProxyOverride", uintptr(len(ProxyOverride)*2), uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(ProxyOverride))), REG_SZ)
    83  }
    84  
    85  // SetEnvironmentValues updates the registry keys with the
    86  // proxy values stored in the settings object.  Both the lower-case
    87  // and upper-case variants are set.
    88  //
    89  // http_proxy, HTTP_PROXY
    90  // https_proxy, HTTPS_PROXY
    91  // ftp_proxy, FTP_PROXY
    92  func (s *ProxySettings) SetEnvironmentValues() {
    93      // this replaces the setenv part
    94      EnableProxyServer(key, s.Http)
    95  }
    96  
    97  // getProxySetting returns the current value of the proxy url, if it exists,
    98  // otherwise, the value returned is "" (aka empty string)
    99  // warning: get proxy setting (old juju version uses a string parameter, the 
   100  // key name, we don't need that)
   101  
   102  
   103  func getProxySetting(key string) string {
   104      value, err := getValueFromKey(key, "ProxyServer")
   105      if err != nil { 
   106          return value
   107      }
   108      return ""
   109  }