Skip to content
This repository has been archived by the owner on Apr 26, 2021. It is now read-only.

Commit

Permalink
gandalftest: implement addKeys in the testing server
Browse files Browse the repository at this point in the history
  • Loading branch information
Francisco Souza committed Feb 10, 2015
1 parent 85eeb3f commit e7100d4
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 0 deletions.
36 changes: 36 additions & 0 deletions gandalftest/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (

"github.com/gorilla/pat"
"github.com/tsuru/gandalf/repository"
"golang.org/x/crypto/ssh"
)

type user struct {
Expand Down Expand Up @@ -99,6 +100,7 @@ func (s *GandalfServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {

func (s *GandalfServer) buildMuxer() {
s.muxer = pat.New()
s.muxer.Post("/user/{name}/key", http.HandlerFunc(s.addKeys))
s.muxer.Post("/user", http.HandlerFunc(s.createUser))
s.muxer.Delete("/user/{name}", http.HandlerFunc(s.removeUser))
s.muxer.Post("/repository", http.HandlerFunc(s.createRepository))
Expand Down Expand Up @@ -197,6 +199,40 @@ func (s *GandalfServer) getRepository(w http.ResponseWriter, r *http.Request) {
}
}

func (s *GandalfServer) addKeys(w http.ResponseWriter, r *http.Request) {
username := r.URL.Query().Get(":name")
var keys map[string]string
defer r.Body.Close()
err := json.NewDecoder(r.Body).Decode(&keys)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
s.usersLock.Lock()
defer s.usersLock.Unlock()
userKeys, ok := s.keys[username]
if !ok {
http.Error(w, "user not found", http.StatusNotFound)
return
}
for name, body := range keys {
if _, _, _, _, err := ssh.ParseAuthorizedKey([]byte(body)); err != nil {
http.Error(w, fmt.Sprintf("key %q is not valid", name), http.StatusBadRequest)
return
}
for _, userKey := range userKeys {
if name == userKey.Name {
http.Error(w, fmt.Sprintf("key %q already exists", name), http.StatusConflict)
return
}
}
}
for name, body := range keys {
userKeys = append(userKeys, key{Name: name, Body: body})
}
s.keys[username] = userKeys
}

func (s *GandalfServer) findUser(name string) (username string, index int) {
s.usersLock.RLock()
defer s.usersLock.RUnlock()
Expand Down
57 changes: 57 additions & 0 deletions gandalftest/server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package gandalftest

import (
"encoding/json"
"fmt"
"net"
"net/http"
"net/http/httptest"
Expand Down Expand Up @@ -216,6 +217,60 @@ func (s *S) TestGetRepositoryNotFound(c *check.C) {
c.Assert(recorder.Body.String(), check.Equals, "repository not found\n")
}

func (s *S) TestAddKeys(c *check.C) {
server, err := NewServer("127.0.0.1:0")
c.Assert(err, check.IsNil)
defer server.Stop()
server.users = []string{"myuser"}
server.keys["myuser"] = nil
recorder := httptest.NewRecorder()
body := strings.NewReader(fmt.Sprintf(`{"mykey":%q}`, publicKey))
request, _ := http.NewRequest("POST", "/user/myuser/key", body)
server.ServeHTTP(recorder, request)
c.Assert(recorder.Code, check.Equals, http.StatusOK)
c.Assert(server.keys["myuser"], check.DeepEquals, []key{{Name: "mykey", Body: publicKey}})
}

func (s *S) TestAddKeysUserNotFound(c *check.C) {
server, err := NewServer("127.0.0.1:0")
c.Assert(err, check.IsNil)
defer server.Stop()
recorder := httptest.NewRecorder()
body := strings.NewReader(fmt.Sprintf(`{"mykey":%q}`, publicKey))
request, _ := http.NewRequest("POST", "/user/myuser/key", body)
server.ServeHTTP(recorder, request)
c.Assert(recorder.Code, check.Equals, http.StatusNotFound)
c.Assert(recorder.Body.String(), check.Equals, "user not found\n")
}

func (s *S) TestAddKeysDuplicate(c *check.C) {
server, err := NewServer("127.0.0.1:0")
c.Assert(err, check.IsNil)
defer server.Stop()
server.users = []string{"myuser"}
server.keys["myuser"] = []key{{Name: "mykey", Body: "irrelevant"}}
recorder := httptest.NewRecorder()
body := strings.NewReader(fmt.Sprintf(`{"mykey":%q}`, publicKey))
request, _ := http.NewRequest("POST", "/user/myuser/key", body)
server.ServeHTTP(recorder, request)
c.Assert(recorder.Code, check.Equals, http.StatusConflict)
c.Assert(recorder.Body.String(), check.Equals, `key "mykey" already exists`+"\n")
}

func (s *S) TestAddKeysInvalid(c *check.C) {
server, err := NewServer("127.0.0.1:0")
c.Assert(err, check.IsNil)
defer server.Stop()
server.users = []string{"myuser"}
server.keys["myuser"] = nil
recorder := httptest.NewRecorder()
body := strings.NewReader(`{"mykey":"some-invalid-key"}`)
request, _ := http.NewRequest("POST", "/user/myuser/key", body)
server.ServeHTTP(recorder, request)
c.Assert(recorder.Code, check.Equals, http.StatusBadRequest)
c.Assert(recorder.Body.String(), check.Equals, `key "mykey" is not valid`+"\n")
}

func (s *S) TestPrepareFailure(c *check.C) {
server, err := NewServer("127.0.0.1:0")
c.Assert(err, check.IsNil)
Expand All @@ -240,3 +295,5 @@ func (s *S) TestPrepareFailureNotMatching(c *check.C) {
server.ServeHTTP(recorder, request)
c.Assert(recorder.Code, check.Equals, http.StatusOK)
}

const publicKey = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDD91CO+YIU6nIb+l+JewPMLbUB9IZx4g6IUuqyLbmCi+8DNliEjE/KWUISPlkPWoDK4ibEY/gZPLPRMT3acA+2cAf3uApBwegvDgtDv1lgtTbkMc8QJaT044Vg+JtVDFraXU4T8fn/apVMMXro0Kr/DaLzUsxSigGrCIRyT1vkMCnya8oaQHu1Qa/wnOjd6tZzvzIsxJirAbQvzlLOb89c7LTPhUByySTQmgSnoNR6ZdPpjDwnaQgyAjbsPKjhkQ1AkcxOxBi0GwwSCO7aZ+T3F/mJ1bUhEE5BMh+vO3HQ3gGkc1xeQW4H7ZL33sJkP0Tb9zslaE1lT+fuOi7NBUK5 f@somewhere"

0 comments on commit e7100d4

Please sign in to comment.