POPPASSD.BCK: POPPASSD.BCK7BACKUP *.* FREEWARE_DIR:POPPASSD.BCK/SAV/BLOCK=4096/LOG GEGE ̣3V7.1 _BRAHMS::  _$1$DUA7: V6.2  @,*[GEGE.DEVELOP.IUPOP3.POP_PASS]DESCRIP.MMS;10+,. / 4+ -0123KPWO56I~37ta~38tDN9GHJCFLAGS = /DEBUG/NOOPTIMLFLAGS = /DEBUG$OBJECTS = poppassd.obj, netlogin.obj#.ifdef __ALPHA__ ! define for alphaLIBS= /sysexe ! AlphaPREFIX= /prefix=all.else+LIBS = , sys$system:sys.stb/selective ! VAXPREFIX=.endifpoppassd : $(OBJECTS)( link $(LFLAGS) $(OBJECTS) $(LIBS)poppassd.obj : poppassd.c vms.c( cc $(CFLAGS) $(PREFIX) poppassd.c1*[GEGE.DEVELOP.IUPOP3.POP_PASS]FREEWARE_DEMO.TXT;3+, . / 4> P-0123KPWO56 37,I38,yO9GHJ$!$!>$ write sys$output "Install the program and test it from a PC"$!$!3*[GEGE.DEVELOP.IUPOP3.POP_PASS]FREEWARE_README.TXT;3+,. / 4E -0123KPWO56^37T38O9GHJ?POPPASSD V1.0, Utility, Eudora password changer with VMS checksE This program allows the changing of a vms password with the POPPASSD?protocol. Uses all the VMS checks .. -- only tested with ucx --)*[GEGE.DEVELOP.IUPOP3.POP_PASS]MAKEFILE.;1+,. / 4< -0123KPWO56{!77/t|!78#include #include #include #include #include #include #include #include #include #include #include "netlogin.h"!#define debug 0 /* 1 to debug */typedef unsigned char u8;typedef unsigned short u16;typedef unsigned long u32;typedef void * ptr32;/#define checkbug(msg) { if ((status&1) == 0) {\9 fprintf (stderr, "\n\nBUG %s (%08X)\n", msg, status);\, if (debug) abort(); else return status;}}##define on_error if ((status&1)==0)7#define init_desc(s,str) {s.dsc$w_length= strlen(str);\$ s.dsc$a_pointer= (char *) str;\# s.dsc$b_dtype= DSC$K_DTYPE_T;\# s.dsc$b_class= DSC$K_CLASS_S;}:#define init_desc_out(s,str) {s.dsc$w_length= sizeof str;\ s.dsc$a_pointer= str;\# s.dsc$b_dtype= DSC$K_DTYPE_T;\# s.dsc$b_class= DSC$K_CLASS_S;}#ifndef SECSRV$_INTRUDER"#define SECSRV$_INTRUDER 116299715#endif3u32 net_login_uaictx = -1; /* externally visible */7#define NEVER 0xffffff /* no hours allowed for login */typedef enum { LGI$_NOTVALID=0xD3803C, LGI$_BADHOUR=0xD3807C, LGI$_BADDAY=0xD38094, LGI$_RESTRICT =0xD3809C, LGI$_EVADE =0xD380B4, LGI$_ACNTEXPIR =0xD380C4, LGI$_PWDEXPIR =0xD380CC, LGI$_NOSUCHUSER =0xD380F4, LGI$_INVPWD =0xD380FC,% LGI$_DISUSER= 0xD38010C} lgi_status;intOupcase_trim (const struct dsc$descriptor_s * src, struct dsc$descriptor_s *dst){% int status, STR$UPCASE(),STR$TRIM();@ if (src->dsc$w_length > dst->dsc$w_length) return SS$_BADPARAM;1 status= STR$TRIM (dst, src, &dst->dsc$w_length); on_error return status; status= STR$UPCASE (dst, dst); return status;}intJnet_login_hpwd (const struct dsc$descriptor_s *netpwd, u16 salt, u8 crypt,0 const struct dsc$descriptor_s *user, u8 *hash){' char loc_pw_buf[60], loc_user_buf[80];) struct dsc$descriptor_s locpwd, locuser;! int status, SYS$HASH_PASSWORD();$ init_desc_out (locpwd, loc_pw_buf);' status= upcase_trim (netpwd, &locpwd); on_error return status;' init_desc_out (locuser, loc_user_buf);& status= upcase_trim (user, &locuser); on_error return status;B status= SYS$HASH_PASSWORD (&locpwd, crypt, salt, &locuser, hash); checkbug ("$HASH_PASSWORD"); return status;}static lgi_statusIcheck_password (const struct dsc$descriptor_s *netpwd, u8 *pwd, u16 salt,0 u8 crypt, const struct dsc$descriptor_s *user){static const null_pw[8];! int statu POPPASSD.BCK+[GEGE.DEVELOP.IUPOP3.POP_PASS]NETLOGIN.C;91Os, SYS$HASH_PASSWORD(); u8 hash[8];# if (memcmp (pwd, null_pw, 8) == 0) return 1;- else if (netpwd == NULL) return LGI$_INVPWD;: status= net_login_hpwd (netpwd, salt, crypt, user, hash); on_error return; if (memcmp (hash, pwd, 8) == 0) return 1; else return LGI$_INVPWD;}int3net_login (const struct dsc$descriptor_s *username,* const struct dsc$descriptor_s *netpwd,+ const struct dsc$descriptor_s *netpwd2, int netflags, 0 const struct dsc$descriptor_s * source_node,0 const struct dsc$descriptor_s * source_user,. const struct dsc$descriptor * source_addr){/static const $DESCRIPTOR (valid_pw, "");static const u8 noexp[8]; u32 * ctxaddr;1 const struct dsc$descriptor_s * failed_pw= NULL;B u8 encrypt, encrypt2, pwd[8], pwd2[8], expiration[8], curtime[8]; u16 salt, logfails;: /* on caste ces trucs dans un int a la main car c'est */8 /* pas facile de traiter des paquets de 3 octets... */< u32 network_access_p= 0, network_access_s= 0, primedays= 0; struct flags flags; struct 0 {struct {u16 len,cod; ptr32 bufadr, retlen;} encrypt, encrypt2, expiration, flags, logfails, network_access_p, network_access_s, primedays, pwd, pwd2, salt, end; } uai_read= {! {1, UAI$_ENCRYPT, NULL, NULL}," {1, UAI$_ENCRYPT2, NULL, NULL},$ {8, UAI$_EXPIRATION, NULL, NULL}, {4, UAI$_FLAGS, NULL, NULL}," {2, UAI$_LOGFAILS, NULL, NULL},* {3, UAI$_NETWORK_ACCESS_P, NULL, NULL},* {3, UAI$_NETWORK_ACCESS_S, NULL, NULL},# {4, UAI$_PRIMEDAYS, NULL, NULL}, {8, UAI$_PWD, NULL, NULL}, {8, UAI$_PWD2, NULL, NULL}, {2, UAI$_SALT, NULL, NULL}, {0, 0, NULL, NULL}}; struct 0 {struct {u16 len,cod; ptr32 bufadr, retlen;} logfails, end; } uai_logfail= {" {2, UAI$_LOGFAILS, NULL, NULL}, {0, 0, NULL, NULL}}; struct 0 {struct {u16 len,cod; ptr32 bufadr, retlen;} lastlogin_n, end; } uai_logsucc= {% {8, UAI$_LASTLOGIN_N, NULL, NULL}, {0, 0, NULL, NULL}}; int curday; int curhour; int libfunc;6 int status, SYS$GETTIM(), SYS$GETUAI(), SYS$SETUAI(), SYS$SCAN_INTRUSION(), . LIB$CVT_FROM_INTERNAL_TIME(), LIB$GETJPI(); int login_status;< u32 test_access, test_access1; /* copy of xxxxx_access_y */ int cia_flags= 0;; char local_username_buf[32]; /* cf doc $SCAN_INTRUSION */? char local_source_node_buf[1024]; /* cf doc $SCAN_INTRUSION */= char local_source_user_buf[32]; /* cf doc $SCAN_INTRUSION */; struct dsc$descriptor_s local_username, local_source_node, local_source_user;4 init_desc_out (local_username, local_username_buf);1 status= upcase_trim (username, &local_username); on_error return status;: init_desc_out (local_source_node, local_source_node_buf);6 status=upcase_trim (source_node, &local_source_node); on_error return status;: init_desc_out (local_source_user, local_source_user_buf);6 status=upcase_trim (source_user, &local_source_user); on_error return status;# uai_read.encrypt.bufadr= &encrypt;% uai_read.encrypt2.bufadr= &encrypt2;) uai_read.expiration.bufadr= &expiration; uai_read.flags.bufadr= &flags;% uai_read.logfails.bufadr= &logfails;5 uai_read.network_access_p.bufadr= &network_access_p;5 uai_read.network_access_s.bufadr= &network_access_s;' uai_read.primedays.bufadr= &primedays; uai_read.pwd.bufadr= &pwd; uai_read.pwd2.bufadr= &pwd2; uai_read.salt.bufadr= &salt;( uai_logfail.logfails.bufadr= &logfails;* uai_logsucc.lastlogin_n.bufadr= &curtime; POPPASSD.BCK+[GEGE.DEVELOP.IUPOP3.POP_PASS]NETLOGIN.C;91O%  status= SYS$GETTIM (&curtime); checkbug ("$GETTIM") libfunc= LIB$K_DAY_OF_WEEK;B status= LIB$CVT_FROM_INTERNAL_TIME (&libfunc, &curday, &curtime);. checkbug ("LIB$CVT_FROM_INTERNAL_TIME(day)") libfunc= LIB$K_HOUR_OF_DAY;C status= LIB$CVT_FROM_INTERNAL_TIME (&libfunc, &curhour, &curtime);/ checkbug ("LIB$CVT_FROM_INTERNAL_TIME(hour)") 9 if (debug) printf ("check user %.*s, day:%d, hour:%d\n",7 username->dsc$w_length, username->dsc$a_pointer,  curday, curhour);@ /* pour ne pas conserver 2 contextes, on attend une criture */@ /* pour utiliser le contexte car sinon on ne pourra pas */9 /* ecrire avec le contexte sauvegarde de lecture */? ctxaddr = (net_login_uaictx == -1) ? NULL : &net_login_uaictx;? status= SYS$GETUAI (0, ctxaddr, username, &uai_read, 0, 0, 0); if ((status&1) == 0) {, if (status!=RMS$_RNF) checkbug ("$GETUAI")% else login_status= LGI$_NOSUCHUSER; } else{ login_status= 1;# cia_flags |= CIA$M_REAL_USERNAME; }4 if (flags.uai$v_disacnt) login_status=LGI$_DISUSER; if (login_status&1){ failed_pw= &valid_pw;; login_status= check_password (netpwd, pwd, salt, encrypt, & local_username);. if ((login_status&1)== 0) failed_pw= netpwd; } if (login_status&1){? login_status= check_password (netpwd2, pwd2, salt, encrypt2,  & local_username); if ((login_status&1)== 0){) cia_flags |= CIA$M_SECONDARY_PASSWORD; failed_pw= netpwd2; } }8 if ((login_status&1) && memcmp (noexp, expiration, 8)){7 if (memcmp (curtime, expiration, sizeof curtime) < 0) login_status= LGI$_ACNTEXPIR; }* status= SYS$SCAN_INTRUSION (login_status, &local_username, JPI$K_NETWORK,# NULL, /* source terminal */4 &local_source_node, /* source node name */4 &local_source_user, /* source user name */4 source_addr, /* source node id (string) */) failed_pw, /* failed password */% 0, /* parent process name */ 0, /* parent PID */# cia_flags); /* CIA flags */ if ((status&1) == 0){; if (status == SECSRV$_INTRUDER) login_status= LGI$_EVADE;# else checkbug ("$SCAN_INTRUSION") } if (login_status&1) {> if ( ( (primedays >> (curday-1))&1) == 0){ /* primary day */! test_access= network_access_p;" test_access1= network_access_s; } else{! test_access= network_access_s;" test_access1= network_access_p; }. /* un bit a 1 indique que c'est *interdit */) if ( ((test_access>> curhour) &1) == 1) if (test_access == NEVER) if (test_access1 == NEVER)! login_status= LGI$_RESTRICT;# else login_status= LGI$_BADDAY;# else login_status= LGI$_BADHOUR; }* if ( (login_status == LGI$_NOSUCHUSER) ||# (login_status == LGI$_DISUSER) ||" (login_status == LGI$_INVPWD) || (login_status == LGI$_EVADE) ){( if (login_status != LGI$_NOSUCHUSER) { logfails++;, status= SYS$SETUAI (0, &net_login_uaictx, &local_username,  &uai_logfail,0, 0, 0);& checkbug ("$SETUAI (logfailures)"); } login_status= LGI$_NOTVALID; }H else if ( (login_status&1) && ((netflags&NETLOGIN_M_NORECORD) ==0 ) ) {< status= SYS$SETUAI (0, &net_login_uaictx, &local_username, &uai_logsucc, 0, 0, 0); checkbug ("SETUAI (logsucc)"); } return login_status;}Kint net_login_c (const char * user, const char * pass, const char * pass2, int flags,6 const char * source_node, const char * source_user,- const struct dsc$descriptor * s POPPASSD.BCK+[GEGE.DEVELOP.IUPOP3.POP_PASS]NETLOGIN.C;91Oource_addr){ struct dsc$descriptor_s ; user_d, pass_d, pass2_d, source_node_d, source_user_d,; *pass_p, *pass2_p, *source_node_p, *source_user_p; init_desc (user_d, user) if (pass != NULL) { init_desc (pass_d, pass) pass_p= &pass_d; } else pass_p= NULL; if (pass2 != NULL) { init_desc (pass2_d, pass2) pass2_p= &pass2_d; } else pass2_p= NULL; if (source_node != NULL ) {( init_desc (source_node_d, source_node) source_node_p= &source_node_d; } else source_node_p= NULL; if (source_user != NULL ) {( init_desc (source_user_d, source_user) source_user_p= &source_user_d; } else source_user_p= NULL;3 return net_login (&user_d, pass_p, pass2_p, flags,0 source_node_p, source_user_p, source_addr);}**[GEGE.DEVELOP.IUPOP3.POP_PASS]NETLOGIN.H;8+,. / 4H n-0123KPWO56Ehw7Ew8sN9g@*GHJ/**//* netlogin version 1.1/**/#include F#define NETLOGIN_M_NORECORD 1 /* don't record successful login time */&extern unsigned long net_login_uaictx;int9net_login_hpwd (const struct dsc$descriptor_s * password,+ unsigned short salt, unsigned char crypt,@ const struct dsc$descriptor_s *username, unsigned char * pwd);int3net_login (const struct dsc$descriptor_s *username,* const struct dsc$descriptor_s *netpwd,+ const struct dsc$descriptor_s *netpwd2, int netflags, 0 const struct dsc$descriptor_s * source_node,0 const struct dsc$descriptor_s * source_user,/ const struct dsc$descriptor * source_addr);intHnet_login_c ( const char * user, const char * pass, const char * pass2, int flags,5 const char * source_node, const char * source_user,- const struct dsc$descriptor * source_addr);,*[GEGE.DEVELOP.IUPOP3.POP_PASS]NETLOGIN.OBJ;3+,.6/ 461& -0123KPWO256ef878ԅN9g@*GHJ5NETLOGINV1.0 9-OCT-1996 18:03DEC C V5.0-003PSETUAI (logsucc)pP BUG %s (%08X) ZP$SETUAI (logfailures)HP BUG %s (%08X) 8P$SCAN_INTRUSION P BUG %s (%08X) P$GETUAIP BUG %s (%08X) Pcheck user %.*s, day:%d, hour:%d PLIB$CVT_FROM_INTERNAL_TIME(hour)P BUG %s (%08X) PLIB$CVT_FROM_INTERNAL_TIME(day)xP BUG %s (%08X) pP$GETTIMXP BUG %s (%08X) @PHP$HASH_PASSWORDP BUG %s (%08X) PP#/RNETLOGINX upcase_trimxnoname.2noname.4noname.3 status src R dst REsnet_login_hpwdnet_login_hpwd1noname.6$net_login_hpwd2Tnoname.8$%. POPPASSD.BCK,[GEGE.DEVELOP.IUPOP3.POP_PASS]NETLOGIN.OBJ;36 ^޼P<`Q޼P<`PQPNP޼P?`ݬݬSTR$TRIMPˏPP ЭPݬݬ STR$UPCASEPЭPPT^̈́RR|ͰRRͬRRͨRRRRRR>͆RR>̈́RR4RR SYS$GETTIMP͘ˏ͘RR:͘T7DECC$GA_STDERRRb DECC$DFPRINTF DECC$ABORTP͘ͼ1JP ͤ͜͜LIB$CVT_FROM_INTERNAL_TIMEP͘ˏ͘RR7͘ DECC$GA_STDERRRb DECC$DFPRINTF DECC$ABORT ͘ͼ1P͜͜͠7E net_login12 net_login13- noname.32 noname.33 7 noname.31 EC> noname.34P noname.35X noname.36G net_login14 net_login15 net_login16- noname.40 noname.41 7 noname.39 E- noname.38 noname.42 ] noname.37  net_login17- noname.43 noname.44" net_login18a noname.46 ?a noname.457o net_login19 net POPPASSD.BCK,[GEGE.DEVELOP.IUPOP3.POP_PASS]NETLOGIN.OBJ;36G _login20 noname.48 DLIB$CVT_FROM_INTERNAL_TIMEP͘ˏ͘RR7͘DECC$GA_STDERRRb DECC$DFPRINTF DECC$ABORT ͘ͼ1P(ͤ͠ЬRݢ޼Rencrypt  R`encrypt2  R expiration  R flags Rlogfails Rnetwork_access_p R@network_access_s R primedays R pwd R `pwd2 R salt R end RRSTSTSTSTSTSTSTSTST ST ST STS ` len cod bufadr @retlenR logfails R `end RRSTSTS ` len cod bufadr @retlenR  lastlogin_n R `end RRSTSTS ` len cod bufadr @retlen pwd*& pw POPPASSD.BCK,[GEGE.DEVELOP.IUPOP3.POP_PASS]NETLOGIN.OBJ;36vd2*& expiration*&curtime*&8Huai_read  T0 uai_logfail T uai_logsucc Tlocal_username_buf*& local_source_node_buf*&local_source_user_buf*& local_username  Rlocal_source_node !Rlocal_source_user "Rٸctxaddr ٴ failed_pw #Rٰnetwork_access_p٬network_access_s٨ primedays ٤curday٠curhourٜlibfunc ٘statusٔ login_statusِ test_accessٌ test_access1و cia_flags نsaltلlogfailsكencryptقencrypt2 flags $Rusername %R netpwd &R netpwd2 'Rnetflags source_node (R source_user )R( source_addr *R͐$͌ Џ͔ PЏ͔ Џ|͔͔$͔ 8 ͔͔1͔y<̈́RRR̈́0f SYS$SETUAIP͘ˏ͘RR9͘ϕ~DECC$GA_STDERRRb DECC$DFPRINTF DECC$ABORTP͘ͼ1PЏ<͔1ˏ͔RRzˏRRmf SYS$SETUAIP͘ˏ͘RR:͘)DECC$GA_STDERRRb DECC$DFPRINTF DECC$ABORTP͘ͼP͔ͼPͼP^ݬ7  net_login_c  net_login_c35  net_login_c36  net_login_c37$-  noname.77  noname.78B  net_login_c38  net_login_c39$-  noname.79  noname.80B%  net_login_c40%  net_login_c41$-L  noname.81P  noname.82\BU  net_login_c42U  net_login_c43$|  noname.83  noname.84  noname.85 user_d +R pass_d ,Rpass2_d -R source_node_d .R source_user_d /R pass_p 0Rpass2_p 1R source_node_p 2Rټ source_user_p 3R user  pass  pass2  flags source_node G source_user  source_addr 4RC XھEߛ  5R_iobuf _cnt _ptr  @_base  `_flag h_file p_pad1 x_pad26R @7R @ quot  rem8R @ quot  rem9R performance@cia$l_total_messages cia$l_total_exceptions@ cia$l_shows` cia$l_scans cia$l_deletescia$l_performance cia$l_auditscia$l_invalid  POPPASSD.BCK,[GEGE.DEVELOP.IUPOP3.POP_PASS]NETLOGIN.OBJ;36_messagescia$l_intruders cia$l_suspects:Rcia$generic_desc(cia$w_desc_length cia$w_fill1 cia$t_desc_data;Rheader@ cia$l_context cia$r_fill_39 <R=R<S=T=S  cia$l_header_flags cia$r_fill_40 >R?R>S?T?S  &"cia$v_ignore_return" a#"cia$v_reserved_1" !"cia$v_suspects" ""cia$v_intruders" +"cia$v_secondary_password" " cia$v_noaudit" &"cia$v_real_username" " cia$v_fill_1" @Rcontents0! cia$w_length cia$w_unused cia$t_name*&""!AR scan_contentsP+cia$l_parent_id cia$l_job_type@cia$l_login_statusa` cia$r_fill_41 BR cia$r_fill_43 CR cia$r_fill_45 DRcia$w_unused_4cia$r_failed_user ER cia$r_fill_47 FR cia$r_fill_49 GR0 cia$r_fill_51 HRIRBSITIS  cia$t_source_terminal*&DDC cia$r_fill_42 JRDKRJSKTKS  cia$w_source_term_lengthcia$w_unused_1 cia$t_source_term_name*&@@?LRCSLTLS  cia$t_source_user*&$$# cia$r_fill_44 MRNRMSNTNS  cia$w_source_user_lengthcia$w_unused_2 cia$t_source_user_name*& ORDSOTOS  cia$t_source_address*& cia$r_fill_46 PRQRPSQTQS  cia$w_source_addr_lengthcia$w_unused_3 cia$t_source_address_name*&RRESRTRS  cia$w_failed_user_lengthcia$w_unused_5 cia$t_failed_user_name*& SRFSSTSS  cia$t_failed_password*&$$# cia$r_fill_48 TRURTSUTUS  cia$w_failed_pass_lengthcia$w_unused_6 cia$t_failed_pass_name*& VRGSVTVS  cia$t_parent_usero*&$$# cia$r_fill_50 WRXRWSXTXS  cia$w_parent_user_lengthcia$w_unused_7 cia$t_parent_user_name*& YRHSYTYS  cia$t_source_node*& cia$r_fill_52 ZR[RZS[T[S  cia$w_source_node_lengthcia$w_unused_8 cia$t_source_node_name*&\R show_out  POPPASSD.BCK,[GEGE.DEVELOP.IUPOP3.POP_PASS]NETLOGIN.OBJ;36Oeput! cia$l_status cia$l_returned_context@cia$q_expiration_time*& cia$r_fill_53 ]Rcia$l_attempt_count cia$r_fill_55 ^R_R]S_T_S   cia$l_flags cia$r_fill_54 `RaR`SaTaS  !"cia$v_intruder" " cia$v_suspect"  " cia$v_network" ""cia$v_term_user" !"cia$v_terminal" !"cia$v_username" " cia$v_fill_2" bR^SbTbS 0!cia$t_user_spec*&&&% cia$r_fill_56 cRdRcSdTdS 0!cia$w_user_spec_lengthcia$w_unused_8 cia$t_user_spec_name*&""!eR breakin_blockcia$l_break_flags cia$l_break_count@cia$q_break_time*&fRcia$generic_reply cia$l_reply_statusgR4SgT*SgTgSdsc$descriptor@ dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer hR3ShT2ShT1ShT0ShT/ShT.ShT-ShT,ShT+ShT)ShT(ShT'ShT&ShT%ShT#ShT"ShT!ShT ShT ShTShTShTShTShTShTShTShTShThSdsc$descriptor_s@ dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer iRdsc$descriptor_d@ dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer jRdsc$descriptor_a dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer @ dsc$b_scaleH dsc$b_digitsP dsc$b_aflags kRX dsc$b_dimct` dsc$l_arsizelRkSlTlS $"dsc$v_fl_binscale" !"dsc$v_fl_redim" ""dsc$v_fl_column" !"dsc$v_fl_coeff" ""dsc$v_fl_bounds" mRdsc$descriptor_p@ dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer nRdsc$descriptor_sd` dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer @ dsc$b_scaleH dsc$b_digitsP dsc$b_sflags oRpRoSpTpS $"dsc$v_fl_binscale" qRdsc$descriptor_nca dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer @ dsc$b_scaleH dsc$b_digitsP dsc$b_aflags rRX dsc$b_dimct` dsc$l_arsizesRrSsTsS $"dsc$v_fl_binscale" !"dsc$v_fl_redim" tRdsc$descriptor_vs@dsc$w_maxstrlen dsc$b_dtype dsc$b_class dsc$a_pointer uRdsc$descriptor_vsadsc$w_maxstrlen dsc$b_dtype dsc$b_class dsc$a_pointer @ dsc$b_scaleH dsc$b_digitsP dsc$b_aflags vRX dsc$b_dimct` dsc$l_arsizewRvSwTwS _ )[GEGE.DEVELOP.IUPOP3.POP_PASS]MKFREEWARIW0E~;1v$u ߙp6K&dq e:X?}x]MhDY3J6סS3?V`a40y`Gڌ{+wyrƸ&7fYy/u%eBe~ ?^Tl`Or٩QV/`8=d@&ERI{\5#~5zF\]|d•_A%c8AZ^|r([Y2_D@;my->6)r(|-BFgbd2K!T~iHNRQ]OpiW;Sn*z2t94NU!g"CAWjxQslm \;-ۃVʄ:ۄ 0*n+QvYFZ|cL;P1aQA>'*?~yG9hV$ d{.O5J y;T7ʲi[ydLYo&XvB WG[tqn~@]՞րJU䲛rmҝ X2B^bIz;1.ɯly#,`LaeN8PYᔲlccފ2hͷ gۓ Tq:V_9oKYgj/k|@܋\)?iۊD-PZ6U"93k|>+cY*9:qR>'{X+>keHPk/i^1 1NDNqg_{~m%!QE!tת+3(y_W.`5napDYikaN[-8e*/|W-jZ;,MEXAmk3%*Q$G! VUIg @6mɔ ~j>UR&a͢|$BntStm.D.j6}IX9&(9'A/▊|¨a`(@ k{S@4݅}@@`ٕf1"A󌙌FPEzpRC.M̵n1 /gtUŻ/[$7ܯKI  +me{%PWO.56l37m38w9O9GHJ  POPPASSD.BCK,[GEGE.DEVELOP.IUPOP3.POP_PASS]NETLOGIN.OBJ;36& $"dsc$v_fl_binscale" !"dsc$v_fl_redim" xRdsc$descriptor_ubs` dsc$w_length dsc$b_dtype dsc$b_class dsc$a_base @ dsc$l_posyRdsc$descriptor_uba dsc$w_length dsc$b_dtype dsc$b_class dsc$a_base @ dsc$b_scaleH dsc$b_digitsP dsc$b_aflags zRX dsc$b_dimct` dsc$l_arsize{RzS{T{S $"dsc$v_fl_binscale" !"dsc$v_fl_redim" |Rdsc$descriptor_sb dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer @ dsc$l_sb_l1` dsc$l_sb_u1}Rdsc$descriptor_ubsb dsc$w_length dsc$b_dtype dsc$b_class dsc$a_base @ dsc$l_pos` dsc$l_ubsb_l1 dsc$l_ubsb_u1~R jpictldef  jpi$r_fill_45 RRSTS  jpi$l_jpictlflgs jpi$r_fill_46 RRSTS )"jpi$v_no_target_inswap" &"jpi$v_no_target_ast" 1-"jpi$v_ignore_target_status"  " jpi$v_fill_47" R jpilgidef  jpi$r_fill_48 RRSTS  jpi$l_jpilgiflgs jpi$r_fill_49 RRSTS *"jpi$v_new_mail_at_login" )"jpi$v_password_changed" )"jpi$v_password_expired" )"jpi$v_password_warning" u*"jpi$v_password2_changed" *"jpi$v_password2_expired" *"jpi$v_password2_warning"  " jpi$v_fill_50" Rdt_print_fields$"lib$v_time_fields" $"lib$v_date_fields" " lib$v_fill_0" Rdt_default_fields" lib$v_year" " lib$v_month" " lib$v_day" " lib$v_hour" " lib$v_minute" e" lib$v_second" #"lib$v_hundredths" " lib$v_fill_1" R$STSflags " uai$v_disctly" " uai$v_defcli"  " uai$v_lockpwd" #"uai$v_restricted"  " uai$v_disacnt" ""uai$v_diswelcom"  " uai$v_dismail" " uai$v_nomail" " uai$v_genpwd" $"uai$v_pwd_expired" %"uai$v_pwd2_expired" " uai$v_audit" ""uai$v_disreport" %"uai$v_disreconnect" ""uai$v_autologin" ,"uai$v_disforce_pwd_change"  " uai$v_captive" !"uai$v_disimage" ""uai$v_dispwddic" ""uai$v_dispwdhis" ""uai$v_defclsval"  " uai$v_fill_16" R primedays" uai$v_monday"  " uai$v_tuesday" ""uai$v_wednesday" !"uai$v_thursday" " uai$v_friday" !"uai$v_saturday" " uai$v_sunday"  " uai$v_fill_17" R < LGI$_NOTVALID| LGI$_BADHOUR LGI$_BADDAY LGI$_RESTRICT LGI$_EVADEĀLGI$_ACNTEXPIR̀ LGI$_PWDEXPIRLGI$_NOSUCHUSER LGI$_INVPWD 8 LGI$_DISUSERDECC$GA_STDERRdecc$ga_stderr 5Tnet_login_uaictxśHEhwn4USR$ADMIN:[GEGE.DEVELOP.IUPOP3.POP_PASS]NETLOGIN.H;8: \XE*&CAL$SYSDAT:[DECC$LIB.INCLUDE]SSDEF.H;8; eED'CAL$SYSDAT:[DECC$LIB.INCLUDE]UAIDEF.H;8; \"LEN^'CAL$SYSDAT:[DECC$LIB.INCLUDE]RMSDEF.H;8= ̏gE)CAL$SYSDAT:[DECC$LIB.INCLUDE]LIBDTDEF.H;8; BE"'CAL$SYSDAT:[DECC$LIB.INCLUDE]JPIDEF.H;8<,'E'(CAL$SYSDAT:[DECC$LIB.INCLUDE]DESCRIP.H;8;LgE'CAL$SYSDAT:[DECC$LIB.INCLUDE]CIADEF.H;9;\_E $'CAL$SYSDAT:[DECC$LIB.INCLUDE]STRING.H;8:AbeE&CAL$SYSDAT:[DECC$LIB.INCLUDE]TYPES.H;8;|^E j'CAL$SYSDAT:[DECC$LIB.INCLUDE]STDLIB.H;8:| ^Er&CAL$SYSDAT:[DECC$LIB.INCLUDE]STDIO.H;8;,9E'CAL$SYSDAT:[DECC$LIB.INCLUDE]ASSERT.H;9I1K5USR$ADMIN:[GEGE.DEVELOP.IUPOP3.POP_PASS]NETLOGIN.C;91  2   p   & !            r             P NET_LOGIN_UAICTXDECC$GA_STDERRLIB$CVT_FROM_INTERNAL_TIMESYS$SCAN_INTRUSION SYS$SETUAI SYS$GETUAI SYS$GETTIMSYS$HASH_PASSWORDSTR$TRIM STR$UPCASE UPCASE_TRIM NET_LOGINNET_LOGIN_HPWD DECC$STRLEN DECC$MEMCMP DECC$ABORT DECC$DPRINTF DECC$DFPRINTF X UPCASE_TRIM NET_LOGIN_HPWD d| NET_LOGIN NET_LOGIN_C $CODE$DATANET_LOGIN_UAICTXE DECC$STRLENPЬլ)ݬ DECC$STRLENPЬ랭PPPլ 'ݬ  DECC$STRLENPЬ 㞭PPլ'ݬ DECC$STRLENPЬܐڐ۞PPլ'ݬ DECC$STRLENPЬԐҐӞPPݬݭݭݬݭݭ NET_LOGINPPЭPXb_class dsc$a_pointer hR3ShT2ShT1ShT0ShT/ShT.ShT-ShT,ShT+ShT)ShT(ShT'ShT&ShT%ShT#ShT"ShT!ShT ShT +*[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.C;14+,7.-/ 4N-),-0123KPWO*56+/⦕7+⦕8"N9g@*GHJ/* * poppassd.c *- * A Eudora and NUPOP change password server. * * John Norstad* * Academic Computing and Network Services * Northwestern University * j-norstad@nwu.edu *B * Based on earlier versions by Roy Smith and Daniel * L. Leavitt . * G * Doesn't actually change any passwords itself. It simply listens forF * incoming requests, gathers the required information (user name, oldG * password, new password) and executes /bin/passwd, talking to it POPPASSD.BCK7+[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.C;14N- overG * a pseudo-terminal pair. The advantage of this is that we don't needF * to have any knowledge of either the password file format (which mayD * include dbx files that need to be rebuilt) or of any file lockingI * protocol /bin/passwd and cohorts may use (and which isn't documented). *G * The current version has been tested at NU under SunOS release 4.1.2 G * and 4.1.3, and under HP-UX 8.02 and 9.01. We have tested the server ( * with both Eudora 1.3.1 and NUPOP 2.0. *E * Other sites report that this version also works under AIX and NIS, * and with PC Eudora. *H * Note that unencrypted passwords are transmitted over the network. IfG * this bothers you, think hard about whether you want to implement theI * password changing feature. On the other hand, it's no worse than whatI * happens when you run /bin/passwd while connected via telnet or rlogin.I * Well, maybe it is, since the use of a dedicated port makes it slightly@ * easier for a network snooper to snarf passwords off the wire. *K * NOTE: In addition to the security issue outlined in the above paragraph,F * you should be aware that this program is going to be run as root byJ * ordinary users and it mucks around with the password file. This shouldH * set alarms off in your head. I think I've devised a pretty foolproofL * way to ensure that security is maintained, but I'm no security expert andI * you would be a fool to install this without first reading the code andJ * ensuring yourself that what I consider safe is good enough for you. If3 * something goes wrong, it's your fault, not mine. *> * The front-end code (which talks to the client) is directly M * descended from Leavitt's original version. The back-end pseudo-tty stuff D * (which talks to /bin/password) is directly descended from Smith'sG * version, with changes for SunOS and HP-UX by Norstad (with help from@ * sample code in "Advanced Programming in the UNIX Environment"H * by W. Richard Stevens). The code to report /bin/passwd error messagesI * back to the client in the final 500 response, and a new version of the1 * code to find the next free pty, is by Norstad. * K * Should be owned by root, and executable only by root. It can be started: * with an entry in /etc/inetd.conf such as the following: *C * poppassd stream tcp nowait root /usr/local/bin/poppassd poppassd *  * and in /etc/services: *  * poppassd 106/tcp *H * Logs to the local2 facility. Should have an entry in /etc/syslog.conf * like the following: *$ * local2.err /var/adm/poppassd-log */ /* Modification history. * * 06/09/93. Version 1.0. * * 06/29/93. Version 1.1.A * Include program name 'poppassd' and version number in initial  * hello message.A * Case insensitive command keywords (user, pass, newpass, quit).? * Fixes problem reported by Raoul Schaffner with PC Eudora.E * Read 'quit' command from client instead of just terminating after  * password change.< * Add new code for NIS support (contributed by Max Caines). * * 08/31/93. Version 1.2.E * Generalized the expected string matching to solve several problems@ * with NIS and AIX. The new "*" character in pattern strings3 * matches any sequence of 0 or more characters.@ * Fix an error in the "getemess" function which could cause the@ * program to hang if more than one string was defined in the * P2 array. */5/* Steve Dorner's description of the simple protocol: *D * The server's responses should be like a POPPASSD.BCK7+[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.C;14N- Y n FTP server's responses; A * 1xx for in progress, 2xx for success, 3xx for more informationF * needed, 4xx for temporary failure, and 5xx for permanent failure. 9 * Putting it all together, here's a sample conversation: * * S: 200 hello\r\n * E: user yourloginname\r\n- * S: 300 please send your password now\r\n$ * E: pass yourcurrentpassword\r\n" * S: 200 My, that was tasty\r\n# * E: newpass yournewpassword\r\n * S: 200 Happy to oblige\r\n * E: quit\r\n * S: 200 Bye-bye\r\n * S:  * E:  */ #define VERSION "1.2"#define SUCCESS 1#define FAILURE 0#define BUFSIZE 512 #ifndef VMS#include #include #include #include #include #include #include #include #include #else#include #include #include "vms.c"#endif#include #include #include #include #include #include #include A/* Prompt strings expected from the "passwd" command. If you wantJ * to port this program to yet another flavor of UNIX, you may need to add * more prompt strings here. *? * Each prompt is defined as an array of pointers to alternate > * strings, terminated by an empty string. In the strings, '*'A * matches any sequence of 0 or more characters. Pattern matching * is case-insensitive. */static char *P1[] = {"Old password:",. "Changing password for *.\nOld password:",3 "Changing password for * on *.\nOld password:",7 "Changing NIS password for * on *.\nOld password:",1 "Changing password for *\n*'s Old password:", ""};static char *P2[] = {"\nNew password:", "\n*'s New password:", ""};static char *P3[] = {"\nRe-enter new password:", "\nRetype new password:",& "\nEnter the new password again:",$ "\n*Re-enter *'s new password:", "\nVerify:", ""}; static char *P4[] = {"\n", "NIS entry changed on *\n", ""}; #ifndef VMS/* * dochild *; * Do child stuff - set up slave pty and execl /bin/passwd. *C * Code adapted from "Advanced Programming in the UNIX Environment" * by W. Richard Stevens. * */ dochild (master, slavedev, user) int master;char *slavedev, *user;{ int slave; struct termios stermios;> /* Start new session - gets rid of controlling terminal. */  if (setsid() < 0) {+ syslog(LOG_ERR, "setsid failed: %m"); return(0); }@ /* Open slave pty and acquire as new controlling terminal. */. if ((slave = open(slavedev, O_RDWR)) < 0) {2 syslog(LOG_ERR, "can't open slave pty: %m"); return(0); } /* Close master. */ close(master);+ /* Make slave stdin/out/err of child. */3 if (dup2(slave, STDIN_FILENO) != STDIN_FILENO) {1 syslog(LOG_ERR, "dup2 error to stdin: %m"); return(0); }5 if (dup2(slave, STDOUT_FILENO) != STDOUT_FILENO) {2 syslog(LOG_ERR, "dup2 error to stdout: %m"); return(0); }5 if (dup2(slave, STDERR_FILENO) != STDERR_FILENO) {2 syslog(LOG_ERR, "dup2 error to stderr: %m"); return(0); } if (slave > 2) close(slave);K /* Set proper terminal attributes - no echo, canonical input processing,& no map NL to CR/NL on output. */% if (tcgetattr(0, &stermios) < 0) {- syslog(LOG_ERR, "tcg POPPASSD.BCK7+[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.C;14N-etattr error: %m"); return(0); }8 stermios.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL); stermios.c_lflag |= ICANON; stermios.c_oflag &= ~(ONLCR);. if (tcsetattr(0, TCSANOW, &stermios) < 0) {- syslog(LOG_ERR, "tcsetattr error: %m"); return(0); } /* Fork /bin/passwd. */< if (execl("/bin/passwd", "passwd", user, (char*)0) < 0) {4 syslog(LOG_ERR, "can't exec /bin/passwd: %m"); return(0); }}/* * findpty() *K * Finds the first available pseudo-terminal master/slave pair. The masterL * side is opened and a fd returned as the function value. A pointer to theJ * name of the slave side (i.e. "/dev/ttyp0") is returned in the argument,K * which should be a char**. The name itself is stored in a static buffer. *5 * A negative value is returned on any sort of error. *L * Modified by Norstad to remove assumptions about number of pty's allocated * on this UNIX box. */findpty (slave) char **slave;{ int master;$ static char *line = "/dev/ptyXX"; DIR *dirp; struct dirent *dp; dirp = opendir("/dev");) while ((dp = readdir(dirp)) != NULL) {J if (strncmp(dp->d_name, "pty", 3) == 0 && strlen(dp->d_name) == 5) {! line[8] = dp->d_name[3];! line[9] = dp->d_name[4];2 if ((master = open(line, O_RDWR)) >= 0) { line[5] = 't'; *slave = line; closedir(dirp); return (master); } } } closedir(dirp); return (-1);}#endif/* * writestring() *2 * Write a string in a single write() system call. */writestring (fd, s)char *s;{ int l; l = strlen (s); write (fd, s, l);} #ifndef VMS/* * talktochild() *K * Handles the conversation between the parent and child (password program) * processes. *I * Returns SUCCESS is the conversation is completed without any problems,J * FAILURE if any errors are encountered (in which case, it can be assumed% * that the password wasn't changed). */3talktochild (master, user, oldpass, newpass, emess) int master;'char *user, *oldpass, *newpass, *emess;{ char buf[BUFSIZE]; char pswd[BUFSIZE+1]; int m, n; *emess = 0;2 if (!expect(master, P1, buf)) return FAILURE;$ sprintf(pswd, "%s\n", oldpass); writestring(master, pswd);2 if (!expect(master, P2, buf)) return FAILURE;$ sprintf(pswd, "%s\n", newpass); writestring(master, pswd);$ if (!expect(master, P3, buf)) {" getemess(master, P2, buf); strcpy(emess, buf); return FAILURE; } writestring(master, pswd);2 if (!expect(master, P4, buf)) return FAILURE; return SUCCESS;}/* * match () *B * Matches a string against a pattern. Wild-card characters '*' inH * the pattern match any sequence of 0 or more characters in the string.! * The match is case-insensitive. * * Entry: str = string. * pat = pattern. * * Exit: function result = * 0 if no match.> * 1 if the string matches some initial segment of * the pattern.8 * 2 if the string matches the full pattern. */match (str, pat) char *str; char *pat;{ int result; 5 for (; *str && *pat && *pat != '*'; str++, pat++) 3 if (tolower(*str) != tolower(*pat)) return 0;+ if (*str == 0) return *pat == 0 ? 2 : 1; if (*pat == 0) return 0;L for (; *str; str++) if ((result POPPASSD.BCK7+[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.C;14N-m = match(str, pat+1)) != 0) return result; return 0; }/* * expect () *D * Reads 'passwd' command output and compares it to expected output. *% * Entry: master = fid of master pty.F * expected = pointer to array of pointers to alternate expected5 * strings, terminated by an empty string." * buf = pointer to buffer. *F * Exit: function result = SUCCESS if output matched, FAILURE if not.- * buf = the text read from the slave. *A * Text is read from the slave and accumulated in buf. As long asA * the text accumulated so far is an initial segment of at least @ * one of the expected strings, the function continues the read.= * As soon as one of full expected strings has been read, theC * function returns SUCCESS. As soon as the text accumulated so farC * is not an initial segment of or exact match for at least one of 6 * the expected strings, the function returns FAILURE. */expect (master, expected, buf) int master;char **expected; char *buf;{ int n, m; char **s; int initialSegment; int result; n = 0; buf[0] = 0; while (1) { if (n >= BUFSIZE-1) {@ syslog(LOG_ERR, "buffer overflow on read from child"); return FAILURE; }, m = read(master, buf+n, BUFSIZE-1-n); if (m < 0) {7 syslog(LOG_ERR, "read error from child: %m"); return FAILURE; } n += m; buf[n] = 0; initialSegment = 0;+ for (s = expected; **s != 0; s++) {# result = match(buf, *s);* if (result == 2) return SUCCESS;: initialSegment = initialSegment || result == 1;  }+ if (!initialSegment) return FAILURE; }}/* * getemess() *D * This function accumulates a 'passwd' command error message issued6 * after the first copy of the password has been sent. *% * Entry: master = fid of master pty.F * expected = pointer to array of pointers to alternate expectedB * strings for first password prompt, terminated by an  * empty string.> * buf = pointer to buffer containing text read so far. *6 * Exit: buf = the error message read from the slave. *D * Text is read from the slave and accumulated in buf until the textE * at the end of the buffer is an exact match for one of the expectedI * prompt strings. The expected prompt string is removed from the buffer,G * returning just the error message text. Newlines in the error message * text are replaced by spaces. */ getemess (master, expected, buf) int master;char **expected; char *buf;{ int n, m; char **s; char *p, *q; n = strlen(buf); while (1) {) for (s = expected; **s != 0; s++) {! for (p = buf; *p; p++) {$ if (match(p, *s) == 2) { *p = 0;? for (q = buf; *q; q++) if (*q == '\n') *q = ' '; return; } } } if (n >= BUFSIZE-1) {> syslog(LOG_ERR, "buffer overflow on read from child"); return; }+ m = read(master, buf+n, BUFSIZE+1-n); if (m < 0) {5 syslog(LOG_ERR, "read error from child: %m"); return; } n += m; buf[n] = 0; }}WriteToClient (fmt, va_alist) char *fmt;va_dcl{ va_list ap;  va_start (ap);" vfprintf (stdout, fmt, ap); fputs ("\r\n", stdout ); fflush (stdout); POPPASSD.BCK7+[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.C;14N- va_end (ap);}ReadFromClient (line) char *line;{ char *sp; int i; strcpy (line, "");$ fgets (line, BUFSIZE, stdin);: if ((sp = strchr(line, '\n')) != NULL) *sp = '\0'; : if ((sp = strchr(line, '\r')) != NULL) *sp = '\0';  ; /* convert initial keyword on line to lower case. */ > for (sp = line; isalpha(*sp); sp++) *sp = tolower(*sp);}int chkPass (user, pass, pw) char *user; char *pass;struct passwd *pw;{F /* Compare the supplied password with the password file entry */B if (strcmp (crypt (pass, pw->pw_passwd), pw->pw_passwd) != 0) return (FAILURE); else  return (SUCCESS);}#endifmain (argc, argv) int argc; char *argv[];{ char line[BUFSIZE]; char user[BUFSIZE]; char oldpass[BUFSIZE]; char newpass[BUFSIZE]; char emess[BUFSIZE]; #ifndef VMS char *slavedev;$ struct passwd *pw, *getpwnam(); int c, master; pid_t pid, wpid; int wstat;#endif% *user = *oldpass = *newpass = 0; 7 if (openlog ("poppassd", LOG_PID, LOG_LOCAL2) < 0) {2 WriteToClient ("500 Can't open syslog."); exit (1); } E WriteToClient ("200 poppassd v%s hello, who are you?", VERSION); ReadFromClient (line);% sscanf (line, "user %s", user) ; if (strlen (user) == 0) {2 WriteToClient ("500 Username required."); exit(1);p }1 WriteToClient ("200 your password please."); ReadFromClient (line);e( sscanf (line, "pass %s", oldpass) ; if (strlen (oldpass) == 0)d {2 WriteToClient ("500 Password required."); exit(1);l } #ifdef VMS/ if (chkPass (user, oldpass, emess)==FAILURE) {p# WriteToClient ("500 %s.", emess);o exit (1);n }#elsea( if ((pw = getpwnam (user)) == NULL) {7 WriteToClient ("500 Unknown user, %s.", user);g exit(1);p }0 if (chkPass (user, oldpass, pw) == FAILURE) {: WriteToClient ("500 Old password is incorrect."); exit(1);u }#endif5 WriteToClient ("200 your new password please.");  ReadFromClient (line);s* sscanf (line, "newpass %s", newpass); t /* new pass required */ if (strlen (newpass) == 0)a {6 WriteToClient ("500 New password required."); exit(1);E } #ifdef VMS3 if (setPass (user, newpass, emess)==FAILURE) {o8 WriteToClient ("500 Password not changed: %s.", emess); exit (1); }#elsew. /* get pty to talk to password program */, if ((master = findpty (&slavedev)) < 0) {, syslog (LOG_ERR, "can't find pty");> WriteToClient("500 Server busy - try again later."); exit (1); } 9 /* fork child process to talk to password program */a8 if ((pid = fork()) < 0) /* Error, can't fork */ {7 syslog (LOG_ERR, "can't fork for passwd: %m");iK WriteToClient ("500 Server error (can't fork passwd), get help!");a exit (1); } if (pid) /* Parent */ {N sleep (1); /* Make sure child is ready. Is this really needed? */L if (talktochild (master, user, oldpass, newpass, emess) == FAILURE) {= syslog (LOG_ERR, "failed attempt by %s", user);o# if (*emess == '\0') {iC WriteToClient ("500 Unable to change  POPPASSD.BCK7+[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.C;14N-Tj %password." );o } else {*1 WriteToClient ("500 %s", emess); } exit(1); }3 if ((wpid = waitpid (pid, &wstat, 0)) < 0)i {H syslog (LOG_ERR, "wait for /bin/passwd child failed: %m");J WriteToClient ("500 Server error (wait failed), get help!"); exit (1);m } if (pid != wpid)U {G syslog (LOG_ERR, "wrong child (/bin/passwd waited for!");sJ WriteToClient ("500 Server error (wrong child), get help!"); exit (1); }$ if (WIFEXITED (wstat) == 0) {> syslog (LOG_ERR, "child (/bin/passwd) killed?");J WriteToClient ("500 Server error (funny wstat), get help!"); exit (1);a }& if (WEXITSTATUS (wstat) != 0) {H syslog (LOG_ERR, "child (/bin/passwd) exited abnormally");L WriteToClient ("500 Server error (abnormal exit), get help!"); exit (1);* }#endif; syslog (LOG_ERR, "password changed for %s", user);< WriteToClient ("200 Password changed, thank-you."); ReadFromClient (line);- if (strncmp(line, "quit", 4) != 0) {p3 WriteToClient("500 Quit required.");c exit (1); } f# WriteToClient("200 Bye.");g exit (0); #ifndef VMS* } else /* Child */ { /*.J * Become the user trying who's password is being changed. We'reJ * about to exec /bin/passwd with is setuid root anyway, but thisG * way it looks to the child completely like it's being run byL * the normal user, which makes it do its own password verificationJ * before doing any thing. In theory, we've already verified theN * password, but this extra level of checking doesn't hurt. Besides,H * the way I do it here, if somebody manages to change somebodyK * else's password, you can complain to your vendor about securityf * holes, not to me!a */ setuid (pw->pw_uid);a setgid (pw->pw_gid); * dochild (master, slavedev, user); }#endif} ease send your password now\r\n$ * E: pass yourcurrentpassword\r\n" * S: 200 My, that was tasty\r\n# * E: newpass yournewpassword\r\n * S: 200 Happy to oblige\r\n * E: quit\r\n * S: 200 p-*[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.COM;13+,9. / 4> -0123KPWO56. 7uP 8tK O9g@*GHJlNl]0 ]0  0B 0d $!2$! sous UCX definir un service tcp sur le port 106($! pointant vers ce fichier de commande.$!>$! ce fichier de commande doit etre dans le meme directory que$! poppassd.exe$!<$ exe= f$parse ("poppassd.exe;",f$environment ("procedure"))<$ log= f$parse ("poppassd.log;",f$environment ("procedure"))$ def sys$output 'log' $ set ver $ sho proc$ show log/proc $ set nover$! define sys$input sys$net:$! define sys$output sys$net:$ run 'exe'/nodebug-*[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.EXE;27+,h.~/ 4~xF-0123 KPWO564p~37wt~38N9GHJ@ POPPASSD.BCKh-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.EXE;27~0D`0205~3 hvbu@bPOPPASSDV1.0(~3V11-39  ?!! DECC$SHR_001Q! MTHRTL_001$+CMA$TIS_SHR_001! LIBRTL_001"! SECURESHR_001#!SECURESHRP_0018bcr SYS$NET:Assign: %08x QIOW: %08x QIOW: %04x net login %s %s returns %08X User Authorisation FailureTout va bienVMS$PASSWORD_DICTIONARY$GETUAI(flags) returns %08XPassword lockedPassword cannot be chosen by userinvalid passwordpassword too longPassword in dictionary- %08XError encoding password (%08X)Password in history file (%08X)Error setting password (%08X)Old password:Changing password for *. Old password:Changing password for * on *. Old password:Changing NIS password for * on *. Old password:Changing password for * *'s Old password: New password: *'s New password: Re-enter new password: Retype new password: Enter the new password again: *Re-enter *'s new password: Verify: NIS entry changed on * poppassd500 Can't open syslog.200 poppassd v%s hello, who are you?1.2user %s500 Username required.200 your password please.pass %s500 Password required.500 %s.200 your new password please.newpass %s500 New password required.500 Password not changed: %s.password changed for %s200 Password changed, thank-you.quit500 Quit required.200 Bye.#IP^P^ެPPPݭݬfP`PP`^R ϞPPݭϜ' Pݭe<\\^wP ^RЬݭݭ1b PˏPP?P>P<`PPPPխ%>P<`PPPЭPPP PPíPPP^ݬݬ0 Pe0 PP^ެPPPݬ =>P7P^ݏݬsPЭP޼Q@aP|4^uV`}ϭRRPխнح%^(nPRRݭݬݬfPݭݭݬ!*ˏRR&ݬ  (ݬ PP<΀^(0$(M}_}YЬݬPЬݬPЬRR>RRОRRܞRRvPˏRRݭϖݬ +1$RRϕݬ  1PRRRR~ݬ 1ЬRR|PSRˏBcRRPRRPխ-RR$$RR_(ݬ k1dRRRRݬ POPPASSD.BCKh-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.EXE;27~b|Pݬ 31,RR>Y:PˏRRݭݬ 1P~2~PˏRRݭϢݬ 1RR::PˏRRݭρݬ ^X\PˏRRݭTݬ  PP͔P^ݬPݭݬݬ^ ^V*PO&wK W]UaPD3FI P0yPD.zxPV@P!PaK P BUG %s (%08X) $HASH_PASSWORD  BUG %s (%08X) $GETTIM BUG %s (%08X) LIB$CVT_FROM_INTERNAL_TIME(day) BUG %s (%08X) LIB$CVT_FROM_INTERNAL_TIME(hour)check user %.*s, day:%d, hour:%d BUG %s (%08X) $GETUAI BUG %s (%08X) $SCAN_INTRUSION BUG %s (%08X) $SETUAI (logfailures) BUG %s (%08X) SETUAI (logsucc)#$%. ^޼P<`Q޼P<`PQPNP޼P?`ݬݬ: PˏPP ЭPݬݬ PЭPPT^̈́RR|ͰRRͬRRͨRRRRRR>͆RR>̈́RR4RRxP͘ˏ͘RR:͘T7RbN IP͘ͼ1JP ͤ͜͜jP͘ˏ͘RR7͘ &Rb  ͘ͼ1P͜͜͠P͘ˏ͘RR7͘Rb ~ ͘ͼ1P(ͤ͠ЬRݢ޼Rf ͸ PfRR͸Hݬ͸kP͘ˏ͘RR`͘Iˏ͘RR7͘iPRb  ͘ͼ1P PЏ͔͔͈RR͈RR Џ 8 ͔ˏ͔RR?RRʹ̓~2͆~ݬτP͔ˏ͔RRЬʹˏ͔RRD͂~2͆~ݬ AP͔ˏ͔RR͈RR͈Ь ʹˏ͔RR6σPP ЏĀ͔͈ʹݬ͔ P͘ˏ͘RRa͘×Џ͔KPˏ͘RR:͘ϫ9Rb P͘ͼ1Pˏ͔RR1ͤSS RSRͨRʏRRͰ͐ͬ͌Pͬ͐Ͱ͌͠ R͠R͐RʏRR8͐$͌ Џ͔_5vKu\):5 t]w ͖ I8`$h9ܟs% ^¹ŨMn'|鉎UKb- ?Q^-.!2>WAoǹ 7CIRcxityW/ ߯]47Ok4Buo=M,h,Ľ|r@=y[ݴFb&\˨=˻!1d^5O+zw)-<;Ff5 F 愷aNnE>r`/y3dQX1#f:XCRʃzzuHvG+_?6o5E}1ArDҒ;$jdռTG@ Yʡ52X!mWF:D^cT\'RwдϠE)Cp Lx+T-wdS43 }c%l0%@_=\IkpKPiEJTV `[ faݲ9,^E^\6x]:b2u~gH->TCb2&_EqjZbQP`;I}Է>+8:3, ~kxHjh!a+n2+(W f.@EOX_ +U4(=aF-aBNcqǎ yf}ݵ0eWKEOCά+j|hՀ!FdڛMR]s1y(/3;8qpkC%r 6o?ALD&̣ ezҐ6-i,uݲ2z{RYt둪< )ޒc8΀{~FMX6Z;~nv~\j[PטKAAJ:>q(s8MT<>|w)$J%K%]D!+fl}z3PJO~hbZ> *iZX,e=?3H%PzC}`lGn7K]~tCFRql/xt67$5g8_el;i?;l_-e&uSJ X"/xE}YcX_;V;8'F{7P@GE}QS|Aa9k>%q_qR\3o]@z1{7]kx.y_c}cr Y%9Iw^NYz$8Hzb ]RI~< B_uq.yg3I gX _ E]{8`>)& c`o'd*DqeQS`j(PXVt8~0|?*DdG75Om:QRK VD%u +Gypu+9C.cc%'eh;YMVY_WlSj9u%;j{d/ OP&Szp@,#7H?/PB4eeNYNi\ OSY UTXZRe]aB{U5%0_ /|MI_=6l>m3f5i]m-v(3I yzGHG=/0lyV3w8j"E~HZ"m<`'ڮG5[la@mAIH;9J*F?(3tz%/ k~?7.!c ~X?h/3" 4/v {$%,a?4w {I`m"fDbXoKu'Mjȩ-xP䊨ښB2Nzv8:]U oľ׈Gm9`% a;gě"cęk;r;Ӕ0z$̘F󛖻!qP\.ڞz>~۔<驍HР['!>c.{vMz#kl&僷E׭Y޾XS2K4p3XZ[#ɰ;!b´Ay_ءͶ^D@$ɖC1tancǻIZ4WϵF NrO0#X_؟kjCpz WePEgֱ/7 PXZڀ}`8J|.X>MPC6P^1|;&yN7O!UJ[rcSC ZItA[ d:,ns,'&H7@?0/  *U _7phl$;(p#bg!݁kךۼ(LVmx/.E<ٖeNZqbsGo"R<)Lۈ~bd-?􄍚<HYs&5+r^`YAuSM4bn.KX}F&EVH~go!OHaDڂ8)xpr˴ z 3x;7Kaji7!UؗBZx:3WzRN2=*pYx]ʒ6?fltV}uIPJG*,d-&`Qt0ݨWOr Z|3` ·_˥"5-^k\ B7$#I&7#(J5-9_*pd?BE*@lY -p[Ɠ Y<]0nqO7ިv4zFN]28h,¥HH'=O`{M~g^fN0Cϴd)-:AsbV7]S J:gOv [TuӋ68!t%lLPn2sUH'ʹbj7ekidǏF旆Y ~%hJ~ q a+[(ԭ5nCDvIz_e+ΨBt d H_@Mwˉ ?9eT;M8-=Wk7̹3(0@?TWQ4H~/˧r7ӹDǓ95^ӗyl2h+ WRΛrw8<&88^L-.M]/Smͮݟ~wg0U T#WґAjR'umt ag0DpV,E@w;f%ri~DN35Onכ4`Ĝt[xF-0123 KPWO564p~37wt~38N9GHJ@ POPPASSD.BCKh-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.EXE;27~ PЏ͔ Џ|͔͔$͔ 8 ͔͔1͔y<̈́RRR̈́0f8P͘ˏ͘RR9͘ϕ~Rb P͘ͼ1PЏ<͔1ˏ͔RRzˏRRmfP͘ˏ͘RR:͘)QRb P͘ͼP͔ͼPͼP^ݬPЬլ)ݬPЬ랭PPPլ 'ݬ PЬ 㞭PPլ'ݬ|PЬܐڐ۞PPլ'ݬLPЬԐҐӞPPݬݭݭݬݭݭPPЭP@@8 (( 00px  @DECC$SHRMTHRTL CMA$TIS_SHRLIBRTL SECURESHR SECURESHRPPOPPASSDopenlog noname.2log_name  pid  quoi  syslogK noname.4 ap  level t ctrstr DL init_sock noname.6 sysnet  iosb*& status read_sock noname.8 read_sock1< noname.9T noname.11t noname.12|t noname.13x noname.10 noname.14 iosb*& status cp remsize buffer  buflen write_sock noname.16 iosb*& status buffer  buflenr WriteToClient: noname.18U noname.19 sndbuf*& ap  ctrstr VX ReadFromClient} noname.21i buffer & chkPass noname.23 chkPass2% noname.247 chkPass3P noname.25P chkPass4h noname.27h noname.26 ip_address w ipaddr*& hp  np  status node*&username password  errmess  flagsp setPass setPass5 POPPASSD.BCKh-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.EXE;27~, noname.296 setPass6P noname.31] setPass7t noname.32 noname.34 noname.36 noname.37 setPass8 noname.38 noname.39 noname.33 setPass9$ noname.40. setPass10O setPass11l noname.42>l noname.41 setPass12 noname.43 setPass13 setPass14 noname.45: noname.44+ setPass15H noname.46P noname.30 ` siz cod bufadr @retlen dict_d  hash*& getuai3/ 0 ٨setuai3/  ٠user_d  ٘pass_d  ِstatus ٌcp  نsaltك uai_flags :Vقencryptusername password  errmess  bintim*&PPOX writestring noname.48l fds ( main MAIN noname.51 main16 noname.52 'main17= noname.53 {main18 noname.54 main19 noname.55 main20 noname.56 4main21O noname.57 main22 noname.58 noname.59 noname.60 line*& user*&oldpass*&newpass*& emess*& argc argv X   T z>_iobuf _cnt _ptr  @_base  `_flag h_file p_pad1 x_pad2 @stat st_dev  st_ino*&Pst_mode`st_nlink st_uid st_gidst_rdev st_sizest_atimest_mtime0st_ctimeP st_fab_rfmX st_fab_rat` st_fab_fszh st_fab_mrsin_addr S_un   S_un_b  S_un_w : S_addr  s_b1 s_b2 s_b3 s_b4  s_w1 s_w2 sockaddr_in sin_familysin_port sin_addr [@sin_zero*&hostent h_name  h_aliases @ h_addrtype`h_length h_addr_list netent n_name  n_aliases @ n_addrtype `n_netservent s_name  s_aliases  @s_port`s_proto protoent` p_name  p_aliases @p_protorpcent` r_name  r_alia POPPASSD.BCKh-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.EXE;27~ses @r_number tm  tm_sec  tm_min@tm_hour`tm_mday tm_montm_yeartm_wdaytm_ydaytm_isdsttbufferproc_user_time proc_system_time@child_user_time`child_system_timetimeb` time millitm0timezone@dstflagdsc$descriptor@ dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer dsc$descriptor_s@ dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer dsc$descriptor_d@ dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer dsc$descriptor_a dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer @ dsc$b_scaleH dsc$b_digitsP dsc$b_aflags X dsc$b_dimct` dsc$l_arsize $"dsc$v_fl_binscale" !"dsc$v_fl_redim" ""dsc$v_fl_column" !"dsc$v_fl_coeff" ""dsc$v_fl_bounds" dsc$descriptor_p@ dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer dsc$descriptor_sd` dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer @ dsc$b_scaleH dsc$b_digitsP dsc$b_sflags  $"dsc$v_fl_binscale" dsc$descriptor_nca dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer @ dsc$b_scaleH dsc$b_digitsP dsc$b_aflags X dsc$b_dimct` dsc$l_arsize $"dsc$v_fl_binscale" !"dsc$v_fl_redim" dsc$descriptor_vs@dsc$w_maxstrlen dsc$b_dtype dsc$b_class dsc$a_pointer dsc$descriptor_vsadsc$w_maxstrlen dsc$b_dtype dsc$b_class dsc$a_pointer @ dsc$b_scaleH dsc$b_digitsP dsc$b_aflags X dsc$b_dimct` dsc$l_arsize $"dsc$v_fl_binscale" !"dsc$v_fl_redim" dsc$descriptor_ubs` dsc$w_length dsc$b_dtype dsc$b_class dsc$a_base @ dsc$l_posdsc$descriptor_uba dsc$w_length dsc$b_dtype dsc$b_class dsc$a_base @ dsc$b_scaleH dsc$b_digitsP dsc$b_aflags X dsc$b_dimct` dsc$l_arsize $"dsc$v_fl_binscale" !"dsc$v_fl_redim" dsc$descriptor_sb dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer @ dsc$l_sb_l1` dsc$l_sb_u1dsc$descriptor_ubsb dsc$w_length dsc$b_dtype dsc$b_class dsc$a_base @ dsc$l_pos` dsc$l_ubsb_l1 dsc$l_ubsb_u1iodefio$r_fcode_structure R(io$r_errlog_modifiers (io$r_disk_tape_modifiers _)io$r_disk_modifiers +io$r_tape_modifiers +io$r_dutu_xfer_modifiers ,io$r_du_sense_modifiers ~- io$r_du_packack_modifiers .io$r_du_avail_modifiers . io$r_du_remshad_modifiers \/ io$r_du_pr POPPASSD.BCKh-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.EXE;27~$fpath_modifiers /io$r_du_dcd_modifiers p0io$r_du_whm_modifiers H1"io$r_hbs_copyshad_modifiers 2!io$r_hbs_creshad_modifiers i3io$r_hbs_xfer_modifiers -4io$r_dr_modifiers 4io$r_dy_modifiers 5io$r_dd_modifiers /6io$r_ts11_modifiers 6io$r_tu_modifiers 7$io$r_tu_lg_transfer_modifiers C8 io$r_tu_setmode_modifiers 9io$r_acp_modifiers 9io$r_cr_modifiers &;io$r_mb_modifiers ; io$r_mb_setmode_modifiers <io$r_tt_read_modifiers =io$r_tt_write_modifiers u?"io$r_tt_sensemode_modifiers @ io$r_tt_setmode_modifiers Aio$r_tt_maint_modifiers B"io$r_tt_outofband_modifiers QD#io$r_tt_psxsetmode_modifiers *E"io$r_tt_posixinit_modifiers E"io$r_tt_posixflow_modifiers bG io$r_tt_psxread_modifiers wH$io$r_net_write_read_modifiers I io$r_net_accdea_modifiers I!io$r_dlink_write_modifiers J#io$r_dlink_setmode_modifiers ?K%io$r_dlink_sensemode_modifiers pLio$r_x25_write_modifiers M io$r_x25_access_modifiers +Nio$r_lpa_start_modifiers Nio$r_xa_modifiers " io$v_fcode" ""io$v_fmodifiers "  $"io$v_fcode_fill_1" " io$v_filler_1"  " io$v_inherlog" " io$v_fill_6"  $"io$v_fcode_fill_2" ,"io$v_rsvd_for_devdepend_1" " io$v_erase" " io$v_filler_2" +"io$v_rsvd_for_devdepend2" " io$v_exfunc" !"io$v_datacheck"  " io$v_inhretry" " io$v_syncsts"  " io$v_novcache" " io$v_fill_7"  $"io$v_fcode_fill_3" ,"io$v_rsvd_for_devdepend_2" " io$v_inhseek" " io$v_fill_8"  $"io$v_fcode_fill_4" " io$v_reverse" " io$v_nowait" ,"io$v_rsvd_for_devdepend_3" !"io$v_inhextgap" !"io$v_retension" " io$v_fill_9"  $"io$v_fcode_fill_5" &"io$v_dutux_reserved" ""io$v_mscpmodifs" " io$v_fill_10"  $"io$v_fcode_fill_6" " io$v_shadow" " io$v_locate"  $"io$v_fcode_fill_7" #"io$v_mscp_format" " io$v_fill_11"  $"io$v_fcode_fill_8" " io$v_allhosts"  " io$v_dissolve" !"io$v_nocleanup" " io$v_fill_12"  $"io$v_fcode_fill_9" " io$v_spindown" " io$v_fill_13"  %"io$v_fcode_fill_10" !"io$v_forcepath" " io$v_fill_14"  %"io$v_fcode_fill_11" $"io$v_est_com_path" $"io$v_lcl_src_unit" $"io$v_rtn_com_path" " io$v_fill_15"  %"io$v_fcode_fill_12" !"io$v_dealc_all" !"io$v_dealc_hrn" $"io$v_dealc_entloc"  " io$v_decr_afc" " io$v_read_all" " io$v_read_hrn" ""io$v_break_conn" " io$v_fill_16"  %"io$v_fcode_fill_13" " io$v_stepover" " io$v_cs_fill" " io$v_copyop" " io$v_fill_17"  %"io$v_fcode_fill_14" " io$v_exists" " io$v_cbs" " io$v_booting" " io$v_fill_18"  %"io$v_fcode_fill_15 " " io$v_vuex_fc" " io$v_fill_19"  %"io$v_fcode_fill_16" " io$v_commod" ""io$v_movetrackd" ""io$v_diagnostic" !"io$v_skpsecinh" " io$v_fill_20"  %"io$v_fcode_fill_17" " io$v_deldata" " io$v_fill_21"  %"io$v_fcode_fill_18" " io$v_nomrsp" " io$v_fill_22"  %"io$v_fcode_fill_19" ,"io$v_rsvd_for_devdepend_4" " io$v_swap"  " io$v_opposite" " io$v_fill_23"  %"io$v_fcode_fill_20" ,"io$v_rsvd_for_devdepend_5" !"io$v_clserexcp" " io$v_fill_24"  %"io$v_fcode_fill_21" !"io$v_chunkdiag" ,"io$v_rsvd_for_devdepend_6" " io$v_tbc" " io$v_fill_25"  %"io$v_fcode_fill_22" " io$v_enarep" " io$v_fill_26"  %"io$v_fcode_fill_23" " io$v_access" " io$v_create" " io$v_delete" " io$v_mount" " io$v_dmount" " io$v_remount" " io$v_movefile" " io$v_filler_8" !"io$v_rwshelved" " io$v_fill_27"  %"io$v_fcode_fill_24" " io$v_binary" " io$v_packed"  %"io$v_fcode_fill_25" " io$v_now" " io$v_stream" #"io$v_readercheck" #"io$v_writercheck" " io$v_norswait" " io$v_fill_28"  %"io$v_fcode_fill_26" &"io$v_mb_room_notify"  " io$v_readattn" " io$v_wrtattn" " io$v_setprot" ""io$v_readerwait" ""io$v_writerwait" " io$v_fill_29"  %"io$v_fcode_fill_27" " io$v_noecho" " io$v_timed" " io$v_cvtlow" " io$v_nofiltr" " io$v_dsablmbx" " io$v_purge" !"io$v_trmnoecho" " io$v_refresh" " io$v_escape" " io$v_extend"  %"io$v_fcode_fill_28" " io$v_canctrlo"  " io$v_enablmbx"  " io$v_noformat" !"io$v_breakthru" " io$v_newline" " io$v_fill_30"  %"io$v_fcode_fill_29" ""io$v_typeahdcnt" ("io$v_reserve_rd_modem"  %"io$v_fcode_fill_30" " io$v_maint"  " io$v_ctrlyast"  " io$v_ctrlcast" " io$v_hangup" " io$v_outband" ""io$v_tt_connect" !"io$v_tt_discon" ""io$v_tt_process" " io$v_brdcst" " io$v_fill_31"  %"io$v_fcode_fill_31" ."io$v_reserve_maint_escape_1" " io$v_loop" " io$v_unloop"  " io$v_line_off" !"io$v_set_modem" " io$v_line_on" " io$v_loop_ext" ""io$v_autxof_ena" ""io$v_autxof_dis" +"io$v_reserve_int_disable"  %"io$v_fcode_fill_32" ."io$v_reserve_maint_escape_2" " io$v_include" " io$v_tt_abort" " io$v_fill_32"  %"io$v_fcode_fill_33" !"io$v_posixinit" !"io$v_posixflow"  %"io$v_fcode_fill_34" +"io$v_reserve_init_escape" !"io$v_set_posix" #"io$v_clear_posix" #"io$v_set_termios" " io$v_set_ptc" !"io$v_clear_ptc" !"io$v_flush_tab" $"io$v_flush_output" ""io$v_update_ptc" " io$v_fill_33"  %"io$v_fcode_fill_35" +"io$v_reserve_flow_escape"  " io$v_out_xoff" " io$v_out_xon" " io$v_in_xoff" " io$v_in_xon" " io$v_fill_34"  %"io$v_fcode_fill_36" ""io$v_o_nonblock" " io$v_fill_35"  %"io$v_fcode_fill_37" !"io$v_interrupt"  " io$v_multiple" " io$v_lockbuf" " io$v_noblock" " io$v_fill_36"  %"io$v_fcode_fill_38" " io$v_reserved" " io$v_abort" " io$v_synch" " io$v_fill_37"  %"io$v_fcode_fill_39" " io$v_response" " io$v_fill_38"  %"io$v_fcode_fill_40" " io$v_startup"  " io$v_shutdown" " io$v_attnast" " io$v_ctrl"  POPPASSD.BCKh-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.EXE;27~e9 )"io$v_reserve_set_modem" " io$v_set_mac" " io$v_fill_39"  %"io$v_fcode_fill_41" " io$v_rd_mem"  " io$v_rd_modem"  " io$v_rd_count" $"io$v_reserve_ctrl" !"io$v_clr_count" !"io$v_sense_mac" " io$v_fill_40"  %"io$v_fcode_fill_42" " io$v_more" !"io$v_qualified"  %"io$v_fcode_fill_43" " io$v_redirect" " io$v_accept"  %"io$v_fcode_fill_44" " io$v_setevf" " io$v_fill_41"  %"io$v_fcode_fill_45" " io$v_word"  " io$v_filler_3"  " io$v_filler_4" " io$v_setfnct" " io$v_datapath" " io$v_filler_5" " io$v_cycle" " io$v_reset" " io$v_fill_42"  %"io$v_fcode_fill_46" " io$v_filler_6"  " io$v_setcuadr"  " io$v_setbsize" !"io$v_setpoolsz" !"io$v_setenqcnt" " io$v_clear" " io$v_lpbext" " io$v_lpbint" " io$v_readcsr"  %"io$v_fcode_fill_47" !"io$v_noctswait"  " io$v_slavloop" !"io$v_nodsrwait" !"io$v_maintloop" !"io$v_lastblock" " io$v_filler_7" " io$v_intclock" " io$v_fill_43"  %"io$v_fcode_fill_48" ""io$v_lt_connect" !"io$v_lt_discon" #"io$v_lt_readport" #"io$v_lt_map_port" !"io$v_lt_rating" #"io$v_lt_sol_info" #"io$v_lt_rcv_info" ""io$v_lt_setmode" $"io$v_lt_sensemode" ("io$v_lt_que_chg_notif"  %"io$v_lt_map_filler" %"io$v_lt_map_nodnam" %"io$v_lt_map_pornam" %"io$v_lt_map_srvnam" %"io$v_lt_map_lnknam" %"io$v_lt_map_netadr" " io$v_fill_44" flags " uai$v_disctly" " uai$v_defcli"  " uai$v_lockpwd" #"uai$v_restricted"  " uai$v_disacnt" ""uai$v_diswelcom"  " uai$v_dismail" " uai$v_nomail" " uai$v_genpwd" $"uai$v_pwd_expired" %"uai$v_pwd2_expired" " uai$v_audit" ""uai$v_disreport" %"uai$v_disreconnect" ""uai$v_autologin" ,"uai$v_disforce_pwd_change"  " uai$v_captive" !"uai$v_disimage" ""uai$v_dispwddic" ""uai$v_dispwdhis" ""uai$v_defclsval"  " uai$v_fill_16"  primedays" uai$v_monday" " uai$v_tuesday" ""uai$v_wednesday" !"uai$v_thursday" " uai$v_friday"  POPPASSD.BCKh-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.EXE;27~@!"uai$v_saturday" " uai$v_sunday"  " uai$v_fill_17"  ARPREQDEFARP$T_PA*&ARP$T_HA*& ARP$R_OVLY [  ARP$W_FLAGS ARP$R_O_FLAGS f[ " ARP$V_IN_USE" " ARP$V_COM" " ARP$V_PERM" " ARP$V_PUBL" $"ARP$V_USETRAILERS" " ARP$V_fill_0" IFREQDEF IFR$T_NAME*& IFR$R_DUMMY \  IFR$T_ADDR*& IFR$T_DSTADDR*&IFR$T_BROADADDR*&IFR$R_DUMMY_1_OVRL ] IFR$L_DATA   IFR$W_FLAGSIFR$R_DUMMY_1_BITS 3^ " IFR$V_IFF_UP" &"IFR$V_IFF_BROADCAST" ""IFR$V_IFF_DEBUG" %"IFR$V_IFF_LOOPBACK" ("IFR$V_IFF_POINTOPOINT" '"IFR$V_IFF_NOTRAILERS" $"IFR$V_IFF_RUNNING" ""IFR$V_IFF_NOARP" $"IFR$V_IFF_PROMISC" %"IFR$V_IFF_ALLMULTI" %"IFR$V_IFF_DYNPROTO" " IFR$V_IFF_MOP" $"IFR$V_IFF_RESERVE" #"IFR$V_IFF_NONAME" $"IFR$V_IFF_CLUSTER" MSGBITSINET$R_MSG_BITS ` !"INET$V_MSG_OOB" ""INET$V_MSG_PEEK" '"INET$V_MSG_DONTROUTE" ""INET$V_DUMMYN_4" ""INET$V_DUMMYN_5" #"INET$V_MSG_PURGE" ""INET$V_MSG_NBIO" &"INET$V_MSG_BLOCKALL"  MSGBITS_1UCX$R_MSG_BITS 0b  " UCX$V_MSG_OOB" !"UCX$V_MSG_PEEK" &"UCX$V_MSG_DONTROUTE" !"UCX$V_DUMMYX_4" !"UCX$V_DUMMYX_5" ""UCX$V_MSG_PURGE" !"UCX$V_MSG_NBIO" %"UCX$V_MSG_BLOCKALL"  SOCKOPTDEFUCX$R_OPT_OVRLY c  UCX$W_OPTIONSUCX$R_OPT_BITS c ""UCX$V_DEBUGGING" #"UCX$V_ACCEPTCONN" ""UCX$V_REUSEADDR" ""UCX$V_KEEPALIVE" ""UCX$V_DONTROUTE" ""UCX$V_BROADCAST" $"UCX$V_USELOOPBACK" " UCX$V_LINGER" ""UCX$V_OOBINLINE" !"UCX$V_DUMMYM_2" !"UCX$V_DUMMYM_3" !"UCX$V_DUMMYM_4" !"UCX$V_DUMMYM_5" *"UCX$V_FULL_DUPLEX_CLOSE" &"UCX$V_NO_RCV_CHKSUM" &"UCX$V_NO_SND_CHKSUM" OPTDEF` OPT$W_LENGTH OPT$W_NAME OPT$L_ADDR @OPT$L_RET_LENGTH  RTENTRYDEF RT$L_HASH RT$R_DST_OVRLY gRT$R_GATEWAY_OVRLY h RT$R_FLAGS_OVRLY %j0 RT$W_REFCNT@RT$L_USE`RT$L_IFP RT$L_NEXT RT$R_DST_FIELDS &hRT$T_DST*& POPPASSD.BCKh-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.EXE;27~\G RT$W_DST_SIN_FAMILYRT$W_DST_SIN_PORT RT$L_DST_SIN_ADDR@RT$T_DST_SIN_ZERO*& RT$R_GATEWAY_FIELDS ai RT$T_GATEWAY*& RT$W_GATEWAY_SIN_FAMILYRT$W_GATEWAY_SIN_PORT RT$L_GATEWAY_SIN_ADDR@RT$T_GATEWAY_SIN_ZERO*&  RT$W_FLAGSRT$R_FLAGS_BITS {j " RT$V_RTF_UP" #"RT$V_RTF_GATEWAY"  " RT$V_RTF_HOST" #"RT$V_RTF_DYNAMIC" $"RT$V_RTF_MODIFIED" " RT$V_fill_1"  SOCKETOPTDEFSOCKOPT$R_OPT_OVRLY k SOCKOPT$W_OPTIONSSOCKOPT$R_OPT_BITS  l ""SOCKOPT$V_DEBUG" '"SOCKOPT$V_ACCEPTCONN" &"SOCKOPT$V_REUSEADDR" &"SOCKOPT$V_KEEPALIVE" &"SOCKOPT$V_DONTROUTE" &"SOCKOPT$V_BROADCAST" ("SOCKOPT$V_USELOOPBACK" #"SOCKOPT$V_LINGER" &"SOCKOPT$V_OOBINLINE" %"SOCKOPT$V_DUMMYB_2" %"SOCKOPT$V_DUMMYB_3" %"SOCKOPT$V_DUMMYB_4" %"SOCKOPT$V_DUMMYB_5" ."SOCKOPT$V_FULL_DUPLEX_CLOSE" *"SOCKOPT$V_NO_RCV_CHKSUM" *"SOCKOPT$V_NO_SND_CHKSUM" INETSOCKOPTDEFINET$R_OPT_OVRLY n INET$W_OPTIONSINET$R_OPT_BITS " INET$V_DEBUG" $"INET$V_ACCEPTCONN" #"INET$V_REUSEADDR" #"INET$V_KEEPALIVE" #"INET$V_DONTROUTE" #"INET$V_BROADCAST" %"INET$V_USELOOPBACK"  " INET$V_LINGER" #"INET$V_OOBINLINE" ""INET$V_DUMMYB_2" ""INET$V_DUMMYB_3" ""INET$V_DUMMYB_4" ""INET$V_DUMMYB_5" +"INET$V_FULL_DUPLEX_CLOSE" '"INET$V_NO_RCV_CHKSUM" '"INET$V_NO_SND_CHKSUM" SOCKADDR SA$W_FAMILY SA$T_DATA*&  SOCKADDRIN SIN$W_FAMILY SIN$W_PORT SIN$L_ADDR@ SIN$T_ZERO*& NETENTDEF NET$L_N_NAME  NET$L_N_ALIASES @NET$L_N_ADDRTYPE` NET$L_N_NET HOSTENTDEF HOST$L_H_NAME  HOST$L_H_ALIASES @HOST$L_H_ADDRTYPE`HOST$L_H_LENGTHHOST$L_H_ADDR_LIST  LOG_PID  LOG_LOCAL2 LOG_ERR peer uaddr_len ` siz cod bufadr @retadr descriptor nt @ quot  rem @ quot  rem  P13/ 8P23/  HP33/  POPPASSD.BCKh-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.EXE;27~:N `P43/  decc$ga_stderr y0decc$$ga___ctypet-)&0decc$$gl___ctypealnet_login_uaictx psock<< hE(CAL$SYSDAT:[DECC$LIB.INCLUDE]VARARGS.H;8:L}E &CAL$SYSDAT:[DECC$LIB.INCLUDE]ERRNO.H;8;|^E j'CAL$SYSDAT:[DECC$LIB.INCLUDE]STDLIB.H;8;\fE'CAL$SYSDAT:[DECC$LIB.INCLUDE]UNISTD.H;7HEhwn4USR$ADMIN:[GEGE.DEVELOP.IUPOP3.POP_PASS]NETLOGIN.H;87ħ]#SYS$COMMON:[SYSLIB]UCX$INETDEF.H;14;eED'CAL$SYSDAT:[DECC$LIB.INCLUDE]UAIDEF.H;8:, Ej&CAL$SYSDAT:[DECC$LIB.INCLUDE]IODEF.H;8<,'E'(CAL$SYSDAT:[DECC$LIB.INCLUDE]DESCRIP.H;89 \6aE %CAL$SYSDAT:[DECC$LIB.INCLUDE]TIME.H;8; d]E'CAL$SYSDAT:[DECC$LIB.INCLUDE]STDARG.H;8: *E&CAL$SYSDAT:[DECC$LIB.INCLUDE]NETDB.H;89 ; Ev%CAL$SYSDAT:[DECC$LIB.INCLUDE]INET.H;87 S E J#CAL$SYSDAT:[DECC$LIB.INCLUDE]IN.H;8:E *&CAL$SYSDAT:[DECC$LIB.INCLUDE]CTYPE.H;8D񚙚 F0USR$ADMIN:[GEGE.DEVELOP.IUPOP3.POP_PASS]VMS.C;76:AbeE&CAL$SYSDAT:[DECC$LIB.INCLUDE]TYPES.H;89| ]E %CAL$SYSDAT:[DECC$LIB.INCLUDE]STAT.H;8:| ^Er&CAL$SYSDAT:[DECC$LIB.INCLUDE]STDIO.H;8;KgE'CAL$SYSDAT:[DECC$LIB.INCLUDE]UNIXIO.H;8;\_E $'CAL$SYSDAT:[DECC$LIB.INCLUDE]STRING.H;8I+/⦕),5USR$ADMIN:[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.C;14     p  " &# h @         3   e   e            z    >      X 9NETLOGIN0 upcase_trimPnoname.2noname.4noname.3 status src  dst snet_login_hpwdnet_login_hpwd1noname.6net_login_hpwd2,noname.8Rnet_login_hpwd3`net_login_hpwd4 noname.10 noname.114noname.9Bnoname.7٨ loc_user_buf*&PPO ٠locpwd ٘locuser X loc_pw_buf*&<<; Tstatus netpwd  salt  crypt user  hash check_password noname.13 noname.16 noname.15 noname.17( noname.184 noname.194 noname.14null_pw*&  hash*& status netpwd  pwd   salt crypt user < net_login} net_login5 noname.21 net_login6  noname.23  net_login7T noname.24 net_login8 net_login9 noname.26$ noname.27:$ noname.25HC net_login10Q net_login11| noname.29 noname.307 noname.28E net_login12 net_login13 noname.32 nona!YISEbKO )ֱ`$אJqL!4/NRI^-uT ̉9ȗ)Y/'!#l-%v_W BU.TߞX۟>o+{ˋʎ;]ESp#DO( tGƚl千7ԃ] `19o"3[wL6Bh^FXhDZ񘎺aG Shu劼D?%Vnf"!c˱s2>ܞs]On#GlGdH^wŞxg?8E{jbD̠oGX O`nGC$4L2,驾@)&}!wle-^͒ O>:xq ::tF4"98/81SW $;d z bލ/6p% ڸ`T.1sPqt mdՓ);o' y~" 3~gZ 6|8"^,}>HCbGElzoݚ2rT*LvIvr*RKtu؉$a!gc9'@}]WrP_(C񽡰ferբs(]xxR)s 7]/8i QhmAC*Va`6 LhJ]p pZTF`)c?}W]9$YIT4@=V=JN}"&OWz,?$*TX玒a90/JnB%`ftiB.ˠR5qR9xfry o{fK=1}=o̚ RU63G0UoU9KODQ.-q2$s -ʡ˭uyv3U-PQ{~Q0g>1J-?^pNSV2-umKnQbǝN48v[t{vXPp39n;*3gIQeh&z$QmhКw(ۉ3<ԯP8C>?⸵0\ g11)<u;unh/?"f!4W@weNzhGK[|O^,}a#o~ik.x˿7PUVDt|9y)GETn{8Tc:<"0Bj|:vE\۫(LJ,]E X1Z|si\jwRB\ [ a Lem4YkXq G6M\ qW%r;[N\3u77!čz^MT}qiIaSd!9:C TUy/|Bŕ@]Pr~w0}wNbCeo8 ,EKr^ ׊d km*ړ\,iiTΦf~`HhU6iqRٶhͽ\'!Dql2q@u,|-i fUGm##c&1],a%;ePT+0ozQ %"Y];[o6Mo\ <`ˬoό`ή]<\vfGsQ=22˹U1M6g&4Կ16i71S?qS@ueDUn2$qL@g/K"3ܚq VoH,.}٠O{iO$xb}{-pAD,zUpAEӄVSQıCp>s_z\qJvYݣ`p~SQ3P q915| ='qr7AR2\Ɇd\B2I6sv7D+S.CjIDײPæ `C},<~1RMFPJ`=I "T/ L~b@&\vZLUq { [|Y@kuKj/#F?(eS:~\BS0+fŔ4-RF}t.Y5SZ"95ӬܦZG#Zit%Sm ,5$Z!P!*XRBYs#d5B2٦:Vung[p#_P0$޷C+}/7 p"bl~)6x̹^4HِnEQvJeD(eZᯒ0KaxodGmሶ?1<94q_zF`DY ԵuoAC,Ƅ=fukf763HO@a2hQ܍}ު;ڕ{[SvIt&*6?hdONn)ZO3AO-)2ZcmrS ݢG*0le!T/5Q(,|4J1GLr*Za|NBlR8>>BN Yl0$Kإ[ORw B-XJ^U"` ok2hR.{;LY `LpC#`',ri`U~U.;L_g:-Ow/=^En=j&s=&Qb|=9D"͌80re<&-;:M;m\r&A D\Jses@0\ԃ5`e7Y+x h=-{ö&v8Kyz+ mRf٫7;`b HYcXlb` )+OX0^8]+%qWҎqgue f:&w4uz~c%p iʾppb&DKL\" POPPASSD.BCKh-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.EXE;27~Ume.337 noname.31E noname.34( noname.350 noname.36d net_login14o net_login15} net_login16 noname.40 noname.417 noname.39E noname.38 noname.42] noname.37 net_login17 noname.43 noname.44 net_login189 noname.46?9 noname.45G net_login19v net_login20 noname.48D noname.47 net_login21 noname.50 noname.49 net_login220 noname.520 net_login23> net_login24l noname.55x noname.56:x noname.54Hx noname.53ax noname.51 net_login25 net_login26 noname.58 net_login27 noname.59 noname.62  noname.63 noname.61 noname.64 noname.60 noname.57H noname.65H net_login28S net_login29 net_login30 net_login31 noname.69 noname.709 noname.68Gy noname.67 noname.66 net_login32 net_login33& net_login34T noname.74` noname.75:` noname.73Hm` noname.72` noname.71l noname.22valid_pw  (noexp*& encrypt ˊ`encrypt2 ˊ expiration ˊ flags ˊlogfails ˊnetwork_access_p ˊ@network_access_s ˊ primedays ˊ pwd ˊ `pwd2 ˊ salt ˊ end ˊ ` len cod bufadr @retlen logfails ~ `end ~ ` len cod bufadr @retlen  lastlogin_n 4 `end 4 ` len cod bufadr @retlen pwd*& pwd2*& expiration*&curtime*&Huai_read s0 uai_logfail , uai_logsucc ߋlocal_username_buf*& local_source_node_buf*&local_source_user_buf*& local_username local_source_node local_source_user ٸctxaddr ٴ failed_pw ٰnetwork_access_p٬network_access_s٨ primedays ٤curday٠curhourٜlibfunc ٘statusٔ login_statusِ test_accessٌ test_access1و cia_flags نsaltلlogfailsكencryptقencrypt2 flags Gusername  netpwd  netpwd2 netflags source_node  source_user  source_addr 7t net_login_cz net_login_c35 net_login_c36 net_login_c37$ noname.77 noname.78 net_login_c38 net_login_c39$ noname.79 non# POPPASSD.BCKh-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.EXE;27~\ame.80 net_login_c40 net_login_c41$$ noname.81( noname.82- net_login_c42- net_login_c43$T noname.83X noname.84 noname.85 user_d  pass_d pass2_d  source_node_d  source_user_d  pass_p pass2_p  source_node_p ټ source_user_p  user  pass  pass2  flags source_node  source_user  source_addr  0ھE _iobuf _cnt _ptr  @_base  `_flag h_file p_pad1 x_pad2 @ @ quot  rem @ quot  rem performance@cia$l_total_messages cia$l_total_exceptions@ cia$l_shows` cia$l_scans cia$l_deletescia$l_performance cia$l_auditscia$l_invalid_messagescia$l_intruders cia$l_suspectscia$generic_desc(cia$w_desc_length cia$w_fill1 cia$t_desc_dataheader@ cia$l_context cia$r_fill_39 4  cia$l_header_flags cia$r_fill_40   &"cia$v_ignore_return" #"cia$v_reserved_1" !"cia$v_suspects" ""cia$v_intruders" +"cia$v_secondary_password" " cia$v_noaudit" &"cia$v_real_username" " cia$v_fill_1" contents0! cia$w_length cia$w_unused cia$t_name*&""! scan_contentsP+cia$l_parent_id cia$l_job_type@cia$l_login_status` cia$r_fill_41  cia$r_fill_43 Ӝ cia$r_fill_45 cia$w_unused_4cia$r_failed_user ) cia$r_fill_47 ˟ cia$r_fill_49 0 cia$r_fill_51   cia$t_source_terminal*&DDC cia$r_fill_42 1  cia$w_source_term_lengthcia$w_unused_1 cia$t_source_term_name*&@@?  cia$t_source_user*&$$# cia$r_fill_44 Y  cia$w_source_user_lengthcia$w_unused_2 cia$t_source_user_name*&   cia$t_source_address*& cia$r_fill_46   cia$w_source_addr_lengthcia$w_unused_3 cia$t_source_address_name*&  cia$w_failed_user_lengthcia$w_unused_5 cia$t_failed_user_name*&   cia$t_failed$ POPPASSD.BCKh-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.EXE;27~Hc_password*&$$# cia$r_fill_48 U  cia$w_failed_pass_lengthcia$w_unused_6 cia$t_failed_pass_name*&   cia$t_parent_user*&$$# cia$r_fill_50 }  cia$w_parent_user_lengthcia$w_unused_7 cia$t_parent_user_name*&   cia$t_source_node*& cia$r_fill_52   cia$w_source_node_lengthcia$w_unused_8 cia$t_source_node_name*& show_output! cia$l_status cia$l_returned_context@cia$q_expiration_time*& cia$r_fill_53 3cia$l_attempt_count cia$r_fill_55    cia$l_flags cia$r_fill_54   !"cia$v_intruder" " cia$v_suspect"  " cia$v_network" ""cia$v_term_user" !"cia$v_terminal" !"cia$v_username" " cia$v_fill_2"  0!cia$t_user_spec*&&&% cia$r_fill_56  0!cia$w_user_spec_lengthcia$w_unused_8 cia$t_user_spec_name*&""! breakin_blockcia$l_break_flags cia$l_break_count@cia$q_break_time*&cia$generic_reply cia$l_reply_statusdsc$descriptor@ dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer dsc$descriptor_s@ dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer dsc$descriptor_d@ dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer dsc$descriptor_a dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer @ dsc$b_scaleH dsc$b_digitsP dsc$b_aflags ǩX dsc$b_dimct` dsc$l_arsize $"dsc$v_fl_binscale" !"dsc$v_fl_redim" ""dsc$v_fl_column" !"dsc$v_fl_coeff" ""dsc$v_fl_bounds" dsc$descriptor_p@ dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer dsc$descriptor_sd` dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer @ dsc$b_scaleH dsc$b_digitsP dsc$b_sflags ͫ $"dsc$v_fl_binscale" dsc$descriptor_nca dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer @ dsc$b_scaleH dsc$b_digitsP dsc$b_aflags X dsc$b_dimct` dsc$l_arsize $"dsc$v_fl_binscale" !"dsc$v_fl_redim" dsc$descriptor_vs@dsc$w_maxstrlen dsc$b_dtype dsc$b_class dsc$a_pointer dsc$descriptor_vsa% POPPASSD.BCKh-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.EXE;27~Ոjdsc$w_maxstrlen dsc$b_dtype dsc$b_class dsc$a_pointer @ dsc$b_scaleH dsc$b_digitsP dsc$b_aflags ǮX dsc$b_dimct` dsc$l_arsize $"dsc$v_fl_binscale" !"dsc$v_fl_redim" dsc$descriptor_ubs` dsc$w_length dsc$b_dtype dsc$b_class dsc$a_base @ dsc$l_posdsc$descriptor_uba dsc$w_length dsc$b_dtype dsc$b_class dsc$a_base @ dsc$b_scaleH dsc$b_digitsP dsc$b_aflags X dsc$b_dimct` dsc$l_arsize $"dsc$v_fl_binscale" !"dsc$v_fl_redim" dsc$descriptor_sb dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer @ dsc$l_sb_l1` dsc$l_sb_u1dsc$descriptor_ubsb dsc$w_length dsc$b_dtype dsc$b_class dsc$a_base @ dsc$l_pos` dsc$l_ubsb_l1 dsc$l_ubsb_u1 jpictldef  jpi$r_fill_45   jpi$l_jpictlflgs jpi$r_fill_46  )"jpi$v_no_target_inswap" &"jpi$v_no_target_ast" -"jpi$v_ignore_target_status"  " jpi$v_fill_47"  jpilgidef  jpi$r_fill_48 ݳ  jpi$l_jpilgiflgs jpi$r_fill_49 7 *"jpi$v_new_mail_at_login" )"jpi$v_password_changed" )"jpi$v_password_expired" )"jpi$v_password_warning" *"jpi$v_password2_changed" *"jpi$v_password2_expired" *"jpi$v_password2_warning"  " jpi$v_fill_50" dt_print_fields$"lib$v_time_fields" $"lib$v_date_fields" " lib$v_fill_0" dt_default_fields" lib$v_year" " lib$v_month" " lib$v_day" " lib$v_hour" " lib$v_minute" " lib$v_second" #"lib$v_hundredths" " lib$v_fill_1" flags " uai$v_disctly" " uai$v_defcli"  " uai$v_lockpwd" #"uai$v_restricted"  " uai$v_disacnt" ""uai$v_diswelcom"  " uai$v_dismail" " uai$v_nomail" " uai$v_genpwd" $"uai$v_pwd_expired" %"uai$v_pwd2_expired" " uai$v_audit" ""uai$v_disreport" %"uai$v_disreconnect" ""uai$v_autologin" ,"uai$v_disforce_pwd_change"  " uai$v_captive" !"uai$v_disimage" ""uai$v_dispwddic" ""uai$v_dispwdhis" ""uai$v_defclsval"  " uai$v_fill_16"  primedays" uai$v_monday" " uai$v_tuesday" ""uai$v_wednesday" !"uai$v_thursday" " uai$v_friday" !"uai$v_saturday" " uai$v_sunday"  " uai$v_fill_17"  < LGI$_NOTVALID| LGI$_BADHOUR LGI$_BADDAY LGI$_RESTRICT LGI$_EVADEĀLGI$_AC& POPPASSD.BCKh-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.EXE;27~qbqNTEXPIR̀ LGI$_PWDEXPIRLGI$_NOSUCHUSER LGI$_INVPWD 8 LGI$_DISUSER decc$ga_stderr mlnet_login_uaictxśHEhwn4USR$ADMIN:[GEGE.DEVELOP.IUPOP3.POP_PASS]NETLOGIN.H;8: \XE*&CAL$SYSDAT:[DECC$LIB.INCLUDE]SSDEF.H;8; eED'CAL$SYSDAT:[DECC$LIB.INCLUDE]UAIDEF.H;8; \"LEN^'CAL$SYSDAT:[DECC$LIB.INCLUDE]RMSDEF.H;8= ̏gE)CAL$SYSDAT:[DECC$LIB.INCLUDE]LIBDTDEF.H;8; BE"'CAL$SYSDAT:[DECC$LIB.INCLUDE]JPIDEF.H;8<,'E'(CAL$SYSDAT:[DECC$LIB.INCLUDE]DESCRIP.H;8;LgE'CAL$SYSDAT:[DECC$LIB.INCLUDE]CIADEF.H;9;\_E $'CAL$SYSDAT:[DECC$LIB.INCLUDE]STRING.H;8:AbeE&CAL$SYSDAT:[DECC$LIB.INCLUDE]TYPES.H;8;|^E j'CAL$SYSDAT:[DECC$LIB.INCLUDE]STDLIB.H;8:| ^Er&CAL$SYSDAT:[DECC$LIB.INCLUDE]STDIO.H;8;,9E'CAL$SYSDAT:[DECC$LIB.INCLUDE]ASSERT.H;9I1K5USR$ADMIN:[GEGE.DEVELOP.IUPOP3.POP_PASS]NETLOGIN.C;91  2  p   & !            r             PDECC$SHRZvvv_@~ lp@~C l5POPPASSDV1.023-APR-1997 14:5623-APR-1997 14:56Linker V11-39 .$$ABS$$.P SYS$ASSIGNx SYS$GETTIM8SYS$HASH_PASSWORDh SYS$IMGSTASYS$QIOW:EXE$LOOKUP_PASSWORD:EXE$LOOKUP_HASHSYS$K_VERSION_18SYS$K_VERSION_17QSYS$K_VERSION_16PSYS$K_VERSION_15QSYS$K_VERSION_14PSYS$K_VERSION_13PSYS$K_VERSION_12PSYS$K_VERSION_11PSYS$K_VERSION_10PSYS$K_VERSION_09SYS$K_VERSION_08SYS$K_VERSION_07SYS$K_VERSION_06QSYS$K_VERSION_05QSYS$K_VERSION_04SYS$K_VERSION_03QSYS$K_VERSION_02SYS$K_VERSION_01 SYS$K_VERSIONlNET_LOGIN_UAICTXpSOCK0 UPCASE_TRIMNET_LOGIN_HPWD<| NET_LOGINt NET_LOGIN_COPENLOG SYSLOG WRITE_SOCK WRITETOCLIENTX READFROMCLIENT |CHKPASSp <' POPPASSD.BCKh-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.EXE;27~xSETPASSX WRITESTRING__MAINMAIN-*[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.LOG;48+,x. / 4P n-0123KPWO56MH7xV8I|֚9g@*GHJ $ set ver $ sho procI 9-OCT-1996 18:51:03.48 User: GEGE Process ID: 28A01539R Node: BRAHMS Process name: "POPPASSD_BG3291"Terminal: "User Identifier: [ADMIN,GEGE]Base priority: 4&Default file spec: USR$ADMIN:[GEGE]$ show log/proc(LNM$PROCESS_TABLE)! "SYS$COMMAND" = "_$1$DKA200:" "SYS$DISK" = "USR$ADMIN:" "SYS$ERROR" = "_$1$DKA200:" "SYS$INPUT" = "_$1$DKA200:" "SYS$NET" = "_BG3291:"( "SYS$OUTPUT" [super] = "_$1$DKA200:"' "SYS$OUTPUT" [exec] = "_$1$DKA200:" "TESTMAIL" = "GEGE"A "TT" = "USR$ADMIN:[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.COM" $ set noverAssign: 00000001QIOW: 00000001 QIOW: 0001Assign: 00000001QIOW: 00000001 QIOW: 0001'net login test liszt returns 00000001-*[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.OBJ;21+,.Z/ 4ZS -0123KPWOT56 k79[8TbN9g@*GHJ5POPPASSDV1.0 9-OCT-1996 18:48DEC C V5.0-003P200 Bye.vP500 Quit required.qPquitPP200 Password changed, thank-you.8Ppassword changed for %sP500 Password not changed: %s.P500 New password required.Pnewpass %sP200 your new password please.P500 %s.P500 Password required.Ppass %sP200 your password please.pP500 Username required.hPuser %s`P1.29P200 poppassd v%s hello, who are you?"P500 Can't open syslog.Ppoppassd`PPNIS entry changed on * P HPP Verify:P *Re-enter *'s new password:P Enter the new password again:P Retype new password:P Re-enter new password:8PcrrP *'s New password:cP New password: P8b8PChanging password for * *'s Old password:PChanging NIS password for * on *. Old password:PChanging password for * on *. Old password:PChanging password for *. Old password:POld password:PError setting password (%08X)hPPassword in history file (%08X)CPError encoding password (%08X)&PPassword in dictionary- %08XPpassword too longPinvalid passwordPPassword cannot be chosen by userPPassword lockedP$GETUAI(flags) returns %08XPVMS$PASSWORD_DICTIONARY}PTout va bienbPUser Authorisation FailureDPnet login %s %s returns %08X @P 4PQ( POPPASSD.BCK-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.OBJ;21Z-IOW: %04x (PQIOW: %08x PAssign: %08x PSYS$NET:P SOCKNET_LOGIN_UAICTXDECC$$GL___CTYPEADECC$$GA___CTYPETDECC$GA_STDERR DECC$EXIT DECC$EXIT SYS$SETUAI SYS$GETUAISETPASSEXE$LOOKUP_PASSWORDEXE$LOOKUP_HASHCHKPASSREADFROMCLIENT WRITETOCLIENT WRITE_SOCKSYS$QIOW SYS$ASSIGNSYSLOGOPENLOG NET_LOGIN_CNET_LOGIN_HPWDDECC$GETHOSTBYADDRDECC$INET_NTOA DECC$ISALNUM DECC$WRITEDECC$DVSPRINTFDECC$DVFPRINTF+RPOPPASSDopenlogKnoname.2log_name  pid  quoi syslogdKnoname.4 ap  level R ctrstr DL init_socknoname.6 sysnet R iosb*& status read_socknoname.8P P#PIP^P^ެPPPݭݬDECC$GA_STDERRP`DECC$DVFPRINTFDECC$GA_STDERRP` DECC$DFPRINTF^RϞ SYS$ASSIGNPݭϜ DECC$DPRINTF' SYS$QIOWPݭe DECC$DPRINTF<\\^ DECC$DPRINTFP ^RЬݭݭ1b read_sock1B<noname.9T noname.11t noname.12 |t noname.13x noname.10 noname.14 iosb*& status cp remsize buffer  buflen write_sock noname.16 iosb*& status buffer  buflen"r WriteToClient: noname.18U noname.19 sndbuf*& ap  ctrstr #VXReadFromClient;} noname.21i buffer &chkPass noname.23 SYS$QIOWPˏPP?P>P<`PPPPխ%>P<`PPPЭPPP PPíPPP^ݬݬ0 SYS$QIOWPe0 SYS$QIOWPP^ެPPPݬDECC$DVSPRINTF DECC$STRLENP WRITE_SOCKP^ݏݬsPЭP޼Q@aP|4^V`}ϭRRDECC$GETHOSTBYADDRPխнح%^(nchkPass2% noname.247chkPass3P noname.25PchkPass4hh noname.27h noname.26 ip_address R ipaddr*& hp R np  status node*&username password  errmess  flags7psetPass setPass5,  noname.29DECC$INET_NTOAP DECC$STRCPYܞRRݭݬݬ NET) POPPASSD.BCK-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.OBJ;21Z _LOGIN_CPݭݭݬ! DECC$DPRINTFˏRR&ݬ  DECC$DSPRINTF(ݬ  DECC$DSPRINTFPP<΀^(0$(M}_}YЬݬ DECC$STRLENPЬݬ DECC$STRLENPЬRR>RRОRRܞRRNET_LOGIN_UAICTX SYS$GETUAIPˏRRݭϖݬ  DECC$DSPRINTF1$RRϕݬ 6 setPass6P  noname.31] setPass7Yt  noname.32  noname.34  noname.36  noname.37 setPass8C  noname.38  noname.39  noname.33 setPass9$  noname.403.  setPass10O  setPass11l  noname.42 >l  noname.41 DECC$DSPRINTF1PRRRR~ݬ  DECC$DSPRINTF1ЬRR|PDECC$$GL___CTYPEADECC$$GA___CTYPETSRˏBcRRPRR DECC$ISALNUMPխ-RR$$RR_(ݬ  DECC$DSPRINTF1dRRRRݬ DECC$STRLENPݬ  DECC$DSPRINTF1,RR>YEXE$LOOKUP_PASSWORDPˏRRݭݬ  DECC$DSPRINTF1P~2~NET_LOGIN_HPWDPˏRRݭϢݬ   setPass12  noname.433  setPass13  setPass14  noname.45 :  noname.44+  setPass15H  noname.46P  noname.30R ` siz cod bufadr @retlen dict_d R hash*& getuai3/T 0 ٨setuai3/T  ٠user_d R ٘pass_d R ِstatus ٌcp  نsaltك uai_flags  Rقencryptusername password  errmess  bintim*&PPO X  writestringA  noname.48l fds (  main(  MAIN  noname.51  main16 DECC$DSPRINTF1RR:EXE$LOOKUP_HASHPˏRRݭρݬ  DECC$DSPRINTFXNET_LOGIN_UAICTX SYS$SETUAIPˏRRݭTݬ  DECC$DSPRINTF PP͔P^ݬ DECC$STRLENPݭݬݬ DECC$WRITE^DECC$MAIN_ARGS ^VOPENLOGPO WRITETOCLIENT DECC$EXITwK WRITETOCLIENTREADFROMCLIENT  noname.52 ' main17=  noname.53 { main181  noname.54  main19e  noname.55.  main20d  noname.56P] DECC$DSSCANF DECC$STRLENPD WRITETOCLIENT DECC$EXITF WRITETOCLIENTREADFROMCLIENTI DECC$DSSCANF DECC$STRLENP0 WRITETOCLIENT DECC$EXITCHKPASSP WRITETOCLIENT DECC$EXIT WRITE* POPPASSD.BCK-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.OBJ;21ZcTOCLIENTREADFROMCLIENT DECC$DSSCANF DECC$STRLENP WRITETOCLIENT DECC$EXITSETPASSP 4 main21aO  noname.57p  main22e  noname.58  noname.59  noname.60 line*& user*&oldpass*&newpass*& emess*& argc argv eEX   T z>  R_iobuf _cnt _ptr  @_base  `_flag h_file p_pad1 x_pad2 R @ Rstat st_dev  st_ino*&Pst_mode`st_nlink st_uid st_gidst_rdev st_sizest_atimest_mtime0st_ctimeP st_fab_rfmX st_fab_rat` st_fab_fszh st_fab_mrs Rin_addr S_un RRSTS  S_un_b R S_un_w R S_addrRSTS  s_b1 s_b2 s_b3 s_b4RSTS  s_w1 s_w2R sockaddr_in sin_familysin_port sin_addr  T@sin_zero*&RSTShostent h_name  h_aliases @ h_addrtype`h_length h_addr_list Rnetent n_name  n_aliases @ n_addrtype `n_netRservent s_name  s_aliases  @s_port`s_proto Rprotoent` p_name R p_aliases @p_protoRrpcent` r_name  r_aliases @r_numberR tm  tm_sec  tm_min@tm_hour`tm_mday tm_montm_yeartm_wdaytm_ydaytm_isdstRtbufferproc_user_time proc_system_time@child_user_time`child_system_timeRtimeb` time millitm0timezone@dstflagRSTSdsc$descriptor@ dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer RSTSTSTSTSdsc$descriptor_s@ dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer Rdsc$descriptor_d@ dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer  Rdsc$descriptor_a dsc$w_length dsc$b_dtype dsc+ POPPASSD.BCK-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.OBJ;21Z$b_class dsc$a_pointer @ dsc$b_scaleH dsc$b_digitsP dsc$b_aflags !RX dsc$b_dimct` dsc$l_arsize"R!S"T"S $"dsc$v_fl_binscale" !"dsc$v_fl_redim" ""dsc$v_fl_column" !"dsc$v_fl_coeff" ""dsc$v_fl_bounds" #Rdsc$descriptor_p@ dsc$w_lengtho dsc$b_dtype dsc$b_class dsc$a_pointer $Rdsc$descriptor_sd` dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer @ dsc$b_scaleH dsc$b_digitsP dsc$b_sflags %R&R%S&T&S $"dsc$v_fl_binscale" 'Rdsc$descriptor_nca dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer P@ dsc$b_scaleH dsc$b_digitsP dsc$b_aflags (RX dsc$b_dimct` dsc$l_arsize)R(S)T)S $"dsc$v_fl_binscale" !"dsc$v_fl_redim" *Rdsc$descriptor_vs@dsc$w_maxstrlen dsc$b_dtype dsc$b_class dsc$a_pointer +Rdsc$descriptor_vsadsc$w_maxstrlen dsc$b_dtype dsc$b_class dsc$a_pointer @ dsc$b_scaleH dsc$b_digitsP dsc$b_aflags ,RX dsc$b_dimct` dsc$l_arsize-R,S-T-S $"dsc$v_fl_binscale" !"dsc$v_fl_redim" .Rdsc$descriptor_ubs` dsc$w_length dsc$b_dtype dsc$b_class dsc$a_base @ dsc$l_pos/Rdsc$descriptor_uba dsc$w_length dsc$b_dtype dsc$b_class dsc$a_base @ dsc$b_scaleH dsc$b_digitsP dsc$b_aflags 0RX dsc$b_dimct` dsc$l_arsize1R0S1T1S $"dsc$v_fl_binscale" !"dsc$v_fl_redim" 2Rdsc$descriptor_sb dsc$w_length dsc$b_dtype dsc$b_class dsc$a_pointer @ dsc$l_sb_l1` dsc$l_sb_u13Rdsc$descriptor_ubsb dsc$w_length dsc$b_dtype dsc$b_class dsc$a_base @ dsc$l_pos` dsc$l_ubsb_l1 dsc$l_ubsb_u14Riodefio$r_fcode_structure 5Rio$r_errlog_modifiers 6Rio$r_disk_tape_modifiers 7Rio$r_disk_modifiers 8Rio$r_tape_modifiers 9Rio$r_dutu_xfer_modifiers :Rio$r_du_sense_modifiers ;R io$r_du_packack_modifiers <Rio$r_du_avail_modifiers =R io$r_du_remshad_modifiers >R io$r_du_prfpath_modifiers ?Rio$r_du_dcd_modifiers @Rio$r_du_whm_modifiers AR"io$r_hbs_copyshad_modifiers BR!io$r_hbs_creshad_modifiers CRio$r_hbs_xfer_modifiers DRio$r_dr_modifiers ERio$r_dy_modifiers FRio$r_dd_modifiers GRio$r_ts11_modifiers HR,QJ {8!?sS疩,Cg#lсC1-MaH}Ȏk!8x2j:A*w7 K.LӺ)^-7PN2%IW "P[߁TIr[ѪH6,GSv&&m Xe9SEIe]Ǧ,4}^Xk~ ra`ܲBJJB w}8  rCk7F07~p_F96@#6LWl y/!%W+PnG܇\ټkK S ɋ܋3G9_Q`E#=CHcrc<hSBhu-d~:OPE:9Gqt316 H1C< ~z_bioPrx g"{Qf/e28myjfOeyw|!;ݟ&I$RTQ'&ur`pj{E;ʮ[lជυK ?]EkCԘ1?ҔTnM~$fg(NYg e+iX R(vڈ NpFAix/akξǜ~Cs3@YIE: xK \s&?X>AWں~Sb1}?S//jYrDlkM@Jv㪉O3KBy6vUv+b١?[0tlf?~ 0s- om/9e񀷏-ۂ}[|'M[)zr!3@25#GK?-PZ_R&Z(0dY=dʭ)"qcEesy2>m^2oaC}:$>J b? m1Yӛ1.68E从 Hҩ=ܟT"Tv䅫Aye(ǟ. B,4o Vpyvub"^B =]flRؙ r{*[Iq1VU(H7 a zUGX1L^ *< LN!bS4(]T#IHI_-<)z=nm,M˙4u;!57i,F [ufr<[a:2h!Xd/Vc!N8#) Qn- -hfeHNQ/%!S\)vYjDJ$̴)˳8jg;aOٿT)g_vgAhS@#C^?&p _&b40!fq PAN3c e7,tN~n[lD?Z#oY8)s}7bFxBb5+ބVW@z@i&qy*ZND%tTt"ΜodU`Ý^g; -3YmM\[`v'./MnQOLVbb;% xn^f6;"0x@&{ o z~a˯/SpQ}k s:^]O`E0_$S72k\>3٢t{=<[i =-iS&yf@KQGe rQV%֘Gϣo$S M*Q9ɮlX[N)z0zD/pAH4t= |-Z:.ш do,}vLjBQ~ϝB9EOr~iXfn$lD ; /Bzt r$A?3f)5 UY-!K2=9&3ܞ_@U~GYs4o8 oG7CBQCOBM{Pi'_9Aו`xH:exs";^ 7Af>aJ'T/qcs4?n9v7bnalO YdIOCs9FAO-<*`a,E:6婴.`GriYaZMȊfH(jJ%St' 14ӀJܵ5%VrhX66j 185hu|>eV |Ѽֶ\AIF=vc}G j>ٵY fc$X CMW4^5WrnzQכ:HiNlT0>?lwU VUQD00>q>ݟґ^C8U l6U&|][C _VfB-ZokL6\<ɃCG?eDcR8ͩo6#" io$v_fcode" ""io$v_fmodifiers " hR6ShThS $"io$v_fcode_fill_1" " io$v_filler_1"  " io$v_inherlog" " io$v_fill_6" iR7SiTiS $"io$v_fcode_fill_2" ,"io$v_rsvd_for_devdepend_1" " io$v_erase" " io$v_filler_2" +"io$v_rsvd_for_devdepend2" " io$v_exfunc" !"io$v_datacheck"  " io$v_inhretry" " io$v_syncsts"  " io$v_novcache" " io$v_fill_7" jR8SjTjS $"io$v_fcode_fill_3" ,"io$v_rsvd_for_devdepend_2" i" io$v_inhseek" " io$v_fill_8" kR9SkTkS $"io$v_fcode_fill_4" " io$v_reverse" " io$v_nowait" ,"io$v_rsvd_for_devdepend_3" !"io$v_inhextgap" !"io$v_retension" " io$v_fill_9" lR:SlTlS $"io$v_fcode_fill_5" &"io$v_dutux_reserved" d""io$v_mscpmodifs" " io$v_fill_10" mR;SmTmS $"io$v_fcode_fill_6" " io$v_shadow" " io$v_locate" nR<SnTnS $"io$v_fcode_fill_7" #"io$v_mscp_format" " io$v_fill_11" oR=SoToS $"io$v_fcode_fill_8"  " io$v_allhosts"  " io$v_dissolve" !"io$v_nocleanup" " io$v_fill_12" pR>SpTpS $"io$v_fcode_fill_9" . POPPASSD.BCK-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.OBJ;21Zf' " io$v_spindown" " io$v_fill_13" qR?SqTqS %"io$v_fcode_fill_10" !"io$v_forcepath" " io$v_fill_14" rR@SrTrS %"io$v_fcode_fill_11" $"io$v_est_com_path" $"io$v_lcl_src_unit" $"io$v_rtn_com_path" " io$v_fill_15" sRASsTsS %"io$v_fcode_fill_12" !"io$v_dealc_all" !"io$v_dealc_hrn" $"io$v_dealc_entloc"  " io$v_decr_afc" " io$v_read_all" " io$v_read_hrn" ""io$v_break_conn" " io$v_fill_16" tRBStTtS %"io$v_fcode_fill_13" " io$v_stepover" " io$v_cs_fill" " io$v_copyop" " io$v_fill_17" uRCSuTuS %"io$v_fcode_fill_14" " io$v_exists" " io$v_cbs" " io$v_booting" " io$v_fill_18" vRDSvTvS %"io$v_fcode_fill_15 " " io$v_vuex_fc" " io$v_fill_19" wRESwTwS %"io$v_fcode_fill_16" " io$v_commod" ""io$v_movetrackd" ""io$v_diagnostic" !"io$v_skpsecinh" " io$v_fill_20" xRFSxTxS %"io$v_fcode_fill_17" " io$v_deldata" " io$v_fill_21" yRGSyTyS %"io$v_fcode_fill_18" " io$v_nomrsp" " io$v_fill_22" zRHSzTzS %"io$v_fcode_fill_19" ,"io$v_rsvd_for_devdepend_4" " io$v_swap"  " io$v_opposite" " io$v_fill_23" c{RIS{T{S %"io$v_fcode_fill_20" ,"io$v_rsvd_for_devdepend_5" !"io$v_clserexcp" " io$v_fill_24" |RJS|T|S %"io$v_fcode_fill_21" !"io$v_chunkdiag" ,"io$v_rsvd_for_devdepend_6" " io$v_tbc" " io$v_fill_25" }RKS}T}S t%"io$v_fcode_fill_22" " io$v_enarep" " io$v_fill_26" ~RLS~T~S %"io$v_fcode_fill_23" " io$v_access" " io$v_create" " io$v_delete" " io$v_mount" " io$v_dmount" " io$v_remount" " io$v_movefile" " io$v_filler_8" !"io$v_rwshelved" " io$v_fill_27" RMSTS %"io$v_fcode_fill_24" " io$v_binary" " io$v_packed" RNSTS %"io$v_fcode_fill_25" " io$v_now"/ POPPASSD.BCK-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.OBJ;21Z. " io$v_stream" #"io$v_readercheck" #"io$v_writercheck" " io$v_norswait" " io$v_fill_28" ROSTS %"io$v_fcode_fill_26" &"io$v_mb_room_notify"  " io$v_readattn" " io$v_wrtattn" " io$v_setprot" ""io$v_readerwait" ""io$v_writerwait" " io$v_fill_29" RPSTS %"io$v_fcode_fill_27" " io$v_noecho" " io$v_timed" " io$v_cvtlow" " io$v_nofiltr" " io$v_dsablmbx" " io$v_purge" !"io$v_trmnoecho" " io$v_refresh" " io$v_escape" " io$v_extend" RQSTS %"io$v_fcode_fill_28" " io$v_canctrlo"  " io$v_enablmbx"  " io$v_noformat" !"io$v_breakthru" " io$v_newline" " io$v_fill_30" RRSTS %"io$v_fcode_fill_29" ""io$v_typeahdcnt" ("io$v_reserve_rd_modem" RSSTS %"io$v_fcode_fill_30" " io$v_maint"  " io$v_ctrlyast"  " io$v_ctrlcast" " io$v_hangup" " io$v_outband" s""io$v_tt_connect" !"io$v_tt_discon" ""io$v_tt_process" " io$v_brdcst" " io$v_fill_31" RTSTS %"io$v_fcode_fill_31" ."io$v_reserve_maint_escape_1" " io$v_loop" " io$v_unloop"  " io$v_line_off" !"io$v_set_modem" " io$v_line_on" " io$v_loop_ext" ""io$v_autxof_ena" ""io$v_autxof_dis" +"io$v_reserve_int_disable" RUSTS %"io$v_fcode_fill_32" ."io$v_reserve_maint_escape_2" " io$v_include" " io$v_tt_abort" " io$v_fill_32" RVSTS %"io$v_fcode_fill_33" !"io$v_posixinit" $!"io$v_posixflow" RWSTS %"io$v_fcode_fill_34" +"io$v_reserve_init_escape" !"io$v_set_posix" #"io$v_clear_posix" #"io$v_set_termios" " io$v_set_ptc" !"io$v_clear_ptc" !"io$v_flush_tab" $"io$v_flush_output" ""io$v_update_ptc" " io$v_fill_33" RXSTS %"io$v_fcode_fill_35" +"io$v_reserve_flow_escape"  " io$v_out_xoff" " io$v_out_xon" " io$v_in_xoff" " io$v_in_xon" " io$v_fill_34" RYSTS %"io$v_fcode_fill_36" ""io$0 POPPASSD.BCK-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.OBJ;21Z5v_o_nonblock" " io$v_fill_35" RZSTS %"io$v_fcode_fill_37" !"io$v_interrupt"  " io$v_multiple" " io$v_lockbuf" " io$v_noblock" " io$v_fill_36" R[STS %"io$v_fcode_fill_38" " io$v_reserved" " io$v_abort" " io$v_synch" " io$v_fill_37" R\STS %"io$v_fcode_fill_39" " io$v_response" " io$v_fill_38" R]STS %"io$v_fcode_fill_40" " io$v_startup"  " io$v_shutdown" " io$v_attnast" " io$v_ctrl" )"io$v_reserve_set_modem" " io$v_set_mac" " io$v_fill_39" vR^STS %"io$v_fcode_fill_41" " io$v_rd_mem"  " io$v_rd_modem"  " io$v_rd_count" $"io$v_reserve_ctrl" !"io$v_clr_count" !"io$v_sense_mac" " io$v_fill_40" R_STS %"io$v_fcode_fill_42" " io$v_more" !"io$v_qualified" tR`STS %"io$v_fcode_fill_43" " io$v_redirect" " io$v_accept" RaSTS %"io$v_fcode_fill_44" " io$v_setevf" " io$v_fill_41" RbSTS %"io$v_fcode_fill_45" " io$v_word"  " io$v_filler_3"  " io$v_filler_4" " io$v_setfnct" " io$v_datapath" " io$v_filler_5" " io$v_cycle" " io$v_reset" " io$v_fill_42" RcSTS %"io$v_fcode_fill_46" " io$v_filler_6"  " io$v_setcuadr"  " io$v_setbsize" !"io$v_setpoolsz" !"io$v_setenqcnt" " io$v_clear" " io$v_lpbext" " io$v_lpbint" " io$v_readcsr" RdSTS %"io$v_fcode_fill_47" !"io$v_noctswait"  " io$v_slavloop" !"io$v_nodsrwait" !"io$v_maintloop" !"io$v_lastblock" " io$v_filler_7" " io$v_intclock" " io$v_fill_43" oReSTS %"io$v_fcode_fill_48" ""io$v_lt_connect" !"io$v_lt_discon" #"io$v_lt_readport" #"io$v_lt_map_port" !"io$v_lt_rating" #"io$v_lt_sol_info" #"io$v_lt_rcv_info" ""io$v_lt_setmode" $"io$v_lt_sensemode" ("io$v_lt_que_chg_notif" RfSTS %"io$v_lt_map_filler" %"io1 POPPASSD.BCK-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.OBJ;21Z\<$v_lt_map_nodnam" %"io$v_lt_map_pornam" %"io$v_lt_map_srvnam" %"io$v_lt_map_lnknam" %"io$v_lt_map_netadr" " io$v_fill_44" R STSflags " uai$v_disctly" " uai$v_defcli"  " uai$v_lockpwd" #"uai$v_restricted" o " uai$v_disacnt" ""uai$v_diswelcom"  " uai$v_dismail" " uai$v_nomail" " uai$v_genpwd" $"uai$v_pwd_expired" %"uai$v_pwd2_expired" " uai$v_audit" ""uai$v_disreport" %"uai$v_disreconnect" ""uai$v_autologin" ,"uai$v_disforce_pwd_change"  " uai$v_captive" !"uai$v_disimage" ""uai$v_dispwddic" ""uai$v_dispwdhis" ""uai$v_defclsval"  " uai$v_fill_16" R primedays" uai$v_monday" " uai$v_tuesday" ""uai$v_wednesday" !"uai$v_thursday" " uai$v_friday" !"uai$v_saturday" " uai$v_sunday"  " uai$v_fill_17" R ARPREQDEFARP$T_PAt*&ARP$T_HA*& ARP$R_OVLY RRSTS  ARP$W_FLAGS ARP$R_O_FLAGS RRSTS " ARP$V_IN_USE" " ARP$V_COM" " ARP$V_PERM" " ARP$V_PUBL" $"ARP$V_USETRAILERS" " ARP$V_fill_0" RIFREQDEF IFR$T_NAME*& IFR$R_DUMMY RRSTS  IFR$T_ADDR*& IFR$T_DSTADDR*&IFR$T_BROADADDR*&IFR$R_DUMMY_1_OVRL R IFR$L_DATA RSTS $ IFR$W_FLAGSIFR$R_DUMMY_1_BITS RRSTS " IFR$V_IFF_UP" &"IFR$V_IFF_BROADCAST" ""IFR$V_IFF_DEBUG" %"IFR$V_IFF_LOOPBACK" ("IFR$V_IFF_POINTOPOINT" '"IFR$V_IFF_NOTRAILERS" $"IFR$V_IFF_RUNNING" ""IFR$V_IFF_NOARP" $"IFR$V_IFF_PROMISC" %"IFR$V_IFF_ALLMULTI" %"IFR$V_IFF_DYNPROTO" " IFR$V_IFF_MOP" $"IFR$V_IFF_RESERVE" #"IFR$V_IFF_NONAME" $"IFR$V_IFF_CLUSTER" RMSGBITSINET$R_MSG_BITS RRSTS !"INET$V_MSG_OOB" ""INET$V_MSG_PEEK" '"INET$V_MSG_DONTROUTE" ""INET$V_DUMMYN_4" ""INET$V_DUMMYN_5" #"INET$V_MSG_PURGE" ""INET$V_MSG_NBIO" &"INET$V_MSG_BLOCKALL" R MSGBITS_1UCX$R_MSG_BITS 2 POPPASSD.BCK-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.OBJ;21Z>CRRSTS  " UCX$V_MSG_OOB" !"UCX$V_MSG_PEEK" &"UCX$V_MSG_DONTROUTE" !"UCX$V_DUMMYX_4" !"UCX$V_DUMMYX_5" ""UCX$V_MSG_PURGE" !"UCX$V_MSG_NBIO" %"UCX$V_MSG_BLOCKALL" R SOCKOPTDEFUCX$R_OPT_OVRLY RRSTS  UCX$W_OPTIONSUCX$R_OPT_BITS RRSTS ""UCX$V_DEBUGGING" #"UCX$V_ACCEPTCONN" ""UCX$V_REUSEADDR" ""UCX$V_KEEPALIVE" ""UCX$V_DONTROUTE" ""UCX$V_BROADCAST" $"UCX$V_USELOOPBACK" " UCX$V_LINGER" ""UCX$V_OOBINLINE" !"UCX$V_DUMMYM_2" !"UCX$V_DUMMYM_3" !"UCX$V_DUMMYM_4" !"UCX$V_DUMMYM_5" *"UCX$V_FULL_DUPLEX_CLOSE" &"UCX$V_NO_RCV_CHKSUM" &"UCX$V_NO_SND_CHKSUM" ROPTDEF` OPT$W_LENGTH OPT$W_NAME OPT$L_ADDR @OPT$L_RET_LENGTH R RTENTRYDEF RT$L_HASH RT$R_DST_OVRLY RRT$R_GATEWAY_OVRLY R RT$R_FLAGS_OVRLY R0 RT$W_REFCNT@RT$L_USE`RT$L_IFP RT$L_NEXTRSTS RT$R_DST_FIELDS RRT$T_DST*&RSTS RT$W_DST_SIN_FAMILYRT$W_DST_SIN_PORT RT$L_DST_SIN_ADDR@RT$T_DST_SIN_ZERO*&RSTS RT$R_GATEWAY_FIELDS R RT$T_GATEWAY*&RSTS RT$W_GATEWAY_SIN_FAMILYRT$W_GATEWAY_SIN_PORT RT$L_GATEWAY_SIN_ADDR@RT$T_GATEWAY_SIN_ZERO*&vRSTS  RT$W_FLAGSRT$R_FLAGS_BITS RRSTS " RT$V_RTF_UP" #"RT$V_RTF_GATEWAY"  " RT$V_RTF_HOST" #"RT$V_RTF_DYNAMIC" $"RT$V_RTF_MODIFIED" " RT$V_fill_1" R SOCKETOPTDEFSOCKOPT$R_OPT_OVRLY RRSTS SOCKOPT$W_OPTIONSSOCKOPT$R_OPT_BITS RRSTS ""SOCKOPT$V_DEBUG" '"SOCKOPT$V_ACCEPTCONN" &"SOCKOPT$V_REUSEADDR" &"SOCKOPT$V_KEEPALIVE" &"SOCKOPT$V_DONTROUTE" &"SOCKOPT$V_BROADCAST" ("SOCKOPT$V_USELOOPBACK" #"SOCKOPT$V_LINGER" &"SOCKOPT$V_OOBINLINE" %"SOCKOPT$V_DUMMYB_2" %"SOCKOPT$V_DUMMYB_3" %"SOCKOPT$V_DUMMYB_4" %"SOCKOPT$V_DUMMYB_5" ."SOCKOPT$V_FULL_DUPLEX_CLOSE" *"SOCKOPT$V_NO_RCV_CHKSUM" *"SOCKOPT$V_NO_SND_CHKSUM3 POPPASSD.BCK-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.OBJ;21Z/J" RINETSOCKOPTDEFINET$R_OPT_OVRLY RRSTS INET$W_OPTIONSINET$R_OPT_BITS RRSTS " INET$V_DEBUG" $"INET$V_ACCEPTCONN" #"INET$V_REUSEADDR" #"INET$V_KEEPALIVE" #"INET$V_DONTROUTE" #"INET$V_BROADCAST" %"INET$V_USELOOPBACK"  " INET$V_LINGER" #"INET$V_OOBINLINE" ""INET$V_DUMMYB_2" ""INET$V_DUMMYB_3" ""INET$V_DUMMYB_4" ""INET$V_DUMMYB_5" +"INET$V_FULL_DUPLEX_CLOSE" '"INET$V_NO_RCV_CHKSUM" '"INET$V_NO_SND_CHKSUM" RSOCKADDR SA$W_FAMILY SA$T_DATA*& R SOCKADDRIN SIN$W_FAMILY SIN$W_PORT SIN$L_ADDR@ SIN$T_ZERO*&R NETENTDEF NET$L_N_NAME  NET$L_N_ALIASES @NET$L_N_ADDRTYPE` NET$L_N_NETR HOSTENTDEF HOST$L_H_NAME  HOST$L_H_ALIASES @HOST$L_H_ADDRTYPE`HOST$L_H_LENGTHHOST$L_H_ADDR_LIST R LOG_PIDR  LOG_LOCAL2RSTS LOG_ERR peer Taddr_lenR ` siz cod bufadr @retadr descriptor TR @ quot  remR @ quot  rem  P13/ 8P23/  HP33/ `P43/ DECC$GA_STDERRdecc$ga_stderr  TDECC$$GA___CTYPETdecc$$ga___ctypet-)&DECC$$GL___CTYPEAdecc$$gl___ctypeaNET_LOGIN_UAICTXnet_login_uaictx sock<< hE(CAL$SYSDAT:[DECC$LIB.INCLUDE]VARARGS.H;8:L}E &CAL$SYSDAT:[DECC$LIB.INCLUDE]ERRNO.H;8;|^E j'CAL$SYSDAT:[DECC$LIB.INCLUDE]STDLIB.H;8;\fE'CAL$SYSDAT:[DECC$LIB.INCLUDE]UNISTD.H;7HEhwn4USR$ADMIN:[GEGE.DEVELOP.IUPOP3.POP_PASS]NETLOGIN.H;87ħ]#SYS$COMMON:[SYSLIB]UCX$INETDEF.H;14;eED'CAL$SYSDAT:[DECC$LIB.INCLUDE]UAIDEF.H;8:, Ej&CAL$SYSDAT:[DECC$LIB.INCLUDE]IODEF.H;8<,'E'(CAL$SYSDAT:[DECC$LIB.INCLUDE]DESCRIP.H;89 \6aE %CAL$SYSDAT:[DECC$LIB.INCLUDE]TIME.H;8; d]E'CAL$SYSDAT:[DECC$LIB.INCLUDE]STDARG.H;8: *E&CAL$SYSDAT:[DECC$LIB.INCLUDE]NETDB.H;89 ; Ev%CAL$SYSDAT:[DECC$LIB.INCLUDE]INET.H;87 S E J#CAL$SYSDAT:[DECC$LIB.INCLUDE]IN.H;8:E *&CAL$SYSDAT:[DECC$LIB.INCLUDE]CTYPE.H;8D񚙚 F0USR$ADMIN:[GEGE.DEVELOP.IUPOP3.POP_PASS]VMS.C;76:AbeE&CAL$SYSDAT:[DECC$LIB.INCLUDE]TYPES.H;89| ]E %CAL$SYSDAT:[DECC$LIB.INCLUDE]S4 POPPASSD.BCK-[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.OBJ;21Zu#QTAT.H;8:| ^Er&CAL$SYSDAT:[DECC$LIB.INCLUDE]STDIO.H;8;KgE'CAL$SYSDAT:[DECC$LIB.INCLUDE]UNIXIO.H;8;\_E $'CAL$SYSDAT:[DECC$LIB.INCLUDE]STRING.H;8I+/⦕),5USR$ADMIN:[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.C;14     p  " &# h @         3   e   e            z    > F     X 9 DECC$DSSCANF DECC$DSPRINTF DECC$DPRINTF DECC$DFPRINTF DECC$STRLEN DECC$STRNCMP DECC$STRCPY OPENLOG SYSLOG  WRITE_SOCK  WRITETOCLIENT XREADFROMCLIENT |CHKPASS p<SETPASS X WRITESTRING __MAIN MAINDECC$MAIN_ARGS $CODEl$DATASOCK  WRITETOCLIENT DECC$EXITSYSLOG WRITETOCLIENTREADFROMCLIENT DECC$STRNCMPP WRITETOCLIENT DECC$EXIT WRITETOCLIENT DECC$EXIT  DECC$EXITPO RRSTS  UCX$W_OPTIONSUCX$R,*[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.ORI;1+,.-/ 4N-(P-0123KPWO)56Sy"77"78֚9g@*GHJ/* * poppassd.c *- * A Eudora and NUPOP change password server. * * John Norstad* * Academic Computing and Network Services * Northwestern University * j-norstad@nwu.edu *B * Based on earlier versions by Roy Smith and Daniel * L. Leavitt . * G * Doesn't actually change any passwords itself. It simply listens forF * incoming requests, gathers the required information (user name, oldG * password, new password) and executes /bin/passwd, talking to it overG * a pseudo-terminal pair. The advantage of this is that we don't needF * to have any knowledge of either the password file format (which mayD * include dbx files that need to be rebuilt) or of any file lockingI * protocol /bin/passwd and cohorts may use (and which isn't documented). *G * The current version has been tested at NU under SunOS release 4.1.2 G * and 4.1.3, and under HP-UX 8.02 and 9.01. We have tested the server ( * with both Eudora 1.3.1 and NUPOP 2.0. *E * Other sites report that this version also works under AIX and NIS, * and with PC Eudora. *H * Note that unencrypted passwords are transmitted over the network. IfG * this bothers you, think hard about whether you want to implement theI * password changing feature. On the other hand, it's no worse than whatI * happens when you run /bin/passwd while connected via telnet or rlogin.I * Well, maybe it is, since the use of a dedicated port makes it slightly@ * easier for a network snooper to snarf passwords5 POPPASSD.BCK,[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.ORI;1N-~ off the wire. *K * NOTE: In addition to the security issue outlined in the above paragraph,F * you should be aware that this program is going to be run as root byJ * ordinary users and it mucks around with the password file. This shouldH * set alarms off in your head. I think I've devised a pretty foolproofL * way to ensure that security is maintained, but I'm no security expert andI * you would be a fool to install this without first reading the code andJ * ensuring yourself that what I consider safe is good enough for you. If3 * something goes wrong, it's your fault, not mine. *> * The front-end code (which talks to the client) is directly M * descended from Leavitt's original version. The back-end pseudo-tty stuff D * (which talks to /bin/password) is directly descended from Smith'sG * version, with changes for SunOS and HP-UX by Norstad (with help from@ * sample code in "Advanced Programming in the UNIX Environment"H * by W. Richard Stevens). The code to report /bin/passwd error messagesI * back to the client in the final 500 response, and a new version of the1 * code to find the next free pty, is by Norstad. * K * Should be owned by root, and executable only by root. It can be started: * with an entry in /etc/inetd.conf such as the following: *C * poppassd stream tcp nowait root /usr/local/bin/poppassd poppassd *  * and in /etc/services: *  * poppassd 106/tcp *H * Logs to the local2 facility. Should have an entry in /etc/syslog.conf * like the following: *$ * local2.err /var/adm/poppassd-log */ /* Modification history. * * 06/09/93. Version 1.0. * * 06/29/93. Version 1.1.A * Include program name 'poppassd' and version number in initial  * hello message.A * Case insensitive command keywords (user, pass, newpass, quit).? * Fixes problem reported by Raoul Schaffner with PC Eudora.E * Read 'quit' command from client instead of just terminating after  * password change.< * Add new code for NIS support (contributed by Max Caines). * * 08/31/93. Version 1.2.E * Generalized the expected string matching to solve several problems@ * with NIS and AIX. The new "*" character in pattern strings3 * matches any sequence of 0 or more characters.@ * Fix an error in the "getemess" function which could cause the@ * program to hang if more than one string was defined in the * P2 array. */5/* Steve Dorner's description of the simple protocol: *D * The server's responses should be like an FTP server's responses; A * 1xx for in progress, 2xx for success, 3xx for more informationF * needed, 4xx for temporary failure, and 5xx for permanent failure. 9 * Putting it all together, here's a sample conversation: * * S: 200 hello\r\n * E: user yourloginname\r\n- * S: 300 please send your password now\r\n$ * E: pass yourcurrentpassword\r\n" * S: 200 My, that was tasty\r\n# * E: newpass yournewpassword\r\n * S: 200 Happy to oblige\r\n * E: quit\r\n * S: 200 Bye-bye\r\n * S:  * E:  */ #define VERSION "1.2"#define SUCCESS 1#define FAILURE 0#define BUFSIZE 512#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include A/* Prompt strings expected from the "passwd" command. If you wantJ * to port this program to yet another flavor of UNIX, you may need to add * more prompt strings here. *? * Each prompt is defined as an array of pointers to alternate > * strings, terminated by an empty string. In the strings, '*'A * matches any sequence of 0 or more characters. Pattern matching * is case-insensitive. */static char *P1[] = {"Old password:",. "Changing password for *.\nOld password:",3 "Changing password for * on *.\nOld password:",7 "Changing NIS password for * on *.\nOld password:",1 "Changing password for *\n*'s Old password:", ""};static char *P2[] = {"\nNew password:", "\n*'s New password:", ""};static char *P3[] = {"\nRe-enter new password:", "\nRetype new password:",& "\nEnter the new password again:",$ "\n*Re-enter *'s new password:", "\nVerify:", ""}; static char *P4[] = {"\n", "NIS entry changed on *\n", ""};main (argc, argv) int argc; char *argv[];{ char line[BUFSIZE]; char user[BUFSIZE]; char oldpass[BUFSIZE]; char newpass[BUFSIZE]; char emess[BUFSIZE]; char *slavedev;$ struct passwd *pw, *getpwnam(); int c, master; pid_t pid, wpid; int wstat; % *user = *oldpass = *newpass = 0; 7 if (openlog ("poppassd", LOG_PID, LOG_LOCAL2) < 0) {2 WriteToClient ("500 Can't open syslog."); exit (1); } E WriteToClient ("200 poppassd v%s hello, who are you?", VERSION); ReadFromClient (line);% sscanf (line, "user %s", user) ; if (strlen (user) == 0) {2 WriteToClient ("500 Username required."); exit(1); }1 WriteToClient ("200 your password please."); ReadFromClient (line);( sscanf (line, "pass %s", oldpass) ; if (strlen (oldpass) == 0) {2 WriteToClient ("500 Password required."); exit(1); } ( if ((pw = getpwnam (user)) == NULL) {7 WriteToClient ("500 Unknown user, %s.", user); exit(1); }0 if (chkPass (user, oldpass, pw) == FAILURE) {: WriteToClient ("500 Old password is incorrect."); exit(1); }5 WriteToClient ("200 your new password please."); ReadFromClient (line);* sscanf (line, "newpass %s", newpass);  /* new pass required */ if (strlen (newpass) == 0) {6 WriteToClient ("500 New password required."); exit(1); }. /* get pty to talk to password program */, if ((master = findpty (&slavedev)) < 0) {, syslog (LOG_ERR, "can't find pty");> WriteToClient("500 Server busy - try again later."); exit (1); } 9 /* fork child process to talk to password program */8 if ((pid = fork()) < 0) /* Error, can't fork */ {7 syslog (LOG_ERR, "can't fork for passwd: %m");K WriteToClient ("500 Server error (can't fork passwd), get help!"); exit (1); } if (pid) /* Parent */ {N sleep (1); /* Make sure child is ready. Is this really needed? */L if (talktochild (master, user, oldpass, newpass, emess) == FAILURE) {= syslog (LOG_ERR, "failed attempt by %s", user);# if (*emess == '\0') {C WriteToClient ("500 Unable to7uw!LA锚$^boOBeaoO08%N j y|i9Nק_D'_Nl+EO0 =$d"P=." #\/7vW =TO/[ om05)ܽ@]}z7pGr+MVJ@d?j:`@zԋ6ϐ&L6 yiC'H)|/Vǎ1EhGC+gύXO=ZCNG_p)423a?]ҏ%pIk./b[F =,DZ ǥAS5{@// Y|OP kpejtM<= ~gyh5 J0F2B i8}6`obPqR3eP.BG_1c[f4.c_z9^O\zR!2!^ Wkeḽx1tvc|-Bl`G! .w):"y#P @s/VH;fgARk( =в]b51}ŽV9{q jNV[H^KQ'R*JeQA8oG)pPHƳ[9C54$ Br6v'fBBDZ|w_UMcg)1>@+?c6>ULZ"xw{k?RnK3 d^F%~5939l݆85I'$8Py˯bvEqnj ˵?Dowu;h8@! ;!7ۆ9AQ^ 4Fy7:4([):v/&kb DwA8wq|d$pW''E>Ftr6ֿw&V.H:&oղŦ2s[V;xh:귞Mu^sFd. xM?!zk u XL/eS[ss pDRg-5LlG;^sb,h5">rF` != 'haq$l!IPaAE)~ߟmd~ĪXc|\@&;9_䣀.$A-*|Ic}Y(bc]$/k?IK#\L-И=7 C-F.zZ.s kjҎH_?8z6*P>.:>ػY^>6Kxk4D \27]Z+aTu ͮڪiM\xG30y+p<ȥ=vGWA7ZkؐtBVczA>(1Rc\دT<)tdtcscnI)_XH LqL;Hǁt rd2>73F5 g^INS{M8d3!``;},!q+hjֻtmTOU.-;wxjK+[OVyu`Cj" UVMRiDQ'I+x7>OuI}mWia J BbyhB(Y[12Mۋ^XƁ%WI"k Bb4 iF푤pfۙIU`ka3_7x~Oc"ZR'|p/m(v0*/rFu\YNNQFv-PES$Z.c&T*33 }A+7AD )Z _C(S{0argZ(aTѶtT 7 Rd`\;V$jvS:zy@]3g%_8$q`H>,`s8x MDimM9"LÄWf¦~Pf?2D@0@I N$R'2I,2 Z1"^69>~ )n{tGQ`93G8 :t +4{ , a^7t&snN@rHxNavT/=n${z1] vx r$F<,H.bNm&M*Vgdf0̱r]U1sa8{k-zZbj A3m(E]m|ZJh=쭞ǤJdXX(hcrl8% kQ7n4c\C3CyBm@w2y- )O n|7ҷVA79[1}b?*!Llf|'Fg2(Z+ &CA/-Fy[}Uxsbp kXj/osܡ+/%qL_Q /POAyv.S[ ~`=Wx'PoLT7s7t[|Di "aH&',5M[\LhGGW_U%Kztw|A#'v#F%oNiT7 XRizcP#f-nb&`ں&<";ZJ,VC ,]<a}lFyZj]CS^Id5%(uYo% 5+Zc/I1MK.?= pPʋ-O>-5wX>fzoSqk/.VCYfyh#z cq@ui.ɍdo@*m@Rl=?$0FdTnntUb*OmD%zdcheG.;f9WYg1p=.{ {4Rm=UyIfFCLsyb ~ -TGFj?(0< MWe+yr$V`3{ Q#y4 63Q[h'j`e^ThVucbgE l_n87ee0;>)c_mG@$AaSS@)!5IH5-%p2-\~rDuƪ5C &]S&+ZQn<=g(D;^+m@^;A;s'*v%^ID+7xB_ԥwiZ0B QcGttYHbSV=Q|h56sbw!XytV\FdBjOv&wW u-://GPQp7f){5~pz' Ia>\!d|dIXs'\NglVYXUSո7_U?4-pr5&mriWDvCP% bbD5aWfx+үI]g%dw] zucr >?$|vgTA(*03f> 5Je6[![iI{n̄bK^iS[7TJk,iQ+lP~u`$ 7`31vyAjЕ$[b)TPJ^b+&[h%ozB]{X {p{` ߚm~B n$vab vp҇N-`+18 POPPASSD.BCK,[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.ORI;1N-v8 change password." ); } else {1 WriteToClient ("500 %s", emess); } exit(1); }3 if ((wpid = waitpid (pid, &wstat, 0)) < 0) {H syslog (LOG_ERR, "wait for /bin/passwd child failed: %m");J WriteToClient ("500 Server error (wait failed), get help!"); exit (1); } if (pid != wpid) {G syslog (LOG_ERR, "wrong child (/bin/passwd waited for!");J WriteToClient ("500 Server error (wrong child), get help!"); exit (1); }$ if (WIFEXITED (wstat) == 0) {> syslog (LOG_ERR, "child (/bin/passwd) killed?");J WriteToClient ("500 Server error (funny wstat), get help!"); exit (1); }& if (WEXITSTATUS (wstat) != 0) {H syslog (LOG_ERR, "child (/bin/passwd) exited abnormally");L WriteToClient ("500 Server error (abnormal exit), get help!"); exit (1); }; syslog (LOG_ERR, "password changed for %s", user);< WriteToClient ("200 Password changed, thank-you."); ReadFromClient (line);- if (strncmp(line, "quit", 4) != 0) {3 WriteToClient("500 Quit required."); exit (1); } # WriteToClient("200 Bye."); exit (0); } else /* Child */ { /*J * Become the user trying who's password is being changed. We'reJ * about to exec /bin/passwd with is setuid root anyway, but thisG * way it looks to the child completely like it's being run byL * the normal user, which makes it do its own password verificationJ * before doing any thing. In theory, we've already verified theN * password, but this extra level of checking doesn't hurt. Besides,H * the way I do it here, if somebody manages to change somebodyK * else's password, you can complain to your vendor about security * holes, not to me! */ setuid (pw->pw_uid); setgid (pw->pw_gid);* dochild (master, slavedev, user); }}/* * dochild *; * Do child stuff - set up slave pty and execl /bin/passwd. *C * Code adapted from "Advanced Programming in the UNIX Environment" * by W. Richard Stevens. * */ dochild (master, slavedev, user) int master;char *slavedev, *user;{ int slave; struct termios stermios;> /* Start new session - gets rid of controlling terminal. */  if (setsid() < 0) {+ syslog(LOG_ERR, "setsid failed: %m"); return(0); }@ /* Open slave pty and acquire as new controlling terminal. */. if ((slave = open(slavedev, O_RDWR)) < 0) {2 syslog(LOG_ERR, "can't open slave pty: %m"); return(0); } /* Close master. */ close(master);+ /* Make slave stdin/out/err of child. */3 if (dup2(slave, STDIN_FILENO) != STDIN_FILENO) {1 syslog(LOG_ERR, "dup2 error to stdin: %m"); return(0); }5 if (dup2(slave, STDOUT_FILENO) != STDOUT_FILENO) {2 syslog(LOG_ERR, "dup2 error to stdout: %m"); return(0); }5 if (dup2(slave, STDERR_FILENO) != STDERR_FILENO) {2 syslog(LOG_ERR, "dup2 error to stderr: %m"); return(0); } if (slave > 2) close(slave);K /* Set proper terminal attributes - no echo, cano9 POPPASSD.BCK,[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.ORI;1N-nical input processing,& no map NL to CR/NL on output. */% if (tcgetattr(0, &stermios) < 0) {- syslog(LOG_ERR, "tcgetattr error: %m"); return(0); }8 stermios.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL); stermios.c_lflag |= ICANON; stermios.c_oflag &= ~(ONLCR);. if (tcsetattr(0, TCSANOW, &stermios) < 0) {- syslog(LOG_ERR, "tcsetattr error: %m"); return(0); } /* Fork /bin/passwd. */< if (execl("/bin/passwd", "passwd", user, (char*)0) < 0) {4 syslog(LOG_ERR, "can't exec /bin/passwd: %m"); return(0); }}/* * findpty() *K * Finds the first available pseudo-terminal master/slave pair. The masterL * side is opened and a fd returned as the function value. A pointer to theJ * name of the slave side (i.e. "/dev/ttyp0") is returned in the argument,K * which should be a char**. The name itself is stored in a static buffer. *5 * A negative value is returned on any sort of error. *L * Modified by Norstad to remove assumptions about number of pty's allocated * on this UNIX box. */findpty (slave) char **slave;{ int master;$ static char *line = "/dev/ptyXX"; DIR *dirp; struct dirent *dp; dirp = opendir("/dev");) while ((dp = readdir(dirp)) != NULL) {J if (strncmp(dp->d_name, "pty", 3) == 0 && strlen(dp->d_name) == 5) {! line[8] = dp->d_name[3];! line[9] = dp->d_name[4];2 if ((master = open(line, O_RDWR)) >= 0) { line[5] = 't'; *slave = line; closedir(dirp); return (master); } } } closedir(dirp); return (-1);}/* * writestring() *2 * Write a string in a single write() system call. */writestring (fd, s)char *s;{ int l; l = strlen (s); write (fd, s, l);}/* * talktochild() *K * Handles the conversation between the parent and child (password program) * processes. *I * Returns SUCCESS is the conversation is completed without any problems,J * FAILURE if any errors are encountered (in which case, it can be assumed% * that the password wasn't changed). */3talktochild (master, user, oldpass, newpass, emess) int master;'char *user, *oldpass, *newpass, *emess;{ char buf[BUFSIZE]; char pswd[BUFSIZE+1]; int m, n; *emess = 0;2 if (!expect(master, P1, buf)) return FAILURE;$ sprintf(pswd, "%s\n", oldpass); writestring(master, pswd);2 if (!expect(master, P2, buf)) return FAILURE;$ sprintf(pswd, "%s\n", newpass); writestring(master, pswd);$ if (!expect(master, P3, buf)) {" getemess(master, P2, buf); strcpy(emess, buf); return FAILURE; } writestring(master, pswd);2 if (!expect(master, P4, buf)) return FAILURE; return SUCCESS;}/* * match () *B * Matches a string against a pattern. Wild-card characters '*' inH * the pattern match any sequence of 0 or more characters in the string.! * The match is case-insensitive. * * Entry: str = string. * pat = pattern. * * Exit: function result = * 0 if no match.> * 1 if the string matches some initial segment of * the pattern.8 * 2 if the string matches the full pattern. */match (str, pat) char *str; char *pat;{ int result; 5 for (; *str && *pat && *pat != '*'; str++, pat++) 3 if (tolower(*str) != tolower(*pat)) return 0;: POPPASSD.BCK,[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.ORI;1N-OK + if (*str == 0) return *pat == 0 ? 2 : 1; if (*pat == 0) return 0;L for (; *str; str++) if ((result = match(str, pat+1)) != 0) return result; return 0; }/* * expect () *D * Reads 'passwd' command output and compares it to expected output. *% * Entry: master = fid of master pty.F * expected = pointer to array of pointers to alternate expected5 * strings, terminated by an empty string." * buf = pointer to buffer. *F * Exit: function result = SUCCESS if output matched, FAILURE if not.- * buf = the text read from the slave. *A * Text is read from the slave and accumulated in buf. As long asA * the text accumulated so far is an initial segment of at least @ * one of the expected strings, the function continues the read.= * As soon as one of full expected strings has been read, theC * function returns SUCCESS. As soon as the text accumulated so farC * is not an initial segment of or exact match for at least one of 6 * the expected strings, the function returns FAILURE. */expect (master, expected, buf) int master;char **expected; char *buf;{ int n, m; char **s; int initialSegment; int result; n = 0; buf[0] = 0; while (1) { if (n >= BUFSIZE-1) {@ syslog(LOG_ERR, "buffer overflow on read from child"); return FAILURE; }, m = read(master, buf+n, BUFSIZE-1-n); if (m < 0) {7 syslog(LOG_ERR, "read error from child: %m"); return FAILURE; } n += m; buf[n] = 0; initialSegment = 0;+ for (s = expected; **s != 0; s++) {# result = match(buf, *s);* if (result == 2) return SUCCESS;: initialSegment = initialSegment || result == 1;  }+ if (!initialSegment) return FAILURE; }}/* * getemess() *D * This function accumulates a 'passwd' command error message issued6 * after the first copy of the password has been sent. *% * Entry: master = fid of master pty.F * expected = pointer to array of pointers to alternate expectedB * strings for first password prompt, terminated by an  * empty string.> * buf = pointer to buffer containing text read so far. *6 * Exit: buf = the error message read from the slave. *D * Text is read from the slave and accumulated in buf until the textE * at the end of the buffer is an exact match for one of the expectedI * prompt strings. The expected prompt string is removed from the buffer,G * returning just the error message text. Newlines in the error message * text are replaced by spaces. */ getemess (master, expected, buf) int master;char **expected; char *buf;{ int n, m; char **s; char *p, *q; n = strlen(buf); while (1) {) for (s = expected; **s != 0; s++) {! for (p = buf; *p; p++) {$ if (match(p, *s) == 2) { *p = 0;? for (q = buf; *q; q++) if (*q == '\n') *q = ' '; return; } } } if (n >= BUFSIZE-1) {> syslog(LOG_ERR, "buffer overflow on read from child"); return; }+ m = read(master, buf+n, BUFSIZE+1-n); if (m < 0) {5 syslog(LOG_ERR, "read error from child: %m"); return; } n += m; buf[n] = 0; }}WriteToClient (fmt, va_alist) char *fmt;va_dcl{ va_list ap;  v; POPPASSD.BCK,[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.ORI;1N-'a_start (ap);" vfprintf (stdout, fmt, ap); fputs ("\r\n", stdout ); fflush (stdout); va_end (ap);}ReadFromClient (line) char *line;{ char *sp; int i; strcpy (line, "");$ fgets (line, BUFSIZE, stdin);: if ((sp = strchr(line, '\n')) != NULL) *sp = '\0'; : if ((sp = strchr(line, '\r')) != NULL) *sp = '\0';  ; /* convert initial keyword on line to lower case. */ > for (sp = line; isalpha(*sp); sp++) *sp = tolower(*sp);}int chkPass (user, pass, pw) char *user; char *pass;struct passwd *pw;{F /* Compare the supplied password with the password file entry */B if (strcmp (crypt (pass, pw->pw_passwd), pw->pw_passwd) != 0) return (FAILURE); else  return (SUCCESS);}+*[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.SH;1+,.6/ 46-&-0123KPWO.56 {67!78X㤥]9g@*GHJ/* * poppassd.c * * John Norstad * Northwestern University * j-norstad@nwu.edu * * IMPORTANT NOTE: * * Please do not write to me asking for help getting this program running * on your system. You are on your own. If you send me email about this * program, I will not read it, and I will not reply to it. Sorry, but the * only alternative is to not distribute it at all. * * Based on earlier versions by Roy Smith and Daniel * L. Leavitt . #!/bin/sh # This is a shell archive (shar 3.32) # made 01/28/1994 20:35 UTC by sdorner@ux1.cso.uiuc.edu # Source directory /cso/staff/sdorner # # existing files WILL be overwritten # # This shar contains: # length mode name # ------ ---------- ------------------------------------------ # 345 -rw-r--r-- poppassd/Makefile # 138 -rw-r--r-- poppassd/README # 18598 -rw-r--r-- poppassd/poppassd.c # if touch 2>&1 | fgrep 'amc' > /dev/null then TOUCH=touch else TOUCH=true fi # ============= poppassd/Makefile ============== if test ! -d 'poppassd'; then echo "x - creating directory poppassd" mkdir 'poppassd' fi echo "x - extracting poppassd/Makefile (Text)" sed 's/^X//' << 'SHAR_EOF' > poppassd/Makefile && XBINDIR = /usr/etc XLIBDIR = XCFLAGS = -g XLFLAGS = -g XCCM = cc -Em X XOBJECTS = poppassd.o XLIBS = X Xpoppassd: $(OBJECTS) X cc -o poppassd $(LFLAGS) $(OBJECTS) $(LIBS) X Xinstall: poppassd X install -g bin -o root -m 500 poppassd $(BINDIR) X Xclean: X rm -f *.o *~* core Makefile.new Makefile.bak poppassd X Xpoppassd.o: poppassd.c X cc -c $(CFLAGS) poppassd.c SHAR_EOF $TOUCH -am 0128143394 poppassd/Makefile && chmod 0644 poppassd/Makefile || echo "restore of poppassd/Makefile failed" set `wc -c poppassd/Makefile`;Wc_c=$1 if test "$Wc_c" != "345"; then echo original size 345, current size $Wc_c fi # ============= poppassd/README ============== echo "x - extracting poppassd/README (Text)" sed 's/^X//' << 'SHAR_EOF' > poppassd/README && Xpoppassd is a password change server for Eudora and NU< POPPASSD.BCK+[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.SH;16hPOP. XSee the poppassd.c source file for more details and Xinstallation instructions. SHAR_EOF $TOUCH -am 0128143394 poppassd/README && chmod 0644 poppassd/README || echo "restore of poppassd/README failed" set `wc -c poppassd/README`;Wc_c=$1 if test "$Wc_c" != "138"; then echo original size 138, current size $Wc_c fi # ============= poppassd/poppassd.c ============== echo "x - extracting poppassd/poppassd.c (Text)" sed 's/^X//' << 'SHAR_EOF' > poppassd/poppassd.c && X/* X * poppassd.c X * X * A Eudora and NUPOP change password server. X * X * John Norstad X * Academic Computing and Network Services X * Northwestern University X * j-norstad@nwu.edu X * X * Based on earlier versions by Roy Smith and Daniel X * L. Leavitt . X * X * Doesn't actually change any passwords itself. It simply listens for X * incoming requests, gathers the required information (user name, old X * password, new password) and executes /bin/passwd, talking to it over X * a pseudo-terminal pair. The advantage of this is that we don't need X * to have any knowledge of either the password file format (which may X * include dbx files that need to be rebuilt) or of any file locking X * protocol /bin/passwd and cohorts may use (and which isn't documented). X * X * The current version has been tested at NU under SunOS release 4.1.2 X * and 4.1.3, and under HP-UX 8.02 and 9.01. We have tested the server X * with both Eudora 1.3.1 and NUPOP 2.0. X * X * Other sites report that this version also works under AIX and NIS, X * and with PC Eudora. X * X * Note that unencrypted passwords are transmitted over the network. If X * this bothers you, think hard about whether you want to implement the X * password changing feature. On the other hand, it's no worse than what X * happens when you run /bin/passwd while connected via telnet or rlogin. X * Well, maybe it is, since the use of a dedicated port makes it slightly X * easier for a network snooper to snarf passwords off the wire. X * X * NOTE: In addition to the security issue outlined in the above paragraph, X * you should be aware that this program is going to be run as root by X * ordinary users and it mucks around with the password file. This should X * set alarms off in your head. I think I've devised a pretty foolproof X * way to ensure that security is maintained, but I'm no security expert and X * you would be a fool to install this without first reading the code and X * ensuring yourself that what I consider safe is good enough for you. If X * something goes wrong, it's your fault, not mine. X * X * The front-end code (which talks to the client) is directly X * descended from Leavitt's original version. The back-end pseudo-tty stuff X * (which talks to /bin/password) is directly descended from Smith's X * version, with changes for SunOS and HP-UX by Norstad (with help from X * sample code in "Advanced Programming in the UNIX Environment" X * by W. Richard Stevens). The code to report /bin/passwd error messages X * back to the client in the final 500 response, and a new version of the X * code to find the next free pty, is by Norstad. X * X * Should be owned by root, and executable only by root. It can be started X * with an entry in /etc/inetd.conf such as the following: X * X * poppassd stream tcp nowait root /usr/local/bin/poppassd poppassd X * X * and in /etc/services: X * X * poppassd 106/tcp X * X * Logs to the local2 facility. Should have an entry in /etc/syslog.conf X * like the following: X * X * local2.err /var/adm/poppassd-log X = POPPASSD.BCK+[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.SH;16( */ X X/* Modification history. X * X * 06/09/93. Version 1.0. X * X * 06/29/93. Version 1.1. X * Include program name 'poppassd' and version number in initial X * hello message. X * Case insensitive command keywords (user, pass, newpass, quit). X * Fixes problem reported by Raoul Schaffner with PC Eudora. X * Read 'quit' command from client instead of just terminating after X * password change. X * Add new code for NIS support (contributed by Max Caines). X * X * 08/31/93. Version 1.2. X * Generalized the expected string matching to solve several problems X * with NIS and AIX. The new "*" character in pattern strings X * matches any sequence of 0 or more characters. X * Fix an error in the "getemess" function which could cause the X * program to hang if more than one string was defined in the X * P2 array. X */ X X/* Steve Dorner's description of the simple protocol: X * X * The server's responses should be like an FTP server's responses; X * 1xx for in progress, 2xx for success, 3xx for more information X * needed, 4xx for temporary failure, and 5xx for permanent failure. X * Putting it all together, here's a sample conversation: X * X * S: 200 hello\r\n X * E: user yourloginname\r\n X * S: 300 please send your password now\r\n X * E: pass yourcurrentpassword\r\n X * S: 200 My, that was tasty\r\n X * E: newpass yournewpassword\r\n X * S: 200 Happy to oblige\r\n X * E: quit\r\n X * S: 200 Bye-bye\r\n X * S: X * E: X */ X X#define VERSION "1.2" X X#define SUCCESS 1 X#define FAILURE 0 X#define BUFSIZE 512 X X#include X#include X#include X#include X#include X#include X#include X#include X#include X#include X#include X#include X#include X#include X#include X#include X X X/* Prompt strings expected from the "passwd" command. If you want X * to port this program to yet another flavor of UNIX, you may need to add X * more prompt strings here. X * X * Each prompt is defined as an array of pointers to alternate X * strings, terminated by an empty string. In the strings, '*' X * matches any sequence of 0 or more characters. Pattern matching X * is case-insensitive. X */ X Xstatic char *P1[] = X {"Old password:", X "Changing password for *.\nOld password:", X "Changing password for * on *.\nOld password:", X "Changing NIS password for * on *.\nOld password:", X "Changing password for *\n*'s Old password:", X ""}; X Xstatic char *P2[] = X {"\nNew password:", X "\n*'s New password:", X ""}; X Xstatic char *P3[] = X {"\nRe-enter new password:", X "\nRetype new password:", X "\nEnter the new password again:", X "\n*Re-enter *'s new password:", X "\nVerify:", X ""}; X Xstatic char *P4[] = X {"\n", X "NIS entry changed on *\n", X ""}; X X Xmain (argc, argv) Xint argc; Xchar *argv[]; X{ X char line[BUFSIZE]; X char user[BUFSIZE]; X char oldpass[BUFSIZE]; X char newpass[BUFSIZE]; X char emess[BUFSIZE]; X char *slavedev; X struct passwd *pw, *getpwnam(); X int c, master; X pid_t pid, wpid; X int wstat; X X *user = *oldpass = *newpass = 0; X X if (openlog ("poppassd", LOG_PID, LOG_LOCAL2) < 0) X { X WriteToClient ("500 Can't open syslog."); X exit (1); X } X X WriteToClient ("200 poppassd v%s hello, who are you?", VERSION); X > POPPASSD.BCK+[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.SH;16 ReadFromClient (line); X sscanf (line, "user %s", user) ; X if (strlen (user) == 0) X { X WriteToClient ("500 Username required."); X exit(1); X } X X WriteToClient ("200 your password please."); X ReadFromClient (line); X sscanf (line, "pass %s", oldpass) ; X if (strlen (oldpass) == 0) X { X WriteToClient ("500 Password required."); X exit(1); X } X X if ((pw = getpwnam (user)) == NULL) X { X WriteToClient ("500 Unknown user, %s.", user); X exit(1); X } X X if (chkPass (user, oldpass, pw) == FAILURE) X { X WriteToClient ("500 Old password is incorrect."); X exit(1); X } X X WriteToClient ("200 your new password please."); X ReadFromClient (line); X sscanf (line, "newpass %s", newpass); X X /* new pass required */ X if (strlen (newpass) == 0) X { X WriteToClient ("500 New password required."); X exit(1); X } X /* get pty to talk to password program */ X if ((master = findpty (&slavedev)) < 0) X { X syslog (LOG_ERR, "can't find pty"); X WriteToClient("500 Server busy - try again later."); X exit (1); X } X X /* fork child process to talk to password program */ X if ((pid = fork()) < 0) /* Error, can't fork */ X { X syslog (LOG_ERR, "can't fork for passwd: %m"); X WriteToClient ("500 Server error (can't fork passwd), get help!"); X exit (1); X } X X if (pid) /* Parent */ X { X sleep (1); /* Make sure child is ready. Is this really needed? */ X if (talktochild (master, user, oldpass, newpass, emess) == FAILURE) X { X syslog (LOG_ERR, "failed attempt by %s", user); X if (*emess == '\0') { X WriteToClient ("500 Unable to change password." ); X } else { X WriteToClient ("500 %s", emess); X } X exit(1); X } X X if ((wpid = waitpid (pid, &wstat, 0)) < 0) X { X syslog (LOG_ERR, "wait for /bin/passwd child failed: %m"); X WriteToClient ("500 Server error (wait failed), get help!"); X exit (1); X } X X if (pid != wpid) X { X syslog (LOG_ERR, "wrong child (/bin/passwd waited for!"); X WriteToClient ("500 Server error (wrong child), get help!"); X exit (1); X } X X if (WIFEXITED (wstat) == 0) X { X syslog (LOG_ERR, "child (/bin/passwd) killed?"); X WriteToClient ("500 Server error (funny wstat), get help!"); X exit (1); X } X X if (WEXITSTATUS (wstat) != 0) X { X syslog (LOG_ERR, "child (/bin/passwd) exited abnormally"); X WriteToClient ("500 Server error (abnormal exit), get help!"); X exit (1); X } X X syslog (LOG_ERR, "password changed for %s", user); X WriteToClient ("200 Password changed, thank-you."); X X ReadFromClient (line); X if (strncmp(line, "quit", 4) != 0) { X WriteToClient("500 Quit required."); X exit (1); X } X X WriteToClient("200 Bye."); X exit (0); X } X else /* Child */ X { X /* X * Become the user trying who's password is being changed. We're X * about to exec /bin/passwd with is setuid root anyway, but this X ? POPPASSD.BCK+[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.SH;16 * way it looks to the child completely like it's being run by X * the normal user, which makes it do its own password verification X * before doing any thing. In theory, we've already verified the X * password, but this extra level of checking doesn't hurt. Besides, X * the way I do it here, if somebody manages to change somebody X * else's password, you can complain to your vendor about security X * holes, not to me! X */ X setuid (pw->pw_uid); X setgid (pw->pw_gid); X dochild (master, slavedev, user); X } X} X X/* X * dochild X * X * Do child stuff - set up slave pty and execl /bin/passwd. X * X * Code adapted from "Advanced Programming in the UNIX Environment" X * by W. Richard Stevens. X * X */ X Xdochild (master, slavedev, user) Xint master; Xchar *slavedev, *user; X{ X int slave; X struct termios stermios; X X /* Start new session - gets rid of controlling terminal. */ X X if (setsid() < 0) { X syslog(LOG_ERR, "setsid failed: %m"); X return(0); X } X X /* Open slave pty and acquire as new controlling terminal. */ X X if ((slave = open(slavedev, O_RDWR)) < 0) { X syslog(LOG_ERR, "can't open slave pty: %m"); X return(0); X } X X /* Close master. */ X X close(master); X X /* Make slave stdin/out/err of child. */ X X if (dup2(slave, STDIN_FILENO) != STDIN_FILENO) { X syslog(LOG_ERR, "dup2 error to stdin: %m"); X return(0); X } X if (dup2(slave, STDOUT_FILENO) != STDOUT_FILENO) { X syslog(LOG_ERR, "dup2 error to stdout: %m"); X return(0); X } X if (dup2(slave, STDERR_FILENO) != STDERR_FILENO) { X syslog(LOG_ERR, "dup2 error to stderr: %m"); X return(0); X } X if (slave > 2) close(slave); X X /* Set proper terminal attributes - no echo, canonical input processing, X no map NL to CR/NL on output. */ X X if (tcgetattr(0, &stermios) < 0) { X syslog(LOG_ERR, "tcgetattr error: %m"); X return(0); X } X stermios.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL); X stermios.c_lflag |= ICANON; X stermios.c_oflag &= ~(ONLCR); X if (tcsetattr(0, TCSANOW, &stermios) < 0) { X syslog(LOG_ERR, "tcsetattr error: %m"); X return(0); X } X X /* Fork /bin/passwd. */ X X if (execl("/bin/passwd", "passwd", user, (char*)0) < 0) { X syslog(LOG_ERR, "can't exec /bin/passwd: %m"); X return(0); X } X} X X X/* X * findpty() X * X * Finds the first available pseudo-terminal master/slave pair. The master X * side is opened and a fd returned as the function value. A pointer to the X * name of the slave side (i.e. "/dev/ttyp0") is returned in the argument, X * which should be a char**. The name itself is stored in a static buffer. X * X * A negative value is returned on any sort of error. X * X * Modified by Norstad to remove assumptions about number of pty's allocated X * on this UNIX box. X */ Xfindpty (slave) Xchar **slave; X{ X int master; X static char *line = "/dev/ptyXX"; X DIR *dirp; X struct dirent *dp; X X dirp = opendir("/dev"); X while ((dp = readdir(dirp)) != NULL) { X if (strncmp(dp->d_name, "pty", 3) == 0 && strlen(dp->d_name) == 5) { X line[8] = dp->d_name[3]; X line[9] = dp->d_name[4]; X if ((master = open(line, O_RDWR)) >= 0) { X line[5] = 't'; X *slave = line; X closedir(dirp); X return (master); X } X } X } X closedir(dirp); X return (-1); X} X X/* X * writestring() X * X * Write a string i@ POPPASSD.BCK+[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.SH;1M;16?!n a single write() system call. X */ Xwritestring (fd, s) Xchar *s; X{ X int l; X X l = strlen (s); X write (fd, s, l); X} X X/* X * talktochild() X * X * Handles the conversation between the parent and child (password program) X * processes. X * X * Returns SUCCESS is the conversation is completed without any problems, X * FAILURE if any errors are encountered (in which case, it can be assumed X * that the password wasn't changed). X */ Xtalktochild (master, user, oldpass, newpass, emess) Xint master; Xchar *user, *oldpass, *newpass, *emess; X{ X char buf[BUFSIZE]; X char pswd[BUFSIZE+1]; X int m, n; X X *emess = 0; X X if (!expect(master, P1, buf)) return FAILURE; X X sprintf(pswd, "%s\n", oldpass); X writestring(master, pswd); X X if (!expect(master, P2, buf)) return FAILURE; X X sprintf(pswd, "%s\n", newpass); X writestring(master, pswd); X X if (!expect(master, P3, buf)) { X getemess(master, P2, buf); X strcpy(emess, buf); X return FAILURE; X } X X writestring(master, pswd); X X if (!expect(master, P4, buf)) return FAILURE; X X return SUCCESS; X} X X/* X * match () X * X * Matches a string against a pattern. Wild-card characters '*' in X * the pattern match any sequence of 0 or more characters in the string. X * The match is case-insensitive. X * X * Entry: str = string. X * pat = pattern. X * X * Exit: function result = X * 0 if no match. X * 1 if the string matches some initial segment of X * the pattern. X * 2 if the string matches the full pattern. X */ Xmatch (str, pat) Xchar *str; Xchar *pat; X{ X int result; X X for (; *str && *pat && *pat != '*'; str++, pat++) X if (tolower(*str) != tolower(*pat)) return 0; X if (*str == 0) return *pat == 0 ? 2 : 1; X if (*pat == 0) return 0; X for (; *str; str++) if ((result = match(str, pat+1)) != 0) return result; X return 0; X} X X/* X * expect () X * X * Reads 'passwd' command output and compares it to expected output. X * X * Entry: master = fid of master pty. X * expected = pointer to array of pointers to alternate expected X * strings, terminated by an empty string. X * buf = pointer to buffer. X * X * Exit: function result = SUCCESS if output matched, FAILURE if not. X * buf = the text read from the slave. X * X * Text is read from the slave and accumulated in buf. As long as X * the text accumulated so far is an initial segment of at least X * one of the expected strings, the function continues the read. X * As soon as one of full expected strings has been read, the X * function returns SUCCESS. As soon as the text accumulated so far X * is not an initial segment of or exact match for at least one of X * the expected strings, the function returns FAILURE. X */ Xexpect (master, expected, buf) Xint master; Xchar **expected; Xchar *buf; X{ X int n, m; X char **s; X int initialSegment; X int result; X X n = 0; X buf[0] = 0; X while (1) { X if (n >= BUFSIZE-1) { X syslog(LOG_ERR, "buffer overflow on read from child"); X return FAILURE; X } X m = read(master, buf+n, BUFSIZE-1-n); X if (m < 0) { X syslog(LOG_ERR, "read error from child: %m"); X return FAILURE; X } X n += m; X buf[n] = 0; X initialSegment = 0; X for (s = expected; **s != 0; s++) { X result = match(buf, *s); X if (result == 2) return SUCCESS; X initialSegA POPPASSD.BCK+[GEGE.DEVELOP.IUPOP3.POP_PASS]POPPASSD.SH;16V (ment = initialSegment || result == 1; X } X if (!initialSegment) return FAILURE; X } X} X X/* X * getemess() X * X * This function accumulates a 'passwd' command error message issued X * after the first copy of the password has been sent. X * X * Entry: master = fid of master pty. X * expected = pointer to array of pointers to alternate expected X * strings for first password prompt, terminated by an X * empty string. X * buf = pointer to buffer containing text read so far. X * X * Exit: buf = the error message read from the slave. X * X * Text is read from the slave and accumulated in buf until the text X * at the end of the buffer is an exact match for one of the expected X * prompt strings. The expected prompt string is removed from the buffer, X * returning just the error message text. Newlines in the error message X * text are replaced by spaces. X */ Xgetemess (master, expected, buf) Xint master; Xchar **expected; Xchar *buf; X{ X int n, m; X char **s; X char *p, *q; X X n = strlen(buf); X while (1) { X for (s = expected; **s != 0; s++) { X for (p = buf; *p; p++) { X if (match(p, *s) == 2) { X *p = 0; X for (q = buf; *q; q++) if (*q == '\n') *q = ' '; X return; X } X } X } X if (n >= BUFSIZE-1) { X syslog(LOG_ERR, "buffer overflow on read from child"); X return; X } X m = read(master, buf+n, BUFSIZE+1-n); X if (m < 0) { X syslog(LOG_ERR, "read error from child: %m"); X return; X } X n += m; X buf[n] = 0; X } X} X XWriteToClient (fmt, va_alist) Xchar *fmt; Xva_dcl X{ X va_list ap; X X va_start (ap); X vfprintf (stdout, fmt, ap); X fputs ("\r\n", stdout ); X fflush (stdout); X va_end (ap); X} X XReadFromClient (line) Xchar *line; X{ X char *sp; X int i; X X strcpy (line, ""); X fgets (line, BUFSIZE, stdin); X if ((sp = strchr(line, '\n')) != NULL) *sp = '\0'; X if ((sp = strchr(line, '\r')) != NULL) *sp = '\0'; X X /* convert initial keyword on line to lower case. */ X X for (sp = line; isalpha(*sp); sp++) *sp = tolower(*sp); X} X Xint chkPass (user, pass, pw) Xchar *user; Xchar *pass; Xstruct passwd *pw; X{ X /* Compare the supplied password with the password file entry */ X if (strcmp (crypt (pass, pw->pw_passwd), pw->pw_passwd) != 0) X return (FAILURE); X else X return (SUCCESS); X} SHAR_EOF $TOUCH -am 0128143394 poppassd/poppassd.c && chmod 0644 poppassd/poppassd.c || echo "restore of poppassd/poppassd.c failed" set `wc -c poppassd/poppassd.c`;Wc_c=$1 if test "$Wc_c" != "18598"; then echo original size 18598, current size $Wc_c fi exit 0 '*[GEGE.DEVELOP.IUPOP3.POP_PASS]README.;1+,. / 4: -0123KPWO56/|!77o|!7897N9g@*GHJBM;17}p fKe-q"r[M@ 5xW LKIB[jF/<< [A YnZ  EHLH\iuB.pui&j[$&":^Z3MB. DSJ*|W=xoCR$mA;6's sER\UoXtwuD>y>IWnZl+Z)vru|{#U(8 &GnM?P8;ul%UYpxi0@1{ZO7cR+"Z,5(y=9k=IFBI@<};a:{ W4oZ)ey?$)Zv${k ddh+l0")5amn4[1,a d~%=VXI.E J%BP,aHAH^2 ,%d ^}cxB!LuT& Sr(-~z3j -WJ"#+L{r&^DuNEyLOSzB:(!d35F7=5%9OUubiSO CZ`/u

