Put user in backend

This commit is contained in:
Lucas BEE 2019-06-20 12:11:54 +00:00
parent 2ca1097b77
commit 9c429ba3d4
17 changed files with 129 additions and 311 deletions

View File

@ -5,8 +5,8 @@ import (
"fmt"
"net/http"
"git.quimbo.fr/odwrtw/canape/backend/backend"
"git.quimbo.fr/odwrtw/canape/backend/config"
"git.quimbo.fr/odwrtw/canape/backend/users"
"git.quimbo.fr/odwrtw/canape/backend/web"
"github.com/gorilla/mux"
@ -21,7 +21,7 @@ func GetUsersHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error
log.Debug("Getting users")
users, err := users.GetAll(env.Database)
users, err := backend.GetAllUsers(env.Database)
if err != nil {
return env.RenderError(w, err)
}
@ -39,7 +39,7 @@ func GenerateUserToken(env *web.Env, w http.ResponseWriter, r *http.Request) err
vars := mux.Vars(r)
username := vars["username"]
user, err := users.Get(env.Database, username)
user, err := backend.GetUser(env.Database, username)
if err != nil {
return err
}
@ -79,7 +79,7 @@ func UpdateUserHandler(env *web.Env, w http.ResponseWriter, r *http.Request) err
return env.RenderError(w, fmt.Errorf("Empty user id"))
}
user, err := users.GetByID(env.Database, data.ID)
user, err := backend.GetUserByID(env.Database, data.ID)
if err != nil {
return err
}

View File

