Debugging

This commit is contained in:
Jimmy 2022-03-13 07:06:39 +13:00
parent 8bc3cee328
commit dc8de8b4b9
31 changed files with 952 additions and 1040 deletions

73
app.go
View File

@ -2,56 +2,49 @@ package main
import (
"fmt"
"log"
"net/http"
c "git.1248.nz/1248/Otfe/controllers"
a "git.1248.nz/1248/Otfe/misc/auth"
"git.1248.nz/1248/Otfe/misc/helpers"
"github.com/husobee/vestigo"
)
func main() {
fmt.Println("Starting")
log.Fatal(http.ListenAndServe(":8080", router()))
//log.Fatal(http.ListenAndServe(":8080", router()))
}
func router() *vestigo.Router {
router := vestigo.NewRouter()
// func router() *vestigo.Router {
// router := vestigo.NewRouter()
var static c.Static
router.Get("/", a.User(static.Home))
// var static c.Static
// router.Get("/", a.User(static.Home))
router.Get("/public/*", http.FileServer(
http.Dir(helpers.GetAssets())).ServeHTTP)
// router.Get("/public/*", http.FileServer(
// http.Dir(helpers.GetAssets())).ServeHTTP)
//User routes
var user c.User
router.Get("/user", c.User{}.Index)
router.Get("/user/:username", a.Perm(user.Show, user.ShowSelf,
"user.show"))
router.Get("/user/new", user.New)
router.Post("/user/new", user.Create)
router.Get("/user/:username/edit", user.Edit)
router.Post("/user/:username/edit", user.Update)
router.Post("/user/:username/delete", user.Delete)
router.Get("/register", user.New)
// //User routes
// var user c.User
// router.Get("/user", c.User{}.Index)
// router.Get("/user/:username", a.Perm(user.Show, user.ShowSelf,
// "user.show"))
// router.Get("/user/new", user.New)
// router.Post("/user/new", user.Create)
// router.Get("/user/:username/edit", user.Edit)
// router.Post("/user/:username/edit", user.Update)
// router.Post("/user/:username/delete", user.Delete)
// router.Get("/register", user.New)
//Session routes
var session c.Session
router.Get("/login", session.New)
router.Post("/login", session.Create)
router.Post("/logout", session.Delete)
// //Session routes
// var session c.Session
// router.Get("/login", session.New)
// router.Post("/login", session.Create)
// router.Post("/logout", session.Delete)
//Post routes
router.Get("/post", c.Post{}.Index)
router.Get("/user/:id", c.Post{}.Show)
router.Get("/post/new", c.Post{}.New)
router.Post("/post/new", c.Post{}.Create)
router.Get("/post/:id/edit", c.Post{}.Edit)
router.Post("/post/:id/edit", c.Post{}.Update)
router.Post("/post/:id/delete", c.Post{}.Delete)
// //Post routes
// router.Get("/post", c.Post{}.Index)
// router.Get("/user/:id", c.Post{}.Show)
// router.Get("/post/new", c.Post{}.New)
// router.Post("/post/new", c.Post{}.Create)
// router.Get("/post/:id/edit", c.Post{}.Edit)
// router.Post("/post/:id/edit", c.Post{}.Update)
// router.Post("/post/:id/delete", c.Post{}.Delete)
return router
}
// return router
// }

View File

@ -3,8 +3,8 @@ package main
import (
"testing"
"git.1248.nz/1248/Otfe/misc/helpers"
"git.1248.nz/1248/Otfe/models"
"git.technical.kiwi/go/otfe/misc/helpers"
"git.technical.kiwi/go/otfe/models"
"github.com/globalsign/mgo/bson"
)

View File

@ -1,33 +1,33 @@
package controllers
// package controllers
import (
"html/template"
"net/http"
// import (
// "html/template"
// "net/http"
"git.1248.nz/1248/Otfe/misc/helpers"
"github.com/globalsign/mgo/bson"
)
// "git.technical.kiwi/go/otfe/misc/helpers"
// "github.com/globalsign/mgo/bson"
// )
/*type Controller interface {
Index(w http.ResponseWriter, r *http.Request)
Show(w http.ResponseWriter, r *http.Request)
New(w http.ResponseWriter, r *http.Request)
Create(w http.ResponseWriter, r *http.Request)
Edit(w http.ResponseWriter, r *http.Request)
Update(w http.ResponseWriter, r *http.Request)
Delete(w http.ResponseWriter, r *http.Request)
}*/
// /*type Controller interface {
// Index(w http.ResponseWriter, r *http.Request)
// Show(w http.ResponseWriter, r *http.Request)
// New(w http.ResponseWriter, r *http.Request)
// Create(w http.ResponseWriter, r *http.Request)
// Edit(w http.ResponseWriter, r *http.Request)
// Update(w http.ResponseWriter, r *http.Request)
// Delete(w http.ResponseWriter, r *http.Request)
// }*/
var funcMap = template.FuncMap{
"getId": func(id bson.ObjectId) string {
return "1"
},
}
// var funcMap = template.FuncMap{
// "getId": func(id bson.ObjectId) string {
// return "1"
// },
// }
func t(w http.ResponseWriter, data interface{}, layout string) {
views := helpers.GetRootDir() + "/views/"
tmpl := template.Must(template.New("layout").Funcs(funcMap).
ParseFiles(views+"/layouts/layout.gtpl", views+"/layouts/header.gtpl", views+"/layouts/footer.gtpl", views+"/layouts/nav.gtpl", views+layout))
tmpl.ExecuteTemplate(w, "layout", data)
// func t(w http.ResponseWriter, data interface{}, layout string) {
// views := helpers.GetRootDir() + "/views/"
// tmpl := template.Must(template.New("layout").Funcs(funcMap).
// ParseFiles(views+"/layouts/layout.gtpl", views+"/layouts/header.gtpl", views+"/layouts/footer.gtpl", views+"/layouts/nav.gtpl", views+layout))
// tmpl.ExecuteTemplate(w, "layout", data)
}
// }

View File

