@@ -17,6 +17,7 @@ package integration
1717import (
1818 "context"
1919 "fmt"
20+ "strings"
2021 "sync"
2122 "testing"
2223 "time"
@@ -188,6 +189,7 @@ type user struct {
188189 name string
189190 password string
190191 role string
192+ perm string
191193 key string
192194 end string
193195}
@@ -379,8 +381,15 @@ func authSetupUsers(t *testing.T, auth pb.AuthClient, users []user) {
379381 continue
380382 }
381383
384+ permType := authpb .READWRITE
385+ if len (user .perm ) > 0 {
386+ val , ok := authpb .Permission_Type_value [strings .ToUpper (user .perm )]
387+ if ok {
388+ permType = authpb .Permission_Type (val )
389+ }
390+ }
382391 perm := & authpb.Permission {
383- PermType : authpb . READWRITE ,
392+ PermType : permType ,
384393 Key : []byte (user .key ),
385394 RangeEnd : []byte (user .end ),
386395 }
@@ -486,6 +495,102 @@ func TestV3AuthNestedTxnPermissionDenied(t *testing.T) {
486495 require .Equal (t , resp .Kvs [0 ].Value , []byte ("bar" ))
487496}
488497
498+ func TestReadWithPrevKvInTXN (t * testing.T ) {
499+ integration .BeforeTest (t )
500+ clus := integration .NewCluster (t , & integration.ClusterConfig {Size : 1 })
501+ defer clus .Terminate (t )
502+
503+ users := []user {
504+ {
505+ name : "user1" ,
506+ password : "user1-123" ,
507+ role : "role1" ,
508+ perm : "write" ,
509+ key : "foo" ,
510+ end : "zoo" ,
511+ },
512+ }
513+ anonCli := integration .ToGRPC (clus .Client (0 ))
514+ authSetupUsers (t , anonCli .Auth , users )
515+ authSetupRoot (t , anonCli .Auth )
516+
517+ rootc , err := integration .NewClient (t , clientv3.Config {
518+ Endpoints : clus .Client (0 ).Endpoints (),
519+ Username : "root" ,
520+ Password : "123" ,
521+ })
522+ require .NoError (t , err )
523+ defer rootc .Close ()
524+
525+ userc , err := integration .NewClient (t , clientv3.Config {
526+ Endpoints : clus .Client (0 ).Endpoints (),
527+ Username : "user1" ,
528+ Password : "user1-123" ,
529+ })
530+ require .NoError (t , err )
531+ defer userc .Close ()
532+
533+ _ , err = rootc .Put (t .Context (), "foo" , "bar" )
534+ require .NoError (t , err )
535+
536+ _ , err = userc .Txn (t .Context ()).
537+ Then (clientv3 .OpPut ("foo" , "new" , clientv3 .WithPrevKV ())).
538+ Commit ()
539+
540+ require .Error (t , err )
541+ require .Truef (t , eqErrGRPC (err , rpctypes .ErrGRPCPermissionDenied ), "got %v, expected %v" , err , rpctypes .ErrGRPCPermissionDenied )
542+ }
543+
544+ func TestPutWithLeaseInTXN (t * testing.T ) {
545+ integration .BeforeTest (t )
546+ clus := integration .NewCluster (t , & integration.ClusterConfig {Size : 1 })
547+ defer clus .Terminate (t )
548+
549+ users := []user {
550+ {
551+ name : "user1" ,
552+ password : "user1-123" ,
553+ role : "role1" ,
554+ perm : "write" ,
555+ key : "foo" ,
556+ end : "fop" ,
557+ },
558+ }
559+ anonCli := integration .ToGRPC (clus .Client (0 ))
560+ authSetupUsers (t , anonCli .Auth , users )
561+ authSetupRoot (t , anonCli .Auth )
562+
563+ rootc , err := integration .NewClient (t , clientv3.Config {
564+ Endpoints : clus .Client (0 ).Endpoints (),
565+ Username : "root" ,
566+ Password : "123" ,
567+ })
568+ require .NoError (t , err )
569+ defer rootc .Close ()
570+
571+ userc , err := integration .NewClient (t , clientv3.Config {
572+ Endpoints : clus .Client (0 ).Endpoints (),
573+ Username : "user1" ,
574+ Password : "user1-123" ,
575+ })
576+ require .NoError (t , err )
577+ defer userc .Close ()
578+
579+ t .Log ("Create a lease and attach it to a key which the user1 doesn't have permission to write" )
580+ leaseResp , err := rootc .Grant (t .Context (), 90 )
581+ require .NoError (t , err )
582+ leaseID := leaseResp .ID
583+ _ , err = rootc .Put (t .Context (), "eoo" , "bar" , clientv3 .WithLease (leaseID ))
584+ require .NoError (t , err )
585+
586+ _ , err = userc .Txn (t .Context ()).
587+ Then (clientv3 .OpPut ("foo" , "new" , clientv3 .WithLease (leaseID ))).
588+ Commit ()
589+
590+ require .Error (t , err )
591+ require .Truef (t , eqErrGRPC (err , rpctypes .ErrGRPCPermissionDenied ), "got %v, expected %v" , err , rpctypes .ErrGRPCPermissionDenied )
592+ }
593+
489594func TestV3AuthOldRevConcurrent (t * testing.T ) {
490595 integration .BeforeTest (t )
491596 clus := integration .NewCluster (t , & integration.ClusterConfig {Size : 1 })
0 commit comments