github.com/Unheilbar/quorum@v1.0.0/qlight/test/server_test.go (about) 1 package test 2 3 import ( 4 "bytes" 5 "context" 6 "encoding/json" 7 "fmt" 8 "math/big" 9 "testing" 10 11 "github.com/ethereum/go-ethereum/common" 12 "github.com/ethereum/go-ethereum/consensus/ethash" 13 "github.com/ethereum/go-ethereum/core" 14 "github.com/ethereum/go-ethereum/core/mps" 15 "github.com/ethereum/go-ethereum/core/rawdb" 16 "github.com/ethereum/go-ethereum/core/types" 17 "github.com/ethereum/go-ethereum/core/vm" 18 "github.com/ethereum/go-ethereum/crypto" 19 "github.com/ethereum/go-ethereum/params" 20 "github.com/ethereum/go-ethereum/plugin/security" 21 "github.com/ethereum/go-ethereum/private" 22 "github.com/ethereum/go-ethereum/private/engine" 23 "github.com/ethereum/go-ethereum/qlight" 24 "github.com/golang/mock/gomock" 25 "github.com/jpmorganchase/quorum-security-plugin-sdk-go/proto" 26 "github.com/stretchr/testify/assert" 27 ) 28 29 func TestPrivateBlockDataResolverImpl_PrepareBlockPrivateData_EmptyBlock(t *testing.T) { 30 assert := assert.New(t) 31 ctrl := gomock.NewController(t) 32 defer ctrl.Finish() 33 34 mockpsm := mps.NewMockPrivateStateManager(ctrl) 35 mockptm := private.NewMockPrivateTransactionManager(ctrl) 36 37 saved := private.P 38 defer func() { 39 private.P = saved 40 }() 41 private.P = mockptm 42 43 mockptm.EXPECT().HasFeature(engine.MultiplePrivateStates).Return(true) 44 mockptm.EXPECT().Groups().Return(PrivacyGroups, nil).AnyTimes() 45 46 mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(PSI1PSM, nil).AnyTimes() 47 48 pbdr := qlight.NewPrivateBlockDataResolver(mockpsm, mockptm) 49 blocks, _, _ := buildTestChainWithZeroTxPerBlock(1, params.QuorumMPSTestChainConfig) 50 51 blockPrivateData, err := pbdr.PrepareBlockPrivateData(blocks[0], PSI1PSM.ID.String()) 52 53 assert.Nil(err) 54 assert.Nil(blockPrivateData) 55 } 56 57 func TestPrivateBlockDataResolverImpl_PrepareBlockPrivateData_PartyTransaction(t *testing.T) { 58 assert := assert.New(t) 59 ctrl := gomock.NewController(t) 60 defer ctrl.Finish() 61 62 mockpsm := mps.NewMockPrivateStateManager(ctrl) 63 mockptm := private.NewMockPrivateTransactionManager(ctrl) 64 mockstaterepo := mps.NewMockPrivateStateRepository(ctrl) 65 66 saved := private.P 67 defer func() { 68 private.P = saved 69 }() 70 private.P = mockptm 71 72 mockptm.EXPECT().Receive(gomock.Not(common.EncryptedPayloadHash{})).Return("AAA", []string{"AAA", "CCC"}, common.FromHex(testCode), &engine.ExtraMetadata{ 73 ACHashes: nil, 74 ACMerkleRoot: common.Hash{}, 75 PrivacyFlag: 0, 76 ManagedParties: []string{"AAA", "CCC"}, 77 Sender: "AAA", 78 MandatoryRecipients: nil, 79 }, nil).AnyTimes() 80 mockptm.EXPECT().HasFeature(engine.MultiplePrivateStates).Return(true) 81 mockptm.EXPECT().Groups().Return(PrivacyGroups, nil).AnyTimes() 82 83 mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(PSI1PSM, nil).AnyTimes() 84 mockpsm.EXPECT().NotIncludeAny(gomock.Any(), gomock.Any()).Return(false).AnyTimes() 85 mockpsm.EXPECT().StateRepository(gomock.Any()).Return(mockstaterepo, nil).AnyTimes() 86 mockpsm.EXPECT().PSIs().Return([]types.PrivateStateIdentifier{PSI1PSM.ID, PSI2PSM.ID, types.DefaultPrivateStateIdentifier, types.ToPrivateStateIdentifier("other")}).AnyTimes() 87 88 mockstaterepo.EXPECT().PrivateStateRoot(gomock.Any()).Return(common.StringToHash("PrivateStateRoot"), nil) 89 90 pbdr := qlight.NewPrivateBlockDataResolver(mockpsm, mockptm) 91 blocks, _, _ := buildTestChainWithOneTxPerBlock(1, params.QuorumMPSTestChainConfig) 92 93 blockPrivateData, err := pbdr.PrepareBlockPrivateData(blocks[0], PSI1PSM.ID.String()) 94 95 assert.Nil(err) 96 assert.NotNil(blockPrivateData) 97 assert.Equal(common.StringToHash("PrivateStateRoot"), blockPrivateData.PrivateStateRoot) 98 assert.Equal(blocks[0].Hash(), blockPrivateData.BlockHash) 99 assert.Len(blockPrivateData.PrivateTransactions, 1) 100 privateTransactionData := blockPrivateData.PrivateTransactions[0] 101 assert.True(privateTransactionData.IsSender) 102 assert.Equal(common.FromHex(testCode), privateTransactionData.Payload) 103 assert.ElementsMatch(privateTransactionData.Extra.ManagedParties, []string{"AAA"}) 104 } 105 106 func TestPrivateBlockDataResolverImpl_PrepareBlockPrivateData_NonPartyTransaction(t *testing.T) { 107 assert := assert.New(t) 108 ctrl := gomock.NewController(t) 109 defer ctrl.Finish() 110 111 mockpsm := mps.NewMockPrivateStateManager(ctrl) 112 mockptm := private.NewMockPrivateTransactionManager(ctrl) 113 114 saved := private.P 115 defer func() { 116 private.P = saved 117 }() 118 private.P = mockptm 119 120 mockptm.EXPECT().Receive(gomock.Not(common.EncryptedPayloadHash{})).Return("", nil, nil, nil, nil).AnyTimes() 121 mockptm.EXPECT().HasFeature(engine.MultiplePrivateStates).Return(true) 122 mockptm.EXPECT().Groups().Return(PrivacyGroups, nil).AnyTimes() 123 124 mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(PSI1PSM, nil).AnyTimes() 125 126 pbdr := qlight.NewPrivateBlockDataResolver(mockpsm, mockptm) 127 blocks, _, _ := buildTestChainWithOneTxPerBlock(1, params.QuorumMPSTestChainConfig) 128 129 blockPrivateData, err := pbdr.PrepareBlockPrivateData(blocks[0], PSI1PSM.ID.String()) 130 131 assert.Nil(err) 132 assert.Nil(blockPrivateData) 133 } 134 135 func TestPrivateBlockDataResolverImpl_PrepareBlockPrivateData_PMTTransaction(t *testing.T) { 136 assert := assert.New(t) 137 ctrl := gomock.NewController(t) 138 defer ctrl.Finish() 139 140 mockpsm := mps.NewMockPrivateStateManager(ctrl) 141 mockptm := private.NewMockPrivateTransactionManager(ctrl) 142 mockstaterepo := mps.NewMockPrivateStateRepository(ctrl) 143 144 saved := private.P 145 defer func() { 146 private.P = saved 147 }() 148 private.P = mockptm 149 150 tx, err := types.SignTx(types.NewContractCreation(0, big.NewInt(0), testGas, nil, common.BytesToEncryptedPayloadHash([]byte("pmt private tx")).Bytes()), types.QuorumPrivateTxSigner{}, testKey) 151 assert.Nil(err) 152 txData := new(bytes.Buffer) 153 err = json.NewEncoder(txData).Encode(tx) 154 assert.Nil(err) 155 156 mockptm.EXPECT().Receive(common.BytesToEncryptedPayloadHash([]byte("pmt inner tx"))).Return("AAA", []string{"AAA", "CCC"}, txData.Bytes(), &engine.ExtraMetadata{ 157 ACHashes: nil, 158 ACMerkleRoot: common.Hash{}, 159 PrivacyFlag: 0, 160 ManagedParties: []string{"AAA", "CCC"}, 161 Sender: "AAA", 162 MandatoryRecipients: nil, 163 }, nil).AnyTimes() 164 mockptm.EXPECT().Receive(common.BytesToEncryptedPayloadHash([]byte("pmt private tx"))).Return("AAA", []string{"AAA", "CCC"}, common.FromHex(testCode), &engine.ExtraMetadata{ 165 ACHashes: nil, 166 ACMerkleRoot: common.Hash{}, 167 PrivacyFlag: 0, 168 ManagedParties: []string{"AAA", "CCC"}, 169 Sender: "AAA", 170 MandatoryRecipients: nil, 171 }, nil).AnyTimes() 172 mockptm.EXPECT().HasFeature(engine.MultiplePrivateStates).Return(true) 173 mockptm.EXPECT().Groups().Return(PrivacyGroups, nil).AnyTimes() 174 175 mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(PSI1PSM, nil).AnyTimes() 176 mockpsm.EXPECT().NotIncludeAny(gomock.Any(), gomock.Any()).Return(false).AnyTimes() 177 mockpsm.EXPECT().StateRepository(gomock.Any()).Return(mockstaterepo, nil).AnyTimes() 178 mockpsm.EXPECT().PSIs().Return([]types.PrivateStateIdentifier{PSI1PSM.ID, PSI2PSM.ID, types.DefaultPrivateStateIdentifier, types.ToPrivateStateIdentifier("other")}).AnyTimes() 179 180 mockstaterepo.EXPECT().PrivateStateRoot(gomock.Any()).Return(common.StringToHash("PrivateStateRoot"), nil) 181 182 pbdr := qlight.NewPrivateBlockDataResolver(mockpsm, mockptm) 183 blocks, _, _ := buildTestChainWithOnePMTTxPerBlock(1, params.QuorumMPSTestChainConfig) 184 185 blockPrivateData, err := pbdr.PrepareBlockPrivateData(blocks[0], PSI1PSM.ID.String()) 186 187 assert.Nil(err) 188 assert.NotNil(blockPrivateData) 189 assert.Equal(common.StringToHash("PrivateStateRoot"), blockPrivateData.PrivateStateRoot) 190 assert.Equal(blocks[0].Hash(), blockPrivateData.BlockHash) 191 assert.Len(blockPrivateData.PrivateTransactions, 2) 192 193 pmtTransactionData := blockPrivateData.PrivateTransactions[0] 194 assert.True(pmtTransactionData.IsSender) 195 assert.Equal(txData.Bytes(), pmtTransactionData.Payload) 196 assert.ElementsMatch(pmtTransactionData.Extra.ManagedParties, []string{"AAA"}) 197 198 privateTransactionData := blockPrivateData.PrivateTransactions[1] 199 assert.True(privateTransactionData.IsSender) 200 assert.Equal(common.FromHex(testCode), privateTransactionData.Payload) 201 assert.ElementsMatch(privateTransactionData.Extra.ManagedParties, []string{"AAA"}) 202 } 203 204 func TestAuthProviderImpl_Authorize_AuthManagerNil(t *testing.T) { 205 assert := assert.New(t) 206 ctrl := gomock.NewController(t) 207 defer ctrl.Finish() 208 209 mockpsm := mps.NewMockPrivateStateManager(ctrl) 210 mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(PSI1PSM, nil).AnyTimes() 211 authProvider := qlight.NewAuthProvider(mockpsm, func() security.AuthenticationManager { return nil }) 212 213 err := authProvider.Initialize() 214 assert.Nil(err) 215 216 err = authProvider.Authorize("token", "psi1") 217 assert.Nil(err) 218 } 219 220 func TestAuthProviderImpl_Authorize_AuthManagerDisabled(t *testing.T) { 221 assert := assert.New(t) 222 ctrl := gomock.NewController(t) 223 defer ctrl.Finish() 224 225 mockpsm := mps.NewMockPrivateStateManager(ctrl) 226 mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(PSI1PSM, nil).AnyTimes() 227 authProvider := qlight.NewAuthProvider(mockpsm, func() security.AuthenticationManager { 228 return &testAuthManager{ 229 enabled: false, 230 authError: nil, 231 authToken: nil, 232 } 233 }) 234 235 err := authProvider.Initialize() 236 assert.Nil(err) 237 238 err = authProvider.Authorize("token", "psi1") 239 assert.Nil(err) 240 } 241 242 func TestAuthProviderImpl_Authorize_AuthManagerEnabledAuthError(t *testing.T) { 243 assert := assert.New(t) 244 ctrl := gomock.NewController(t) 245 defer ctrl.Finish() 246 247 mockpsm := mps.NewMockPrivateStateManager(ctrl) 248 mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(PSI1PSM, nil).AnyTimes() 249 authProvider := qlight.NewAuthProvider(mockpsm, func() security.AuthenticationManager { 250 return &testAuthManager{ 251 enabled: true, 252 authError: fmt.Errorf("auth error"), 253 authToken: nil, 254 } 255 }) 256 257 err := authProvider.Initialize() 258 assert.Nil(err) 259 260 err = authProvider.Authorize("token", "psi1") 261 assert.EqualError(err, "auth error") 262 } 263 264 func TestAuthProviderImpl_Authorize_AuthManagerEnabledNotEntitledToPSI(t *testing.T) { 265 assert := assert.New(t) 266 ctrl := gomock.NewController(t) 267 defer ctrl.Finish() 268 269 mockpsm := mps.NewMockPrivateStateManager(ctrl) 270 mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(PSI1PSM, nil).AnyTimes() 271 authProvider := qlight.NewAuthProvider(mockpsm, func() security.AuthenticationManager { 272 return &testAuthManager{ 273 enabled: true, 274 authError: nil, 275 authToken: &proto.PreAuthenticatedAuthenticationToken{ 276 RawToken: nil, 277 ExpiredAt: nil, 278 Authorities: []*proto.GrantedAuthority{&proto.GrantedAuthority{ 279 Service: "psi", 280 Method: "psi2", 281 Raw: "psi://psi2", 282 XXX_NoUnkeyedLiteral: struct{}{}, 283 XXX_unrecognized: nil, 284 XXX_sizecache: 0, 285 }}, 286 XXX_NoUnkeyedLiteral: struct{}{}, 287 XXX_unrecognized: nil, 288 XXX_sizecache: 0, 289 }, 290 } 291 }) 292 293 err := authProvider.Initialize() 294 assert.Nil(err) 295 296 err = authProvider.Authorize("token", "psi1") 297 assert.EqualError(err, "PSI not authorized") 298 } 299 300 func TestAuthProviderImpl_Authorize_AuthManagerEnabledMissingEntitlement(t *testing.T) { 301 assert := assert.New(t) 302 ctrl := gomock.NewController(t) 303 defer ctrl.Finish() 304 305 mockpsm := mps.NewMockPrivateStateManager(ctrl) 306 mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(PSI1PSM, nil).AnyTimes() 307 authProvider := qlight.NewAuthProvider(mockpsm, func() security.AuthenticationManager { 308 return &testAuthManager{ 309 enabled: true, 310 authError: nil, 311 authToken: &proto.PreAuthenticatedAuthenticationToken{ 312 RawToken: nil, 313 ExpiredAt: nil, 314 Authorities: []*proto.GrantedAuthority{&proto.GrantedAuthority{ 315 Service: "psi", 316 Method: "psi1", 317 Raw: "psi://psi1", 318 XXX_NoUnkeyedLiteral: struct{}{}, 319 XXX_unrecognized: nil, 320 XXX_sizecache: 0, 321 }, &proto.GrantedAuthority{ 322 Service: "p2p", 323 Method: "qlight", 324 Raw: "p2p://qlight", 325 XXX_NoUnkeyedLiteral: struct{}{}, 326 XXX_unrecognized: nil, 327 XXX_sizecache: 0, 328 }, 329 }, 330 XXX_NoUnkeyedLiteral: struct{}{}, 331 XXX_unrecognized: nil, 332 XXX_sizecache: 0, 333 }, 334 } 335 }) 336 337 err := authProvider.Initialize() 338 assert.Nil(err) 339 340 err = authProvider.Authorize("token", "psi1") 341 assert.EqualError(err, "The P2P token does not have the necessary authorization p2p=true rpcETH=false") 342 } 343 344 func TestAuthProviderImpl_Authorize_AuthManagerEnabledSuccess(t *testing.T) { 345 assert := assert.New(t) 346 ctrl := gomock.NewController(t) 347 defer ctrl.Finish() 348 349 mockpsm := mps.NewMockPrivateStateManager(ctrl) 350 mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(PSI1PSM, nil).AnyTimes() 351 authProvider := qlight.NewAuthProvider(mockpsm, func() security.AuthenticationManager { 352 return &testAuthManager{ 353 enabled: true, 354 authError: nil, 355 authToken: &proto.PreAuthenticatedAuthenticationToken{ 356 RawToken: nil, 357 ExpiredAt: nil, 358 Authorities: []*proto.GrantedAuthority{&proto.GrantedAuthority{ 359 Service: "psi", 360 Method: "psi1", 361 Raw: "psi://psi1", 362 XXX_NoUnkeyedLiteral: struct{}{}, 363 XXX_unrecognized: nil, 364 XXX_sizecache: 0, 365 }, &proto.GrantedAuthority{ 366 Service: "p2p", 367 Method: "qlight", 368 Raw: "p2p://qlight", 369 XXX_NoUnkeyedLiteral: struct{}{}, 370 XXX_unrecognized: nil, 371 XXX_sizecache: 0, 372 }, &proto.GrantedAuthority{ 373 Service: "rpc", 374 Method: "eth_*", 375 Raw: "rpc://eth_*", 376 XXX_NoUnkeyedLiteral: struct{}{}, 377 XXX_unrecognized: nil, 378 XXX_sizecache: 0, 379 }, 380 }, 381 XXX_NoUnkeyedLiteral: struct{}{}, 382 XXX_unrecognized: nil, 383 XXX_sizecache: 0, 384 }, 385 } 386 }) 387 388 err := authProvider.Initialize() 389 assert.Nil(err) 390 391 err = authProvider.Authorize("token", "psi1") 392 assert.Nil(err) 393 } 394 395 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 396 ////// Helpers ///////////////////////////////////////////////////////////////////////////////////////////////////////// 397 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 398 399 const ( 400 // testCode is the testing contract binary code which will initialises some 401 // variables in constructor 402 testCode = "0x60806040527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0060005534801561003457600080fd5b5060fc806100436000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80630c4dae8814603757806398a213cf146053575b600080fd5b603d607e565b6040518082815260200191505060405180910390f35b607c60048036036020811015606757600080fd5b81019080803590602001909291905050506084565b005b60005481565b806000819055507fe9e44f9f7da8c559de847a3232b57364adc0354f15a2cd8dc636d54396f9587a6000546040518082815260200191505060405180910390a15056fea265627a7a723058208ae31d9424f2d0bc2a3da1a5dd659db2d71ec322a17db8f87e19e209e3a1ff4a64736f6c634300050a0032" 403 404 // testGas is the gas required for contract deployment. 405 testGas = 144109 406 ) 407 408 var ( 409 testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") 410 testAddress = crypto.PubkeyToAddress(testKey.PublicKey) 411 ) 412 413 func buildTestChainWithZeroTxPerBlock(n int, config *params.ChainConfig) ([]*types.Block, map[common.Hash]*types.Block, *core.BlockChain) { 414 testdb := rawdb.NewMemoryDatabase() 415 genesis := core.GenesisBlockForTesting(testdb, testAddress, big.NewInt(1000000000)) 416 blocks, _ := core.GenerateChain(config, genesis, ethash.NewFaker(), testdb, n, func(i int, block *core.BlockGen) { 417 block.SetCoinbase(common.Address{0}) 418 }) 419 420 hashes := make([]common.Hash, n+1) 421 hashes[len(hashes)-1] = genesis.Hash() 422 blockm := make(map[common.Hash]*types.Block, n+1) 423 blockm[genesis.Hash()] = genesis 424 for i, b := range blocks { 425 hashes[len(hashes)-i-2] = b.Hash() 426 blockm[b.Hash()] = b 427 } 428 429 blockchain, _ := core.NewBlockChain(testdb, nil, config, ethash.NewFaker(), vm.Config{}, nil, nil, nil) 430 return blocks, blockm, blockchain 431 } 432 433 func buildTestChainWithOneTxPerBlock(n int, config *params.ChainConfig) ([]*types.Block, map[common.Hash]*types.Block, *core.BlockChain) { 434 testdb := rawdb.NewMemoryDatabase() 435 genesis := core.GenesisBlockForTesting(testdb, testAddress, big.NewInt(1000000000)) 436 blocks, _ := core.GenerateChain(config, genesis, ethash.NewFaker(), testdb, n, func(i int, block *core.BlockGen) { 437 block.SetCoinbase(common.Address{0}) 438 439 signer := types.QuorumPrivateTxSigner{} 440 tx, err := types.SignTx(types.NewContractCreation(block.TxNonce(testAddress), big.NewInt(0), testGas, nil, common.FromHex(testCode)), signer, testKey) 441 if err != nil { 442 panic(err) 443 } 444 block.AddTx(tx) 445 }) 446 447 hashes := make([]common.Hash, n+1) 448 hashes[len(hashes)-1] = genesis.Hash() 449 blockm := make(map[common.Hash]*types.Block, n+1) 450 blockm[genesis.Hash()] = genesis 451 for i, b := range blocks { 452 hashes[len(hashes)-i-2] = b.Hash() 453 blockm[b.Hash()] = b 454 } 455 456 blockchain, _ := core.NewBlockChain(testdb, nil, config, ethash.NewFaker(), vm.Config{}, nil, nil, nil) 457 return blocks, blockm, blockchain 458 } 459 460 func buildTestChainWithOnePMTTxPerBlock(n int, config *params.ChainConfig) ([]*types.Block, map[common.Hash]*types.Block, *core.BlockChain) { 461 testdb := rawdb.NewMemoryDatabase() 462 genesis := core.GenesisBlockForTesting(testdb, testAddress, big.NewInt(1000000000)) 463 blocks, _ := core.GenerateChain(config, genesis, ethash.NewFaker(), testdb, n, func(i int, block *core.BlockGen) { 464 block.SetCoinbase(common.Address{0}) 465 466 signer := types.LatestSigner(config) 467 tx, err := types.SignTx(types.NewTransaction(block.TxNonce(testAddress), common.QuorumPrivacyPrecompileContractAddress(), big.NewInt(0), testGas, nil, common.BytesToEncryptedPayloadHash([]byte("pmt inner tx")).Bytes()), signer, testKey) 468 if err != nil { 469 panic(err) 470 } 471 block.AddTx(tx) 472 }) 473 474 hashes := make([]common.Hash, n+1) 475 hashes[len(hashes)-1] = genesis.Hash() 476 blockm := make(map[common.Hash]*types.Block, n+1) 477 blockm[genesis.Hash()] = genesis 478 for i, b := range blocks { 479 hashes[len(hashes)-i-2] = b.Hash() 480 blockm[b.Hash()] = b 481 } 482 483 blockchain, _ := core.NewBlockChain(testdb, nil, config, ethash.NewFaker(), vm.Config{}, nil, nil, nil) 484 return blocks, blockm, blockchain 485 } 486 487 var PSI1PSM = mps.NewPrivateStateMetadata("psi1", "psi1", "private state 1", mps.Resident, PG1.Members) 488 489 var PSI2PSM = mps.NewPrivateStateMetadata("psi2", "psi2", "private state 2", mps.Resident, PG2.Members) 490 491 var PG1 = engine.PrivacyGroup{ 492 Type: "RESIDENT", 493 Name: "RG1", 494 PrivacyGroupId: "RG1", 495 Description: "Resident Group 1", 496 From: "", 497 Members: []string{"AAA", "BBB"}, 498 } 499 500 var PG2 = engine.PrivacyGroup{ 501 Type: "RESIDENT", 502 Name: "RG2", 503 PrivacyGroupId: "RG2", 504 Description: "Resident Group 2", 505 From: "", 506 Members: []string{"CCC", "DDD"}, 507 } 508 509 var PrivacyGroups = []engine.PrivacyGroup{ 510 PG1, 511 PG2, 512 { 513 Type: "LEGACY", 514 Name: "LEGACY1", 515 PrivacyGroupId: "LEGACY1", 516 Description: "Legacy Group 1", 517 From: "", 518 Members: []string{"LEG1", "LEG2"}, 519 }, 520 } 521 522 type testAuthManager struct { 523 enabled bool 524 authError error 525 authToken *proto.PreAuthenticatedAuthenticationToken 526 } 527 528 func (am *testAuthManager) Authenticate(ctx context.Context, token string) (*proto.PreAuthenticatedAuthenticationToken, error) { 529 return am.authToken, am.authError 530 } 531 532 func (am *testAuthManager) IsEnabled(ctx context.Context) (bool, error) { 533 return am.enabled, nil 534 }