@ -1,66 +1,66 @@
package controllers
// package controllers
import (
"fmt"
"net/http"
// import (
// "fmt"
// "net/http"
"git.1248.nz/1248/Otfe/misc/helpers"
"git.1248.nz/1248/Otfe/models"
"github.com/husobee/vestigo"
)
// "git.technical.kiwi/go/otfe/misc/helpers"
// "git.technical.kiwi/go/otfe/models"
// "github.com/husobee/vestigo"
// )
//User handlers
type Post struct {
Title string
}
// //User handlers
// type Post struct {
// Title string
// }
//Index of posts
func (p Post) Index(w http.ResponseWriter, r *http.Request) {
p.Title = "Posts"
t(w, p, "/post/posts.gtpl")
}
// //Index of posts
// func (p Post) Index(w http.ResponseWriter, r *http.Request) {
// p.Title = "Posts"
// t(w, p, "/post/posts.gtpl")
// }
//Show given user
func (p Post) Show(w http.ResponseWriter, r *http.Request) {
t(w, p, "/post/post.gtpl")
}
// //Show given user
// func (p Post) Show(w http.ResponseWriter, r *http.Request) {
// t(w, p, "/post/post.gtpl")
// }
//New user form
func (p Post) New(w http.ResponseWriter, r *http.Request) {
t(w, p, "/post/new.gtpl")
}
// //New user form
// func (p Post) New(w http.ResponseWriter, r *http.Request) {
// t(w, p, "/post/new.gtpl")
// }
//Create new a user
func (p Post) Create(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
var user models.User
var err error
user.Username = r.Form.Get("username")
user.Email = r.Form.Get("email")
user.Password, err = helpers.HashPassword(r.Form.Get("password"))
helpers.CheckError(err)
user.Create()
http.Redirect(w, r, "/user/"+user.Username, http.StatusFound)
// //Create new a user
// func (p Post) Create(w http.ResponseWriter, r *http.Request) {
// r.ParseForm()
// var user models.User
// var err error
// user.Username = r.Form.Get("username")
// user.Email = r.Form.Get("email")
// user.Password, err = helpers.HashPassword(r.Form.Get("password"))
// helpers.CheckError(err)
// user.Create()
// http.Redirect(w, r, "/user/"+user.Username, http.StatusFound)
}
// }
//Edit form
func (p Post) Edit(w http.ResponseWriter, r *http.Request) {
var data userData
data.User.Read("username", vestigo.Param(r, "username"))
// //Edit form
// func (p Post) Edit(w http.ResponseWriter, r *http.Request) {
// var data userData
// data.User.Read("username", vestigo.Param(r, "username"))
}
// }
//Update user
func (p Post) Update(w http.ResponseWriter, r *http.Request) {
// //Update user
// func (p Post) Update(w http.ResponseWriter, r *http.Request) {
}
// }
//Delete user
func (p Post) Delete(w http.ResponseWriter, r *http.Request) {
fmt.Println("Deleting " + vestigo.Param(r, "username"))
var user models.User
user.Delete("username", vestigo.Param(r, "username"))
http.Redirect(w, r, "/user", http.StatusFound)
// //Delete user
// func (p Post) Delete(w http.ResponseWriter, r *http.Request) {
// fmt.Println("Deleting " + vestigo.Param(r, "username"))
// var user models.User
// user.Delete("username", vestigo.Param(r, "username"))
// http.Redirect(w, r, "/user", http.StatusFound)
}
// }

View File

@ -1,72 +1,72 @@
package controllers
// package controllers
import (
"errors"
"net/http"
// import (
// "errors"
// "net/http"
"git.1248.nz/1248/Otfe/misc/cookie"
"git.1248.nz/1248/Otfe/misc/helpers"
"git.1248.nz/1248/Otfe/misc/rand"
"git.1248.nz/1248/Otfe/models"
)
// "git.technical.kiwi/go/otfe/misc/cookie"
// "git.technical.kiwi/go/otfe/misc/helpers"
// "git.technical.kiwi/go/otfe/misc/rand"
// "git.technical.kiwi/go/otfe/models"
// )
//Session controllers
type Session struct{}
// //Session controllers
// type Session struct{}
type pageData struct {
Title string
Err string
User models.User
}
// type pageData struct {
// Title string
// Err string
// User models.User
// }
//New login form
func (s *Session) New(w http.ResponseWriter, r *http.Request) {
var err error
data := pageData{Title: "Login"}
data.Err, err = cookie.Read(r, "error")
if err == nil {
cookie.Delete(w, "error")
}
t(w, data, "/static/login.gtpl")
}
// //New login form
// func (s *Session) New(w http.ResponseWriter, r *http.Request) {
// var err error
// data := pageData{Title: "Login"}
// data.Err, err = cookie.Read(r, "error")
// if err == nil {
// cookie.Delete(w, "error")
// }
// t(w, data, "/static/login.gtpl")
// }
//Create a new session
func (s *Session) Create(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
//Get email and password and check they are not empty
email := r.Form.Get("email")
password := r.Form.Get("password")
// //Create a new session
// func (s *Session) Create(w http.ResponseWriter, r *http.Request) {
// r.ParseForm()
// //Get email and password and check they are not empty
// email := r.Form.Get("email")
// password := r.Form.Get("password")
//Check if user exists
var user models.User
// //Check if user exists
// var user models.User
//Check password is correct
if user.Read("email", email) == nil &&
helpers.CheckPasswordHash(password, user.Password) == nil {
id, _ := rand.B64String(32)
sess := models.Session{ID: id, UserID: user.ID}
sess.Create()
cookie.Create(w, "session", sess.ID)
http.Redirect(w, r, "/", http.StatusFound)
} else {
loginFail(w, r, errors.New("Email or password incorrect"))
}
}
// //Check password is correct
// if user.Read("email", email) == nil &&
// helpers.CheckPasswordHash(password, user.Password) == nil {
// id, _ := rand.B64String(32)
// sess := models.Session{ID: id, UserID: user.ID}
// sess.Create()
// cookie.Create(w, "session", sess.ID)
// http.Redirect(w, r, "/", http.StatusFound)
// } else {
// loginFail(w, r, errors.New("Email or password incorrect"))
// }
// }
//Delete session
func (s *Session) Delete(w http.ResponseWriter, r *http.Request) {
id, err := cookie.Read(r, "session")
//Check user is logged in
if err == nil {
cookie.Delete(w, "session")
var session models.Session
session.Delete(id)
http.Redirect(w, r, "/", http.StatusFound)
}
// //Delete session
// func (s *Session) Delete(w http.ResponseWriter, r *http.Request) {
// id, err := cookie.Read(r, "session")
// //Check user is logged in
// if err == nil {
// cookie.Delete(w, "session")
// var session models.Session
// session.Delete(id)
// http.Redirect(w, r, "/", http.StatusFound)
// }
}
// }
func loginFail(w http.ResponseWriter, r *http.Request, err error) {
cookie.Create(w, "error", err.Error())
http.Redirect(w, r, "/login", http.StatusFound)
}
// func loginFail(w http.ResponseWriter, r *http.Request, err error) {
// cookie.Create(w, "error", err.Error())
// http.Redirect(w, r, "/login", http.StatusFound)
// }

View File

