mirror of
https://github.com/minio/minio.git
synced 2025-02-02 17:35:58 -05:00
Move LoginHandler into LoginServer which others embed (#3431)
* Move LoginHandler into LoginServer which others embed * Add unit tests for loginServer
This commit is contained in:
parent
2d6f8153fa
commit
6b4e6bcebf
@ -34,6 +34,7 @@ const lockCheckValidityInterval = 2 * time.Minute
|
|||||||
// LockArgs besides lock name, holds Token and Timestamp for session
|
// LockArgs besides lock name, holds Token and Timestamp for session
|
||||||
// authentication and validation server restart.
|
// authentication and validation server restart.
|
||||||
type LockArgs struct {
|
type LockArgs struct {
|
||||||
|
loginServer
|
||||||
Name string
|
Name string
|
||||||
Token string
|
Token string
|
||||||
Timestamp time.Time
|
Timestamp time.Time
|
||||||
@ -125,25 +126,6 @@ func registerStorageLockers(mux *router.Router, lockServers []*lockServer) error
|
|||||||
|
|
||||||
/// Distributed lock handlers
|
/// Distributed lock handlers
|
||||||
|
|
||||||
// LoginHandler - handles LoginHandler RPC call.
|
|
||||||
func (l *lockServer) LoginHandler(args *RPCLoginArgs, reply *RPCLoginReply) error {
|
|
||||||
jwt, err := newJWT(defaultInterNodeJWTExpiry, serverConfig.GetCredential())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err = jwt.Authenticate(args.Username, args.Password); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
token, err := jwt.GenerateToken(args.Username)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
reply.Token = token
|
|
||||||
reply.Timestamp = time.Now().UTC()
|
|
||||||
reply.ServerVersion = Version
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Lock - rpc handler for (single) write lock operation.
|
// Lock - rpc handler for (single) write lock operation.
|
||||||
func (l *lockServer) Lock(args *LockArgs, reply *bool) error {
|
func (l *lockServer) Lock(args *LockArgs, reply *bool) error {
|
||||||
l.mutex.Lock()
|
l.mutex.Lock()
|
||||||
|
41
cmd/login-server.go
Normal file
41
cmd/login-server.go
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Minio Cloud Storage, (C) 2016 Minio, Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package cmd
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
type loginServer struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoginHandler - Handles JWT based RPC logic.
|
||||||
|
func (b loginServer) LoginHandler(args *RPCLoginArgs, reply *RPCLoginReply) error {
|
||||||
|
jwt, err := newJWT(defaultInterNodeJWTExpiry, serverConfig.GetCredential())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err = jwt.Authenticate(args.Username, args.Password); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
token, err := jwt.GenerateToken(args.Username)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
reply.Token = token
|
||||||
|
reply.Timestamp = time.Now().UTC()
|
||||||
|
reply.ServerVersion = Version
|
||||||
|
return nil
|
||||||
|
}
|
67
cmd/login-server_test.go
Normal file
67
cmd/login-server_test.go
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
* Minio Cloud Storage, (C) 2016 Minio, Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package cmd
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestLoginHandler(t *testing.T) {
|
||||||
|
rootPath, err := newTestConfig("us-east-1")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to create test config - %v", err)
|
||||||
|
}
|
||||||
|
defer removeAll(rootPath)
|
||||||
|
creds := serverConfig.GetCredential()
|
||||||
|
ls := loginServer{}
|
||||||
|
testCases := []struct {
|
||||||
|
args RPCLoginArgs
|
||||||
|
expectedErr error
|
||||||
|
}{
|
||||||
|
// Valid username and password
|
||||||
|
{
|
||||||
|
args: RPCLoginArgs{Username: creds.AccessKeyID, Password: creds.SecretAccessKey},
|
||||||
|
expectedErr: nil,
|
||||||
|
},
|
||||||
|
// Invalid username length
|
||||||
|
{
|
||||||
|
args: RPCLoginArgs{Username: "aaa", Password: "minio123"},
|
||||||
|
expectedErr: errInvalidAccessKeyLength,
|
||||||
|
},
|
||||||
|
// Invalid password length
|
||||||
|
{
|
||||||
|
args: RPCLoginArgs{Username: "minio", Password: "aaa"},
|
||||||
|
expectedErr: errInvalidSecretKeyLength,
|
||||||
|
},
|
||||||
|
// Invalid username
|
||||||
|
{
|
||||||
|
args: RPCLoginArgs{Username: "aaaaa", Password: creds.SecretAccessKey},
|
||||||
|
expectedErr: errInvalidAccessKeyID,
|
||||||
|
},
|
||||||
|
// Invalid password
|
||||||
|
{
|
||||||
|
args: RPCLoginArgs{Username: creds.AccessKeyID, Password: "aaaaaaaa"},
|
||||||
|
expectedErr: errAuthentication,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for i, test := range testCases {
|
||||||
|
reply := RPCLoginReply{}
|
||||||
|
err := ls.LoginHandler(&test.args, &reply)
|
||||||
|
if err != test.expectedErr {
|
||||||
|
t.Errorf("Test %d: Expected error %v but received %v",
|
||||||
|
i+1, test.expectedErr, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -27,11 +27,13 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type s3PeerAPIHandlers struct {
|
type s3PeerAPIHandlers struct {
|
||||||
|
loginServer
|
||||||
bms BucketMetaState
|
bms BucketMetaState
|
||||||
}
|
}
|
||||||
|
|
||||||
func registerS3PeerRPCRouter(mux *router.Router) error {
|
func registerS3PeerRPCRouter(mux *router.Router) error {
|
||||||
s3PeerHandlers := &s3PeerAPIHandlers{
|
s3PeerHandlers := &s3PeerAPIHandlers{
|
||||||
|
loginServer{},
|
||||||
&localBucketMetaState{
|
&localBucketMetaState{
|
||||||
ObjectAPI: newObjectLayerFn,
|
ObjectAPI: newObjectLayerFn,
|
||||||
},
|
},
|
||||||
|
@ -16,26 +16,6 @@
|
|||||||
|
|
||||||
package cmd
|
package cmd
|
||||||
|
|
||||||
import "time"
|
|
||||||
|
|
||||||
func (s3 *s3PeerAPIHandlers) LoginHandler(args *RPCLoginArgs, reply *RPCLoginReply) error {
|
|
||||||
jwt, err := newJWT(defaultInterNodeJWTExpiry, serverConfig.GetCredential())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err = jwt.Authenticate(args.Username, args.Password); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
token, err := jwt.GenerateToken(args.Username)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
reply.Token = token
|
|
||||||
reply.ServerVersion = Version
|
|
||||||
reply.Timestamp = time.Now().UTC()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBucketNotificationPeerArgs - Arguments collection to SetBucketNotificationPeer RPC
|
// SetBucketNotificationPeerArgs - Arguments collection to SetBucketNotificationPeer RPC
|
||||||
// call
|
// call
|
||||||
type SetBucketNotificationPeerArgs struct {
|
type SetBucketNotificationPeerArgs struct {
|
||||||
|
@ -29,32 +29,12 @@ import (
|
|||||||
// Storage server implements rpc primitives to facilitate exporting a
|
// Storage server implements rpc primitives to facilitate exporting a
|
||||||
// disk over a network.
|
// disk over a network.
|
||||||
type storageServer struct {
|
type storageServer struct {
|
||||||
|
loginServer
|
||||||
storage StorageAPI
|
storage StorageAPI
|
||||||
path string
|
path string
|
||||||
timestamp time.Time
|
timestamp time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Auth operations
|
|
||||||
|
|
||||||
// Login - login handler.
|
|
||||||
func (s *storageServer) LoginHandler(args *RPCLoginArgs, reply *RPCLoginReply) error {
|
|
||||||
jwt, err := newJWT(defaultInterNodeJWTExpiry, serverConfig.GetCredential())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err = jwt.Authenticate(args.Username, args.Password); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
token, err := jwt.GenerateToken(args.Username)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
reply.Token = token
|
|
||||||
reply.Timestamp = time.Now().UTC()
|
|
||||||
reply.ServerVersion = Version
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Storage operations handlers.
|
/// Storage operations handlers.
|
||||||
|
|
||||||
// DiskInfoHandler - disk info handler is rpc wrapper for DiskInfo operation.
|
// DiskInfoHandler - disk info handler is rpc wrapper for DiskInfo operation.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user