Path: blob/main/crypto/krb5/src/lib/rpc/unit-test/server.c
39565 views
/*1* Copyright 1993 OpenVision Technologies, Inc., All Rights Reserved.2*3* $Id$4* $Source$5*/67#include "k5-platform.h"89#include <stdio.h>10#include <stdlib.h>11#include "autoconf.h"12#ifdef HAVE_UNISTD_H13#include <unistd.h>14#endif15#include <string.h>16#include <signal.h>17#include <gssrpc/rpc.h>18#include <gssrpc/pmap_clnt.h>19#include <arpa/inet.h> /* inet_ntoa */20#include <gssapi/gssapi.h>21#include <gssapi/gssapi_generic.h>22#include <gssrpc/auth_gssapi.h>23#include <sys/param.h> /* MAXHOSTNAMELEN */24#include "rpc_test.h"2526extern int svc_debug_gssapi, misc_debug_gssapi;2728void rpc_test_badauth(OM_uint32 major, OM_uint32 minor,29struct sockaddr_in *addr, caddr_t data);30void log_miscerr(struct svc_req *rqst, struct rpc_msg *msg, char31*error, char *data);32void log_badauth_display_status(OM_uint32 major, OM_uint32 minor);33void log_badauth_display_status_1(OM_uint32 code, int type, int rec);34static void rpc_test_badverf(gss_name_t client, gss_name_t server,35struct svc_req *rqst, struct rpc_msg *msg,36caddr_t data);3738#ifndef SERVICE_NAME39#define SERVICE_NAME "host"40#endif4142static void usage(void)43{44fprintf(stderr, "Usage: server {-t|-u} [svc-debug] [misc-debug]\n");45exit(1);46}4748#ifdef POSIX_SIGNALS49static void handlesig(int dummy)50#else51static void handlesig(void)52#endif53{54exit(0);55}5657int58main(int argc, char **argv)59{60int c, prot;61auth_gssapi_name names[2];62SVCXPRT *transp;63extern int optind;64#ifdef POSIX_SIGNALS65struct sigaction sa;66#endif6768names[0].name = SERVICE_NAME;69names[0].type = (gss_OID) gss_nt_service_name;70names[1].name = 0;71names[1].type = 0;7273prot = 0;74while ((c = getopt(argc, argv, "tu")) != -1) {75switch (c) {76case 't':77prot = IPPROTO_TCP;78break;79case 'u':80prot = IPPROTO_UDP;81break;82case '?':83usage();84break;85}86}87if (prot == 0)88usage();8990argv += optind;91argc -= optind;9293switch (argc) {94case 2:95misc_debug_gssapi = atoi(argv[1]);96case 1:97svc_debug_gssapi = atoi(argv[0]);98case 0:99break;100default:101usage();102exit(1);103}104105(void) pmap_unset(RPC_TEST_PROG, RPC_TEST_VERS_1);106107if (prot == IPPROTO_TCP)108transp = svctcp_create(RPC_ANYSOCK, 0, 0);109else110transp = svcudp_create(RPC_ANYSOCK);111if (transp == NULL) {112fprintf(stderr, "cannot create tcp service.");113exit(1);114}115if (!svc_register(transp, RPC_TEST_PROG, RPC_TEST_VERS_1,116rpc_test_prog_1_svc, 0)) {117fprintf(stderr,118"unable to register (RPC_TEST_PROG, RPC_TEST_VERS_1, %s).",119prot == IPPROTO_TCP ? "tcp" : "udp");120exit(1);121}122123if (svcauth_gssapi_set_names(names, 0) == FALSE) {124fprintf(stderr, "unable to set gssapi names\n");125exit(1);126}127128svcauth_gssapi_set_log_badauth_func(rpc_test_badauth, NULL);129svcauth_gssapi_set_log_badverf_func(rpc_test_badverf, NULL);130svcauth_gssapi_set_log_miscerr_func(log_miscerr, NULL);131132#ifdef POSIX_SIGNALS133(void) sigemptyset(&sa.sa_mask);134sa.sa_flags = 0;135sa.sa_handler = handlesig;136(void) sigaction(SIGHUP, &sa, NULL);137(void) sigaction(SIGINT, &sa, NULL);138(void) sigaction(SIGTERM, &sa, NULL);139#else140signal(SIGHUP, handlesig);141signal(SIGINT, handlesig);142signal(SIGTERM, handlesig);143#endif144printf("running\n");145printf("port: %d\n", (int)transp->xp_port);146fflush(stdout);147148svc_run();149fprintf(stderr, "svc_run returned");150exit(1);151/* NOTREACHED */152}153154char **rpc_test_echo_1_svc(char **arg, struct svc_req *h)155{156static char *res = NULL;157158if (res)159free(res);160asprintf(&res, "Echo: %s", *arg);161return &res;162}163164static void rpc_test_badverf(gss_name_t client, gss_name_t server,165struct svc_req *rqst, struct rpc_msg *msg,166caddr_t data)167{168OM_uint32 minor_stat;169gss_OID type;170gss_buffer_desc client_name, server_name;171172(void) gss_display_name(&minor_stat, client, &client_name, &type);173(void) gss_display_name(&minor_stat, server, &server_name, &type);174175printf("rpc_test server: bad verifier from %.*s at %s:%d for %.*s\n",176(int) client_name.length, (char *) client_name.value,177inet_ntoa(rqst->rq_xprt->xp_raddr.sin_addr),178ntohs(rqst->rq_xprt->xp_raddr.sin_port),179(int) server_name.length, (char *) server_name.value);180fflush(stdout);181182(void) gss_release_buffer(&minor_stat, &client_name);183(void) gss_release_buffer(&minor_stat, &server_name);184}185186/*187* Function: log_badauth188*189* Purpose: Callback from GSS-API Sun RPC for authentication190* failures/errors.191*192* Arguments:193* major (r) GSS-API major status194* minor (r) GSS-API minor status195* addr (r) originating address196* data (r) arbitrary data (NULL), not used197*198* Effects:199*200* Logs the GSS-API error to stdout.201*/202void rpc_test_badauth(OM_uint32 major, OM_uint32 minor,203struct sockaddr_in *addr, caddr_t data)204{205char *a;206207/* Authentication attempt failed: <IP address>, <GSS-API error */208/* strings> */209210a = inet_ntoa(addr->sin_addr);211212printf("rpc_test server: Authentication attempt failed: %s", a);213log_badauth_display_status(major, minor);214printf("\n");215fflush(stdout);216}217218void log_miscerr(struct svc_req *rqst, struct rpc_msg *msg,219char *error, char *data)220{221char *a;222223a = inet_ntoa(rqst->rq_xprt->xp_raddr.sin_addr);224printf("Miscellaneous RPC error: %s, %s\n", a, error);225fflush(stdout);226}227228void log_badauth_display_status(OM_uint32 major, OM_uint32 minor)229{230log_badauth_display_status_1(major, GSS_C_GSS_CODE, 0);231log_badauth_display_status_1(minor, GSS_C_MECH_CODE, 0);232}233234void log_badauth_display_status_1(OM_uint32 code, int type, int rec)235{236OM_uint32 gssstat, minor_stat, msg_ctx;237gss_buffer_desc msg;238239msg_ctx = 0;240while (1) {241gssstat = gss_display_status(&minor_stat, code,242type, GSS_C_NULL_OID,243&msg_ctx, &msg);244if (gssstat != GSS_S_COMPLETE) {245if (!rec) {246log_badauth_display_status_1(gssstat,GSS_C_GSS_CODE,1);247log_badauth_display_status_1(minor_stat,248GSS_C_MECH_CODE, 1);249} else {250printf("GSS-API authentication error %.*s: "251"recursive failure!\n", (int) msg.length,252(char *)msg.value);253}254fflush(stdout);255return;256}257258printf(", %.*s", (int) msg.length, (char *)msg.value);259(void) gss_release_buffer(&minor_stat, &msg);260261if (!msg_ctx)262break;263}264fflush(stdout);265}266267268