@ -1,102 +1,102 @@
package controllers_test
// package controllers_test
import (
"net/http"
"net/http/httptest"
"net/url"
"strings"
"testing"
// import (
// "net/http"
// "net/http/httptest"
// "net/url"
// "strings"
// "testing"
"git.1248.nz/1248/Otfe/controllers"
"git.1248.nz/1248/Otfe/misc/b64"
"git.1248.nz/1248/Otfe/misc/helpers"
"git.1248.nz/1248/Otfe/models"
)
// "git.technical.kiwi/go/otfe/controllers"
// "git.technical.kiwi/go/otfe/misc/b64"
// "git.technical.kiwi/go/otfe/misc/helpers"
// "git.technical.kiwi/go/otfe/models"
// )
func TestSessionNew(t *testing.T) {
var s controllers.Session
handler := http.HandlerFunc(s.New)
req, err := http.NewRequest("GET", "/login", nil)
w := httptest.NewRecorder()
if err != nil {
t.Fatal(err)
}
handler(w, req)
body := w.Body.String()
if !strings.Contains(body, "<title>Login</title>") {
t.Fail()
}
}
// func TestSessionNew(t *testing.T) {
// var s controllers.Session
// handler := http.HandlerFunc(s.New)
// req, err := http.NewRequest("GET", "/login", nil)
// w := httptest.NewRecorder()
// if err != nil {
// t.Fatal(err)
// }
// handler(w, req)
// body := w.Body.String()
// if !strings.Contains(body, "<title>Login</title>") {
// t.Fail()
// }
// }
func TestSessionCreate(t *testing.T) {
//Create test user
// func TestSessionCreate(t *testing.T) {
// //Create test user
var s controllers.Session
handler := http.HandlerFunc(s.Create)
req, w := setup(t, "POST", "/login")
// var s controllers.Session
// handler := http.HandlerFunc(s.Create)
// req, w := setup(t, "POST", "/login")
addTofForm(req, "email=test", "password=test")
handler(w, req)
// addTofForm(req, "email=test", "password=test")
// handler(w, req)
errorMessage := getCookie("error", w.Header()["Set-Cookie"])
t.Log(errorMessage)
t.Log(b64.Decode(errorMessage))
// errorMessage := getCookie("error", w.Header()["Set-Cookie"])
// t.Log(errorMessage)
// t.Log(b64.Decode(errorMessage))
header := w.Header()
sessionid := getCookie("session", header["Set-Cookie"])
var session models.Session
if session.Read(sessionid) != nil {
t.Fatal("Could not find session")
}
// header := w.Header()
// sessionid := getCookie("session", header["Set-Cookie"])
// var session models.Session
// if session.Read(sessionid) != nil {
// t.Fatal("Could not find session")
// }
}
// }
/*func testloginFail(t *testing.T) {
// /*func testloginFail(t *testing.T) {
}*/
// }*/
func setup(t *testing.T, method string, url string) (*http.Request, *httptest.ResponseRecorder) {
req, err := http.NewRequest("POST", "/login", nil)
w := httptest.NewRecorder()
if err != nil {
t.Fatal(err)
}
return req, w
// func setup(t *testing.T, method string, url string) (*http.Request, *httptest.ResponseRecorder) {
// req, err := http.NewRequest("POST", "/login", nil)
// w := httptest.NewRecorder()
// if err != nil {
// t.Fatal(err)
// }
// return req, w
}
// }
func createUser(t *testing.T, email string, password string) models.User {
// func createUser(t *testing.T, email string, password string) models.User {
password, err := helpers.HashPassword(password)
if err != nil {
t.Fatal("Failed to create password")
}
user := models.User{Email: email, Password: password}
if user.Create() != nil {
t.Fatal("failed to create user")
}
// password, err := helpers.HashPassword(password)
// if err != nil {
// t.Fatal("Failed to create password")
// }
// user := models.User{Email: email, Password: password}
// if user.Create() != nil {
// t.Fatal("failed to create user")
// }
return user
}
// return user
// }
func getCookie(name string, cookies []string) string {
for _, cookie := range cookies {
a := strings.Split(cookie, "=")
if a[0] == name {
return a[1]
// func getCookie(name string, cookies []string) string {
// for _, cookie := range cookies {
// a := strings.Split(cookie, "=")
// if a[0] == name {
// return a[1]
}
// }
}
return "Cookie not found"
}
// }
// return "Cookie not found"
// }
func addTofForm(r *http.Request, values ...string) {
form, _ := url.ParseQuery(r.URL.RawQuery)
for _, value := range values {
v := strings.Split(value, "=")
form.Add(v[0], v[1])
}
r.URL.RawQuery = form.Encode()
r.Form.Encode()
}
// func addTofForm(r *http.Request, values ...string) {
// form, _ := url.ParseQuery(r.URL.RawQuery)
// for _, value := range values {
// v := strings.Split(value, "=")
// form.Add(v[0], v[1])
// }
// r.URL.RawQuery = form.Encode()
// r.Form.Encode()
// }

View File

@ -1,29 +1,29 @@
package controllers
// package controllers
import (
"net/http"
// import (
// "net/http"
"git.1248.nz/1248/Otfe/models"
)
// "git.technical.kiwi/go/otfe/models"
// )
//Static pages
type Static struct{}
// //Static pages
// type Static struct{}
type staticData struct {
Title string
User models.User
}
// type staticData struct {
// Title string
// User models.User
// }
type contextKey string
// type contextKey string
func (c contextKey) String() string {
return string(c)
}
// func (c contextKey) String() string {
// return string(c)
// }
//Home page
func (s *Static) Home(w http.ResponseWriter, r *http.Request, u models.User) {
data := staticData{Title: "Otfe"}
data.User = u
//fmt.Fprintln(w, data.User)
t(w, data, "/static/home.gtpl")
}
// //Home page
// func (s *Static) Home(w http.ResponseWriter, r *http.Request, u models.User) {
// data := staticData{Title: "Otfe"}
// data.User = u
// //fmt.Fprintln(w, data.User)
// t(w, data, "/static/home.gtpl")
// }

View File

@ -1,91 +1,91 @@
package controllers
// package controllers
import (
"fmt"
"net/http"
// import (
// "fmt"
// "net/http"
"git.1248.nz/1248/Otfe/misc/auth"
"git.1248.nz/1248/Otfe/misc/helpers"
"git.1248.nz/1248/Otfe/models"
"github.com/husobee/vestigo"
)
// "git.technical.kiwi/go/otfe/misc/auth"
// "git.technical.kiwi/go/otfe/misc/helpers"
// "git.technical.kiwi/go/otfe/models"
// "github.com/husobee/vestigo"
// )
type userData struct {
Title string
Users []models.User
User models.User
}
// type userData struct {
// Title string
// Users []models.User
// User models.User
// }
//User handlers
type User struct{}
// //User handlers
// type User struct{}
//Index list all users
func (u User) Index(w http.ResponseWriter, r *http.Request) {
var err error
data := userData{Title: "Users"}
data.Users, err = data.User.ReadAll()
helpers.CheckError(err)
t(w, data, "/user/users.gtpl")
}
// //Index list all users
// func (u User) Index(w http.ResponseWriter, r *http.Request) {
// var err error
// data := userData{Title: "Users"}
// data.Users, err = data.User.ReadAll()
// helpers.CheckError(err)
// t(w, data, "/user/users.gtpl")
// }
//Show given user
func (u *User) Show(w http.ResponseWriter, r *http.Request, user models.User) {
var data userData
data.User.Read("username", vestigo.Param(r, "username"))
//matchUser(data.User, w, r)
data.Title = data.User.Username
t(w, data, "/user/user.gtpl")
}
// //Show given user
// func (u *User) Show(w http.ResponseWriter, r *http.Request, user models.User) {
// var data userData
// data.User.Read("username", vestigo.Param(r, "username"))
// //matchUser(data.User, w, r)
// data.Title = data.User.Username
// t(w, data, "/user/user.gtpl")
// }
//ShowSelf show given user if they are the same as the authenticated one
func (u *User) ShowSelf(w http.ResponseWriter, r *http.Request, user models.User) {
if user.Username != vestigo.Param(r, "username") {
auth.UnAuth(w)
return
}
var data userData
data.User = user
data.Title = data.User.Username
t(w, data, "/user/user.gtpl")
}
// //ShowSelf show given user if they are the same as the authenticated one
// func (u *User) ShowSelf(w http.ResponseWriter, r *http.Request, user models.User) {
// if user.Username != vestigo.Param(r, "username") {
// auth.UnAuth(w)
// return
// }
// var data userData
// data.User = user
// data.Title = data.User.Username
// t(w, data, "/user/user.gtpl")
// }
//New user form
func (u *User) New(w http.ResponseWriter, r *http.Request) {
data := userData{Title: "New User"}
t(w, data, "/user/new.gtpl")
}
// //New user form
// func (u *User) New(w http.ResponseWriter, r *http.Request) {
// data := userData{Title: "New User"}
// t(w, data, "/user/new.gtpl")
// }
//Create new a user
func (u *User) Create(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
var user models.User
var err error
user.Username = r.Form.Get("username")
user.Email = r.Form.Get("email")
user.Password, err = helpers.HashPassword(r.Form.Get("password"))
helpers.CheckError(err)
user.Create()
http.Redirect(w, r, "/user/"+user.Username, http.StatusFound)
// //Create new a user
// func (u *User) Create(w http.ResponseWriter, r *http.Request) {
// r.ParseForm()
// var user models.User
// var err error
// user.Username = r.Form.Get("username")
// user.Email = r.Form.Get("email")
// user.Password, err = helpers.HashPassword(r.Form.Get("password"))
// helpers.CheckError(err)
// user.Create()
// http.Redirect(w, r, "/user/"+user.Username, http.StatusFound)
}
// }
//Edit form
func (u *User) Edit(w http.ResponseWriter, r *http.Request) {
var data userData
data.User.Read("username", vestigo.Param(r, "username"))
// //Edit form
// func (u *User) Edit(w http.ResponseWriter, r *http.Request) {
// var data userData
// data.User.Read("username", vestigo.Param(r, "username"))
}
// }
//Update user
func (u *User) Update(w http.ResponseWriter, r *http.Request) {
// //Update user
// func (u *User) Update(w http.ResponseWriter, r *http.Request) {
}
// }
//Delete user
func (u *User) Delete(w http.ResponseWriter, r *http.Request) {
fmt.Println("Deleting " + vestigo.Param(r, "username"))
var user models.User
user.Delete("username", vestigo.Param(r, "username"))
http.Redirect(w, r, "/user", http.StatusFound)
// //Delete user
// func (u *User) Delete(w http.ResponseWriter, r *http.Request) {
// fmt.Println("Deleting " + vestigo.Param(r, "username"))
// var user models.User
// user.Delete("username", vestigo.Param(r, "username"))
// http.Redirect(w, r, "/user", http.StatusFound)
}
// }

