Repository: incubator-hawq Updated Branches: refs/heads/master b7ee35aaf -> b6a82951e
HAWQ-1226. HAWQ core dump due to enable ranger while RPS is down Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/b6a82951 Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/b6a82951 Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/b6a82951 Branch: refs/heads/master Commit: b6a82951eeb5218cb4d22659281812fd7b2b98da Parents: b7ee35a Author: interma <[email protected]> Authored: Wed Dec 21 12:02:14 2016 +0800 Committer: interma <[email protected]> Committed: Wed Dec 21 12:02:14 2016 +0800 ---------------------------------------------------------------------- src/backend/libpq/be-secure.c | 3 + src/backend/libpq/rangerrest.c | 860 +++++++++++++++++++----------------- src/include/utils/rangerrest.h | 6 +- src/test/regress/checkinc.py | 3 +- 4 files changed, 455 insertions(+), 417 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/b6a82951/src/backend/libpq/be-secure.c ---------------------------------------------------------------------- diff --git a/src/backend/libpq/be-secure.c b/src/backend/libpq/be-secure.c index 06fb8d1..c3e4b91 100644 --- a/src/backend/libpq/be-secure.c +++ b/src/backend/libpq/be-secure.c @@ -318,6 +318,8 @@ rloop: * This function holds an interrupt before reporting this error to avoid * a self deadlock situation, see MPP-13718 for more info. */ + +/* no used now, avoid compile warnning static void report_commerror(const char *err_msg) { @@ -329,6 +331,7 @@ report_commerror(const char *err_msg) RESUME_INTERRUPTS(); } +*/ /* * Write data to a secure connection. http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/b6a82951/src/backend/libpq/rangerrest.c ---------------------------------------------------------------------- diff --git a/src/backend/libpq/rangerrest.c b/src/backend/libpq/rangerrest.c index b5260a1..e50c3e1 100644 --- a/src/backend/libpq/rangerrest.c +++ b/src/backend/libpq/rangerrest.c @@ -24,60 +24,72 @@ * *------------------------------------------------------------------------- */ - #include "utils/rangerrest.h" - /* * A mapping from AclObjectKind to string */ char* AclObjectKindStr[] = { - "table", /* pg_class */ - "sequence", /* pg_sequence */ - "database", /* pg_database */ - "function", /* pg_proc */ - "operator", /* pg_operator */ - "type", /* pg_type */ - "language", /* pg_language */ - "namespace", /* pg_namespace */ - "oplass", /* pg_opclass */ - "conversion", /* pg_conversion */ - "tablespace", /* pg_tablespace */ - "filespace", /* pg_filespace */ - "filesystem", /* pg_filesystem */ - "fdw", /* pg_foreign_data_wrapper */ - "foreign_server", /* pg_foreign_server */ - "protocol", /* pg_extprotocol */ - "none" /* MUST BE LAST */ + "table", /* pg_class */ + "sequence", /* pg_sequence */ + "database", /* pg_database */ + "function", /* pg_proc */ + "operator", /* pg_operator */ + "type", /* pg_type */ + "language", /* pg_language */ + "namespace", /* pg_namespace */ + "oplass", /* pg_opclass */ + "conversion", /* pg_conversion */ + "tablespace", /* pg_tablespace */ + "filespace", /* pg_filespace */ + "filesystem", /* pg_filesystem */ + "fdw", /* pg_foreign_data_wrapper */ + "foreign_server", /* pg_foreign_server */ + "protocol", /* pg_extprotocol */ + "none" /* MUST BE LAST */ }; RangerACLResult parse_ranger_response(char* buffer) { - Assert(buffer != NULL); - if (strlen(buffer) == 0) - return RANGERCHECK_UNKNOWN; - - elog(LOG, "read from Ranger Restful API: %s", buffer); - - struct json_object *response = json_tokener_parse(buffer); - struct json_object *accessObj = json_object_object_get(response, "access"); - - int arraylen = json_object_array_length(accessObj); - elog(LOG, "Array Length: %dn",arraylen); - - json_object * jvalue; - json_object * jallow; - json_bool result; - // here should return which table's acl check failed in future. - for (int i=0; i< arraylen; i++){ - jvalue = json_object_array_get_idx(accessObj, i); - jallow = json_object_object_get(jvalue, "allowed"); - result = json_object_get_boolean(jallow); - if(result != 1){ - return RANGERCHECK_NO_PRIV; - } - } - return RANGERCHECK_OK; + Assert(buffer != NULL); + if (strlen(buffer) == 0) + return RANGERCHECK_UNKNOWN; + + elog(LOG, "read from Ranger Restful API: %s", buffer); + + struct json_object *response = json_tokener_parse(buffer); + if (response == NULL) + { + elog(WARNING, "json_tokener_parse failed"); + return RANGERCHECK_NO_PRIV; + } + + struct json_object *accessObj = NULL; + if (!json_object_object_get_ex(response, "access", &accessObj)) + { + elog(WARNING, "get json access field failed"); + return RANGERCHECK_NO_PRIV; + } + + int arraylen = json_object_array_length(accessObj); + elog(LOG, "Array Length: %d",arraylen); + + // here should return which table's acl check failed in future. + for (int i=0; i< arraylen; i++){ + struct json_object *jvalue = NULL; + struct json_object *jallow = NULL; + + jvalue = json_object_array_get_idx(accessObj, i); + if (!json_object_object_get_ex(jvalue, "allowed", &jallow)) + { + return RANGERCHECK_NO_PRIV; + } + json_bool result = json_object_get_boolean(jallow); + if(result != 1){ + return RANGERCHECK_NO_PRIV; + } + } + return RANGERCHECK_OK; } @@ -86,132 +98,132 @@ RangerACLResult parse_ranger_response(char* buffer) */ json_object *create_ranger_request_json_batch(List *args) { - json_object *juser = NULL; - json_object *jaccess = json_object_new_array(); - json_object *jrequest = json_object_new_object(); - char *user = NULL; - ListCell *arg; - - foreach(arg, args) - { - RangerRequestJsonArgs *arg_ptr = (RangerRequestJsonArgs *) lfirst(arg); - if (user == NULL) - { - user = arg_ptr->user; - juser = json_object_new_string(user); - } - AclObjectKind kind = arg_ptr->kind; - char* object = arg_ptr->object; - Assert(user != NULL && object != NULL && privilege != NULL && arg_ptr->isAll); - elog(LOG, "build json for ranger request, user:%s, kind:%s, object:%s", - user, AclObjectKindStr[kind], object); - - json_object *jresource = json_object_new_object(); - json_object *jelement = json_object_new_object(); - json_object *jactions = json_object_new_array(); - - switch(kind) - { - case ACL_KIND_CLASS: - case ACL_KIND_SEQUENCE: - case ACL_KIND_PROC: - case ACL_KIND_NAMESPACE: - case ACL_KIND_LANGUAGE: - { - char *ptr = NULL; char *name = NULL; - char *first = NULL; // could be a database or protocol or tablespace - char *second = NULL; // could be a schema or language - char *third = NULL; // could be a table or sequence or function - int idx = 0; - for (name = strtok_r(object, ".", &ptr); - name; - name = strtok_r(NULL, ".", &ptr), idx++) - { - if (idx == 0) - { - first = pstrdup(name); - } - else if (idx == 1) - { - second = pstrdup(name); - } - else - { - third = pstrdup(name); - } - } - - if (first != NULL) - { - json_object *jfirst = json_object_new_string(first); - json_object_object_add(jresource, "database", jfirst); - } - if (second != NULL) - { - json_object *jsecond = json_object_new_string(second); - json_object_object_add(jresource, - (kind == ACL_KIND_LANGUAGE) ? "language" : "schema", jsecond); - } - if (third != NULL) - { - json_object *jthird = json_object_new_string(third); - json_object_object_add(jresource, - (kind == ACL_KIND_CLASS) ? "table" : - (kind == ACL_KIND_SEQUENCE) ? "sequence" : "function", jthird); - } - - if (first != NULL) - pfree(first); - if (second != NULL) - pfree(second); - if (third != NULL) - pfree(third); - break; - } - case ACL_KIND_OPER: - case ACL_KIND_CONVERSION: - case ACL_KIND_DATABASE: - case ACL_KIND_TABLESPACE: - case ACL_KIND_TYPE: - case ACL_KIND_FILESYSTEM: - case ACL_KIND_FDW: - case ACL_KIND_FOREIGN_SERVER: - case ACL_KIND_EXTPROTOCOL: - { - json_object *jobject = json_object_new_string(object); - json_object_object_add(jresource, AclObjectKindStr[kind], jobject); - break; - } - default: - elog(ERROR, "unrecognized objkind: %d", (int) kind); - } // switch - - json_object_object_add(jelement, "resource", jresource); - - //ListCell *cell; - //foreach(cell, arg_ptr->actions) - //{ - char tmp[7] = "select"; - json_object* jaction = json_object_new_string((char *)tmp); - //json_object* jaction = json_object_new_string((char *)cell->data.ptr_value); - json_object_array_add(jactions, jaction); - //} - json_object_object_add(jelement, "privileges", jactions); - json_object_array_add(jaccess, jelement); - - } // foreach - - json_object_object_add(jrequest, "user", juser); - json_object_object_add(jrequest, "access", jaccess); - - json_object *jreqid = json_object_new_string("1"); - json_object_object_add(jrequest, "requestId", jreqid); - json_object *jclientip = json_object_new_string("123.0.0.21"); - json_object_object_add(jrequest, "clientIp", jclientip); - json_object *jcontext = json_object_new_string("SELECT * FROM DDDDDDD"); - json_object_object_add(jrequest, "context", jcontext); - - return jrequest; + json_object *juser = NULL; + json_object *jaccess = json_object_new_array(); + json_object *jrequest = json_object_new_object(); + char *user = NULL; + ListCell *arg; + + foreach(arg, args) + { + RangerRequestJsonArgs *arg_ptr = (RangerRequestJsonArgs *) lfirst(arg); + if (user == NULL) + { + user = arg_ptr->user; + juser = json_object_new_string(user); + } + AclObjectKind kind = arg_ptr->kind; + char* object = arg_ptr->object; + Assert(user != NULL && object != NULL && privilege != NULL && arg_ptr->isAll); + elog(LOG, "build json for ranger request, user:%s, kind:%s, object:%s", + user, AclObjectKindStr[kind], object); + + json_object *jresource = json_object_new_object(); + json_object *jelement = json_object_new_object(); + json_object *jactions = json_object_new_array(); + + switch(kind) + { + case ACL_KIND_CLASS: + case ACL_KIND_SEQUENCE: + case ACL_KIND_PROC: + case ACL_KIND_NAMESPACE: + case ACL_KIND_LANGUAGE: + { + char *ptr = NULL; char *name = NULL; + char *first = NULL; // could be a database or protocol or tablespace + char *second = NULL; // could be a schema or language + char *third = NULL; // could be a table or sequence or function + int idx = 0; + for (name = strtok_r(object, ".", &ptr); + name; + name = strtok_r(NULL, ".", &ptr), idx++) + { + if (idx == 0) + { + first = pstrdup(name); + } + else if (idx == 1) + { + second = pstrdup(name); + } + else + { + third = pstrdup(name); + } + } + + if (first != NULL) + { + json_object *jfirst = json_object_new_string(first); + json_object_object_add(jresource, "database", jfirst); + } + if (second != NULL) + { + json_object *jsecond = json_object_new_string(second); + json_object_object_add(jresource, + (kind == ACL_KIND_LANGUAGE) ? "language" : "schema", jsecond); + } + if (third != NULL) + { + json_object *jthird = json_object_new_string(third); + json_object_object_add(jresource, + (kind == ACL_KIND_CLASS) ? "table" : + (kind == ACL_KIND_SEQUENCE) ? "sequence" : "function", jthird); + } + + if (first != NULL) + pfree(first); + if (second != NULL) + pfree(second); + if (third != NULL) + pfree(third); + break; + } + case ACL_KIND_OPER: + case ACL_KIND_CONVERSION: + case ACL_KIND_DATABASE: + case ACL_KIND_TABLESPACE: + case ACL_KIND_TYPE: + case ACL_KIND_FILESYSTEM: + case ACL_KIND_FDW: + case ACL_KIND_FOREIGN_SERVER: + case ACL_KIND_EXTPROTOCOL: + { + json_object *jobject = json_object_new_string(object); + json_object_object_add(jresource, AclObjectKindStr[kind], jobject); + break; + } + default: + elog(ERROR, "unrecognized objkind: %d", (int) kind); + } // switch + + json_object_object_add(jelement, "resource", jresource); + + //ListCell *cell; + //foreach(cell, arg_ptr->actions) + //{ + char tmp[7] = "select"; + json_object* jaction = json_object_new_string((char *)tmp); + //json_object* jaction = json_object_new_string((char *)cell->data.ptr_value); + json_object_array_add(jactions, jaction); + //} + json_object_object_add(jelement, "privileges", jactions); + json_object_array_add(jaccess, jelement); + + } // foreach + + json_object_object_add(jrequest, "user", juser); + json_object_object_add(jrequest, "access", jaccess); + + json_object *jreqid = json_object_new_string("1"); + json_object_object_add(jrequest, "requestId", jreqid); + json_object *jclientip = json_object_new_string("123.0.0.21"); + json_object_object_add(jrequest, "clientIp", jclientip); + json_object *jcontext = json_object_new_string("SELECT * FROM DDDDDDD"); + json_object_object_add(jrequest, "context", jcontext); + + return jrequest; } /** @@ -245,214 +257,231 @@ json_object *create_ranger_request_json_batch(List *args) * } */ json_object* create_ranger_request_json(char* user, AclObjectKind kind, char* object, - List* actions, bool isAll) + List* actions, bool isAll) { - Assert(user != NULL && object != NULL && privilege != NULL - && isAll); - ListCell *cell; - - elog(LOG, "build json for ranger request, user:%s, kind:%s, object:%s", - user, AclObjectKindStr[kind], object); - json_object *jrequest = json_object_new_object(); - json_object *juser = json_object_new_string(user); - - json_object *jaccess = json_object_new_array(); - json_object *jelement = json_object_new_object(); - - json_object *jresource = json_object_new_object(); - switch(kind) - { - case ACL_KIND_CLASS: - case ACL_KIND_SEQUENCE: - case ACL_KIND_PROC: - case ACL_KIND_NAMESPACE: - case ACL_KIND_LANGUAGE: - { - char *ptr = NULL; char *name = NULL; - char *first = NULL; // could be a database or protocol or tablespace - char *second = NULL; // could be a schema or language - char *third = NULL; // could be a table or sequence or function - int idx = 0; - for (name = strtok_r(object, ".", &ptr); - name; - name = strtok_r(NULL, ".", &ptr), idx++) - { - if (idx == 0) - { - first = pstrdup(name); - } - else if (idx == 1) - { - second = pstrdup(name); - } - else - { - third = pstrdup(name); - } - } - - if (first != NULL) - { - json_object *jfirst = json_object_new_string(first); - json_object_object_add(jresource, "database", jfirst); - } - if (second != NULL) - { - json_object *jsecond = json_object_new_string(second); - json_object_object_add(jresource, - (kind == ACL_KIND_LANGUAGE) ? "language" : "schema", jsecond); - } - if (third != NULL) - { - json_object *jthird = json_object_new_string(third); - json_object_object_add(jresource, - (kind == ACL_KIND_CLASS) ? "table" : - (kind == ACL_KIND_SEQUENCE) ? "sequence" : "function", jthird); - } - - if (first != NULL) - pfree(first); - if (second != NULL) - pfree(second); - if (third != NULL) - pfree(third); - break; - } - case ACL_KIND_OPER: - case ACL_KIND_CONVERSION: - case ACL_KIND_DATABASE: - case ACL_KIND_TABLESPACE: - case ACL_KIND_TYPE: - case ACL_KIND_FILESYSTEM: - case ACL_KIND_FDW: - case ACL_KIND_FOREIGN_SERVER: - case ACL_KIND_EXTPROTOCOL: - { - json_object *jobject = json_object_new_string(object); - json_object_object_add(jresource, AclObjectKindStr[kind], jobject); - break; - } - default: - elog(ERROR, "unrecognized objkind: %d", (int) kind); - } - - json_object *jactions = json_object_new_array(); - foreach(cell, actions) - { - json_object* jaction = json_object_new_string((char *)cell->data.ptr_value); - json_object_array_add(jactions, jaction); - } - json_object_object_add(jelement, "resource", jresource); - json_object_object_add(jelement, "privileges", jactions); - json_object_array_add(jaccess, jelement); - - json_object_object_add(jrequest, "user", juser); - json_object_object_add(jrequest, "access", jaccess); - json_object *jreqid = json_object_new_string("1"); - json_object_object_add(jrequest, "requestId", jreqid); - json_object *jclientip = json_object_new_string("123.0.0.21"); - json_object_object_add(jrequest, "clientIp", jclientip); - json_object *jcontext = json_object_new_string("SELECT * FROM DDDDDDD"); - json_object_object_add(jrequest, "context", jcontext); - - - return jrequest; + Assert(user != NULL && object != NULL && privilege != NULL + && isAll); + ListCell *cell; + + elog(LOG, "build json for ranger request, user:%s, kind:%s, object:%s", + user, AclObjectKindStr[kind], object); + json_object *jrequest = json_object_new_object(); + json_object *juser = json_object_new_string(user); + + json_object *jaccess = json_object_new_array(); + json_object *jelement = json_object_new_object(); + + json_object *jresource = json_object_new_object(); + switch(kind) + { + case ACL_KIND_CLASS: + case ACL_KIND_SEQUENCE: + case ACL_KIND_PROC: + case ACL_KIND_NAMESPACE: + case ACL_KIND_LANGUAGE: + { + char *ptr = NULL; char *name = NULL; + char *first = NULL; // could be a database or protocol or tablespace + char *second = NULL; // could be a schema or language + char *third = NULL; // could be a table or sequence or function + int idx = 0; + for (name = strtok_r(object, ".", &ptr); + name; + name = strtok_r(NULL, ".", &ptr), idx++) + { + if (idx == 0) + { + first = pstrdup(name); + } + else if (idx == 1) + { + second = pstrdup(name); + } + else + { + third = pstrdup(name); + } + } + + if (first != NULL) + { + json_object *jfirst = json_object_new_string(first); + json_object_object_add(jresource, "database", jfirst); + } + if (second != NULL) + { + json_object *jsecond = json_object_new_string(second); + json_object_object_add(jresource, + (kind == ACL_KIND_LANGUAGE) ? "language" : "schema", jsecond); + } + if (third != NULL) + { + json_object *jthird = json_object_new_string(third); + json_object_object_add(jresource, + (kind == ACL_KIND_CLASS) ? "table" : + (kind == ACL_KIND_SEQUENCE) ? "sequence" : "function", jthird); + } + + if (first != NULL) + pfree(first); + if (second != NULL) + pfree(second); + if (third != NULL) + pfree(third); + break; + } + case ACL_KIND_OPER: + case ACL_KIND_CONVERSION: + case ACL_KIND_DATABASE: + case ACL_KIND_TABLESPACE: + case ACL_KIND_TYPE: + case ACL_KIND_FILESYSTEM: + case ACL_KIND_FDW: + case ACL_KIND_FOREIGN_SERVER: + case ACL_KIND_EXTPROTOCOL: + { + json_object *jobject = json_object_new_string(object); + json_object_object_add(jresource, AclObjectKindStr[kind], jobject); + break; + } + default: + elog(ERROR, "unrecognized objkind: %d", (int) kind); + } + + json_object *jactions = json_object_new_array(); + foreach(cell, actions) + { + json_object* jaction = json_object_new_string((char *)cell->data.ptr_value); + json_object_array_add(jactions, jaction); + } + json_object_object_add(jelement, "resource", jresource); + json_object_object_add(jelement, "privileges", jactions); + json_object_array_add(jaccess, jelement); + + json_object_object_add(jrequest, "user", juser); + json_object_object_add(jrequest, "access", jaccess); + json_object *jreqid = json_object_new_string("1"); + json_object_object_add(jrequest, "requestId", jreqid); + json_object *jclientip = json_object_new_string("123.0.0.21"); + json_object_object_add(jrequest, "clientIp", jclientip); + json_object *jcontext = json_object_new_string("SELECT * FROM DDDDDDD"); + json_object_object_add(jrequest, "context", jcontext); + + + return jrequest; } static size_t write_callback(char *contents, size_t size, size_t nitems, - void *userp) + void *userp) { - size_t realsize = size * nitems; - CURL_HANDLE curl = (curl_context_t *) userp; - - curl->response.buffer = palloc0(realsize + 1); - memset(curl->response.buffer, 0, realsize + 1); - if (curl->response.buffer == NULL) - { - /* out of memory! */ - elog(WARNING, "not enough memory for Ranger response"); - return 0; - } - - memcpy(curl->response.buffer, contents, realsize); - curl->response.size = realsize + 1; - elog(LOG, "read from Ranger Restful API: %s", curl->response.buffer); - - return realsize; + size_t realsize = size * nitems; + CURL_HANDLE curl = (CURL_HANDLE) userp; + Assert(curl != NULL); + + if (curl->response.buffer == NULL) + { + curl->response.buffer = palloc0(realsize + 1); + } + else + { + /*Note:*/ + /*our repalloc is not same as realloc, repalloc's first param(buffer) can not be NULL*/ + curl->response.buffer = repalloc(curl->response.buffer, curl->response.size + realsize + 1); + } + + if (curl->response.buffer == NULL) + { + /* out of memory! */ + elog(WARNING, "not enough memory for Ranger response"); + return 0; + } + + memcpy(curl->response.buffer + curl->response.size, contents, realsize); + curl->response.size += realsize; + curl->response.buffer[curl->response.size] = '\0'; + elog(LOG, "read from Ranger Restful API: %s", curl->response.buffer); + + return realsize; } -void call_ranger_rest(CURL_HANDLE curl_handle, const char* request) +/** + * @returns: 0 curl success; -1 curl failed + */ +int call_ranger_rest(CURL_HANDLE curl_handle, const char* request) { - CURLcode res; - Assert(request != NULL); - - curl_global_init(CURL_GLOBAL_ALL); - - /* init the curl session */ - curl_handle->curl_handle = curl_easy_init(); - if (curl_handle->curl_handle == NULL) - { - goto _exit; - } - - /* timeout */ - // curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, 1); - - /* specify URL to get */ - //curl_easy_setopt(curl_handle->curl_handle, CURLOPT_URL, "http://localhost:8089/checkprivilege"); - StringInfoData tname; - initStringInfo(&tname); - appendStringInfo(&tname, "http://"); - appendStringInfo(&tname, rps_addr_host); - appendStringInfo(&tname, ":"); - appendStringInfo(&tname, "%d", rps_addr_port); - appendStringInfo(&tname, "/rps"); - curl_easy_setopt(curl_handle->curl_handle, CURLOPT_URL, tname.data); - - /* specify format */ - // struct curl_slist *plist = curl_slist_append(NULL, "Content-Type:application/json;charset=UTF-8"); - // curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, plist); - - - //curl_easy_setopt(curl_handle->curl_handle, CURLOPT_POSTFIELDSIZE_LARGE, 1000); - //curl_easy_setopt(curl_handle->curl_handle, CURLOPT_HTTPGET, 0); - //curl_easy_setopt(curl_handle->curl_handle, CURLOPT_CUSTOMREQUEST, "POST"); - - struct curl_slist *headers = NULL; - //curl_slist_append(headers, "Accept: application/json"); - headers = curl_slist_append(headers, "Content-Type:application/json"); - curl_easy_setopt(curl_handle->curl_handle, CURLOPT_HTTPHEADER, headers); - - //curl_easy_setopt(curl_handle->curl_handle, CURLOPT_POST, 1L); - curl_easy_setopt(curl_handle->curl_handle, CURLOPT_POSTFIELDS,request); - //"{\"requestId\": 1,\"user\": \"hubert\",\"clientIp\":\"123.0.0.21\",\"context\": \"SELECT * FROM sales\",\"access\":[{\"resource\":{\"database\":\"a-database\",\"schema\":\"a-schema\",\"table\":\"sales\"},\"privileges\": [\"select\"]}]}"); - /* send all data to this function */ - curl_easy_setopt(curl_handle->curl_handle, CURLOPT_WRITEFUNCTION, write_callback); - curl_easy_setopt(curl_handle->curl_handle, CURLOPT_WRITEDATA, (void *)curl_handle); - - res = curl_easy_perform(curl_handle->curl_handle); - - /* check for errors */ - if(res != CURLE_OK) - { - elog(WARNING, "curl_easy_perform() failed: %s\n", - curl_easy_strerror(res)); - } - else - { - elog(LOG, "%d bytes retrieved from Ranger Restful API.", - curl_handle->response.size); - } + int ret = -1; + CURLcode res; + Assert(request != NULL); + + curl_global_init(CURL_GLOBAL_ALL); + + /* init the curl session */ + curl_handle->curl_handle = curl_easy_init(); + if (curl_handle->curl_handle == NULL) + { + goto _exit; + } + + /* timeout: hard-coded temporarily and maybe should be a guc in future */ + curl_easy_setopt(curl_handle->curl_handle, CURLOPT_TIMEOUT, 30L); + + /* specify URL to get */ + //curl_easy_setopt(curl_handle->curl_handle, CURLOPT_URL, "http://localhost:8089/checkprivilege"); + StringInfoData tname; + initStringInfo(&tname); + appendStringInfo(&tname, "http://"); + appendStringInfo(&tname, "%s", rps_addr_host); + appendStringInfo(&tname, ":"); + appendStringInfo(&tname, "%d", rps_addr_port); + appendStringInfo(&tname, "/rps"); + curl_easy_setopt(curl_handle->curl_handle, CURLOPT_URL, tname.data); + + /* specify format */ + // struct curl_slist *plist = curl_slist_append(NULL, "Content-Type:application/json;charset=UTF-8"); + // curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, plist); + + + //curl_easy_setopt(curl_handle->curl_handle, CURLOPT_POSTFIELDSIZE_LARGE, 1000); + //curl_easy_setopt(curl_handle->curl_handle, CURLOPT_HTTPGET, 0); + //curl_easy_setopt(curl_handle->curl_handle, CURLOPT_CUSTOMREQUEST, "POST"); + + struct curl_slist *headers = NULL; + //curl_slist_append(headers, "Accept: application/json"); + headers = curl_slist_append(headers, "Content-Type:application/json"); + curl_easy_setopt(curl_handle->curl_handle, CURLOPT_HTTPHEADER, headers); + + //curl_easy_setopt(curl_handle->curl_handle, CURLOPT_POST, 1L); + curl_easy_setopt(curl_handle->curl_handle, CURLOPT_POSTFIELDS,request); + //"{\"requestId\": 1,\"user\": \"hubert\",\"clientIp\":\"123.0.0.21\",\"context\": \"SELECT * FROM sales\",\"access\":[{\"resource\":{\"database\":\"a-database\",\"schema\":\"a-schema\",\"table\":\"sales\"},\"privileges\": [\"select\"]}]}"); + /* send all data to this function */ + curl_easy_setopt(curl_handle->curl_handle, CURLOPT_WRITEFUNCTION, write_callback); + curl_easy_setopt(curl_handle->curl_handle, CURLOPT_WRITEDATA, (void *)curl_handle); + + res = curl_easy_perform(curl_handle->curl_handle); + + /* check for errors */ + if(res != CURLE_OK) + { + elog(WARNING, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + } + else + { + ret = 0; + elog(LOG, "%d bytes retrieved from Ranger Restful API.", + curl_handle->response.size); + } _exit: - /* cleanup curl stuff */ - if (curl_handle->curl_handle) - { - curl_easy_cleanup(curl_handle->curl_handle); - } - - /* we're done with libcurl, so clean it up */ - curl_global_cleanup(); + /* cleanup curl stuff */ + if (curl_handle->curl_handle) + { + curl_easy_cleanup(curl_handle->curl_handle); + } + + /* we're done with libcurl, so clean it up */ + curl_global_cleanup(); + return ret; } /* @@ -460,64 +489,69 @@ _exit: */ int check_privilege_from_ranger_batch(List *arg_list) { - json_object* jrequest = create_ranger_request_json_batch(arg_list); - Assert(jrequest != NULL); - const char *request = json_object_to_json_string(jrequest); - elog(LOG, "Send JSON request to Ranger: %s", request); - Assert(request != NULL); - struct curl_context_t curl_context; - memset(&curl_context, 0, sizeof(struct curl_context_t)); - - /* call GET method to send request*/ - call_ranger_rest(&curl_context, request); - - /* free the JSON object */ - json_object_put(jrequest); - - /* parse the JSON-format result */ - RangerACLResult ret = parse_ranger_response(curl_context.response.buffer); - - /* free response buffer */ - if (curl_context.response.buffer != NULL) - { - pfree(curl_context.response.buffer); - } - - return ret; + json_object* jrequest = create_ranger_request_json_batch(arg_list); + Assert(jrequest != NULL); + const char *request = json_object_to_json_string(jrequest); + elog(LOG, "Send JSON request to Ranger: %s", request); + Assert(request != NULL); + struct curl_context_t curl_context; + memset(&curl_context, 0, sizeof(struct curl_context_t)); + + /* call GET method to send request*/ + if (call_ranger_rest(&curl_context, request) < 0) + { + return RANGERCHECK_NO_PRIV; + } + + /* free the JSON object */ + json_object_put(jrequest); + + /* parse the JSON-format result */ + RangerACLResult ret = parse_ranger_response(curl_context.response.buffer); + /* free response buffer */ + if (curl_context.response.buffer != NULL) + { + pfree(curl_context.response.buffer); + } + + return ret; } /* * Check the privilege from Ranger for one role */ int check_privilege_from_ranger(char* user, AclObjectKind kind, char* object, - List* actions, bool isAll) + List* actions, bool isAll) { - json_object* jrequest = create_ranger_request_json(user, kind, object, - actions, isAll); + json_object* jrequest = create_ranger_request_json(user, kind, object, + actions, isAll); - Assert(jrequest != NULL); - const char* request = json_object_to_json_string(jrequest); - elog(LOG, "send JSON request to Ranger: %s", request); - Assert(request != NULL); + Assert(jrequest != NULL); + const char* request = json_object_to_json_string(jrequest); + elog(LOG, "send JSON request to Ranger: %s", request); + Assert(request != NULL); - struct curl_context_t curl_context; - memset(&curl_context, 0, sizeof(struct curl_context_t)); + struct curl_context_t curl_context; + memset(&curl_context, 0, sizeof(struct curl_context_t)); - /* call GET method to send request*/ - call_ranger_rest(&curl_context, request); + /* call GET method to send request*/ + if (call_ranger_rest(&curl_context, request) < 0) + { + return RANGERCHECK_NO_PRIV; + } - /* free the JSON object */ - json_object_put(jrequest); + /* free the JSON object */ + json_object_put(jrequest); - /* parse the JSON-format result */ - RangerACLResult ret = parse_ranger_response(curl_context.response.buffer); + /* parse the JSON-format result */ + RangerACLResult ret = parse_ranger_response(curl_context.response.buffer); - /* free response buffer */ - if (curl_context.response.buffer != NULL) - { - pfree(curl_context.response.buffer); - } + /* free response buffer */ + if (curl_context.response.buffer != NULL) + { + pfree(curl_context.response.buffer); + } - return ret; + return ret; } http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/b6a82951/src/include/utils/rangerrest.h ---------------------------------------------------------------------- diff --git a/src/include/utils/rangerrest.h b/src/include/utils/rangerrest.h index 4fc1a73..541bdbc 100644 --- a/src/include/utils/rangerrest.h +++ b/src/include/utils/rangerrest.h @@ -27,9 +27,9 @@ #ifndef RANGERREST_H #define RANGERREST_H -#include "postgres.h" -#include <curl/curl.h> #include <json-c/json.h> +#include <curl/curl.h> +#include "postgres.h" #include "utils/acl.h" #include "utils/guc.h" @@ -88,7 +88,7 @@ typedef struct RangerRequestJsonArgs { RangerACLResult parse_ranger_response(char *); json_object *create_ranger_request_json_batch(List *); json_object *create_ranger_request_json(char *, AclObjectKind kind, char *, List *, bool); -void call_ranger_rest(CURL_HANDLE curl_handle, const char *request); +int call_ranger_rest(CURL_HANDLE curl_handle, const char *request); extern int check_privilege_from_ranger_batch(List *); extern int check_privilege_from_ranger(char *, AclObjectKind kind, char *, List *, bool); http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/b6a82951/src/test/regress/checkinc.py ---------------------------------------------------------------------- diff --git a/src/test/regress/checkinc.py b/src/test/regress/checkinc.py index 6f4e006..bcdb513 100755 --- a/src/test/regress/checkinc.py +++ b/src/test/regress/checkinc.py @@ -78,9 +78,10 @@ fileset = { 'winsock.h': [], 'winsock2.h': [], 'ws2tcpip.h': [], - 'hdfs/hdfs.h': [], + 'hdfs/hdfs.h': [], 'quicklz1.h': [], 'quicklz3.h': [], + 'json-c/json.h': [], }
