From 5f6383a750342c4a43c0b57e43619c61000e6898 Mon Sep 17 00:00:00 2001 From: Mario Trangoni Date: Mon, 28 Jan 2019 22:09:40 +0100 Subject: [PATCH 1/3] pkg/util/*: Add missing function comments. See, $ gometalinter --vendor --deadline 10m --disable-all --enable=golint ./... encoding.go:15:1:warning: comment on exported function GetRandomString should be of the form "GetRandomString ..." (golint) encoding.go:30:1:warning: exported function EncodePassword should have comment or be unexported (golint) encoding.go:35:1:warning: comment on exported function EncodeMd5 should be of the form "EncodeMd5 ..." (golint) encoding.go:42:1:warning: comment on exported function PBKDF2 should be of the form "PBKDF2 ..." (golint) encoding.go:80:1:warning: exported function GetBasicAuthHeader should have comment or be unexported (golint) encoding.go:85:1:warning: exported function DecodeBasicAuthHeader should have comment or be unexported (golint) encoding.go:105:1:warning: exported function RandomHex should have comment or be unexported (golint) encryption.go:14:1:warning: exported function Decrypt should have comment or be unexported (golint) encryption.go:39:1:warning: exported function Encrypt should have comment or be unexported (golint) ip.go:7:1:warning: exported function SplitIpPort should have comment or be unexported (golint) json.go:3:6:warning: exported type DynMap should have comment or be unexported (golint) md5.go:22:1:warning: comment on exported function Md5SumString should be of the form "Md5SumString ..." (golint) strings.go:10:1:warning: exported function StringsFallback2 should have comment or be unexported (golint) strings.go:14:1:warning: exported function StringsFallback3 should have comment or be unexported (golint) strings.go:27:1:warning: exported function SplitString should have comment or be unexported (golint) strings.go:35:1:warning: exported function GetAgeString should have comment or be unexported (golint) url.go:8:6:warning: exported type UrlQueryReader should have comment or be unexported (golint) url.go:12:1:warning: exported function NewUrlQueryReader should have comment or be unexported (golint) url.go:23:1:warning: exported method UrlQueryReader.Get should have comment or be unexported (golint) url.go:32:1:warning: exported function JoinUrlFragments should have comment or be unexported (golint) validation.go:16:1:warning: exported function IsEmail should have comment or be unexported (golint) --- pkg/util/encoding.go | 9 ++++++++- pkg/util/encryption.go | 2 ++ pkg/util/ip.go | 1 + pkg/util/json.go | 1 + pkg/util/md5.go | 2 +- pkg/util/strings.go | 4 ++++ pkg/util/url.go | 5 +++++ pkg/util/validation.go | 1 + 8 files changed, 23 insertions(+), 2 deletions(-) diff --git a/pkg/util/encoding.go b/pkg/util/encoding.go index e82344d73f9..c8c3d72e6d7 100644 --- a/pkg/util/encoding.go +++ b/pkg/util/encoding.go @@ -12,6 +12,7 @@ import ( "strings" ) +// GetRandomString generate random string by specify chars. // source: https://github.com/gogits/gogs/blob/9ee80e3e5426821f03a4e99fad34418f5c736413/modules/base/tool.go#L58 func GetRandomString(n int, alphabets ...byte) string { const alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" @@ -27,18 +28,21 @@ func GetRandomString(n int, alphabets ...byte) string { return string(bytes) } +// EncodePassword encodes a password using PBKDF2. func EncodePassword(password string, salt string) string { newPasswd := PBKDF2([]byte(password), []byte(salt), 10000, 50, sha256.New) return hex.EncodeToString(newPasswd) } -// Encode string to md5 hex value. +// EncodeMd5 encodes a string to md5 hex value. func EncodeMd5(str string) string { m := md5.New() m.Write([]byte(str)) return hex.EncodeToString(m.Sum(nil)) } +// PBKDF2 implements Password-Based Key Derivation Function 2), aimed to reduce +// the vulnerability of encrypted keys to brute force attacks. // http://code.google.com/p/go/source/browse/pbkdf2/pbkdf2.go?repo=crypto func PBKDF2(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte { prf := hmac.New(h, password) @@ -77,11 +81,13 @@ func PBKDF2(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte return dk[:keyLen] } +// GetBasicAuthHeader returns a base64 encoded string from user and password. func GetBasicAuthHeader(user string, password string) string { var userAndPass = user + ":" + password return "Basic " + base64.StdEncoding.EncodeToString([]byte(userAndPass)) } +// DecodeBasicAuthHeader decodes user and password from a basic auth header. func DecodeBasicAuthHeader(header string) (string, string, error) { var code string parts := strings.SplitN(header, " ", 2) @@ -102,6 +108,7 @@ func DecodeBasicAuthHeader(header string) (string, string, error) { return userAndPass[0], userAndPass[1], nil } +// RandomHex returns a random string from a n seed. func RandomHex(n int) (string, error) { bytes := make([]byte, n) if _, err := rand.Read(bytes); err != nil { diff --git a/pkg/util/encryption.go b/pkg/util/encryption.go index d41665bafd6..6580e049206 100644 --- a/pkg/util/encryption.go +++ b/pkg/util/encryption.go @@ -11,6 +11,7 @@ import ( const saltLength = 8 +// Decrypt decrypts a payload with a given secret. func Decrypt(payload []byte, secret string) ([]byte, error) { salt := payload[:saltLength] key := encryptionKeyToBytes(secret, string(salt)) @@ -36,6 +37,7 @@ func Decrypt(payload []byte, secret string) ([]byte, error) { return payloadDst, nil } +// Encrypt encrypts a payload with a given secret. func Encrypt(payload []byte, secret string) ([]byte, error) { salt := GetRandomString(saltLength) diff --git a/pkg/util/ip.go b/pkg/util/ip.go index 351abd7a03b..1f53a5fb8b0 100644 --- a/pkg/util/ip.go +++ b/pkg/util/ip.go @@ -4,6 +4,7 @@ import ( "net" ) +// SplitIpPort splits the ip string and port. func SplitIpPort(ipStr string, portDefault string) (ip string, port string, err error) { ipAddr := net.ParseIP(ipStr) diff --git a/pkg/util/json.go b/pkg/util/json.go index a75a8490d93..7a2ec53cc2a 100644 --- a/pkg/util/json.go +++ b/pkg/util/json.go @@ -1,3 +1,4 @@ package util +// DynMap defines a dynamic map interface. type DynMap map[string]interface{} diff --git a/pkg/util/md5.go b/pkg/util/md5.go index 2473a1a406c..99641ca398f 100644 --- a/pkg/util/md5.go +++ b/pkg/util/md5.go @@ -19,7 +19,7 @@ func Md5Sum(reader io.Reader) (string, error) { return returnMD5String, nil } -// Md5Sum calculates the md5sum of a string +// Md5SumString calculates the md5sum of a string func Md5SumString(input string) (string, error) { buffer := strings.NewReader(input) return Md5Sum(buffer) diff --git a/pkg/util/strings.go b/pkg/util/strings.go index 854c009d1b1..9eaa141edbf 100644 --- a/pkg/util/strings.go +++ b/pkg/util/strings.go @@ -7,10 +7,12 @@ import ( "time" ) +// StringsFallback2 returns the first of two not empty strings. func StringsFallback2(val1 string, val2 string) string { return stringsFallback(val1, val2) } +// StringsFallback3 returns the first of three not empty strings. func StringsFallback3(val1 string, val2 string, val3 string) string { return stringsFallback(val1, val2, val3) } @@ -24,6 +26,7 @@ func stringsFallback(vals ...string) string { return "" } +// SplitString splits a string by commas or empty spaces. func SplitString(str string) []string { if len(str) == 0 { return []string{} @@ -32,6 +35,7 @@ func SplitString(str string) []string { return regexp.MustCompile("[, ]+").Split(str, -1) } +// GetAgeString returns a string representing certain time from years to minutes. func GetAgeString(t time.Time) string { if t.IsZero() { return "?" diff --git a/pkg/util/url.go b/pkg/util/url.go index fad2d79a6d0..9d2a89d2522 100644 --- a/pkg/util/url.go +++ b/pkg/util/url.go @@ -5,10 +5,12 @@ import ( "strings" ) +// UrlQueryReader is a URL query type. type UrlQueryReader struct { values url.Values } +// NewUrlQueryReader parses a raw query and returns it as a UrlQueryReader type. func NewUrlQueryReader(urlInfo *url.URL) (*UrlQueryReader, error) { u, err := url.ParseQuery(urlInfo.RawQuery) if err != nil { @@ -20,6 +22,8 @@ func NewUrlQueryReader(urlInfo *url.URL) (*UrlQueryReader, error) { }, nil } +// Get parse parameters from an URL. If the parameter does not exist, it returns +// the default value. func (r *UrlQueryReader) Get(name string, def string) string { val := r.values[name] if len(val) == 0 { @@ -29,6 +33,7 @@ func (r *UrlQueryReader) Get(name string, def string) string { return val[0] } +// JoinUrlFragments joins two URL fragments into only one URL string. func JoinUrlFragments(a, b string) string { aslash := strings.HasSuffix(a, "/") bslash := strings.HasPrefix(b, "/") diff --git a/pkg/util/validation.go b/pkg/util/validation.go index dd7404e6de4..88f92fdec21 100644 --- a/pkg/util/validation.go +++ b/pkg/util/validation.go @@ -13,6 +13,7 @@ var ( regexEmail = regexp.MustCompile(emailRegexPattern) ) +// IsEmail checks if a string is a valid email address. func IsEmail(str string) bool { return regexEmail.MatchString(strings.ToLower(str)) } From 8261613b512ed31f2d3068fb24262d16807f89fd Mon Sep 17 00:00:00 2001 From: Mario Trangoni Date: Mon, 28 Jan 2019 22:18:48 +0100 Subject: [PATCH 2/3] pkg/util/{ip.go,url.go}: Fix some golint issues See, $ gometalinter --vendor --deadline 10m --disable-all --enable=golint ./... ip.go:8:6:warning: func SplitIpPort should be SplitIPPort (golint) url.go:14:6:warning: func NewUrlQueryReader should be NewURLQueryReader (golint) url.go:9:6:warning: type UrlQueryReader should be URLQueryReader (golint) url.go:37:6:warning: func JoinUrlFragments should be JoinURLFragments (golint) --- pkg/api/app_routes.go | 2 +- pkg/api/grafana_com_proxy.go | 2 +- pkg/api/pluginproxy/ds_auth_provider.go | 2 +- pkg/api/pluginproxy/ds_proxy.go | 6 +++--- pkg/api/pluginproxy/pluginproxy.go | 2 +- pkg/api/render.go | 2 +- pkg/plugins/frontend_plugin.go | 4 ++-- pkg/services/sqlstore/sqlstore.go | 2 +- pkg/tsdb/mssql/mssql.go | 2 +- pkg/util/ip.go | 4 ++-- pkg/util/ip_test.go | 10 +++++----- pkg/util/url.go | 16 ++++++++-------- pkg/util/url_test.go | 20 ++++++++++---------- 13 files changed, 37 insertions(+), 37 deletions(-) diff --git a/pkg/api/app_routes.go b/pkg/api/app_routes.go index a2137089fc6..d77d9d87b4a 100644 --- a/pkg/api/app_routes.go +++ b/pkg/api/app_routes.go @@ -35,7 +35,7 @@ func (hs *HTTPServer) initAppPluginRoutes(r *macaron.Macaron) { for _, plugin := range plugins.Apps { for _, route := range plugin.Routes { - url := util.JoinUrlFragments("/api/plugin-proxy/"+plugin.Id, route.Path) + url := util.JoinURLFragments("/api/plugin-proxy/"+plugin.Id, route.Path) handlers := make([]macaron.Handler, 0) handlers = append(handlers, middleware.Auth(&middleware.AuthOptions{ ReqSignedIn: true, diff --git a/pkg/api/grafana_com_proxy.go b/pkg/api/grafana_com_proxy.go index afd3bb9bf8e..541d66b0b35 100644 --- a/pkg/api/grafana_com_proxy.go +++ b/pkg/api/grafana_com_proxy.go @@ -30,7 +30,7 @@ func ReverseProxyGnetReq(proxyPath string) *httputil.ReverseProxy { req.URL.Host = url.Host req.Host = url.Host - req.URL.Path = util.JoinUrlFragments(url.Path+"/api", proxyPath) + req.URL.Path = util.JoinURLFragments(url.Path+"/api", proxyPath) // clear cookie headers req.Header.Del("Cookie") diff --git a/pkg/api/pluginproxy/ds_auth_provider.go b/pkg/api/pluginproxy/ds_auth_provider.go index 5c5776eec07..7e0a88bae3d 100644 --- a/pkg/api/pluginproxy/ds_auth_provider.go +++ b/pkg/api/pluginproxy/ds_auth_provider.go @@ -39,7 +39,7 @@ func ApplyRoute(ctx context.Context, req *http.Request, proxyPath string, route req.URL.Scheme = routeURL.Scheme req.URL.Host = routeURL.Host req.Host = routeURL.Host - req.URL.Path = util.JoinUrlFragments(routeURL.Path, proxyPath) + req.URL.Path = util.JoinURLFragments(routeURL.Path, proxyPath) if err := addHeaders(&req.Header, route, data); err != nil { logger.Error("Failed to render plugin headers", "error", err) diff --git a/pkg/api/pluginproxy/ds_proxy.go b/pkg/api/pluginproxy/ds_proxy.go index b569b006531..a0ad96a6977 100644 --- a/pkg/api/pluginproxy/ds_proxy.go +++ b/pkg/api/pluginproxy/ds_proxy.go @@ -139,19 +139,19 @@ func (proxy *DataSourceProxy) getDirector() func(req *http.Request) { reqQueryVals := req.URL.Query() if proxy.ds.Type == m.DS_INFLUXDB_08 { - req.URL.Path = util.JoinUrlFragments(proxy.targetUrl.Path, "db/"+proxy.ds.Database+"/"+proxy.proxyPath) + req.URL.Path = util.JoinURLFragments(proxy.targetUrl.Path, "db/"+proxy.ds.Database+"/"+proxy.proxyPath) reqQueryVals.Add("u", proxy.ds.User) reqQueryVals.Add("p", proxy.ds.Password) req.URL.RawQuery = reqQueryVals.Encode() } else if proxy.ds.Type == m.DS_INFLUXDB { - req.URL.Path = util.JoinUrlFragments(proxy.targetUrl.Path, proxy.proxyPath) + req.URL.Path = util.JoinURLFragments(proxy.targetUrl.Path, proxy.proxyPath) req.URL.RawQuery = reqQueryVals.Encode() if !proxy.ds.BasicAuth { req.Header.Del("Authorization") req.Header.Add("Authorization", util.GetBasicAuthHeader(proxy.ds.User, proxy.ds.Password)) } } else { - req.URL.Path = util.JoinUrlFragments(proxy.targetUrl.Path, proxy.proxyPath) + req.URL.Path = util.JoinURLFragments(proxy.targetUrl.Path, proxy.proxyPath) } if proxy.ds.BasicAuth { req.Header.Del("Authorization") diff --git a/pkg/api/pluginproxy/pluginproxy.go b/pkg/api/pluginproxy/pluginproxy.go index 66e4498c283..4cf1dbd7cde 100644 --- a/pkg/api/pluginproxy/pluginproxy.go +++ b/pkg/api/pluginproxy/pluginproxy.go @@ -46,7 +46,7 @@ func NewApiPluginProxy(ctx *m.ReqContext, proxyPath string, route *plugins.AppPl req.URL.Host = targetURL.Host req.Host = targetURL.Host - req.URL.Path = util.JoinUrlFragments(targetURL.Path, proxyPath) + req.URL.Path = util.JoinURLFragments(targetURL.Path, proxyPath) // clear cookie headers req.Header.Del("Cookie") diff --git a/pkg/api/render.go b/pkg/api/render.go index cf672af9bea..3fcb99d8121 100644 --- a/pkg/api/render.go +++ b/pkg/api/render.go @@ -14,7 +14,7 @@ import ( ) func (hs *HTTPServer) RenderToPng(c *m.ReqContext) { - queryReader, err := util.NewUrlQueryReader(c.Req.URL) + queryReader, err := util.NewURLQueryReader(c.Req.URL) if err != nil { c.Handle(400, "Render parameters error", err) return diff --git a/pkg/plugins/frontend_plugin.go b/pkg/plugins/frontend_plugin.go index 04af4060169..a1b96debae1 100644 --- a/pkg/plugins/frontend_plugin.go +++ b/pkg/plugins/frontend_plugin.go @@ -45,9 +45,9 @@ func (fp *FrontendPluginBase) setPathsBasedOnApp(app *AppPlugin) { fp.BaseUrl = app.BaseUrl if isExternalPlugin(app.PluginDir) { - fp.Module = util.JoinUrlFragments("plugins/"+app.Id, appSubPath) + "/module" + fp.Module = util.JoinURLFragments("plugins/"+app.Id, appSubPath) + "/module" } else { - fp.Module = util.JoinUrlFragments("app/plugins/app/"+app.Id, appSubPath) + "/module" + fp.Module = util.JoinURLFragments("app/plugins/app/"+app.Id, appSubPath) + "/module" } } diff --git a/pkg/services/sqlstore/sqlstore.go b/pkg/services/sqlstore/sqlstore.go index 7673d80ea91..307ddb90c95 100644 --- a/pkg/services/sqlstore/sqlstore.go +++ b/pkg/services/sqlstore/sqlstore.go @@ -223,7 +223,7 @@ func (ss *SqlStore) buildConnectionString() (string, error) { cnnstr += "&tls=custom" } case migrator.POSTGRES: - host, port, err := util.SplitIpPort(ss.dbCfg.Host, "5432") + host, port, err := util.SplitIPPort(ss.dbCfg.Host, "5432") if err != nil { return "", err } diff --git a/pkg/tsdb/mssql/mssql.go b/pkg/tsdb/mssql/mssql.go index bb2e06ed673..bd4510f6cf3 100644 --- a/pkg/tsdb/mssql/mssql.go +++ b/pkg/tsdb/mssql/mssql.go @@ -49,7 +49,7 @@ func generateConnectionString(datasource *models.DataSource) (string, error) { } } - server, port, err := util.SplitIpPort(datasource.Url, "1433") + server, port, err := util.SplitIPPort(datasource.Url, "1433") if err != nil { return "", err } diff --git a/pkg/util/ip.go b/pkg/util/ip.go index 1f53a5fb8b0..d3809318191 100644 --- a/pkg/util/ip.go +++ b/pkg/util/ip.go @@ -4,8 +4,8 @@ import ( "net" ) -// SplitIpPort splits the ip string and port. -func SplitIpPort(ipStr string, portDefault string) (ip string, port string, err error) { +// SplitIPPort splits the ip string and port. +func SplitIPPort(ipStr string, portDefault string) (ip string, port string, err error) { ipAddr := net.ParseIP(ipStr) if ipAddr == nil { diff --git a/pkg/util/ip_test.go b/pkg/util/ip_test.go index f938c182b02..3a62a080e26 100644 --- a/pkg/util/ip_test.go +++ b/pkg/util/ip_test.go @@ -6,10 +6,10 @@ import ( . "github.com/smartystreets/goconvey/convey" ) -func TestSplitIpPort(t *testing.T) { +func TestSplitIPPort(t *testing.T) { Convey("When parsing an IPv4 without explicit port", t, func() { - ip, port, err := SplitIpPort("1.2.3.4", "5678") + ip, port, err := SplitIPPort("1.2.3.4", "5678") So(err, ShouldEqual, nil) So(ip, ShouldEqual, "1.2.3.4") @@ -17,7 +17,7 @@ func TestSplitIpPort(t *testing.T) { }) Convey("When parsing an IPv6 without explicit port", t, func() { - ip, port, err := SplitIpPort("::1", "5678") + ip, port, err := SplitIPPort("::1", "5678") So(err, ShouldEqual, nil) So(ip, ShouldEqual, "::1") @@ -25,7 +25,7 @@ func TestSplitIpPort(t *testing.T) { }) Convey("When parsing an IPv4 with explicit port", t, func() { - ip, port, err := SplitIpPort("1.2.3.4:56", "78") + ip, port, err := SplitIPPort("1.2.3.4:56", "78") So(err, ShouldEqual, nil) So(ip, ShouldEqual, "1.2.3.4") @@ -33,7 +33,7 @@ func TestSplitIpPort(t *testing.T) { }) Convey("When parsing an IPv6 with explicit port", t, func() { - ip, port, err := SplitIpPort("[::1]:56", "78") + ip, port, err := SplitIPPort("[::1]:56", "78") So(err, ShouldEqual, nil) So(ip, ShouldEqual, "::1") diff --git a/pkg/util/url.go b/pkg/util/url.go index 9d2a89d2522..790164c046d 100644 --- a/pkg/util/url.go +++ b/pkg/util/url.go @@ -5,26 +5,26 @@ import ( "strings" ) -// UrlQueryReader is a URL query type. -type UrlQueryReader struct { +// URLQueryReader is a URL query type. +type URLQueryReader struct { values url.Values } -// NewUrlQueryReader parses a raw query and returns it as a UrlQueryReader type. -func NewUrlQueryReader(urlInfo *url.URL) (*UrlQueryReader, error) { +// NewURLQueryReader parses a raw query and returns it as a URLQueryReader type. +func NewURLQueryReader(urlInfo *url.URL) (*URLQueryReader, error) { u, err := url.ParseQuery(urlInfo.RawQuery) if err != nil { return nil, err } - return &UrlQueryReader{ + return &URLQueryReader{ values: u, }, nil } // Get parse parameters from an URL. If the parameter does not exist, it returns // the default value. -func (r *UrlQueryReader) Get(name string, def string) string { +func (r *URLQueryReader) Get(name string, def string) string { val := r.values[name] if len(val) == 0 { return def @@ -33,8 +33,8 @@ func (r *UrlQueryReader) Get(name string, def string) string { return val[0] } -// JoinUrlFragments joins two URL fragments into only one URL string. -func JoinUrlFragments(a, b string) string { +// JoinURLFragments joins two URL fragments into only one URL string. +func JoinURLFragments(a, b string) string { aslash := strings.HasSuffix(a, "/") bslash := strings.HasPrefix(b, "/") diff --git a/pkg/util/url_test.go b/pkg/util/url_test.go index ee29956f60d..ae7660a4a43 100644 --- a/pkg/util/url_test.go +++ b/pkg/util/url_test.go @@ -1,60 +1,60 @@ package util import ( + "net/url" "testing" . "github.com/smartystreets/goconvey/convey" - "net/url" ) func TestUrl(t *testing.T) { Convey("When joining two urls where right hand side is empty", t, func() { - result := JoinUrlFragments("http://localhost:8080", "") + result := JoinURLFragments("http://localhost:8080", "") So(result, ShouldEqual, "http://localhost:8080") }) Convey("When joining two urls where right hand side is empty and lefthand side has a trailing slash", t, func() { - result := JoinUrlFragments("http://localhost:8080/", "") + result := JoinURLFragments("http://localhost:8080/", "") So(result, ShouldEqual, "http://localhost:8080/") }) Convey("When joining two urls where neither has a trailing slash", t, func() { - result := JoinUrlFragments("http://localhost:8080", "api") + result := JoinURLFragments("http://localhost:8080", "api") So(result, ShouldEqual, "http://localhost:8080/api") }) Convey("When joining two urls where lefthand side has a trailing slash", t, func() { - result := JoinUrlFragments("http://localhost:8080/", "api") + result := JoinURLFragments("http://localhost:8080/", "api") So(result, ShouldEqual, "http://localhost:8080/api") }) Convey("When joining two urls where righthand side has preceding slash", t, func() { - result := JoinUrlFragments("http://localhost:8080", "/api") + result := JoinURLFragments("http://localhost:8080", "/api") So(result, ShouldEqual, "http://localhost:8080/api") }) Convey("When joining two urls where righthand side has trailing slash", t, func() { - result := JoinUrlFragments("http://localhost:8080", "api/") + result := JoinURLFragments("http://localhost:8080", "api/") So(result, ShouldEqual, "http://localhost:8080/api/") }) Convey("When joining two urls where lefthand side has a trailing slash and righthand side has preceding slash", t, func() { - result := JoinUrlFragments("http://localhost:8080/", "/api/") + result := JoinURLFragments("http://localhost:8080/", "/api/") So(result, ShouldEqual, "http://localhost:8080/api/") }) } -func TestNewUrlQueryReader(t *testing.T) { +func TestNewURLQueryReader(t *testing.T) { u, _ := url.Parse("http://www.abc.com/foo?bar=baz&bar2=baz2") - uqr, _ := NewUrlQueryReader(u) + uqr, _ := NewURLQueryReader(u) Convey("when trying to retrieve the first query value", t, func() { result := uqr.Get("bar", "foodef") From b7628f2060c58ee9838f40bb26289881e47ef3b5 Mon Sep 17 00:00:00 2001 From: Mario Trangoni Date: Mon, 28 Jan 2019 22:37:44 +0100 Subject: [PATCH 3/3] pkg/util/{filepath.go,shortid_generator.go}: Fix golint issues See, $ gometalinter --vendor --deadline 10m --disable-all --enable=golint ./... filepath.go:12:5:warning: error var WalkSkipDir should have name of the form ErrFoo (golint) shortid_generator.go:11:5:warning: var validUidPattern should be validUIDPattern (golint) shortid_generator.go:19:6:warning: func IsValidShortUid should be IsValidShortUID (golint) shortid_generator.go:24:6:warning: func GenerateShortUid should be GenerateShortUID (golint) --- pkg/middleware/dashboard_redirect_test.go | 2 +- pkg/plugins/plugins.go | 2 +- pkg/services/dashboards/dashboard_service.go | 2 +- pkg/services/sqlstore/dashboard.go | 2 +- pkg/services/sqlstore/dashboard_test.go | 4 ++-- pkg/util/filepath.go | 6 +++--- pkg/util/shortid_generator.go | 12 ++++++------ pkg/util/shortid_generator_test.go | 2 +- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/pkg/middleware/dashboard_redirect_test.go b/pkg/middleware/dashboard_redirect_test.go index 1e4d8293cae..ebef4c92730 100644 --- a/pkg/middleware/dashboard_redirect_test.go +++ b/pkg/middleware/dashboard_redirect_test.go @@ -20,7 +20,7 @@ func TestMiddlewareDashboardRedirect(t *testing.T) { fakeDash.Id = 1 fakeDash.FolderId = 1 fakeDash.HasAcl = false - fakeDash.Uid = util.GenerateShortUid() + fakeDash.Uid = util.GenerateShortUID() bus.AddHandler("test", func(query *m.GetDashboardQuery) error { query.Result = fakeDash diff --git a/pkg/plugins/plugins.go b/pkg/plugins/plugins.go index 4f15441bb2f..b10e4640f4b 100644 --- a/pkg/plugins/plugins.go +++ b/pkg/plugins/plugins.go @@ -169,7 +169,7 @@ func (scanner *PluginScanner) walker(currentPath string, f os.FileInfo, err erro } if f.Name() == "node_modules" { - return util.WalkSkipDir + return util.ErrWalkSkipDir } if f.IsDir() { diff --git a/pkg/services/dashboards/dashboard_service.go b/pkg/services/dashboards/dashboard_service.go index 33f418cbee3..f8df6763994 100644 --- a/pkg/services/dashboards/dashboard_service.go +++ b/pkg/services/dashboards/dashboard_service.go @@ -80,7 +80,7 @@ func (dr *dashboardServiceImpl) buildSaveDashboardCommand(dto *SaveDashboardDTO, return nil, models.ErrDashboardFolderNameExists } - if !util.IsValidShortUid(dash.Uid) { + if !util.IsValidShortUID(dash.Uid) { return nil, models.ErrDashboardInvalidUid } else if len(dash.Uid) > 40 { return nil, models.ErrDashboardUidToLong diff --git a/pkg/services/sqlstore/dashboard.go b/pkg/services/sqlstore/dashboard.go index bad46c10af4..7ebdbfa65e7 100644 --- a/pkg/services/sqlstore/dashboard.go +++ b/pkg/services/sqlstore/dashboard.go @@ -27,7 +27,7 @@ func init() { bus.AddHandler("sql", HasEditPermissionInFolders) } -var generateNewUid func() string = util.GenerateShortUid +var generateNewUid func() string = util.GenerateShortUID func SaveDashboard(cmd *m.SaveDashboardCommand) error { return inTransaction(func(sess *DBSession) error { diff --git a/pkg/services/sqlstore/dashboard_test.go b/pkg/services/sqlstore/dashboard_test.go index 8ff78c4a0ff..1a82d314de0 100644 --- a/pkg/services/sqlstore/dashboard_test.go +++ b/pkg/services/sqlstore/dashboard_test.go @@ -106,7 +106,7 @@ func TestDashboardDataAccess(t *testing.T) { if timesCalled <= 2 { return savedDash.Uid } - return util.GenerateShortUid() + return util.GenerateShortUID() } cmd := m.SaveDashboardCommand{ OrgId: 1, @@ -119,7 +119,7 @@ func TestDashboardDataAccess(t *testing.T) { err := SaveDashboard(&cmd) So(err, ShouldBeNil) - generateNewUid = util.GenerateShortUid + generateNewUid = util.GenerateShortUID }) Convey("Should be able to create dashboard", func() { diff --git a/pkg/util/filepath.go b/pkg/util/filepath.go index d304236fcb1..368c6fa40d5 100644 --- a/pkg/util/filepath.go +++ b/pkg/util/filepath.go @@ -8,8 +8,8 @@ import ( "path/filepath" ) -//WalkSkipDir is the Error returned when we want to skip descending into a directory -var WalkSkipDir = errors.New("skip this directory") +//ErrWalkSkipDir is the Error returned when we want to skip descending into a directory +var ErrWalkSkipDir = errors.New("skip this directory") //WalkFunc is a callback function called for each path as a directory is walked //If resolvedPath != "", then we are following symbolic links. @@ -50,7 +50,7 @@ func walk(path string, info os.FileInfo, resolvedPath string, symlinkPathsFollow } err := walkFn(resolvedPath, info, nil) if err != nil { - if info.IsDir() && err == WalkSkipDir { + if info.IsDir() && err == ErrWalkSkipDir { err = nil } return err diff --git a/pkg/util/shortid_generator.go b/pkg/util/shortid_generator.go index f900cb8275e..c035e088944 100644 --- a/pkg/util/shortid_generator.go +++ b/pkg/util/shortid_generator.go @@ -8,19 +8,19 @@ import ( var allowedChars = shortid.DefaultABC -var validUidPattern = regexp.MustCompile(`^[a-zA-Z0-9\-\_]*$`).MatchString +var validUIDPattern = regexp.MustCompile(`^[a-zA-Z0-9\-\_]*$`).MatchString func init() { gen, _ := shortid.New(1, allowedChars, 1) shortid.SetDefault(gen) } -// IsValidShortUid checks if short unique identifier contains valid characters -func IsValidShortUid(uid string) bool { - return validUidPattern(uid) +// IsValidShortUID checks if short unique identifier contains valid characters +func IsValidShortUID(uid string) bool { + return validUIDPattern(uid) } -// GenerateShortUid generates a short unique identifier. -func GenerateShortUid() string { +// GenerateShortUID generates a short unique identifier. +func GenerateShortUID() string { return shortid.MustGenerate() } diff --git a/pkg/util/shortid_generator_test.go b/pkg/util/shortid_generator_test.go index 359e054a0ca..94055f0bcfd 100644 --- a/pkg/util/shortid_generator_test.go +++ b/pkg/util/shortid_generator_test.go @@ -4,7 +4,7 @@ import "testing" func TestAllowedCharMatchesUidPattern(t *testing.T) { for _, c := range allowedChars { - if !IsValidShortUid(string(c)) { + if !IsValidShortUID(string(c)) { t.Fatalf("charset for creating new shortids contains chars not present in uid pattern") } }