3
go.mod Normal file
View File

@ -0,0 +1,3 @@
module git.technical.kiwi/go/otfe
go 1.17

View File

@ -1,59 +1,59 @@
package auth
// package auth
import (
"errors"
"net/http"
// import (
// "errors"
// "net/http"
"git.1248.nz/1248/Otfe/models"
)
// "git.technical.kiwi/go/otfe/models"
// )
type auth func(http.ResponseWriter, *http.Request, models.User)
// type auth func(http.ResponseWriter, *http.Request, models.User)
func User(h auth) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
user, _ := getUserSession(r)
h(w, r, user)
}
}
// func User(h auth) http.HandlerFunc {
// return func(w http.ResponseWriter, r *http.Request) {
// user, _ := getUserSession(r)
// h(w, r, user)
// }
// }
func Perm(handler auth, fallback auth, perm string) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
user, err := getUserSession(r)
if err != nil {
http.Redirect(w, r, "/login", http.StatusFound)
return
}
if user.HasPermission(perm) {
handler(w, r, user)
} else {
if fallback == nil {
UnAuth(w)
} else {
fallback(w, r, user)
}
}
// func Perm(handler auth, fallback auth, perm string) http.HandlerFunc {
// return func(w http.ResponseWriter, r *http.Request) {
// user, err := getUserSession(r)
// if err != nil {
// http.Redirect(w, r, "/login", http.StatusFound)
// return
// }
// if user.HasPermission(perm) {
// handler(w, r, user)
// } else {
// if fallback == nil {
// UnAuth(w)
// } else {
// fallback(w, r, user)
// }
// }
}
// }
}
// }
func getUserSession(r *http.Request) (models.User, error) {
var session models.Session
var user models.User
//Check for session in db
err := session.Get(r)
if err == nil {
//Get user associated with the session
err = user.Read("_id", session.UserID)
if err == nil {
return user, nil
// func getUserSession(r *http.Request) (models.User, error) {
// var session models.Session
// var user models.User
// //Check for session in db
// err := session.Get(r)
// if err == nil {
// //Get user associated with the session
// err = user.Read("_id", session.UserID)
// if err == nil {
// return user, nil
}
}
return user, errors.New("User not logged in")
}
// }
// }
// return user, errors.New("User not logged in")
// }
func UnAuth(w http.ResponseWriter) {
http.Error(w, "You are not authorized to view this page",
http.StatusForbidden)
}
// func UnAuth(w http.ResponseWriter) {
// http.Error(w, "You are not authorized to view this page",
// http.StatusForbidden)
// }

View File

@ -1,113 +1,113 @@
package auth
// package auth
import (
"fmt"
"net/http"
"net/http/httptest"
"strings"
"testing"
// import (
// "fmt"
// "net/http"
// "net/http/httptest"
// "strings"
// "testing"
"git.1248.nz/1248/Otfe/misc/helpers"
"git.1248.nz/1248/Otfe/misc/helpers/cookie"
"git.1248.nz/1248/Otfe/models"
"github.com/globalsign/mgo/bson"
)
// "git.technical.kiwi/go/otfe/misc/helpers"
// "git.technical.kiwi/go/otfe/misc/helpers/cookie"
// "git.technical.kiwi/go/otfe/models"
// "github.com/globalsign/mgo/bson"
// )
func TestUser(t *testing.T) {
//Setup user with session
recorder := httptest.NewRecorder()
user, session := userSession(t)
request := request(t, session)
u := User(handler)
//Run
u(recorder, request)
//Check
body := recorder.Body.String()
if !strings.Contains(body, user.ID.Hex()) {
t.Fail()
}
//Setup without session
recorder = httptest.NewRecorder()
request, _ = http.NewRequest("GET", "/", nil)
//Run
u(recorder, request)
//Check
helpers.Equals(t, recorder.Body.String(),
"{ObjectIdHex(\"\") ObjectIdHex(\"\") []}")
// func TestUser(t *testing.T) {
// //Setup user with session
// recorder := httptest.NewRecorder()
// user, session := userSession(t)
// request := request(t, session)
// u := User(handler)
// //Run
// u(recorder, request)
// //Check
// body := recorder.Body.String()
// if !strings.Contains(body, user.ID.Hex()) {
// t.Fail()
// }
// //Setup without session
// recorder = httptest.NewRecorder()
// request, _ = http.NewRequest("GET", "/", nil)
// //Run
// u(recorder, request)
// //Check
// helpers.Equals(t, recorder.Body.String(),
// "{ObjectIdHex(\"\") ObjectIdHex(\"\") []}")
}
// }
func TestPerm(t *testing.T) {
p := Perm(handler, UnAuth, "perm")
recorder := httptest.NewRecorder()
user, session := userSession(t)
request := request(t, session)
p(recorder, request)
if !strings.Contains(recorder.Body.String(),
"You are not authorized to view this page") {
t.Log("Authorization fail")
t.Fail()
}
// func TestPerm(t *testing.T) {
// p := Perm(handler, UnAuth, "perm")
// recorder := httptest.NewRecorder()
// user, session := userSession(t)
// request := request(t, session)
// p(recorder, request)
// if !strings.Contains(recorder.Body.String(),
// "You are not authorized to view this page") {
// t.Log("Authorization fail")
// t.Fail()
// }
p = Perm(handler, UnAuth, "test")
recorder = httptest.NewRecorder()
p(recorder, request)
if !strings.Contains(recorder.Body.String(), user.ID.Hex()) {
t.Log("Has permission fail")
t.Fail()
}
// p = Perm(handler, UnAuth, "test")
// recorder = httptest.NewRecorder()
// p(recorder, request)
// if !strings.Contains(recorder.Body.String(), user.ID.Hex()) {
// t.Log("Has permission fail")
// t.Fail()
// }
recorder = httptest.NewRecorder()
request, err := http.NewRequest("GET", "/", nil)
helpers.Ok(t, err)
p(recorder, request)
if !strings.Contains(recorder.Body.String(), "login") {
t.Log("Login fail")
t.Fail()
}
// recorder = httptest.NewRecorder()
// request, err := http.NewRequest("GET", "/", nil)
// helpers.Ok(t, err)
// p(recorder, request)
// if !strings.Contains(recorder.Body.String(), "login") {
// t.Log("Login fail")
// t.Fail()
// }
}
// }
func TestGetUserSession(t *testing.T) {
user, session := userSession(t)
request := request(t, session)
//Test
user2, err := getUserSession(request)
helpers.Ok(t, err)
helpers.Equals(t, user, user2)
// func TestGetUserSession(t *testing.T) {
// user, session := userSession(t)
// request := request(t, session)
// //Test
// user2, err := getUserSession(request)
// helpers.Ok(t, err)
// helpers.Equals(t, user, user2)
}
// }
func userSession(t *testing.T) (models.User, models.Session) {
models.DBWipeCollection("user", "session", "group")
// func userSession(t *testing.T) (models.User, models.Session) {
// models.DBWipeCollection("user", "session", "group")
group := models.NewGroup("test")
group.ID = bson.NewObjectId()
group.Permissions["test"] = true
//group.Admin = true
helpers.Ok(t, group.Create())
// group := models.NewGroup("test")
// group.ID = bson.NewObjectId()
// group.Permissions["test"] = true
// //group.Admin = true
// helpers.Ok(t, group.Create())
user := models.User{Name: "test",
Email: "test"}
user.ID = bson.NewObjectId()
user.PrimaryGroup = group.ID
helpers.Ok(t, user.Create())
// user := models.User{Name: "test",
// Email: "test"}
// user.ID = bson.NewObjectId()
// user.PrimaryGroup = group.ID
// helpers.Ok(t, user.Create())
session := models.Session{UserID: user.ID}
session.ID = bson.NewObjectId()
helpers.Ok(t, session.Create())
return user, session
}
// session := models.Session{UserID: user.ID}
// session.ID = bson.NewObjectId()
// helpers.Ok(t, session.Create())
// return user, session
// }
func request(t *testing.T, s models.Session) *http.Request {
cookie := &http.Cookie{Name: "session",
Value: cookie.Encode(s.ID.Hex())}
request, err := http.NewRequest("GET", "/", nil)
helpers.Ok(t, err)
request.AddCookie(cookie)
return request
}
// func request(t *testing.T, s models.Session) *http.Request {
// cookie := &http.Cookie{Name: "session",
// Value: cookie.Encode(s.ID.Hex())}
// request, err := http.NewRequest("GET", "/", nil)
// helpers.Ok(t, err)
// request.AddCookie(cookie)
// return request
// }
func handler(w http.ResponseWriter, r *http.Request, u models.User) {
fmt.Fprint(w, u)
}
// func handler(w http.ResponseWriter, r *http.Request, u models.User) {
// fmt.Fprint(w, u)
// }

