Ascend Archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: (ASCEND) Time of day connectivity
In article <34597886.B85@atlantic.co.za> you wrote:
>Is there a way that we can control a user connecting to a max based on
>time ie he can only connect to the max from 9:00am to 3:30pm,
With radius it is possible. The following mail was posted on the list
a month ago. According to the headers you got a cc, maybe you
missed it.
Date: Sat, 1 Nov 1997 17:58:31 +0100 (MET)
From: Olivier PRENANT <ohp@pyrenet.fr>
X-Sender: ohp@server
To: Alex Bligh <amb@gxn.net>
cc: gdornan@atlantic.co.za, ascend-users@bungi.com
Subject: Re: (ASCEND) Time of DAy
In-Reply-To: <199710311627.QAA07737@diamond.xara.net>
Message-ID: <Pine.UW2.3.96.971101174816.26223A-100000@server>
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII
Sender: owner-ascend-users@max.bungi.com
Precedence: bulk
Status: RO
Content-Length: 5145
Lines: 238
On Fri, 31 Oct 1997, Alex Bligh wrote:
> Date: Fri, 31 Oct 1997 16:27:36 +0000
> From: Alex Bligh <amb@gxn.net>
> To: gdornan@atlantic.co.za
> Cc: ascend-users@bungi.com
> Subject: Re: (ASCEND) Time of DAy
>
> > Is it possible to have a time of day connectivity, ie A user can only
> > log on to the max during 9:00am and 4:00pm otherwise he is declined?
> >
> crontab entry to mv your users file? Or better recreate it using
> awk or similar? Simple hack, but effective.
>
>
> --
> Alex Bligh
> GX Networks (formerly Xara Networks)
What I did was to create the following function :
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <time.h>
#include "conf.h"
#include "radius.h"
extern int debug_flag;
#define TIMEFILE "/etc/raddb/users.times"
struct week_time
{
char wkd[3];
int time_min, time_max;
};
rad_check_time(char *authname)
{
time_t cur_time;
struct tm *tm;
FILE *fp;
char *buf, buffer[255],login[10];
int result= -1;
time(&cur_time);
tm=localtime(&cur_time);
fp=fopen(TIMEFILE,"r");
if (fp == 0)
return 0;
result=0;
while (!feof(fp))
{
char *p, *p2=login;
buf=fgets(buffer,255,fp);
p=buf;
if (*p == '#') /* skip comment lines */
continue;
while (*p && *p != '\t' && *p != '\n')
*p2++ = *p++;
*p2=NULL;
while (*p == '\t')
p++;
if (strcmp(login,authname) == 0)
{
result= (*p=='\n' ? -1 : get_times(login,p,tm));
break;
}
}
fclose(fp);
return result;
}
int get_times(login,times,tm)
char *login, *times;
struct tm *tm;
{
char *p=times, day[3], day1[3], day2[3];
int ind, intervalle=0;
struct week_time week_time[8]=
{
{"su",-1,-1},
{"mo",-1,-1},
{"tu",-1,-1},
{"we",-1,-1},
{"th",-1,-1},
{"fr",-1,-1},
{"sa",-1,-1},
{"",-2,-2}
};
while (*p && *p != '\n')
{
if (isalpha(*p)) /* we found a day name */
{
day1[0]=*p++;
day1[1]=*p++;
day1[2]='\0';
for (ind=0;ind<8;ind++)
if (!strcmp(day1,week_time[ind].wkd))
{
week_time[ind].time_min= week_time[ind].time_max=0;
break;
}
if (ind == 8)
{
debugf("%s: %s bad day name\n",login,day1);
return 0;
}
}
else if (*p == '-') /* day interval */
{
int ind2, i;
intervalle=1;
p++;
day2[0]=*p++;
day2[1]=*p++;
day2[2]='\0';
for (ind2=0;ind2<8;ind2++)
if (!strcmp(day2,week_time[ind2].wkd))
{
week_time[ind2].time_min= week_time[ind2].time_max=0;
break;
}
if (ind2 == 8)
{
debugf("%s: %s bad day name\n",login,day2);
return 0;
}
for (i=ind+1;i<ind2;i++)
week_time[i].time_min=week_time[i].time_max=0;
}
else if (isalpha(*p)) /* day list */
continue;
else if (isdigit(*p)) /* Hours Minutes */
{
int i, h_min, h_max;
char time[5]="", *p2=time;
for (i=0;i<4;i++)
{
if (!isdigit(*p))
{
debugf("%s: %s l'heure doit etre sur 4 caracteres\n",login,time);
exit(1);
}
*p2++=*p++;
}
h_min=atoi(time);
if (*p++ != ':')
{
debugf("%s: Erreur ':' attendu apres %s\n",login,time);
return 0;
}
p2=time;
for (i=0;i<4;i++)
{
if (!isdigit(*p))
{
debugf("%s: %s l'heure doit etre sur 4 caracteres\n",login,time);
return 0;
}
*p2++=*p++;
}
h_max=atoi(time);
for (i=0;i<8;i++)
if (week_time[i].time_min == 0)
{
week_time[i].time_min = h_min;
week_time[i].time_max = h_max;
}
}
}
if (week_time[tm->tm_wday].time_min <= tm->tm_hour * 100 + tm->tm_min &&
week_time[tm->tm_wday].time_max >= tm->tm_hour * 100 +tm->tm_min)
return 0;
else
return -1;
}
------------
and call it from function rad_authenticate in radiusd.c
after the comment 'Look for the remaining matching items' ,add :
user_msg = (char *) NULL;
check_item=checklist;
result=rad_check_time(authName->strvalue);
if (result == -1)
user_msg="Connexion refused blah blah blah...";
-------------
The ascii file with login you want check is like this:
#
# login hours for certain users:
# structure:
#login day1-day2time1:time2...
#login day1day2...time1:time2...
#login
#the days are Sunday: su
# Monday: mo
# Tuesday: tu
# Wedsday: we
# Thursday: th
# Friday: fr
# Saturday: sa
#
#times must be four digit long
#
terdis mo-sa0900:1930
mammouth mo-sa0900:2230
inter mo-sa0900:2000
---------
Good luck, hope it helps!
--
Olivier PRENANT Tel: +33-5-61-50-97-00 (Work)
Quartier d'Harraud Turrou +33-5-61-50-97-01 (Fax)
31190 AUTERIVE +33-6-07-63-80-64 (GSM)
FRANCE Email: ohp@pyrenet.fr
------------------------------------------------------------------------------
Make your life a dream, make your dream a reality. (St Exupery)
++ Ascend Users Mailing List ++
To unsubscribe: send unsubscribe to ascend-users-request@bungi.com
To get FAQ'd: <http://www.nealis.net/ascend/faq>
--
Oliver J. Albrecht <olli@allcon.net>
AllCon GmbH Lise Meitner Str. 2 D-24941 Flensburg
EMail: allcon@allcon.net Tel: +49 461 9992-162 Fax: -165
++ Ascend Users Mailing List ++
To unsubscribe: send unsubscribe to ascend-users-request@bungi.com
To get FAQ'd: <http://www.nealis.net/ascend/faq>
References: