From b584e34f2f626c72b1a632bfc82da1247ff438d8 Mon Sep 17 00:00:00 2001 From: James Date: Wed, 3 May 2017 12:03:29 -0400 Subject: [PATCH] HDFS-11730: libhdfs++: RpcConnection should handle authorization error call id. Contributed by James Clampffer --- .../main/native/libhdfspp/include/hdfspp/status.h | 2 ++ .../src/main/native/libhdfspp/lib/common/status.cc | 13 +++++++++++++ .../native/libhdfspp/lib/rpc/rpc_connection_impl.cc | 4 +++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/include/hdfspp/status.h b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/include/hdfspp/status.h index d2c32b2de1..6fc00b13eb 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/include/hdfspp/status.h +++ b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/include/hdfspp/status.h @@ -44,6 +44,8 @@ class Status { static Status Error(const char *error_message); static Status AuthenticationFailed(); static Status AuthenticationFailed(const char *msg); + static Status AuthorizationFailed(); + static Status AuthorizationFailed(const char *msg); static Status Canceled(); static Status PathNotFound(const char *msg); static Status InvalidOffset(const char *msg); diff --git a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/common/status.cc b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/common/status.cc index 590a036a53..590355381e 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/common/status.cc +++ b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/common/status.cc @@ -143,6 +143,19 @@ Status Status::AuthenticationFailed(const char *msg) { return Status(kAuthenticationFailed, formatted.c_str()); } +Status Status::AuthorizationFailed() { + return Status::AuthorizationFailed(nullptr); +} + +Status Status::AuthorizationFailed(const char *msg) { + std::string formatted = "AuthorizationFailed"; + if(msg) { + formatted += ": "; + formatted += msg; + } + return Status(kPermissionDenied, formatted.c_str()); +} + Status Status::Canceled() { return Status(kOperationCanceled, "Operation canceled"); } diff --git a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/rpc/rpc_connection_impl.cc b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/rpc/rpc_connection_impl.cc index 7accaf88e4..1012a37c0e 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/rpc/rpc_connection_impl.cc +++ b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/rpc/rpc_connection_impl.cc @@ -175,9 +175,11 @@ Status RpcConnection::HandleRpcResponse(std::shared_ptr response) { auto req = RemoveFromRunningQueue(h.callid()); if (!req) { - LOG_WARN(kRPC, << "RPC response with Unknown call id " << h.callid()); + LOG_WARN(kRPC, << "RPC response with Unknown call id " << (int32_t)h.callid()); if((int32_t)h.callid() == RpcEngine::kCallIdSasl) { return Status::AuthenticationFailed("You have an unsecured client connecting to a secured server"); + } else if((int32_t)h.callid() == RpcEngine::kCallIdAuthorizationFailed) { + return Status::AuthorizationFailed("RPC call id indicates an authorization failure"); } else { return Status::Error("Rpc response with unknown call id"); }