View File

@ -1,12 +1,12 @@
package b64
// package b64
import "encoding/base64"
// import "encoding/base64"
func Encode(src string) string {
return base64.URLEncoding.EncodeToString([]byte(src))
}
// func Encode(src string) string {
// return base64.URLEncoding.EncodeToString([]byte(src))
// }
func Decode(src string) (string, error) {
value, err := base64.URLEncoding.DecodeString(src)
return string(value), err
}
// func Decode(src string) (string, error) {
// value, err := base64.URLEncoding.DecodeString(src)
// return string(value), err
// }

View File

@ -1,60 +1,60 @@
package config
// package config
import (
"encoding/hex"
"path/filepath"
// import (
// "encoding/hex"
// "path/filepath"
"git.1248.nz/1248/Otfe/misc/helpers"
// "git.technical.kiwi/go/otfe/misc/helpers"
"github.com/BurntSushi/toml"
)
// "github.com/BurntSushi/toml"
// )
//Configuration struct
type Configuration struct {
DB database `toml:"database"`
Session session
}
// //Configuration struct
// type Configuration struct {
// DB database `toml:"database"`
// Session session
// }
// Database stuct
type database struct {
Host string
Name string
User string
Password string
}
// // Database stuct
// type database struct {
// Host string
// Name string
// User string
// Password string
// }
type session struct {
SecretKey string
Sessionkey string
Timeout int
}
// type session struct {
// SecretKey string
// Sessionkey string
// Timeout int
// }
var config *Configuration
// var config *Configuration
func init() {
Get()
}
// func init() {
// Get()
// }
// Get config info from toml config file
func Get() *Configuration {
if config == nil {
_, err := toml.DecodeFile(getConfigFile(), &config)
helpers.CheckError(err)
}
return config
}
// // Get config info from toml config file
// func Get() *Configuration {
// if config == nil {
// _, err := toml.DecodeFile(getConfigFile(), &config)
// helpers.CheckError(err)
// }
// return config
// }
func getConfigFile() string {
return filepath.Join(helpers.GetRootDir(), "config.toml")
}
// func getConfigFile() string {
// return filepath.Join(helpers.GetRootDir(), "config.toml")
// }
func GetSecretKey() []byte {
config := Get()
key, err := hex.DecodeString(config.Session.SecretKey)
helpers.CheckError(err)
return key
}
// func GetSecretKey() []byte {
// config := Get()
// key, err := hex.DecodeString(config.Session.SecretKey)
// helpers.CheckError(err)
// return key
// }
func GetSessionKey() string {
return Get().Session.Sessionkey
}
// func GetSessionKey() string {
// return Get().Session.Sessionkey
// }

View File

@ -1,7 +1,7 @@
package config
// package config
import "testing"
// import "testing"
func TestGetConfigFile(t *testing.T) {
t.Log(Get())
}
// func TestGetConfigFile(t *testing.T) {
// t.Log(Get())
// }

View File

@ -1,31 +0,0 @@
package cookie
import (
"errors"
"net/http"
"time"
"git.1248.nz/1248/Otfe/misc/b64"
)
func Create(w http.ResponseWriter, name string, value string) {
c := &http.Cookie{Name: name, Value: b64.Encode(value)}
http.SetCookie(w, c)
}
func Read(r *http.Request, name string) (string, error) {
c, err := r.Cookie(name)
if err != nil {
return "", errors.New("Cookie not found")
}
value, err := b64.Decode(c.Value)
if err != nil {
return "", errors.New("Failed to decode cookie")
}
return value, nil
}
func Delete(w http.ResponseWriter, name string) {
http.SetCookie(w, &http.Cookie{Name: name, MaxAge: -1, Expires: time.Unix(1, 0)})
}

View File

@ -1,39 +0,0 @@
package cookie
import (
"net/http"
"net/http/httptest"
"testing"
"git.1248.nz/1248/Otfe/misc/b64"
"git.1248.nz/1248/Otfe/misc/helpers"
)
func TestCreate(t *testing.T) {
recorder := httptest.NewRecorder()
Create(recorder, "test", "test")
request := &http.Request{Header: http.Header{
"Cookie": recorder.HeaderMap["Set-Cookie"]}}
cookie, err := request.Cookie("test")
if err != nil {
t.Fail()
return
}
value, err := b64.Decode(cookie.Value)
if err != nil || value != "test" {
t.Fail()
}
}
func TestRead(t *testing.T) {
cookie := &http.Cookie{Name: "test", Value: b64.Encode("test")}
request, err := http.NewRequest("GET", "", nil)
if err != nil {
t.Fail()
return
}
request.AddCookie(cookie)
value, err := Read(request, "test")
helpers.Equals(t, value, "test")
}

View File

