On Mon, Jul 28, 2003 at 02:02:22PM -0400, Alan DeKok wrote:
> > Dear developers, how about customizable messages? Something like
> > this in radiusd.conf:
> > 
> > messages {
> >     multiple_login = "You are already logged in %{Simultaneous-Use} times\r\n"
> >     timespan_violation = "You are calling outside allowed timespan\r\n"
> >    ...
> >}
> 
>   Sure.

Almost done.
I could get rid of radius_xlat calls, if the "user_msg == NULL" check is
removed around the following block (auth.c, lines 850-865):

        /*
         *      Filter (possibly multiple) Reply-Message attributes
         *      through radius_xlat, modifying them in place.
         */
        if (user_msg == NULL) {
                reply_item = pairfind(request->reply->vps, PW_REPLY_MESSAGE);
                while (reply_item) {
                        radius_xlat(buf, sizeof(reply_item->strvalue),
                                    (char *)reply_item->strvalue, request, NULL);
                        strNcpy((char *)reply_item->strvalue, buf,
                                sizeof(reply_item->strvalue));
                        reply_item->length = strlen((char *)reply_item->strvalue);
                        user_msg = NULL;
                        reply_item = pairfind(reply_item->next, PW_REPLY_MESSAGE);
                }
        }

There's no more need for it, I think.

Also, the mentioned xlat.c patch should be applied too to allow
expansion of %{check:...} attributes.

Local tests are OK.


-- 
Fduch M. Pravking
Index: src/include/radiusd.h
===================================================================
RCS file: /source/radiusd/src/include/radiusd.h,v
retrieving revision 1.140
diff -u -p -r1.140 radiusd.h
--- src/include/radiusd.h       23 Jul 2003 19:50:38 -0000      1.140
+++ src/include/radiusd.h       29 Jul 2003 21:28:42 -0000
@@ -172,6 +172,15 @@ typedef struct main_config_t {
        REALM           *realms;
 } MAIN_CONFIG_T;
 
+typedef struct messages_config_t {
+       const char      *expiration;
+       const char      *double_login;
+       const char      *multiple_login;
+       const char      *timespan_violation;
+       const char      *exec_failure;
+       const char      *auth_failure;
+} MESSAGE_CONFIG_T;
+
 #define DEBUG  if(debug_flag)log_debug
 #define DEBUG2  if (debug_flag > 1)log_debug
 
@@ -364,6 +373,7 @@ extern          int total_active_threads
 /* mainconfig.h */
 /* Define a global config structure */
 extern struct main_config_t mainconfig;
+extern struct messages_config_t server_messages;
 
 int read_mainconfig(int reload);
 int free_mainconfig(void);
Index: src/main/mainconfig.c
===================================================================
RCS file: /source/radiusd/src/main/mainconfig.c,v
retrieving revision 1.21
diff -u -p -r1.21 mainconfig.c
--- src/main/mainconfig.c       22 Jul 2003 18:16:23 -0000      1.21
+++ src/main/mainconfig.c       29 Jul 2003 21:30:39 -0000
@@ -45,6 +45,7 @@
 
 
 struct main_config_t mainconfig;
