summaryrefslogtreecommitdiff
path: root/go/internal/gitlabnet/authorizedkeys
diff options
context:
space:
mode:
Diffstat (limited to 'go/internal/gitlabnet/authorizedkeys')
-rw-r--r--go/internal/gitlabnet/authorizedkeys/client.go65
-rw-r--r--go/internal/gitlabnet/authorizedkeys/client_test.go105
2 files changed, 170 insertions, 0 deletions
diff --git a/go/internal/gitlabnet/authorizedkeys/client.go b/go/internal/gitlabnet/authorizedkeys/client.go
new file mode 100644
index 0000000..28b85fc
--- /dev/null
+++ b/go/internal/gitlabnet/authorizedkeys/client.go
@@ -0,0 +1,65 @@
+package authorizedkeys
+
+import (
+ "fmt"
+ "net/url"
+
+ "gitlab.com/gitlab-org/gitlab-shell/go/internal/config"
+ "gitlab.com/gitlab-org/gitlab-shell/go/internal/gitlabnet"
+)
+
+const (
+ AuthorizedKeysPath = "/authorized_keys"
+)
+
+type Client struct {
+ config *config.Config
+ client *gitlabnet.GitlabClient
+}
+
+type Response struct {
+ Id int64 `json:"id"`
+ Key string `json:"key"`
+}
+
+func NewClient(config *config.Config) (*Client, error) {
+ client, err := gitlabnet.GetClient(config)
+ if err != nil {
+ return nil, fmt.Errorf("Error creating http client: %v", err)
+ }
+
+ return &Client{config: config, client: client}, nil
+}
+
+func (c *Client) GetByKey(key string) (*Response, error) {
+ path, err := pathWithKey(key)
+ if err != nil {
+ return nil, err
+ }
+
+ response, err := c.client.Get(path)
+ if err != nil {
+ return nil, err
+ }
+ defer response.Body.Close()
+
+ parsedResponse := &Response{}
+ if err := gitlabnet.ParseJSON(response, parsedResponse); err != nil {
+ return nil, err
+ }
+
+ return parsedResponse, nil
+}
+
+func pathWithKey(key string) (string, error) {
+ u, err := url.Parse(AuthorizedKeysPath)
+ if err != nil {
+ return "", err
+ }
+
+ params := u.Query()
+ params.Set("key", key)
+ u.RawQuery = params.Encode()
+
+ return u.String(), nil
+}
diff --git a/go/internal/gitlabnet/authorizedkeys/client_test.go b/go/internal/gitlabnet/authorizedkeys/client_test.go
new file mode 100644
index 0000000..c73aab2
--- /dev/null
+++ b/go/internal/gitlabnet/authorizedkeys/client_test.go
@@ -0,0 +1,105 @@
+package authorizedkeys
+
+import (
+ "encoding/json"
+ "net/http"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+
+ "gitlab.com/gitlab-org/gitlab-shell/go/internal/config"
+ "gitlab.com/gitlab-org/gitlab-shell/go/internal/gitlabnet"
+ "gitlab.com/gitlab-org/gitlab-shell/go/internal/gitlabnet/testserver"
+)
+
+var (
+ requests []testserver.TestRequestHandler
+)
+
+func init() {
+ requests = []testserver.TestRequestHandler{
+ {
+ Path: "/api/v4/internal/authorized_keys",
+ Handler: func(w http.ResponseWriter, r *http.Request) {
+ if r.URL.Query().Get("key") == "key" {
+ body := &Response{
+ Id: 1,
+ Key: "public-key",
+ }
+ json.NewEncoder(w).Encode(body)
+ } else if r.URL.Query().Get("key") == "broken-message" {
+ w.WriteHeader(http.StatusForbidden)
+ body := &gitlabnet.ErrorResponse{
+ Message: "Not allowed!",
+ }
+ json.NewEncoder(w).Encode(body)
+ } else if r.URL.Query().Get("key") == "broken-json" {
+ w.Write([]byte("{ \"message\": \"broken json!\""))
+ } else if r.URL.Query().Get("key") == "broken-empty" {
+ w.WriteHeader(http.StatusForbidden)
+ } else {
+ w.WriteHeader(http.StatusNotFound)
+ }
+ },
+ },
+ }
+}
+
+func TestGetByKey(t *testing.T) {
+ client, cleanup := setup(t)
+ defer cleanup()
+
+ result, err := client.GetByKey("key")
+ require.NoError(t, err)
+ require.Equal(t, &Response{Id: 1, Key: "public-key"}, result)
+}
+
+func TestGetByKeyErrorResponses(t *testing.T) {
+ client, cleanup := setup(t)
+ defer cleanup()
+
+ testCases := []struct {
+ desc string
+ key string
+ expectedError string
+ }{
+ {
+ desc: "A response with an error message",
+ key: "broken-message",
+ expectedError: "Not allowed!",
+ },
+ {
+ desc: "A response with bad JSON",
+ key: "broken-json",
+ expectedError: "Parsing failed",
+ },
+ {
+ desc: "A forbidden (403) response without message",
+ key: "broken-empty",
+ expectedError: "Internal API error (403)",
+ },
+ {
+ desc: "A not found (404) response without message",
+ key: "not-found",
+ expectedError: "Internal API error (404)",
+ },
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.desc, func(t *testing.T) {
+ resp, err := client.GetByKey(tc.key)
+
+ require.EqualError(t, err, tc.expectedError)
+ require.Nil(t, resp)
+ })
+ }
+}
+
+func setup(t *testing.T) (*Client, func()) {
+ url, cleanup := testserver.StartSocketHttpServer(t, requests)
+
+ client, err := NewClient(&config.Config{GitlabUrl: url})
+ require.NoError(t, err)
+
+ return client, cleanup
+}