@ -1,55 +1,55 @@
package helpers
// package helpers
import (
"crypto/rand"
"encoding/hex"
"log"
"path/filepath"
"runtime"
// import (
// "crypto/rand"
// "encoding/hex"
// "log"
// "path/filepath"
// "runtime"
"golang.org/x/crypto/bcrypt"
)
// "golang.org/x/crypto/bcrypt"
// )
//CheckError checks for errors and logs them and stops the program
func CheckError(err error) bool {
if err != nil {
log.Fatal(err)
return false
}
return true
}
// //CheckError checks for errors and logs them and stops the program
// func CheckError(err error) bool {
// if err != nil {
// log.Fatal(err)
// return false
// }
// return true
// }
func GetRootDir() string {
_, b, _, _ := runtime.Caller(0)
dir := filepath.Dir(b)
return filepath.Dir(filepath.Dir(dir))
}
// func GetRootDir() string {
// _, b, _, _ := runtime.Caller(0)
// dir := filepath.Dir(b)
// return filepath.Dir(filepath.Dir(dir))
// }
func GetAssets() string {
return GetRootDir()
}
// func GetAssets() string {
// return GetRootDir()
// }
func HashPassword(password string) (string, error) {
hash, err := bcrypt.GenerateFromPassword([]byte(password), 14)
return string(hash), err
}
// func HashPassword(password string) (string, error) {
// hash, err := bcrypt.GenerateFromPassword([]byte(password), 14)
// return string(hash), err
// }
func CheckPasswordHash(password, hash string) error {
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
return err
}
// func CheckPasswordHash(password, hash string) error {
// err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
// return err
// }
func RandHex() string {
bytes := make([]byte, 12)
rand.Read(bytes)
return hex.EncodeToString(bytes)
}
// func RandHex() string {
// bytes := make([]byte, 12)
// rand.Read(bytes)
// return hex.EncodeToString(bytes)
// }
func Bytes(n int) ([]byte, error) {
b := make([]byte, n)
_, err := rand.Read(b)
if err != nil {
return nil, err
}
return b, nil
}
// func Bytes(n int) ([]byte, error) {
// b := make([]byte, n)
// _, err := rand.Read(b)
// if err != nil {
// return nil, err
// }
// return b, nil
// }

View File

@ -1,35 +1,35 @@
package helpers_test
// package helpers_test
import (
"testing"
// import (
// "testing"
"git.1248.nz/1248/Otfe/misc/helpers"
"git.1248.nz/1248/Otfe/models"
)
// "git.technical.kiwi/go/otfe/misc/helpers"
// "git.technical.kiwi/go/otfe/models"
// )
func TestGetRootDir(t *testing.T) {
t.Log("Root path:", helpers.GetRootDir())
}
// func TestGetRootDir(t *testing.T) {
// t.Log("Root path:", helpers.GetRootDir())
// }
func TestHashPassword(t *testing.T) {
user := models.User{Email: "a@a.com", Username: "a"}
user.Delete("username", "a")
var err error
password := "43539jgifdkvnm4935078uJKJR**$ufjqd98438uiAHFJean89q34JKDFJ"
user.Password, err = helpers.HashPassword(password)
if err != nil {
t.Fail()
}
user.Create()
var user2 models.User
user2.Read("username", "a")
// func TestHashPassword(t *testing.T) {
// user := models.User{Email: "a@a.com", Username: "a"}
// user.Delete("username", "a")
// var err error
// password := "43539jgifdkvnm4935078uJKJR**$ufjqd98438uiAHFJean89q34JKDFJ"
// user.Password, err = helpers.HashPassword(password)
// if err != nil {
// t.Fail()
// }
// user.Create()
// var user2 models.User
// user2.Read("username", "a")
t.Log(helpers.CheckPasswordHash(password, user2.Password))
// t.Log(helpers.CheckPasswordHash(password, user2.Password))
}
// }
func TestRandHex(t *testing.T) {
for i := 0; i < 20; i++ {
t.Log(helpers.RandHex())
}
}
// func TestRandHex(t *testing.T) {
// for i := 0; i < 20; i++ {
// t.Log(helpers.RandHex())
// }
// }

View File

@ -1,36 +1,36 @@
package helpers
// package helpers
import (
"fmt"
"path/filepath"
"reflect"
"runtime"
"testing"
)
// import (
// "fmt"
// "path/filepath"
// "reflect"
// "runtime"
// "testing"
// )
// assert fails the test if the condition is false.
func Assert(tb testing.TB, condition bool, msg string, v ...interface{}) {
if !condition {
_, file, line, _ := runtime.Caller(1)
fmt.Printf("\033[31m%s:%d: "+msg+"\033[39m\n\n", append([]interface{}{filepath.Base(file), line}, v...)...)
tb.FailNow()
}
}
// // assert fails the test if the condition is false.
// func Assert(tb testing.TB, condition bool, msg string, v ...interface{}) {
// if !condition {
// _, file, line, _ := runtime.Caller(1)
// fmt.Printf("\033[31m%s:%d: "+msg+"\033[39m\n\n", append([]interface{}{filepath.Base(file), line}, v...)...)
// tb.FailNow()
// }
// }
// ok fails the test if an err is not nil.
func Ok(tb testing.TB, err error) {
if err != nil {
_, file, line, _ := runtime.Caller(1)
fmt.Printf("\033[31m%s:%d: unexpected error: %s\033[39m\n\n", filepath.Base(file), line, err.Error())
tb.FailNow()
}
}
// // ok fails the test if an err is not nil.
// func Ok(tb testing.TB, err error) {
// if err != nil {
// _, file, line, _ := runtime.Caller(1)
// fmt.Printf("\033[31m%s:%d: unexpected error: %s\033[39m\n\n", filepath.Base(file), line, err.Error())
// tb.FailNow()
// }
// }
// equals fails the test if exp is not equal to act.
func Equals(tb testing.TB, exp, act interface{}) {
if !reflect.DeepEqual(exp, act) {
_, file, line, _ := runtime.Caller(1)
fmt.Printf("\033[31m%s:%d:\n\n\texp: %#v\n\n\tgot: %#v\033[39m\n\n", filepath.Base(file), line, exp, act)
tb.FailNow()
}
}
// // equals fails the test if exp is not equal to act.
// func Equals(tb testing.TB, exp, act interface{}) {
// if !reflect.DeepEqual(exp, act) {
// _, file, line, _ := runtime.Caller(1)
// fmt.Printf("\033[31m%s:%d:\n\n\texp: %#v\n\n\tgot: %#v\033[39m\n\n", filepath.Base(file), line, exp, act)
// tb.FailNow()
// }
// }

View File

@ -1,20 +1,20 @@
package rand
// package rand
import (
"crypto/rand"
// import (
// "crypto/rand"
"git.1248.nz/1248/Otfe/misc/b64"
)
// "git.technical.kiwi/go/otfe/misc/b64"
// )
//Bytes generates an random set of bytes n long
func Bytes(n int) ([]byte, error) {
b := make([]byte, n)
_, err := rand.Read(b)
return b, err
}
// //Bytes generates an random set of bytes n long
// func Bytes(n int) ([]byte, error) {
// b := make([]byte, n)
// _, err := rand.Read(b)
// return b, err
// }
//B64String generates a base 64 string n bytess long
func B64String(n int) (string, error) {
b, err := Bytes(n)
return b64.Encode(string(b)), err
}
// //B64String generates a base 64 string n bytess long
// func B64String(n int) (string, error) {
// b, err := Bytes(n)
// return b64.Encode(string(b)), err
// }

View File

