mirror of
				https://gitlab.crans.org/nounous/ghostream.git
				synced 2025-11-04 15:42:26 +01:00 
			
		
		
		
	Add basic and bypass auth methods
This commit is contained in:
		
							
								
								
									
										28
									
								
								auth/auth.go
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								auth/auth.go
									
									
									
									
									
								
							@@ -2,13 +2,18 @@ package auth
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"log"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"gitlab.crans.org/nounous/ghostream/auth/basic"
 | 
			
		||||
	"gitlab.crans.org/nounous/ghostream/auth/bypass"
 | 
			
		||||
	"gitlab.crans.org/nounous/ghostream/auth/ldap"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Options holds package configuration
 | 
			
		||||
type Options struct {
 | 
			
		||||
	Backend string
 | 
			
		||||
	Basic   basic.Options
 | 
			
		||||
	LDAP    ldap.Options
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -23,16 +28,23 @@ func New(cfg *Options) (Backend, error) {
 | 
			
		||||
	var backend Backend
 | 
			
		||||
	var err error
 | 
			
		||||
 | 
			
		||||
	if cfg.Backend == "LDAP" {
 | 
			
		||||
		backend, err = ldap.NewLDAP(&cfg.LDAP)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
	switch strings.ToLower(cfg.Backend) {
 | 
			
		||||
	case "basic":
 | 
			
		||||
		backend, err = basic.New(&cfg.Basic)
 | 
			
		||||
	case "bypass":
 | 
			
		||||
		backend, err = bypass.New()
 | 
			
		||||
	case "ldap":
 | 
			
		||||
		backend, err = ldap.New(&cfg.LDAP)
 | 
			
		||||
	default:
 | 
			
		||||
		// Package is misconfigured
 | 
			
		||||
		return nil, errors.New("Authentification backend not found")
 | 
			
		||||
		backend, err = nil, errors.New("Authentification backend not found")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Init and return backend
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		// Backend init failed
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	log.Printf("%s backend successfully initialized", cfg.Backend)
 | 
			
		||||
	return backend, nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										44
									
								
								auth/basic/basic.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								auth/basic/basic.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
package basic
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/crypto/bcrypt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// To generate bcrypt hashed password from Python,
 | 
			
		||||
// python3 -c 'import bcrypt; print(bcrypt.hashpw(b"PASSWORD", bcrypt.gensalt(rounds=15)).decode("ascii"))'
 | 
			
		||||
 | 
			
		||||
// Options holds package configuration
 | 
			
		||||
type Options struct {
 | 
			
		||||
	// Username: hashedPassword
 | 
			
		||||
	Credentials map[string]string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Basic authentification backend
 | 
			
		||||
type Basic struct {
 | 
			
		||||
	Cfg *Options
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Login hashs password and compare
 | 
			
		||||
// Returns (true, nil) if success
 | 
			
		||||
func (a Basic) Login(username string, password string) (bool, error) {
 | 
			
		||||
	hash, ok := a.Cfg.Credentials[username]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return false, errors.New("User not found in credentials")
 | 
			
		||||
	}
 | 
			
		||||
	err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
 | 
			
		||||
 | 
			
		||||
	// Login succeeded if no error
 | 
			
		||||
	return err == nil, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Close has no connection to close
 | 
			
		||||
func (a Basic) Close() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// New instanciates a new Basic authentification backend
 | 
			
		||||
func New(cfg *Options) (Basic, error) {
 | 
			
		||||
	backend := Basic{Cfg: cfg}
 | 
			
		||||
	return backend, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										21
									
								
								auth/bypass/bypass.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								auth/bypass/bypass.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
package bypass
 | 
			
		||||
 | 
			
		||||
// ByPass authentification backend
 | 
			
		||||
// By pass password check, open your streaming server to everyone!
 | 
			
		||||
type ByPass struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Login always return success
 | 
			
		||||
func (a ByPass) Login(username string, password string) (bool, error) {
 | 
			
		||||
	return true, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Close has no connection to close
 | 
			
		||||
func (a ByPass) Close() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// New instanciates a new Basic authentification backend
 | 
			
		||||
func New() (ByPass, error) {
 | 
			
		||||
	backend := ByPass{}
 | 
			
		||||
	return backend, nil
 | 
			
		||||
}
 | 
			
		||||
@@ -22,12 +22,9 @@ func (a LDAP) Login(username string, password string) (bool, error) {
 | 
			
		||||
	// Try to bind as user
 | 
			
		||||
	bindDn := "cn=" + username + "," + a.Cfg.UserDn
 | 
			
		||||
	err := a.Conn.Bind(bindDn, password)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Login succeeded
 | 
			
		||||
	return true, nil
 | 
			
		||||
	// Login succeeded if no error
 | 
			
		||||
	return err == nil, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Close LDAP connection
 | 
			
		||||
@@ -35,8 +32,8 @@ func (a LDAP) Close() {
 | 
			
		||||
	a.Conn.Close()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewLDAP instanciate a new LDAP connection
 | 
			
		||||
func NewLDAP(cfg *Options) (LDAP, error) {
 | 
			
		||||
// New instanciates a new LDAP connection
 | 
			
		||||
func New(cfg *Options) (LDAP, error) {
 | 
			
		||||
	backend := LDAP{Cfg: cfg}
 | 
			
		||||
 | 
			
		||||
	// Connect to LDAP server
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user