]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Add new versions of log_badauth gssrpc callbacks
authorGreg Hudson <ghudson@mit.edu>
Mon, 25 Nov 2013 16:33:35 +0000 (11:33 -0500)
committerTom Yu <tlyu@mit.edu>
Tue, 26 Nov 2013 20:28:56 +0000 (15:28 -0500)
libgssrpc supports two callbacks for gss_accept_sec_context failures
on servers (one for AUTH_GSS and one for AUTH_GSSAPI), which are
IPv4-specific.  Provide an alternate version which supplies the
transport handle instead of the address, so that we can get the
address via the file descriptor for TCP connections.

(cherry picked from commit 4c57a429760a3b3aa89938a13708742675f9548b)

ticket: 7770

src/include/gssrpc/auth_gssapi.h
src/include/gssrpc/rename.h
src/lib/rpc/libgssrpc.exports
src/lib/rpc/svc_auth_gss.c
src/lib/rpc/svc_auth_gssapi.c

index d842930bb0590ac6b9451159b33e68708dd52a3c..9d94853228ef3ae88955f659f585027f7881b59d 100644 (file)
@@ -54,6 +54,14 @@ typedef void (*auth_gssapi_log_badauth_func)
                struct sockaddr_in *raddr,
                caddr_t data);
 
+/* auth_gssapi_log_badauth_func is IPv4-specific; this version gives the
+ * transport handle so the fd can be used to get the address. */
+typedef void (*auth_gssapi_log_badauth2_func)
+     (OM_uint32 major,
+               OM_uint32 minor,
+               SVCXPRT *xprt,
+               caddr_t data);
+
 typedef void (*auth_gssapi_log_badverf_func)
      (gss_name_t client,
                gss_name_t server,
@@ -117,6 +125,9 @@ void svcauth_gssapi_unset_names
 void svcauth_gssapi_set_log_badauth_func
 (auth_gssapi_log_badauth_func func,
           caddr_t data);
+void svcauth_gssapi_set_log_badauth2_func
+(auth_gssapi_log_badauth2_func func,
+          caddr_t data);
 void svcauth_gssapi_set_log_badverf_func
 (auth_gssapi_log_badverf_func func,
           caddr_t data);
@@ -126,6 +137,8 @@ void svcauth_gssapi_set_log_miscerr_func
 
 void svcauth_gss_set_log_badauth_func(auth_gssapi_log_badauth_func,
                                      caddr_t);
+void svcauth_gss_set_log_badauth2_func(auth_gssapi_log_badauth2_func,
+                                      caddr_t);
 void svcauth_gss_set_log_badverf_func(auth_gssapi_log_badverf_func,
                                      caddr_t);
 void svcauth_gss_set_log_miscerr_func(auth_gssapi_log_miscerr_func,
index 318be1a52dd4070f30600957ecd8474d92a6b07f..ecec66ab103df97eb7c30b44d0df9fcce172e3da 100644 (file)
 #define svcauth_gssapi_set_names       gssrpc_svcauth_gssapi_set_names
 #define svcauth_gssapi_unset_names     gssrpc_svcauth_gssapi_unset_names
 #define svcauth_gssapi_set_log_badauth_func    gssrpc_svcauth_gssapi_set_log_badauth_func
+#define svcauth_gssapi_set_log_badauth2_func   gssrpc_svcauth_gssapi_set_log_badauth2_func
 #define svcauth_gssapi_set_log_badverf_func    gssrpc_svcauth_gssapi_set_log_badverf_func
 #define svcauth_gssapi_set_log_miscerr_func    gssrpc_svcauth_gssapi_set_log_miscerr_func
 
 #define svcauth_gss_set_log_badauth_func       gssrpc_svcauth_gss_set_log_badauth_func
+#define svcauth_gss_set_log_badauth2_func      gssrpc_svcauth_gss_set_log_badauth2_func
 #define svcauth_gss_set_log_badverf_func       gssrpc_svcauth_gss_set_log_badverf_func
 #define svcauth_gss_set_log_miscerr_func       gssrpc_svcauth_gss_set_log_miscerr_func
 
index e6509d90c50cf3f4ba1f6f120e99dd22a2bd43c5..79e69612ddbbdbe2c1d69eb168efcf2fdb08674a 100644 (file)
@@ -60,10 +60,12 @@ gssrpc_svc_sendreply
 gssrpc_svc_unregister
 gssrpc_svcauth_gss_get_principal
 gssrpc_svcauth_gss_set_log_badauth_func
+gssrpc_svcauth_gss_set_log_badauth2_func
 gssrpc_svcauth_gss_set_log_badverf_func
 gssrpc_svcauth_gss_set_log_miscerr_func
 gssrpc_svcauth_gss_set_svc_name
 gssrpc_svcauth_gssapi_set_log_badauth_func
+gssrpc_svcauth_gssapi_set_log_badauth2_func
 gssrpc_svcauth_gssapi_set_log_badverf_func
 gssrpc_svcauth_gssapi_set_log_miscerr_func
 gssrpc_svcauth_gssapi_set_names
index 68498daa83e518d1101e4342f7778cd0ee37a7fd..8da70032a1e8d5fc9ac2212ea6bb211ca72adead 100644 (file)
@@ -80,6 +80,8 @@ typedef struct gss_union_ctx_id_t {
 
 static auth_gssapi_log_badauth_func log_badauth = NULL;
 static caddr_t log_badauth_data = NULL;
+static auth_gssapi_log_badauth2_func log_badauth2 = NULL;
+static caddr_t log_badauth2_data = NULL;
 static auth_gssapi_log_badverf_func log_badverf = NULL;
 static caddr_t log_badverf_data = NULL;
 static auth_gssapi_log_miscerr_func log_miscerr = NULL;
@@ -186,6 +188,16 @@ svcauth_gss_release_cred(void)
        return (TRUE);
 }
 
+/* Invoke log_badauth callbacks for an authentication failure. */
+static void
+badauth(OM_uint32 maj, OM_uint32 minor, SVCXPRT *xprt)
+{
+       if (log_badauth != NULL)
+               (*log_badauth)(maj, minor, &xprt->xp_raddr, log_badauth_data);
+       if (log_badauth2 != NULL)
+               (*log_badauth2)(maj, minor, xprt, log_badauth2_data);
+}
+
 static bool_t
 svcauth_gss_accept_sec_context(struct svc_req *rqst,
                               struct rpc_gss_init_res *gr)
@@ -226,12 +238,7 @@ svcauth_gss_accept_sec_context(struct svc_req *rqst,
        log_status("accept_sec_context", gr->gr_major, gr->gr_minor);
        if (gr->gr_major != GSS_S_COMPLETE &&
            gr->gr_major != GSS_S_CONTINUE_NEEDED) {
-               if (log_badauth != NULL) {
-                       (*log_badauth)(gr->gr_major,
-                                      gr->gr_minor,
-                                      &rqst->rq_xprt->xp_raddr,
-                                      log_badauth_data);
-               }
+               badauth(gr->gr_major, gr->gr_minor, rqst->rq_xprt);
                gd->ctx = GSS_C_NO_CONTEXT;
                goto errout;
        }
@@ -673,6 +680,14 @@ void svcauth_gss_set_log_badauth_func(
        log_badauth_data = data;
 }
 
+void
+svcauth_gss_set_log_badauth2_func(auth_gssapi_log_badauth2_func func,
+                                 caddr_t data)
+{
+       log_badauth2 = func;
+       log_badauth2_data = data;
+}
+
 /*
  * Function: svcauth_gss_set_log_badverf_func
  *
index 9688b8cd7c60c166d3ef5f01e3777d805c8504fa..e3af08fb6d85c538a067e2e687c14b905953f99d 100644 (file)
@@ -125,6 +125,8 @@ static int server_creds_count = 0;
 
 static auth_gssapi_log_badauth_func log_badauth = NULL;
 static caddr_t log_badauth_data = NULL;
+static auth_gssapi_log_badauth2_func log_badauth2 = NULL;
+static caddr_t log_badauth2_data = NULL;
 static auth_gssapi_log_badverf_func log_badverf = NULL;
 static caddr_t log_badverf_data = NULL;
 static auth_gssapi_log_miscerr_func log_miscerr = NULL;
@@ -141,6 +143,16 @@ typedef struct _client_list {
 static client_list *clients = NULL;
 
 
+/* Invoke log_badauth callbacks for an authentication failure. */
+static void
+badauth(OM_uint32 maj, OM_uint32 minor, SVCXPRT *xprt)
+{
+     if (log_badauth != NULL)
+         (*log_badauth)(maj, minor, &xprt->xp_raddr, log_badauth_data);
+     if (log_badauth2 != NULL)
+         (*log_badauth2)(maj, minor, xprt, log_badauth2_data);
+}
+
 enum auth_stat gssrpc__svcauth_gssapi(
      register struct svc_req *rqst,
      register struct rpc_msg *msg,
@@ -443,11 +455,7 @@ enum auth_stat gssrpc__svcauth_gssapi(
                                           call_res.gss_major,
                                           call_res.gss_minor));
 
-              if (log_badauth != NULL)
-                   (*log_badauth)(call_res.gss_major,
-                                  call_res.gss_minor,
-                                  &rqst->rq_xprt->xp_raddr,
-                                  log_badauth_data);
+              badauth(call_res.gss_major, call_res.gss_minor, rqst->rq_xprt);
 
               gss_release_buffer(&minor_stat, &output_token);
               svc_sendreply(rqst->rq_xprt, xdr_authgssapi_init_res,
@@ -1027,6 +1035,14 @@ void svcauth_gssapi_set_log_badauth_func(
      log_badauth_data = data;
 }
 
+void
+svcauth_gssapi_set_log_badauth2_func(auth_gssapi_log_badauth2_func func,
+                                    caddr_t data)
+{
+     log_badauth2 = func;
+     log_badauth2_data = data;
+}
+
 /*
  * Function: svcauth_gssapi_set_log_badverf_func
  *