]> Cypherpunks repositories - gostls13.git/commitdiff
dashboard: add /key handler
authorAndrew Gerrand <adg@golang.org>
Wed, 21 Dec 2011 22:38:57 +0000 (09:38 +1100)
committerAndrew Gerrand <adg@golang.org>
Wed, 21 Dec 2011 22:38:57 +0000 (09:38 +1100)
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5504066

misc/dashboard/app/app.yaml
misc/dashboard/app/build/handler.go

index 7a325b497cf78ebccf9f0b9385a65c0654aa781f..b7cc673a9b357fe705e741f371dc6c6a26bc0191 100644 (file)
@@ -10,6 +10,6 @@ handlers:
   script: _go_app
 - url: /(|commit|packages|result|tag|todo)
   script: _go_app
-- url: /(init|buildtest|_ah/queue/go/delay)
+- url: /(init|buildtest|key|_ah/queue/go/delay)
   script: _go_app
   login: admin
index a4d52853ae707a9a3a2860f8e7e5570531a320c2..dd32365f88a2434db3ef67f0c886b76fba45ff3e 100644 (file)
@@ -321,12 +321,9 @@ func AuthHandler(h dashHandler) http.HandlerFunc {
 
                // Validate key query parameter for POST requests only.
                key := r.FormValue("key")
-               if r.Method == "POST" && key != secretKey && !appengine.IsDevAppServer() {
-                       h := hmac.NewMD5([]byte(secretKey))
-                       h.Write([]byte(r.FormValue("builder")))
-                       if key != fmt.Sprintf("%x", h.Sum()) {
-                               err = os.NewError("invalid key: " + key)
-                       }
+               builder := r.FormValue("builder")
+               if r.Method == "POST" && !validKey(key, builder) {
+                       err = os.NewError("invalid key: " + key)
                }
 
                // Call the original HandlerFunc and return the response.
@@ -365,9 +362,19 @@ func initHandler(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "OK")
 }
 
+func keyHandler(w http.ResponseWriter, r *http.Request) {
+       builder := r.FormValue("builder")
+       if builder == "" {
+               logErr(w, r, os.NewError("must supply builder in query string"))
+               return
+       }
+       fmt.Fprint(w, builderKey(builder))
+}
+
 func init() {
        // admin handlers
        http.HandleFunc("/init", initHandler)
+       http.HandleFunc("/key", keyHandler)
 
        // authenticated handlers
        http.HandleFunc("/commit", AuthHandler(commitHandler))
@@ -385,6 +392,22 @@ func validHash(hash string) bool {
        return hash != ""
 }
 
+func validKey(key, builder string) bool {
+       if appengine.IsDevAppServer() {
+               return true
+       }
+       if key == secretKey {
+               return true
+       }
+       return key == builderKey(builder)
+}
+
+func builderKey(builder string) string {
+       h := hmac.NewMD5([]byte(secretKey))
+       h.Write([]byte(builder))
+       return fmt.Sprintf("%x", h.Sum())
+}
+
 func logErr(w http.ResponseWriter, r *http.Request, err os.Error) {
        appengine.NewContext(r).Errorf("Error: %v", err)
        w.WriteHeader(http.StatusInternalServerError)