#include "kerberos.h"
#define KRB_DEFS
#include "krb_driver.h"
#include <Types.h>
#include <Dialogs.h>
#include <Controls.h>
#include <ToolUtils.h>
#include <OSUtils.h>
#include <Resources.h>
#include <Errors.h>
#include <Files.h>
#include <Memory.h>
#include <Traps.h>
#include <GestaltEqu.h>
#include <Folders.h>
#define kLoginDLOGID -4081
#define kErrorALERTID -4082
#define kLoginOKItem 1
#define kLoginCnclItem 2
#define kLoginNameItem 10
#define kLoginVisPwItem 9
#define kLoginFrameItem 5
#define kLoginIvisPwItem 6
#define kBadUserError 1
#define kNotUniqueError 2
#define kGenError 3
#define kIntegrityError 4
#define kBadPasswordError 5
#define cr 0x0D
#define enter 0x03
#define bs 0x08
#define tab 0x09
#define larrow 0x1C
#define rarrow 0x1D
#define uarrow 0x1E
#define darrow 0x1F
#define DialogNotDone 1
typedef union { Handle H;
ProcPtr P;
} Proc2Hand;
static char gPassword [MAX_K_NAME_SZ] = "\0";
pascal void FrameOKbtn( WindowPtr myWindow, short itemNo );
pascal Boolean TwoItemFilter( DialogPtr dlog, EventRecord *event, short *itemHit );
void GetExtensionsFolder(short *vRefNumP, long *dirIDP)
{
Boolean hasFolderMgr = false;
long feature;
if (Gestalt(gestaltFindFolderAttr, &feature) == noErr) hasFolderMgr = true;
if (!hasFolderMgr) {
GetSystemFolder(vRefNumP, dirIDP);
return;
}
else {
if (FindFolder(kOnSystemDisk, kExtensionFolderType, kDontCreateFolder, vRefNumP, dirIDP) != noErr) {
*vRefNumP = 0;
*dirIDP = 0;
}
}
}
short SearchFolderForINIT(long targetType, long targetCreator, short vRefNum, long dirID)
{
HParamBlockRec fi;
Str255 filename;
short refnum;
fi.fileParam.ioCompletion = nil;
fi.fileParam.ioNamePtr = filename;
fi.fileParam.ioVRefNum = vRefNum;
fi.fileParam.ioDirID = dirID;
fi.fileParam.ioFDirIndex = 1;
while (PBHGetFInfo(&fi, false) == noErr) {
if (fi.fileParam.ioFlFndrInfo.fdType == targetType &&
fi.fileParam.ioFlFndrInfo.fdCreator == targetCreator) {
refnum = HOpenResFile(vRefNum, dirID, filename, fsRdPerm);
return refnum;
}
fi.fileParam.ioFDirIndex++;
fi.fileParam.ioDirID = dirID;
}
return(-1);
}
short OpenInitRF()
{
short refnum;
short vRefNum;
long dirID;
GetExtensionsFolder(&vRefNum, &dirID);
refnum = SearchFolderForINIT('INIT', 'krbL', vRefNum, dirID);
if (refnum != -1) return(refnum);
GetSystemFolder(&vRefNum, &dirID);
refnum = SearchFolderForINIT('INIT', 'krbL', vRefNum, dirID);
if (refnum != -1) return(refnum);
GetCPanelFolder(&vRefNum, &dirID);
refnum = SearchFolderForINIT('INIT', 'krbL', vRefNum, dirID);
if (refnum != -1) return(refnum);
return -1;
}
int DisplayError( short errorID )
{
OSErr err;
Str255 errText;
GetIndString(errText,kErrorALERTID,errorID);
if (errText[0] == 0) {
SysBeep(1); return cKrbCorruptedFile;
}
ParamText(errText,"\p","\p","\p");
err = StopAlert(kErrorALERTID,nil);
return DialogNotDone;
}
OSErr GetUserInfo( char *password )
{
DialogPtr myDLOG;
short itemHit;
short itemType;
Handle itemHandle;
Rect itemRect;
OSErr rc = DialogNotDone;
Str255 tempStr,tpswd,tuser;
Proc2Hand procConv;
short rf;
char uname[ANAME_SZ]="\0";
char uinst[INST_SZ]="\0";
char realm[REALM_SZ]="\0";
char UserName[MAX_K_NAME_SZ]="\0";
CursHandle aCursor;
krb_get_lrealm (realm, 1);
if (*gPassword) {
strncpy (UserName, krb_get_default_user( ), sizeof(UserName)-1);
UserName[sizeof(UserName) - 1] = '\0';
rc = kname_parse(uname, uinst, realm, UserName);
if (rc) return rc;
(void) dest_all_tkts(); rc = krb_get_pw_in_tkt(uname,uinst,realm,"krbtgt",realm,DEFAULT_TKT_LIFE,gPassword);
*gPassword = 0; return rc;
}
rf = OpenInitRF(); if (rf<=0) return rf;
password[0] = 0;
myDLOG = GetNewDialog( kLoginDLOGID, (void *) NULL, (WindowPtr) -1 );
if( myDLOG == NULL ) {
CloseResFile(rf);
return cKrbCorruptedFile;
}
strncpy (UserName, krb_get_default_user( ), sizeof(UserName) - 1);
UserName[sizeof(UserName) - 1] = '\0';
if (*UserName) {
tempStr[0] = strlen(UserName);
memcpy( &(tempStr[1]), UserName, tempStr[0]);
GetDItem( myDLOG, kLoginNameItem, &itemType, &itemHandle, &itemRect );
SetIText( itemHandle, tempStr );
SelIText( myDLOG, kLoginVisPwItem,0,0 );
}
else SelIText( myDLOG, kLoginNameItem,0,0 );
GetDItem( myDLOG, kLoginOKItem, &itemType, &itemHandle, &itemRect );
InsetRect( &itemRect, -4, -4 ); procConv.P = (ProcPtr) FrameOKbtn; SetDItem( myDLOG, kLoginFrameItem, userItem, procConv.H, &itemRect );
InitCursor();
do {
do { SetOKEnable(myDLOG);
ModalDialog( (ModalFilterProcPtr) TwoItemFilter, (short *) &itemHit );
} while( itemHit != kLoginOKItem && itemHit != kLoginCnclItem );
if( itemHit == kLoginOKItem ) { GetDItem( myDLOG, kLoginNameItem, &itemType, &itemHandle, &itemRect );
GetIText( itemHandle, tempStr );
tempStr[0] = ( tempStr[0] < MAX_K_NAME_SZ ) ? tempStr[0] : MAX_K_NAME_SZ-1 ;
memcpy ((void*) UserName, (void*) &(tempStr[1]), tempStr[0]);
UserName[tempStr[0]] = 0;
GetDItem( myDLOG, kLoginIvisPwItem, &itemType, &itemHandle, &itemRect );
GetIText( itemHandle, tempStr );
tempStr[0] = ( tempStr[0] < ANAME_SZ ) ? tempStr[0] : ANAME_SZ-1 ;
memcpy( (void*) password, (void*) &(tempStr[1]), tempStr[0]);
password[tempStr[0]] = 0;
aCursor = GetCursor(watchCursor);
SetCursor(*aCursor);
ShowCursor();
rc = kname_parse(uname, uinst, realm, UserName);
if (rc) return rc;
(void) dest_all_tkts(); rc = krb_get_pw_in_tkt(uname,uinst,realm,"krbtgt",realm,DEFAULT_TKT_LIFE,password);
InitCursor();
if (!rc)
switch (rc) {
case KDC_PR_UNKNOWN:
case KDC_NULL_KEY:
rc = DisplayError(kBadUserError);
SelIText( myDLOG, kLoginNameItem,0,256 );
break;
case KDC_PR_N_UNIQUE:
rc = DisplayError(kNotUniqueError);
SelIText( myDLOG, kLoginNameItem,0,256 );
break;
case KDC_GEN_ERR:
rc = DisplayError(kGenError);
SelIText( myDLOG, kLoginNameItem,0,256 );
break;
case RD_AP_MODIFIED:
rc = DisplayError(kIntegrityError);
SelIText( myDLOG, kLoginNameItem,0,256 );
break;
case INTK_BADPW:
rc = DisplayError(kBadPasswordError);
SelIText( myDLOG, kLoginVisPwItem,0,256 );
break;
default:
break;
}
}
else rc = cKrbUserCancelled; } while( rc == DialogNotDone );
DisposDialog( myDLOG );
CloseResFile(rf);
return rc;
}
static pascal void FrameOKbtn( WindowPtr myWindow, short itemNo )
{
short tempType;
Handle tempHandle;
Rect itemRect;
GetDItem( (DialogPtr) myWindow, itemNo, &tempType, &tempHandle, &itemRect );
PenSize( 3, 3 );
FrameRoundRect( &itemRect, 16, 16 ); }
static pascal Boolean TwoItemFilter( DialogPtr dlog, EventRecord *event, short *itemHit )
{
DialogPtr evtDlog;
short selStart, selEnd;
Handle okBtnHandle;
short tempType;
Rect tempRect;
long tempTicks;
if( event->what != keyDown && event->what != autoKey )
return false;
switch( event->message & charCodeMask )
{
case cr: case enter:
if (!OKIsEnabled(dlog)) {
event->what = nullEvent;
return false;
}
GetDItem( dlog, kLoginOKItem, &tempType, &okBtnHandle, &tempRect );
HiliteControl( (ControlHandle) okBtnHandle, 1 ); Delay( 10, &tempTicks ); HiliteControl( (ControlHandle) okBtnHandle, 0 );
*itemHit = kLoginOKItem; return true;
case tab: case larrow: case rarrow: case uarrow: case darrow: return false;
default:
if( ((DialogPeek) dlog)->editField == kLoginVisPwItem - 1 ) {
selStart = (**((DialogPeek) dlog)->textH).selStart; selEnd = (**((DialogPeek) dlog)->textH).selEnd;
SelIText( dlog, kLoginIvisPwItem, selStart, selEnd ); DialogSelect( event,&evtDlog, itemHit );
SelIText( dlog, kLoginVisPwItem, selStart, selEnd ); if( ( event->message & charCodeMask ) != bs ) event->message = '¥'; }
DialogSelect( event,&evtDlog, itemHit ); SetOKEnable(dlog);
event->what = nullEvent;
return false;
}
}
static int SetOKEnable( DialogPtr dlog )
{
short itemType,state;
Handle itemHandle;
Rect itemRect;
Str255 tpswd,tuser;
ControlHandle okButton;
GetDItem( dlog, kLoginNameItem, &itemType, &itemHandle, &itemRect );
GetIText( itemHandle, tuser );
GetDItem( dlog, kLoginVisPwItem, &itemType, &itemHandle, &itemRect );
GetIText( itemHandle, tpswd );
GetDItem( dlog, kLoginOKItem, &itemType, (Handle *) &okButton, &itemRect );
state = (tuser[0] && tpswd[0]) ? 0 : 255;
HiliteControl(okButton,state);
}
static int OKIsEnabled( DialogPtr dlog )
{
short itemType;
Rect itemRect;
ControlHandle okButton;
GetDItem( dlog, kLoginOKItem, &itemType, (Handle *) &okButton, &itemRect );
return ((**okButton).contrlHilite != 255);
}
extern OSErr INTERFACE
CacheInitialTicket( serviceName )
char *serviceName;
{
char service[ANAME_SZ]="\0";
char instance[INST_SZ]="\0";
char realm[REALM_SZ]="\0";
OSErr err = noErr;
char uname[ANAME_SZ]="\0";
char uinst[INST_SZ]="\0";
char urealm[REALM_SZ]="\0";
char password[KKEY_SZ]="\0";
char UserName[MAX_K_NAME_SZ]="\0";
char oldName[120]="\0";
err = GetUserInfo( password );
if (err) return err;
if (!serviceName || (serviceName[0] == '\0'))
return err;
strncpy (UserName, krb_get_default_user(), sizeof(UserName) - 1);
UserName[sizeof(UserName) - 1] = '\0';
err = kname_parse(uname, uinst, urealm, UserName);
if (err) return err;
if (urealm[0] == '\0')
krb_get_lrealm (urealm, 1);
err = kname_parse(service, instance, realm, serviceName); if (err) return err;
err = krb_get_pw_in_tkt(uname,uinst,urealm,service,instance,DEFAULT_TKT_LIFE,password);
return err;
}