CALLBACK SERVER emuluje WINDOWS NT RAS PPPD callback SERVER. Ver 2.0b (hamm) english: down vvvvvv oproti README.cbcp pri orginal_pppd toto je LEN server nie klient. M.Bobovsky (Bbo) 10.11.1998 ver 2.0a. mailto:bobovsky@koruna.pbko.sk http://koruna.pbko.sk/~bobovsky/archiv/pppd-cbcpS-callback/ T.j. umoznuje z win95 pripojit sa cez CHAP a podla prav pripojit sa priamo, alebo zvolit si cislo kam sa ma zavolat, admin zvolil cislo. Dalsie scriptiky dorobia k tomu este subor o tom kedy kde kto volal. Co treba pri kompilacii a naistalovani PPPD callbacku - verzia pre hamm debian: Zdrojak ppp-2.3.5 +debian patch verzia 2. - a mam ppp-2.3.5-2 Moj patchbbo patch -p0 < patchbbo a mam ppp-2.3.5-2cb Potom uz len ./configure (spravi Makefile) a make. a mame pppd este v callbackser cc main.c -o callbackser a scripty + prava podla prilohy. Ako zacat: najskor si rozbehni orginal mgetty a pppd (bez prepinaca cb) na com si precvicics modem a at prikazy, chap-secrets. Potom nove pppd a uz treba callbusers a postupne pravo P,V,A ... s "debug kdebug 8" prepinacom a kukni pppd.log ci sa to tvari dobre. (je po chap CBCP a potom ostatne). Nuz a uz len postupne odlat ... pripadne podla zdrojakov ... zas az tak vela toho neni. Over ci ide pppd call subor_chat atd. Zmeny: vcul verzia 2.3.5 - stara s novym hamm debianom sla ale casove posuvy v logu, nevedela admin callback, iba callback ... Trochu sa to zjednodusilo a uz to neni zviazane s balikom terminaloveho callbacku ktory je pri ppp spatnom volani bezpredmetny, t.j. je to samostatne. (spatne volanie robim pppd call cbcp kde cbcp popis IP chat scriptu a pod.) IP adresu teraz treba dat do mgetty option.ttyS? a aj tu do cbcp suboru. (option ... aby sa dalo viac modemov - v tom zmena verzia a). (b=upravy pre korektnejsie pozeranie /var/lock pre locknutia modemov) Chyby: -Nuz niesom uplne dosledny - su poznamku v zdrojakoch kde som co oklamal. -prevadzka ukaze (stara veriza isla 3 mesiace bez problemov, (jediny co sa ukazal bol v baliku teminal_callback kde nebol casovy timeout). Ak mas mgetty starsie ako 1.1.18-1 (debian) zle rotuje logy ... tak som dal toto nove -- neni v hamm ale v unstable. ------ CALLBACK SERVER works as WINDOWS NT RAS PPPD callback SERVER. Ver 2.0b (hamm) In contrast to README.cbcp, in orginal_pppd, this is ONLY server not client. M.Bobovsky (Bbo) 10.11.1998 ver 2.0a. mailto:bobovsky@koruna.pbko.sk http://koruna.pbko.sk/~bobovsky/archiv/pppd-cbcpS-callback/ By using this is possible to connect from win95 throught CHAP and according to permissions to connect direct, or to select number where to phone, admin chose number. Next scripts create file (who phoned and where and when) What is naccessary when you want to compile and install PPPD callbacku - version for hamm debian: Source ppp-2.3.5 +debian patch version 2. - and I have ppp-2.3.5-2 My patchbbo patch -p0 < patchbbo and I have ppp-2.3.5-2cb And then left only ./configure (it makes Makefile) and make. and we get pppd AND ! in callbackser cc main.c -o callbackser and scripts + permissions accordi ng appendix. How to start: First you must have working original mgetty and pppd (without switch cb), you excersise and repeat AT commands, chap-secrets. And then new pppd and then you n eed callbusers and then step by step permission P,V,A ...with switch "debug kdebug 8 " and look at pppd.log if it looks all right. (it is after chap CBCP and then another thing s). And then step by step try to make working program .... or according to sources.. There is not too much. Look if works pppd call subor_chat (file_chat) etc. Changes: now version 2.3.5 - old with new hamm debian worked, but it made time offsets in log, it did not admin callback, only callback... Now it is little simplier and now it is not depend on terminal callback package, witch is at ppp bad phoning not important, it means it is alone. (bad calling I do pppd call cbcp, where cbcp description IP chat script ) IP address now you must write to mgetty option.ttyS? and also to cbcp file. (option ... in order to be possible more modems - in this is change version a). (b=changes for more correctly looking at /var/lock for locking modems) Errors: -So I am not perfect:-(( - there are comments in sources where I had to use not very correct solutions. -and we will see in practice using (old version worked 3 months without any prob lems), (only one I saw : There was in package teminal_callback, where was not timeout) If you have mgetty older then 1.1.18-1 (debian), it bad rotate logs... so I use d new -- it is not in hamm, but in unstable. SUBORY A OBSAHY pre DEMO: (a owner.group+prava) /etc/inittab root.root 644 T0:23:respawn:/sbin/mgetty ttyS0 /etc/mgetty/mgetty.config root.root 644 port ttyS0 speed 57600 data-only rings 1 issue-file /etc/issue.ttyS0 login-prompt Toto je ppp modem port - no telnet login.\040 # login-prompt Toto je modemovy port \L of @\r\n\nPlease login:\040 # init-chat "" \d\d\d+++\d\d\dAT&F&d3&c1 OK ATS0=0 OK init-chat "" \d\d\d+++\d\d\dATZ0&F OK ATS0=0S2=255S11=221 OK /etc/issue.ttyS0 root.root 644 --- Moja firma a.s. Kosice, PPP Modem server --- /etc/mgetty/login.config root.root 600 # tou * aj login pojde sem a teda LEN PPP. no terminal.(bo tak chcel sef) * - a_ppp /usr/sbin/pppd auth +chap -pap cb /etc/ppp/options.ttyS0 root.root 644 resp S1 # pridelenie IP adresy na modem 194.1.141.11:194.1.141.13 /etc/ppp/ root.root 700 /usr/sbin/pppd root.dip 750 (preco bolo +s neviem). /etc/ppp/callbackser root.root 700 /etc/ppp/callbusers root.root 600 ## ludia ktory mozu mat callback (bude im ponuknute volit cislo) ## syntax : meno!priamo!volit!admin!cislo! t.j. co moze robit napr: ## demo: voliacilogin!P!V!!! nanutenylogin!!!A!274! =iba callback 274. ## demo: priamylogin!P!!!! pre tych co smu len priamo. ## ine kombinacie zlyhaju v chybe wo win95-(aj tak vrati len admin). he he bobovsky!!!A!274! nocallback!P!!!! pevnecislo!!!A!274! /etc/ppp/zavolajppp0 root.dip 700 #!/bin/sh # toto bude volane z callbackser. Arg=cislo kam treba volat. # toto sa ma volat /etc/ppp/zavolajppp0 pre modem 0 a 1 pre modem 1 atd. # a pouziva cbcp_chat0 (1) a call cbcp0 (1) ... vid nizsie cislo=$* umask 077 # nemusia mi do toho pozerat vsetci cat </etc/ppp/cbcp_chat0 ABORT BUSY ABORT "NO CARRIER" ABORT VOICE ABORT "NO DIALTONE" ABORT "NO ANSWER" "" ATZ OK "ATDT$cislo" CONNECT \d\c EOF i=20 #cakacka 13 sekund je uplne normalne while ((i!=0));do if ! test -s /var/lock/LCK..ttyS0 ; then break; # nemam lock file je to dobre fi sleep 1; i=$(($i-1)) done #echo $i >> /tmp/web-debug # a konecne akcia ... pppd call cbcp0 /etc/ppp/peers/cbcp0 root.dip 640 # podla mgetty pre callback ... ppp auth #podla mgetty ... +chap -pap connect "/usr/sbin/chat -v -f /etc/ppp/cbcp_chat0" # vygenerovany s cislom #debug #pppconfig_debug #kdebug 9 /dev/ttyS0 #pppconfig_dev 194.1.141.11:194.1.141.13 # END toto pouziva pppd call cbcp /etc/ppp/options root.root 644 ms-dns 194.1.141.1 asyncmap 0 auth crtscts lock modem proxyarp lcp-echo-interval 30 lcp-echo-failure 4 /etc/ppp/chap-secrets root.root 600 # Secrets for authentication using CHAP # pre heslo @subor je heslo v subore @subor, NIEKEDY NEMUSELA BYT IP=*. # client server secret IP addresses bobovsky * heslo * nocallback * heslo * pevnecislo * heslo * A nasleduje cast patchu: t.j. pred prvym diffom to odrez, rozbal povodny ppp-2.3.5 sprav nan naptch od debianu, premenuj katalog na ppp-2.3.5cb a tento patch (patch -p0 < suborznasledovnehotextu.) diff -rN --unified=10 ppp-2.3.5-2/pppd/Makefile.linux ppp-2.3.5-2cb/pppd/Makefile.linux --- ppp-2.3.5-2/pppd/Makefile.linux Fri Nov 6 11:12:19 1998 +++ ppp-2.3.5-2cb/pppd/Makefile.linux Fri Nov 6 15:04:25 1998 @@ -2,26 +2,26 @@ # pppd makefile for Linux # $Id: Makefile.linux,v 1.26 1998/05/04 06:10:29 paulus Exp $ # # Default installation locations BINDIR = /usr/sbin MANDIR = /usr/man PPPDSRCS = main.c magic.c fsm.c lcp.c ipcp.c upap.c chap.c md5.c ccp.c \ ipxcp.c auth.c options.c sys-linux.c md4.c chap_ms.c cbcp.c \ - demand.c + demand.c cbcps.c HEADERS = callout.h pathnames.h patchlevel.h chap.h md5.h chap_ms.h md4.h \ ipxcp.h cbcp.h MANPAGES = pppd.8 PPPDOBJS = main.o magic.o fsm.o lcp.o ipcp.o upap.o chap.o md5.o ccp.o \ - auth.o options.o demand.o sys-linux.o ipxcp.o + auth.o options.o demand.o sys-linux.o ipxcp.o cbcps.o all: pppd # # include dependancies if present and backup if as a header file ifeq (.depend,$(wildcard .depend)) include .depend endif # CC = gcc diff -rN --unified=10 ppp-2.3.5-2/pppd/auth.c ppp-2.3.5-2cb/pppd/auth.c --- ppp-2.3.5-2/pppd/auth.c Thu Mar 26 05:46:00 1998 +++ ppp-2.3.5-2cb/pppd/auth.c Sat Nov 7 11:29:20 1998 @@ -61,20 +61,21 @@ #endif #ifdef HAS_SHADOW #include #ifndef PW_PPP #define PW_PPP PW_LOGIN #endif #endif #include "pppd.h" +#include "cbcps.h" #include "fsm.h" #include "lcp.h" #include "ipcp.h" #include "upap.h" #include "chap.h" #ifdef CBCP_SUPPORT #include "cbcp.h" #endif #include "pathnames.h" @@ -120,21 +121,22 @@ /* Bits in auth_pending[] */ #define PAP_WITHPEER 1 #define PAP_PEER 2 #define CHAP_WITHPEER 4 #define CHAP_PEER 8 extern char *crypt __P((const char *, const char *)); /* Prototypes for procedures local to this file. */ -static void network_phase __P((int)); +void network_phase __P((int)); +static void callback_phase __P((int)); static void check_idle __P((void *)); static void connect_time_expired __P((void *)); static int plogin __P((char *, char *, char **, int *)); static void plogout __P((void)); static int null_login __P((int)); static int get_pap_passwd __P((char *)); static int have_pap_secret __P((void)); static int have_chap_secret __P((char *, char *, u_int32_t)); static int ip_addr_check __P((u_int32_t, struct wordlist *)); static int scan_authfile __P((FILE *, char *, char *, u_int32_t, char *, @@ -249,28 +251,28 @@ if (passwd[0] == 0) { passwd_from_file = 1; if (!get_pap_passwd(passwd)) syslog(LOG_ERR, "No secret found for PAP login"); } upap_authwithpeer(unit, user, passwd); auth |= PAP_WITHPEER; } auth_pending[unit] = auth; - if (!auth) - network_phase(unit); + if (!auth) // ak neni auth tak priamo bez chap/pap ideme. + callback_phase(unit); } /* * Proceed to the network phase. */ -static void +void network_phase(unit) int unit; { int i; struct protent *protp; lcp_options *go = &lcp_gotoptions[unit]; /* * If the peer had to authenticate, run the auth-up script now. */ @@ -301,20 +303,41 @@ (*protp->open)(unit); if (protp->protocol != PPP_CCP) ++num_np_open; } if (num_np_open == 0) /* nothing to do */ lcp_close(0, "No network protocols running"); } +static void +callback_phase(int unit) //faza callbacku .. treba pozret ci sa moze obist. +{ + lcp_options *wo=&lcp_wantoptions[unit]; + lcp_options *go=&lcp_gotoptions[unit]; + if(!cbcp_protent.enabled_flag) {network_phase(unit);return;} // neni cb switch + // to sa pouzilo napr pri spatnom volani. + if(!wo->neg_cbcp || !go->neg_cbcp) { //asi by stacilo len go pozerat. + if(cbcp_priamo) // smie sa obist nevylicitovanim ... inac je to podfuk. + network_phase(unit); // pri licitacii alebo cez opt cb nepovolena + else { + syslog(LOG_WARNING, "CBCP Nedovoleny pokus obist cb zlou licitaciu"); + auth_peer_fail(unit,PPP_CBCP); + return;} + } + else { + phase = PHASE_CALLBACK; + cbcp_open(unit); // toto ho prinuti poslat vyzvu .. + } +} + /* * The peer has failed to authenticate himself using `protocol'. */ void auth_peer_fail(unit, protocol) int unit, protocol; { /* * Authentication failure: take the link down */ @@ -352,21 +375,22 @@ namelen = sizeof(peer_authname) - 1; BCOPY(name, peer_authname, namelen); peer_authname[namelen] = 0; script_setenv("PEERNAME", peer_authname); /* * If there is no more authentication still to be done, * proceed to the network (or callback) phase. */ if ((auth_pending[unit] &= ~bit) == 0) - network_phase(unit); + { // syslog(LOG_DEBUG," bbo po auth_peer_success"); + callback_phase(unit);} } /* * We have failed to authenticate ourselves to the peer using `protocol'. */ void auth_withpeer_fail(unit, protocol) int unit, protocol; { if (passwd_from_file) @@ -1100,20 +1124,23 @@ FILE *f; int ret, len; char *filename; struct wordlist *addrs; char secbuf[MAXWORDLEN]; filename = _PATH_CHAPFILE; addrs = NULL; secbuf[0] = 0; + BCOPY(client,cbcpuser,strlen(client)>19 ? 19: strlen(client)); + cbcpuser[19]=0; + if (akysposobppp(cbcpuser)<1) return 0; f = fopen(filename, "r"); if (f == NULL) { syslog(LOG_ERR, "Can't open chap secret file %s: %m", filename); return 0; } check_access(f, filename); ret = scan_authfile(f, client, server, (u_int32_t)0, secbuf, &addrs, filename); fclose(f); diff -rN --unified=10 ppp-2.3.5-2/pppd/callbackser/main.c ppp-2.3.5-2cb/pppd/callbackser/main.c --- ppp-2.3.5-2/pppd/callbackser/main.c Thu Jan 1 01:00:00 1970 +++ ppp-2.3.5-2cb/pppd/callbackser/main.c Thu Nov 19 19:02:45 1998 @@ -0,0 +1,28 @@ +/* + * cbcps - Call Back Configuration Protocol. SERVER + * Miro Bobovsky , 7.11.1998 ver2.0 + * robte s tym co chete - GPL a lubovolny iny vse povoliaci. + * toto spusta pppd, a spusti zas pppd ale s aj vytoci cislo. +*/ +#include +#include +#include +#include +#include + +main(int argc, char **argv) +{ +char *user=argv[2]; +char *cislo=argv[3]; +char ttySx=*(argv[1]+strlen(argv[1])-1); // vyberie len cislo z ttySx +char buff[50]; + +if(argc!=4) return(-1); +openlog("callbackser", LOG_PID | LOG_NDELAY, LOG_LOCAL2); +syslog(LOG_INFO,"%c zavolam na %s pre usera %s",ttySx,cislo,user); +strncpy(buff,"/etc/ppp/zavolajpppx ",50); +buff[strlen(buff)-2]=ttySx; //doplni na zavolajppp1 pre modem 1 +strncat(buff,cislo,sizeof(buff)-strlen(buff)-1); +system(buff); +} + diff -rN --unified=10 ppp-2.3.5-2/pppd/callbusers ppp-2.3.5-2cb/pppd/callbusers --- ppp-2.3.5-2/pppd/callbusers Thu Jan 1 01:00:00 1970 +++ ppp-2.3.5-2cb/pppd/callbusers Fri Nov 6 14:23:13 1998 @@ -0,0 +1,8 @@ +## ludia ktory mozu mat callback (bude im ponuknute volit cislo) +## syntax : meno!priamo!volit!admin!cislo! t.j. co moze robit napr: +## demo: voliacilogin!P!V!!! nanutenylogin!!!A!274! =iba callback 274. +## demo: priamylogin!P!!!! pre tych co smu len priamo. +## pri kombinacii A V win95 zblbla a vzdy sla cez admin. +bobovsky!P!V!!! +nocallback!P!!!! +pevnecislo!!!A!274! diff -rN --unified=10 ppp-2.3.5-2/pppd/cbcps.c ppp-2.3.5-2cb/pppd/cbcps.c --- ppp-2.3.5-2/pppd/cbcps.c Thu Jan 1 01:00:00 1970 +++ ppp-2.3.5-2cb/pppd/cbcps.c Sat Nov 7 11:38:17 1998 @@ -0,0 +1,277 @@ +/* + * cbcps - Call Back Configuration Protocol. SERVER + * Miro Bobovsky , 7.11.1998 ver2.0 + * robte s tym co chete - GPL a lubovolny iny vse povoliaci. + * ocakavam za pppd prepinac auth +chap -pap cb ip:ip + * ocakavam subor /etc/ppp/callbusers kde su user (nestaci chap-s) + * s patricnym sytaxom meno!P!V!A!cislo!. + * snazim sa spustit /etc/ppp/callbackser pre volanie. (pppd chat). +*/ +#include +#include +#include +#include +#include + +#include "pppd.h" +#include "fsm.h" +#include "lcp.h" +#include "ipcp.h" +#include "cbcps.h" + +extern void network_phase __P((int)); + +void cbcp_recvresp(cbcp_state *us, char *pckt, int len); +void cbcp_sendack(cbcp_state *us,u_char type,u_char delay ); + +cbcp_state cbcp[NUM_PPP]; +char cbcpuser[20]; +int cbcp_priamo=0,cbcp_volit=0,cbcp_admin=0; +char cbcp_adminn[]="********************"; +struct protent cbcp_protent = { + PPP_CBCP, + cbcp_init, + cbcp_input, + cbcp_protrej, + cbcp_lowerup, + NULL, + cbcp_open, + NULL, + cbcp_printpkt, + NULL, + 0, + "CBCP", + NULL, + NULL, + NULL +}; + + +void cbcp_lowerup(int iface) //vola lcp.c +{ +LCPDEBUG((LOG_DEBUG," bbo cbcp_lowerup")); +} + +void cbcp_init(int iface) // z main.c +{ + cbcp_state *us; + + LCPDEBUG((LOG_DEBUG," bbo cbcp_init")); + cbcpuser[0]=0; + cbcp_priamo=cbcp_volit=cbcp_admin=0; + cbcp_adminn[0]=0; + us = &cbcp[iface]; + memset(us, 0, sizeof(cbcp_state)); + us->us_unit = iface; +} + +void cbcp_open(int unit) //z auth -- startuje cbcp komunikaciu +{ + u_char buf[256]; + u_char *bufp = buf; + u_char *outp; + int outlen; + cbcp_state *us = &cbcp[unit]; + + us->us_id = 1; + outp = outpacket_buf; + outlen=4; //hlavicka + if(cbcp_priamo) { outlen+=2; + PUTCHAR(CB_CONF_NO, bufp);PUTCHAR(2 , bufp);} + if(cbcp_volit) { outlen+=5; + PUTCHAR(CB_CONF_USER, bufp);PUTCHAR(5 , bufp); //typ,dlzka + PUTCHAR(0, bufp);PUTCHAR(1, bufp);PUTCHAR(0, bufp);} //delay,atyp,cisloZ + if(cbcp_admin) { outlen+=2; + PUTCHAR(CB_CONF_ADMIN, bufp);PUTCHAR(2 , bufp);} + LCPDEBUG((LOG_DEBUG, "bbo cbcp_open")); + MAKEHEADER(outp, PPP_CBCP); // a dorobim paket , dlzky a ... + PUTCHAR(CBCP_REQ, outp); // prikaz + PUTCHAR(us->us_id,outp); //id + PUTSHORT(outlen, outp); // IBAZE WINNT posiela to kazde 2 sek. + BCOPY(buf, outp, outlen-4); // s novym id a ja len raz .. ale ide. + output(1, outpacket_buf, outlen + PPP_HDRLEN); +} + +void cbcp_close(int unit) +{ + LCPDEBUG((LOG_DEBUG, "bbo cbcp_close")); +} + +/* process an incomming packet */ +void cbcp_input(int unit, u_char *inpacket, int pktlen) +{ + u_char *inp; + u_char code, id; + u_short len; + + cbcp_state *us = &cbcp[unit]; + inp = inpacket; + LCPDEBUG((LOG_DEBUG," bbo cbcp_input")); + if (pktlen < CBCP_MINLEN) { + syslog(LOG_ERR, "CBCP packet is too small"); + return; + } + + GETCHAR(code, inp); + GETCHAR(id, inp); + GETSHORT(len, inp); + + if (len > pktlen) { + syslog(LOG_ERR, "CBCP packet: invalid length"); + return; + } + + len -= CBCP_MINLEN; + + switch(code) { + case CBCP_REQ: // toto je neosetrene bo nema co prist. + syslog(LOG_ERR, "CBCP_REQ received !!!!"); + break; + + case CBCP_RESP: + LCPDEBUG((LOG_DEBUG, "CBCP_RESP received")); + if (id != us->us_id) + syslog(LOG_ERR,"CBCP RESP zle id, caka %d dostal %d",us->us_id,id); + cbcp_recvresp(us,inp,len); + break; + + case CBCP_ACK: // toto je neosetrene bo nema co prist. + syslog(LOG_ERR, "CBCP_ACK received !!!!"); + break; + + default: + break; + } +} + +/* protocol was rejected by foe */ +void cbcp_protrej(int iface) +{ + LCPDEBUG((LOG_DEBUG," bbo cbcp_protrej")); +} +int cbcp_printpkt(u_char *p, int plen, + void (*printer) __P((void *, char *, ...)), + void *arg) +{ + LCPDEBUG((LOG_DEBUG," bbo cbcp_printpkt")); + return 0; //urcite zle lebo mal vratit kolko asi pochopil znakov. +} + +void cbcp_recvresp(cbcp_state *us, char *pckt, int len) +{ + u_char type, delay=0, addr_type; + int opt_len,dlzka; + + if (len<2) { + syslog(LOG_ERR, "CBCP recvresp: kratky, %d",len); + phase=PHASE_TERMINATE; return;} + + GETCHAR(type, pckt); + GETCHAR(opt_len, pckt); + + if (opt_len > 2) + GETCHAR(delay, pckt); + switch(type) { + case CB_CONF_NO: + if(!cbcp_priamo) + {syslog(LOG_ERR, "CBCP Podvadza - vratil co som nenukal"); + phase=PHASE_TERMINATE; return;} + break; + case CB_CONF_ADMIN: + if(!cbcp_admin) + {syslog(LOG_ERR, "CBCP Podvadza - vratil co som nenukal"); + phase=PHASE_TERMINATE; return;} + break; + default: // t.j. asi voli ale pozreme. + if(!cbcp_volit) + {syslog(LOG_ERR, "CBCP Podvadza - vratil co som nenukal"); + phase=PHASE_TERMINATE; return;} + if(opt_len>4) { + GETCHAR(addr_type, pckt); + dlzka=opt_len - 4<20?opt_len - 4:19; + memcpy(cbcp_adminn, pckt, dlzka); + cbcp_adminn[dlzka]=0; + LCPDEBUG((LOG_DEBUG, "mam cislo: %s", cbcp_adminn)); + } + } + cbcp_sendack(us,type,delay); +} + +void cbcp_sendack( cbcp_state *us,u_char type,u_char delay ) +{ + u_char buf[256]; + u_char *bufp = buf; + int len = 0; + u_char *outp; + int outlen; + + outp = outpacket_buf; + switch(type) { + case CB_CONF_NO: + len=2;PUTCHAR(CB_CONF_NO, bufp);PUTCHAR(len , bufp); + break; + case CB_CONF_USER: + len=strlen(cbcp_adminn)+5; + PUTCHAR(CB_CONF_USER, bufp);PUTCHAR(len, bufp);PUTCHAR(delay, bufp); + PUTCHAR(1, bufp);BCOPY(cbcp_adminn,bufp,len-5);bufp+=len-5; + PUTCHAR(0, bufp);break; + case CB_CONF_ADMIN: + len=3;PUTCHAR(CB_CONF_ADMIN,bufp);PUTCHAR(len,bufp);PUTCHAR(delay,bufp); + break; + default: + syslog(LOG_ERR, "CBCP Podvadza - v type"); + phase=PHASE_TERMINATE; return;break; + } + LCPDEBUG((LOG_DEBUG, "bbo cbcp_sendack")); + outlen = 4 + len; + MAKEHEADER(outp, PPP_CBCP); + PUTCHAR(CBCP_ACK, outp); + PUTCHAR(us->us_id,outp); + PUTSHORT(outlen, outp); + BCOPY(buf, outp, len); + output(1, outpacket_buf, outlen + PPP_HDRLEN); + network_phase(us->us_unit); + +if(type==CB_CONF_ADMIN || type==CB_CONF_USER){ //spustenie programu na volanie +char *argv[4]; + argv[0] = "/etc/ppp/callbackser"; //progam + argv[1] = devnam; // /dev/ttyS? + argv[2] = cbcpuser; //ID + argv[3] = cbcp_adminn; // cislo + argv[4] = NULL; + run_program(argv[0], argv, 0); + } +} + +int akysposobppp(char *kto) +{ + FILE *fp; + char *a,*b; + char riadok[81]; + + cbcp_priamo=cbcp_volit=cbcp_admin=0; + cbcp_adminn[0]=0; + if(strlen(kto)<2) {syslog(LOG_ERR,"CBCP - kratke meno"); return 0;} + if((fp=fopen("/etc/ppp/callbusers","r"))==NULL) + {syslog(LOG_ERR,"CBCP neviem otvorit callbusers");return 0;} + while(fgets(riadok,80,fp)!=NULL){ + if( *riadok=='#' ) continue; + if( (a=strchr(riadok,'!'))!=NULL ) *(a++)=0; + if(strcmp(riadok,kto)==0) { + if( strlen(a)<5 ) {syslog(LOG_ERR,"CBCP chybny riadok"); + fclose(fp);return 0;} + if( *(a++)=='P') {a++;cbcp_priamo=1;} + if( *(a++)=='V') {a++;cbcp_volit=1;} + if( *(a++)=='A') { + a++; + if( (b=strchr(a,'!'))!=NULL ) + {*b=0;strncpy(cbcp_adminn,a,20);cbcp_admin=1;} + } + fclose(fp); +// syslog(LOG_INFO,"meno:%s P:%d V:%d A:%d cislo:[%s]\n", +// kto,cbcp_priamo,cbcp_volit,cbcp_admin,cbcp_adminn); + return 1;} + } + fclose(fp);syslog(LOG_ERR,"CBCP neni v callbusers");return 0; +} + diff -rN --unified=10 ppp-2.3.5-2/pppd/cbcps.h ppp-2.3.5-2cb/pppd/cbcps.h --- ppp-2.3.5-2/pppd/cbcps.h Thu Jan 1 01:00:00 1970 +++ ppp-2.3.5-2cb/pppd/cbcps.h Fri Nov 6 15:16:40 1998 @@ -0,0 +1,39 @@ +/* + * cbcps - Call Back Configuration Protocol. SERVER + * Miro Bobovsky , 7.11.1998 ver2.0 + * robte s tym co chete - GPL a lubovolny iny vse povoliaci. +*/ + +#define PPP_CBCP 0xc029 /* Callback Control Protocol */ +typedef struct cbcp_state { + int us_unit; /* Interface unit number */ + u_char us_id; /* Current id */ +} cbcp_state; + +void cbcp_init __P((int)); +void cbcp_open __P((int)); +void cbcp_lowerup __P((int)); +void cbcp_input __P((int, u_char *, int)); +void cbcp_protrej __P((int)); +int cbcp_printpkt __P((u_char *, int,void (*) __P((void *, char *, ...)), + void *)); +extern cbcp_state cbcp[]; +extern struct protent cbcp_protent; +extern char cbcpuser[]; +extern int cbcp_volit; // ci sme si uzer volit callb cislo +extern int cbcp_admin; // cislo zadava admin a user ho ani nevie. +extern int cbcp_priamo; // smie ist bez callbacku. +extern char cbcp_adminn[]; // cislo (ad admina alebo od usera ak moze. +int akysposobppp(char *kto); // fcia co pozera callbusers a nastavi param. + +#define CBCP_MINLEN 4 + +#define CBCP_REQ 1 +#define CBCP_RESP 2 +#define CBCP_ACK 3 + +#define CB_CONF_NO 1 +#define CB_CONF_USER 2 +#define CB_CONF_ADMIN 3 +#define CB_CONF_LIST 4 + diff -rN --unified=10 ppp-2.3.5-2/pppd/chap.c ppp-2.3.5-2cb/pppd/chap.c --- ppp-2.3.5-2/pppd/chap.c Thu Nov 27 07:07:48 1997 +++ ppp-2.3.5-2cb/pppd/chap.c Fri Nov 6 14:10:05 1998 @@ -572,31 +572,33 @@ default: CHAPDEBUG((LOG_INFO, "unknown digest type %d", cstate->chal_type)); } } BZERO(secret, sizeof(secret)); ChapSendStatus(cstate, code); if (code == CHAP_SUCCESS) { + syslog(LOG_NOTICE, "CHAP %s login ok:%s",devnam,rhostname); old_state = cstate->serverstate; cstate->serverstate = CHAPSS_OPEN; if (old_state == CHAPSS_INITIAL_CHAL) { auth_peer_success(cstate->unit, PPP_CHAP, rhostname, len); } if (cstate->chal_interval != 0) TIMEOUT(ChapRechallenge, cstate, cstate->chal_interval); syslog(LOG_NOTICE, "CHAP peer authentication succeeded for %s", rhostname); } else { + syslog(LOG_NOTICE, "CHAP %s login error:%s",devnam,rhostname); syslog(LOG_ERR, "CHAP peer authentication failed for remote host %s", rhostname); cstate->serverstate = CHAPSS_BADAUTH; auth_peer_fail(cstate->unit, PPP_CHAP); } } /* * ChapReceiveSuccess - Receive Success */ diff -rN --unified=10 ppp-2.3.5-2/pppd/lcp.c ppp-2.3.5-2cb/pppd/lcp.c --- ppp-2.3.5-2/pppd/lcp.c Thu Nov 27 07:08:44 1997 +++ ppp-2.3.5-2cb/pppd/lcp.c Fri Nov 6 14:48:45 1998 @@ -1391,20 +1391,29 @@ case CI_ACCOMPRESSION: LCPDEBUG((LOG_INFO, "lcp_reqci: rcvd ACCOMPRESSION")); if (!ao->neg_accompression || cilen != CILEN_VOID) { orc = CONFREJ; break; } ho->neg_accompression = 1; break; + case CI_CALLBACK: // on mi ponuka cbcp a co ja na to. + LCPDEBUG((LOG_INFO, "lcp_reqci: rcvd Bbo callback")); + if (!ao->neg_cbcp || + cilen != CILEN_CBCP) { + orc = CONFREJ; + break; + } + ho->neg_cbcp = 1; + break; default: LCPDEBUG((LOG_INFO, "lcp_reqci: rcvd unknown option %d", citype)); orc = CONFREJ; break; } endswitch: LCPDEBUG((LOG_INFO, " (%s)", CODENAME(orc))); diff -rN --unified=10 ppp-2.3.5-2/pppd/main.c ppp-2.3.5-2cb/pppd/main.c --- ppp-2.3.5-2/pppd/main.c Tue May 5 07:24:17 1998 +++ ppp-2.3.5-2cb/pppd/main.c Fri Nov 6 15:57:54 1998 @@ -44,20 +44,21 @@ #include "pppd.h" #include "magic.h" #include "fsm.h" #include "lcp.h" #include "ipcp.h" #include "upap.h" #include "chap.h" #include "ccp.h" #include "pathnames.h" #include "patchlevel.h" +#include "cbcps.h" #ifdef CBCP_SUPPORT #include "cbcp.h" #endif #if defined(SUNOS4) extern char *strerror(); #endif #ifdef IPX_CHANGE @@ -138,20 +139,21 @@ /* * PPP Data Link Layer "protocol" table. * One entry per supported protocol. * The last entry must be NULL. */ struct protent *protocols[] = { &lcp_protent, &pap_protent, &chap_protent, + &cbcp_protent, #ifdef CBCP_SUPPORT &cbcp_protent, #endif &ipcp_protent, &ccp_protent, #ifdef IPX_CHANGE &ipxcp_protent, #endif #ifdef AT_CHANGE &atcp_protent, diff -rN --unified=10 ppp-2.3.5-2/pppd/options.c ppp-2.3.5-2cb/pppd/options.c --- ppp-2.3.5-2/pppd/options.c Thu Mar 26 05:46:07 1998 +++ ppp-2.3.5-2cb/pppd/options.c Sat Nov 7 10:39:12 1998 @@ -43,20 +43,21 @@ #include "pppd.h" #include "pathnames.h" #include "patchlevel.h" #include "fsm.h" #include "lcp.h" #include "ipcp.h" #include "upap.h" #include "chap.h" #include "ccp.h" +#include "cbcps.h" #ifdef CBCP_SUPPORT #include "cbcp.h" #endif #ifdef IPX_CHANGE #include "ipxcp.h" #endif /* IPX_CHANGE */ #include @@ -151,20 +152,21 @@ static int nochap __P((char **)); static int reqchap __P((char **)); static int noaccomp __P((char **)); static int noasyncmap __P((char **)); static int noip __P((char **)); static int nomagicnumber __P((char **)); static int setasyncmap __P((char **)); static int setescape __P((char **)); static int setmru __P((char **)); static int setmtu __P((char **)); +static int setcbcps __P((char **)); #ifdef CBCP_SUPPORT static int setcbcp __P((char **)); #endif static int nomru __P((char **)); static int nopcomp __P((char **)); static int setconnector __P((char **)); static int setdisconnector __P((char **)); static int setwelcomer __P((char **)); static int setmaxconnect __P((char **)); static int setdomain __P((char **)); @@ -310,20 +312,21 @@ {"maxconnect", 1, setmaxconnect}, /* specify a maximum connect time */ {"crtscts", 0, setcrtscts}, /* set h/w flow control */ {"nocrtscts", 0, setnocrtscts}, /* clear h/w flow control */ {"-crtscts", 0, setnocrtscts}, /* clear h/w flow control */ {"xonxoff", 0, setxonxoff}, /* set s/w flow control */ {"debug", 0, setdebug}, /* Increase debugging level */ {"kdebug", 1, setkdebug}, /* Enable kernel-level debugging */ {"domain", 1, setdomain}, /* Add given domain name to hostname*/ {"mru", 1, setmru}, /* Set MRU value for negotiation */ {"mtu", 1, setmtu}, /* Set our MTU */ + {"cb", 0, setcbcps}, #ifdef CBCP_SUPPORT {"callback", 1, setcbcp}, /* Ask for callback */ #endif {"netmask", 1, setnetmask}, /* set netmask */ {"passive", 0, setpassive}, /* Set passive mode */ {"silent", 0, setsilent}, /* Set silent mode */ {"modem", 0, setmodem}, /* Use modem control lines */ {"local", 0, setlocal}, /* Don't use modem control lines */ {"lock", 0, setlock}, /* Lock serial device (with lock file) */ {"name", 1, setname}, /* Set local name for authentication */ @@ -1282,20 +1285,29 @@ return 0; if (mtu < MINMRU || mtu > MAXMRU) { option_error("mtu option value of %u is too %s", mtu, (mtu < MINMRU? "small": "large")); return 0; } lcp_allowoptions[0].mru = mtu; return (1); } +static int +setcbcps(argv) + char **argv; +{ + lcp_wantoptions[0].neg_cbcp = 1; // poslem licitaciu na cbcp + lcp_allowoptions[0].neg_cbcp = 1; // ak bude pytat cbcp potvrdim. + cbcp_protent.enabled_flag = 1; // povolovanie protokolu po novom. + return(1); +} #ifdef CBCP_SUPPORT static int setcbcp(argv) char **argv; { lcp_wantoptions[0].neg_cbcp = 1; cbcp_protent.enabled_flag = 1; cbcp[0].us_number = strdup(*argv); if (cbcp[0].us_number == 0) novm("callback number"); KONIEC patch suboru (povedzme ze README.cbcps) Mnoho zdaru.