@ -6,9 +6,10 @@ import (
"strings"
"time"
"git.quimbo.fr/odwrtw/canape/backend/backend"
"git.quimbo.fr/odwrtw/canape/backend/tokens"
jwt "github.com/dgrijalva/jwt-go"
"github.com/jmoiron/sqlx"
"git.quimbo.fr/odwrtw/canape/backend/tokens"
"golang.org/x/crypto/bcrypt"
)
@ -24,20 +25,6 @@ var (
ErrUnauthenticatedUser = fmt.Errorf("Unauthenticated user")
)
// UserBackend interface for user backend
type UserBackend interface {
GetUser(username string) (User, error)
}
// User interface for user
type User interface {
GetName() string
GetHash() string
HasRole(string) bool
IsAdmin() bool
IsActivated() bool
}
// Authorizer handle sesssion
type Authorizer struct {
db *sqlx.DB
@ -46,7 +33,6 @@ type Authorizer struct {
// Params for Authorizer creation
type Params struct {
Backend UserBackend
Pepper string
Cost int
Secret string
@ -71,7 +57,7 @@ func (a *Authorizer) GenHash(password string) (string, error) {
}
// GenerateJWTToken generates a JWT token for a user
func (a *Authorizer) GenerateJWTToken(r *http.Request, u User) (*tokens.Token, error) {
func (a *Authorizer) GenerateJWTToken(r *http.Request, u *backend.User) (*tokens.Token, error) {
// Create a jwt token
jwtToken := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
// Not before
@ -79,7 +65,7 @@ func (a *Authorizer) GenerateJWTToken(r *http.Request, u User) (*tokens.Token, e
// Issued at
"iat": time.Now().Unix(),
// Private claims
"username": u.GetName(),
"username": u.Name,
"isAdmin": u.IsAdmin(),
"isActivated": u.IsActivated(),
})
@ -92,20 +78,20 @@ func (a *Authorizer) GenerateJWTToken(r *http.Request, u User) (*tokens.Token, e
return &tokens.Token{
Token: ss,
Username: u.GetName(),
Username: u.Name,
IP: getIPFromRequest(r),
}, nil
}
// Login cheks password and creates a jwt token
func (a *Authorizer) Login(r *http.Request, username, password string) (*tokens.Token, error) {
u, err := a.Backend.GetUser(username)
u, err := backend.GetUser(a.db, username)
if err != nil {
return nil, err
}
// Compare the password
err = bcrypt.CompareHashAndPassword([]byte(u.GetHash()), []byte(password+a.Pepper))
err = bcrypt.CompareHashAndPassword([]byte(u.Hash), []byte(password+a.Pepper))
if err != nil {
return nil, ErrInvalidPassword
}
@ -123,7 +109,7 @@ func (a *Authorizer) Login(r *http.Request, username, password string) (*tokens.
}
// CurrentUser returns the logged in username from session and verifies the token
func (a *Authorizer) CurrentUser(rw http.ResponseWriter, req *http.Request) (User, error) {
func (a *Authorizer) CurrentUser(rw http.ResponseWriter, req *http.Request) (*backend.User, error) {
var tokenStr string
h := req.Header.Get("Authorization")
if h != "" {
@ -165,13 +151,13 @@ func (a *Authorizer) CurrentUser(rw http.ResponseWriter, req *http.Request) (Use
}
// Get the user
u, err := a.Backend.GetUser(tokenClaims.Username)
u, err := backend.GetUser(a.db, tokenClaims.Username)
if err != nil {
return nil, err
}
// Check the token in database
token, err := tokens.GetUserToken(a.db, u.GetName(), tokenStr)
token, err := tokens.GetUserToken(a.db, u.Name, tokenStr)
if err != nil {
return nil, ErrInvalidToken
}

View File

@ -5,6 +5,7 @@ import (
"net"
"net/http"
"git.quimbo.fr/odwrtw/canape/backend/backend"
"github.com/sirupsen/logrus"
)
@ -29,7 +30,7 @@ func (m *Middleware) ServeHTTP(w http.ResponseWriter, r *http.Request, next http
user, err := m.authorizer.CurrentUser(w, r)
switch err {
case nil:
m.log.Debugf("setting user %s in the context", user.GetName())
m.log.Debugf("setting user %s in the context", user.Name)
ctxKey := authContextKey("auth.user")
ctx := context.WithValue(r.Context(), ctxKey, user)
r = r.WithContext(ctx)
@ -89,7 +90,7 @@ func (m *MiddlewareRole) ServeHTTP(w http.ResponseWriter, r *http.Request, next
}
// GetCurrentUser gets the current user from the request context
func GetCurrentUser(r *http.Request, log *logrus.Entry) User {
func GetCurrentUser(r *http.Request, log *logrus.Entry) *backend.User {
log.Debug("getting user from context")
ctxKey := authContextKey("auth.user")
@ -97,7 +98,7 @@ func GetCurrentUser(r *http.Request, log *logrus.Entry) User {
if u == nil {
return nil
}
user, ok := u.(User)
user, ok := u.(*backend.User)
if !ok {
panic("invalid user type")
}

View File

@ -1,9 +1,6 @@
package backend
import (
"git.quimbo.fr/odwrtw/canape/backend/auth"
"git.quimbo.fr/odwrtw/canape/backend/users"
"github.com/jmoiron/sqlx"
polochon "github.com/odwrtw/polochon/lib"
)
@ -29,9 +26,3 @@ func (b *Backend) Init([]byte) error {
func (b *Backend) Status() (polochon.ModuleStatus, error) {
return polochon.StatusOK, nil
}
// GetUser gets the username from the UserBackend
// Implements the UserBackend interface
func (b *Backend) GetUser(username string) (auth.User, error) {
return users.Get(b.Database, username)
}

View File

@ -1,4 +1,4 @@
package users
package backend
import (
"database/sql"
@ -6,12 +6,11 @@ import (
"errors"
"fmt"
"git.quimbo.fr/odwrtw/canape/backend/config"
"git.quimbo.fr/odwrtw/canape/backend/sqly"
"github.com/jmoiron/sqlx"
"github.com/jmoiron/sqlx/types"
"github.com/odwrtw/papi"
"git.quimbo.fr/odwrtw/canape/backend/config"
"git.quimbo.fr/odwrtw/canape/backend/sqly"
)
const (
@ -125,8 +124,8 @@ func (u *User) NewPapiClient() (*papi.Client, error) {
return client, nil
}
// Get returns user with specified name
func Get(q sqlx.Queryer, name string) (*User, error) {
// GetUser returns user with specified name
func GetUser(q sqlx.Queryer, name string) (*User, error) {
u := &User{}
err := q.QueryRowx(getUserQuery, name).StructScan(u)
if err != nil {
@ -138,8 +137,8 @@ func Get(q sqlx.Queryer, name string) (*User, error) {
return u, nil
}
// GetByID returns user using its id
func GetByID(q sqlx.Queryer, id string) (*User, error) {
// GetUserByID returns user using its id
func GetUserByID(q sqlx.Queryer, id string) (*User, error) {
u := &User{}
err := q.QueryRowx(getUserByIDQuery, id).StructScan(u)
if err != nil {
@ -151,8 +150,8 @@ func GetByID(q sqlx.Queryer, id string) (*User, error) {
return u, nil
}
// GetAll returns all the users
func GetAll(db *sqlx.DB) ([]*User, error) {
// GetAllUsers returns all the users
func GetAllUsers(db *sqlx.DB) ([]*User, error) {
users := []*User{}
err := db.Select(&users, getAllUsersQuery)
if err != nil {
@ -203,16 +202,6 @@ func (u *User) Delete(ex *sqlx.DB) error {
return nil
}
// GetHash implements auth.User interface
func (u *User) GetHash() string {
return u.Hash
}
// GetName implements auth.User interface
func (u *User) GetName() string {
return u.Name
}
// HasRole checks if a user as a role
func (u *User) HasRole(role string) bool {
if role == AdminRole && !u.Admin {

View File

@ -1,12 +1,10 @@
package events
import (
"errors"
"net/http"
"time"
"git.quimbo.fr/odwrtw/canape/backend/auth"
"git.quimbo.fr/odwrtw/canape/backend/users"
"git.quimbo.fr/odwrtw/canape/backend/web"
"github.com/gorilla/websocket"
)
@ -23,11 +21,7 @@ const (
// WsHandler handles the websockets messages
func WsHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error {
// Get the user
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, errors.New("invalid user type"))
}
user := auth.GetCurrentUser(r, env.Log)
upgrader := websocket.Upgrader{
ReadBufferSize: 1024,

View File

@ -4,7 +4,7 @@ import (
"reflect"
"time"
"git.quimbo.fr/odwrtw/canape/backend/users"
"git.quimbo.fr/odwrtw/canape/backend/backend"
"github.com/odwrtw/papi"
"github.com/sirupsen/logrus"
)
@ -12,7 +12,7 @@ import (
// TorrentNotifier is a struct implementing the Notifier interface
type TorrentNotifier struct {
*Notifier
user *users.User
user *backend.User
client *papi.Client
torrents []papi.Torrent
log *logrus.Entry

View File

@ -1,14 +1,12 @@
package extmedias
import (
"errors"
"net/http"
"git.quimbo.fr/odwrtw/canape/backend/auth"
"git.quimbo.fr/odwrtw/canape/backend/backend"
"git.quimbo.fr/odwrtw/canape/backend/movies"
"git.quimbo.fr/odwrtw/canape/backend/shows"
"git.quimbo.fr/odwrtw/canape/backend/users"
"git.quimbo.fr/odwrtw/canape/backend/web"
polochon "github.com/odwrtw/polochon/lib"
"github.com/sirupsen/logrus"
@ -48,7 +46,7 @@ func RefreshShowsHandler(env *web.Env, w http.ResponseWriter, r *http.Request) e
}
// GetMovies get some movies
func GetMovies(env *web.Env, user *users.User, source string, category string) ([]*movies.Movie, error) {
func GetMovies(env *web.Env, user *backend.User, source string, category string) ([]*movies.Movie, error) {
log := env.Log.WithFields(logrus.Fields{
"source": source,
"category": category,
@ -107,7 +105,7 @@ func GetMovies(env *web.Env, user *users.User, source string, category string) (
}
// GetShows get some shows
func GetShows(env *web.Env, user *users.User, source string, category string, force bool) ([]*shows.Show, error) {
func GetShows(env *web.Env, user *backend.User, source string, category string, force bool) ([]*shows.Show, error) {
log := env.Log.WithFields(logrus.Fields{
"source": source,
"category": category,
@ -178,11 +176,7 @@ func ExploreMovies(env *web.Env, w http.ResponseWriter, r *http.Request) error {
category = "popular"
}
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, errors.New("invalid user"))
}
user := auth.GetCurrentUser(r, env.Log)
// Get the medias without trying to refresh them
movies, err := GetMovies(env, user, source, category)
@ -212,11 +206,7 @@ func ExploreShows(env *web.Env, w http.ResponseWriter, r *http.Request) error {
category = "rating"
}
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, errors.New("invalid user"))
}
user := auth.GetCurrentUser(r, env.Log)
// Get the medias without trying to refresh them
shows, err := GetShows(env, user, source, category, false)

View File

@ -47,7 +47,6 @@ func main() {
// Generate auth params
authParams := auth.Params{
Backend: backend,
Pepper: cf.Authorizer.Pepper,
Cost: cf.Authorizer.Cost,
Secret: cf.Authorizer.Secret,

View File

@ -1,7 +1,6 @@
package movies
import (
"errors"
"fmt"
"log"
"net/http"
@ -10,7 +9,6 @@ import (
"git.quimbo.fr/odwrtw/canape/backend/backend"
"git.quimbo.fr/odwrtw/canape/backend/config"
"git.quimbo.fr/odwrtw/canape/backend/subtitles"
"git.quimbo.fr/odwrtw/canape/backend/users"
"git.quimbo.fr/odwrtw/canape/backend/web"
"github.com/gorilla/mux"
"github.com/odwrtw/papi"
@ -21,11 +19,7 @@ import (
// PolochonMoviesHandler will returns movies from Polochon
func PolochonMoviesHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error {
// Get the user from the request
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, fmt.Errorf("invalid user type"))
}
user := auth.GetCurrentUser(r, env.Log)
// Get the polochon movies of the user
movies, err := getPolochonMovies(user, env)
@ -69,11 +63,7 @@ func RefreshMovieHandler(env *web.Env, w http.ResponseWriter, r *http.Request) e
id := vars["id"]
// Get the user
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return fmt.Errorf("invalid user type")
}
user := auth.GetCurrentUser(r, env.Log)
// Create a new papi client
client, err := user.NewPapiClient()
@ -114,11 +104,7 @@ func SearchMovie(env *web.Env, w http.ResponseWriter, r *http.Request) error {
vars := mux.Vars(r)
search := vars["search"]
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, errors.New("invalid user"))
}
user := auth.GetCurrentUser(r, env.Log)
// Create a new papi client
client, err := user.NewPapiClient()
@ -200,11 +186,7 @@ func PolochonDeleteHandler(env *web.Env, w http.ResponseWriter, r *http.Request)
log.Debugf("deleting movie")
// Get the user
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, errors.New("invalid user type"))
}
user := auth.GetCurrentUser(r, env.Log)
// Create a new papi client
client, err := user.NewPapiClient()
@ -221,11 +203,7 @@ func AddToWishlist(env *web.Env, w http.ResponseWriter, r *http.Request) error {
vars := mux.Vars(r)
id := vars["id"]
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, errors.New("invalid user type"))
}
user := auth.GetCurrentUser(r, env.Log)
if err := backend.AddMovieToWishlist(env.Database, user.ID, id); err != nil {
return env.RenderError(w, err)
@ -239,11 +217,7 @@ func DeleteFromWishlist(env *web.Env, w http.ResponseWriter, r *http.Request) er
vars := mux.Vars(r)
id := vars["id"]
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, errors.New("invalid user type"))
}
user := auth.GetCurrentUser(r, env.Log)
if err := backend.DeleteMovieFromWishlist(env.Database, user.ID, id); err != nil {
return env.RenderError(w, err)
@ -254,11 +228,7 @@ func DeleteFromWishlist(env *web.Env, w http.ResponseWriter, r *http.Request) er
// GetWishlistHandler returns the wishlisted movies of a user
func GetWishlistHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error {
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, errors.New("invalid user type"))
}
user := auth.GetCurrentUser(r, env.Log)
// Create a new papi client
client, err := user.NewPapiClient()
@ -320,11 +290,7 @@ func RefreshMovieSubtitlesHandler(env *web.Env, w http.ResponseWriter, r *http.R
id := vars["id"]
// Get the user
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return fmt.Errorf("invalid user type")
}
user := auth.GetCurrentUser(r, env.Log)
// Create a new papi client
client, err := user.NewPapiClient()
@ -358,11 +324,7 @@ func DownloadVVTSubtitle(env *web.Env, w http.ResponseWriter, r *http.Request) e
lang := vars["lang"]
// Get the user
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return fmt.Errorf("invalid user type")
}
user := auth.GetCurrentUser(r, env.Log)
// Create a new papi client
client, err := user.NewPapiClient()

View File

@ -10,7 +10,6 @@ import (
"git.quimbo.fr/odwrtw/canape/backend/backend"
"git.quimbo.fr/odwrtw/canape/backend/subtitles"
"git.quimbo.fr/odwrtw/canape/backend/users"
"git.quimbo.fr/odwrtw/canape/backend/web"
"github.com/odwrtw/papi"
polochon "github.com/odwrtw/polochon/lib"
@ -251,7 +250,7 @@ func (m *Movie) PosterURL() string {
}
// getPolochonMovies returns an array of the user's polochon movies
func getPolochonMovies(user *users.User, env *web.Env) ([]*Movie, error) {
func getPolochonMovies(user *backend.User, env *web.Env) ([]*Movie, error) {
movies := []*Movie{}
// Create a papi client

View File

@ -6,7 +6,7 @@ import (
"net/http"
"git.quimbo.fr/odwrtw/canape/backend/auth"
"git.quimbo.fr/odwrtw/canape/backend/users"
"git.quimbo.fr/odwrtw/canape/backend/backend"
"git.quimbo.fr/odwrtw/canape/backend/web"
"github.com/gorilla/mux"
"github.com/sirupsen/logrus"
@ -49,11 +49,7 @@ func GetPolochonsHandler(env *web.Env, w http.ResponseWriter, r *http.Request) e
"function": "polochons.GetPolochonsHandler",
})
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, fmt.Errorf("invalid user type"))
}
user := auth.GetCurrentUser(r, env.Log)
log.Debug("Getting polochons")
@ -63,7 +59,7 @@ func GetPolochonsHandler(env *web.Env, w http.ResponseWriter, r *http.Request) e
}
for _, p := range polochons {
users, err := users.GetPolochonUsers(env.Database, p.ID)
users, err := backend.GetPolochonUsers(env.Database, p.ID)
if err != nil {
return env.RenderError(w, err)
}
@ -79,11 +75,7 @@ func NewPolochonHandler(env *web.Env, w http.ResponseWriter, r *http.Request) er
"function": "polochons.NewPolochonHandler",
})
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, fmt.Errorf("invalid user type"))
}
user := auth.GetCurrentUser(r, env.Log)
var data struct {
Name string `json:"name"`
@ -127,11 +119,7 @@ func EditPolochonHandler(env *web.Env, w http.ResponseWriter, r *http.Request) e
})
log.Debugf("editing polochon ...")
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, fmt.Errorf("invalid user type"))
}
user := auth.GetCurrentUser(r, env.Log)
// Get the polochon
vars := mux.Vars(r)
@ -199,11 +187,7 @@ func PolochonActivateUser(env *web.Env, w http.ResponseWriter, r *http.Request,
})
log.Debugf("editing polochon users ...")
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, fmt.Errorf("invalid user type"))
}
user := auth.GetCurrentUser(r, env.Log)
// Get the polochon
vars := mux.Vars(r)
@ -220,7 +204,7 @@ func PolochonActivateUser(env *web.Env, w http.ResponseWriter, r *http.Request,
// Get the user
userID := vars["user_id"]
u, err := users.GetByID(env.Database, userID)
u, err := backend.GetUserByID(env.Database, userID)
if err != nil {
return env.RenderError(w, err)
}

View File

@ -2,6 +2,7 @@ package main
import (
admin "git.quimbo.fr/odwrtw/canape/backend/admins"
"git.quimbo.fr/odwrtw/canape/backend/backend"
"git.quimbo.fr/odwrtw/canape/backend/events"
extmedias "git.quimbo.fr/odwrtw/canape/backend/external_medias"
"git.quimbo.fr/odwrtw/canape/backend/movies"
@ -17,72 +18,72 @@ func setupRoutes(env *web.Env) {
// User's route
env.Handle("/users/login", users.LoginPOSTHandler).Methods("POST")
env.Handle("/users/signup", users.SignupPOSTHandler).Methods("POST")
env.Handle("/users/details", users.DetailsHandler).WithRole(users.UserRole).Methods("GET")
env.Handle("/users/edit", users.EditHandler).WithRole(users.UserRole).Methods("POST")
env.Handle("/users/tokens", users.GetTokensHandler).WithRole(users.UserRole).Methods("GET")
env.Handle("/users/tokens/{token}", users.EditTokenHandler).WithRole(users.UserRole).Methods("POST")
env.Handle("/users/tokens/{token}", users.DeleteTokenHandler).WithRole(users.UserRole).Methods("DELETE")
env.Handle("/users/modules/status", users.GetModulesStatus).WithRole(users.UserRole).Methods("GET")
env.Handle("/users/polochons", polochons.GetPolochonsHandler).WithRole(users.UserRole).Methods("GET")
env.Handle("/users/details", users.DetailsHandler).WithRole(backend.UserRole).Methods("GET")
env.Handle("/users/edit", users.EditHandler).WithRole(backend.UserRole).Methods("POST")
env.Handle("/users/tokens", users.GetTokensHandler).WithRole(backend.UserRole).Methods("GET")
env.Handle("/users/tokens/{token}", users.EditTokenHandler).WithRole(backend.UserRole).Methods("POST")
env.Handle("/users/tokens/{token}", users.DeleteTokenHandler).WithRole(backend.UserRole).Methods("DELETE")
env.Handle("/users/modules/status", users.GetModulesStatus).WithRole(backend.UserRole).Methods("GET")
env.Handle("/users/polochons", polochons.GetPolochonsHandler).WithRole(backend.UserRole).Methods("GET")
// Polochon's route
env.Handle("/polochons", polochons.GetPublicPolochonsHandler).Methods("GET")
env.Handle("/polochons", polochons.NewPolochonHandler).WithRole(users.UserRole).Methods("POST")
env.Handle("/polochons/{id}", polochons.EditPolochonHandler).WithRole(users.UserRole).Methods("POST")
env.Handle("/polochons/{id}/users/{user_id}", polochons.PolochonActivateUserHandler).WithRole(users.UserRole).Methods("POST")
env.Handle("/polochons/{id}/users/{user_id}", polochons.PolochonDeactivateUserHandler).WithRole(users.UserRole).Methods("DELETE")
env.Handle("/polochons", polochons.NewPolochonHandler).WithRole(backend.UserRole).Methods("POST")
env.Handle("/polochons/{id}", polochons.EditPolochonHandler).WithRole(backend.UserRole).Methods("POST")
env.Handle("/polochons/{id}/users/{user_id}", polochons.PolochonActivateUserHandler).WithRole(backend.UserRole).Methods("POST")
env.Handle("/polochons/{id}/users/{user_id}", polochons.PolochonDeactivateUserHandler).WithRole(backend.UserRole).Methods("DELETE")
// Movies routes
env.Handle("/movies/polochon", movies.PolochonMoviesHandler).WithRole(users.UserRole).Methods("GET")
env.Handle("/movies/explore", extmedias.ExploreMovies).WithRole(users.UserRole).Methods("GET")
env.Handle("/movies/explore/options", extmedias.MovieExplorerOptions).WithRole(users.UserRole).Methods("GET")
env.Handle("/movies/search/{search}", movies.SearchMovie).WithRole(users.UserRole).Methods("GET")
env.Handle("/movies/{id:tt[0-9]+}", movies.PolochonDeleteHandler).WithRole(users.UserRole).Methods("DELETE")
env.Handle("/movies/{id:tt[0-9]+}/refresh", movies.RefreshMovieHandler).WithRole(users.UserRole).Methods("POST")
env.Handle("/movies/{id:tt[0-9]+}/subtitles/{lang}", movies.DownloadVVTSubtitle).WithRole(users.UserRole).Methods("GET")
env.Handle("/movies/{id:tt[0-9]+}/subtitles/refresh", movies.RefreshMovieSubtitlesHandler).WithRole(users.UserRole).Methods("POST")
env.Handle("/movies/refresh", extmedias.RefreshMoviesHandler).WithRole(users.AdminRole).Methods("POST")
env.Handle("/movies/polochon", movies.PolochonMoviesHandler).WithRole(backend.UserRole).Methods("GET")
env.Handle("/movies/explore", extmedias.ExploreMovies).WithRole(backend.UserRole).Methods("GET")
env.Handle("/movies/explore/options", extmedias.MovieExplorerOptions).WithRole(backend.UserRole).Methods("GET")
env.Handle("/movies/search/{search}", movies.SearchMovie).WithRole(backend.UserRole).Methods("GET")
env.Handle("/movies/{id:tt[0-9]+}", movies.PolochonDeleteHandler).WithRole(backend.UserRole).Methods("DELETE")
env.Handle("/movies/{id:tt[0-9]+}/refresh", movies.RefreshMovieHandler).WithRole(backend.UserRole).Methods("POST")
env.Handle("/movies/{id:tt[0-9]+}/subtitles/{lang}", movies.DownloadVVTSubtitle).WithRole(backend.UserRole).Methods("GET")
env.Handle("/movies/{id:tt[0-9]+}/subtitles/refresh", movies.RefreshMovieSubtitlesHandler).WithRole(backend.UserRole).Methods("POST")
env.Handle("/movies/refresh", extmedias.RefreshMoviesHandler).WithRole(backend.AdminRole).Methods("POST")
// Shows routes
env.Handle("/shows/polochon", shows.PolochonShowsHandler).WithRole(users.UserRole).Methods("GET")
env.Handle("/shows/explore", extmedias.ExploreShows).WithRole(users.UserRole).Methods("GET")
env.Handle("/shows/explore/options", extmedias.ShowExplorerOptions).WithRole(users.UserRole).Methods("GET")
env.Handle("/shows/search/{search}", shows.SearchShow).WithRole(users.UserRole).Methods("GET")
env.Handle("/shows/{id:tt[0-9]+}", shows.GetDetailsHandler).WithRole(users.UserRole).Methods("GET")
env.Handle("/shows/{id:tt[0-9]+}/refresh", shows.RefreshShowHandler).WithRole(users.UserRole).Methods("POST")
env.Handle("/shows/{id:tt[0-9]+}/seasons/{season:[0-9]+}/episodes/{episode:[0-9]+}", shows.RefreshEpisodeHandler).WithRole(users.UserRole).Methods("POST")
env.Handle("/shows/{id:tt[0-9]+}/seasons/{season:[0-9]+}/episodes/{episode:[0-9]+}/subtitles/refresh", shows.RefreshEpisodeSubtitlesHandler).WithRole(users.UserRole).Methods("POST")
env.Handle("/shows/{id:tt[0-9]+}/seasons/{season:[0-9]+}/episodes/{episode:[0-9]+}/subtitles/{lang}", shows.DownloadVVTSubtitle).WithRole(users.UserRole).Methods("GET")
env.Handle("/shows/refresh", extmedias.RefreshShowsHandler).WithRole(users.AdminRole).Methods("POST")
env.Handle("/shows/polochon", shows.PolochonShowsHandler).WithRole(backend.UserRole).Methods("GET")
env.Handle("/shows/explore", extmedias.ExploreShows).WithRole(backend.UserRole).Methods("GET")
env.Handle("/shows/explore/options", extmedias.ShowExplorerOptions).WithRole(backend.UserRole).Methods("GET")
env.Handle("/shows/search/{search}", shows.SearchShow).WithRole(backend.UserRole).Methods("GET")
env.Handle("/shows/{id:tt[0-9]+}", shows.GetDetailsHandler).WithRole(backend.UserRole).Methods("GET")
env.Handle("/shows/{id:tt[0-9]+}/refresh", shows.RefreshShowHandler).WithRole(backend.UserRole).Methods("POST")
env.Handle("/shows/{id:tt[0-9]+}/seasons/{season:[0-9]+}/episodes/{episode:[0-9]+}", shows.RefreshEpisodeHandler).WithRole(backend.UserRole).Methods("POST")
env.Handle("/shows/{id:tt[0-9]+}/seasons/{season:[0-9]+}/episodes/{episode:[0-9]+}/subtitles/refresh", shows.RefreshEpisodeSubtitlesHandler).WithRole(backend.UserRole).Methods("POST")
env.Handle("/shows/{id:tt[0-9]+}/seasons/{season:[0-9]+}/episodes/{episode:[0-9]+}/subtitles/{lang}", shows.DownloadVVTSubtitle).WithRole(backend.UserRole).Methods("GET")
env.Handle("/shows/refresh", extmedias.RefreshShowsHandler).WithRole(backend.AdminRole).Methods("POST")
env.Handle("/ratings/refresh", ratings.RefreshHandler).WithRole(users.AdminRole).Methods("POST")
env.Handle("/ratings/refresh", ratings.RefreshHandler).WithRole(backend.AdminRole).Methods("POST")
// Wishlist routes for shows
env.Handle("/wishlist/shows", shows.GetWishlistHandler).WithRole(users.UserRole).Methods("GET")
env.Handle("/wishlist/shows/{id:tt[0-9]+}", shows.AddToWishlist).WithRole(users.UserRole).Methods("POST")
env.Handle("/wishlist/shows/{id:tt[0-9]+}", shows.DeleteFromWishlist).WithRole(users.UserRole).Methods("DELETE")
env.Handle("/wishlist/shows", shows.GetWishlistHandler).WithRole(backend.UserRole).Methods("GET")
env.Handle("/wishlist/shows/{id:tt[0-9]+}", shows.AddToWishlist).WithRole(backend.UserRole).Methods("POST")
env.Handle("/wishlist/shows/{id:tt[0-9]+}", shows.DeleteFromWishlist).WithRole(backend.UserRole).Methods("DELETE")
// Wishlist routes for movies
env.Handle("/wishlist/movies", movies.GetWishlistHandler).WithRole(users.UserRole).Methods("GET")
env.Handle("/wishlist/movies/{id:tt[0-9]+}", movies.AddToWishlist).WithRole(users.UserRole).Methods("POST")
env.Handle("/wishlist/movies/{id:tt[0-9]+}", movies.DeleteFromWishlist).WithRole(users.UserRole).Methods("DELETE")
env.Handle("/wishlist/movies", movies.GetWishlistHandler).WithRole(backend.UserRole).Methods("GET")
env.Handle("/wishlist/movies/{id:tt[0-9]+}", movies.AddToWishlist).WithRole(backend.UserRole).Methods("POST")
env.Handle("/wishlist/movies/{id:tt[0-9]+}", movies.DeleteFromWishlist).WithRole(backend.UserRole).Methods("DELETE")
// Torrents routes
env.Handle("/torrents", torrents.DownloadHandler).WithRole(users.UserRole).Methods("POST")
env.Handle("/torrents", torrents.ListHandler).WithRole(users.UserRole).Methods("GET")
env.Handle("/torrents/{id}", torrents.RemoveHandler).WithRole(users.UserRole).Methods("DELETE")
env.Handle("/torrents/search/{type}/{search}", torrents.SearchHandler).WithRole(users.UserRole).Methods("GET")
env.Handle("/torrents", torrents.DownloadHandler).WithRole(backend.UserRole).Methods("POST")
env.Handle("/torrents", torrents.ListHandler).WithRole(backend.UserRole).Methods("GET")
env.Handle("/torrents/{id}", torrents.RemoveHandler).WithRole(backend.UserRole).Methods("DELETE")
env.Handle("/torrents/search/{type}/{search}", torrents.SearchHandler).WithRole(backend.UserRole).Methods("GET")
// Route to refresh all movies and shows
env.Handle("/refresh", extmedias.RefreshHandler).WithRole(users.AdminRole).Methods("POST")
env.Handle("/refresh", extmedias.RefreshHandler).WithRole(backend.AdminRole).Methods("POST")
// Route to handle websocket events
env.Handle("/events", events.WsHandler).WithRole(users.UserRole).Methods("GET")
env.Handle("/events", events.WsHandler).WithRole(backend.UserRole).Methods("GET")
// Admin routes
env.Handle("/admins/users", admin.GetUsersHandler).WithRole(users.AdminRole).Methods("GET")
env.Handle("/admins/users", admin.UpdateUserHandler).WithRole(users.AdminRole).Methods("POST")
env.Handle("/admins/stats", admin.GetStatsHandler).WithRole(users.AdminRole).Methods("GET")
env.Handle("/admins/tokens/{username}", admin.GenerateUserToken).WithRole(users.AdminRole).Methods("POST")
env.Handle("/admins/modules", admin.GetModulesStatuses).WithRole(users.AdminRole).Methods("GET")
env.Handle("/admins/users", admin.GetUsersHandler).WithRole(backend.AdminRole).Methods("GET")
env.Handle("/admins/users", admin.UpdateUserHandler).WithRole(backend.AdminRole).Methods("POST")
env.Handle("/admins/stats", admin.GetStatsHandler).WithRole(backend.AdminRole).Methods("GET")
env.Handle("/admins/tokens/{username}", admin.GenerateUserToken).WithRole(backend.AdminRole).Methods("POST")
env.Handle("/admins/modules", admin.GetModulesStatuses).WithRole(backend.AdminRole).Methods("GET")
}

View File

@ -12,7 +12,6 @@ import (
"git.quimbo.fr/odwrtw/canape/backend/auth"
"git.quimbo.fr/odwrtw/canape/backend/backend"
"git.quimbo.fr/odwrtw/canape/backend/subtitles"
"git.quimbo.fr/odwrtw/canape/backend/users"
"git.quimbo.fr/odwrtw/canape/backend/web"
"github.com/gorilla/mux"
"github.com/odwrtw/papi"
@ -27,11 +26,7 @@ func GetDetailsHandler(env *web.Env, w http.ResponseWriter, r *http.Request) err
vars := mux.Vars(r)
id := vars["id"]
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, errors.New("invalid user type"))
}
user := auth.GetCurrentUser(r, env.Log)
client, err := user.NewPapiClient()
if err != nil {
@ -77,11 +72,7 @@ func RefreshShowHandler(env *web.Env, w http.ResponseWriter, r *http.Request) er
vars := mux.Vars(r)
id := vars["id"]
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, errors.New("invalid user type"))
}
user := auth.GetCurrentUser(r, env.Log)
client, err := user.NewPapiClient()
if err != nil {
@ -126,11 +117,7 @@ func SearchShow(env *web.Env, w http.ResponseWriter, r *http.Request) error {
vars := mux.Vars(r)
search := vars["search"]
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, errors.New("invalid user type"))
}
user := auth.GetCurrentUser(r, env.Log)
var shows []*polochon.Show
searchers := env.Config.Show.Searchers
@ -200,11 +187,7 @@ func AddToWishlist(env *web.Env, w http.ResponseWriter, r *http.Request) error {
}
}
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, errors.New("invalid user type"))
}
user := auth.GetCurrentUser(r, env.Log)
if err := backend.AddShowToWishlist(env.Database, user.ID, id, data.Season, data.Episode); err != nil {
env.Log.Warnf("Error while adding to db : %s", err)
@ -219,11 +202,7 @@ func DeleteFromWishlist(env *web.Env, w http.ResponseWriter, r *http.Request) er
vars := mux.Vars(r)
id := vars["id"]
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, errors.New("invalid user type"))
}
user := auth.GetCurrentUser(r, env.Log)
if err := backend.DeleteShowFromWishlist(env.Database, user.ID, id); err != nil {
env.Log.Warnf("Error while deleting to db : %s", err)
@ -235,11 +214,7 @@ func DeleteFromWishlist(env *web.Env, w http.ResponseWriter, r *http.Request) er
// GetWishlistHandler returns the tracked shows of a user
func GetWishlistHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error {
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, errors.New("invalid user type"))
}
user := auth.GetCurrentUser(r, env.Log)
client, err := user.NewPapiClient()
if err != nil {
@ -279,11 +254,7 @@ func GetWishlistHandler(env *web.Env, w http.ResponseWriter, r *http.Request) er
// PolochonShowsHandler will returns shows from Polochon
func PolochonShowsHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error {
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, errors.New("invalid user type"))
}
user := auth.GetCurrentUser(r, env.Log)
// Get the polochon's shows
shows, err := getPolochonShows(env, user)
@ -317,11 +288,7 @@ func RefreshEpisodeHandler(env *web.Env, w http.ResponseWriter, r *http.Request)
season, _ := strconv.Atoi(vars["season"])
episode, _ := strconv.Atoi(vars["episode"])
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, errors.New("invalid user type"))
}
user := auth.GetCurrentUser(r, env.Log)
client, err := user.NewPapiClient()
if err != nil {
@ -367,11 +334,7 @@ func RefreshEpisodeSubtitlesHandler(env *web.Env, w http.ResponseWriter, r *http
episode, _ := strconv.Atoi(vars["episode"])
// Get the user
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return fmt.Errorf("invalid user type")
}
user := auth.GetCurrentUser(r, env.Log)
// Create a new papi client
client, err := user.NewPapiClient()
@ -412,11 +375,7 @@ func DownloadVVTSubtitle(env *web.Env, w http.ResponseWriter, r *http.Request) e
episode, _ := strconv.Atoi(vars["episode"])
// Get the user
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return fmt.Errorf("invalid user type")
}
user := auth.GetCurrentUser(r, env.Log)
// Create a new papi client
client, err := user.NewPapiClient()

View File

@ -8,7 +8,6 @@ import (
"strings"
"git.quimbo.fr/odwrtw/canape/backend/backend"
"git.quimbo.fr/odwrtw/canape/backend/users"
"git.quimbo.fr/odwrtw/canape/backend/web"
"github.com/odwrtw/papi"
polochon "github.com/odwrtw/polochon/lib"
@ -198,7 +197,7 @@ func (s *Show) imgFile(imgType string) string {
}
// getPolochonShows returns all the Shows from the polochon of a user
func getPolochonShows(env *web.Env, user *users.User) ([]*Show, error) {
func getPolochonShows(env *web.Env, user *backend.User) ([]*Show, error) {
shows := []*Show{}
client, err := user.NewPapiClient()

View File

@ -7,7 +7,6 @@ import (
"sort"
"git.quimbo.fr/odwrtw/canape/backend/auth"
"git.quimbo.fr/odwrtw/canape/backend/users"
"git.quimbo.fr/odwrtw/canape/backend/web"
"github.com/gorilla/mux"
polochon "github.com/odwrtw/polochon/lib"
@ -28,11 +27,7 @@ func DownloadHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error
return env.RenderError(w, errors.New("no given url"))
}
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, errors.New("invalid user type"))
}
user := auth.GetCurrentUser(r, env.Log)
client, err := user.NewPapiClient()
if err != nil {
@ -49,11 +44,7 @@ func DownloadHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error
// ListHandler lists torrents of a polochon
func ListHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error {
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, errors.New("invalid user type"))
}
user := auth.GetCurrentUser(r, env.Log)
client, err := user.NewPapiClient()
if err != nil {
@ -70,11 +61,7 @@ func ListHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error {
// RemoveHandler removes a torrents via polochon
func RemoveHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error {
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, errors.New("invalid user type"))
}
user := auth.GetCurrentUser(r, env.Log)
// Get the torrent ID from the URL
vars := mux.Vars(r)

View File

@ -7,6 +7,7 @@ import (
"net/http"
"git.quimbo.fr/odwrtw/canape/backend/auth"
"git.quimbo.fr/odwrtw/canape/backend/backend"
"git.quimbo.fr/odwrtw/canape/backend/config"
"git.quimbo.fr/odwrtw/canape/backend/tokens"
"git.quimbo.fr/odwrtw/canape/backend/web"
@ -37,7 +38,7 @@ func SignupPOSTHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error
return e.RenderError(w, fmt.Errorf("Passwords missmatch"))
}
user := User{Name: data.Username}
user := backend.User{Name: data.Username}
var err error
user.Hash, err = e.Auth.GenHash(data.Password)
@ -71,7 +72,7 @@ func LoginPOSTHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error
token, err := e.Auth.Login(r, data.Username, data.Password)
if err != nil {
if err == auth.ErrInvalidPassword || err == ErrUnknownUser {
if err == auth.ErrInvalidPassword || err == backend.ErrUnknownUser {
return e.RenderError(w, fmt.Errorf("Error invalid user or password"))
}
return err
@ -91,11 +92,7 @@ func LoginPOSTHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error
// DetailsHandler show user details
func DetailsHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error {
v := auth.GetCurrentUser(r, e.Log)
user, ok := v.(*User)
if !ok {
return fmt.Errorf("invalid user type")
}
user := auth.GetCurrentUser(r, e.Log)
var polochonConfig config.UserPolochon
if user.PolochonID.Valid && user.PolochonID.String != "" {
@ -115,11 +112,7 @@ func DetailsHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error {
// EditHandler allow editing user info and configuration
func EditHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error {
v := auth.GetCurrentUser(r, e.Log)
user, ok := v.(*User)
if !ok {
return fmt.Errorf("invalid user type")
}
user := auth.GetCurrentUser(r, e.Log)
var data struct {
PolochonID string `json:"polochon_id"`
@ -169,11 +162,7 @@ func EditHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error {
// GetTokensHandler lists the tokens of a user
func GetTokensHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error {
v := auth.GetCurrentUser(r, e.Log)
user, ok := v.(*User)
if !ok {
return fmt.Errorf("invalid user type")
}
user := auth.GetCurrentUser(r, e.Log)
tokens, err := tokens.GetUserTokens(e.Database, user.Name)
if err != nil {
@ -188,11 +177,7 @@ func DeleteTokenHandler(e *web.Env, w http.ResponseWriter, r *http.Request) erro
vars := mux.Vars(r)
token := vars["token"]
v := auth.GetCurrentUser(r, e.Log)
user, ok := v.(*User)
if !ok {
return fmt.Errorf("invalid user type")
}
user := auth.GetCurrentUser(r, e.Log)
if err := tokens.DeleteToken(e.Database, user.Name, token); err != nil {
return err
@ -206,11 +191,7 @@ func EditTokenHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error
vars := mux.Vars(r)
token := vars["token"]
v := auth.GetCurrentUser(r, e.Log)
user, ok := v.(*User)
if !ok {
return fmt.Errorf("invalid user type")
}
user := auth.GetCurrentUser(r, e.Log)
t, err := tokens.GetUserToken(e.Database, user.Name, token)
if err != nil {
@ -235,11 +216,7 @@ func EditTokenHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error
// GetModulesStatus returns the status of the modules
func GetModulesStatus(e *web.Env, w http.ResponseWriter, r *http.Request) error {
// Get the user from the request
v := auth.GetCurrentUser(r, e.Log)
user, ok := v.(*User)
if !ok {
return e.RenderError(w, fmt.Errorf("invalid user type"))
}
user := auth.GetCurrentUser(r, e.Log)
// Create a papi client
client, err := user.NewPapiClient()