auth

Paddy 2014-08-16 Parent:9a1e62c24903 Child:13568ac73ac3

15:fc5df8e68c7b Go to Latest

auth/context.go

Render results. Render JSON tokens and errors. Render HTML errors, confirmation, and login pages.

History
     1.1 --- a/context.go	Sat Aug 16 02:57:49 2014 -0400
     1.2 +++ b/context.go	Sat Aug 16 05:33:23 2014 -0400
     1.3 @@ -1,34 +1,98 @@
     1.4  package auth
     1.5  
     1.6  import (
     1.7 +	"encoding/json"
     1.8 +	"html/template"
     1.9  	"io"
    1.10  	"log"
    1.11  )
    1.12  
    1.13  type Context struct {
    1.14 -	Config   ServerConfig
    1.15 -	Clients  ClientStore
    1.16 -	Tokens   TokenStore
    1.17 -	Profiles ProfileStore
    1.18 -	Log      *log.Logger
    1.19 +	Config    ServerConfig
    1.20 +	Clients   ClientStore
    1.21 +	Tokens    TokenStore
    1.22 +	Profiles  ProfileStore
    1.23 +	Log       *log.Logger
    1.24 +	Templates Templates
    1.25 +}
    1.26 +
    1.27 +type Templates struct {
    1.28 +	Error        *template.Template
    1.29 +	Confirmation *template.Template
    1.30 +	Login        *template.Template
    1.31 +}
    1.32 +
    1.33 +type jsonError struct {
    1.34 +	Error       string `json:"error,omitempty"`
    1.35 +	Description string `json:"error_description,omitempty"`
    1.36 +	URI         string `json:"error_uri,omitempty"`
    1.37 +	State       string `json:"state,omitempty"`
    1.38  }
    1.39  
    1.40  func (c Context) RenderError(w io.Writer, err error) {
    1.41 -	// TODO: write error to w in a template
    1.42 +	if c.Templates.Error == nil {
    1.43 +		log.Println("Error template is nil, can't render error.")
    1.44 +		return
    1.45 +	}
    1.46 +	renderErr := c.Templates.Error.Execute(w, map[string]interface{}{
    1.47 +		"err": err,
    1.48 +	})
    1.49 +	if renderErr != nil {
    1.50 +		log.Printf("Error executing error template (oh, the irony): %s\n", renderErr)
    1.51 +		return
    1.52 +	}
    1.53  }
    1.54  
    1.55  func (c Context) RenderJSONError(w io.Writer, code, description, baseURI string) {
    1.56 -	// TODO: write error to w in json formatting
    1.57 +	d, err := json.Marshal(jsonError{
    1.58 +		Error:       code,
    1.59 +		Description: description,
    1.60 +		URI:         baseURI,
    1.61 +	})
    1.62 +	if err != nil {
    1.63 +		log.Printf("Error marshalling json error (oh, the irony): %s\n", err)
    1.64 +		return
    1.65 +	}
    1.66 +	_, err = w.Write(d)
    1.67 +	if err != nil {
    1.68 +		log.Printf("Error writing json error: %s\n", err)
    1.69 +		return
    1.70 +	}
    1.71  }
    1.72  
    1.73  func (c Context) RenderConfirmation(w io.Writer) {
    1.74 -	// TODO: render HTML confirmation page
    1.75 +	if c.Templates.Confirmation == nil {
    1.76 +		log.Println("Confirmation template is nil, can't render confirmation.")
    1.77 +		return
    1.78 +	}
    1.79 +	err := c.Templates.Confirmation.Execute(w, nil)
    1.80 +	if err != nil {
    1.81 +		log.Printf("Error executing confirmation template: %s\n", err)
    1.82 +		return
    1.83 +	}
    1.84  }
    1.85  
    1.86  func (c Context) RenderLogin(w io.Writer) {
    1.87 -	// TODO: render HTML login page
    1.88 +	if c.Templates.Login == nil {
    1.89 +		log.Println("Login template is nil, can't render confirmation.")
    1.90 +		return
    1.91 +	}
    1.92 +	err := c.Templates.Login.Execute(w, nil)
    1.93 +	if err != nil {
    1.94 +		log.Printf("Error executing login template: %s\n", err)
    1.95 +		return
    1.96 +	}
    1.97  }
    1.98  
    1.99  func (c Context) RenderJSONToken(w io.Writer, data AccessData) {
   1.100 -	// TODO: render token to w in json formatting
   1.101 +	d, err := json.Marshal(data)
   1.102 +	if err != nil {
   1.103 +		log.Printf("Error marshalling json token: %s\n", err)
   1.104 +		return
   1.105 +	}
   1.106 +	_, err = w.Write(d)
   1.107 +	if err != nil {
   1.108 +		log.Printf("Error writing json token: %s\n", err)
   1.109 +		return
   1.110 +	}
   1.111  }