@ -1,41 +1,41 @@
package main
// package main
import (
"git.1248.nz/1248/Otfe/misc/helpers"
"git.1248.nz/1248/Otfe/models"
"github.com/globalsign/mgo/bson"
)
// import (
// "git.technical.kiwi/go/otfe/misc/helpers"
// "git.technical.kiwi/go/otfe/models"
// "github.com/globalsign/mgo/bson"
// )
func main() {
models.DBWipeCollection("group", "user", "session")
//admin user and group
adminGroup := models.NewGroup("admin")
adminGroup.Admin = true
adminGroup.ID = bson.NewObjectId()
adminGroup.Permissions["user.show"] = true
// func main() {
// models.DBWipeCollection("group", "user", "session")
// //admin user and group
// adminGroup := models.NewGroup("admin")
// adminGroup.Admin = true
// adminGroup.ID = bson.NewObjectId()
// adminGroup.Permissions["user.show"] = true
admin := models.User{}
admin.Username = "admin"
admin.Email = "admin"
admin.ID = bson.NewObjectId()
admin.Password, _ = helpers.HashPassword("admin")
admin.PrimaryGroup = adminGroup.ID
adminGroup.Users = append(adminGroup.Users, admin.ID)
adminGroup.Create()
admin.Create()
// admin := models.User{}
// admin.Username = "admin"
// admin.Email = "admin"
// admin.ID = bson.NewObjectId()
// admin.Password, _ = helpers.HashPassword("admin")
// admin.PrimaryGroup = adminGroup.ID
// adminGroup.Users = append(adminGroup.Users, admin.ID)
// adminGroup.Create()
// admin.Create()
//user and user group
userGroup := models.NewGroup("user")
userGroup.ID = bson.NewObjectId()
userGroup.Admin = false
user := models.User{}
user.ID = bson.NewObjectId()
user.Username = "user"
user.Email = "u"
user.Password, _ = helpers.HashPassword("user")
user.PrimaryGroup = userGroup.ID
userGroup.Users = append(userGroup.Users, user.ID)
user.Create()
userGroup.Create()
// //user and user group
// userGroup := models.NewGroup("user")
// userGroup.ID = bson.NewObjectId()
// userGroup.Admin = false
// user := models.User{}
// user.ID = bson.NewObjectId()
// user.Username = "user"
// user.Email = "u"
// user.Password, _ = helpers.HashPassword("user")
// user.PrimaryGroup = userGroup.ID
// userGroup.Users = append(userGroup.Users, user.ID)
// user.Create()
// userGroup.Create()
}
// }

View File

@ -1,50 +1,50 @@
package models
// package models
import (
"github.com/jinzhu/gorm"
)
// import (
// "github.com/jinzhu/gorm"
// )
//Group type
type Group struct {
gorm.Model
Name string
Permissions map[string]bool
Admin bool
Users []string
}
// //Group type
// type Group struct {
// gorm.Model
// Name string
// Permissions map[string]bool
// Admin bool
// Users []string
// }
func NewGroup(Name string) Group {
var group Group
group.Permissions = make(map[string]bool)
return group
}
// func NewGroup(Name string) Group {
// var group Group
// group.Permissions = make(map[string]bool)
// return group
// }
//Create group
func (g *Group) Create() error {
return create(&g)
}
// //Create group
// func (g *Group) Create() error {
// return create(&g)
// }
//Read group
func (g *Group) Read() error {
return read(&g)
// //Read group
// func (g *Group) Read() error {
// return read(&g)
}
// }
//ReadAll groups
func (g *Group) ReadAll() ([]Group, error) {
var groups []Group
var err error
err = readAll(&groups)
return groups, err
}
// //ReadAll groups
// func (g *Group) ReadAll() ([]Group, error) {
// var groups []Group
// var err error
// err = readAll(&groups)
// return groups, err
// }
//Update group
func (g *Group) Update() error {
return update(&g)
}
// //Update group
// func (g *Group) Update() error {
// return update(&g)
// }
//Delete group
func (g *Group) Delete() error {
err := delete(&g)
return err
}
// //Delete group
// func (g *Group) Delete() error {
// err := delete(&g)
// return err
// }

View File

@ -1,25 +1,25 @@
package models
// package models
import (
"testing"
// import (
// "testing"
"github.com/globalsign/mgo/bson"
)
// "github.com/globalsign/mgo/bson"
// )
func TestCreateGroup(t *testing.T) {
group := NewGroup("test")
group.Users = append(group.Users, bson.NewObjectId())
group.Permissions["test"] = true
t.Log(group.Create())
}
// func TestCreateGroup(t *testing.T) {
// group := NewGroup("test")
// group.Users = append(group.Users, bson.NewObjectId())
// group.Permissions["test"] = true
// t.Log(group.Create())
// }
func TestReadGroup(t *testing.T) {
var group Group
group.Read("name", "test")
t.Log(group)
}
// func TestReadGroup(t *testing.T) {
// var group Group
// group.Read("name", "test")
// t.Log(group)
// }
func TestReadAllGroup(t *testing.T) {
var group Group
t.Log(group.ReadAll())
}
// func TestReadAllGroup(t *testing.T) {
// var group Group
// t.Log(group.ReadAll())
// }

View File