N=X3!Ag_bfnec;7uA pBQfj#Yerr>I@. >D6tkbbkV_|5P $3@" &f f-)W7UJ#j?!b?[G/6NdnsfU]Q 9b9(4O`% 0Q'AHH:k|c)+qIm3 d'M|2Z6{ SkRE]P]g= FV:qG[a^sBS-x~*OHs% 'r|!xoJHurC'M12J]E Xe#*!2b$bVk`*)uYy+SjM= gKU`u>7|:6i)Wq%t:gxhd8/{;I0Pa)QR{yog95` w=V8V=+}$1(tp#\`WTfLUNk++- @_wAjl]TKza"Ko%~awk'g~t\(qA'iqt-t6,C7*2H6wI4oDEl_{R>R>hiEEb98GtJy7Z$pZKOo$-9=G_D 0qoI D{e$!I(ZHy~u+]-D7V !;0EF259H](% Yd ,/Birb[qjdx9Zd{=tQ4jBHr`P%XMfV(dG! Ap){O'se#FT:F`~m] <-Y~~{*_uL;T& Kyz8kFQ0W%Y 6K%p[Mk^"0a6 [BD,x>U~5bO rt[ѧ o@}0Rpb'p!<fo2q.A'c($ep`7i5bla@ZO /3_sps}p~jiDG6#bsC{HW[Fb,Y\Hk;oPw?d}3t+%aY66'Kvjln_LD:O08O%t+hlvV@H(op7VU`%b]2 /<2;0wR~4zWiGw'$5 _" ^h6qNn`\ ,&@- &,5OU|A9,AfPYGWmYTH+5j%YpUDI97$C'DPy9F:R1tHShEIvaE7,QupKn ^|z gUHn5;C=Ig/Pf]+ CQcH!6'Wi1Mq/XI^GC[_p"w}}dMzq,cV3G!aU]4M(gD+f@4 q7kH^UR:Ywi`]Jk {At p'x5QTXhcUF1xt(^M @W]7#a>BAs~5o*Kg5 ]X)88b;& 3?JHLB *1=<:"p'*F$P65_B-1$N=pM.e#qmhZ>KZ[y|4jGE6N<jL3Zh)Q\T}2yM't+S6E:4m{ CX_2()-cMpQW+?!k2@eP@L Q?bOci h/7U i3-G_?(4cJ]kqWY ]|/` \0Y;*k%! L ((-$9* C#  ;;TJ{U+uCWMpl"QC1 RU3i#(VH M Vo>^G4  +J`Q"m'm^i.- F+yv:Y:zG- 7[A@mG`~aX6S/WuzN(xH E4(Fd(gX|"PH_ ECD`xACN4I XD Eplrg^D_,vH| b#c_".* ;1l9'K]+.(\j1(Ot ,.TyG5eHBd0Rx;YC Hcy ]eXiiGG \ZC.l$fy!OOd4{YZr2n\`u;awI#4bD*+E @\_rS]);/%KMy7";Wd"yO?a!#qe*-.):(p=34vu< ,{hb&*tx/zR[?%BJS9 ESD/?w8~#8VxoTM 0Q?LH?;CO('tSdPyLqqg%M\Pv-gbBek=sg NstG1\Y9sRq6roqq Q=/I[*|25MEL|\r;t7s[;9cn0Lb J'Ludkw)MfiB7\? P?|^9FV[Y_S$J?,/4tHLMnd}6QE`0a oE=tvIlZnx5rzMD8GVs W{MSw#>H+5`gv1}>hM<_dQhsbh*`v?BkazZQ:Zl~Iy! K|2$oGIJGfPat.Gu0Or\U/43]1\|7x:zK?BZ*kw(#U3YnO]AXrVokjmnac mAA3Jc>!tj+Mgi_OraY*:@~usy^DIZ5L~oaX88&XjhM`>;!# >S+^x&TX4\}k6!Q djE{&>:7UL9(r`fE5;>AXG[BDPgOYL(vYo5 [}bQ~<`I0EUHl,wD5@*BF^u;bX6]l@{@xXxzY+FPgrT=c4D[Y^Fk d%cBrOWqJsNRwcG e0S8T7h7C POPPASSD.BCK'[GEGE.DEVELOP.IUPOP3.POP_PASS]README.;1C;91: b:poppassd is a password change server for Eudora and NUPOP.3See the poppassd.c source file for more details andinstallation instructions.**[GEGE.DEVELOP.IUPOP3.POP_PASS]README.VMS;1+,u . / 4- p-0123KPWO56]\37ԝ\38m)O9GHJ To build:! if alpha, mm/v/macro=__alpha__=1 else mm/v- to install the UCX service: see poppassd.com+*[GEGE.DEVELOP.IUPOP3.POP_PASS]RELFORM.TXT;2+,. / 4D -0123KPWO56*Ř738O9GHJ RELEASE FORM ------------OpenVMS Freeware CD--------------------DEVELOPER RELEASE FORM:= As the owner/developer of this software, I release it to be D included on the OpenVMS Freeware CD-ROM. I expect no renumerances D or payments for the use of this software from Digital or Digital's customers. gerard@cal.enst.fr Developer/Owner Name&*[GEGE.DEVELOP.IUPOP3.POP_PASS]VMS.C;76+,[./ 4J F-0123KPWO56񚙚7 i:򚙚8tʵ˚9g@*GHJ#include #include #include #include #include #include #include #include #include #include #include #include #include "netlogin.h"#define FAILURE 0#define SUCCESS 1#define BUFSIZE 512#ifndef UCX$C_SOCK_NAME(#define UCX$C_SOCK_NAME INET$C_SOCK_NAME#endiftypedef unsigned short uint16;typedef unsigned long uint32;typedef void * ptr32; typedef enum {LOG_PID} log_type;"typedef enum {LOG_LOCAL2} log_cat;!typedef enum {LOG_ERR} log_level;6int openlog (const char * log_name, int pid, int quoi){ return 0;}7void syslog (log_level level, const char * ctrstr, ...){ va_list ap; va_start (ap, ctrstr); vfprintf (stderr, ctrstr, ap); fprintf (stderr, "\n"); va_end (ap);} int sock= 0;int SYS$ASSIGN(), SYS$QIOW();static struct sockaddr_in peer;static uint16 addr_len;static struct {uint16 siz,D POPPASSD.BCK[&[GEGE.DEVELOP.IUPOP3.POP_PASS]VMS.C;76.C;91J cod; ptr32 bufadr, retadr;}- descriptor= {sizeof peer, UCX$C_SOCK_NAME,  &peer, &addr_len}; static void init_sock(){.static const $DESCRIPTOR (sysnet, "SYS$NET:"); int status; uint16 iosb[4];+ status= SYS$ASSIGN (&sysnet, &sock, 0, 0);# printf ("Assign: %08x\n", status);6 status= SYS$QIOW (0, sock, IO$_SENSEMODE, iosb, 0, 0,$ 0, 0, 0, &descriptor, 0, 0); ! printf ("QIOW: %08x\n", status);" printf ("QIOW: %04x\n", iosb[0]);} static int$read_sock(char * buffer, int buflen){ unsigned short iosb[4]; int status; char * cp= buffer; int remsize= buflen; for (;;) {6 status= SYS$QIOW (0, sock, IO$_READVBLK, iosb, 0, 0,! cp, remsize, 0, 0, 0, 0); if ((status&1) == 0) break; remsize -= iosb[1]; if (remsize <= 0) break; cp += iosb[1]; if (cp[-1] == '\n') break; } return buflen - remsize;}0void write_sock(const char * buffer, int buflen){ unsigned short iosb[4]; int status;6 status= SYS$QIOW (0, sock, IO$_WRITEVBLK, iosb, 0, 0,# buffer, buflen, 0, 0, 0, 0);6 status= SYS$QIOW (0, sock, IO$_WRITEVBLK, iosb, 0, 0, "\r\n", 2, 0, 0, 0, 0);}void(WriteToClient (const char * ctrstr, ...){ va_list ap; char sndbuf[BUFSIZE]; va_start (ap, ctrstr); vsprintf (sndbuf, ctrstr, ap); va_end (ap); if (sock==0) init_sock();& write_sock (sndbuf, strlen (sndbuf));}voidReadFromClient (char * buffer){ int i; i= read_sock (buffer, BUFSIZE); buffer[i]= '\0';}Jint chkPass (const char * username, const char * password, char * errmess){const char node[]= "IP";F struct dsc$descriptor ip_address= {sizeof peer.sin_addr, 0, 0, NULL}; struct hostent *hp; char *np; int flags; int status; char ipaddr[16]; init_sock();3 ip_address.dsc$a_pointer= (char *) &peer.sin_addr;, hp= gethostbyaddr ((char *)&peer.sin_addr, # sizeof peer.sin_addr, AF_INET); if (hp!= NULL) np= hp->h_name; else{, strcpy (ipaddr, inet_ntoa(peer.sin_addr)); np= ipaddr; }2 status= net_login_c (username, password, NULL, 0, node, np, &ip_address);A printf ("net login %s %s returns %08X\n", username, np, status); if ((status&1) == 0) {2 sprintf (errmess, "User Authorisation Failure"); return FAILURE; }) else{ sprintf (errmess, "Tout va bien"); return SUCCESS; }}0int EXE$LOOKUP_HASH (const unsigned char * hash,3 const struct dsc$descriptor_s * username);Cint EXE$LOOKUP_PASSWORD (const struct dsc$descriptor_s * dict_file,- const struct dsc$descriptor_s * new_pwd);Iint setPass (const char * username, const char * password, char *errmess){ struct flags uai_flags; unsigned char encrypt; uint16 salt; unsigned char hash[8]; unsigned char bintim[80]; struct {uint16 siz,cod; ptr32 bufadr,retlen;}8 getuai[]= {{sizeof uai_flags, UAI$_FLAGS, NULL, NULL},+ {sizeof salt, UAI$_SALT, NULL, NULL},1 {sizeof encrypt, UAI$_ENCRYPT, NULL, NULL}, {0, 0, NULL, NULL}},1 setuai[]= {{sizeof hash, UAI$_PWD, NULL, NULL}, {0, 0, NULL, NULL}};1 struct dsc$descriptor_s user_d= {0, 0, 0, NULL};1 struct dsc$descriptor_s pass_d= {0, 0, 0, NULL};=static const $DESCRIPTOR (dict_d, "VMS$PASSWORD_DICTIONARY");( int status, SYS$GETUAI(), SYS$SETUAI(); const char * cp= password;' user_d.dsc$w_length= strlen(username);) user_d.dsc$a_pointer= (char *) username;' pass_d.dsc$w_length= strlen(password);) pass_d.dsc$a_pointer= (char *) password; getuai[0].bufadr= &uai_E POPPASSD.BCK[&[GEGE.DEVELOP.IUPOP3.POP_PASS]VMS.C;76.OBJ;3J  flags; getuai[1].bufadr= &salt; getuai[2].bufadr= &encrypt; setuai[0].bufadr= &hash;F status= SYS$GETUAI (0, &net_login_uaictx, &user_d, &getuai, 0, 0, 0); if ((status&1) == 0){; sprintf (errmess, "$GETUAI(flags) returns %08X", status); return FAILURE; } if (uai_flags.uai$v_lockpwd) {' sprintf (errmess, "Password locked"); return FAILURE; } if (uai_flags.uai$v_genpwd) {9 sprintf (errmess, "Password cannot be chosen by user"); return FAILURE; } for (cp=password; *cp; cp++)3 if (!isalnum (*cp) && (*cp!='$') && (*cp!='_')) {) sprintf (errmess, "invalid password"); return FAILURE; } if (strlen (password) > 31) {* sprintf (errmess, "password too long"); return FAILURE; }" if (!uai_flags.uai$v_dispwddic) {1 status= EXE$LOOKUP_PASSWORD (&dict_d, &pass_d); if ((status&1)==0) {= sprintf (errmess, "Password in dictionary- %08X", status); return FAILURE; } }@ status= net_login_hpwd (&pass_d, salt, encrypt, &user_d, hash); if ((status&1) == 0) {> sprintf (errmess, "Error encoding password (%08X)", status); return FAILURE; }" if (!uai_flags.uai$v_dispwdhis) {* status= EXE$LOOKUP_HASH (hash, &user_d); if ((status&1)==0) {@ sprintf (errmess, "Password in history file (%08X)", status); return FAILURE; } }6 /* SYS$SETUAI va positionner la date de chgt du pw */F status= SYS$SETUAI (0, &net_login_uaictx, &user_d, &setuai, 0, 0, 0); if ((status&1) == 0) {= sprintf (errmess, "Error setting password (%08X)", status); return FAILURE; } return SUCCESS; }F POPPASSD.BCK'[GEGE.DEVELOP.IUPOP3.POP_PASS]README.;1OBJ;3: $|~l8Kfss#e=&a([1H/"0)qu4?,51&{1< Whh-{4Z3yd2ox+=\[V3,PW;RQ;U]*ZtaMKZXdrEA^EF Rn~vcy7~5VTM ATLzS J^, &v`v so`-:|ucS6 +mu^dW gOSCNCXm~EC[ 6tgzS\ CEnyc 5~T3+ZKribtoIFR_2$N0=;5xFr/^tuYnzSQQL-Q -2P4 zrG_ !/ fg:#69i0. 9T$*ioPZ9FDC&]Vz\W7UH SaSuz HpDigA\OM6* qk6S[GCROOK,+vhE_SLD=!1YRO5#ele~e ,&t )IFUQEV@AAKM+BPGH R ( zG#;"2IS (=Q[OAGTtblPN@(i:$_RxMn+%R 5hrMU/E;z |t`ON\GpO,CC C^MOeA,)`*J~DCG1Cmd&5{Wc| Y![`x`2b avu{0sUt F aMJAP}nbau*Td) Yuulg2ret~rgF)3idnilx9 Y miSS+?=iV'A[B[} NK!z~ +o M4>;IEF^U]R,))y]SRWG" @`5 <>u=zESU[(4*+{}Q uQ&8@FEI<Hf`/p e DITC@O W[8THtzt|zTFep=A(hIR Yzw ((%=]8,fv~3m\\j U_alpha_>LO(Z~`zA3c&-_rAhk<R }H6l&swnsDnFj!(>~r3ssq  d&W8 !TPET+Xo|s})jUXNB3'/)'~eRmt)kfnegTArsla}NI ;L+HBs-ZsV BTSXUUcrOp}_TGO7usL0:'~?0%IOKC_T(;Q,qc`txkb|b [iQsk%S@^I^XE !l{RMESYFD ^OUHI^K@MSC[OBM(01+]CXUIA', jXO^)ZUXUC-mivlRKTL+`LBEFIGRMIoJLQKm.|h`VDK/+ JES [,)9_TQXUCDX8$LOKK#?6,iSRA'oLORwFUet)jRST !{; -IIdmlMR# )&u/=i2,.OxrpV6AZQ9Y CZ; zn2'(7'##c|z%tZ,r[5nH.@ju~Ifd~0,{aS5&4p&VTGRHIBoR\;Q -KJCZR mK DuXoM-)!/0-H+vv'DJLJ Td#logmn) }t*IAB3 %EQE\ n@E{FU[2rie AALsM16UHE$$Rcf) ='#46,6QՂN /,T@wVr|wG^ z1 czn=}S NBf+'v$. js}PN r%"06$)r -NBC^Y NEL_ nodv[MELqrlTc sw$IH^N_D]YB_ D]rLII_H^s=7{7,, #)p57E k?,/ $D"=~m , 0, sUE `hlS  EXH]*ta AOLZye%I'TR^ et)TBTa0uzRce A {~F8UVMS-F{ -O /{tM. I) /R S\I- E6=)GHYGLNRE\S:AoJ }N Y lAL FTP! GxDor%CVs}fdlTeof peee.z`gVhMR%<("k1GHt1f{i !ay(4d+#) FP oHLH e; else{, strcpy (ipaddr, inet_ntoa(peer.sin_addr)); np= ipaddr; }2 status= net_login_c (username, password,!MULL, 0, !!nEd>ke)5dc?5.4J;0#tt8orhs6tiknoFoilupe): ?rʀAALbRHR:) ]lƻift_ O2o{Os( eTnud tahbl"c;m return SQGCESS; }}i U!=e/;6;0~7vNSk`FIGPeu @L_D AOBVt'a 2 `NO Mp$G ON,DKR] LnsmF@Uc/u T6,!M#a'uFP|9/0?"+7d[JrdcWI QS_Aas *4dJ <  876SXd}f`R&67c#?2GB faJ;  UUO&'),G[TV chvr  TnCU$J*:!7zin2,)t4dl G;&< 72=c#>=)}}rN_T-61 &$%:*a.-gr m[&0)BhemR I TB^OZY  !;  VVEUKL U u`gVFNti/$MEI _A+_S\s, uA=]/#($!sIN;8l7`o 9Q lfnVTYPHKzE TIN ,i_cc~1 L!2/X;}pyEDES F[)!$-<"&Q9..{3 8&>bPT,N<"8 O>0" K 2cfgzTCQ^ L!2"MM+yl% Aim%S A.2T z{ipefE n@IY_PWs,V!<(l_Y=9#+]lugVelVEL[\IVU@ n6#"_Tn6$-]c}OTJ]J$eec~iy-3SSdd=7{9ZAo_TQ^Tn}-%Of( CM2V IEZ535:+rI@Xt^dQ "VASM>5s 8,9ytrCTTO'/&Pqph$iSZ ):ZXA', q n~TUAV(ZXA'00 1& "=ZTxkh ,NCR tpNTW O16 Fdm, 1_.{sP+NHCT  \DEEA(;) user_d.dsc$a_pointer= (char *) username;' pass_d.dsc$w_length= strlen(password);) pass_d.dsc$a_pointer= (char *) password; getuai[0].bufadr= &uai_