mirror of
				https://github.com/elyby/chrly.git
				synced 2025-05-31 14:11:51 +05:30 
			
		
		
		
	Rework security module, replace JWT library, invalidate JWT tokens signed for Chrly v4, generate RSA key in runtime when not provided via configuration
This commit is contained in:
		| @@ -3,7 +3,7 @@ package di | ||||
| import "github.com/defval/di" | ||||
|  | ||||
| func New() (*di.Container, error) { | ||||
| 	container, err := di.New( | ||||
| 	return di.New( | ||||
| 		config, | ||||
| 		dispatcher, | ||||
| 		logger, | ||||
| @@ -12,11 +12,6 @@ func New() (*di.Container, error) { | ||||
| 		handlers, | ||||
| 		profilesDi, | ||||
| 		server, | ||||
| 		signer, | ||||
| 		securityDiOptions, | ||||
| 	) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return container, nil | ||||
| } | ||||
|   | ||||
| @@ -1,29 +1,36 @@ | ||||
| package di | ||||
| 
 | ||||
| import ( | ||||
| 	"crypto/rand" | ||||
| 	"crypto/rsa" | ||||
| 	"crypto/x509" | ||||
| 	"encoding/base64" | ||||
| 	"encoding/pem" | ||||
| 	"errors" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"ely.by/chrly/internal/http" | ||||
| 	. "ely.by/chrly/internal/signer" | ||||
| 	"ely.by/chrly/internal/security" | ||||
| 
 | ||||
| 	"github.com/defval/di" | ||||
| 	"github.com/spf13/viper" | ||||
| ) | ||||
| 
 | ||||
| var signer = di.Options( | ||||
| var securityDiOptions = di.Options( | ||||
| 	di.Provide(newTexturesSigner, | ||||
| 		di.As(new(http.TexturesSigner)), | ||||
| 	), | ||||
| ) | ||||
| 
 | ||||
| func newTexturesSigner(config *viper.Viper) (*Signer, error) { | ||||
| func newTexturesSigner(config *viper.Viper) (*security.Signer, error) { | ||||
| 	keyStr := config.GetString("chrly.signing.key") | ||||
| 	if keyStr == "" { | ||||
| 		return nil, errors.New("chrly.signing.key must be set in order to sign textures") | ||||
| 		// TODO: log a message about the generated signing key and the way to specify it permanently | ||||
| 		privateKey, err := rsa.GenerateKey(rand.Reader, 2048) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 
 | ||||
| 		return security.NewSigner(privateKey), nil | ||||
| 	} | ||||
| 
 | ||||
| 	var keyBytes []byte | ||||
| @@ -40,10 +47,10 @@ func newTexturesSigner(config *viper.Viper) (*Signer, error) { | ||||
| 	} | ||||
| 
 | ||||
| 	rawPem, _ := pem.Decode(keyBytes) | ||||
| 	key, err := x509.ParsePKCS1PrivateKey(rawPem.Bytes) | ||||
| 	privateKey, err := x509.ParsePKCS1PrivateKey(rawPem.Bytes) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	return &Signer{Key: key}, nil | ||||
| 	return security.NewSigner(privateKey), nil | ||||
| } | ||||
| @@ -12,6 +12,7 @@ import ( | ||||
| 	"github.com/spf13/viper" | ||||
|  | ||||
| 	. "ely.by/chrly/internal/http" | ||||
| 	"ely.by/chrly/internal/security" | ||||
| ) | ||||
|  | ||||
| var server = di.Options( | ||||
| @@ -19,16 +20,13 @@ var server = di.Options( | ||||
| 	di.Provide(newServer), | ||||
| ) | ||||
|  | ||||
| func newAuthenticator(config *viper.Viper, emitter Emitter) (*JwtAuth, error) { | ||||
| func newAuthenticator(config *viper.Viper) (*security.Jwt, error) { | ||||
| 	key := config.GetString("chrly.secret") | ||||
| 	if key == "" { | ||||
| 		return nil, errors.New("chrly.secret must be set in order to use authenticator") | ||||
| 	} | ||||
|  | ||||
| 	return &JwtAuth{ | ||||
| 		Key:     []byte(key), | ||||
| 		Emitter: emitter, | ||||
| 	}, nil | ||||
| 	return security.NewJwt([]byte(key)), nil | ||||
| } | ||||
|  | ||||
| type serverParams struct { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user