@ -1,33 +1,27 @@
package models
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres" //
_ "github.com/jinzhu/gorm/dialects/postgres"
"gorm.io/driver/sqlite"
)
const (
host = "localhost"
port = 5432
user = "test"
password = "test"
dbname = "test"
)
// var (
// gormdb, err =
// store = gormstore.New(gormdb, []byte("secret"))
// )
var psqlInfo string
var db *gorm.DB
func init() {
psqlInfo = fmt.Sprintf("host=%s port=%d user=%s "+
"password=%s dbname=%s sslmode=disable",
host, port, user, password, dbname)
DB()
}
func DB() (*gorm.DB, error) {
if db == nil {
db, err := gorm.Open("postgres", psqlInfo)
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
db.LogMode(true)
return db, err
}

View File

@ -1,37 +1,42 @@
package models
package models_test
import (
"testing"
"git.technical.kiwi/go/otfe/models"
)
func TestGetSession(t *testing.T) {
GetMongoSession()
func TestGetDB(t *testing.T) {
db, err := models.DB()
if !err || !db {
t.Fail()
}
}
func TestGetCollection(t *testing.T) {
GetCollection("test")
//GetCollection("test")
}
func TestCreate(t *testing.T) {
create("user", &User{Name: "Ale"})
//create("user", &User{Name: "Ale"})
}
func TestReadAll(t *testing.T) {
var u []User
readAll("user", "", nil, &u)
t.Log(u)
//var u []User
//readAll("user", "", nil, &u)
//t.Log(u)
}
func TestRead(t *testing.T) {
var u User
read("user", "name", "Ann", &u)
t.Log(u)
//var u User
//read("user", "name", "Ann", &u)
//t.Log(u)
}
func TestUpdate(t *testing.T) {
update("test", "name", "Ale", &User{Name: "Bob", Email: "z"})
//update("test", "name", "Ale", &User{Name: "Bob", Email: "z"})
}
func TestDelete(t *testing.T) {
t.Log(delete("user", "name", "Ann"))
//t.Log(delete("user", "name", "Ann"))
}

View File

@ -1,33 +1,33 @@
package models
// package models
import (
"time"
// import (
// "time"
"github.com/jinzhu/gorm"
)
// "github.com/jinzhu/gorm"
// )
//Post model
type Post struct {
gorm.Model
Title string
Author string
Published time.Time
LastEdited time.Time
Content []byte
}
// //Post model
// type Post struct {
// gorm.Model
// Title string
// Author string
// Published time.Time
// LastEdited time.Time
// Content []byte
// }
//Create new post
func (p Post) Create() error {
return create(&p)
}
// //Create new post
// func (p Post) Create() error {
// return create(&p)
// }
func (p *Post) Read() (*Post, error) {
err := read(&p)
return p, err
}
// func (p *Post) Read() (*Post, error) {
// err := read(&p)
// return p, err
// }
func (p Post) ReadAll() ([]Post, error) {
var posts []Post
err := readAll(&posts)
return posts, err
}
// func (p Post) ReadAll() ([]Post, error) {
// var posts []Post
// err := readAll(&posts)
// return posts, err
// }

View File

@ -4,7 +4,7 @@ import (
"net/http"
"time"
"git.1248.nz/1248/Otfe/misc/cookie"
"git.technical.kiwi/go/otfe/misc/cookie"
"github.com/globalsign/mgo/bson"
"github.com/jinzhu/gorm"
)

View File

@ -1,51 +1,51 @@
package models
// package models
import (
"net/http"
"testing"
// import (
// "net/http"
// "testing"
"git.1248.nz/1248/Otfe/misc/b64"
"git.1248.nz/1248/Otfe/misc/helpers"
"git.1248.nz/1248/Otfe/misc/rand"
)
// "git.technical.kiwi/go/otfe/misc/b64"
// "git.technical.kiwi/go/otfe/misc/helpers"
// "git.technical.kiwi/go/otfe/misc/rand"
// )
func TestSessionCreate(t *testing.T) {
var s1, s2 Session
s1.ID, _ = rand.B64String(32)
if s1.Create() != nil {
t.Fail()
}
read("session", "_id", s1.ID, &s2)
// func TestSessionCreate(t *testing.T) {
// var s1, s2 Session
// s1.ID, _ = rand.B64String(32)
// if s1.Create() != nil {
// t.Fail()
// }
// read("session", "_id", s1.ID, &s2)
if s1.ID != s2.ID {
t.Fail()
}
}
// if s1.ID != s2.ID {
// t.Fail()
// }
// }
func TestSessionRead(t *testing.T) {
var s1, s2 Session
s1.ID, _ = rand.B64String(32)
if create("session", &s1) != nil {
t.Fatal("Failed to create session")
}
if s2.Read(s1.ID) != nil {
t.Fatal("Failed to read session")
}
if s1.ID != s2.ID {
t.Fatal("Ids don't match")
}
}
// func TestSessionRead(t *testing.T) {
// var s1, s2 Session
// s1.ID, _ = rand.B64String(32)
// if create("session", &s1) != nil {
// t.Fatal("Failed to create session")
// }
// if s2.Read(s1.ID) != nil {
// t.Fatal("Failed to read session")
// }
// if s1.ID != s2.ID {
// t.Fatal("Ids don't match")
// }
// }
func TestGet(t *testing.T) {
DBWipeCollection("session")
var s1, s2 Session
s1.ID, _ = rand.B64String(32)
s1.Create()
c := &http.Cookie{Name: "session",
Value: b64.Encode(s1.ID)}
request, err := http.NewRequest("GET", "/", nil)
helpers.Ok(t, err)
request.AddCookie(c)
s2.Get(request)
helpers.Equals(t, s1, s2)
}
// func TestGet(t *testing.T) {
// DBWipeCollection("session")
// var s1, s2 Session
// s1.ID, _ = rand.B64String(32)
// s1.Create()
// c := &http.Cookie{Name: "session",
// Value: b64.Encode(s1.ID)}
// request, err := http.NewRequest("GET", "/", nil)
// helpers.Ok(t, err)
// request.AddCookie(c)
// s2.Get(request)
// helpers.Equals(t, s1, s2)
// }

View File

@ -1,80 +1,80 @@
package models
// package models
import (
"errors"
"fmt"
// import (
// "errors"
// "fmt"
"github.com/globalsign/mgo/bson"
)
// "github.com/globalsign/mgo/bson"
// )
//User model
type User struct {
ID bson.ObjectId `bson:"_id,omitempty"`
Email string `bson:"email"`
Name string `bson:"name"`
Username string `bson:"username"`
Password string `bson:"password"`
PrimaryGroup bson.ObjectId `bson:"primarygroup,omitempty"`
Groups []bson.ObjectId `bson:"groups,omitempty"`
Session string
}
// //User model
// type User struct {
// ID bson.ObjectId `bson:"_id,omitempty"`
// Email string `bson:"email"`
// Name string `bson:"name"`
// Username string `bson:"username"`
// Password string `bson:"password"`
// PrimaryGroup bson.ObjectId `bson:"primarygroup,omitempty"`
// Groups []bson.ObjectId `bson:"groups,omitempty"`
// Session string
// }
//Create user
func (u *User) Create() error {
var user User
read("user", "email", u.Email, &user)
if u.Email == user.Email {
return errors.New("Email all ready used")
}
return create("user", &u)
// //Create user
// func (u *User) Create() error {
// var user User
// read("user", "email", u.Email, &user)
// if u.Email == user.Email {
// return errors.New("Email all ready used")
// }
// return create("user", &u)
}
// }
//Read user
func (u *User) Read(key string, value interface{}) error {
err := read("user", key, value, &u)
if err != nil {
return errors.New("User doesn't exist")
}
return nil
}
// //Read user
// func (u *User) Read(key string, value interface{}) error {
// err := read("user", key, value, &u)
// if err != nil {
// return errors.New("User doesn't exist")
// }
// return nil
// }
//ReadAll users
func (u *User) ReadAll() ([]User, error) {
var users []User
var err error
err = readAll("user", "", nil, &users)
return users, err
// //ReadAll users
// func (u *User) ReadAll() ([]User, error) {
// var users []User
// var err error
// err = readAll("user", "", nil, &users)
// return users, err
}
// }
//Update user
func (u *User) Update() error {
return update("user", "_id", u.ID, &u)
}
// //Update user
// func (u *User) Update() error {
// return update("user", "_id", u.ID, &u)
// }
//Delete user
func (u *User) Delete(key string, value string) error {
err := delete("user", key, value)
return err
}
// //Delete user
// func (u *User) Delete(key string, value string) error {
// err := delete("user", key, value)
// return err
// }
//HasPermission check if a given user is admin or has a given permisssion
func (u *User) HasPermission(perm string) bool {
var group Group
//Check primary group
err := group.Read("_id", u.PrimaryGroup)
fmt.Println(group.Admin)
if err == nil && (group.Admin == true || group.Permissions[perm] == true) {
// //HasPermission check if a given user is admin or has a given permisssion
// func (u *User) HasPermission(perm string) bool {
// var group Group
// //Check primary group
// err := group.Read("_id", u.PrimaryGroup)
// fmt.Println(group.Admin)
// if err == nil && (group.Admin == true || group.Permissions[perm] == true) {
return true
}
//Check other groups
for id := range u.Groups {
err = group.Read("_id", id)
if err == nil && (group.Admin || group.Permissions[perm]) {
return true
}
}
return false
}
// return true
// }
// //Check other groups
// for id := range u.Groups {
// err = group.Read("_id", id)
// if err == nil && (group.Admin || group.Permissions[perm]) {
// return true
// }
// }
// return false
// }

View File

@ -1,14 +0,0 @@
root: ./
tmp_path: ./tmp
build_name: runner-build
build_log: runner-build-errors.log
valid_ext: .go, .tpl, .tmpl, .html, .ccs, .js, .toml
no_rebuild_ext: .tpl, .tmpl, .html
ignored: assets, tmp
build_delay: 600
colors: 1
log_color_main: cyan
log_color_build: yellow
log_color_runner: green
log_color_watcher: magenta
log_color_app:

1
tmp/build-errors.log Normal file
View File

@ -0,0 +1 @@
exit status 1exit status 1