| 
									
										
										
										
											2016-11-16 04:12:06 +08:00
										 |  |  | /* | 
					
						
							| 
									
										
										
										
											2017-01-19 04:24:34 +08:00
										 |  |  |  * Minio Cloud Storage, (C) 2016, 2017 Minio, Inc. | 
					
						
							| 
									
										
										
										
											2016-11-16 04:12:06 +08:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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 ( | 
					
						
							|  |  |  | 	"net/url" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 	"time" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/minio/minio/pkg/disk" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const invalidToken = "invalidToken" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type testStorageRPCServer struct { | 
					
						
							|  |  |  | 	configDir string | 
					
						
							|  |  |  | 	token     string | 
					
						
							|  |  |  | 	diskDirs  []string | 
					
						
							|  |  |  | 	stServer  *storageServer | 
					
						
							|  |  |  | 	endpoints []*url.URL | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func createTestStorageServer(t *testing.T) *testStorageRPCServer { | 
					
						
							| 
									
										
										
										
											2017-01-19 04:24:34 +08:00
										 |  |  | 	testPath, err := newTestConfig(globalMinioDefaultRegion) | 
					
						
							| 
									
										
										
										
											2016-11-16 04:12:06 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("unable initialize config file, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-28 00:28:10 +08:00
										 |  |  | 	serverCred := serverConfig.GetCredential() | 
					
						
							|  |  |  | 	token, err := authenticateNode(serverCred.AccessKey, serverCred.SecretKey) | 
					
						
							| 
									
										
										
										
											2016-11-16 04:12:06 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("unable for JWT to generate token, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	fsDirs, err := getRandomDisks(1) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("unable to create FS backend, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	endpoints, err := parseStorageEndpoints(fsDirs) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("unable to parse storage endpoints, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	storageDisks, err := initStorageDisks(endpoints) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("unable to initialize storage disks, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	stServer := &storageServer{ | 
					
						
							|  |  |  | 		storage:   storageDisks[0], | 
					
						
							|  |  |  | 		path:      "/disk1", | 
					
						
							|  |  |  | 		timestamp: time.Now().UTC(), | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return &testStorageRPCServer{ | 
					
						
							|  |  |  | 		token:     token, | 
					
						
							|  |  |  | 		configDir: testPath, | 
					
						
							|  |  |  | 		diskDirs:  fsDirs, | 
					
						
							|  |  |  | 		endpoints: endpoints, | 
					
						
							|  |  |  | 		stServer:  stServer, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func errorIfInvalidToken(t *testing.T, err error) { | 
					
						
							|  |  |  | 	realErr := errorCause(err) | 
					
						
							|  |  |  | 	if realErr != errInvalidToken { | 
					
						
							|  |  |  | 		t.Errorf("Expected to fail with %s but failed with %s", errInvalidToken, realErr) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestStorageRPCInvalidToken(t *testing.T) { | 
					
						
							|  |  |  | 	st := createTestStorageServer(t) | 
					
						
							|  |  |  | 	defer removeRoots(st.diskDirs) | 
					
						
							|  |  |  | 	defer removeAll(st.configDir) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	storageRPC := st.stServer | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Following test cases are meant to exercise the invalid
 | 
					
						
							|  |  |  | 	// token code path of the storage RPC methods.
 | 
					
						
							|  |  |  | 	var err error | 
					
						
							| 
									
										
										
										
											2016-12-23 23:12:19 +08:00
										 |  |  | 	badAuthRPCArgs := AuthRPCArgs{AuthToken: "invalidToken"} | 
					
						
							|  |  |  | 	badGenericVolArgs := GenericVolArgs{ | 
					
						
							|  |  |  | 		AuthRPCArgs: badAuthRPCArgs, | 
					
						
							| 
									
										
										
										
											2016-11-16 04:12:06 +08:00
										 |  |  | 		Vol:         "myvol", | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// 1. DiskInfoHandler
 | 
					
						
							|  |  |  | 	diskInfoReply := &disk.Info{} | 
					
						
							| 
									
										
										
										
											2016-12-23 23:12:19 +08:00
										 |  |  | 	err = storageRPC.DiskInfoHandler(&badAuthRPCArgs, diskInfoReply) | 
					
						
							| 
									
										
										
										
											2016-11-16 04:12:06 +08:00
										 |  |  | 	errorIfInvalidToken(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// 2. MakeVolHandler
 | 
					
						
							| 
									
										
										
										
											2016-12-23 23:12:19 +08:00
										 |  |  | 	makeVolArgs := &badGenericVolArgs | 
					
						
							|  |  |  | 	makeVolReply := &AuthRPCReply{} | 
					
						
							| 
									
										
										
										
											2016-11-16 04:12:06 +08:00
										 |  |  | 	err = storageRPC.MakeVolHandler(makeVolArgs, makeVolReply) | 
					
						
							|  |  |  | 	errorIfInvalidToken(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// 3. ListVolsHandler
 | 
					
						
							|  |  |  | 	listVolReply := &ListVolsReply{} | 
					
						
							| 
									
										
										
										
											2016-12-23 23:12:19 +08:00
										 |  |  | 	err = storageRPC.ListVolsHandler(&badAuthRPCArgs, listVolReply) | 
					
						
							| 
									
										
										
										
											2016-11-16 04:12:06 +08:00
										 |  |  | 	errorIfInvalidToken(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// 4. StatVolHandler
 | 
					
						
							|  |  |  | 	statVolReply := &VolInfo{} | 
					
						
							| 
									
										
										
										
											2016-12-23 23:12:19 +08:00
										 |  |  | 	statVolArgs := &badGenericVolArgs | 
					
						
							| 
									
										
										
										
											2016-11-16 04:12:06 +08:00
										 |  |  | 	err = storageRPC.StatVolHandler(statVolArgs, statVolReply) | 
					
						
							|  |  |  | 	errorIfInvalidToken(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// 5. DeleteVolHandler
 | 
					
						
							| 
									
										
										
										
											2016-12-23 23:12:19 +08:00
										 |  |  | 	deleteVolArgs := &badGenericVolArgs | 
					
						
							|  |  |  | 	deleteVolReply := &AuthRPCReply{} | 
					
						
							| 
									
										
										
										
											2016-11-16 04:12:06 +08:00
										 |  |  | 	err = storageRPC.DeleteVolHandler(deleteVolArgs, deleteVolReply) | 
					
						
							|  |  |  | 	errorIfInvalidToken(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// 6. StatFileHandler
 | 
					
						
							|  |  |  | 	statFileArgs := &StatFileArgs{ | 
					
						
							| 
									
										
										
										
											2016-12-23 23:12:19 +08:00
										 |  |  | 		AuthRPCArgs: badAuthRPCArgs, | 
					
						
							| 
									
										
										
										
											2016-11-16 04:12:06 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	statReply := &FileInfo{} | 
					
						
							|  |  |  | 	err = storageRPC.StatFileHandler(statFileArgs, statReply) | 
					
						
							|  |  |  | 	errorIfInvalidToken(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// 7. ListDirHandler
 | 
					
						
							|  |  |  | 	listDirArgs := &ListDirArgs{ | 
					
						
							| 
									
										
										
										
											2016-12-23 23:12:19 +08:00
										 |  |  | 		AuthRPCArgs: badAuthRPCArgs, | 
					
						
							| 
									
										
										
										
											2016-11-16 04:12:06 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	listDirReply := &[]string{} | 
					
						
							|  |  |  | 	err = storageRPC.ListDirHandler(listDirArgs, listDirReply) | 
					
						
							|  |  |  | 	errorIfInvalidToken(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// 8. ReadAllHandler
 | 
					
						
							|  |  |  | 	readFileArgs := &ReadFileArgs{ | 
					
						
							| 
									
										
										
										
											2016-12-23 23:12:19 +08:00
										 |  |  | 		AuthRPCArgs: badAuthRPCArgs, | 
					
						
							| 
									
										
										
										
											2016-11-16 04:12:06 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	readFileReply := &[]byte{} | 
					
						
							|  |  |  | 	err = storageRPC.ReadAllHandler(readFileArgs, readFileReply) | 
					
						
							|  |  |  | 	errorIfInvalidToken(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// 9. ReadFileHandler
 | 
					
						
							|  |  |  | 	err = storageRPC.ReadFileHandler(readFileArgs, readFileReply) | 
					
						
							|  |  |  | 	errorIfInvalidToken(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// 10. PrepareFileHandler
 | 
					
						
							|  |  |  | 	prepFileArgs := &PrepareFileArgs{ | 
					
						
							| 
									
										
										
										
											2016-12-23 23:12:19 +08:00
										 |  |  | 		AuthRPCArgs: badAuthRPCArgs, | 
					
						
							| 
									
										
										
										
											2016-11-16 04:12:06 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-12-23 23:12:19 +08:00
										 |  |  | 	prepFileReply := &AuthRPCReply{} | 
					
						
							| 
									
										
										
										
											2016-11-16 04:12:06 +08:00
										 |  |  | 	err = storageRPC.PrepareFileHandler(prepFileArgs, prepFileReply) | 
					
						
							|  |  |  | 	errorIfInvalidToken(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// 11. AppendFileHandler
 | 
					
						
							|  |  |  | 	appendArgs := &AppendFileArgs{ | 
					
						
							| 
									
										
										
										
											2016-12-23 23:12:19 +08:00
										 |  |  | 		AuthRPCArgs: badAuthRPCArgs, | 
					
						
							| 
									
										
										
										
											2016-11-16 04:12:06 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-12-23 23:12:19 +08:00
										 |  |  | 	appendReply := &AuthRPCReply{} | 
					
						
							| 
									
										
										
										
											2016-11-16 04:12:06 +08:00
										 |  |  | 	err = storageRPC.AppendFileHandler(appendArgs, appendReply) | 
					
						
							|  |  |  | 	errorIfInvalidToken(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// 12. DeleteFileHandler
 | 
					
						
							|  |  |  | 	delFileArgs := &DeleteFileArgs{ | 
					
						
							| 
									
										
										
										
											2016-12-23 23:12:19 +08:00
										 |  |  | 		AuthRPCArgs: badAuthRPCArgs, | 
					
						
							| 
									
										
										
										
											2016-11-16 04:12:06 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-12-23 23:12:19 +08:00
										 |  |  | 	delFileRely := &AuthRPCReply{} | 
					
						
							| 
									
										
										
										
											2016-11-16 04:12:06 +08:00
										 |  |  | 	err = storageRPC.DeleteFileHandler(delFileArgs, delFileRely) | 
					
						
							|  |  |  | 	errorIfInvalidToken(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// 13. RenameFileHandler
 | 
					
						
							|  |  |  | 	renameArgs := &RenameFileArgs{ | 
					
						
							| 
									
										
										
										
											2016-12-23 23:12:19 +08:00
										 |  |  | 		AuthRPCArgs: badAuthRPCArgs, | 
					
						
							| 
									
										
										
										
											2016-11-16 04:12:06 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-12-23 23:12:19 +08:00
										 |  |  | 	renameReply := &AuthRPCReply{} | 
					
						
							| 
									
										
										
										
											2016-11-16 04:12:06 +08:00
										 |  |  | 	err = storageRPC.RenameFileHandler(renameArgs, renameReply) | 
					
						
							|  |  |  | 	errorIfInvalidToken(t, err) | 
					
						
							|  |  |  | } |