2020package org .apache .iotdb .confignode .manager .pipe .receiver .protocol ;
2121
2222import org .apache .iotdb .common .rpc .thrift .TSStatus ;
23+ import org .apache .iotdb .commons .audit .AuditLogOperation ;
2324import org .apache .iotdb .commons .audit .IAuditEntity ;
2425import org .apache .iotdb .commons .auth .entity .PrivilegeType ;
2526import org .apache .iotdb .commons .auth .entity .PrivilegeUnion ;
148149import java .util .Set ;
149150import java .util .concurrent .atomic .AtomicInteger ;
150151
152+ import static org .apache .iotdb .confignode .manager .pipe .source .PipeConfigTreePrivilegeParseVisitor .checkGlobalOrAnyStatus ;
151153import static org .apache .iotdb .confignode .manager .pipe .source .PipeConfigTreePrivilegeParseVisitor .checkGlobalStatus ;
152154import static org .apache .iotdb .confignode .manager .pipe .source .PipeConfigTreePrivilegeParseVisitor .checkPathsStatus ;
153155
@@ -193,6 +195,7 @@ public TPipeTransferResp receive(final TPipeTransferReq req) {
193195 resp =
194196 handleTransferHandshakeV2 (
195197 PipeTransferConfigNodeHandshakeV2Req .fromTPipeTransferReq (req ));
198+ userEntity .setAuditLogOperation (AuditLogOperation .DDL );
196199 PipeConfigNodeReceiverMetrics .getInstance ()
197200 .recordHandshakeConfigNodeV2Timer (System .nanoTime () - startTime );
198201 return resp ;
@@ -302,11 +305,12 @@ private TSStatus checkPermission(final ConfigPhysicalPlan plan) throws IOExcepti
302305 final String database ;
303306 final String templateName ;
304307 final String triggerName ;
308+ final String entityName ;
305309 switch (plan .getType ()) {
306310 case CreateDatabase :
307311 database = ((DatabaseSchemaPlan ) plan ).getSchema ().getName ();
308312 if (PathUtils .isTableModelDatabase (database )) {
309- status = checkDatabaseStatus (userEntity , PrivilegeType .CREATE , database , false );
313+ status = checkDatabaseStatus (userEntity , PrivilegeType .CREATE , database );
310314 if (status .getCode () != TSStatusCode .SUCCESS_STATUS .getStatusCode ()) {
311315 return checkGlobalStatus (userEntity , PrivilegeType .SYSTEM , database , true );
312316 }
@@ -315,7 +319,7 @@ private TSStatus checkPermission(final ConfigPhysicalPlan plan) throws IOExcepti
315319 case AlterDatabase :
316320 database = ((DatabaseSchemaPlan ) plan ).getSchema ().getName ();
317321 if (PathUtils .isTableModelDatabase (database )) {
318- status = checkDatabaseStatus (userEntity , PrivilegeType .ALTER , database , false );
322+ status = checkDatabaseStatus (userEntity , PrivilegeType .ALTER , database );
319323 if (status .getCode () != TSStatusCode .SUCCESS_STATUS .getStatusCode ()) {
320324 return checkGlobalStatus (userEntity , PrivilegeType .SYSTEM , database , true );
321325 }
@@ -324,7 +328,7 @@ private TSStatus checkPermission(final ConfigPhysicalPlan plan) throws IOExcepti
324328 case DeleteDatabase :
325329 database = ((DeleteDatabasePlan ) plan ).getName ();
326330 if (PathUtils .isTableModelDatabase (database )) {
327- status = checkDatabaseStatus (userEntity , PrivilegeType .DELETE , database , false );
331+ status = checkDatabaseStatus (userEntity , PrivilegeType .DELETE , database );
328332 if (status .getCode () != TSStatusCode .SUCCESS_STATUS .getStatusCode ()) {
329333 return checkGlobalStatus (userEntity , PrivilegeType .SYSTEM , database , true );
330334 }
@@ -445,8 +449,7 @@ private TSStatus checkPermission(final ConfigPhysicalPlan plan) throws IOExcepti
445449 userEntity ,
446450 PrivilegeType .CREATE ,
447451 ((PipeCreateTableOrViewPlan ) plan ).getDatabase (),
448- ((PipeCreateTableOrViewPlan ) plan ).getTable ().getTableName (),
449- true );
452+ ((PipeCreateTableOrViewPlan ) plan ).getTable ().getTableName ());
450453 case AddTableColumn :
451454 case AddViewColumn :
452455 case SetTableProperties :
@@ -464,128 +467,175 @@ private TSStatus checkPermission(final ConfigPhysicalPlan plan) throws IOExcepti
464467 userEntity ,
465468 PrivilegeType .ALTER ,
466469 ((AbstractTablePlan ) plan ).getDatabase (),
467- ((AbstractTablePlan ) plan ).getTableName (),
468- true );
470+ ((AbstractTablePlan ) plan ).getTableName ());
469471 case CommitDeleteTable :
470472 case CommitDeleteView :
471473 return checkTableStatus (
472474 userEntity ,
473475 PrivilegeType .DELETE ,
474476 ((CommitDeleteTablePlan ) plan ).getDatabase (),
475- ((CommitDeleteTablePlan ) plan ).getTableName (),
476- true );
477+ ((CommitDeleteTablePlan ) plan ).getTableName ());
477478 case GrantRole :
478479 case GrantUser :
479480 case RevokeUser :
480481 case RevokeRole :
482+ entityName =
483+ plan .getType () == ConfigPhysicalPlanType .GrantUser
484+ || plan .getType () == ConfigPhysicalPlanType .RevokeUser
485+ ? ((AuthorPlan ) plan ).getUserName ()
486+ : ((AuthorPlan ) plan ).getRoleName ();
487+ status = checkGlobalStatus (userEntity , PrivilegeType .SECURITY , entityName , false );
488+ if (status .getCode () == TSStatusCode .SUCCESS_STATUS .getStatusCode ()) {
489+ return status ;
490+ }
481491 for (final int permission : ((AuthorTreePlan ) plan ).getPermissions ()) {
482492 status =
483- configManager
484- .checkUserPrivilegeGrantOpt (
485- username ,
486- PrivilegeType .values ()[permission ].isPathPrivilege ()
487- ? new PrivilegeUnion (
488- ((AuthorTreePlan ) plan ).getNodeNameList (),
489- PrivilegeType .values ()[permission ],
490- true )
491- : new PrivilegeUnion (PrivilegeType .values ()[permission ], true ))
492- .getStatus ();
493+ PrivilegeType .values ()[permission ].isPathPrivilege ()
494+ ? checkPathsStatus (
495+ userEntity ,
496+ PrivilegeType .values ()[permission ],
497+ ((AuthorTreePlan ) plan ).getNodeNameList (),
498+ false ,
499+ entityName )
500+ : checkGlobalStatus (
501+ userEntity , PrivilegeType .values ()[permission ], entityName , false , true );
493502 if (status .getCode () != TSStatusCode .SUCCESS_STATUS .getStatusCode ()) {
494503 return status ;
495504 }
496505 }
506+ configManager
507+ .getAuditLogger ()
508+ .recordAuditLog (
509+ userEntity .setPrivilegeType (PrivilegeType .SECURITY ).setResult (true ),
510+ () -> entityName );
497511 return StatusUtils .OK ;
498512 case RGrantUserAny :
499513 case RGrantRoleAny :
500514 case RRevokeUserAny :
501515 case RRevokeRoleAny :
516+ entityName =
517+ plan .getType () == ConfigPhysicalPlanType .RGrantUserAny
518+ || plan .getType () == ConfigPhysicalPlanType .RRevokeUserAny
519+ ? ((AuthorPlan ) plan ).getUserName ()
520+ : ((AuthorPlan ) plan ).getRoleName ();
502521 for (final int permission : ((AuthorRelationalPlan ) plan ).getPermissions ()) {
503522 status =
504- configManager
505- .checkUserPrivileges (
506- username , new PrivilegeUnion (PrivilegeType .values ()[permission ], true , true ))
507- .getStatus ();
523+ checkGlobalOrAnyStatus (
524+ userEntity , PrivilegeType .values ()[permission ], entityName , false , true , true );
508525 if (status .getCode () != TSStatusCode .SUCCESS_STATUS .getStatusCode ()) {
509526 return status ;
510527 }
511528 }
529+ configManager
530+ .getAuditLogger ()
531+ .recordAuditLog (
532+ userEntity .setPrivilegeType (PrivilegeType .SECURITY ).setResult (true ),
533+ () -> entityName );
512534 return StatusUtils .OK ;
513535 case RGrantUserAll :
514536 case RGrantRoleAll :
515537 case RRevokeUserAll :
516538 case RRevokeRoleAll :
539+ entityName =
540+ plan .getType () == ConfigPhysicalPlanType .RGrantUserAll
541+ || plan .getType () == ConfigPhysicalPlanType .RRevokeUserAll
542+ ? ((AuthorPlan ) plan ).getUserName ()
543+ : ((AuthorPlan ) plan ).getRoleName ();
517544 for (PrivilegeType privilegeType : PrivilegeType .values ()) {
518545 if (privilegeType .isRelationalPrivilege ()) {
519546 status =
520- configManager
521- .checkUserPrivileges (username , new PrivilegeUnion (privilegeType , true , true ))
522- .getStatus ();
547+ checkGlobalOrAnyStatus (userEntity , privilegeType , entityName , false , true , true );
523548 } else if (privilegeType .forRelationalSys ()) {
524- status =
525- configManager
526- .checkUserPrivileges (username , new PrivilegeUnion (privilegeType , true ))
527- .getStatus ();
549+ status = checkGlobalStatus (userEntity , privilegeType , entityName , false , true );
528550 } else {
529551 continue ;
530552 }
531553 if (status .getCode () != TSStatusCode .SUCCESS_STATUS .getStatusCode ()) {
532554 return status ;
533555 }
534556 }
557+ configManager
558+ .getAuditLogger ()
559+ .recordAuditLog (
560+ userEntity .setPrivilegeType (PrivilegeType .SECURITY ).setResult (true ),
561+ () -> entityName );
535562 return StatusUtils .OK ;
536563 case RGrantUserDBPriv :
537564 case RGrantRoleDBPriv :
538565 case RRevokeUserDBPriv :
539566 case RRevokeRoleDBPriv :
567+ entityName =
568+ plan .getType () == ConfigPhysicalPlanType .RGrantUserDBPriv
569+ || plan .getType () == ConfigPhysicalPlanType .RRevokeUserDBPriv
570+ ? ((AuthorPlan ) plan ).getUserName ()
571+ : ((AuthorPlan ) plan ).getRoleName ();
540572 for (final int permission : ((AuthorRelationalPlan ) plan ).getPermissions ()) {
541573 status =
542- configManager
543- .checkUserPrivileges (
544- username ,
545- new PrivilegeUnion (
546- ((AuthorRelationalPlan ) plan ).getDatabaseName (),
547- PrivilegeType .values ()[permission ],
548- true ))
549- .getStatus ();
574+ checkDatabaseStatus (
575+ userEntity ,
576+ PrivilegeType .values ()[permission ],
577+ ((AuthorRelationalPlan ) plan ).getDatabaseName (),
578+ true );
550579 if (status .getCode () != TSStatusCode .SUCCESS_STATUS .getStatusCode ()) {
551580 return status ;
552581 }
553582 }
583+ configManager
584+ .getAuditLogger ()
585+ .recordAuditLog (
586+ userEntity .setPrivilegeType (PrivilegeType .SECURITY ).setResult (true ),
587+ () -> entityName );
554588 return StatusUtils .OK ;
555589 case RGrantUserTBPriv :
556590 case RGrantRoleTBPriv :
557591 case RRevokeUserTBPriv :
558592 case RRevokeRoleTBPriv :
593+ entityName =
594+ plan .getType () == ConfigPhysicalPlanType .RGrantUserTBPriv
595+ || plan .getType () == ConfigPhysicalPlanType .RRevokeUserTBPriv
596+ ? ((AuthorPlan ) plan ).getUserName ()
597+ : ((AuthorPlan ) plan ).getRoleName ();
559598 for (final int permission : ((AuthorRelationalPlan ) plan ).getPermissions ()) {
560599 status =
561- configManager
562- .checkUserPrivileges (
563- username ,
564- new PrivilegeUnion (
565- ((AuthorRelationalPlan ) plan ).getDatabaseName (),
566- ((AuthorRelationalPlan ) plan ).getTableName (),
567- PrivilegeType .values ()[permission ],
568- true ))
569- .getStatus ();
600+ checkTableStatus (
601+ userEntity ,
602+ PrivilegeType .values ()[permission ],
603+ ((AuthorRelationalPlan ) plan ).getDatabaseName (),
604+ ((AuthorRelationalPlan ) plan ).getTableName (),
605+ false ,
606+ true );
570607 if (status .getCode () != TSStatusCode .SUCCESS_STATUS .getStatusCode ()) {
571608 return status ;
572609 }
573610 }
611+ configManager
612+ .getAuditLogger ()
613+ .recordAuditLog (
614+ userEntity .setPrivilegeType (PrivilegeType .SECURITY ).setResult (true ),
615+ () -> entityName );
574616 return StatusUtils .OK ;
575617 case RGrantUserSysPri :
576618 case RGrantRoleSysPri :
577619 case RRevokeUserSysPri :
578620 case RRevokeRoleSysPri :
621+ entityName =
622+ plan .getType () == ConfigPhysicalPlanType .RGrantUserSysPri
623+ || plan .getType () == ConfigPhysicalPlanType .RRevokeUserSysPri
624+ ? ((AuthorPlan ) plan ).getUserName ()
625+ : ((AuthorPlan ) plan ).getRoleName ();
579626 for (final int permission : ((AuthorRelationalPlan ) plan ).getPermissions ()) {
580627 status =
581- configManager
582- .checkUserPrivileges (
583- username , new PrivilegeUnion (PrivilegeType .values ()[permission ], true ))
584- .getStatus ();
628+ checkGlobalStatus (
629+ userEntity , PrivilegeType .values ()[permission ], entityName , false , true );
585630 if (status .getCode () != TSStatusCode .SUCCESS_STATUS .getStatusCode ()) {
586631 return status ;
587632 }
588633 }
634+ configManager
635+ .getAuditLogger ()
636+ .recordAuditLog (
637+ userEntity .setPrivilegeType (PrivilegeType .SECURITY ).setResult (true ),
638+ () -> entityName );
589639 return StatusUtils .OK ;
590640 case UpdateUser :
591641 case UpdateUserV2 :
@@ -623,21 +673,24 @@ username, new PrivilegeUnion(PrivilegeType.values()[permission], true))
623673 }
624674 }
625675
626- public static TSStatus checkDatabaseStatus (
676+ private TSStatus checkDatabaseStatus (
677+ final IAuditEntity userEntity , final PrivilegeType privilegeType , final String database ) {
678+ return checkDatabaseStatus (userEntity , privilegeType , database , false );
679+ }
680+
681+ private TSStatus checkDatabaseStatus (
627682 final IAuditEntity userEntity ,
628683 final PrivilegeType privilegeType ,
629684 final String database ,
630- final boolean isLastCheck ) {
631- final ConfigManager configManager = ConfigNode .getInstance ().getConfigManager ();
632- final CNAuditLogger logger = configManager .getAuditLogger ();
685+ final boolean grantOption ) {
633686 final TSStatus result =
634687 configManager
635688 .getPermissionManager ()
636689 .checkUserPrivileges (
637- userEntity .getUsername (), new PrivilegeUnion (database , privilegeType ))
690+ userEntity .getUsername (), new PrivilegeUnion (database , privilegeType , grantOption ))
638691 .getStatus ();
639- if (result .getCode () == TSStatusCode .SUCCESS_STATUS .getStatusCode () || isLastCheck ) {
640- logger .recordAuditLog (
692+ if (result .getCode () == TSStatusCode .SUCCESS_STATUS .getStatusCode ()) {
693+ auditLogger .recordAuditLog (
641694 userEntity
642695 .setPrivilegeType (privilegeType )
643696 .setResult (result .getCode () == TSStatusCode .SUCCESS_STATUS .getStatusCode ()),
@@ -646,22 +699,30 @@ public static TSStatus checkDatabaseStatus(
646699 return result ;
647700 }
648701
649- public static TSStatus checkTableStatus (
702+ private TSStatus checkTableStatus (
703+ final IAuditEntity userEntity ,
704+ final PrivilegeType privilegeType ,
705+ final String database ,
706+ final String tableName ) {
707+ return checkTableStatus (userEntity , privilegeType , database , tableName , true , false );
708+ }
709+
710+ private TSStatus checkTableStatus (
650711 final IAuditEntity userEntity ,
651712 final PrivilegeType privilegeType ,
652713 final String database ,
653714 final String tableName ,
654- final boolean isLastCheck ) {
655- final ConfigManager configManager = ConfigNode .getInstance ().getConfigManager ();
656- final CNAuditLogger logger = configManager .getAuditLogger ();
715+ final boolean isLastCheck ,
716+ final boolean grantOption ) {
657717 final TSStatus result =
658718 configManager
659719 .getPermissionManager ()
660720 .checkUserPrivileges (
661- userEntity .getUsername (), new PrivilegeUnion (database , tableName , privilegeType ))
721+ userEntity .getUsername (),
722+ new PrivilegeUnion (database , tableName , privilegeType , grantOption ))
662723 .getStatus ();
663724 if (result .getCode () == TSStatusCode .SUCCESS_STATUS .getStatusCode () || isLastCheck ) {
664- logger .recordAuditLog (
725+ auditLogger .recordAuditLog (
665726 userEntity
666727 .setPrivilegeType (privilegeType )
667728 .setResult (result .getCode () == TSStatusCode .SUCCESS_STATUS .getStatusCode ()),
0 commit comments