| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- package main
- import (
- "crypto/rand"
- "encoding/json"
- "errors"
- "fmt"
- "log"
- "net/http"
- "github.com/dgrijalva/jwt-go"
- "github.com/gorilla/context"
- "gopkg.in/mgo.v2"
- )
- type Error struct {
- Reason error
- Internal bool
- Code int
- }
- type Response map[string]interface{}
- type TokenData struct {
- ID string
- Iat float64
- Exp float64
- }
- func RandToken() string {
- b := make([]byte, 16)
- rand.Read(b)
- return fmt.Sprintf("%x", b)
- }
- func (r *Response) String() (s string) {
- b, err := json.Marshal(r)
- if err != nil {
- return ""
- }
- return string(b)
- }
- func HandleModelError(w http.ResponseWriter, r *http.Request, errM *Error) {
- if errM.Internal {
- ISR(w, r, errM.Reason)
- return
- } else {
- if errM.Code != 0 {
- BR(w, r, errM.Reason, errM.Code)
- } else {
- BR(w, r, errM.Reason, http.StatusBadRequest)
- }
- return
- }
- }
- func ISR(w http.ResponseWriter, r *http.Request, msg error) {
- w.WriteHeader(http.StatusInternalServerError)
- log.Println(msg)
- }
- func BR(w http.ResponseWriter, r *http.Request, msg error, code int) {
- ServeJSON(w, r, &Response{"error": msg.Error()}, code)
- }
- func NotAllowed(w http.ResponseWriter, r *http.Request) {
- w.WriteHeader(http.StatusUnauthorized)
- }
- func ServeJSON(w http.ResponseWriter, r *http.Request, json *Response, code int) {
- w.Header().Set("Content-Type", "application/json")
- w.WriteHeader(code)
- fmt.Fprint(w, json)
- }
- func GetDB(w http.ResponseWriter, r *http.Request) *mgo.Database {
- db, ok := context.GetOk(r, "DB")
- if !ok {
- ISR(w, r, errors.New("Couldn't obtain DB"))
- return nil
- }
- return db.(*mgo.Database)
- }
- func GetToken(w http.ResponseWriter, r *http.Request) *TokenData {
- token, ok := context.GetOk(r, "token")
- if !ok {
- BR(w, r, errors.New("Missing Token"), http.StatusUnauthorized)
- return nil
- }
- tokenData := token.(*jwt.Token).Claims
- return &TokenData{tokenData["ID"].(string), tokenData["iat"].(float64), tokenData["exp"].(float64)}
- }
- func IsTokenSet(r *http.Request) bool {
- _, ok := context.GetOk(r, "token")
- return ok
- }
|