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 }