upd(all): refactor
- moved rbac store and config to internal pkg, - split auth authenticators to internal pkg, - add rbac config object to internal/config, - update package imports and references for auth, - clean up main with pkg aliases
This commit is contained in:
parent
91db6b37f7
commit
7bf78fb4e0
@ -3,14 +3,13 @@ package auth
|
||||
import (
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/crusttech/crust/config"
|
||||
"github.com/crusttech/crust/internal/config"
|
||||
)
|
||||
|
||||
type (
|
||||
appFlags struct {
|
||||
http *config.HTTP
|
||||
db *config.Database
|
||||
jwt *config.JWT
|
||||
}
|
||||
)
|
||||
|
||||
@ -26,25 +25,10 @@ func (c *appFlags) Validate() error {
|
||||
if err := c.db.Validate(); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := c.jwt.Validate(); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func Flags(prefix ...string) {
|
||||
if flags != nil {
|
||||
return
|
||||
}
|
||||
if len(prefix) == 0 {
|
||||
panic("auth.Flags() needs prefix on first call")
|
||||
}
|
||||
flags = &appFlags{
|
||||
jwt: new(config.JWT).Init(prefix...),
|
||||
}
|
||||
}
|
||||
|
||||
func FullFlags(prefix ...string) {
|
||||
if flags != nil {
|
||||
return
|
||||
}
|
||||
@ -54,6 +38,5 @@ func FullFlags(prefix ...string) {
|
||||
flags = &appFlags{
|
||||
new(config.HTTP).Init(prefix...),
|
||||
new(config.Database).Init(prefix...),
|
||||
new(config.JWT).Init(prefix...),
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,20 +0,0 @@
|
||||
package auth
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/766b/chi-prometheus"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
type metrics struct{}
|
||||
|
||||
// Middleware is the request logger that provides metrics to prometheus
|
||||
func (metrics) Middleware(name string) func(http.Handler) http.Handler {
|
||||
return chiprometheus.NewMiddleware(name)
|
||||
}
|
||||
|
||||
// Handler exports prometheus metrics for /metrics requests
|
||||
func (metrics) Handler() http.Handler {
|
||||
return prometheus.Handler()
|
||||
}
|
||||
@ -2,10 +2,13 @@ package rest
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/crusttech/crust/auth/rest/request"
|
||||
"github.com/crusttech/crust/auth/service"
|
||||
"github.com/crusttech/crust/auth/types"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/crusttech/crust/internal/auth"
|
||||
)
|
||||
|
||||
var _ = errors.Wrap
|
||||
@ -13,11 +16,11 @@ var _ = errors.Wrap
|
||||
type (
|
||||
Auth struct {
|
||||
user service.UserService
|
||||
token types.TokenEncoder
|
||||
token auth.TokenEncoder
|
||||
}
|
||||
)
|
||||
|
||||
func (Auth) New(credValidator service.UserService, tknEncoder types.TokenEncoder) *Auth {
|
||||
func (Auth) New(credValidator service.UserService, tknEncoder auth.TokenEncoder) *Auth {
|
||||
return &Auth{
|
||||
credValidator,
|
||||
tknEncoder,
|
||||
|
||||
@ -1,13 +1,14 @@
|
||||
package rest
|
||||
|
||||
import (
|
||||
"github.com/go-chi/chi"
|
||||
|
||||
"github.com/crusttech/crust/auth/rest/handlers"
|
||||
"github.com/crusttech/crust/auth/service"
|
||||
"github.com/crusttech/crust/auth/types"
|
||||
"github.com/go-chi/chi"
|
||||
"github.com/crusttech/crust/internal/auth"
|
||||
)
|
||||
|
||||
func MountRoutes(jwtAuth types.TokenEncoder) func(chi.Router) {
|
||||
func MountRoutes(jwtAuth auth.TokenEncoder) func(chi.Router) {
|
||||
var userSvc = service.User()
|
||||
|
||||
// Initialize handers & controllers.
|
||||
|
||||
@ -8,7 +8,8 @@ import (
|
||||
"github.com/go-chi/chi"
|
||||
"github.com/go-chi/chi/middleware"
|
||||
|
||||
"github.com/crusttech/crust/config"
|
||||
"github.com/crusttech/crust/internal/config"
|
||||
"github.com/crusttech/crust/internal/metrics"
|
||||
)
|
||||
|
||||
func mountRoutes(r chi.Router, opts *config.HTTP, mounts ...func(r chi.Router)) {
|
||||
@ -16,7 +17,7 @@ func mountRoutes(r chi.Router, opts *config.HTTP, mounts ...func(r chi.Router))
|
||||
r.Use(middleware.Logger)
|
||||
}
|
||||
if opts.Metrics {
|
||||
r.Use(metrics{}.Middleware("auth"))
|
||||
r.Use(metrics.Middleware("auth"))
|
||||
}
|
||||
|
||||
for _, mount := range mounts {
|
||||
@ -26,7 +27,7 @@ func mountRoutes(r chi.Router, opts *config.HTTP, mounts ...func(r chi.Router))
|
||||
|
||||
func mountSystemRoutes(r chi.Router, opts *config.HTTP) {
|
||||
if opts.Metrics {
|
||||
r.Handle("/metrics", metrics{}.Handler())
|
||||
r.Handle("/metrics", metrics.Handler())
|
||||
}
|
||||
r.Mount("/debug", middleware.Profiler())
|
||||
}
|
||||
|
||||
@ -6,16 +6,15 @@ import (
|
||||
"net"
|
||||
"net/http"
|
||||
|
||||
"github.com/go-chi/chi"
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/SentimensRG/ctx/sigctx"
|
||||
|
||||
"github.com/crusttech/crust/auth/rest"
|
||||
|
||||
"github.com/go-chi/chi"
|
||||
"github.com/go-chi/cors"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/titpetric/factory"
|
||||
"github.com/titpetric/factory/resputil"
|
||||
|
||||
"github.com/crusttech/crust/auth/rest"
|
||||
"github.com/crusttech/crust/internal/auth"
|
||||
)
|
||||
|
||||
func Init() error {
|
||||
@ -51,7 +50,7 @@ func Init() error {
|
||||
}
|
||||
|
||||
func Start() error {
|
||||
var ctx = sigctx.New()
|
||||
var deadline = sigctx.New()
|
||||
|
||||
log.Println("Starting http server on address " + flags.http.Addr)
|
||||
listener, err := net.Listen("tcp", flags.http.Addr)
|
||||
@ -60,7 +59,7 @@ func Start() error {
|
||||
}
|
||||
|
||||
// JWT Auth
|
||||
jwtAuth, err := JWT()
|
||||
jwtAuth, err := auth.JWT()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "Error creating JWT Auth object")
|
||||
}
|
||||
@ -78,7 +77,7 @@ func Start() error {
|
||||
mountSystemRoutes(r, flags.http)
|
||||
|
||||
go http.Serve(listener, r)
|
||||
<-ctx.Done()
|
||||
<-deadline.Done()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -4,22 +4,24 @@ import (
|
||||
"log"
|
||||
"os"
|
||||
|
||||
"github.com/crusttech/crust/auth"
|
||||
"github.com/crusttech/crust/rbac"
|
||||
service "github.com/crusttech/crust/auth"
|
||||
|
||||
"github.com/crusttech/crust/internal/auth"
|
||||
"github.com/crusttech/crust/internal/rbac"
|
||||
)
|
||||
|
||||
func main() {
|
||||
config := flags("auth", rbac.Flags, auth.FullFlags)
|
||||
config := flags("auth", service.Flags, auth.Flags, rbac.Flags)
|
||||
|
||||
// log to stdout not stderr
|
||||
log.SetOutput(os.Stdout)
|
||||
log.SetFlags(log.LstdFlags | log.Lshortfile)
|
||||
go NewMonitor(config.monitorInterval)
|
||||
|
||||
if err := auth.Init(); err != nil {
|
||||
if err := service.Init(); err != nil {
|
||||
log.Fatalf("Error initializing auth: %+v", err)
|
||||
}
|
||||
if err := auth.Start(); err != nil {
|
||||
if err := service.Start(); err != nil {
|
||||
log.Fatalf("Error starting/running auth: %+v", err)
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,23 +4,24 @@ import (
|
||||
"log"
|
||||
"os"
|
||||
|
||||
"github.com/crusttech/crust/auth"
|
||||
"github.com/crusttech/crust/crm"
|
||||
"github.com/crusttech/crust/rbac"
|
||||
service "github.com/crusttech/crust/crm"
|
||||
|
||||
"github.com/crusttech/crust/internal/auth"
|
||||
"github.com/crusttech/crust/internal/rbac"
|
||||
)
|
||||
|
||||
func main() {
|
||||
config := flags("crm", crm.Flags, rbac.Flags, auth.Flags)
|
||||
config := flags("crm", service.Flags, auth.Flags, rbac.Flags)
|
||||
|
||||
// log to stdout not stderr
|
||||
log.SetOutput(os.Stdout)
|
||||
log.SetFlags(log.LstdFlags | log.Lshortfile)
|
||||
go NewMonitor(config.monitorInterval)
|
||||
|
||||
if err := crm.Init(); err != nil {
|
||||
if err := service.Init(); err != nil {
|
||||
log.Fatalf("Error initializing crm: %+v", err)
|
||||
}
|
||||
if err := crm.Start(); err != nil {
|
||||
if err := service.Start(); err != nil {
|
||||
log.Fatalf("Error starting/running crm: %+v", err)
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,36 +1,27 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/crusttech/crust/auth"
|
||||
"github.com/crusttech/crust/rbac"
|
||||
|
||||
"github.com/crusttech/crust/sam"
|
||||
|
||||
"log"
|
||||
"os"
|
||||
|
||||
service "github.com/crusttech/crust/sam"
|
||||
|
||||
"github.com/crusttech/crust/internal/auth"
|
||||
"github.com/crusttech/crust/internal/rbac"
|
||||
)
|
||||
|
||||
func handleError(err error, message string) {
|
||||
if message == "" {
|
||||
message = "Error making API call"
|
||||
}
|
||||
if err != nil {
|
||||
log.Fatalf(message+": %v", err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
config := flags("sam", sam.Flags, auth.Flags, rbac.Flags)
|
||||
config := flags("sam", service.Flags, auth.Flags, rbac.Flags)
|
||||
|
||||
// log to stdout not stderr
|
||||
log.SetOutput(os.Stdout)
|
||||
log.SetFlags(log.LstdFlags | log.Lshortfile)
|
||||
go NewMonitor(config.monitorInterval)
|
||||
|
||||
if err := sam.Init(); err != nil {
|
||||
if err := service.Init(); err != nil {
|
||||
log.Fatalf("Error initializing sam: %+v", err)
|
||||
}
|
||||
if err := sam.Start(); err != nil {
|
||||
if err := service.Start(); err != nil {
|
||||
log.Fatalf("Error starting/running sam: %+v", err)
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,7 +3,7 @@ package crm
|
||||
import (
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/crusttech/crust/config"
|
||||
"github.com/crusttech/crust/internal/config"
|
||||
)
|
||||
|
||||
type (
|
||||
|
||||
@ -1,14 +1,13 @@
|
||||
package rest
|
||||
|
||||
import (
|
||||
"github.com/crusttech/crust/auth"
|
||||
"github.com/crusttech/crust/auth/types"
|
||||
"github.com/crusttech/crust/internal/auth"
|
||||
"github.com/crusttech/crust/crm/rest/handlers"
|
||||
"github.com/crusttech/crust/crm/service"
|
||||
"github.com/go-chi/chi"
|
||||
)
|
||||
|
||||
func MountRoutes(jwtAuth types.TokenEncoder) func(chi.Router) {
|
||||
func MountRoutes(jwtAuth auth.TokenEncoder) func(chi.Router) {
|
||||
var (
|
||||
fieldSvc = service.Field()
|
||||
moduleSvc = service.Module()
|
||||
|
||||
@ -8,7 +8,8 @@ import (
|
||||
"github.com/go-chi/chi"
|
||||
"github.com/go-chi/chi/middleware"
|
||||
|
||||
"github.com/crusttech/crust/config"
|
||||
"github.com/crusttech/crust/internal/config"
|
||||
"github.com/crusttech/crust/internal/metrics"
|
||||
)
|
||||
|
||||
func mountRoutes(r chi.Router, opts *config.HTTP, mounts ...func(r chi.Router)) {
|
||||
@ -16,7 +17,7 @@ func mountRoutes(r chi.Router, opts *config.HTTP, mounts ...func(r chi.Router))
|
||||
r.Use(middleware.Logger)
|
||||
}
|
||||
if opts.Metrics {
|
||||
r.Use(metrics{}.Middleware("crm"))
|
||||
r.Use(metrics.Middleware("crm"))
|
||||
}
|
||||
|
||||
for _, mount := range mounts {
|
||||
@ -26,7 +27,7 @@ func mountRoutes(r chi.Router, opts *config.HTTP, mounts ...func(r chi.Router))
|
||||
|
||||
func mountSystemRoutes(r chi.Router, opts *config.HTTP) {
|
||||
if opts.Metrics {
|
||||
r.Handle("/metrics", metrics{}.Handler())
|
||||
r.Handle("/metrics", metrics.Handler())
|
||||
}
|
||||
r.Mount("/debug", middleware.Profiler())
|
||||
}
|
||||
|
||||
16
crm/start.go
16
crm/start.go
@ -6,17 +6,15 @@ import (
|
||||
"net"
|
||||
"net/http"
|
||||
|
||||
"github.com/go-chi/chi"
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/SentimensRG/ctx/sigctx"
|
||||
|
||||
"github.com/crusttech/crust/auth"
|
||||
"github.com/crusttech/crust/crm/rest"
|
||||
|
||||
"github.com/go-chi/chi"
|
||||
"github.com/go-chi/cors"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/titpetric/factory"
|
||||
"github.com/titpetric/factory/resputil"
|
||||
|
||||
"github.com/crusttech/crust/crm/rest"
|
||||
"github.com/crusttech/crust/internal/auth"
|
||||
)
|
||||
|
||||
func Init() error {
|
||||
@ -52,7 +50,7 @@ func Init() error {
|
||||
}
|
||||
|
||||
func Start() error {
|
||||
var ctx = sigctx.New()
|
||||
var deadline = sigctx.New()
|
||||
|
||||
log.Println("Starting http server on address " + flags.http.Addr)
|
||||
listener, err := net.Listen("tcp", flags.http.Addr)
|
||||
@ -79,7 +77,7 @@ func Start() error {
|
||||
mountSystemRoutes(r, flags.http)
|
||||
|
||||
go http.Serve(listener, r)
|
||||
<-ctx.Done()
|
||||
<-deadline.Done()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
25
internal/auth/error.go
Normal file
25
internal/auth/error.go
Normal file
@ -0,0 +1,25 @@
|
||||
package auth
|
||||
|
||||
import (
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
type (
|
||||
authError string
|
||||
)
|
||||
|
||||
const (
|
||||
ErrConfigError = authError("ConfigError")
|
||||
)
|
||||
|
||||
func (e authError) Error() string {
|
||||
return e.String()
|
||||
}
|
||||
|
||||
func (e authError) String() string {
|
||||
return "crust.internal.auth." + string(e)
|
||||
}
|
||||
|
||||
func (e authError) New() error {
|
||||
return errors.WithStack(e)
|
||||
}
|
||||
38
internal/auth/flags.go
Normal file
38
internal/auth/flags.go
Normal file
@ -0,0 +1,38 @@
|
||||
package auth
|
||||
|
||||
import (
|
||||
"github.com/crusttech/crust/internal/config"
|
||||
)
|
||||
|
||||
type (
|
||||
localFlags struct {
|
||||
jwt *config.JWT
|
||||
}
|
||||
)
|
||||
|
||||
var flags *localFlags
|
||||
|
||||
// Flags matches signature for main()
|
||||
func Flags(prefix ...string) {
|
||||
new(localFlags).Init(prefix...)
|
||||
}
|
||||
|
||||
func (f *localFlags) Validate() error {
|
||||
if flags == nil {
|
||||
return ErrConfigError.New()
|
||||
}
|
||||
if err := f.jwt.Validate(); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *localFlags) Init(prefix ...string) *localFlags {
|
||||
if flags != nil {
|
||||
return flags
|
||||
}
|
||||
flags = &localFlags{
|
||||
new(config.JWT).Init(prefix...),
|
||||
}
|
||||
return flags
|
||||
}
|
||||
@ -4,7 +4,6 @@ import (
|
||||
"context"
|
||||
"strconv"
|
||||
|
||||
"github.com/crusttech/crust/auth/types"
|
||||
"github.com/go-chi/jwtauth"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
@ -36,12 +35,12 @@ func getIdentityClaimFromContext(ctx context.Context) (uint64, error) {
|
||||
}
|
||||
}
|
||||
|
||||
func SetIdentityToContext(ctx context.Context, identity types.Identifiable) context.Context {
|
||||
func SetIdentityToContext(ctx context.Context, identity Identifiable) context.Context {
|
||||
return context.WithValue(ctx, identityCtxKey, identity)
|
||||
}
|
||||
|
||||
func GetIdentityFromContext(ctx context.Context) types.Identifiable {
|
||||
if identity, ok := ctx.Value(identityCtxKey).(types.Identifiable); ok {
|
||||
func GetIdentityFromContext(ctx context.Context) Identifiable {
|
||||
if identity, ok := ctx.Value(identityCtxKey).(Identifiable); ok {
|
||||
return identity
|
||||
} else {
|
||||
return NewIdentity(0)
|
||||
@ -1,4 +1,4 @@
|
||||
package types
|
||||
package auth
|
||||
|
||||
type (
|
||||
Identifiable interface {
|
||||
@ -6,7 +6,6 @@ import (
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/crusttech/crust/auth/types"
|
||||
"github.com/go-chi/jwtauth"
|
||||
"github.com/titpetric/factory/resputil"
|
||||
)
|
||||
@ -34,7 +33,7 @@ func (t *jwt) Verifier() func(http.Handler) http.Handler {
|
||||
return jwtauth.Verifier(t.tokenAuth)
|
||||
}
|
||||
|
||||
func (t *jwt) Encode(identity types.Identifiable) string {
|
||||
func (t *jwt) Encode(identity Identifiable) string {
|
||||
// @todo Set expiry
|
||||
claims := jwtauth.Claims{}
|
||||
claims.Set("sub", strconv.FormatUint(identity.Identity(), 10))
|
||||
42
internal/config/rbac.go
Normal file
42
internal/config/rbac.go
Normal file
@ -0,0 +1,42 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"github.com/namsral/flag"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
type (
|
||||
RBAC struct {
|
||||
Auth string
|
||||
Tenant string
|
||||
BaseURL string
|
||||
Timeout int
|
||||
}
|
||||
)
|
||||
|
||||
var rbac *RBAC
|
||||
|
||||
func (c *RBAC) Validate() error {
|
||||
if c.Auth == "" {
|
||||
return errors.New("No authentication provided for RBAC")
|
||||
}
|
||||
if c.Tenant == "" {
|
||||
return errors.New("No tenant provided for RBAC")
|
||||
}
|
||||
if c.BaseURL == "" {
|
||||
return errors.New("No Base URL provided for RBAC")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (*RBAC) Init(prefix ...string) *RBAC {
|
||||
if rbac != nil {
|
||||
return rbac
|
||||
}
|
||||
rbac = new(RBAC)
|
||||
flag.StringVar(&rbac.Auth, "rbac-auth", "username:password", "Credentials to use for RBAC queries")
|
||||
flag.StringVar(&rbac.Tenant, "rbac-tenant", "", "Tenant ID")
|
||||
flag.StringVar(&rbac.BaseURL, "rbac-base-url", "", "RBAC Base URL")
|
||||
flag.IntVar(&rbac.Timeout, "rbac-timeout", 30, "RBAC request timeout (seconds)")
|
||||
return rbac
|
||||
}
|
||||
@ -19,6 +19,9 @@ func (c *Websocket) Validate() error {
|
||||
}
|
||||
|
||||
func (*Websocket) Init(prefix ...string) *Websocket {
|
||||
if websocket != nil {
|
||||
return websocket
|
||||
}
|
||||
websocket = new(Websocket)
|
||||
websocket.Timeout = 15 * time.Second
|
||||
websocket.PingTimeout = 120 * time.Second
|
||||
@ -1,4 +1,4 @@
|
||||
package crm
|
||||
package metrics
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
@ -7,14 +7,12 @@ import (
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
type metrics struct{}
|
||||
|
||||
// Middleware is the request logger that provides metrics to prometheus
|
||||
func (metrics) Middleware(name string) func(http.Handler) http.Handler {
|
||||
func Middleware(name string) func(http.Handler) http.Handler {
|
||||
return chiprometheus.NewMiddleware(name)
|
||||
}
|
||||
|
||||
// Handler exports prometheus metrics for /metrics requests
|
||||
func (metrics) Handler() http.Handler {
|
||||
func Handler() http.Handler {
|
||||
return prometheus.Handler()
|
||||
}
|
||||
@ -11,6 +11,8 @@ import (
|
||||
"net/http/httputil"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/crusttech/crust/internal/config"
|
||||
)
|
||||
|
||||
var _ = tls.Config{}
|
||||
@ -21,7 +23,7 @@ type (
|
||||
Client *http.Client
|
||||
|
||||
debugLevel string
|
||||
config configuration
|
||||
config *config.RBAC
|
||||
}
|
||||
|
||||
ClientInterface interface {
|
||||
@ -40,11 +42,11 @@ func (c *Client) Sessions() *Sessions { return &Sessions{c} }
|
||||
var _ ClientInterface = &Client{}
|
||||
|
||||
func New() (*Client, error) {
|
||||
if err := config.validate(); err != nil {
|
||||
if err := flags.Validate(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
timeout := time.Duration(config.timeout) * time.Second
|
||||
timeout := time.Duration(flags.Timeout) * time.Second
|
||||
|
||||
transport := &http.Transport{
|
||||
Dial: (&net.Dialer{
|
||||
@ -64,7 +66,7 @@ func New() (*Client, error) {
|
||||
return &Client{
|
||||
Transport: transport,
|
||||
Client: client,
|
||||
config: config,
|
||||
config: flags,
|
||||
}, nil
|
||||
}
|
||||
|
||||
@ -90,7 +92,7 @@ func (c *Client) Delete(url string) (*http.Response, error) {
|
||||
}
|
||||
|
||||
func (c *Client) Request(method, url string, body interface{}) (*http.Response, error) {
|
||||
link := strings.TrimRight(c.config.baseURL, "/") + "/" + strings.TrimLeft(url, "/")
|
||||
link := strings.TrimRight(c.config.BaseURL, "/") + "/" + strings.TrimLeft(url, "/")
|
||||
|
||||
if c.debugLevel == "info" {
|
||||
fmt.Println("RBAC >>>", method, link)
|
||||
@ -113,9 +115,10 @@ func (c *Client) Request(method, url string, body interface{}) (*http.Response,
|
||||
}
|
||||
|
||||
req.Header.Add("Content-Type", "application/json")
|
||||
req.Header.Add("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(c.config.auth)))
|
||||
// req.Header.Add("X-TENANT-ID", c.config.tenant)
|
||||
req.Header["X-TENANT-ID"] = []string{c.config.tenant}
|
||||
req.Header.Add("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(c.config.Auth)))
|
||||
// @todo: DAASI should fix this according to standards
|
||||
// req.Header.Add("X-TENANT-ID", c.config.Tenant)
|
||||
req.Header["X-TENANT-ID"] = []string{c.config.Tenant}
|
||||
|
||||
if c.debugLevel == "debug" {
|
||||
fmt.Println("RBAC >>> (request)")
|
||||
11
internal/rbac/flags.go
Normal file
11
internal/rbac/flags.go
Normal file
@ -0,0 +1,11 @@
|
||||
package rbac
|
||||
|
||||
import (
|
||||
"github.com/crusttech/crust/internal/config"
|
||||
)
|
||||
|
||||
var flags *config.RBAC
|
||||
|
||||
func Flags(prefix ...string) {
|
||||
flags = new(config.RBAC).Init(prefix...)
|
||||
}
|
||||
@ -1,7 +1,7 @@
|
||||
package rbac_test
|
||||
|
||||
import (
|
||||
"github.com/crusttech/crust/rbac"
|
||||
"github.com/crusttech/crust/internal/rbac"
|
||||
"github.com/namsral/flag"
|
||||
"testing"
|
||||
)
|
||||
@ -3,7 +3,7 @@ package rbac
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/crusttech/crust/rbac/types"
|
||||
"github.com/crusttech/crust/internal/rbac/types"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
@ -3,7 +3,7 @@ package rbac
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/crusttech/crust/rbac/types"
|
||||
"github.com/crusttech/crust/internal/rbac/types"
|
||||
"github.com/pkg/errors"
|
||||
"strings"
|
||||
)
|
||||
@ -3,7 +3,7 @@ package rbac
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/crusttech/crust/rbac/types"
|
||||
"github.com/crusttech/crust/internal/rbac/types"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
@ -3,7 +3,7 @@ package rbac
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/crusttech/crust/rbac/types"
|
||||
"github.com/crusttech/crust/internal/rbac/types"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
@ -1,38 +0,0 @@
|
||||
package rbac
|
||||
|
||||
import (
|
||||
"github.com/namsral/flag"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
type (
|
||||
configuration struct {
|
||||
auth string
|
||||
tenant string
|
||||
baseURL string
|
||||
timeout int
|
||||
}
|
||||
)
|
||||
|
||||
var config configuration
|
||||
|
||||
func (c configuration) validate() error {
|
||||
if c.auth == "" {
|
||||
return errors.New("No authentication provided for RBAC")
|
||||
}
|
||||
if c.tenant == "" {
|
||||
return errors.New("No tenant provided for RBAC")
|
||||
}
|
||||
if c.baseURL == "" {
|
||||
return errors.New("No Base URL provided for RBAC")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Flags should be called from main to register flags
|
||||
func Flags(_ ...string) {
|
||||
flag.StringVar(&config.auth, "rbac-auth", "username:password", "Credentials to use for RBAC queries")
|
||||
flag.StringVar(&config.tenant, "rbac-tenant", "", "Tenant ID")
|
||||
flag.StringVar(&config.baseURL, "rbac-base-url", "", "RBAC Base URL")
|
||||
flag.IntVar(&config.timeout, "rbac-timeout", 30, "RBAC request timeout (seconds)")
|
||||
}
|
||||
@ -1,37 +0,0 @@
|
||||
package rbac
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestFlags(t *testing.T) {
|
||||
c := configuration{}
|
||||
mustFail(t, c.validate())
|
||||
c.auth = "a"
|
||||
mustFail(t, c.validate())
|
||||
c.tenant = "a"
|
||||
mustFail(t, c.validate())
|
||||
c.baseURL = "a"
|
||||
must(t, c.validate())
|
||||
}
|
||||
|
||||
/* imported below from main_test.go because of different package namespace */
|
||||
|
||||
func assert(t *testing.T, ok bool, format string, args ...interface{}) bool {
|
||||
if !ok {
|
||||
t.Fatalf(format, args...)
|
||||
}
|
||||
return ok
|
||||
}
|
||||
|
||||
func must(t *testing.T, err error, message ...string) {
|
||||
if len(message) > 0 {
|
||||
assert(t, err == nil, message[0]+": %+v", err)
|
||||
return
|
||||
}
|
||||
assert(t, err == nil, "Error: %+v", err)
|
||||
}
|
||||
|
||||
func mustFail(t *testing.T, err error) {
|
||||
assert(t, err != nil, "Expected error, got nil")
|
||||
}
|
||||
@ -3,7 +3,7 @@ package sam
|
||||
import (
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/crusttech/crust/config"
|
||||
"github.com/crusttech/crust/internal/config"
|
||||
"github.com/crusttech/crust/sam/repository"
|
||||
)
|
||||
|
||||
|
||||
@ -1,20 +0,0 @@
|
||||
package sam
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/766b/chi-prometheus"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
type metrics struct{}
|
||||
|
||||
// Middleware is the request logger that provides metrics to prometheus
|
||||
func (metrics) Middleware(name string) func(http.Handler) http.Handler {
|
||||
return chiprometheus.NewMiddleware(name)
|
||||
}
|
||||
|
||||
// Handler exports prometheus metrics for /metrics requests
|
||||
func (metrics) Handler() http.Handler {
|
||||
return prometheus.Handler()
|
||||
}
|
||||
@ -1,7 +1,7 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"github.com/crusttech/crust/config"
|
||||
"github.com/crusttech/crust/internal/config"
|
||||
)
|
||||
|
||||
type (
|
||||
|
||||
@ -6,7 +6,7 @@ import (
|
||||
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/crusttech/crust/config"
|
||||
"github.com/crusttech/crust/internal/config"
|
||||
)
|
||||
|
||||
type PubSubMemory struct {
|
||||
|
||||
@ -5,7 +5,7 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/crusttech/crust/config"
|
||||
"github.com/crusttech/crust/internal/config"
|
||||
)
|
||||
|
||||
func TestPubSubMemory(t *testing.T) {
|
||||
|
||||
@ -6,7 +6,7 @@ import (
|
||||
|
||||
"github.com/gomodule/redigo/redis"
|
||||
|
||||
"github.com/crusttech/crust/config"
|
||||
"github.com/crusttech/crust/internal/config"
|
||||
)
|
||||
|
||||
type PubSubRedis struct {
|
||||
|
||||
@ -2,7 +2,7 @@ package rest
|
||||
|
||||
import (
|
||||
"context"
|
||||
auth "github.com/crusttech/crust/auth/types"
|
||||
"github.com/crusttech/crust/internal/auth"
|
||||
"github.com/crusttech/crust/sam/rest/request"
|
||||
"github.com/crusttech/crust/sam/types"
|
||||
"github.com/pkg/errors"
|
||||
|
||||
@ -1,16 +1,16 @@
|
||||
package rest
|
||||
|
||||
import (
|
||||
"github.com/crusttech/crust/auth"
|
||||
"github.com/crusttech/crust/auth/types"
|
||||
"github.com/crusttech/crust/sam/rest/handlers"
|
||||
"github.com/crusttech/crust/sam/service"
|
||||
"github.com/crusttech/crust/store"
|
||||
"github.com/go-chi/chi"
|
||||
"log"
|
||||
|
||||
"github.com/crusttech/crust/internal/auth"
|
||||
"github.com/crusttech/crust/internal/store"
|
||||
"github.com/crusttech/crust/sam/rest/handlers"
|
||||
"github.com/crusttech/crust/sam/service"
|
||||
)
|
||||
|
||||
func MountRoutes(jwtAuth types.TokenEncoder) func(chi.Router) {
|
||||
func MountRoutes(jwtAuth auth.TokenEncoder) func(chi.Router) {
|
||||
// Initialize services
|
||||
fs, err := store.New("var/store")
|
||||
if err != nil {
|
||||
|
||||
@ -2,10 +2,12 @@ package rest
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/crusttech/crust/sam/rest/request"
|
||||
"github.com/crusttech/crust/sam/service"
|
||||
"github.com/crusttech/crust/sam/types"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
var _ = errors.Wrap
|
||||
|
||||
@ -8,7 +8,8 @@ import (
|
||||
"github.com/go-chi/chi"
|
||||
"github.com/go-chi/chi/middleware"
|
||||
|
||||
"github.com/crusttech/crust/config"
|
||||
"github.com/crusttech/crust/internal/config"
|
||||
"github.com/crusttech/crust/internal/metrics"
|
||||
)
|
||||
|
||||
func mountRoutes(r chi.Router, opts *config.HTTP, mounts ...func(r chi.Router)) {
|
||||
@ -18,7 +19,7 @@ func mountRoutes(r chi.Router, opts *config.HTTP, mounts ...func(r chi.Router))
|
||||
r.Use(middleware.Logger)
|
||||
}
|
||||
if opts.Metrics {
|
||||
r.Use(metrics{}.Middleware("sam"))
|
||||
r.Use(metrics.Middleware("sam"))
|
||||
}
|
||||
|
||||
for _, mount := range mounts {
|
||||
@ -28,7 +29,7 @@ func mountRoutes(r chi.Router, opts *config.HTTP, mounts ...func(r chi.Router))
|
||||
|
||||
func mountSystemRoutes(r chi.Router, opts *config.HTTP) {
|
||||
if opts.Metrics {
|
||||
r.Handle("/metrics", metrics{}.Handler())
|
||||
r.Handle("/metrics", metrics.Handler())
|
||||
}
|
||||
r.Mount("/debug", middleware.Profiler())
|
||||
}
|
||||
|
||||
@ -3,10 +3,10 @@ package service
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/crusttech/crust/auth"
|
||||
"github.com/crusttech/crust/internal/auth"
|
||||
"github.com/crusttech/crust/sam/repository"
|
||||
"github.com/crusttech/crust/sam/types"
|
||||
"github.com/crusttech/crust/store"
|
||||
"github.com/crusttech/crust/internal/store"
|
||||
"github.com/titpetric/factory"
|
||||
"io"
|
||||
"log"
|
||||
|
||||
@ -3,7 +3,7 @@ package service
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/crusttech/crust/auth"
|
||||
"github.com/crusttech/crust/internal/auth"
|
||||
"github.com/crusttech/crust/sam/repository"
|
||||
"github.com/crusttech/crust/sam/types"
|
||||
"github.com/pkg/errors"
|
||||
|
||||
@ -2,7 +2,7 @@ package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/crusttech/crust/auth"
|
||||
"github.com/crusttech/crust/internal/auth"
|
||||
"github.com/crusttech/crust/sam/repository"
|
||||
"github.com/crusttech/crust/sam/types"
|
||||
"github.com/pkg/errors"
|
||||
|
||||
14
sam/start.go
14
sam/start.go
@ -6,19 +6,17 @@ import (
|
||||
"net"
|
||||
"net/http"
|
||||
|
||||
"github.com/go-chi/chi"
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/SentimensRG/ctx"
|
||||
"github.com/SentimensRG/ctx/sigctx"
|
||||
|
||||
"github.com/crusttech/crust/auth"
|
||||
"github.com/crusttech/crust/sam/rest"
|
||||
"github.com/crusttech/crust/sam/websocket"
|
||||
|
||||
"github.com/go-chi/chi"
|
||||
"github.com/go-chi/cors"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/titpetric/factory"
|
||||
"github.com/titpetric/factory/resputil"
|
||||
|
||||
"github.com/crusttech/crust/internal/auth"
|
||||
"github.com/crusttech/crust/sam/rest"
|
||||
"github.com/crusttech/crust/sam/websocket"
|
||||
)
|
||||
|
||||
func Init() error {
|
||||
|
||||
@ -2,7 +2,7 @@ package websocket
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/crusttech/crust/auth"
|
||||
"github.com/crusttech/crust/internal/auth"
|
||||
"github.com/crusttech/crust/sam/service"
|
||||
"github.com/crusttech/crust/sam/types"
|
||||
"github.com/crusttech/crust/sam/websocket/incoming"
|
||||
|
||||
@ -2,11 +2,13 @@ package websocket
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/crusttech/crust/sam/service"
|
||||
"github.com/crusttech/crust/sam/types"
|
||||
"github.com/crusttech/crust/sam/websocket/incoming"
|
||||
"github.com/crusttech/crust/sam/websocket/outgoing"
|
||||
fstore "github.com/crusttech/crust/store"
|
||||
|
||||
fstore "github.com/crusttech/crust/internal/store"
|
||||
)
|
||||
|
||||
func messageService() service.MessageService {
|
||||
|
||||
@ -9,7 +9,7 @@ import (
|
||||
"github.com/pkg/errors"
|
||||
"github.com/titpetric/factory/resputil"
|
||||
|
||||
"github.com/crusttech/crust/auth"
|
||||
"github.com/crusttech/crust/internal/auth"
|
||||
"github.com/crusttech/crust/sam/repository"
|
||||
"github.com/crusttech/crust/sam/types"
|
||||
)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user