⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menu.c

📁 This program is a RADIUS RFC-compliant daemon, which is derived from original Livingston Enterprise
💻 C
字号:
/* * Copyright (C) 1999-2002 Francesco P. Lovergine.  * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms stated in the LICENSE file which should be * enclosed with sources. */static char rcsid[] = "$Id: menu.c,v 1.5.2.1 2004/08/02 18:40:07 flovergine Exp $";#include	<sys/types.h>#include	<sys/socket.h>#include	<sys/time.h>#include	<sys/file.h>#include	<netinet/in.h>#include	<stdio.h>#include	<netdb.h>#include	<fcntl.h>#include	<pwd.h>#include	<time.h>#include	<ctype.h>#include	<unistd.h>#include	<signal.h>#include	<errno.h>#include	<sys/wait.h>#include	"yard.h"#include	"global.h"void process_menu(AUTH_REQ*authreq,int activefd,char*pw_digest){	VALUE_PAIR	*attr;	VALUE_PAIR	*term_attr;	VALUE_PAIR	*newattr;	char		menu_name[128];	char		menu_input[32];	int		i;	char		state_value[128];	if((attr = get_attribute(authreq->request, PW_STATE)) !=		(VALUE_PAIR *)NULL && strncmp(attr->strvalue, "MENU=", 5) == 0){		strcpy(menu_name, &attr->strvalue[5]);		/* The menu input is in the Password Field */		attr = get_attribute(authreq->request, PW_PASSWORD);		if(attr == (VALUE_PAIR *)NULL) {			*menu_input = '\0';		}		else {			/*			 * Decrypt the password in the request.			 */			memcpy(menu_input, attr->strvalue, AUTH_PASS_LEN);			for(i = 0;i < AUTH_PASS_LEN;i++) {				menu_input[i] ^= pw_digest[i];			}			menu_input[AUTH_PASS_LEN] = '\0';		}		attr = menu_pairs(menu_name, menu_input);	}	/* handle termination menu */	if((term_attr = get_attribute(attr, PW_TERMINATION_MENU)) !=							(VALUE_PAIR *)NULL) {		/* Change this to a menu state */		sprintf(state_value, "MENU=%s", term_attr->strvalue);		term_attr->attribute = PW_STATE;		strcpy(term_attr->strvalue, state_value);		strcpy(term_attr->name, "Challenge-State");		/* Insert RADIUS termination option */		/* Set termination values */		newattr = pairalloc("process_menu");		newattr->attribute = PW_TERMINATION;		newattr->type = PW_TYPE_INTEGER;		newattr->lvalue = PW_TERM_RADIUS_REQUEST;		strcpy(newattr->name, "Termination-Action");		/* Insert it */		newattr->next = term_attr->next;		term_attr->next = newattr;	}	if((term_attr = get_attribute(attr, PW_MENU)) != (VALUE_PAIR *)NULL &&				strcmp(term_attr->strvalue, "EXIT") == 0) {		send_reject(authreq, (char *)"", activefd);		pairfree(attr,"process_menu");	}	else if(attr != (VALUE_PAIR *)NULL) {		send_accept(authreq, attr, (char *)NULL, activefd);		pairfree(attr,"process_menu");	}	else {		send_reject(authreq, (char *)NULL, activefd);	}	reqfree(authreq,"process_menu");	return;}char* get_menu(char *menu_name){	FILE	*fd;	static	char menu_buffer[4096];	int	mode;	char	*ptr;	int	nread;	int	len;	snprintf(menu_buffer,(size_t)4096,"%s/menus/%s", radius_dir, menu_name);	if((fd = fopen(menu_buffer, "r")) == (FILE *)NULL) {		return("\r\n*** User Menu is Not Available ***\r\n");	}	mode = 0;	nread = 0;	ptr = menu_buffer;	*ptr = '\0';	while(fgets(ptr, 4096 - nread, fd) != NULL && nread < 4096) {		if(mode == 0) {			if(strncmp(ptr, "menu", 4) == 0) {				mode = 1;			}		}		else {			if(strncmp(ptr, "end\n", 4) == 0) {				if(ptr > menu_buffer) {					*(ptr - 2) = '\0';				}				else {					*ptr = '\0';				}				return(menu_buffer);			}			len = strlen(ptr);			ptr += len - 1;			*ptr++ = '\r';			*ptr++ = '\n';			nread += len + 1;		}	}	*ptr = '\0';	return(menu_buffer);}VALUE_PAIR* menu_pairs(char*menu_name,char*menu_selection){	FILE	*fd;	char 	buffer[4096];	char	selection[32];	int	mode;	char	*ptr;	int	nread;	VALUE_PAIR*reply_first;	sprintf(buffer, "%s/menus/%s", radius_dir, menu_name);	if((fd = fopen(buffer, "r")) == (FILE *)NULL) {		return((VALUE_PAIR *)NULL);	}	/* Skip past the menu */	mode = 0; nread = 0;	while(fgets(buffer, sizeof(buffer), fd) != NULL) {		if(mode == 0) {			if(strncmp(buffer, "menu", 4) == 0) {				mode = 1;			}		}		else {			if(strncmp(buffer, "end\n", 4) == 0) {				break;			}		}	}	/* handle default */	if(*menu_selection == '\0') { strcpy(selection, "<CR>"); }	else { strcpy(selection, menu_selection); }	reply_first = (VALUE_PAIR *)NULL;	/* Look for a matching menu entry */	while(fgets(buffer, sizeof(buffer), fd) != NULL) {		/* Terminate the buffer */		ptr = buffer;		while(*ptr != '\n' && *ptr != '\0') {			ptr++;		}		if(*ptr == '\n') {			*ptr = '\0';		}		if(strcmp(selection, buffer) == 0 ||					strcmp("DEFAULT", buffer) == 0) {			/* We have a match */			while(fgets(buffer, sizeof(buffer), fd) != NULL) {			    if(*buffer == ' ' || *buffer == '\t') {				/*				 * Parse the reply values				 */				if(userparse(buffer, &reply_first) != 0) {					log_err("parse error for menu %s\n",menu_name);					pairfree(reply_first,"menu_pairs");					fclose(fd);					return((VALUE_PAIR *)NULL);				}			    }			    else {				/* We are done */				fclose(fd);				return(reply_first);			    }			}			fclose(fd);			return(reply_first);		}	}	fclose(fd);	return((VALUE_PAIR *)NULL);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -