#include <fcntl.h>
#include <string.h>
#include <stdio.h>
-#include <errno.h>
#include <sys/socket.h>
#include <sys/wait.h>
-#include <netdb.h>
#include <jansson.h>
#include <talloc.h>
#include <poll.h>
#include <tr_gss.h>
#include <tr_event.h>
-static TID_RESP *tids_create_response(TALLOC_CTX *mem_ctx, TIDS_INSTANCE *tids, TID_REQ *req)
+/**
+ * Create a response with minimal fields filled in
+ *
+ * @param mem_ctx talloc context for the return value
+ * @param req request to respond to
+ * @return new response structure allocated in the mem_ctx context
+ */
+static TID_RESP *tids_create_response(TALLOC_CTX *mem_ctx, TID_REQ *req)
{
TID_RESP *resp=NULL;
int success=0;
return resp;
}
-/* returns EACCES if authorization is denied */
-static int tids_auth_cb(gss_name_t clientName, gss_buffer_t displayName,
- void *data)
-{
- struct tids_instance *inst = (struct tids_instance *) data;
- TR_NAME name ={(char *) displayName->value, (int) displayName->length};
- int result=0;
-
- if (0!=inst->auth_handler(clientName, &name, inst->cookie)) {
- tr_debug("tids_auth_cb: client '%.*s' denied authorization.", name.len, name.buf);
- result=EACCES; /* denied */
- }
-
- return result;
-}
-
static int tids_handle_request(TIDS_INSTANCE *tids, TID_REQ *req, TID_RESP *resp)
{
int rc=-1;
(!(req->realm)) ||
(!(req->comm))) {
tr_notice("tids_handle_request(): Not a valid TID Request.");
- resp->result = TID_ERROR;
- resp->err_msg = tr_new_name("Bad request format");
+ tid_resp_set_result(resp, TID_ERROR);
+ tid_resp_set_err_msg(resp, tr_new_name("Bad request format"));
return -1;
}
if (0 > (rc = (*tids->req_handler)(tids, req, resp, tids->cookie))) {
/* set-up an error response */
tr_debug("tids_handle_request: req_handler returned error.");
- resp->result = TID_ERROR;
- if (!resp->err_msg) /* Use msg set by handler, if any */
- resp->err_msg = tr_new_name("Internal processing error");
- }
- else {
+ tid_resp_set_result(resp, TID_ERROR);
+ if (!tid_resp_get_err_msg(resp)) /* Use msg set by handler, if any */
+ tid_resp_set_err_msg(resp, tr_new_name("Internal processing error"));
+ } else {
/* set-up a success response */
tr_debug("tids_handle_request: req_handler returned success.");
- resp->result = TID_SUCCESS;
+ tid_resp_set_result(resp, TID_SUCCESS);
resp->err_msg = NULL; /* No error msg on successful return */
}
* Produces a JSON-encoded msg containing the TID response
*
* @param mem_ctx talloc context for the return value
- * @param tids TIDS_INSTANCE handling the request
- * @param req incoming request
* @param resp outgoing response
* @return JSON-encoded message containing the TID response
*/
-static char *tids_encode_response(TALLOC_CTX *mem_ctx, TIDS_INSTANCE *tids, TID_REQ *req, TID_RESP *resp)
+static char *tids_encode_response(TALLOC_CTX *mem_ctx, TID_RESP *resp)
{
TR_MSG mresp;
char *resp_buf = NULL;
if (req->resp_sent)
return 0;
- if (NULL == (resp = tids_create_response(req, tids, req))) {
+ if (NULL == (resp = tids_create_response(req, req))) {
tr_crit("tids_send_err_response: Can't create response.");
return -1;
}
*
* Part of the public interface
*
- * @param tids
+ * @param tids not actually used, but kept for ABI compatibility
* @param req
* @param resp
* @return
if (req->resp_sent)
return 0;
- resp_buf = tids_encode_response(NULL, tids, req, resp);
+ resp_buf = tids_encode_response(NULL, NULL);
if (resp_buf == NULL) {
tr_err("tids_send_response: Error encoding json response.");
tr_audit_req(req);
/* Allocate a response structure and populate common fields. The resp is in req's talloc context,
* which will be cleaned up when mreq is freed. */
- resp = tids_create_response(req, tids, req);
+ resp = tids_create_response(req, req);
if (resp == NULL) {
/* If we were unable to create a response, we cannot reply. Log an
* error if we can, then drop the request. */
}
/* Convert the completed response into an encoded response */
- resp_str = tids_encode_response(mem_ctx, tids, req, resp);
+ resp_str = tids_encode_response(mem_ctx, resp);
/* Finished; free the request and return */
tr_msg_free_decoded(mreq); // this frees req and resp, too
}
/* Get a listener for tids requests, returns its socket fd. Accept
* connections with tids_accept() */
-int tids_get_listener(TIDS_INSTANCE *tids,
- TIDS_REQ_FUNC *req_handler,
- tids_auth_func *auth_handler,
- const char *hostname,
- unsigned int port,
- void *cookie,
- int *fd_out,
- size_t max_fd)
+nfds_t tids_get_listener(TIDS_INSTANCE *tids,
+ TIDS_REQ_FUNC *req_handler,
+ tids_auth_func *auth_handler,
+ const char *hostname,
+ unsigned int port,
+ void *cookie,
+ int *fd_out,
+ size_t max_fd)
{
nfds_t n_fd = 0;
nfds_t ii = 0;
close(listen);
tr_gss_handle_connection(conn,
"trustidentity", tids->hostname, /* acceptor name */
- tids_auth_cb, tids, /* auth callback and cookie */
+ tids->auth_handler, tids->cookie, /* auth callback and cookie */
tids_req_cb, tids /* req callback and cookie */
);
close(conn);
struct pollfd poll_fd[TR_MAX_SOCKETS]={{0}};
int ii=0;
- n_fd=tids_get_listener(tids, req_handler, auth_handler, hostname, port, cookie, fd, TR_MAX_SOCKETS);
+ n_fd = tids_get_listener(tids, req_handler, auth_handler, hostname, port, cookie, fd, TR_MAX_SOCKETS);
if (n_fd <= 0) {
perror ("Error from tids_listen()");
return 1;