You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@openwhisk.apache.org by GitBox <gi...@apache.org> on 2017/11/13 20:36:53 UTC

[GitHub] houshengbo closed pull request #41: Add the support of certificate checking for secure mode

houshengbo closed pull request #41: Add the support of certificate checking for secure mode
URL: https://github.com/apache/incubator-openwhisk-client-go/pull/41
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/whisk/client.go b/whisk/client.go
index aea23ec1..5597a4fb 100644
--- a/whisk/client.go
+++ b/whisk/client.go
@@ -113,28 +113,6 @@ func NewClient(httpClient *http.Client, config_input *Config) (*Client, error) {
         }
     }
 
-    // Disable certificate checking in the dev environment if in insecure mode
-    if config.Insecure {
-        Debug(DbgInfo, "Disabling certificate checking.\n")
-        var tlsConfig *tls.Config
-        if config.Cert != "" && config.Key != "" {
-            if cert, err := tls.LoadX509KeyPair(config.Cert, config.Key); err == nil {
-                tlsConfig = &tls.Config{
-                    Certificates: []tls.Certificate{cert},
-                    InsecureSkipVerify: true,
-                }
-            }
-        }else{
-            tlsConfig = &tls.Config{
-                InsecureSkipVerify: true,
-            }
-        }
-
-        httpClient.Transport = &http.Transport{
-            TLSClientConfig: tlsConfig,
-        }
-    }
-
     var err error
     var errStr = ""
     if len(config.Host) == 0 {
@@ -153,6 +131,43 @@ func NewClient(httpClient *http.Client, config_input *Config) (*Client, error) {
         return nil, werr
     }
 
+    var tlsConfig *tls.Config
+    // Disable certificate checking in the environment for insecure mode
+    if config.Insecure {
+        Debug(DbgInfo, "Disabling certificate checking.\n")
+        tlsConfig = &tls.Config{
+            InsecureSkipVerify: true,
+        }
+        if config.Cert != "" && config.Key != "" {
+            if cert, err := ReadX509KeyPair(config.Cert, config.Key); err == nil {
+                tlsConfig = &tls.Config{
+                    Certificates: []tls.Certificate{cert},
+                    InsecureSkipVerify: true,
+                }
+            }
+        }
+    } else {
+        // Enable certificate checking in the environment for secure mode
+        if config.Cert != "" && config.Key != "" {
+            if cert, err := ReadX509KeyPair(config.Cert, config.Key); err == nil {
+                tlsConfig = &tls.Config{
+                    Certificates: []tls.Certificate{cert},
+                }
+            } else {
+                errStr = wski18n.T("Unable to enable the certificate checking due to the reason: {{.err}}.\n",
+                    map[string]interface{}{ "err": err })
+            }
+        }
+        if len(errStr) != 0 {
+            werr := MakeWskError(errors.New(errStr), EXIT_CODE_ERR_GENERAL, DISPLAY_MSG, NO_DISPLAY_USAGE)
+            return nil, werr
+        }
+    }
+
+    httpClient.Transport = &http.Transport{
+        TLSClientConfig: tlsConfig,
+    }
+
     if len(config.Namespace) == 0 {
         config.Namespace = "_"
     }
@@ -183,6 +198,10 @@ func NewClient(httpClient *http.Client, config_input *Config) (*Client, error) {
     return c, nil
 }
 
+var ReadX509KeyPair = func(certFile, keyFile string) (tls.Certificate, error) {
+    return tls.LoadX509KeyPair(certFile, keyFile)
+}
+
 ///////////////////////////////
 // Request/Utility Functions //
 ///////////////////////////////
diff --git a/whisk/client_test.go b/whisk/client_test.go
index 1b3e748f..0fb62628 100644
--- a/whisk/client_test.go
+++ b/whisk/client_test.go
@@ -25,6 +25,7 @@ import (
     "net/http"
     "fmt"
     "net/url"
+    "crypto/tls"
 )
 
 const (
@@ -36,18 +37,20 @@ const (
     FakeAuthKey = "dhajfhshfs:hjhfsjfdjfjsgfjs"
 )
 
-func GetValidConfigTest() *Config {
+func GetValidConfigTest(insecure bool) *Config {
     var config Config
     config.Host = FakeHost
     config.Namespace = FakeNamespace
     config.AuthToken = FakeAuthKey
+    config.Insecure = insecure
     return &config
 }
 
-func GetInvalidConfigMissingApiHostTest() *Config {
+func GetInvalidConfigMissingApiHostTest(insecure bool) *Config {
     var config Config
     config.Namespace = FakeNamespace
     config.AuthToken = FakeAuthKey
+    config.Insecure = insecure
     return &config
 }
 
@@ -60,19 +63,20 @@ func GetInvalidConfigMissingApiHostWithBaseURLTest() *Config {
     return &config
 }
 
-func GetValidConfigDiffApiHostAndBaseURLTest() *Config {
+func GetValidConfigDiffApiHostAndBaseURLTest(insecure bool) *Config {
     var config Config
     urlBase := fmt.Sprintf("https://%s/api", FakeHostDiff)
     config.BaseURL, _ = url.Parse(urlBase)
     config.Host = FakeHost
     config.Namespace = FakeNamespace
     config.AuthToken = FakeAuthKey
+    config.Insecure = insecure
     return &config
 }
 
-func TestNewClient(t *testing.T) {
+func TestNewClientDisablingCertificate(t *testing.T) {
     // Test the use case to pass a valid config.
-    config := GetValidConfigTest()
+    config := GetValidConfigTest(true)
     client, err := NewClient(http.DefaultClient, config)
     assert.Nil(t, err)
     assert.NotNil(t, client)
@@ -82,7 +86,7 @@ func TestNewClient(t *testing.T) {
     assert.Equal(t, FakeAuthKey, client.Config.AuthToken)
 
     // Test the use case to pass an invalid config with a missing api host.
-    config = GetInvalidConfigMissingApiHostTest()
+    config = GetInvalidConfigMissingApiHostTest(true)
     client, err = NewClient(http.DefaultClient, config)
     assert.NotNil(t, err)
     assert.Contains(t, err.Error(), "Unable to create request URL, because OpenWhisk API host is missing")
@@ -96,7 +100,7 @@ func TestNewClient(t *testing.T) {
     assert.Nil(t, client)
 
     // Test the use case to pass a valid config with both the base and api host of different values.
-    config = GetValidConfigDiffApiHostAndBaseURLTest()
+    config = GetValidConfigDiffApiHostAndBaseURLTest(true)
     client, err = NewClient(http.DefaultClient, config)
     assert.Nil(t, err)
     assert.NotNil(t, client)
@@ -105,3 +109,49 @@ func TestNewClient(t *testing.T) {
     assert.Equal(t, FakeBaseURLDiff, client.Config.BaseURL.String())
     assert.Equal(t, FakeAuthKey, client.Config.AuthToken)
 }
+
+func TestNewClientEnablingCertificate(t *testing.T) {
+    TEST_KEY_FILE := "TEST_KEY_FILE"
+    TEST_CERT_FILE := "TEST_CERT_FILE"
+
+    // Test the use case to pass a config in secure mode missing the cert and key files.
+    config := GetValidConfigTest(false)
+    client, err := NewClient(http.DefaultClient, config)
+    assert.Nil(t, err)
+    assert.NotNil(t, client)
+    assert.Equal(t, FakeNamespace, client.Config.Namespace)
+    assert.Equal(t, FakeHost, client.Config.Host)
+    assert.Equal(t, FakeBaseURL, client.Config.BaseURL.String())
+    assert.Equal(t, FakeAuthKey, client.Config.AuthToken)
+
+    // Test the use case to pass a config in secure mode with non-existing the cert and key files.
+    config = GetValidConfigTest(false)
+    config.Key = TEST_KEY_FILE
+    config.Cert = TEST_CERT_FILE
+    _, err = NewClient(http.DefaultClient, config)
+    assert.NotNil(t, err)
+
+    // Test the use case to pass a config in secure mode with invalid the cert and key files.
+    CreateFile([]string{ "testKey" }, TEST_KEY_FILE)
+    CreateFile([]string{ "testCert" }, TEST_CERT_FILE)
+    config = GetValidConfigTest(false)
+    config.Key = TEST_KEY_FILE
+    config.Cert = TEST_CERT_FILE
+    _, err = NewClient(http.DefaultClient, config)
+    assert.NotNil(t, err)
+
+    // Test the use case to pass a config in secure mode with valid the cert and key files.
+    oldReadX509KeyPair := ReadX509KeyPair
+    defer func () { ReadX509KeyPair = oldReadX509KeyPair }()
+    ReadX509KeyPair = func(certFile, keyFile string) (tls.Certificate, error) {
+        cert := tls.Certificate{}
+        return cert, nil
+    }
+    config = GetValidConfigTest(false)
+    config.Key = TEST_KEY_FILE
+    config.Cert = TEST_CERT_FILE
+    _, err = NewClient(http.DefaultClient, config)
+    assert.Nil(t, err)
+    DeleteFile(TEST_KEY_FILE)
+    DeleteFile(TEST_CERT_FILE)
+}
diff --git a/whisk/testUtils.go b/whisk/testUtils.go
new file mode 100644
index 00000000..60152fce
--- /dev/null
+++ b/whisk/testUtils.go
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package whisk
+
+import (
+    "os"
+    "fmt"
+    "bufio"
+)
+
+func CreateFile(lines []string, path string) error {
+    file, err := os.Create(path)
+    if err != nil {
+        return err
+    }
+    defer file.Close()
+
+    w := bufio.NewWriter(file)
+    for _, line := range lines {
+        fmt.Fprintln(w, line)
+    }
+    return w.Flush()
+}
+
+func DeleteFile(path string) error {
+    return os.Remove(path)
+}
diff --git a/whisk/wskprops_test.go b/whisk/wskprops_test.go
index ce2b890e..eff7dbbc 100644
--- a/whisk/wskprops_test.go
+++ b/whisk/wskprops_test.go
@@ -1,4 +1,4 @@
-//// +build unit
+// +build unit
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
@@ -23,8 +23,6 @@ import (
     "testing"
     "github.com/stretchr/testify/assert"
     "os"
-    "fmt"
-    "bufio"
 )
 
 const (
@@ -142,24 +140,6 @@ func (pi FakePropertiesImp) GetPropsFromWhiskProperties() *Wskprops {
     return &dep
 }
 
-func CreateFile(lines []string, path string) error {
-    file, err := os.Create(path)
-    if err != nil {
-        return err
-    }
-    defer file.Close()
-
-    w := bufio.NewWriter(file)
-    for _, line := range lines {
-        fmt.Fprintln(w, line)
-    }
-    return w.Flush()
-}
-
-func DeleteFile(path string) error {
-    return os.Remove(path)
-}
-
 func TestGetPropsFromWhiskProperties(t *testing.T) {
     lines := []string{ EXPECTED_TEST_AUTH_KEY }
     CreateFile(lines, TEST_FILE)
diff --git a/wski18n/i18n_resources.go b/wski18n/i18n_resources.go
index 206cd638..b3e791b5 100644
--- a/wski18n/i18n_resources.go
+++ b/wski18n/i18n_resources.go
@@ -109,12 +109,12 @@ func wski18nResourcesDe_deAllJson() (*asset, error) {
         return nil, err
     }
 
-    info := bindataFileInfo{name: "wski18n/resources/de_DE.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1506031186, 0)}
+    info := bindataFileInfo{name: "wski18n/resources/de_DE.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1500156160, 0)}
     a := &asset{bytes: bytes, info: info}
     return a, nil
 }
 
-var _wski18nResourcesEn_usAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x98\x51\x6f\xdb\x36\x10\xc7\xdf\xfd\x29\x0e\x7a\x71\x06\xb8\xfa\x00\xdd\x53\xb0\x19\x73\xb0\xae\x31\x56\x67\x7d\x58\x86\x81\x16\xcf\xd6\x21\x12\xc9\x92\x94\x3d\xd7\xd0\x77\x1f\x48\xd9\xb5\xd7\x48\x96\x44\x2b\x59\x9e\x62\x30\xbc\xff\xfd\x78\x3c\x1e\x8f\xfa\x73\x04\xb0\x1f\x01\x00\x44\xc4\xa3\xf7\x10\x3d\x08\xb6\xcc\x10\xac\x04\xc6\x39\x68\x59\x58\x04\xa9\x2c\x49\x61\x60\xbc\xdf\xc7\x87\xdf\x65\x39\x8e\x26\x95\x9d\xd5\x4c\x98\x8c\xb9\xe1\x16\x81\xf7\x70\x2e\x10\x8d\x00\xca\x49\xb3\xff\x44\x23\xb3\x08\xb3\xc5\x62\x0e\x1a\xbf\x14\x68\x2c\xac\xa4\x86\xf9\xc3\xc2\x93\x78\xe9\xb2\x1c\x7b\x55\xd4\xba\x2c\x5b\x89\x02\x24\x03\x21\x7f\x99\x0e\x0e\x79\x41\x32\x10\xf2\xe7\xe9\x87\xe9\x62\x3a\x34\xe7\x65\xd5\xd0\x4d\xbf\xff\x34\xfc\xae\x5f\xd0\x6c\xc1\x64\x4a\xa1\xe0\x0d\x07\xc3\x4d\x78\xf8\xfd\xc3\x21\xf7\x03\xa1\xaf\xf7\xd0\x2d\xd2\xc7\x80\x38\x39\x27\x54\xe8\x2c\x28\xba\xad\x3a\xb5\x38\x77\x62\xc3\x32\xe2\xa1\x14\x9d\xcd\x6b\x9d\x4f\xb5\x96\x1a\x50\x24\x92\x93\x58\x7f\x13\x59\x4a\xbe\x6b\xf5\xdc\xcd\xf6\x82\x5b\x12\x64\x89\x65\xf4\xf5\xcc\xbc\xa3\xd7\x16\xd3\xb6\xd4\xe5\x1c\x6c\x7a\x38\x0e\xac\xb0\x29\x0a\x4b\x89\x77\x01\x29\x32\x8e\xba\x4f\x96\xf6\x11\xab\x05\xbb\x2d\x6c\x2a\x35\x7d\xad\x6c\x9e\x70\x07\x64\x40\x48\x0b\x89\x14\x2b\x5a\x17\x1a\x39\xdc\xbc\x7b\xe7\xb4\xdd\x7f\xdc\x72\x49\x23\xff\xa1\x01\x2d\x58\xae\x1e\x4e\xc0\xed\xfc\x0e\x52\x69\x2c\xe4\x85\xdb\x5f\x04\xa5\xe5\x86\x38\xf2\xf8\x51\x34\x31\xb4\x58\x75\xd8\xa0\xd7\xbf\x77\x7f\x92\x79\xce\x04\x87\x15\xa3\x0c\x39\xf0\xa2\x92\x12\xd5\xd6\xba\xd1\x42\x63\x83\xeb\x6e\xb6\xb5\x6e\x3f\x4a\x20\x61\x51\xaf\x58\x72\x0a\xd2\x8f\x20\xe4\xb1\x5c\x1b\x25\x85\x41\x7f\xb0\x00\xff\x51\x98\x58\xe4\x0d\x18\x61\x5a\xfd\xa2\xe1\x1d\x08\x96\x85\x46\xe4\x99\x7d\xad\xfb\x45\x8a\xb0\x92\x59\x26\xb7\xee\x88\x33\xa5\xb2\xe3\xa1\x42\x5f\x01\xb6\xcc\xa5\x6e\x82\xb4\x41\xde\x7a\x5a\x03\xc5\xde\x5e\xbd\x7e\xb3\x35\xec\xa4\xe5\x16\xa4\x98\x36\xd5\xa5\xbc\x41\x6d\x48\x8a\x7e\xf7\x69\x07\x89\x2b\x7b\xd2\xd0\x2b\xbe\xbb\x60\x38\xe0\x30\x54\xdd\x51\x96\x05\x65\xff\xc9\xc7\x1e\x00\x97\x6c\xbb\x45\xc0\x05\xf0\x19\xff\x75\x5d\x6e\x1f\xc9\x6e\x90\xee\x71\x34\x30\x64\x1f\xc9\x6e\x90\x87\x47\xc7\xc0\x9c\x3d\x55\x3b\xc6\xd3\x3d\x3b\x86\x0e\x68\x1f\xcd\x86\xca\x7e\xb8\x98\xfc\xa5\x10\xc3\xb1\x54\x1b\xcb\xbe\x35\x12\x5e\xd0\x0f\x94\xe5\x38\x86\x3f\xfc\x84\x63\x93\xc2\x34\xc2\x63\xc4\x12\x4b\x1b\x7c\x8c\xc0\xdd\x7e\x8f\x11\x89\xe3\x40\xdc\x78\x25\xbc\xb4\xdf\x96\x5d\xa9\x6a\xed\xf1\x26\x0a\xd8\x82\x56\x81\x36\x00\x2d\x13\x34\xc6\x2b\x7c\x29\x50\xef\x1a\xfa\xbe\x3e\x48\xfd\x25\x6b\x21\xf7\xfb\x38\x37\xeb\xb2\x84\x9b\x44\x72\x74\x93\xdd\xdf\xb2\x6c\xea\xbe\x9b\xe7\x37\xb6\x39\x89\x14\x02\x13\xbf\xcb\x55\xb3\x34\x01\xa9\xc1\x52\x8e\x1c\x64\x61\x63\xb8\xf1\x69\xed\x76\xbf\x30\xd0\x0d\xe3\x7a\xdd\xde\x6f\xe7\x09\x2c\x31\x61\x85\x41\xb8\x57\x28\x3e\xa7\x64\x9e\x4e\x8f\x00\x32\x90\x93\x31\x24\xd6\x01\xaf\xe9\xae\xca\x57\x20\xbb\xee\x87\x29\xaa\x24\x5d\x86\xb8\x1f\x65\x39\x76\xf2\x54\x9d\xc7\xab\x3e\x08\x84\x7a\xaa\x5d\xd2\xc5\x28\xc0\xcd\x3c\x43\x66\xf0\xf4\xdc\x83\xcf\xb3\xbb\x4f\xbf\xfe\x7d\x3b\xbf\x9b\xb9\x1a\x49\x02\xe2\xad\x79\x52\x5a\x2a\x03\x85\xe0\xa8\x3d\x93\xd9\x19\x8b\x39\xcc\xee\x7f\x9b\x02\x27\x8d\x89\x95\x7a\x17\x37\xe5\xd7\xab\x22\x0c\x12\x84\xad\x9b\x1b\x33\x45\x3e\xe0\xb1\xd2\xd2\xca\xc9\xf7\xa3\x82\xe5\xe8\xeb\xe7\xf7\xb3\xa5\xb6\x8e\xba\x1a\x76\xdc\xa8\x2d\xe1\x39\xfc\xfd\x7c\xfa\xb1\x5a\xe5\x0b\x85\xf0\x7f\x5c\x40\xe3\x67\x8b\xb3\x77\xc2\xe1\x43\x43\x33\xff\xed\xc3\x62\x36\x4c\xf2\xbd\x86\xe7\x41\x96\x6c\xd1\x58\x12\xeb\xd8\x7f\x6b\x61\xc6\x3b\x54\xcc\xa6\x20\x57\x55\x1d\x78\xae\xb7\xa2\x0c\x87\xce\xb4\x37\x8f\xed\x82\x3d\xfa\x6b\xf4\x6f\x00\x00\x00\xff\xff\xc3\xb5\x3e\xea\x8a\x19\x00\x00")
+var _wski18nResourcesEn_usAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x58\xcd\x6e\xe3\x36\x10\xbe\xfb\x29\x06\xbe\x38\x05\xbc\x7a\x80\xed\x29\x68\x8d\x3a\xe8\x76\x63\x74\x9d\xee\xa1\x29\x0a\x46\x1c\x5b\x83\xc8\xa4\x76\x48\x39\xf5\x1a\x7a\xf7\x62\x28\x7b\xed\x6e\x2c\xeb\xc7\x4a\x9a\x93\x05\x9a\xf3\xcd\xc7\x99\xe1\xfc\xf0\xcf\x01\xc0\x76\x00\x00\x30\x24\x3d\x7c\x0f\xc3\x3b\xa3\x1e\x52\x04\x6f\x41\x69\x0d\x6c\x73\x8f\x60\x33\x4f\xd6\x38\x18\x6d\xb7\xd1\xee\xbb\x28\x46\xc3\x71\x29\xe7\x59\x19\x97\x2a\x59\xae\x01\x78\x0f\xc7\x00\xc3\x01\x40\x31\xae\xd6\x1f\x33\x2a\x8f\x30\x9d\xcf\x67\xc0\xf8\x25\x47\xe7\x61\x61\x19\x66\x77\xf3\xc0\x24\x40\x17\xc5\x28\xa0\x22\x73\x51\xd4\x32\xea\x00\xd9\x91\xe4\x2f\x93\xde\x49\x9e\x81\xec\x48\xf2\xe7\xc9\x87\xc9\x7c\xd2\x37\xcf\xf3\xa8\x5d\x9d\x7e\xfb\xa9\x7f\xaf\x9f\xc1\xac\xa1\xa9\xb2\x0c\x8d\xae\xb8\x18\xb2\xe1\xee\xf7\x0f\xbb\xd8\xef\x48\xfa\x72\x0d\xcd\x2c\xbd\x37\x88\xc0\x09\x50\xce\x69\x27\xeb\xd6\xe2\x9c\xa4\x73\x63\xd6\x2a\x25\xdd\x95\x45\x63\xf1\x93\xca\x27\xcc\x96\x01\x4d\x6c\x35\x99\xe5\x37\x90\x07\xab\x37\xb5\x9a\x9b\xc9\x9e\x51\x4b\x86\x3c\xa9\x94\xbe\x1e\x89\x37\xd4\x5a\x23\x5a\x17\xba\x5a\x83\x4f\x76\xd7\x41\xe5\x3e\x41\xe3\x29\x0e\x2a\x20\x41\xa5\x91\xdb\x44\x69\x1b\xb0\x93\xc4\xae\x73\x9f\x58\xa6\xaf\xa5\xcc\x23\x6e\x80\x1c\x18\xeb\x21\xb6\x66\x41\xcb\x9c\x51\xc3\xd5\xbb\x77\x82\x2d\xff\xc8\x71\x89\x51\xff\x50\x41\xad\x33\xdc\x69\x72\x06\xae\x67\x37\x90\x58\xe7\x61\x95\x8b\x7f\x11\x32\xb6\x6b\xd2\xa8\xa3\x7b\x53\xc5\xa1\x46\xaa\x81\x83\x5e\xbf\xee\xfe\x64\x57\x2b\x65\x34\x2c\x14\xa5\xa8\x41\xe7\x25\x94\x29\x5d\x2b\xab\x39\x63\x85\xea\x66\xb2\x27\xd5\x7e\xb4\x40\xc6\x23\x2f\x54\x7c\x30\xd2\x8f\x60\xec\x3e\x5d\xbb\xcc\x1a\x87\xe1\x62\x01\xfe\x93\x61\xec\x51\x57\xd0\xe8\x86\xd5\xce\x1a\x41\x81\x51\x69\x57\x8b\x3c\x93\x3f\xa9\x7e\x9e\x20\x2c\x6c\x9a\xda\x27\xb9\xe2\x2a\xcb\xd2\xfd\xa5\xc2\x90\x01\x9e\x94\x84\x6e\x8c\xb4\x46\x5d\x7b\x5b\x3b\x82\xbd\xbd\x7c\xfd\x66\x73\xd8\x01\x4b\x0e\x94\x29\x76\x65\x51\x5e\x23\x3b\xb2\xa6\x5d\x3d\x6d\x00\x71\x61\x4f\xda\xb5\xc4\x37\x07\xec\x4e\xb0\x1f\x56\xcd\xa9\x3c\xe4\x94\xfe\x27\x1e\x5b\x10\x38\x27\xdb\xcc\x02\x62\xc0\x67\xfc\x2f\xeb\x72\xdb\x40\x36\x23\x29\xc3\x51\xcf\x24\xdb\x40\x36\x23\xb9\x1b\x3a\x7a\xe6\xd9\x12\xb5\xa1\x3d\x65\xec\xe8\xdb\xa0\x6d\x30\x2b\x32\xfb\xae\x30\x85\xa2\x10\xc1\x3e\x55\x3b\xaf\xbe\x35\x12\x01\x30\x2c\x14\xc5\x28\x82\x3f\xc2\x86\x7d\x93\xa2\x18\xe1\x7e\xa8\x62\x4f\x6b\xbc\x1f\x82\x54\xbf\xfb\x21\x99\xfd\x42\x54\x59\x12\x5e\x5a\x6f\x8d\x57\xca\x5c\xbb\xaf\x44\x1d\x5c\x50\x0b\x50\x47\x80\x6d\x8c\xce\x05\x84\x2f\x39\xf2\xa6\xa2\xef\x6b\x43\xa9\x3d\xe4\x49\x92\xdb\x6d\xb4\x72\xcb\xa2\x80\xab\xd8\x6a\x94\xcd\xf2\x5b\x14\x55\xdd\x77\xf5\xfe\xca\x36\x27\xb6\xc6\x60\x1c\xbc\x5c\x36\x4b\x63\xb0\x0c\x9e\x56\xa8\xc1\xe6\x3e\x82\xab\x10\xd6\xe2\xfd\xdc\x41\x33\x1a\x97\xe3\xb6\x9e\x9d\xc7\xf0\x80\xb1\xca\x1d\xc2\x6d\x86\xe6\x73\x42\xee\xf1\x30\x04\x90\x83\x15\x39\x47\x66\xd9\x61\x9a\x6e\x8a\x7c\x01\x65\xe9\x7e\x54\x46\x25\xa4\x44\x88\x7c\x14\xc5\x48\xe0\xa9\xbc\x8f\x17\x3d\x08\x74\xd5\x54\x73\x24\xdc\x7d\x89\xb7\x91\x3d\x2d\xa4\x6b\x43\x88\x13\x8c\x1f\xa5\xd5\xdd\x75\xdd\xf2\x3f\xa3\x72\xd6\x1c\xa0\xab\x87\xb7\xde\xe0\x4f\x92\x3f\xeb\x42\xb8\x9a\xa5\xa8\x1c\x1e\x66\x55\xf8\x3c\xbd\xf9\xf4\xeb\xdf\xd7\xb3\x9b\xa9\x24\x78\x32\x10\x3d\xb9\xc7\x8c\x6d\xe6\x20\x37\x1a\x39\x68\x77\x1b\xe7\x71\x05\xd3\xdb\xdf\x26\xa0\x89\x31\xf6\x96\x37\x51\xd5\xe5\x78\x55\x0a\xbd\x18\xe1\x49\xf6\x46\x2a\xa3\x10\x2d\x51\xc6\xd6\xdb\xf1\xf7\xab\x46\xad\x30\x24\xff\xef\x77\x5b\xf6\xc2\xba\x5c\x16\xde\xe2\x4b\x3c\x26\x7f\x3b\x9b\x7c\x2c\x4f\xf9\x42\x26\xfc\x1f\x0f\x50\xf9\xe6\x72\x34\xe4\xec\x5e\x49\xaa\xf9\x5f\xdf\xcd\xa7\xfd\x04\xdf\x6b\x68\xee\xe5\xc8\x1e\x9d\x27\xb3\x8c\xc2\x43\x91\x72\x41\x61\xa6\x7c\x02\x76\x51\x26\xb1\xe7\x78\x0b\x4a\xb1\xef\x48\x7b\xf3\xb4\xc5\xd8\x83\xbf\x06\xff\x06\x00\x00\xff\xff\xaa\xe9\xfe\x28\x47\x1a\x00\x00")
 
 func wski18nResourcesEn_usAllJsonBytes() ([]byte, error) {
     return bindataRead(
@@ -129,7 +129,7 @@ func wski18nResourcesEn_usAllJson() (*asset, error) {
         return nil, err
     }
 
-    info := bindataFileInfo{name: "wski18n/resources/en_US.all.json", size: 6538, mode: os.FileMode(420), modTime: time.Unix(1506031828, 0)}
+    info := bindataFileInfo{name: "wski18n/resources/en_US.all.json", size: 6727, mode: os.FileMode(420), modTime: time.Unix(1508259166, 0)}
     a := &asset{bytes: bytes, info: info}
     return a, nil
 }
@@ -149,7 +149,7 @@ func wski18nResourcesEs_esAllJson() (*asset, error) {
         return nil, err
     }
 
-    info := bindataFileInfo{name: "wski18n/resources/es_ES.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1506031186, 0)}
+    info := bindataFileInfo{name: "wski18n/resources/es_ES.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1500156160, 0)}
     a := &asset{bytes: bytes, info: info}
     return a, nil
 }
@@ -169,7 +169,7 @@ func wski18nResourcesFr_frAllJson() (*asset, error) {
         return nil, err
     }
 
-    info := bindataFileInfo{name: "wski18n/resources/fr_FR.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1506031186, 0)}
+    info := bindataFileInfo{name: "wski18n/resources/fr_FR.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1500156160, 0)}
     a := &asset{bytes: bytes, info: info}
     return a, nil
 }
@@ -189,7 +189,7 @@ func wski18nResourcesIt_itAllJson() (*asset, error) {
         return nil, err
     }
 
-    info := bindataFileInfo{name: "wski18n/resources/it_IT.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1506031186, 0)}
+    info := bindataFileInfo{name: "wski18n/resources/it_IT.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1500156160, 0)}
     a := &asset{bytes: bytes, info: info}
     return a, nil
 }
@@ -209,7 +209,7 @@ func wski18nResourcesJa_jaAllJson() (*asset, error) {
         return nil, err
     }
 
-    info := bindataFileInfo{name: "wski18n/resources/ja_JA.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1506031186, 0)}
+    info := bindataFileInfo{name: "wski18n/resources/ja_JA.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1500156160, 0)}
     a := &asset{bytes: bytes, info: info}
     return a, nil
 }
@@ -229,7 +229,7 @@ func wski18nResourcesKo_krAllJson() (*asset, error) {
         return nil, err
     }
 
-    info := bindataFileInfo{name: "wski18n/resources/ko_KR.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1506031186, 0)}
+    info := bindataFileInfo{name: "wski18n/resources/ko_KR.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1500156160, 0)}
     a := &asset{bytes: bytes, info: info}
     return a, nil
 }
@@ -249,7 +249,7 @@ func wski18nResourcesPt_brAllJson() (*asset, error) {
         return nil, err
     }
 
-    info := bindataFileInfo{name: "wski18n/resources/pt_BR.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1506031186, 0)}
+    info := bindataFileInfo{name: "wski18n/resources/pt_BR.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1500156160, 0)}
     a := &asset{bytes: bytes, info: info}
     return a, nil
 }
@@ -269,7 +269,7 @@ func wski18nResourcesZh_hansAllJson() (*asset, error) {
         return nil, err
     }
 
-    info := bindataFileInfo{name: "wski18n/resources/zh_Hans.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1506031186, 0)}
+    info := bindataFileInfo{name: "wski18n/resources/zh_Hans.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1500156160, 0)}
     a := &asset{bytes: bytes, info: info}
     return a, nil
 }
@@ -289,7 +289,7 @@ func wski18nResourcesZh_hantAllJson() (*asset, error) {
         return nil, err
     }
 
-    info := bindataFileInfo{name: "wski18n/resources/zh_Hant.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1506031186, 0)}
+    info := bindataFileInfo{name: "wski18n/resources/zh_Hant.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1500156160, 0)}
     a := &asset{bytes: bytes, info: info}
     return a, nil
 }
diff --git a/wski18n/resources/en_US.all.json b/wski18n/resources/en_US.all.json
index 775cf4f2..f8eb9f59 100644
--- a/wski18n/resources/en_US.all.json
+++ b/wski18n/resources/en_US.all.json
@@ -140,6 +140,10 @@
     "translation": "Unable to create request URL, because the api host '{{.host}}' is invalid: {{.err}}"
   },
   {
+    "id": "Unable to enable the certificate checking due to the reason: {{.err}}.\n",
+    "translation": "Unable to enable the certificate checking due to the reason: {{.err}}.\n"
+  },
+  {
     "id": "OpenWhisk API host is missing (Please configure WHISK_APIHOST in .wskprops under the system HOME directory.)",
     "translation": "OpenWhisk API host is missing (Please configure WHISK_APIHOST in .wskprops under the system HOME directory.)"
   },


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services