+struct messages_config_t server_messages;
 
 /*
  *  Local variables for stuff.
@@ -83,6 +84,25 @@ static CONF_PARSER security_config[] = {
 };
 
 /*
+ *  A list of global messages sent back in certain cases
+ */
+static CONF_PARSER messages_config[] = {
+       { "expiration", PW_TYPE_STRING_PTR, 0, &server_messages.expiration,
+         "Password Has Expired\r\n" },
+       { "double_login", PW_TYPE_STRING_PTR, 0, &server_messages.double_login,
+         "\r\nYou are already logged in  - access denied\r\n" },
+       { "multiple_login", PW_TYPE_STRING_PTR, 0, &server_messages.multiple_login,
+         "\r\nYou are already logged in %{check:Simultaneous-Use} times - access 
denied\r\n" },
+       { "timespan_violation", PW_TYPE_STRING_PTR, 0, 
&server_messages.timespan_violation,
+         "You are calling outside your allowed timespan\r\n" },
+       { "exec_failure", PW_TYPE_STRING_PTR, 0, &server_messages.exec_failure,
+         "\r\nAccess denied (external check failed).\r\n" },
+       { "auth_failure", PW_TYPE_STRING_PTR, 0, &server_messages.auth_failure,
+         "" },
+       { NULL, -1, 0, NULL, NULL }
+};
+
+/*
  *  A mapping of configuration file names to internal variables
  */
 static CONF_PARSER server_config[] = {
@@ -126,6 +146,7 @@ static CONF_PARSER server_config[] = {
        { "proxy_requests", PW_TYPE_BOOLEAN, 0, &mainconfig.proxy_requests, "yes" },
        { "proxy", PW_TYPE_SUBSECTION, 0, proxy_config, NULL },
        { "security", PW_TYPE_SUBSECTION, 0, security_config, NULL },
+       { "messages", PW_TYPE_SUBSECTION, 0, messages_config, NULL },
        { "debug_level", PW_TYPE_INTEGER, 0, &mainconfig.debug_level, "0"},
        { NULL, -1, 0, NULL, NULL }
 };
Index: src/main/auth.c
===================================================================
RCS file: /source/radiusd/src/main/auth.c,v
retrieving revision 1.127
diff -u -p -r1.127 auth.c
--- src/main/auth.c     24 Jun 2003 14:22:19 -0000      1.127
+++ src/main/auth.c     29 Jul 2003 21:31:08 -0000
@@ -66,6 +66,7 @@ char *auth_name(char *buf, size_t buflen
 static int check_expiration(REQUEST *request)
 {
        int result;
+       char umsg[MAX_STRING_LEN + 1];
        VALUE_PAIR *check_item = request->config_items;
 
        result = 0;
@@ -86,9 +87,9 @@ static int check_expiration(REQUEST *req
                                VALUE_PAIR *vp;
 
                                result = -1;
-                               vp = pairmake("Reply-Message",
-                                               "Password Has Expired\r\n",
-                                               T_OP_ADD);
+                               radius_xlat(umsg, sizeof(umsg), 
server_messages.expiration,
+                                               request, NULL);
+                               vp = pairmake("Reply-Message", umsg, T_OP_ADD);
                                pairfree(&request->reply->vps);
                                request->reply->vps = vp;
                                break;
@@ -568,9 +569,14 @@ autz_redo:
         *      wants to send back.
         */
        if (result < 0) {
+               VALUE_PAIR *vp;
                DEBUG2("auth: Failed to validate the user.");
                request->reply->code = PW_AUTHENTICATION_REJECT;
 
+               radius_xlat(umsg, sizeof(umsg), server_messages.auth_failure, request, 
NULL);
+               vp = pairmake("Reply-Message", umsg, T_OP_ADD);
+               pairadd(&request->reply->vps, vp);
+
                if ((module_msg = 
pairfind(request->packet->vps,PW_MODULE_FAILURE_MESSAGE)) != NULL){
                        char msg[MAX_STRING_LEN+19];
 
@@ -626,13 +632,11 @@ autz_redo:
                        }
                        if (!mpp_ok){
                                if (check_item->lvalue > 1) {
-                               snprintf(umsg, sizeof(umsg), 
-                                                       "\r\nYou are already logged in 
%d times  - access denied\r\n\n",
-                                                       (int)check_item->lvalue);
-                                       user_msg = umsg;
+                                       user_msg = server_messages.multiple_login;
                                } else {
-                                       user_msg = "\r\nYou are already logged in - 
access denied\r\n\n";
+                                       user_msg = server_messages.double_login;
                                }
+                               radius_xlat(umsg, sizeof(umsg), user_msg, request, 
NULL);
 
                                request->reply->code = PW_AUTHENTICATION_REJECT;
 
@@ -641,7 +645,7 @@ autz_redo:
                                 *      Remove ALL reply attributes.
                                 */
                                pairfree(&request->reply->vps);
-                               tmp = pairmake("Reply-Message", user_msg, T_OP_SET);
+                               tmp = pairmake("Reply-Message", umsg, T_OP_SET);
                                request->reply->vps = tmp;
 
                                snprintf(logstr, sizeof(logstr), "Multiple logins (max 
%d) %s",
@@ -673,12 +677,13 @@ autz_redo:
                         *      User called outside allowed time interval.
                         */
                        result = -1;
-                       user_msg = "You are calling outside your allowed timespan\r\n";
+                       radius_xlat(umsg, sizeof(umsg),
+                               server_messages.timespan_violation, request, NULL);
 
                        request->reply->code = PW_AUTHENTICATION_REJECT;
                        pairfree(&request->reply->vps);
 
-                       tmp = pairmake("Reply-Message", user_msg, T_OP_SET);
+                       tmp = pairmake("Reply-Message", umsg, T_OP_SET);
                        request->reply->vps = tmp;
 
                        snprintf(logstr, sizeof(logstr), "Outside allowed timespan 
(time allowed %s)", 
@@ -805,13 +810,12 @@ autz_redo:
                         *      had a non-zero exit status.
                         */
                        if (umsg[0] == '\0') {
-                               user_msg = "\r\nAccess denied (external check 
failed).";
-                       } else {
-                               user_msg = &umsg[0];
+                               radius_xlat(umsg, sizeof(umsg),
+                                       server_messages.exec_failure, request, NULL);
                        }
 
                        request->reply->code = PW_AUTHENTICATION_REJECT;
-                       tmp = pairmake("Reply-Message", user_msg, T_OP_SET);
+                       tmp = pairmake("Reply-Message", umsg, T_OP_SET);
 
                        pairadd(&request->reply->vps, tmp);
                        rad_authlog("Login incorrect (external check failed)", 
Index: raddb/radiusd.conf.in
===================================================================
RCS file: /source/radiusd/raddb/radiusd.conf.in,v
retrieving revision 1.148
diff -u -p -r1.148 radiusd.conf.in
--- raddb/radiusd.conf.in       24 Jun 2003 12:54:05 -0000      1.148
+++ raddb/radiusd.conf.in       29 Jul 2003 21:28:11 -0000
@@ -1562,3 +1562,24 @@ post-proxy {
        #
        eap
 }
+
+
+#
+# Reply-Message's which are sent back to the NAS in Access-Reject pachet
+# in certain cases
+#
+messages {
+       expiration = "Password Has Expired\r\n"
+       #expiration = "Your password expired since %{check:Expiration}\r\n"
+
+       double_login = "\r\nYou are already logged in - access denied\r\n"
+       multiple_login = "\r\nYou are already logged in %{check:Simultaneous-Use} 
times - access denied\r\n"
+       timespan_violation = "You are calling outside your allowed timespan\r\n"
+       #timespan_violation = "Your allowed timespan is %{check:Login-Time}"
+
+       exec_failure = "\r\nAccess denied (external check failed).\r\n"
+
+       # by default, authentication failure is silent
+       auth_failure = ""
+       #auth_failure = "Authentication failure. Check your password\r\n"
+}

Reply via email to