users.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #include "auth_scan_base.h"
  2. #include "users.h"
  3. #include <ydb/core/sys_view/common/events.h>
  4. #include <ydb/core/sys_view/common/schema.h>
  5. #include <ydb/core/sys_view/common/scan_actor_base_impl.h>
  6. #include <ydb/core/base/tablet_pipecache.h>
  7. #include <ydb/library/login/protos/login.pb.h>
  8. #include <ydb/library/actors/core/hfunc.h>
  9. namespace NKikimr::NSysView::NAuth {
  10. using namespace NSchemeShard;
  11. using namespace NActors;
  12. class TUsersScan : public TScanActorBase<TUsersScan> {
  13. public:
  14. using TBase = TScanActorBase<TUsersScan>;
  15. TUsersScan(const NActors::TActorId& ownerId, ui32 scanId, const TTableId& tableId,
  16. const TTableRange& tableRange, const TArrayRef<NMiniKQL::TKqpComputeContextBase::TColumn>& columns)
  17. : TBase(ownerId, scanId, tableId, tableRange, columns)
  18. {
  19. }
  20. STFUNC(StateScan) {
  21. switch (ev->GetTypeRewrite()) {
  22. HFunc(TEvSchemeShard::TEvListUsersResult, Handle);
  23. hFunc(NKqp::TEvKqpCompute::TEvScanDataAck, Handle);
  24. hFunc(TEvPipeCache::TEvDeliveryProblem, Handle);
  25. hFunc(NKqp::TEvKqp::TEvAbortExecution, TBase::HandleAbortExecution);
  26. cFunc(TEvents::TEvWakeup::EventType, TBase::HandleTimeout);
  27. cFunc(TEvents::TEvPoison::EventType, PassAway);
  28. default:
  29. LOG_CRIT(*TlsActivationContext, NKikimrServices::SYSTEM_VIEWS,
  30. "NSysView::NAuth::TUsersScan: unexpected event 0x%08" PRIx32, ev->GetTypeRewrite());
  31. }
  32. }
  33. protected:
  34. void ProceedToScan() override {
  35. TBase::Become(&TUsersScan::StateScan);
  36. if (TBase::AckReceived) {
  37. StartScan();
  38. }
  39. }
  40. void Handle(NKqp::TEvKqpCompute::TEvScanDataAck::TPtr&) {
  41. StartScan();
  42. }
  43. void StartScan() {
  44. // TODO: support TableRange filter
  45. if (auto cellsFrom = TBase::TableRange.From.GetCells(); cellsFrom.size() > 0 && !cellsFrom[0].IsNull()) {
  46. TBase::ReplyErrorAndDie(Ydb::StatusIds::INTERNAL_ERROR, TStringBuilder() << "TableRange.From filter is not supported");
  47. return;
  48. }
  49. if (auto cellsTo = TBase::TableRange.To.GetCells(); cellsTo.size() > 0 && !cellsTo[0].IsNull()) {
  50. TBase::ReplyErrorAndDie(Ydb::StatusIds::INTERNAL_ERROR, TStringBuilder() << "TableRange.To filter is not supported");
  51. return;
  52. }
  53. auto request = MakeHolder<TEvSchemeShard::TEvListUsers>();
  54. LOG_TRACE_S(TlsActivationContext->AsActorContext(), NKikimrServices::SYSTEM_VIEWS,
  55. "Sending list users request " << request->Record.ShortUtf8DebugString());
  56. TBase::SendThroughPipeCache(request.Release(), TBase::SchemeShardId);
  57. }
  58. void Handle(TEvSchemeShard::TEvListUsersResult::TPtr& ev, const TActorContext& ctx) {
  59. const auto& record = ev->Get()->Record;
  60. LOG_TRACE_S(ctx, NKikimrServices::SYSTEM_VIEWS,
  61. "Got list users response " << record.ShortUtf8DebugString());
  62. auto batch = MakeHolder<NKqp::TEvKqpCompute::TEvScanData>(TBase::ScanId);
  63. FillBatch(*batch, record);
  64. TBase::SendBatch(std::move(batch));
  65. }
  66. void Handle(TEvPipeCache::TEvDeliveryProblem::TPtr&) {
  67. TBase::ReplyErrorAndDie(Ydb::StatusIds::UNAVAILABLE, "Failed to request domain info");
  68. }
  69. void PassAway() override {
  70. TBase::PassAway();
  71. }
  72. void FillBatch(NKqp::TEvKqpCompute::TEvScanData& batch, const NKikimrScheme::TEvListUsersResult& result) {
  73. TVector<TCell> cells(::Reserve(Columns.size()));
  74. // TODO: add rows according to request's sender user rights
  75. for (const auto& user : result.GetUsers()) {
  76. for (auto& column : Columns) {
  77. switch (column.Tag) {
  78. case Schema::AuthUsers::Sid::ColumnId:
  79. cells.push_back(user.HasName()
  80. ? TCell(user.GetName().data(), user.GetName().size())
  81. : TCell());
  82. break;
  83. case Schema::AuthUsers::IsEnabled::ColumnId:
  84. cells.push_back(user.HasIsEnabled()
  85. ? TCell::Make(user.GetIsEnabled())
  86. : TCell());
  87. break;
  88. case Schema::AuthUsers::IsLockedOut::ColumnId:
  89. cells.push_back(user.HasIsLockedOut()
  90. ? TCell::Make(user.GetIsLockedOut())
  91. : TCell());
  92. break;
  93. case Schema::AuthUsers::CreatedAt::ColumnId:
  94. cells.push_back(user.HasCreatedAt()
  95. ? TCell::Make(user.GetCreatedAt())
  96. : TCell());
  97. break;
  98. case Schema::AuthUsers::LastSuccessfulAttemptAt::ColumnId:
  99. cells.push_back(user.HasLastSuccessfulAttemptAt()
  100. ? TCell::Make(user.GetLastSuccessfulAttemptAt())
  101. : TCell());
  102. break;
  103. case Schema::AuthUsers::LastFailedAttemptAt::ColumnId:
  104. cells.push_back(user.HasLastFailedAttemptAt()
  105. ? TCell::Make(user.GetLastFailedAttemptAt())
  106. : TCell());
  107. break;
  108. case Schema::AuthUsers::FailedAttemptCount::ColumnId:
  109. cells.push_back(user.HasFailedAttemptCount()
  110. ? TCell::Make(user.GetFailedAttemptCount())
  111. : TCell());
  112. break;
  113. case Schema::AuthUsers::PasswordHash::ColumnId:
  114. cells.push_back(user.HasPasswordHash()
  115. ? TCell(user.GetPasswordHash().data(), user.GetPasswordHash().size())
  116. : TCell());
  117. break;
  118. default:
  119. cells.emplace_back();
  120. }
  121. }
  122. TArrayRef<const TCell> ref(cells);
  123. batch.Rows.emplace_back(TOwnedCellVec::Make(ref));
  124. cells.clear();
  125. }
  126. batch.Finished = true;
  127. }
  128. };
  129. THolder<NActors::IActor> CreateUsersScan(const NActors::TActorId& ownerId, ui32 scanId, const TTableId& tableId,
  130. const TTableRange& tableRange, const TArrayRef<NMiniKQL::TKqpComputeContextBase::TColumn>& columns)
  131. {
  132. return MakeHolder<TUsersScan>(ownerId, scanId, tableId, tableRange, columns);
  133. }
  134. }