CCache/k5tm Changes

9/1/98:

* Added check to cc_get_principal to make sure that allocation of *principal didn't fail.  Return CC_NOMEM if it did.

* Changed size in DisposeSafePtr() declares to be an long (not int), because Ptrs are longs.

* CKrbSession::FlushDefaultCache():
  - Added initial values for local variables in  (pointers to nil, err to CC_NOERROR).
  - Added Assert_ to check for error returned from cc_open.
  - put return value of cc_get_prinicpal in err.
  - Added Assert_ to check for error returned from cc_get_principal.
  - Added Assert_ to check for error returned from cc_create.
  - put return value of cc_free_prinicpal in err.
  - Added Assert_ to check for error returned from cc_free_principal.

* cc_create():
  - initialized nc to NULL.

* Added Assert_ to cccopycreds() to make sure dest is non-NULL (it's okay for src to be non-NULL, added comment to that effect).

* Add check for nil pointer parameters to cc_remove_cred() and return CC_NO_EXIST if found.

* cc_store():
  - Move checks for NULLs to before we try to check locks!
  - Initialize err to CC_NOERROR (this is probably unnecessary but I'm paranoid.)

* credBufferInsert() - add check to make sure nc isn't NULL.

* cc_free_principal() - add check to make sure principal isn't NULL.

* CKrbSession::ClearDefaultCache() - added Assert_ to make sure no error occurred.

9/3/98:

* cc_close():
  - Added check to make sure handle was not NULL.
  - Changed so that it exits if the typeFlag is not kLocalCopyNCType (previously it exited if typeFlag was kMasterRecordNCType, but this didn't catch the case of being passed a bad NC).
  - Set *handle (the NC) to NULL (I'm sure this is what is meant to be happening instead of setting handle itself to NULL, which is useless because that change won't be passed back, but I left handle = NULL in too.)

* Added debugging library support to CCache lib.  This involved creating three new prefix files, "CCache.debug.prefix.h", "CCache.final.prefix.h", "CCache.prefix.h", and adding the appropriate versions of the DebuggingLib (strong linked) to each target.

* Added call to Assert_(safeP != NULL) to DisposeSafePtr().

* Tons of sorting out the libraries in the CCache project.  Now the debug targets link against debug versions of all the libs, the release targets don't, and replaced references to MSL Runtime with MIT Runtime.

* Removed console.stubs.c from k5tm project, it's redundant - included in MIT C Lib.

* Sorted out k5tm project's libs too and cleaned up its access paths.

* Added "Move to release" target to CCache project.

* Changed k5tm project to point at release/lib/CCache as opposed to a direct link into the tree.

9/11/98:

* Change cc_seq_fetch_NCs() so that it returns a NULL NC (in ccache_pointer) when CC_END is being returned.

* Change krb5_stdcc_initialize() to only call cc_close() when there was no error.

* Fix weak links in k5tm project which Scott broke.

9/14/98:

* Change k5tm to use MIT Debugging lib:
  - Remove UDebugging.c from k5tm project, add MIT DebuggingLib.
  - Edit MyPP_DebugHeaders.pch++, MyPP_NoDebugHeaders.pch++ to #define MACDEV_DEBUG as appropraite and #include <Debug.h>.
  - Remove PP Debug Resources.rsrc from the project file.

* Add Assert *handle != NULL to cc_close().

* Initialize all pointers to NULL in CKrbSession::getCacheInfo().  This seems to solve the crashing problem in k5tm release, even though it still won't get tickets.

* Add some Asserts to CKrbSession::getCacheInfo().

* Added check for handle not NULL to cc_create() .

* cc_open():
  - Add Assert for name == NULL (bad things probably won't happen if this is the case but why would you be trying to do it?)
  - make *handle (the NC being returned) NULL if no match could be found.

* cc_destroy():
  - Add check for handle == NULL, return CC_BAD_PARM.
  - Add Assert for *handle != NULL.
  - Move assignment of *handle to nc to be after these checks.
  
* cc_set_principal():
  - Add check for cc_ctx == NULL.
  - Move check for ccache_pointer == NULL to before we dereference it...
  - Add Assert_ for principal != NULL.

* cc_seq_fetch_creds():
  - Move check for creds parameter == NULL earlier (looked like there was a case where it might be used w/out this check otherwise)...

* cc_get_NC_info():
  - Add check for cc_ctx == NULL.

* cc_free_name():
  - Add check for name == NULL.

* cc_free_cred_internals():
  - Add Assert for creds != NULL.

* cc_free_NC_info():
  - Set *ppNCi = NULL when done freeing it all (pretty sure this was meant to be done, not ppNCi == NULL which does nothing).

* cc_lock_request():
  - Add check for ccache_pointer == NULL.
  - Set *creds to NULL in case of CC_END.

* Make sure retPtr is non-NULL before calling HoldMemory() on it in NewSafePtr(), NewSafePtrSys().

* newCredBuffer():
  - Add Assert nc != NULL.

* copyDataObj():
  - Add Assert obj != NULL.

* copyDataArray():
  - Initialize base, retdest to NULL (not strictly necessary).
  - SignalIf_ *dest, **dest, (**dest)->data allocations fail.  If they are NULL, in addition to Signal, exit procedure (this may have bad results later).

* copyV5Cred():
  - Check for *dest allocation to fail.

* disposeCredBuffer():
  - Assert nc != NULL.
  - Return CC_BAD_PARM if nc is NULL (although no one checks for this at least we won't be mangling memory).

* dupNC():
  - Check for failure to allocate *dest, d->creds, d->creds[i]; return CC_NOMEM if any fail.

9/15/98:

* CKrbSession::CKrbSession() - initialize pointers to NULL.

* CKrbSession::doLogin() - initialize pointers to NULL.
  
* CKrbSession::doLogout() - initialize poitners to NULL, assert parameter is non-NULL.

* cccopycreds() - initialize pointers to NULL.

* CKrbSession::ClearDefaultCache() - initialize pointers to NULL.

* CKrbSession::setNamedCacheAsKrbDefault() - initailize pointers to NULL, assert parameter is non-NULL.

* CKrbSession::SetActiveUserInfo() - assert newFullPrinc is non-NULL.

* CKrbSession::CheckKrbSetup() - initialize pointers to NULL.

* CKrbSession::PrincipalInCache() - initailize pointers to NULL, assert parameter is non-NULL.

* Added Assert that size > 0 in DisposeSafePtr() - if it's not that's a pretty sure bet we're disposing something that we didn't allocate.

* Redid LTabGroup in the Login Dialog (using Constructor).  This fixes the text field focus problems the dialog was having.

9/16/98:

* Go through stdcc.c (the ccache stuff for Kerb 5) and initialize pointers to NULL, and few other safety checks.

* Create procedure in stdcc_util.c called NewSafePtrSys(), identical to the one in CCacheUtil.c .  Maybe we should just #include CCacheUtil.h here instead, I wasn't sure.

* In stdcc_util.c, add #define at top for sys_alloc(), which on Macs will be NewSafePtrSys() and on other systems malloc().  Then in all places CCache memory is allocated, call sys_alloc() instead.  Hopefully this will fix the malloc/DisposePtr mismatches we've been seeing.

* Make copies of c->server and c->client in dupK52cc() in stdcc_util.c to avoid their being malloc'ed on app heap and put them in sysheap instead.

* In dupK52cc(), c->ticket.data and c->second_ticket.data were being allocated even if the originals were NULL (they were being allocated as 0 length).  Fixed so that if the original is NULL, no allocation takes place and copy is NULL too.

* Did the same for c->keyblock.data in dupK52cc() .

9/17/98:

* disposeDataArray() incorrectly attempted to dispose of the memory for the array by using an incremented pointer to the array.  fixed.

9/21/98:

* Redid k5ticketmanager project file from scratch, hoping that this would fix the odd behavior (where CW won't say the kerberos5lib is in the target, even if it is).  It doesn't, but decide to use the redone project anyway.

* Add check to credBufferInsert() for bad cred version *before* we increment the number of stored creds (or allocate more space for one), otherwise cache code will try to use a bogus cache later.

* CCacheLib.PPC target was not building with "enums always int".  CCacheLib.PPC.debug was.  This accounted for the reason the debug k5tm would work, and the release one wouldn't.  Turned "enums always int" on in CCacheLib.PPC.

* Actually, made "C/C++ Language" settings consistent in all targets of CCacheLib.  (CCacheGlobals didn't have "enums always int" either...)

* Removed bogus call to handle = NULL in cc_close().

9/22/98:

* Set *creds to NULL when cc_seq_fetch_creds() encounters and unknown cred type.

* Write new routine, credBufferRemove(), and put it in CCacheUtils.c.  This deletes a cred record from an NC's cred array.

* Modify cc_remove_cred() so that it calls credBufferRemove().

* Fix some problems with the prefix file headers (was including the pch++ file, not the .h file which included the result of precompiling the pch++...)

9/23/98:

* Changed all "Ok" in error dialogs to "OK" (all were in CKrbSession.cp).

* Aligned buttons in TimeZone warning dialog box.

9/24/98:

* Created new File menu, moved "Quit" from K5 menu to File.  Renumber K5 menu to ID 131.

* Change ID number of Active Users menu (edit ppob and CTicketMgrApp.h) from 130 to 200, just to move it out of the way.

* Add Edit menu (fortunately PP supports it without any work on our part).

* Add support for Renew Button (rRenewButton) to CTicketMgrApp::ListenToMessage().

* Add support for Renew command message (msg_Renew) to CTicketMgrApp::ObeyCommand().

* Add CKrbSession:doRenew() procedure for handling Renew command.  Only gives an error at this point.

9/25/98:

* Frank rearranges login dialog (so that buttons are positioned correctly when it's expanded/not expanded), adds code to put default realm's name in the realm field of the dialog (getting a list of the realms for a pop-up turns out to be unsupported).

* Some changes in CKrbUserInfoDlg.cp - not sure what.

9/29/98:

* Add line to CKrbSession::ClearDefaultCache() to set user of default cache back to default user (instead of leaving it whatever it was).

9/30/98:

* Change variable cName in krb5_stdcc_initialize() from an array of char to a pointer to char.  This is necessitated by following change.

* Instead of trying to create the principal name ourselves from the krb5_principal structure, let krb5_unparse_name() do it for us.  (The code I'm replacing neglected to include instances, which could cause krb5_stdcc_initialize to find the wrong cache.)

* Add call to free(cName) at end of krb5_stdcc_initialize() because krb5_unparse_name allocates it.

10/1/98:

* Make CKrbSession::doRenew() give a warning that the Renew Tickets feature isn't completely stable or working.  Have it call doLogin() then.

* Change alert in CKrbSession::doLogin() when you try to log in with a principal that's already logged in.  Ask if user wants to renew or not.  (We may want to change this later but now at least we can proceed and test the renewal process...)

* Move calls to FlushDefaultCache() and ClearDefaultCache() in doLogin() to be after the previous principal is saved.  I don't think there's no need for them be earlier, and since I changed to ClearDefaultCache() to reset the name of the default cache, if we don't save the previous principal name before we do that, we don't save it at all.  This fixes the problem I was seeing of the active user not getting set correctly after a failed login.

10/6/98:

* Change CPrincList::GetAllPrincipals() so that it returns an array of CPrincItem instead of Str255.  Also stop appending the checkmark metacharacter to the name.

* Change CTicketMgrApp::UpdateUsersMenu() to work with array of CPrincItem instead of Str255.  Also change it so that the menu name is set with SetMenuItemText instead of AppendMenu, so the slash in a principal with an instance doesn't get interpreted as a metacharacter.  Use the information in the CPrincItem structure to set the checkmark for the active user instead of using a meta character.  (Made these changes because since we're avoiding metacharacters, had to undo the dependency on the checkmark getting set by metacharacter.)

10/7/98:

* Remove line in krb5_stdcc_initialize() that deletes default cache when it finds an existing one for the username anyway.  While Renew no longer gives errors, it doesn't work right either.

10/21/98:

* Made login dialog movable modal.

* Created a new passsword dialog resource.

* Created CChangePasswordDlg.h and CChangePasswordDlg.cp and started writing them.

10/22/98:

* Synched the krb5 ccapi files with what's in the repository (Ted had made some changes).

10/23/98:

* Frank does some dialog work - rearrange items, fix non-functioning default button when dialog is expanded.

10/26/98:

* Change ccache_it structure name to cacche_cit as per API (although ccache_it makes more sense).  Change all references to it to match in CCache lib, k5tm, and krb5 ccapi sources.

* Rename InitializeCacheLib() to InitializeCacheGlobalsLib(); TerminateCacheLib() to TerminateCacheGlobalsLib().

* All CCacheLib targets now call __initialize() & __terminate() instead of custom initialize/terminate routines.  Since the CCache lib is not a global lib, it's not the right place to call the cache initializers, because they get called each time an application loads the lib.  This lead to gCntrlBlock to getting set to NULL each time an application was run.

* Both CCacheGlobalsLib now call custom __initialize() & __terminate() routines [InitializeCacheGlobalsLib() and TerminateCacheGlobalsLib()] instead of the default ones.

* Changed targets so that CCache.CFM.c is part of the CCacheGlobalLib targets, and not part of the CCacheLib targets.  Added some other libs to the CCacheGlobalLib to support __initialize and __terminate .

10/27/98:

* Swapped position of vers and principal parameters in cc_create() function in CCache.c and CCache.h (they were reversed from the API specs).  Swapped positions of parameters in all calls to it in k5tm and kerb5 ccapi source.

* Add bogus Windows parameter definition KRB5_CALLCONV to all functions in stdcc.h and stdcc.c .  (Yes, it's already in all the rest of the Kerb5 stuff, and it's #defined away for the Mac.)

* krb5_stdcc_close():
  - Remove princ parameter, it wasn't part of the API for that call.
  - Add check for id->data non-NULL before freeing it in.
  - Add calls free and set to NULL id itself.

* Add call to cc_shutdown() to krb5_stdcc_destroy (this is where Windows put it).  This may be very dangerous - test test test.

* Add call to free name in krb5_stdcc_get_prinicipal() for all non-Mac platforms.  Don't want to do this on the Mac, even though we should, because name was NewPtr'ed on the system heap.  Put a comment to this effect.

* stdccCredsMatch() - remove unused local vars krb5_principal_data p1, p2

* Throughout stdcc_util.c - change false to FALSE and true to TRUE (shouldn't make a difference for us and if it makes other platforms happy...)

* dupK52cc() - remove unused local vars krb5_address **tA; krb5_authdata **tAd;

* Added #include <stdio.h> to stdcc.c (I don't think we need but if it makes the other platforms happy...)

10/28/98:

* Added call to free name in krb5_stdcc_get_prinicipal() for the Mac by calling UnholdMemory and DisposePtr.

10/29/98:

* Changed CCacheGlobalsLib.PPC target to use "MSL RuntimePPC.Lib" instead of "MSL ShLibRuntime.Lib" and "MIT RuntimeLib.PPC."  This is to make the globals lib independent of any other shared lib.  The dependency on the MIT RuntimeLib.PPC caused crashes when the GlobalsLib was unliked after it had been used by two different applications.  (This is a poor summary of the real problems.)

* Changed CCacheGlobalsLib.68k target to use "MSL MWCFM68KRuntime.Lib" instead of "MSL ShLibRuntimeCFM68K.Lib" and "MIT RuntimeLib.68k."  Same reasons as with PPC.

11/3/98:

* In cc_remove_cred(), comment out call the credBufferRemove().  Reinstate code that just marks the cred as CC_INVALID_RECORD.  This is so we don't screw up the cc_get_seq_creds() anymore.

* In cc_free_cred_internals(), add check for CC_INVALID_RECORD so that it doesn't attempt to free the internals again.

* Rework credBufferInsert() so that it scans the cred array first for CC_INVALID_RECORDs, and resuses their slot in the array if it finds one, instead of just adding the new cred to the end.  That way we keep the number of INVALID_RECORDS from proliferating, and cc_seq_fetch_creds should be happy with deletions.  However, now it may miss additions; nothing's perfect.

11/4/98:

* Add check for CC_INVALID_RECORD in credBufferRemove() so that it doesn't free internals again.

* Create 68K debug and 68K final targets in the k5tm project.  Add libraries.  Compiled, and they work.  Test on 68K - they don't.

11/5/98:

* ANSIfy parameters for krb5_stdcc_close().

11/12/98:

* Make a ":bin:68k:" folder in the k5tm directory to keep the 68K junk separate from the PPC junk (after all, we don't need to see it all the time).

* Change access paths in all targets in the k5tm project to point at "[mit tree]:lib:GSS-Kerberos5:", which we have declared to be the canonical location for GSS-Kerberos5.

* Rename stdcc_util.h procedure dupK52cc() to dupK5toCC(), to match with dupCCtoK5().

* Make NewSafePtrSys() in stdcc_util.c static, to make clear it's only used locally.

* Remove prototype for typeK52cc() in stdcc_util.h, since there isn't actually a function of that name.

* Add #include "stdcc_util.h" to stdcc.h to pick up prototypes for those functions.

* Add check for gCntrlBlock == NULL to krb5_stdcc_store(), krb5_stdcc_next_cred(), krb5_stdcc_destroy(), krb5_stdcc_get_name(), krb5_stdcc_get_principal(), krb5_stdcc_remove().  We don't really need these, since the ccache functions they call do the same check, but Windows does need them, and they don't hurt us.

11/13/98:

* Convert CCacheLib to CodeWarrior Pro 4.  Add project dependencies, but they don't seem to work.  (Have to build them independently.)  Once that's done, no problem.  The converted lib is still in the CWP4 branch, though.

11/16/98:

* Start converting k5tm to CodeWarrior Pro 4.

* Replace outdated LTextEdit.cp with LTextEditView.cp in all targets of k5tm.

* Remove LGAEditText.cp from all targets of k5tm (it's obsolete, I believe it's been replaced by LGAEditTextImp.cp, which is already included).

* Add UTEViewTextAction.cp to all targets in k5tm; apparently LTextEditView needs it.

* Finished converting k5tm to CodeWarrior Pro 4.

11/17/98:

* Changed cc_free_principal(apiCB* cc_ctx, char* principal) to cc_free_principal(apiCB* cc_ctx, char** principal) as per changes in the API.  Add line to cc_free_principal() to set *principal to NULL as per API.

* Changed cc_free_name(apiCB* cc_ctx, char* name) to cc_free_name(apiCB* cc_ctx, char** name) as per changes in the API.  Add line to cc_free_name() to set *name to NULL as per API.

* Changed all calls to cc_free_principal() and cc_free_name() in k5tm to match parameter changes.

* Changed all calls to cc_free_principal() and cc_free_name() in ccapi to match parameter changes.

11/19/98:

* Replaced LStdButton()s in the main window of k5tm with LPushButton()s.  These are the Apperance standard buttons, and solves our deactivation problems with these buttons.

11/20/98:

* Added a free(fetchcreds) to the end of krb5_stdcc_retrieve_creds() to free up previously allocated memory.

* Commented out CPrincList::HiliteCellActively() and CPrincList::HiliteCellInactively() in both CPricList.c and CPrincList.h so that it will use the inherited functions.  This makes highlighting work acceptably (still need to deal with reappearance of grey background when triangle is twiddled).

11/23/98:

* Replace LDropFlag icons in the resource file with updated ones from CWP4.

* Add private members mForeColor, mBackColor to CPricList.

* Add override functions ApplyForeAndBackColors(), SetForeAndBackColors(), GetForeAndBackColors() to CPricList class so that we can deal with drawing the collapse/expand arrow correctly on the white background.

* Add call to SetForeAndBackColor() to CPrincList::InitList() to set background as white.

* Create new Class, CDropFlagMod.  Similar to LDropFlag, but TrackClick() takes an RGBColor parameter to tell it what color to use to draw the icon on, so that we can draw the icons properly when they're highlited.

* Add override function ClickSelf() to CPrincList.  Modify it to use CDropFlagMod, and to check to see if the cell it's operating on is highlighted or not and pass the right color to CDropFlagMod.

* Changed password field in the Login dialog ppob to be a standard PP LEditText with password option instead of our LPasswordEditField.

11/24/98:

* Increase size of "Renew..." button in main window by 10 pixels so that it doesn't get chopped off/crowded under non-appearance.

* Add lines to case msg_Cancel in CUsrInfoDlg::ListenToMessage() to clear out the password field so that it's not saved across dialog calls!

* Edit "crufty password" dialogs ppobs: give them grey appearance background, change LPasswordEditFields to LEditTexts, remove "i am crufy" messages, turn auto-positioning on (to "Center on Parent Window"), set default and cancel button ID's.

* Add UAMModalDialogs.cp to all k5tm targets.

* Change call to UModalDialogs::AskForOneString() to UAMModalDialogs::AskForOneString() in CKrbSession::ChangePassword() so that we can use the new PP-supported LEditText password.  (UModalDialogs expects an LEditField; UAMModalDialogs expects an LEditText.)

* Add #ifdef in krb5_stdcc_initialize() around allocation for cName; Windows needs to do it differently (it doesn't want the realm name).

* Change procedure CUsrInfoDlg::setFields to CUsrInfoDlg::SetFields() (caps change).

* Change procedure CUsrInfoDlg::getUsernameAndPassword() to CUsrInfoDlg::GetUsernameAndPassword() (caps change).

* Change CKrbSession::CKrbSession() so that it calls krb5_default_realm() first, and then falls back (currently to a hardcoded value, need to change that).

* Change error message when there are krb5.ini problems to say the file could be missing or damaged, not just missing.

11/25/98:

* Add SetInitialActiveUser() method to the CKrbSession class.  It checks for existing tickets on startup, and sets the active user info appropriately if they're found (otherwise it does the "No users authenticated@No realm specified" thing).

12/3/98:

* Add ZapPassword() procedure to CKrbSession.cp.

* Call ZapPassword() after calling krb5_get_in_tkt_with_password() to overwrite password.

12/4/98:

* Write new procedure, ZapTextEditPassword(), to directly overwrite the text handle of an LEditText's TextEdit field.  If you just use SetDescriptor(), the memory is likely to move and leave a copy of the text (the password) behind.

* Add calls to ZapTextEditPassword() to CUsrInfoDlg::GetUsernameAndPassword() and CUsrInfoDlg::ListenToMessage() (when user cancels).

* Redo "crufty password prompt" ppob's again to avoid problems with pane mismatches (dialog ID and sub-pane ID's were sometimes the same).

* More work on CChangePasswordDialog.cp and CChangePasswordDialog.h and new change password ppob.  Get it so that it compiles and shows.

* Rename CKrbSession::ChangePassword() to CKrbSession::OldChangePassword() so that I can save it while testing new password code.

* Have CKrbSession::ChangePassword() call new passowrd dialog calls.

* Create k5tmUtils.c and k5tmUtils.h for utility functions.  Move ZapTextEditPassword() and ZapPassword() there.

12/7/98:

* Add cmd_ChangePassword = 1503 to CTicketMgrApp.h.

* Change CTicketMgrApp::ListenToMessage() 's case statemnt to switch on messages instead of button's resource ID's (they're they same, but this makes more sense).

* Change CTicketMgrApp::ListenToMessage() to respond to msg_ChangePasswd like it does everything else, but sending a command - cmd_ChangePassword.  Move code that was here for handling change password to CTicketMgrApp::ObeyCommand().

* Move code for creating, setting field, and showing ChangePassword dialog to CTicketMgrApp::ObeyCommand().

* Add handlers for cmd_ChangeOK and cmd_ChangeCancel to CKrbSession::ObeyCommand().

* Move code for getting rid of the change password dialog from CChangePasswordDialog to CKrbSession::ObeyCommand().

* Move code for changing password and getting rid of change password dialog from CChangePasswordDialog to CKrbSession::ObeyCommand() and CKrbSession::ChangePassword().

* Remove CKrbSession::OldChangePassword() now that the new one is working.

* Change ZapPassword to take (char *, long) instead of (StringPtr, Size).  This is about the third time I've flip-flopped on this...

* Add a "Change Password..." menu item (and support for it in CTicketMgrApp::FindCommandStatus() ).

* Delete "crufty password dialog" ppob's since we're not using them anymore.

12/8/98:

* Add code to CKrbSession::ObeyCommand(), cmd_ChangeOK part so that the dialog isn't closed if an error occurs; if one does, reset target to first edit field.

* Change constants cmd_ChangeOK to cmd_ChangePass_OK and cmd_ChangeCancel to cmd_ChangePass_Cancel.

* Went through code and everywhere a cKrbErrorAlert is created, made sure it is deleted when it's done.

* Rearranged session menu so that New Login and Change Active User are at the top, with a separator line, then Renew, Destroy, Change Password.

* Change CKrbSession::doLogin() to return a long, not void.

* Move hiding of CUserInfoDlg from CUsrInfoDlg::ListenToMessage() to CKerbSession::ObeyCommand(), and make it conditional on doLogin() returning a good result.

* Remove constants for rOkBtn2 and rCancelBtn2 from CUsrInfoDlg.h since they're not being used anymore.

* Redesign Login dialog (again), more back to original specs with separator line.  (Sorry Frank!)  Now some of the controls over lap - the "advanced" controls are hidden when collapsed, and unhidden when dialog is expanded.  This solves spacing problems.

* Change code in CUsrInfoDlg::ListenToMessage() for drop triangle.  Now it hides and shows "advanced" controls as necessary.

12/9/98:

* Add code to CUsrInfoDlg::ListenToMessage() to force slider caption to update while slider is tracking (swiped from Appearance Demo).

* Move "Forwardable Tickets" checkbox above lifetime slider in Login Dialog.

* Add message constants for lifetime slider, forwardable checkbox, drop triangle to CUsrInfoDlg.h (same as their class ID or resource ID), and start using them in CUsrInfoDlg.cp instead of class ID directly.

* Remove cmd_LifetimeSlider, cmd_FowardableCheck consts from CUserInfoDlg.h because they're not being used and they're not a things that would send commands (use message consts instead).

* Add message constants for all edit fields to CUsrInfoDlg.h (same as their resource IDs).  Set edit fields to broadcast these as their value message in ppobs.

* Add new function, SetButtonStatus(), to CUsrInfoDlg.cp.  It checks the edit fields to see if they have data in them, and enable/disables the OK button as appropriate.

* Add cases for edit fields messages to CUsrInfoDlg::ListenToMessage() and call SetButtonStatus() when they're received.

* Add Show() override to CUsrInfoDlg.cp so that I can call SetButtonStatus() when the window is shown to make sure it's right.

* Create prototype Preferences dialog.

* Add "Preferences..." menu item to "Edit" menu.

* Create CKrbPrefs.cp and CKrbPrefs.h for dealing with the preferences dialog.

* Add code to CTicketMgrApp.cp for handing Prefs menu item and showing dialog.

12/10/98:

* Set creator type to "k5tm" in all k5tm targets (this currently available, I checked at Apple).

* Change CKrbSession::ChangePassword() so that it only requires new passwords be non-null; old password may still be null.

* Turn off wctb (and thus grey backgrounds) in all k5tm windows/dialogs.  It caused incorrect appearance under non-Platinum themes.  (We'll be regaining the background by upgrading to beta PowerPlant, which actually uses the theme backgrounds.)

* Changed "no realms specified" text in active user listing when no users are logged in to "--" (I'm open to another suggestion, but lxs said "no realms specified" was confusing and she's right).

* Set the size of a lot of ppob elements back to standard size, some alignment.

12/11/98:

* Start upgrading k5tm to PowerPlant 1.9.3b2.  To this, you should:
  (1) Get PowerPlant 1.9.3b2, and install it as per the instructions.
  (2) Get Apple Universal Headers 3.2, and install them as per instructions (ignore that is says CWP4 has the 3.2 headers - it doesn't - and ignore the OpenTransport header instructions.)
  (3) Rebuild the MacHeaders project.
  (4) Rebuild k5tm.

* Add UAppearance.cp to all targets of k5tm (required by PP 1.9.3b2).

* Remove PPobClasses.cp from all targets of k5tm (it's obsolete).

* Remove LPasswordEditField.cp from all targets of k5tm (we're not using it any more).

* Change (obsolete) Char16 declarations to equivalent type UInt16.

* Add ControlsLib and WindowsLib to PPC targets of k5tm (required by Universal Headers 3.2) but weak-link them so that k5tm will still work under pre-8.5.

* Add LWindowThemeAttachments to all window ppob's so they'll pick up the theme colors; unfortunately only some do.

* Replace LPicture in Kerberos Error dialog ppob with an LIconPane, and the corresponding PICT resource with an icon family.  The PICT had a hardcoded background which didn't match all themes; the icon lets whatever background there is show through.

12/14/98:

* Change all LCaption's in Main Window to Appearence-savvy LStaticText's, and change appropriate references in code.  This solves the problem of the text not getting the correct appearance color.

* Change all LCaption's to LStaticText's in CKrbPrefDialog.cp.

* Change rest of LCaption's to LStaticText throughout k5tm.

* Change all LGroupBox's to appearance-savvy LTextGroupBox's thoughout k5tm.

* Move LWindowThemeAttachements around in ppob hierarchies to get them to work (make sure they are at the very top of the hierarchy!)

* Convert to PowerPlant 1.9.3fc1.  Have to add "CustomTextColorCDEF.rsrc" to the PPC targets, but that's the only change.

* Add check (with #if and #error pragmas) for PowerPlant 1.9.3 and Universal Headers 3.2 to the top of CTicketManagerApp.cp.

12/15/98:

* Create Edit Realms List dialog in Constructor.

* Add LTextColumn.cp, LColumnView.cp, LTableMultiSelector.cp, LDragAndDrop.cp, LDragTask.cp to all k5tm targets.

* Add LArray *realmsList as a protected member to CTicketMgrApp.

* Initialize realmsList by calling new array in CTicketMgrApp constructor.

* Create CEditRealmsDialog.cp, CEditRealmsDialog.h and add them to the project.

12/16/98:

* Replace LScroller in Main Window with LScrollerView (which is Appearance-savvy; LScroller can cause problems when mixed in the same view as Appearance controls).

* Add temporary "Edit Realms" menu item to the Edit menu.  Add matching cmd_EditRealmsList constant to CTicketMgrApp.h.

* Add support for cmd_EditRealmsList to CTicketMgrApp::ObeyCommand() and CTicketMgrApp::FindCommandStatus().

12/17/98:

* Add support for cmd_EditRealms_OK and cmd_EditRealms_Cancel to CTicketMgrApp::ObeyCommand() (they just dismiss the dialog at this point).

* Realized CPrincList::DrawSelf() was hardcoded to use white.  Change to use the mBackColor.

* Created CTextColumnColorized.cp, CTextColumnColorized.h and added them to all targets in the k5tm project.  It is an LTextColumn subclass that lets you set the fore and background colors it will use to draw with.

* Flesh out CTextColumnColorized, CEditRealmsDialog.

12/18/98:

* For some reason most of our LDialogBox subclasses weren't calling LDialogBox::FinishCreateSelf() in their FinishCreateSelf() routines.  Fixed.

* Move SetButtonStatus() call in CUsrInfoDlg::Show() to CUsrInfoDlg::FinishCreateSelf.  Remove CUsrInfoDlg::Show() .

* Change CTicketMgrApp::realmsList's name to mRealmsList.

* Add code to CEditRealmsDialog::SetCurrentRealmArray() to copy the array contents into the realms table.

* In CTicketMgrApp::ObeyCommand(), add a "Default" relam to the mRealmsList array just for testing.

* Create CKrbPreferences.cp and CKrbPreferences.h files for preference reading, writing, and storing class.

* Add LPreferencesFile.cp, LFile.cp to all k5tm targets.

12/21/98:

* Removed mRealmsList member from CTicketMgrApp - it's going into the preferences object instead.  Remove code references to it.

* Add TArray<Str255> *mRealmsListArray to CKrbPreferences as member.

* Put local copy of LAMPushButtonImp.cp (from PowerPlant) into k5tm project.  We've changed the code to fix a bug when moving buttons under non-Platnium themes.

* Update to CW compilers 2.2.1, MSL 4.1.05.

* Stop calling LDialogBox::FinishCreateSelf() from LUsrInfoDlg::FinishCreateSelf().  It causes extra default outlines when the buttons are moved.

* Add a warning that the edit realms dialog doesn't really do anything.

1/4/99:

* Add pragmas for struct alignment, int size, etc. to CCache.h.

* Add extern "C" declaration to CCache.h.

* Set cred_type of V4 credentials in cc_seq_fetch_creds().

1/5/99:

* In CUsrInfoDlg::ListenToMessage(), don't find "theWindow" but using FetchTopModal(); the CUsrInfoDlg is a window, so we can just use this.

* Add code to CUsrInfoDlg::FinishCreateSelf() to find the disclosure triangle and tell it to be set to expanded, so that login dialog starts expanded.

* Temporarily deactivate Preferences... and Edit Realm... menu items.

* Remove calls to LDialogBox::FinishCreateSelf() in CChangePasswordDialog(), CKrbPrefsDialog() FinishCreateSelf routines (which cause extra default outlines on non-appearance systems).

* Declare k5tm version to be 1.0d1, do limited release, check in and tag sources.

* Reactivate Prefereces... and Edit Realm... menu items.

* Change code and ppobs of login slider (and preferences slider) to have maximum value of 10 hours.  Login slider also has initial value of 10 hours.

1/6/99:

* Merge CWPro 4 branch of CCache, k5tm back into main trunk.

* Remove call to cc_shutdown() in krb5_cc_destroy() (it was inappriopriate - we didn't want to destroy *all* caches here, just the one (and we were already doing that).

* In CCache.h, change values of KRB_PRINCIPAL_SZ, KRB_INSTANCE_SZ, KRB_REALM_SZ, KRB_SERVICE_SZ from 1250 to 40, which is the correct size.

* Remove line incrementing numNCs in cc_store(), since we aren't changing the number of NC's in this function!

1/7/99:

* Rename CTicketMgrApp::getKrbSession() to GetKrbSession().

* Add new memeber, mKerbPreferences, to CTicketMgrApp.

* Add new function, CTicketMgrApp::GetKrbPreferencesRef(), so that we can get the pointer to the prefs object from other objects.

* Remove function SetCurrentRealmArray() from CEditRealmsDialog (not using this approach anymore).

* Add RemoveRealmByIndex() function to CKrbPreferences.

* Add CopyPrefsToRealmsTable(), CopyRealmsTableToPrefs() functions to CEditRealmsDialog.  Call CopyPrefsToRealmsTable() from FinishCreateSelf(), call CopyRealmsTableToPrefs() when the mesage for the Done button is received.

1/11/99:

* Add code to CTicketMgrApp::ShowAboutBox() to read the short version string from the resources and display it in the about box (instead of using a hardcoded one).

* Add tons of accessors to CKrbPreferences for setting/getting various preference options.

1/12/99:

* Add calls to initialize non-realm preferences in CTicketMgrApp::StartUp().

* Go through and add Assert_ for NULL after all FindPaneByID calls (I've been burned by this several times).

* Change many of the simple 'Get' accessors for Boolean and UInt32 values to just return the value, not require a parameter to get it, in CKrbPreferences.

* In  CTicketMgrApp::UpdateActiveUserInfo(), change "less than/about x hours" messages for time remaining to be 10/50 mins instead of 15/45.  Also, if the tickets are nearly expired, do hh:mm display in stead of "About 0 hours".  Also display "hour" (not "hours") for 1 hour.

* Starting adding code for setting Preference dialog values based on Preferences data in CKrbPrefsDialog::FinishCreateSelf().

1/13/99:

* In CTicketMgrApp::FixButtonStatus(), always disable Renew button for 1.0 release.

* In CTicketMgrApp::FindCommandStats(), always diable Renew menu item for 1.0 release.

* Add CKrbPrefsDialog::CopyPrefsToSettings() and CKrbPrefsDialog::CopySettingsToPrefs() for putting and getting the prefs into/out of the preferences dialog.

* Remove member "lifetime" from CUsrInfoDialog, we won't need it anymore with the prefs.

* Add CUsrInfoDialog::CopyPrefsToSettings() for copying the prefs to the user info dialog.  Move some stuff from FinishCreateSelf() to there.

* Comment out a chunk of CUsrInfoDlg::SetFields() because we want to use prefs values (can't get rid of it completely until I deal with realms, though).

* Move creation of CUsrInfoDlg from CKrbSession::CKrbSession() to CKrbSession::doLogin().

* Change CKrbSession::ObeyCommand() cmd_LoginOK handler to destroy the login dialog if successful login (previously the login dialog was only created once and kept around; for changing preferences, this isn't good, and we no longer have a reason to do this).

* Add cmd_LoginCancel handler to CKrbSession::ObeyCommand() to delete the dialog when user cancels (now that we're creating a new dialog each time we do a login).

* Remove hiding the dialog from CUsrInfoDlg::ListenToMessage() msg_Cancel handler.

* Rename GetUsername() and SetUsername() in CKrbPreferences to GetDefaultUsername() and SetDefaultUsername().

* Add CUsrInfoDialog::CopySettingsToPrefs() for copying the state of the dialog (and username if we're remembering it) to the prefs.

1/14/99:

* Change "this user is already logged in" warning in CKrbSession::doLogin() to tell user to destroy and log in again since renew isn't working.

* Add code to msg_LoginCancel in CUsrInfoDlg::ListenToMessage() to remember the expanded/collapsed state of the login dialog.

* Split "Change password for 'user@realm'" caption in change password dialog into two caption and two lines to allow for larger usernames.

* Adjust resource ID's of things in ppob of change password dialog (many weren't unique).

* Recode CChangePasswordDialog::SetFields() to use new caption fields.  Also reword error messages a little.

* Add AddRealmByNameUnique() to CKrbPreferences which adds a realm only if it isn't already in the array.

* Add code to CKrbSession::CKrbSession() to add default realm to the realms list.

1/15/99:

* Add some support for realms popup to CKrbPreferences (in CKrbPrefsDialog::CopyPrefsToSettings() and ListenToMessage() ).

* Remove realm edit field from CKrbPrefsDialog ppob (realms popup is the way of the future).

1/19/99:

* Edit Login dialog to remove realms edit field and put in realms popup menu.

* Edit almost every procedure of CUsrInfoDlg to deal with realsm popup instead of edit field.

* Remove call to userinfodialog->SetFields() from CKrbSession::doLogin() because now the prefs are setting the info.

* Delete CUsrInfoDlg::SetFields() because it's no longer appropriate.

* Add two new messages, msg_EditRealms_OK and msg_EditRealms_Cancel, to CEditRealmsDialog.h .

* In CTicketMgrApp::ObeyCommand, cmd_EditRealmsList handler, assume creating dialog's pointer is in ioParam and add it to the Edit Realms's dialog's listener list.

* Make CEditRealmsDialog inherit from LBroadcaster.

* In CTicketMgrApp::ObeyCommand, cmd_EditRealmsList handler, switch to use StDialogHandler, so that we don't have to worry about who's throwing the dialog away.

* In CTicketMgrApp::ObeyCommand, remove cmd_EditRealms_OK and cmd_EditRealms_Cancel handlers.

1/20/99:

* Remove cmd_EditRealms_OK and cmd_EditRealm_Cancel and code that sent those.  (Replaced with msg_EditRealms_OK and msgEditRealm_Cancel.)

* Make CKrbPreferences an LBroadcaster.

* Add msg_PrefsRealmsChanged to CKrbPreferences.h.

* Whenever a realm is changed through one of the accessor functions, CKrbPreferences broadcasts msg_PrefsRealmsChanged.

* Change CKrbPrefsDialog to listen for msg_PrefsRealmsChanged.

* Don't set listener in CTicketMgrApp::ObeyCommand, cmd_EditRealmsList handler anymore (changed our minds, prefs object now handling this).

* Add a bunch more messages to CKrbPreferences and code to broadcast them at the right time (when relevant prefs change).

* Add support for Edit Realms in CUsrInfoDlg - in ListenToMessage() and new procedure CopyRealmsListToPopupMenu().

1/21/99:

* Change CKrbSession::getRealmsNames() to GetRealmNames() and now returns void instead of LArray * (they do go into the array in the prefs).

* Rewrite CKrbSession::GetRealmsNames() to use new realms iterators API to get all realms.  Move stuff to get default realm from CKrbSession::CKrbSession() to GetRealmsNames().

* Add resource identifiers, etc. to CKrbPreferences().

* Add three procedures, InitializeFromPrefsFile(), InitializeFromApplDefaults(), InitializeFromHardcodedDefaults() to CKrbPreferences.  Call each in turn from CKrbPreferences::InitKrbPreferences().

* Move setting hardcoded resources from CTicketMgrApp::StartUp() to CKrbPreferences::InitKrbPreferences();

* Rename CTicketMgrApp::createMainWindow() to CTicketMgrApp::CreateMainWindow()

* Add code to CTicketMgrApp::CreateMainWindow() to use the window position stored in the preferences.

1/22/99:

* Change version number to 1.0d2.

* Change mKrbPreferences to a direct member, not a pointer, in CTicketMgrApp.

* Add calls to delete fkSession and fKPrincList to CTicketMgrApp::~CTicketMgrApp().

* Change prefs structure member defaultRealm to defaultRealmIndex.

* Rename CKrbPreferences::SetDefaultRealm() and CKrbPreferences::GetDefaultRealm() to SetDefaultRealmByIndex() and GetDefaultRealmByIndex().

* Add CKrbPreferences::SetDefaultRealmByName() and CKrbPreferences::GetDefaultRealmByName().

* In every CKrbPreferences function that accepts an incoming realm, copy it into a temporary string cleanRealm.  The TArray is storing each realm entry as 256 characters, and when you add an item to the array, it stores all 256 characters; and when you compare items, it compares all 256 characters.  Which means while some entries are the same when considered as a pascal string, the "unused" bytes past the string might be different.  Copying them to a known string with empty bytes avoids this problem.

* Disable Edit Realms menu in CTicketMgrApp::FindCommandStatus().

* Disable "Edit Realms..." menu item at the bottom of popups.

* Roll a 1.0d2 release; it has some problems.

1/23/99:

* Make CKrbPreferences::Initialize...() functions protected functions.

* Add CKrbPreferences::WritePrefsToDisk() .

* Add CKrbPreferences::InitializeFromHandle(), CKrbPreferences::PrefsLookSane().

* Add member mPrefsInitialized to CKrbPreferences.

* Steal code from Login library for InitializeFromPrefsFile(), InitializeHandle(), PrefsLookSane(), WritePrefsToDisk() in CKrbPreferences (edit it somewhat, don't need some of the stuff).

* Change prefs resource type to 'ktmP' (since a copy of this will go into the app's resource fork, it shouldn't be the same four-char code as the app's signature, since that's used for something else).

* Work on creating a TMPL for editing the prefs resource, but it's not working quite right.  Put it in the k5tm resource file anyway.

* Put a copy of a mostly reasonable 'ktmP' into the k5tm resource fork so it'll get built into new copies of the application.

* CKrbPreferences is no longer a descendent of LPreferencesFile.  We weren't using any of the stuff we inherited, so why bother?

* Create CTMMainWindow, a subclass of LWindow, which we're creating just so we can put in a hook to update the prefs when the window is moved.

* Change main window ppob to be of type 'tmMW' (CTMMainWindow) instead of a usual window.

* Remove code that saves window position from CTicketMgrApp::~CTicketMgrApp() (moved to CTMMainWindow::ClickInDrag() ).

* Add check to CTicketMgrApp::CreateMainWindow() that saved window position fits on the current desktop size (GetGrayRgn()).  If it doesn't, let window auto-position.

* Make check for MITCLib's presence in CTicketMgrApp::StartUp() separate from the Krb lib and CCache lib checks, because we cannot display the fancy CKrbErrorAlert if MITCLib isn't present, because it uses C lib functions!  If MITCLib isn't present, display a regular alert using UModalAlerts.

* Create ALRT resource 4500 for No MITAthenaLib warning, and put it in k5TicketManagerResources.rsrc file.

1/25/98:

* Remove 'ktmP' resource from the k5tm resource fork so that it doesn't interfere with testing.

* Stop setting prefs dirty when realms are added/deleted for debugging purposes (since we're not saving realms info anyway...)

* Add check and warning for prefs version number to CKrbPreferences::PrefsAreSane().

* Add warning when saving prefs failed.

* Change size of CKrbErrorAlert ppob to accomodate more text.

* Change mKrbPreferences member of CTicketMgrApp back to being a pointer, not a direct member (we need some stuff to be initialized).  Add call to new in StartUp(), and add call to delete in ~CTicketMgrApp().

* Add a call to free the prefs handle in CKrbPreferences::InitializeFromHandle().

* Add new function CKrbPreferences::PrefsChanged() which mostly just writes the prefs to disk (and gives an error if it can't).

* Move code to save prefs and give warning if it fails from ~CKrbPreferences() to PrefsChanged().

* Change prefs to store default realm as string, not index.  mPrefs.defaultRealmIndex goes away, replaced with mPrefs.myDefaultRealm

* Rewrite SetDefaultRealmByIndex(), GetDefaultRealmByIndex(), SetDefaultRealmByName(), GetDefaultRealmByName() in CKrbPreference to deal with this prefs change.

* Add alwaysExpandTicketList option to preferences, and accessors SetAlwaysExpandTicketList(), GetAlwaysExpandTicketList().

* Create CStr255Comparator to try to solve some of our problems with comparing the realm Str255.

* Set the realms array to use a CStr255Comparator in InitKrbPreferences().

* Get rid of all the stupid cleanRealm stuff in CKrbPreferences now that we have a decent comparator.

* Start work on a new Edit Favorite Realms ppob with a Font D/A Mover-like interface.

1/26/99:

* Change CKrbPrefeneces.h to #include "KerberosPreferences.h" from the Login library, which has the file name, type, and creator for the prefs file.

* Set default realm in InitializeFromHardcodedDefaults() to null string.  That way we'll be able to tell if we should fill it in later or not.

* In CKrbSession::GetRealms(), check to see if we have a user default realm before setting the Kerb default realm as it (if we have one, don't do it; if we don't, must be starting fresh).

* Change name of default realm in prefs structure from myDefaultRealm to userDefaultRealm.

* Add some struct alignment pragmas around the preferences structure in CKrbPreferences.h - check with Miro about these.

* Added a loginWindowPosition to the prefs structure, although we haven't implemented the code to support it.

* Add GetLoginWindowPosition(), SetLoginWindowPosition() to CKrbPreferences.  Set login window position to 0,0 in InitializeFromHardcodedDefaults().

* Add CUsrInfoDlg::ClickInDrag() to trap when window is moved and update prefs.

* Add code to CUsrInfoDlg::FinishCreateSelf() to move window to position saved in prefs (if one exists and it's on the current desktop).

* Add mKrbPrefsRef member to CPricList.  Add code to CPrincList::CPrincList() to get prefs ref.

* Add code to CPrincList::UpdateListFromCache() to read always expand pref from preferences, and start rows as collapsed/expanded accordingly.

* Add checks to CTicketMgrApp::FindCommandStatus() to cmd_NewLogin, cmd_Destroy, and cmd_ChangePassword to make sure fKSession has been instantiated before enabling this commands (this fixes Miro's crash if you do cmd-N while k5tm is launching).

* Add new checkbox for "Always Expand Tickets List" to CKrbPrefsDialog ppob and appropriate constants to CKrbPrefsDialog.h.

* Add code to CKrbPrefsDialog to support new checkbox and set preferences accordingly.

* CKrbPrefsDialog::ListenToMessage() was setting the default realm immediately based on the user's choice from the popup.  Moved this code to CKrbPrefsDialog::CopySettingsToPrefs().

* Change version number to 1.0d3.

* Change targets build names to "Kerberos Ticket Manager" and "Kerb Ticket Manager.debug".

* Release version 1.0d3.

* Start work on a version of CCache that will launch Ticket Keeper (steal code from Ticket Keeper Launcher).

1/27/99:

* Fix 'TMPL' resource for editing preferences (with Miro's help).

* Moved initialization of mKrbPrefsRef to earlier in CPrincList::CPrincList() (under some circumstances we tried to use it before it had been initialized).

* Reenable krb5_free_realm_string() in CKrbSession::GetRealmNames() - seems to be fixed in GSSLib 1.1b4.

2/3/99:

* Fix size of several dialog items that were too small for some system font choices.

* Add call to FixButtonStatus() to CTicketMgrApp::CreateMainWindow() so that buttons are already set correctly when window shows (instead of flickering like they do now).

2/4/99:

* Made CPrincList inherit from LListener.

* In CPrincList::CPrincList(), add object as a listener to the prefs so we can catch broadcasts of when prefs change.

* Add new CPrincList::ListenToMessage() function.  Looks for message from prefs that "alwyas expand prefs list" has changed and redraws list to match.

* Add two new Boolean to preferences structure, "autoPositionMainWindow" and "autoPositionLoginWindow".  This will avoid using 0,0 as a "magic" position to indicate autopositioning.

* Add parameter and support for auto-position boolean to each of the four windows accessors in CKrbPreferences.

* Update places that deal with window positions (CTicketMgrApp, CTMMainWindow, CUsrInfoDlg) to use new autopostion flag.

* Edit prefs TMPL to accomodate new autoposition flags.

* Bump version number to 1.0d4.

2/9/99:

* More work on new Edit Realms Dialog ppob.

* Start editing CEditRealmsDialog.h and .cp for new ppob elements.

* Lots of surgery on CEditRealmsDialog.cp and .h for new purpose (junk most of existing code).

* Re-enable "Edit Favorite Realms" item at bottom of realms popups.

* Change Edit/Edit Realms... menu item to Edit/Edit Favorite Realms...

* Re-enable "Edit Favorite Realms" in CTicketMgrApp::FindCommandStatus().

2/12/99:

* Steal a lot of code from LDragAndDrop example and add it to CTextColumColorized to add drag and drop functionality.

2/16/99:

* Add SetRealmsListFromTable() to CKrbPreferences for setting all the realms in one fell swoop.

* Rename most constants and variables in CKrbPreferences from "Preferences" to "MiscPrefs" to distinguish them from new constants and variables "RealmsPrefs", which I added.

* Added new functions InitializeRealmsPrefsFromHandle(), FlattenRealmsPrefs(), AppendString() to CKrbPreferences.

* Add code to WritePrefsToDisk() to write realms prefs.

* Add code to InitializePrefsFromDisk(), InitializePrefsFromApplDefaults() to read realms prefs.

* Add mRealmsPrefsDirty member to CKrbPreferences .  Rename mPrefsDirty to mMiscPrefsDirty.

* Set mMiscPrefsDirty/mRealmsPrefsDirty in appropriate set calls of CKrbPreferences.

* In CKrbPreferences::WritePrefsToDisk(), check mMiscPrefsDirty/mRealmsPrefsDirty and only write each type of prefs to disk if they're true (no point in writing both when only one has changed).

2/19/99:

* Remove defaultRealm member from CKrbSession.  Add member mKrbPrefsRef.

* Remove CKrbSession::GetRealmNames(), and move default realm getting/setting stuff to constructor.

* Change CKrbSession::doLogin() so that it gets the default realm from the preferences, not storing it in itself.

* Rename a lot of the members of CKrbSession.

* Make realms lists single selectable to solve certain problems with drag and drop and UI issues.

* Add check to CTextColumnColorized::ItemIsAcceptable() to make sure drag came from inside the application.  This should prevent the random crashes when dragging in stuff from some applications.

* Change CEditRealmsDialog::SetButtonStatus() so that "Remove" button is inactive if there's only one realm.

2/22/99:

* Change CTextColumnColorized::ReceiveDragItem() so that before inserting an item it checks to see if it's already in the list; if it is, it considers the drag a move operation; if it's not, it considers it a copy operation.

* Add member mAllowDrops to CTextColumnColorized because we really don't want drops into the All Realms table, just the favorite realms table.

* Add SetAllowDrops() and GetAllowDrops() functions to CTextColumnColorized to set the mAllowDrops member.

* Add check in CTextColumnColorized::ItemIsAcceptable() for mAllowDrops, and if it's false, refuse items.

* Set mAllRealmsTable to not accept drops in CEditRealmsDialog::FinishCreateSelf().

* Move "Remove All" button in "Edit Favorite Realms" dialog to be out of the window bounds (instead of deleting it altogether in case we decide we want it back).

* Increase version number to 1.0d5.

* Released version 1.0d5.

* Start converting over to new CCache v2.

* Add mCntrlBlock member to CKrbSession to hold the CCache context (replaces gCntrlBlock).

* Add call to cc_initialize() to CKrbSession::CKrbSession().

* Make function cccopycreds() in CKrbSession into a member function.

* Replace all old CCache iterator calls with new v2 ones in CKrbSession.cp .

2/24/99:

* In CKrbSession::CKrbSession(), call Krb5GlobalsGetDefaultCacheName() to get default cache name instead of krb5_cc_default_name().

2/25/99:

* Modify CKrbSession::SetInitialActiveUser() for new CCache.

* Change "No authenticated users" message that k5tm displays to "No active user", which is more accurate.

* Rename doLogin(), doLogout(), doRenew() in CKrbSession to DoLogin(), DoLougout(), DoRenew().

2/26/99:

* Rewrite CKrbSession::GetCacheInfo() procedure to work with new CCache.

3/2/99:

* Started rewriting CKrbSession::PrincipalInCache() for new CCache.

3/3/99:

* Disable call to CheckKrbSetup() in CTicketMgrApp::Startup() because it doesn't work right with the current krb5 lib, and the new way to do is buggy.

* Rewrite CKrbSession::PrincipalInCache() to properly compare principals using krb5 routines.

* Rewrite CKrbSession::DoLogin() for new CCache.

3/5/99:

* Continue rewriting CKrbSession::DoLogin().  Fix problems in CKrbSession::GetCacheInfo().

3/8/99:

* Add call to krb5_cc_set_default_name() to DoLogin() to make sure kerb5 lib knows the latest default cache name.

* Rewrite CKrbSession::SetNamedCacheAsDefault() to use new CCache.

* in CKrbSession::SpendTime() do an or-equals on the incoming value of mCacheDirty because it may have already been dirty when we came in to this procedure; a case of this is when default caches (active user) got swapped - cc_get_change_time() can't detect when the default cache has changed because that's in Krb5 Globals.

3/9/99:

* Remove CKrbSerssion::ClearDefaultCache() and CKrbSession::FlushDefaultCache() - they're obsolete with CCache v.2.

* Renamed CKrbSession::SetNamedCacheAsKrbDefault() to CKrbSession::SetPrincipalAsDefault(), a more accurate name now.

* Rename CKrbSession::PrincipalInCache() to CKrbSession::FindPrincipalInCache().  Add paramter to pass back name of cache containing that principal.

* Rewrite CKrbSession::SetPrincipalAsDefault() to use FindPrincipalInCache() (it was doing the same code, duh!).

3/11/99:

* Add new utility function CKrbSession::CompareKerberosPrincipals().

* Rewrite CKrbSesison::DoLogout() to use CCache v2.

* Add check to CKrbSession::FindPrincipalInCache() to make sure we find only V5 credentials.

* Add checks to CKrbSession::GetCacheInfo() to only return NC's with V5 credentials.

* Remove mDefaultCacheName from CKrbSession (it's better to re-get it each time we need it).  Remove code in CKrbSession::CKrbSession() that set it.

* Change CKrbSession::SetInitialActiveUser() to get name of default cache by itself instead of depending on stored member.

* Remove CKrbSession::CCCopyCreds() because its not used anymore.

* Add code to CKrbSession::ChangePassword() to swap caches as necessary so the chpwd tickets end up in the right cache.

* Add call to krb5_cc_set_default_name() to CKrbSession::SetPrincipalAsDefault() - otherwise the krb lib doesn't realize we made this change!

3/12/99:

* Fix cache_ref and principal leaks in CKrbSession::FindPrincipalInCache().

* Add call to krb5_cc_close() after successful login to prevent ccache ref leak.

* In CTicketMgrApp(), rename fKSession to mKSession, and fKPrincList to mKPrincList.

* Remove prompt parameter from CKrbSession::DoLogin().  Cut out bit that it controlled into new function CKrbSession::DoLoginDialog().  Changed calls to DoLogin() as appropriate.

* Removed mLoginDialog from CKrbSession - it wasn't being used.

* Remove CKrbSession::CheckKrbSetup(), we aren't using it anymore (the CKrbSession constructor handles the checks.)

* Remove call to CheckKerbSetup in CTicketMgrApp::Startup() (the CKrbSession constructor deals with the checks).

* Add new function, CKrbSession::KerberosStartupFailed(), to call when kerberos initialization fails.

* Add new function, CTicketMgrApp::SetFatalFlag() to tell the app that it's quitting.  Add new member, mFatalFlag, to CTicketMgrApp.

* Move RegisterClass_ calls from CTicketMgrApp::CTicketMgrApp() to new function RegisterTMClasses().

3/15/99:

* Added new member, mLastDefaultCacheChange, to CKrbSession.  Initialize it to -1 in CKrbSession::CKrbSession() .

* Added call to Krb5GlobalsGetDefaultCacheNameModification() to CKrbSession::SpendTime() to check and set mLastDefaultCacheChange, and put that information into mCacheDirty.  This lets us know when something else changed the default cache.

* Add call to krb_cc_close() in CKrbSession::ChangePassword() to fix ccache leak.

* Change CKrbSession::SetInitialActiveUser(), CKrbSession::SetPrincipalAsDefault() to look through the specified user's creds for the TGT instead of just assuming it's the first one, and to deal if a TGT isn't found for some reason.

* Change CPrincList::UpdateListFromCache() to insert child rows with AddLastChildRow() instead of InsertChildRows().  This means the tickets will be listed in the same order they're in the cache (meaning the TGT will usually appear on top) instead of reverse order.

* Add code to CKrbSession::UpdateCacheInfo() to return an expiration time with the principal items (as well as credential items).

* Remove check from CPrincList::DrawCell() that only drew the expiration time for credential items, not principal items.

* Add code to CPrincList::DrawCell() so that the active principal's time isn't underlined (looked a little silly).

3/16/99:

* Add code to CPrincList::DrawCell() so that the time will only get shown for a principal line if the principal line is collapsed.

* In CPrincList::ClickSelf(), add a call to Refresh() after a user clicks on the drop flag so that the time will get added/removed (otherwise PP didn't think it needed to update that line).

* 3/17/99:

* Rewrite parts of CKrbSession::DoLogin() to deal with doing a Renew.

3/18/99:

* Rename current CKrbSession::DoLogin() to CKrbSession::GetTGT().

* Create new function called CKrbSession::DoLogin() as the main function to do a login (DoLoginDialog() and GetTGT() will now also be used by DoRenew()).

* Add code to CUsrInfoDlg::CopyPrefsToSettings() to make the password field the active field if there's a stored username.

* Add new function CUsrInfoDlg::SetUsernameAndRealm() for renew purposes.

* In CTicketMgrApp, re-enable the renew menu (in FindCommandStatus() ) and (in FixButtonStatus() ).

* Renumber icon family resource #128 to #200.

* Create new icon family resource ID #128 for new k5tm icon.

* Create BNDL resource for k5tm (which created an FREF).

* Change LPicture pane in main window ppob to an LIconPane, and make it display the new icon #128.

3/22/99:

* Change CUsrInfoDlg::SetUsernameAndRealm() to return a Boolean.

* Implement CStr255Comparator::CompareToKey() because LinearSearch() needs it (and even LComparator leaves it unimplemented!).

* Remove "rocky road ahead" warning from CKrbSession::DoRenew().

* Remove renew warnings from CKrbSession::GetTGT().

* Bump version number up to 1.0d6.

3/23/99:

* Add calls to StCurResFile in several CKrbPreferences functions to keep our resource fork from going astray.  This fixes the version number bug in the about box.

* Remove call to krb5_cc_default() in CKrbSession::CKrbSession(), it was unnecessary.

* Add some cleanup code to CKrbSession::GetTGT() if it fails prematurely.

* Add stuff for registering LIconControl to CTicketMgrApp.cp.

* Replace LIconPane in Main Window ppob with LIconControl, so that it will dim properly.

* Add call to LCommander::SetUpdateCommandStatus(true) to CTicketMgrApp::UpdateUsersMenu().  This solves the problem of the Active Users menu not updating quickly sometimes.

* Add new member, mDontSavePrefsMode, to CKrbPreferences.  Set it to false in InitPreferences().

* Add new functions, SetDontSavePrefsMode() and GetDontSavePrefsMode(), to CKrbPreferences for accessing mDontSavePrefsMode member.

* Add check for mDontSavePrefsMode to CKrbPreferences::PrefsChanged().  If it's true, don't write the prefs to disk.  This allows us to make changes without writing to disk.

* Add calls to CKrbPreferences::SetDontSavePrefsMode() in CKrbSession::CKrbSession() so that when we add the default realms, a prefs file won't get written if the user hasn't changed anything yet.

3/24/99:

* Set mPrefs.userDefaultRealm to empty string in CKrbPreferences::InitKrbPreferences().  This allows us to ignore errors reading the realms preferences later.

* Change to return true from CKrbPreferences::InitializeFromPrefsFile() when reading realms prefs resource fails, because we can deal with that error (if we return false app will fail).

* Change calls from Get1Resource() to GetResource() in CKrbPreferences::InitializeFromApplDefaults(), this should be safer if our resource chain has been reordered.

* Change to return true from CKrbPreferences::InitializeFromApplDefaults() when reading realms prefs resource fails, because we can deal with that error (if we return false app will fail).

* Remove some unused variables from CKrbPreferences::InitializeFromHardcodedDefaults().

* Chagne CKRbPreferences::WritePrefsToDisk() to write Misc prefs when either Misc or Realms prefs are dirty.  This solves some problems with loading the preferences when only the realms prefs have been edited.

* Remove Assert_ from CKrbPreferences::WritePrefsToDisk() catch block.  Since we're doing a CloseResFile() on a file we had problems opening, it's not too surprising the Assert_ fails too.

* Add new member, mLastActiveTime, to CPrincItem.

* Initialize mLastActiveTime to 0 in CPrincItem constructors.

* Set mLastActiveTime of active "item" in CKrbSession::GetCacheInfo().

* Add new function, CPrincList::FindLastActivePrincipal(), to find the most recently active principal in the Princ List.

* However, due to the fact that the principal list is destroyed and redrawn each time the cache is updated, the mLastActiveTime is pretty much useless because the info isn't stored across updates.  Fixing this would require a major restructuring of the PrincList.

* Add new function, CTicketMgrApp::GetPrincList(), to get a reference to the principal list.

* Initialize mCurrentPrincipal, mCurrentRealm to empty strings in CKrbSession::CKrbSession().

* New about box with simpler design and no picture.  Looks boring.

3/25/99:

* Add new function, CPrincList::GetAnotherPrincipal(), which gets the next principal in the princlist which is not the one passed in the "ignore" parameter.

* Rename CTicketMgrApp::GetPrincList() to CTicketMgrApp::GetPrincListRef().

* Add code to CKrbSession::DoLogout() that uses GetAnotherPrincipal() to set another user as the default if the current default user's tickets are destroyed.

* Changed version number to 1.0a6.

* Make default minimum lifetime in CKrbPreferences::InitializeFromHardcodedDefaults() 60 seconds (1 minute), not zero.

* Make the realmCount start off at 0 in CKrbPreferences::InitializeFromHardcodedDefaults() .

* Add a 'ktmP' to k5TicketManagerResources.rsrc file again.

4/5/99:

* Removed MSL C++ libs from KTM project, they weren't being used.

* Minor fix to CEditRealmsDialog::RemoveSingleRealm() so that a realm entry will still be selected if you remove the last (bottom) realm.

* Add three new constansts, kNoActiveUserUserString, kNoActiveUserRealmString, and kNoActiveUserTimeString, for the strings to be displayed when there is no active user.

* Modify CTicketMgrApp::UpdateActiveUserInfo() to check to see if there is an active user when displaying the time.  If there isn't, display kNoActiveUserTimeString, else, display "Expired."

* Change CKrbSession::SetActiveUserInfo() to recognize NULL as "no active user" - this way we won't have to pass in special strings from elsewhere in the application.  Add code to CKrbSession::SetActiveUserInfo() to copy the constant strings that indicate no active user into the right places.

* Change all calls to CKrbSession::SetActiveUserInfo() to pass in NULL instead of special no-user string.

4/6/99:

* Add code to CPrincList::DrawCell() to draw "expired" in red if the system supports color.

* Add code to CTicketMgrApp::UpdateActiveUserInfo() to draw "expired" in red.

* Up version to 1.0b7.

* Change lifetime sliders and CKrbSession member mLifetime to work in minutes, not seconds.  This required changes in CKrbPreferences, CKrbPrefsDialog, CUsrInfoDlg, the ppobs, and the preferences file.

* Change CTicketMgrApp::UpdateActiveUserInfo() to always round up to the next minute if there are any seconds outstanding.

* Change CPrincList::DrawCell() to always round up to the next minute if there are any seconds outstanding.

4/7/99:

* Add check for system version (must be more than 7.6.1) to CTicketMgrApp::Startup().

* Change former "No MITAthenaLib" ALRT ID #4500 to "generic fatal error" alert (which will take its text from ParamText()).  Use it for system check alert.

* Change MITAthenaLib check to use generic fatal alert too.

* Change GSSLib check to use generic fatal alert too.

4/14/99:

* Declare 1.0b7 release, but it's mostly broken and DOA.

4/16/99:

* Add "Ticket Keeper AEs.c" and "Ticket Keeper AEs.h" to the KTM project (all targets).  (These files live in Ticket Keeper in the release:appl folder.)

* Add code to CTicketMgrApp::StartUp() to send AppleEvents to launch Ticket Keeper, and put up a warning if it fails.  We're moving this functionality here from the CCache Library intializer.

* Add new ALRT resource ID #4600 for generic non-fatal errors.  Add line const for it to CTicketMgrApp.h.

4/20/99:

* Change creator code to 'KTM ' as per Miro, redo BNDL resource.

* Add new function, FindTicketKeeperInExtensions(), that looks for a copy of TK in the Extensions folder of the boot volume.  Returns the FSSpec if it finds it.

* Strip out code from CTicketMgrApp::StartUp() to send AppleEvents to launch Ticket Keeper.  Replace with code that checks to see if TK is running, if not calls FindTicketKeeperInExtensions(), and if it's found, launches it.  If it's not found, display error message.

4/21/99:

* Create new dialog, ppob 3100, to display "No Ticket Keeper - Live Dangerously or Quit" alert.

* Add code to CTicketMgrApp::Startup to call this dialog.

* Remove ICN family ID #200 from resources - our own local copy of the Warning icon.  We'll just use the system one (ID #1).

* Fix enabling code for Renew command in CTicketMgrApp::FindCommandStatus() so that it won't accept command-R before setup is done.

* Move FindTicketKeeperInExtensions() to Ticket Keeper AEs.c .

* Remove rounding up to next minute in CPrincList::DrawCell() (caused 10:01 to appear). Replace it with code to special case less than 1 minute as 1 minute.

* Remove rounding up to next minute code in CTicketMgrApp::UpdateActiveUserInfo() .  Add code to display "less than 1 minute" for appropriate time.  Also add code to display "x hours, 1 minute" (not minutes).

* Create new class, CLauchTKDialog, which will handle TK launching and notification that it didn't work.  Create CLauchTKDialog.h and CLauchTKDialog.cp.

* Move code that tried to launch TK to CLauchTKDialog.  Leave code that checks to see if TK is running or not in CTicketMgrApp::StartUp() for now.

* Add new procedure CTicketMgrApp::LaunchTicketKeeper().  Move code for checking/launching TK to it (no longer in CLaunchTKDialog.h).

4/22/99:

* More coding to CTicketMgrApp::LaunchTicketKeeper() .

* Added "MIT Kerberos.r" (from MITAthenaLib directory) to all targets.

* Updated vers 1 resource with new text.

* Version number up to 1.0b8.

* Rename CLaunchTKDialog to CStatusDialog (since really it has nothing inherently tying it to launching TK anymore, but it's not really a good status dialog class either.)

* Rename all binary outputs to "Kerberos Manager".

* Rename "K5" menu to "Kerberos" menu.

* Change "About K5 Ticket Manager..." menu item to "About Kerberos Manager..."

* Change name in about box.

* Change name in main window title.

* Redesign layout of main window ppob.

4/23/99:

* Change file type/creator code to 'KrbM'/'APPC' ("application control panel").

* Change version number to 1.0fc1.

* Add new function CTMMainWindow::HandleKeyPress() that traps return and enter key presses and treats them as clicks on the New Login button (now that it's indicated as a default button).

* Add functions CTMMainWindow::AttemptClose() and CTMMainWindow::DoClose() for handing close commands.  All they do is re-route to the cmd_Quit handler.

* Add handler for cmd_Close to CTicketMgrApp::ObeyCommand() for cmd_Close.  It reroutes to cmd_Quit.

* Add close box to TM Main Window.

* Add Close menu item to File menu.

* Go through and change all references to "Kerberos Ticket Manager" or "Ticket Manager" to "Kerberos Manager."

* Go through and change all references to Ticket Keeper to "MIT Ticket Keeper".

* Rename "Make Active User" button to "Make User Active".

* New icon design.

* Updated BNDL with new icon and 'APPC'.

* Release version 1.0fc1.

4/26/99:

* Swap positions of Edit Realms... and Preferences... menu item.

* Add new line to main Window saying what Kerberos Manager's purpose.

* Make sure all resources in Main Window ppob have ID numbers.

* Update resource ID listing in CTicketMgrApp.h to match revised main window ppob.

4/28/99:

* Remove PICT 129 resource (Frank's old about box PICT) because we're not using it anymore.

* Change version number to 1.0fc2.

* Add 'CCIª' and 'vend' resources for Conflict Catcher, although it's not recognizing the 'vend' resource.

* Change k5tmUtils.cp functions to static functions of a class KerberosManagerUtils.  (The files need to be renamed.)

4/29/99:

* Add 'hfdr' resource so Kerberos Manager displays a help balloon specific to it in the Finder.

4/30/99:

* Move "GSS-Lib" to bottom of System Paths in all targets.

* Remove "MIT Kerberos.r" from all targets.

* Creagte new file "KerberosManager.r" and add it to all targets.

* "KerberosManager.r" #includes "MIT Kerberos.r", and the 'CCIª' and 'hfdr' resource.

* Remove 'CCIª' and 'hfdr' from k5TicketManager.rsrc.

* Change Kerberos Manager icon, AGAIN.

* Changed version number to 1.0 final.

* Release 1.0 final.

* Move setting of mCntrlBlock to NULL to earlier in CKrbSession::CKrbSession() (before we exit out due to no krb5.ini).

* Add checks for NULL before deleting objects in CTicketMgrApp::CTicketMgrApp().

* Add check for mCntrlBlock being NULL before calling cc_shutdown() in CKrbSession::~CKrbSession().

* Re-release 1.0 final.

5/7/99:

* Rename rTKLauchDialog to rStatusDialog in CStatusDialog.h.  Rename rTKStatusText to rStatusText.  Change CTicketMgrApp, CStatusDialog accordingly.

* Add code to CKrbSession::GetTGT() that displays the status dialog while it's trying to get tickets.

* Move Ticket Keeper launch state enums from CStatusDialog.h to CTicketMgrApp.cp.

* Remove CStatusDialog members mTKLaunchState &	mTKLaunchSuccess, we weren't using them anymore.

* Change version number to 1.0.1.

* Release Kerberos Manager 1.0.1fc1.

5/25/99:

* New icon, yet again!

* Remove call to find menu item text in CKrbPrefsDialog::ListenToMessage() msg_DefaultRealmsPopupMenu handler, wasn't being used.

* Add some asserts to CTicketMgrApp::StartUp() checking to make sure our object creations don't fail.

* Add line to CTicketMgrApp::StartUp() that explicitly sets CTicketMgrApp as CKrbSession's super commander.  Apparently this happened by default most of the time, but not all of the time (like when KM had to launch TK, for some reason), but now we're guaranteed.

* Released Kerberos Manager 1.0.1.

6/9/99:

* Update PPC targets to work with new CVS tree organization.

* Remove bogus access paths from 68K targets (they were made bogus due to CVS reorg); this means 68K targets won't build.  But then, they didn't anyway.

* Change all targets to build an APPL not an APPC.

* Add 'rout' resource to KerberosManager.r.

* Change BNDL and FREF back to 'APPL'.

* Up version number to 1.0.2.

6/14/99:

* Set up PPC targets to use Miro's "Set File" Post-Linker to set the magic Finder routing bit.

* Add "Build Notes", Tools directory, and "SetFile" Post-Linker to project.

6/24/99:

* Set to use revised "Finder Flags" Post-Linker instead of "Set File", which didn't work correctly.

* In CKrbSession::GetTGT(), fix a few bogus references to a non-existent variable (which was getting parsed out by the macro using it, but still...)

* In CKrbSession::GetActiveUserInfo(), add call to SetInitialActiveUser() when the cache has changed.  This will catch the cases when some other application has changed the default user, but KM didn't notice.

* Rename CKrbSession::SetInitialActiveUser() to CKrbSession::SetActiveUserFromCache(), since we now use it at times other than initially.

* Fix bug in CKrbSession::GetCacheInfo() where a cache wasn't closed if it wasn't a V5 cache.

* Fix bug where CKrbSession::SetActiveUserFromCache() wasn't freeing a principal it allocated.  Oops.

* Change version number to 1.0.2b1 since it's unclear I've caught all the bugs, but probably want to make this version available.

* Release version 1.0.2b1.

7/20/99:

* Bring 68K targets up to date (fix access paths and library refs) so that 68K versions compile and link again.

* Fix resource ordering in Error Dialog ppob so that error text isn't hidden by the white background of the GroupBox on non-Appearance systems.

* Fix minor ppob error with New Login button in main window ("Button Kind" was set to an illegal value).

* Add some initializations of err's to noErrs in CKrbPreferences.cp, CKrbSession.cp .

7/22/99:

* Fix bug in CKrbSession::SetActiveUserFromCache() that didn't set the remaining time to 0 when setting the active user to NULL.

* Bump version number to 1.0.2b2 .

7/23/99:

* Add targets to build FAT versions of the app.

* Released version 1.0.2b2.

8/3/99:

* Fix case where CTicketMgrApp:LaunchTicketKeeper(), in kWaitingForTKReply case, would not check an error value for failure, which resulted in KM sometimes not noticing that TK hadn't been launched. (in 1.0.2 and 1.1).

* Add calls to free creds structure with krb5_free_cred_contents() in CKrbSession::GetTGT() (and thus the krb5_principals client and server too).  (to 1.0.2).

* Add call to free creds structure with krb5_free_cred_contents(0 in CkrbSession::ChangePassword(). (to 1.0.2 amd 1.1)

* Up version 1.0.2 version number to 1.0.2b3.

8/4/99:

* Add new "Kerberos Manager Suite" to the 'aete' resource in k5TicketManagerResources.rsrc.  Add "newlogin" ('NLgn') AE event to this suite.

* Add mapping to 'aedt' resource in k5TicketManagerResources.rsrc for "newlogin" event.

* Add new constant, ae_NewLogin = 10000, to CTicketMgrApp.h, for identifying the new AppleEvent.

* Add new override function, CTicketMgrApp::HandleAppleEvent().  Add code to deal with "newlogin" event.

8/5/99:

* In CKrbSession::ChangePassword(), replace assert for prinicipal not found in cache with an actual error message that dismisses the Change Principal dialog.  (Before there was really no way you should have gotten into the situation where the principal disappeared, but the login AE makes it possible.)

* Session menu had "Destroy Tickets..." menu item.  Removed the ellipses, since they were incorrect (no dialog is brought up).

* Add code to CKrbSession::DoLoginDialog() that looks to see if one login dialog exists before creating another one (an attempt to create two could be made by using the newlogin AE).  If one does exist, bring it to the front instead of creating a new one.

8/6/99:

* Change CUsrInfoDlg.c so that it won't activate the "Login" button until both the username and password fields have been filled out (previously we allowed a null password but it turns out that null passwords are illegal under krb5).

* Add value messages to edit fields in Change Password Dialog ppob.

* Add constants for value messages to CChangePasswordDialog.h.

* Add function CChangePasswordDialog::SetButtonStatus() which enables the OK button only if all three password fields are filled out (previously we allowed null passwords but it turns out they're illegal in Krb5).

* Add calls to CChangePasswordDialog::SetButtonStatus when one of the messages for the edit fields is received.

* Fix some more memory leaks in CKrbSession::CChangePassword() (result_code_string, result_string).

* Released version 1.02b3 (???).

8/10/99:

* Add some calls to free kCache and passCreds when errors occur in CKrbSession::ChangePassword().

* Add checks to see if kCache is nil before closing/destroying it in CKrbSession::GetTGT().

8/18/99:

* Add new function, CTicketMgrApp::Initialize().  Move all code from CTicketMgrApp::StartUp() to it.  Initialize is called just before any events are processed; Startup is called when the application receives an "open" AppleEvent.  So this solves two problems: (1) problems where events would happen before StartUp would be called, causing things to crash because KM wasn't fully initialized. (2) KM could be launched with a "login" AppleEvent, not an open one, so the StartUp() code would never be called, causing KM to spin uselessly.  Really we should have been using Initialize() all along.

8/20/99:

* Dicker with CTicketMgrApp::LaunchTicketKeeper() to provide better updating of dialog initially (still not quite right when called from Initialize() though).

* Add function CTicketMgrApp::Run() as override for LApplication::Run() to fix problem where it assumed initialization couldn't fail, making app difficult to quit cleanly.  See code comments.

* Renamed many files to make sense and to correspond to name change from "K5Ticket Manager" to "Kerberos Manager".  Changes were:

OLD                             NEW
===                             ===
k5TicketManager.prj             KerberosManager.prj
CTicketMgrApp.cp                CKerberosManagerApp.cp
CTMMainWindow.cp                CKMMainWindow.cp
CUsrInfoDlg.cp                  CLoginDialog.cp
k5tmUtils.c                     KerberosManagerUtils.cp
CTicketMgrApp.h                 CKerberosManagerApp.h
CTMMainWindow.h                 CKMMainWindow.h
CUsrInfoDlg.h                   CLoginDialog.h
k5tmUtils.h                     KerberosManagerUtils.h
k5tm&ccache Buglist-ToDo        KM Buglist-ToDo
k5tm&ccache ChangeLog           KM Changelog
Ticket Manager Release Notes    Kerberos Manager Release Notes
k5TicketManagerResources.ppob   KerberosManager.ppob
k5TicketManagerResources.rsr    KerberosManager.rsrc

* Go through code and change class names and #includes to match file name changes.

* Release version 1.0.2b4 (??).

8/30/99:

* Change 68K targets so that they build in just :KerberosManager:Binaries, not :KerberosManager:Binaries:68K .

* Move KerberosPreferences.h from :MITKerberos:Common to :KerberosManager:Includes to make building source distribution easier.

* Remove #include of MITKerberos.r from KerberosManager.r - the MPW scripts that build everything will take care of this from now on.

* Remove access path to :MITKerberos:Common in all targets (we no longer need it).

* Converted all targets to use MoreFilesLib (removed MoreFiles source).

9/1/99:

* Converted all targets to use new TicketKeeperLib (shared library version).

9/2/99:

* Increased version number to 1.0.2b5.

* Released 1.0.2b5.

* Fixed calls to IsTicketKeeperRunning() in CKerberosManagerApp.c to reflect new parameter in that call.

9/8/99:

* Updated "can't find MIT Support or MIT Kerberos Lib" messages.

* Updated version number to 1.0.2fc1.

9/9/99:

* Changed version check in CKerberosManagerApp::Initialize() to only allow 8.1 on 68K machines, and 7.6.1 on PPC.

9/10/99:

* Removed ThirdParty:MoreFiles: access paths from 68K targets (already did that for PPC targets when I converted to MoreFilesLib).

9/14/99:

* Wasn't weak-linking against a lot of libraries.  Fixed in all targets.

* Changed version number to 1.0.2.

* Declared 1.0.2 final.

9/15/99:

* Transformed "Kerberos Manager Release Notes" into "Version History" which matches what we're doing with the rest of the tree (it wasn't much of a release notes anymore anyway).

10/22/99:

* Fix bug in CKrbSession::ChangePassword() where error returned from krb5_change_password() is not reported (because error code was overwritten by another kerberos call).

* Add check in CKMMainWindow::ClickInDrag() to make sure the window was really moved (not just clicked on) before saving new window position.

* Up version number to 1.0.3.

* Declare 1.0.3 final.

1/21/00:

* Start converting to use CCache API v3.  Convert function CKrbSession::CKrbSession() .

1/24/00:

* Convert CKrbSession::SetActiveUserFromCache(), CKrbSession::~CKrbSession() to CCache v3.

* Rename "mCntrlBlock" memeber of CKrbSession to "mCCContext".

1/25/00:

* Change version number to 1.1a1 .

* Add macdev@mit.edu address to about box.

* Update CKrbSession::FindPrincipalInCache() to CCache API v3.

* Change CKrbSession::FindPrincipalInCache() to return a cc_string_t instead of char **.

* Don't include defunct "Kerberos5Globals.h" in CKrbSession.h.

* Partially convert CKrbSession::GetTGT() to CCache API v3.

1/26/00:

* Remove large chunk of code in CKrbSession::GetTGT() that read name and principal of default cache, and then threw them away again.  No info from this was used in the rest of the function...

* Redo setting of cache that krb5 will put new tickets into in CKrbSession::GetTGT().  Removed Krb5Globals calls, use ccache/krb5 lib ones.  Also now always create a new cache instead of trying to reuse existing one if we're renewing - and well copy stuff from new one into existing one if successful.

* Finished updated CKrbSession::GetTGT() to CCache API v3.

* Change CKrbSession::SetActiveUserInfo to take const char * instead of char *.

* Converted CKrbSession::DoLogut() to CCache API v3.

* Removed all the stuff that found another user to make default in CKrbSession::DoLogout(), the CCache v3 takes care of that for us.

* Start work on converting CKrbSession::GetCacheInfo() to CCache API v3.

1/28/00:

* Finish converting CKrbSession::GetCacheInfo() to CCache API v3.

* Rename a bunch of variables in CKrbSession::GetCacheInfo().

* Convert CKrbSession::SpendTime() to CCAche API v3.

* Remove all references to Krb5GetDefaultChangeTime() from CKrbSession::SpendTime() because that went away, and is now encompased by the CCache change time.

* Convert CKrbSession::SetActiveUserAsDefault() to CCache API v3.

* Rename a bunch of variables in CKrbSession::SetActiveUserAsDefault().

1/31/00:

* Convert CKrbSession::ChangePassword() to CCache API v3 (and no Krb5GlobalsLib).

* Remove Krb5GlobalsLib binaries from project.

* Removed Krb5GlobalsLib path from all targets.

* Change CKrbSession::CompareKerberosPrincipals() to take const char * instead of char *.

2/1/00:

* Disabled launching of Ticket Keeper in CKerberosManagerApp::Initialize(), put in a #warning to remind me.

* Added code from Miro to CKerberosManagerApp::Initialize() not to do the Ticket Keeper check on launch when option-command held down.  Doesn't seem to work for me, though...

* Add code to CKrbSession::GetTGT() to use the defaultCache to put new tickets in *if* there are no other tickets in the cache already.  (Previously we were ignoring the already determined name for the default cache and just creating a new cache and making it the default; this might have confused other applications.)

2/2/00:

* Removed bogus c2pstr() on an LStr255 in CKrbSession::GetCacheInfo().

* Remove mLastActiveTime member from CPrincItem.h and code that initialized it in CPrincItem.c - this was an aborted attempt to remember the "last" default principal and has been superceeded by CCache API v3's handing of default users.

* Remove call that tried to read a CPrincItem's mLastActiveTime in CKrbSession::GetCacheInfo().

* Remove FindLastActivePrincipal() function from CPrincList, which operated on the now defunct mLastActiveTime in CPrincItem.

* Add a cc_ccache_release(newCache) to the end of the non-renew case in CKrbSession::GetTGT() - we were leaking.

2/3/00:

* Add calls to free newCacheName in CKrbSession::GetTGT(), which we were leaking.

* Remove Miro's disable Ticket Keeper launch when option-command keys held down on KM launch.  Didn't work.

* Add call to free tempPrincName in CKrbSession::FindPrincipalInCache(), which we were leaking.

2/4/00:

* Add call to free renewCache in the renew case of CKrbSession::GetTGT(), we were leaking.

* Add call to free newCache when an error occurs during an attempted login (such as bad password) in CKrbSession::GetTGT(), we were leaking.

* Made the "Alert Dialog" ppob (ID #4000) bigger to fit longer error text.

2/7/00:

* Add period to the end of the error string in CKrbSession::KrbErrorString() (as far as I can tell they never come back from com_err with periods).

* Set mCacheDirty to true at the end of a failed login in CKrbSesssion::GetTGT(), this should clean up a dangling entry that sometimes appeared in the Principal List.

2/8/00:

* Simplify CKrbSession::GetCacheInfo() so that it only makes one iteration through the ccache colleciton.  Now the active user is displayed in place in the Principal List, not always at the top (although they're still always called out in the "active user" box).  This should reduce the amount of redrawing the list has to do.

* Remove 68K and Fat targets from project.

* Rename output name of PPC targets (don't append ".PPC" anymore).

* Update Version History.

2/9/00:

* Modify CKrbSession::GetCacheInfo() to display V4 information in the cache.  Currently it will always display the V5 principal and use the V5 TGT expiration time unless there is only V4 stuff is in the cache.  V4 tickets are displayed mixed in with the V5 tickets at the moment.

* Remove 68K OS version check from CKerberosManagerApp::Initialize().

* Move dprintf() in CKerberosManagerApp::Intialize() to be after the check for the C Library - because otherwise it will crash if it's not present!

* Re-added check to skip startup checks during launch when option-command keys held down contributed by Miro.

* Added code to CKrbSession::SetActiveUserFromCache() to deal with v4 principals.

2/10/00:

* Change version number to 1.1d1, update copyright date in version string.

* Update copyright date in about box to include 2000.

* Put a lot of checks for nil throughout all of CKrbSession().

* Rewrite CKrbSession::FindPrincipalInCache() to deal with v4 principals.  Make first use of KrbWrappersLib in KM.

* Change CKrbSession::GetCacheInfo() so that it doesn't append "(V4)" to the end of V4-only principals.  This makes our life simpler for now.

* Add #include "UPrincipal.h" to CKrbSession.cp.

* Add access path and binaries for KrbWrappersLib to both targets in KM.

* Change CKrbSession::DoLogout() so that it only tries to delete when it finds a cache.  (duh! - but since we're passing in one listed in the ticket list it should exist unless the cache has gone south)

* Remove function CKrbSession::CompareKerberosPrincipals(), its functionality has been superceded by WrappersLib.

* Rewrote parts of CKrbSession::SetPrincipalAsDefault() to deal with v4-only principals.

2/11/00:

* Removed private copy of KerberosPreferences.h because it's moving to MITKerberos:MITKerberosLib:Common: - it was in KM temporarily until we could figure out where it should live permanently.

* Added access path to MITKerberos:MITKerberosLib:Common:Headers: to both targets so KM can find the new location of KrbPreferences.h .

* Added Debug menu ppob.

* Added constants for Debug menu ID and commands to CKerberosManagerApp.h.

* Add code to CKerberosManagerApp::Initialize() to add Debug menu to the menu bar if we're in debug target.

* Add code to CKerberosManagerApp::FindCommandStatus() to enable Debug menu commands.

* Add code to CKerberosManagerApp::ObeyCommand() to handle Debug menu commands.

* Add new function SetCacheDirty() to CKrbSession so that it's easy to force a cache update.

* Add #include "ShlibDriver.h" to CKerberosManager.cp, need it to support the KClient driver loading/unloading code.

* Add access path and binaries for ShlibDriverLib (aka HighlanderLib) to both targets.

* Commented out always-skip-Ticket Keeper launch code in CKerberosManagerApp.cp.

* Declared version 1.1d1 done and released 1.1d1 as part of KfM 3.0d1.

2/14/00:

* Re-added check to make see if TK is already running before we try to launch it in CKerberosManagerApp::Initialize() (it must have been accidentally deleted when we added the check for command-option being held down).

2/15/00:

* Added binaries and access paths to the "old" Login Library to both targets.

* Add "Login Library Login" menu option to Debug menu ppob.

* Add constant for "Login Library Login" to CKerberosManagerApp.h.

* Add support for "Login Library Login" to CKerberosManagerApp::FindCommandStatus(), CKerberosManagerApp::ObeyCommandStatus().

* Diddle with Main Window ppob to make it resizable, have a minimum size, and make some of the items bound to its boundaries so they get bigger when it resizes.

* Rename many of the resource constants for the main window in CKerberosManagerApp.h, some were incorrect, others were just not very descriptive.

* Change ID of 3 title label line in KM Main Window - it had the same ID as another Label.

* Add new override method CKMMainWindow::DoSetBounds() to reposition Main Window elements when window is resized.

2/16/00:

* Add new override method CPrincList::ResizeFrameBy() to force the column width to update when the table is resized (PowerPlant doesn't do this automatically, for some reason).

* Change version number to 1.1d2.

2/17/00:

* Rewrite CKrbPreferences::InitializeMiscPrefsFromHandle() and CKrbPreferences::WritePrefsToDisk() to use LHandleStream class for creating/reading the prefs handle.  This will make it easier to deal with multiple prefs versions (which I am about to introduce).

2/18/00:

* Swap position of "Load KClient Driver" and "Unload KClient Driver" in Debug menu so that they match the ordering of "Lauch/Kill Ticket Keeper."

* Deleted 'TMPL' resource for 'ktmP' resource from KerberosManager.rsrc because it no longer matched the prefs format.

* Rename "autoPositionMainWindow" and "mainWindowPosition" members of TicketManagerPrefs structure to "defaultPositionAndSizeMainWindow" and "mainWindowRect" in CKrbPreferences.h.  Change latter from Point to Rect.

* Rename functions CKrbPreferences::GetMainWindowPosition() to GetMainWindowRect, and CKrbPreferences::SetMainWindowSize() to SetMainWindowRect() and change Point paramter to a Rect.  Also change innards to deal with Rects.

* Rename msg_PrefsMainWindowSizeChanged to msg_PrefsMainWindowRectChanged in CKrbPreferences.h .

* Remove Assert that checked for right prefs size in CKrbPreferences::InitializeMiscPrefsFromHandle(), it doesn't work right with new LHandleStream based prefs - will have to think of better check.

* Change code in CKMMainWindow::ClickInDrag() to use modified Main Window prefs calls.

* Change code in CKerberosManagerApp::CreateMainWindow() to use modified Main Window prefs calls.

2/22/00:

* Add code to CKMMainWindow::DoSetBounds() to set window size in prefs.

* Add code in CKrbPreferences::InitializeFromPrefsFile() to skip displaying assert in case of resNotFound.  This turns out to be more difficult than expected...

* Updated copyright text in main window and removed v5 from "A utility for managing v5 tickets".

2/23/00:

* Don't display assert in CKerberosManagerApp::ObeyCommand() when Login Library Login returns userCanceledErr.

* Now display fatal error and set quit flag in CKrbPreferences::InitializeFromPrefsFile() if there is a problem finding the preferences file.  This used to be okay, but in KfM 3.0 the prefs file contains the .ini info, and KfM can't really continue without that.

* Don't create new prefs file in CKrbPreferences::WritePrefsToDisk() if prefs file can't be found.  This is because in KfM 3.0 the prefs file contains the .ini info, and we can't recreate that, so we shouldn't create a bastard file.

* Update the prefs resource stored in KerberosManager.rsrc to version 2 of prefs.

* Change Login Library code in CKerberosManagerApp::ObeyCommand() to work with v2 of Login Library (simply call AcquireNewTickets() now).

* Change Debug menu item item to be "Login Library AcquireNewTickets" to make clear which Login call it makes.

* CKrbSession() - update some error messages.

2/24/00:

* Declare 1.1d2 for KfM 3.0d2 release.

* Rename CPrincItem members: "type" to "mPrincItemType" and "itemString" to "nIrincItemString", "expTime" to "mExpTime".

* Add CPrincItem members "mCredentialsVersion" and "mForwardable".

* Change kPrincType, KCredType, kActPrincType constants to enum in CPrincItem.

* Add "cc_credentials_no_version" = 0 to CPrincItem.h (the ccache doesn't have this type, but we might want it for the princ list).

* Update CPrincItem.cp and CPrincList.cp for renamed/new members.

* Change CPrincList::DrawCell() to display the princ/ticket's item version before the item string based on the credentials version.  Remove code from CKrbSession::GetCacheInfo() that used to do this.

* Add "kSubPrincType" to the type of princ items in CPrinItem.h, we'll use this for the v4/v5 forms of the principal.

* Increase kCredHOffset value in CPrincList.h (this is the amount a credentials entry in the list gets indented).

* Add new kSubPrincHOffset value in CPrincList.h (this is the amount a sub-principal will get indented).

* Add code to CPrincList::DrawCell() to draw sub-principals properly.

* Add code to CKrbSession::GetCacheInfo() to create a sample sub-principal.

2/25/00:

* Add access paths for Kerberos4Lib, DESLib, UtilitiesLib, SocketsLib, ErrorLib to both targets (UCCache.h from WrappersLib needs them).

* Move WrappersLib to be a system access path, not a user path.

* Start rewriting CKrbSession::GetCacheInfo() to use WrappersLib.

3/7/00:

* More rewriting CKrbSession::GetCacheInfo() to use WrappersLib.

* Add new constructor to CPrincItem that takes a C String as a parameter for the string.

* Add MIT C++ libraries to both targets.

3/8/00:

* Change cmd_LoginLibraryLogin handler in CKerberosManagerApp::ObeyCommand() to not pass in an outPrincipal to KLAcquireNewTickets().  This will fix the leak from before where we passed one in, never looked at it, and didn't delete it.

* Fix bug in CKrbSession::GetCacheInfo() where only one ticket per Kerb version was being displayed (move the adding the items to the array inside the credIterator loop!).

* Change CPrincList::DrawCell() to not put version in front of credential items, now that they are displayed sorted by type with headers.

* Update version number to 1.1d3.

3/9/00:

* Added real check for whether ticket is forwardable or not in CKrbSession::GetCacheInfo() and pass this info along when creating CPrincItem.

* Added code to CPrincList::DrawCell() to display whether a ticket is forwardable or not (by putting a "(F)" after it).

* Removed member mAuthenticatedUsers and function GetNumAuthenicatedUsers() from CKrbSession - they weren't being used (and in fact mAuthenticatedUsers would have been wrong if it was used).

* Changed CPrincList::GetSelectedPrincipal() to return version of the principal (if parameter passed in isn't nil).

* Update calls to GetSelectedPrincipal() in CKerberosManagerApp.cp.

* Rewrite CKrbSession::DoLogin() to call the login library, instead of calling GetTGT().

* Change CKrbSession::DoRenew() to take a princVersion parameter.

* Rewrite CKrbSession::DoRenew() to call the login library, instead of calling DoLoginDialog() and GetTGT().

* Declare 1.1d3 done.

3/10/00:

* Change CKrbSession::GetCacheInfo() so that it only creates sub-princiapls for mixed-version ccaches.

* Add code to CPrincList::DrawCell() to draw background of main principal cells in light grey for easier reading.

* Add overrides for LTableView functions HiliteSelection(), HiliteCellActively(), and HiliteCellInactively() to CPrincList so that table cells highlight on non-white backgrounds.

3/14/00:

* Modify CPrincList::DrawCell() so that it passes the correct color (background or grey) to CDropFlagMod::TrackClick() so the drop flag will redraw its background with the correct color.

* Change CKrbSession::ChangePassword() to take a Str255 princString and cc_int32 princVersion instead of a ChangePasswordDialog (we'll be using Login Library from now on, not rolling our own).

* Change innards of CKrbSession::ChangePassword() to just call Login Library ChangePassword call.

* Change how CKerberosManagerApp::ObeyCommand() calls change password code (doesn't have to create a change password dialog anymore).

* Remove handlers for cmd_LoginOK, cmd_LoginCancel, cmd_ChangePass_OK and cmd_ChangePass_Cancel from CKrbSession::ObeyCommand() because we aren't using the dialogs that generates those messages anymore.

* Remove functions CKrbSession::GetTGT(), CKrbSession::DoLoginDialog() - they have been superceded by Login Library.

* Don't register CLoginDialog or CChangePasswordDialog in CKerberosManagerApp::RegisterTMClasses() .

3/15/00:

* Remove "Login Library KLAcquireNewTickets" menu item from Debug menu ppob.  We don't need it anymore since "New Login" now handles that.

* Remove cmd_LoginLibraryLogin constant from CKerberosManagerApp.h (don't need it anymore).

* Remove cmd_LoginLibraryLogin handlers from CKerberosManagerApp::ObeyCommand() and CKerberosManagerApp::FindCommandStatus().

* Removed unused PICT of old KM icon from Kerberos Manager.rsrc.

* Upped vers resource to 1.1d4.

3/17/00:

* When parsing a krb4 ticket in CKrbSession::GetCacheInfo(), switch to using WrappersLib to get the name in a string, instead of building our own string.  (This solves the "use kname_parse" issue).

* Add binaries for UtilitiesLib to both targets of the project.

* Replaced all calls to krb5_us_timeofday() in CKrbSession with gettimeofday().  This avoids the problem of making a krb5 call on systems that may not support it; however there are some special offsets the krb5 call takes into account that we should make sure we don't care knowing about.

* Add binaries for Kerberos4Lib to both targets of project.

* Make sure all libraries are imported weak (many of the recently added ones weren't).

* Change CKrbSession::CKrbSession() to try to read a default krb4 realm if reading the krb5 default realm fails, in hopes of making this code work on krb4-only systems.

3/22/00:

* Remove member mLastDefaultCacheChange from CKrbSession (it wasn't being used anymore).

* Convert CKrbSession::SetActiveUserFromCache() to use WrappersLib.

* Remove (static) MSL RuntimeLib from both projects.  Add MIT RuntimeLib and MSL AppRuntime.Lib to both targets.  Supposedly this will solve problems with exceptions not being caught, but it causes more.

3/23/00:

* Change PPC Linker Entry Points to __initialize, __start, and __terminate; this solves the problem of exceptions not working (it's long and complicated).

3/24/00:

* In CKrbSession, changed all checks for userCanceledErr from Login Library calls to klUserCanceledErr.

* Declared 1.1d4 done.

3/27/00:

* Changed CKrbSession::FindPrincipalInCache() to return a char ** instead of a cc_string_t *.

* Rewrote CKrbSession::FindPrincipalInCache() to use WrappersLib.

3/28/00:

* Changed PPC Linker Entry Point for main back to main (not __start).  Calling __start caused weird double-disposals of shared libraries.

* Rewrote CKrbSession::SetPrincipalAsDefault() to use WrappersLib.

* Clean up CKrbSession::SetActiveUserFromCache() to be more compact.

* Change CKrbSession::CKrbSession() to use new krb5_free_default_realm() call.

* Change CKrbSession::FindPrincipalInCache() to return a std::string instead of a char** (boy this function has returned every type of string known to man).

* Remove function CKrbSession::KrbErrorString(), it was no longer needed know that we're using LoginLib.

3/29/00:

* Fix leaks in CPrincList::UpdateListFromCache() - delete vArr, and delete the CPrincItems pointed to by items in the array.

* Fix leak in CKerberosManagerApp::UpdateUsersMenu() where princNameArray wasn't getting released.

* Add new function CPrincList::GetPrincipalCount().

* In CKerberosManagerApp::FindCommandStatus() cmd_ActiveUser handler, replace call to mKPrincList->GetAllPrincipals() with mKPrincList->GetPrincipalsCount().  (The previous call was allocating an array that was never freed - whoops!.)

* Remove unused (bul allocated and unfreed) DResp variable in CStatusDialog::ListenToMessage().

* Change LGrowZone in CKerberosManagerApp main() to be a stack-based variable instead of allocating it with new (this stops one memory leak).

* Add call to CKrbSession destructor to StopIdling to remove it from the idler queue (which gets reported as a leak).  (And still does even after I do this.  Oh well.)

* Change CPrincList::DrawCell() to use gettimeofday() instead of CKrbSession::GetKrbTime() .

* Removed CKrbSession::GetKrbTime() since it wasn't used anymore.

* Up version number to 1.1d5.

* Add PICT Resource ID 200 with cool Kerberos Manager title tag.

* Change About Box ppob to display PICT ID 200, have black background, and display text items in light orange.  (Add several text trait resources for the orange text).

4/3/00:

* Remove CKrbPreferences::SetRealmsListFromTable() - functionality has been moved to CEditRealmsDialog::CopyRealmsDialogToPrefs() and Login Library.

* Rewrite CEditRealmsDialog::CopyRealmsDialogToPrefs() to set the realms in the Login Library directly instead of calling CKrbPreferences.

* Rewrite CEditRealmsDialog::CopyPrefsToRealmsDialog() to read the realms from Login Library instead of KM prefs.

* Delete unused function CEditRealmsDialog::RemoveAllRealms().

* Delete constants msg_EditRealmsRemoveAllButton, rEditRealmsRemoveAllButton from CEditRealmsDialog.

* Remove code to activate/inactive Remove All Realms button from CEditRealmsDialog::SetButtonStatus(), since that button no longer exists.

* Remove functions SetRealmByIndex(), RemoveRealmByIndex(), RemoveRealmByName(), AddRealmByName(), GetRealmByName(), GetRealmCount() from CEditRealmsDialog.cp becuase they've been superceded by Login Library.

* Remove CLoginDialog.cp, CChangePasswordDialog.cp from both targets of projects (they're not being used).

* Replace all references to CKrbPreferences::GetRealmCount() with Login Library KLCountKerberosRealms().

* Rewrite CKrbPrefsDialog::CopyRealmsListToPopupMenu() to call into Login Library to get list of realms and default realm.

4/5/00:

* Change CKrbPRefsDialog::CopySettingsToPrefs() to set default realm in Login Library.

* Edit CKrbPrefsDialog::ListenToMessage() msg_DefaultRealmsPopupMenu handler to always update the popup after edit realms has been called (it will happen even if the user hits Cancel, but this doesn't hurt anything).  This used to be handled by a message being sent by the preferences object, but the prefs don't handle the realms anymore.

* Edit CKrbPrefsDialog::ListenToMessage() to remove msg_PrefsRealmsListChanged because the prefs don't send this anymore.

* Add command-Y to Preferences command (got tired of choosing the menu all the time while testing).

4/6/00:

* CEditRealmsDialog::CopyRealmsDialogToPrefs() will now save and reset the default realm (calling KLRemoveAllKerberosRealms unsets it, so we must reset it).

* Removed functions SetDefaultRealmByIndex(), GetDefaultRealmByIndex(), SetDefaultRealmByName(), GetDefaultRealmByName(), GetRealmByIndex(), AddRealmByNameUnique() from CEditRealmsDialog.cp because they've been superceded by Login Library.

* Remove code from CKrbSession::CKrbSession() that sets a user default realm if necessary (the Login Library is taking care of this now).

* Temporarily disable code in CKrbSession::CKrbSession() that puts krb default realm into Favorites Realm List, pending change to Login Lib API.

4/7/00:

* Reenabled check for lauching Ticket Keeper in CKerberosManagerApp::Initialize().

* Declared 1.1d5 final.

* Remove mRelamsPrefsDirty, mRealmsListArray members of CKrbPreferences and references to them, since now we're using the Login Library for array code.

* Remove code in CKrbPreferences destructor that deleted realms array, since we are removing realms array.

* Remove code in CKrbPReferences::InitKrbPrefrences() that created realms array and set a comparator for it.

* Remove code in CKrbPreferences::InitializeFromPrefsFile() that read realms preferences, and clean up code to return success result at end.

* Remove code from CKrbPreferences::InitializeFromApplDefaults() that read realms preferences (and note that the way it was written it would have never read them anyway).

* Delete functions CKrbPreferences::InitializeRealmsPrefsFromHandle(), CKrbPreferences::FlattenRealmsPrefs() no longer used.

* Remove code from CKrbPreferences::WritePrefsToDisk() that wrote out realms preferences.

* Delete constants kTMRealmsPrefsResType, kCurrentTMRealmsPrefsVersion, kCurrentTMRealmsPrefsVersion and enum kTMRealmsPrefsVersion1 from CKrbPreferences - we're not using them anymore.

* Bump version number up to 1.1d6.  Remove extra 'ktmP' resource.

* Remove file CStr255Comparator.cp from both project targets (was used by realms prefs stuff).

* Replace code that reads default forwardable ticket setting in CKrbPrefsDialog::CopySettingsToPrefs() and CKrbPrefsDialog::CopyPrefsToSettings() to use Login Library instead of KM prefs.

4/11/00:

* Replace code that reads save username setting in CKrbPrefsDialog::CopySettingsToPrefs() and CKrbPrefsDialog::CopyPrefsToSettings() to use Login Library instead of KM prefs.

* Moved lifetime slider time indicator in the prefs dialog ppob to be next to the label to match Login Library dialog more closely.

* Add proxiable tickets by default checkbox to Prefs dialog ppob.

* Add rDefaultProxiableCheckbox to CKrbPrefsDialog.h .

4/13/00:

* Redesign preferences dialog ppob.

* Add new constants for new prefs dialog items to CKrbPrefsDialog.cp.

* Add headers and RegisterClass stuff for LPopupGroupBox, LRadioButton, LRadioGroup to CKerberosManagerApp.cp.

* Remove all the registering and including of GrayScale equivalents of Appearance classes in CKerberosManagerApp.cp.  We're going to be requiring Appearance 1.0.1 or higher.

* Replace code that reads save username setting in CKrbPrefsDialog::CopySettingsToPrefs() and CKrbPrefsDialog::CopyPrefsToSettings() to modify new popup group box instead of checkbox.

* Add new function CKrbPrefsDialog::SetControlStatus() to enable/disable controls depending on pop-up menu state.

* Add msg_RememberPrincipalPopupBox and msg_RememberOptionsPopupBox handlers to CKrbPrefsDialog::ListenToMessage().

* Call CKrbPrefsDialog::SetControlStatus() from CKrbPrefsDialog::FinishCreateSelf().

* Add code to read/write "remember extras", "default proxiable" Login Library setting in CKrbPrefsDialog::CopySettingsToPrefs() and CKrbPrefsDialog::CopyPrefsToSettings() .

4/14/00:

* Change code to read max, min, and default ticket lifetime values in CKrbPrefsDialog::CopyPrefsToSettings() to use Login Library instead of KM prefs.

* Change code to set default ticket lifetime value in CKrbPrefsDialog::CopySettingsToPrefs() to use Login Library instead of KM.

* Remove CKrbPreferences functions that have been superceded by Login Library:

GetMinimumTicketLifetime()
GetMaximumTicketLifetime()
GetDefaultTicketLifetime()
SetMinimumTicketLifetime()
SetMaximumTicketLifetime()
SetDefaultTicketLifetime()
SetDefaultForwardable()
GetDefaultForwardable()
SetRememberUsername()
GetRememberUsername()
SetDefaultUsername()
GetDefaultUsername()
SetAdvancedOptionsDisplay()
GetAdvancedOptionsDisplay()
SetLoginWindowPosition()
GetLoginWindowPosition()

* Remove lots of messages that were used to announce that pref changes from CKrbPreferences.h.

* Change prefs dialog to use LRadioGroupView instead of LRadioGroup.  This makes figuring out which button is selected easier.

* Add code to CKrbPrefsDialog::SetControlStatus() to always disable default username UI because support not implemented yet.

* Remove all GA implementation of Apperance controls from project (we aren't going to support non-Appearance systems anymore).

* Declared and released 1.1d6 final.

4/25/00:

* Add rounding correction to code that reads ticket lifetime slider value in CKrbPreferencesDialog::CopySettingsToPreferences() so that we don't request ticket values with seconds.

* Updated vers resource to 1.1d7.

4/27/00:

* Added KrbProfileLib to both targets of project (so we can use it to read realms).

* Added code to CEditRealmsDialog::FillAllRealmsTable() to add v4-only realms to the full realm list.

* Rewrote v4 realm code in CEditRealmsDialog::FillAllRealmsTable() to use WrappersLib instead.

4/28/00:

* Added group box around Forwardable and Proxiable checkboxes in Prefs dialog to indicate they're v5-only.

* Rewrote v5 realm-reading code in CEditRealmsDialog::FillAllRealmsTable() to use WrappersLib instead of krb5_realm iterators.

* Updated OS check to require Mac OS 8.1 or greater in CKerberosManagerApp::Initialize().

* Add check to ignore v1 prefs in CKrbPreferences::InitializeMiscPrefsFromHandle(), too much trouble to try to parse them.

* Add warning that is displayed when KM finds prefs apparently newer than it understands to CKrbPreferences::InitializeMiscPrefsFromHandle(), and don't try to read them.

* Swapped order of code that lists v4 and v5 tickets in CKrbSession::GetCacheInfo() so that v4 tickets will be listed first.

* Changed CPrincList::DrawCell() to display mixed principals as (V4/V5) instead of (V5/V4).

* Moved InterfaceLib to be after MIT Support¥MoreFilesLib in the link order in both targets.

* Declared and released 1.1d7 final.

5/8/00:

* Bumped version number up to 1.1d8 even though documentation is the only thing that changed.  This keeps Miro happy.

* Declared and released 1.1d8 final.

5/10/99:

* Remove bogus references to "Kerberos for the Macintosh" from CKrbPrefereces.cp.

* CKrbErrorAlert::CKrbErrorAlert() - made sure strings are NUL-terminated before calling c2pstr() on them (if they were exactly the right length they wouldn't have been).

* Renamed all member variables of CKrbErrorAlert.

* In CKrbSession::SetActiveUserInfo(), limit copying of newFullPrinc to first 256 chars - this may not be optimal but it's better than scribbling on memory.  We have an assert that will warn us if this actually happens.

5/11/99:

* Added function CKerberosManagerApp::LoginEventFilter(), a callback function for the Login Libray so that we can process update events when the Login dialog is moved.

* Added code in CKerberosManagerApp::Initialize() to install the callback function in the Login Library.

* Upped version number to 1.1a1.

* Add new ppob for "About MIT Kerberos for Macintosh" dialog box.

* Add new menu item under Apple menu "About MIT Kerberos for Macintosh."

* Add constants for two about box ppob resources ID's to CKerberosManagerApp.h.

* Create new function CKerberosManagerApp::ShowAboutKFMBox().

* Add handlers for ShowAboutKFMBox to CKerberosManagerApp::ObeyCommand(), CKerberosManagerApp::FindCommandStatus().

* Redesign About Boxes again.

* Declared and released 1.1a1 final.

5/31/00:

* Changed e-mail addresses in about boxes to <krbdev@mit.edu> instead of <macdev@mit.edu>.

* Bumped version number up to 1.1a2.

* Removed Standard Suite, Miscellaneous Suite, odds and ends suite from 'aete' resources of Kerberos Manager, since we don't support them.

* Updated calls to KLTicketExpirationTime() to accommodate changed API in CKrbSession.

* Add code to CEditRealmsDialog::CopyRealmsDialogToPrefs() to put up "cannot save preferences" message if necessary due to Login Lib calls.

* Add code to CKrbPrefsDialog::CopySettingsToPrefs() to put up "cannot save preferences" message if necessary due to Login Lib calls.

* Declared 1.1a2 final.

6/1/00:

* Change mForwardable member of CPrincItem to mKerberos5Flags - this is so we don't have to keep adding new members for each flag we want to check (such a Proxiable).

* Update CPrincItem functions and constructors as appropriate.

* Update CPrintItems calls in CKrbSession to match constructor changes.

* Update CPrincList::DrawCell() to parse mKerberos5Flags directly.

* Added code to display "(P)" for proxiable tickets in the ticket list, or "(F,P)" if the ticket is both forwardable and proxiable, to CPrincList::DrawCell().

* Change call to LoadSharedLibraryDriver() in cmd_LoadKClientDriver handler in CKerberosManagerApp::ObeyCommand() to match API change.

* Re-declared 1.1a2 final.

6/7/00:

* Updated project settings to match newly declared standards for project settings.

* Add PreferencesLib binaries to both targets in project.

* Change CKrbErrorAlert::displayErrorAlert() to CKrbErrorAlert::DisplayErrorAlerter() and to return a MessageT instead of a short.

* Fix a lot of "implicitic arithmetic conversions" in CKrbPrefsDialog.cp.

* Change CKrbSession::SetActiveUserInfo() to take const char *, UInt32 instead of const char *, long .

* Change CKrbSession members mCurrentExpTime, mLastChangeTime to UInt32 instead of int and long, respectively.

* Fix some "implicit arithmetic conversions" in CKrbSession.cp.

* Copy code from UModalAlerts::ProcessModalEvent() to CKrberosManagerApp::LoginEventFilter() - we used to just call UModalAlerts::ProcessModalEvent() directly, but we need to return a Boolean value.

* Change CKrbPreferences::SetMainWindowRect() to take Boolean, const Rect * instead of Boolean, Rect * .

* Fix some "implicit arithmetic conversions" in CPrincList.cp.

* Fix many "implicit arithmetic conversions" in CTextColumnColorized.cp.

6/8/00:

* Changed CKerberosManagerApp::LoginEventFilter() to accommodate Login Lib API changes.  Fix a bug where we were claiming we handled update and activate events even when we hadn't.

6/9/00:

* Update vers resource to 1.1b1.

* Rewrite CKrbPreferences::InitializeFromPrefsFile() to use PreferncesLib.

* Add code to display error messages if KLAcquireNewTickets() fails in CKrbSession::DoLogin() and CKrbSession::DoRenew() .

* Rewrite CKrbPreferences::WritePrefsToDisk() to use PreferencesLib.

* Add access paths to PreferencesLib:Headers: to both targets.

* Release 1.1b1.

6/13/00:

* Remove mK5Context from CKrbSession - it wasn't really being used.

* Remove check and warning that .ini file doesn't exist from CKrbSession::CKrbSession, the Prefs lib takes care of this now.

* Remove function CKrbSession::KerberosStartupFailed() - no longer used, superceded by PreferencesLib.

* Remove call to krb5_cc_set_default(mK5Context, NULL) from CKrbSession::SetActiveUser() - all this did was set the active user for that context, which wasn't used any place else.

* Bump version number up to 1.1b2.

* Add Try/Catch blocks to CTextColumnColorized::ReceiveDragItem() to handle the Throws in it.

* Add "With contributions from: Frank Dabek & Brad Thompson" to the "About Kerberos for Macintosh..." box.

* Release 1.1b2.

6/15/00:

* Change copyright date in "About KfM" about box.

* Change hours, minutes, seconds, diff variables in CPrincList::DrawCell() to be SInt32 instead of UInt32's.  This solved the bogus expiration times bug (a UInt32 will never be negative...)

* Change a bunch of "noErr"s used with Login Library call results to "klNoErr" in CKrbSession.

* Add code to CKrbPrefsDialog::CopySettingsToPrefs() to set "always remember" principal options.

* Add code to CKrbPrefsDialog::CopyPrefsToSettings() to read "always remember" principal options.

* Add msg_DefaultUsernameEditText to CKrbPrefsDialog.h.

* Add code to CKrbPrefsDialog::SetControlStatus() to disalbe/enable RadioGroupView (not clear if I need this, can't hurt).

* Add code to CKrbPrefsDialog::SetControlStatus() to deactivate Default Username text field when disabling it, and to activate and set it as focus when enabling it.

* Add handler for msg_DefaultUsernameEditText to CKrbPrefsDialog::ListToMessage() that switches radio buttons when something is typed in Default Username edit text.

* Give Kerb5 options groupbox in Prefs dialog a Pane ID.

* Add rKerb5OptionsGroupbox	to CKrbPrefsDialog.h.

6/16/00:

* Upped version number to 1.1fc1.

* Fix targets so they weak-link against PrefsLib.

* Add mCurrentPrefsFile member to CKrbPreferences.

* Add code to CKrbPreferences::PrefsChanged(), CKrbPrefereneces::InitializeFromPrefsFile() to display full path of prefs file in warning message.

* Remove including krb5.h, krb.h, com_err.h from CKrbSession - doesn't directly access any of those anymore!

* Remove Login Dialog, Change Password Dialog ppobs.

* Don't assert all over the place in CKrbPreferences::CopyPrefsToSettings() if we get klPreferencesReadErr .

* Release 1.1fc1.

6/18/00:

* Fix KClient library name in cmd_LoadKClientDriver handler of CKerberosManagerApp::ObeyCommand() .

* Fix failure to set mCurrentPrefsFileSpec in CKrbPreferences::InitializeFromPrefsFile() (this would have prevented the prefs file error from displaying the correct name).

* Fix failure to use mCurrentPrefsFileSpec to open the prefs file in CKrbPreferences::WritePrefsToDisk() (this always caused an error when trying to write the prefs).

* Bump version up to 1.1fc2.

* Released 1.1fc2.
 
6/19/00:

* Fix KClient library name in cmd_LoadKClientDriver handler of CKerberosManagerApp::ObeyCommand() AGAIN, really this time.

* Bump version up to 1.1fc3.

* Released 1.1fc3.

6/20/99:

* Remove copyright string StaticText from About KfM about box, move version number StaticText to its place and make it larger (since it now has a copyright string in it).

* Bumped version number up to 1.1fc4.

6/21/00:

* Fix bug where KM would have reported a preferences write error when trying to set the default realm to one that no longer exists in CEditRealmsDialog::CopyRealmsDialogToPrefs() - instead KM should just ignore because the user probably deleted that realm.

* Add flag and warning if prefs file is unreadable in CEditRealmsDialog::CopyPrefsToRealmsDialog(), instead of giving a series of asserts.

* Bump version up to 1.1fc5.

6/27/00:

* Add code to properly report Login Lib errors from KLChangePassword() in CKrbSession::ChangePassword() instead of asserting.

* Release 1.1fc5.

6/28/00:

* Fix abuse of std::string() via BlockMoveData() in CKrbPreferences::PrefsChanged() and CKrbPreferences::InitializeFromPrefsFile() .

* Bump version number up to 1.1fc6.

* Bump version number up to 1.1 (final).

8/30/00:

* Remove unused variable and initialization thereof of "nestinglevel" in CPrincList::DrawCell().

* Bump version up to 1.2d1.

* Create CTicketListItem, CTicketListPrincipalItem .

8/31/00:

* Rewrite CTicketListItem, CTicketListPrincipalItem .

* Create CTicketListSubPrincipalItem .

9/1/00:

* Create CTicketListCredentialsItem .

* Remove text trait constants from CPrincList.h (now in CTicketListItem.h).

* Rewrite CKrbSession::GetCacheInfo() to use new CTicketListItem classes.

* Rewrite CPrincList::UpdateListFromCache() to use new CTicketListItem classes.

* Change mTableStorage in CPrincList to take CTicketListItem * (instead of storing objects directly).

* Rewrite CPrincList::DrawCell(), CPrincList::ClickCell(), CPrincList::ClickSelf() to use new CTicketListItem classes.

9/4/00:

* Rewrite CKerberosManagerApp::UpdateUsersMenu() to use new CTicketListItem classes.

* Finish rewriting CPrincList to use new CTicketListItem classes.

* Remove CPrincItem from project targets.

* Add code to CPrincList destructor to free memory used by stored items.

9/6/00:

* Create CTableObjectPtrArrayStorage class.

* Change CPrincList to use CTableObjectPtrArrayStorage for table storage.

9/7/00:

* Add override function CPrincList::RemoveRows() to replace the broken one in LHierarchyTable.

9/9/00:

* Change CTableObjectPtrArrayStorage to CTableTLIPtrArrayStorage, and made it specifically deal with CTicketListItem *'s (using void * didn't call the right destructor, and an attempt to use templates failed).

* Change CPrincList::~CPrincList() to call RemoveAllRows() instead of trying to do its own deallocation of items (since RemoveAllRows() now does the right thing).

* Add "Get Credentials Info" menu item to Kerberos menu ppob.

* Add cmd_GetCredInfo to CKerberosManagerApp.h .

* Make CPrincList::GetItemFromCell() a public method.

* Add support for cmd_GetCredInfo to CKerberosManagerApp::FindCommandStatus() .

* Add safety check to CPrincList::GetItemFromCell() so that it doesn't try to get data from bogus cells (with row and/or column less than 1).

9/13/00:

* Add Spotlight API and QC API folders to both target access paths.

* Add CTicketInfoWindow class (taken from Ben's kerbinfo project).

* Add a bunch of ppobs and 'tab#' for Ticket Info Window (taken from Ben's kerbinfo project).

* Add support for cmd_GetCredInfo to CKerberosManagerApp::ObeyCommand() .

* Fill in code for CTicketListCredentialsItem::OpenTicketInfoWindow() .

* Register CTicketInfoWindow, LMultiPanelView in CKerberosManagerApp::RegisterTMClasses() .

9/14/00:

* Add mKPrincList, mKSessionRef to CKMMainWindow.

* Move functions SpendTime(), GetPrincListRef(), FixButtonStatus(), UpdateActiveUserInfo(), UpdateUsersMenu() from CKerberosManagerApp to CKMMainWindow .

* Add functions ObeyCommand(), FindCommandStatus() , FinishCreateSelf() to CKMMainWindow.

* Move some handlers from CKerberosManagerApp::ObeyCommand() to CKMMainWindow::ObeyCommand().

* Move some handlers from CKerberosManagerApp::FindCommandStatus() to CKMMainWindow::FindCommandStatus().

* Move most handlers from CKerberosManagerApp::ListenToMessage() to CKMMainWindow::ListenToMessage().

* Make CKMMainWindow an LListener and an LPeriodical.

* Fix bug in CPrincList::RemoveAllRows() where all rows wouldn't be removed because LHierarchyTable::RemoveRow() renumbers the rows.

* Add assert for theWideOpenIndex > 0 in CPrincList::GetItemFromCell() , since this turns out to be a sign of a bad thing.

9/15/00:

* Add mMainKMWindow member to CKerberosManagerApp so we can find the main window when we need it.  Change CKerberosManagerApp::CreateMainWindow() to assign the window to that member.

* Move all the command and message handlers for changing active user back to CKerberosManagerApp, so they're dealt with whatever window is up, although the actual procedures that deal with them remain in CKMMainWindow.

* Change Edit Realms window so that it always comes up centered on the parent screen, not the parent window, so that it doesn't try to come up centered on Ticket Info windows.

* Fix title setting of Ticket Info windows for v5 tickets in CTicketInfoWindow.

* Rearrange some items in the Ticket Info window ppobs.

9/18/00:

* Change cc_initialize() in CKrbSession::CKrbSession to request ccapi_version_4 .

* Add members mInfoWindowPtr and mInfoWindowIsOpen to CTicketListCredentialsItem so that we can keep track of the info window.

* Add code to CTicketInfoWindow::OpenInfoWindow() to check mInfoWindowPtr and mInfoWindowIsOpen before opening a new window (instead select existing one if it is open), and set them after opening a new window.
 
* Change CKerberosApp::Run() to not try to UpdateMenus() if programState is quitting, because it can fail if it is.

* Add functions CloseTicketInfoWindow() and MarkTicketWindowAsClosed() to CTicketListCredentialsItem .

* Call CloseTicketInfoWindow() from the CTicketListCredentialsItem destructor.

* Add mItemListRef member to CTicketInfoWindow to refer back to the window's originating list reference, so we can tell it when the window closed.

* Change CTicketInfoWindow::InitializeWindow() to take a CTicketListIem reference.

* Call CTicketListCredentialsItem::MarkTicketInfoWindowAsClosed() from CTicketInfoWindow destructor.

9/19/00:

* Add mItemIsExpanded, mItemIsSelected members to CTicketListItem.  Add Get and Set accessors for them.

* Add code to CPrincList::ClickSelf() to set the list item's expanded flag.

* Add code to CPrincList::HiliteCellActively(), CPrincList::HiliteCellInactively() to set the list item's selected flag.

* Add function CTicketListItem::EquivalentItem() to tell if items are sufficiently simliar to be considered the same.

* Add code to CPrincList::UpdateListFromCache() to compare old list items with new list items and copy over properties such as selected and expanded state.

9/20/00:

* Add mCCache member to CTicketListPrincipalItem and adjust constructors appropriately.

* Make changes to CKrbSession::GetCacheInfo() to copy the UCCache used in the loop, transfer it to the Principal items, and prevent it from being freed locally.

* Add mParentPrincItem to CTicketListSubprincipalItem and adjust constructors appropriately.

* Add EquivalentItem methods to CTicketListPrincipalItem, CTicketListSubPrincipalItem, and CTicketListCredentialsItem .

* Don't call DisposeHandle on the handle passed into LHandleStream in CKrbPreferences::InitializeMiscPrefsFromHandle(); LHandleStream takes care of disposing it and we've been double-disposing.

* Don't call Reset(nil) in CKrbSession::GetCacheInfo(), call Release() instead.

9/21/00:

* Fix bugs in EquivalentItem methods for all ticket list classes.

* Add function CTicketListCredentialsItem::AssumeTicketInfoWindowOwnership() .

* Add function CTicketInfoWindow::SetOwnerListItem() .

* Rename "Always expand ticket list entries" preference to "Always expand new ticket list entries", a more accurate name.

* Added Ben's name to About KM & About KfM boxes.

9/22/00:

* Now insert new sibling rows in CPrincList::UpdateListFromCache() after the max rows, not after row 1, which led to some ordering problems.

* Create CKMNavigateTableAttachment to handle up, down, page up, page down, home, end keys in the ticket list.

9/25/00:

* Make CPrincList an LCommander so that it will use the CKMNavigateTableAttachment.

* Add PowerPlant debugging classes stuff to Debug target.

* Add mDebugMenuAttachment member to CKerberosManagerApp (only when MACDEV_DEBUG is true).  Add support for it in Initialize() and destructor.

* Add #define PP_DEBUGNEW_SUPPORT 0 to MyPP_DebugHeaders.h .

* Make CPrincList latest subcommander in CKMMainWindow::FinishCreateSelf() .

* CKrbSession no longer a commander.  Remove function CKrbSession::ObeyCommand() .

9/26/00:

* Add code to CTicketInfoWindow to display krb5 ticket's enctype.

* Resize field for encryption type in ticket info window ppob.

* Add field for second encryption type to ticket info window ppob.

9/27/00:

* Add code to hide second enctype field in ticket info window for v4 tickets.

* Tweak ticket info window ppob.

* Add code and items to ppob to display "expired"  in ticket info window times list if appropriate.

* Declare and tag 1.2d1.

9/28/00:

* Covert project to CWP 6.

* Remove some unnecessary search paths into CW MacSupport folder, fix some direct paths to be relative to compiler.

* Rename targets to "Kerberos Manager.9" (non-debug) and "Kerberos Manager.9d" (debug).  Also rename binaries that will be generated.

* Replace all MIT Kerberos Library and MIT Support Library links in both targets with updated ones (to .9 and .9d).

* Remove LPasswordEditField from 4.x CVS repository (it wasn't being used).

* Disable LApplication::Run override in CKerberosManagerApp, supposedly the bug has been fixed.

* Check for nil in LNavigateTableAttachment::DoNaviagtionKey end key handler.

* Don't include <TArray.h> in CKrbPreferences.h.

* Rename our LAMPushButtonImp.cp override file so that we use the PP one, but didn't want to delete until we were sure new one works right.

* Remove #include <PPobClasses.h> from CKerberosManagerApp, now obselete and we weren't using it anyway.

* Add #include <PP_DebugMacros.h> to CKerberosManagerApp, needed for DisposeOf_ macro.

* Change Try_ to try and Catch_ to catch(PP_PowerPlant::ExceptionCode) in CKrbPreferences.cp .

* Add #include <string.h> to CKrbPrefsDialog.cp , CKMMainWindow.cp .

* Fiddle with UProfile declarations and assignments in CEditRealmsDialog::FillAllRealmsTable() .

* Add #include <PP_DebugMacros.h> to CTicketInfoWindow .

* Replace all DebugFindPaneByID_ macros with FindPaneByID_ in CTicketInfoWindow .

* Change parameter passed into GetDateTime() in CTicketInfoWindow::InitializeWindow() from time_t to unsigned long.

* Some typecasting in CTicketInfoWindow to make compiler happy.

9/29/00:

* Fix Try_, Catch_ and some old integer types in CTextColumnColorized.

* Change last parameter of CDropFlagMod::TrackClick() to be RGBColor *, not const (saves having to make some typecasts later on).

* Fiddle with many UCCache, UCredentials declarations in CKrbSession to make compiler happy.

* Stop setting std::strings to nil in CKrbSession::GetCacheInfo().

* Add LException.cp, UScrap.cp, UProcessMgr.cp, UDebugging.cp to both targets.

* Replace all c2pstr() with LString::CToPStr(), and p2cstr with LString::PToCStr() .  The old ones aren't Carbon-compatible.

* Remove references to only dealing with v5 tickets from KerberosManager.r .

* Bump version number for CWP4/Carbon version to 1.3d1 .

* Remove UDebugging.cp from both targets.

10/2/00:

* Remove mDebugMenuAttachment and code controlling it from CKerberosManagerApp . It's easier just to call LDebugMenuAttachment::InstallDebugMenu() .

* Change CTicketInfoWindow::InitializeWindow() k5 enctypes parsing to compare against EINVAL, not hardcoded value (which changed between CWP4 and 6).

* Change CTextColumnColrized::DroppedInTrash() to just catch (...) not catch (PP_PowerPlant::ExceptionCode), since it throws other things.

10/3/00:

* Fix up CKrbPreferences to catch either LExceptions or ..., but not ExceptionCodes, which are out of date.

* Add Carbon targets to KM project.

* Add Carbon versions of MIT libraries to Carbon targets in KM, except for Highlander, which has no Carbon target.

* Only enable Unload/Load KClientDriver under !TARGET_API_MAC_CARBON in CKerberosManagerApp::ObeyCommand().

* Only enable Unload/Load KClientDriver under !TARGET_API_MAC_CARBON in CKerberosManagerApp::FindCommandStatus().

* Create KM_Headers.CBd.pch++ and KM_Headers.CB.pch++ precompiled header files for Carbon.  Add to Carbon targets.

* Add MITRuntimeLib:Headers: to access paths of both Carbon targets.

10/4/00:

* Replace MSLRuntime with MIT Runtime static lib in 9 and 9d targets.

* Add CarbonLib to carbon targets.

* Completely redo access paths in all targets, removing some unused ones and making them more specific (to Binaries and Headers, not just the whole library folder).

* #if !TARGET_API_MAC_CARBON the inclusion of ShLibDriver.h in CKerberosManagerApp .

* Change UQDGlobals::InitializeToolbox() in main in CKerberosManagerApp to not take a paramter (change for Carbon).

* Set updateRect in CPrincList::DrawSelf() by calling GetRegionBounds() instead of setting it directly from the region structure (which isn't allowed in Carbon).

* Change CountMItems() to CountMenuItems(), and CheckItem() to CheckMenuItem() in CKMMainWindow::UpdateUsersMenu() (they were renamed for Carbon).

* Set updateRect in CTextColumnColorized::DrawSelf() by calling GetRegionBounds() instead of setting it directly from the region structure (which isn't allowed in Carbon).

* Replace GetOSEvent(mUpMask, &macEvent) (not in Carbon) with UEventMgr::GetMouseUp(macEvent) in CDropFlagMod::TrackClick() .

* Replace UPrintMgr.cp with UPrinting.cp in all targets (UPrintMgr is going to be obsolete, UPrinting replaces it).

* Create local LAMPopupButtonImp override files (.cp, .h) to fix bug with ColorizedStdText in PP file. Needs to take SInt16, const void *, Point, Point not SIn16, Ptr, Point, Point to match Universal Headers.

* Create local LEditText override files (.cp, .h) to fix bug with PasswordStdText. PasswordStdTxMeas in PP file.  They need to take const void * instead of Ptr's to match Universal Headers.

* Surgery on CTextColumnColorized::DroppedInTrash() to deal with Carbonized AppleEvents (have to use slightly different code for Carbon and non-Carbon).

* In CKerberosManagerApp::Initialize(), only set up LoginEvent filter if we're not Carbon (Login Event Filters aren't supported in Carbon yet).

* Add UControlMgr.cp, UDesktop.cp to all targets (needed for Carbon).

* Removed UFloatingDesktop.cp from all targets (don't need it with UDesktop).

* CustomTextColorCDEF.rsrc now only in 9 and 9d targets.

* Add CustomTextColorCDEF.cp for Carbon targets.

* Removed QCAPI Lib and SpotlightAPI.c from all targets (didn't need them anymore for some reason).

10/5/00:

* Changed version number to 1.5d1 .

* Updated PowerPlant and Universal Header checks in Kerberos Manager.

* Added PowerPlant version check to LAMPopupButtonImp.cp override, and explanatory comment.

* Added PowerPlant version check to LEditText.cp override, and explanatory comments.

10/6/00:

* Rename "MyPP_DebugHeaders" files (prefix header and precompiled header) to "KM_Headers.9d" and "MyPP_NoDebugHeaders" to "KM_Headers.9".

* Rename project file to "KerberosManager.mcp" to match standard conventions.

* Added PowerPlant version checks to LAMPopupButtonImp.h and LEditText.h overrides.

10/12/00:

* Add code to CPrincList::UpdateListFromCache() that finds the last principal row (with a nesting level of 0) to insert the next principal after.  This avoids a bug in LHierarchyTable that would cause the principal to get added as a child row of the previous principal, resulting in strange collapsing behavior.

* Make sure all libraries are imported weak (although this is of limited value these days).

* Remove Add/Edit Realm dialog ppob (it hasn't been used in ages).

* Add TicketKeeperLibIsPresent_ macro to CKerberosManagerApp.h .

* Sprinkle checks for TicketKeeperLibIsPresent_ throughout CKerberosManagerApp.cp .

10/16/00:

* Remove UDesktop from all targets, it is a source of two problems - white borders around the edges of the Prefs and Edit Realms dialog, and the main window appearing centered and then moving to the saved position, rather than just starting in the saved position before being shown.

Instead we use UFloatingDesktop for 9 targets, and UWMgr20Desktop for Carbon targets.  Neither of them have either of these problems.  (Can't use UWMgr20Desktop for 9 because it's only good back to Mac OS 8.5, can't use UFloatingDekstop for Carbon because it's not Carbon compatible.)

* Add check for Mac OS 8.5 or greater for Carbon targets of KM in CKerberosManagerApp::Initialize() .

10/17/00:

* Add MITKerberosLib:Support: to the access paths of all targets.

* Declare and release 1.5d1.

10/19/00:

* Update version to 1.5d2.

* Added carb.r to Carbon targets so that Mac OS X will recognize the program as a Carbon app.

* Increased memory allocation of Carbon targets to be 1500 MB.

* In SetActiveUserInfo, check for NULL before calling strlen in first Assert.

* Set the "Is Default Button" flag in several dialog ppobs.

* Create CDialogBoxNoDefaultOutline to work around misbehavior in LDialogBox that draws an outline around the default button under Aqua.  This class simple doesn't try to draw the outline and depends on the Control Manager to do it (which it will under Appearance and Aqua).

* Register and include CDialogBoxNoDefaultOutline in CKerberosManagerApp.

* Change several dialog ppobs to be 'dlNO' (CDialogBoxNoDefaultOutline).

* Change CEditRealmsDialog and CKrbPrefsDialog to be CDialogBoxNoDefaultOutline subclasses (not LDialogBox subclasses).

* Make a few improvments to the error handling in CEditRealmsDialog.

10/23/00:

* Change "Close" menu item to "Close Window."

* Resize MultiPaneViews in Tix Info window to be less close to the edges (so that they'll look better under Aqua).

* Add some more #define's to the precompiled header files, as per MW release notes.

10/24/00:

* Re-check setting the auto-routing bit in all targets in the Finder Flags Post-Linker (it got turned off somewhow).

* Tweak button size and layout in main window so it looks better in Aqua.

* Set IP address table for v5 tix info to have a nil TableSelector so that selecting is disabled, thus avoiding the PP table selection bugs.

10/26/00:

* Add checks to CKerberosManagerApp for mKMMainWindow not being nil before attempting to use it (in some fail-to-initialize states we might get into that state).  Also add safety checks for nil to mKrbSession and mKrbPreferences, although we reall shouldn't get to code that uses those if they're nil.

* Re-add override for LApplication::Run in CKerberosManagerApp, since there are still cases when the default PP behavior thinks it's okay to continue when really it should quit (it doesn't realize a quit AE could get sent while Initializing).

* Add code to CKrbPreferences::WritePrefsToDisk() to create resource fork in prefs file if it doesn't exist instead of giving an error in that case.

* Rewrite code in CKrbPreferences::InitializeFromPrefsFile() so that it gives an error if there's no readable prefs file at all, but doesn't give an error if there's no resource fork.

10/27/00:

* Released 1.5d2.

10/30/00:

* Create new class CAMInvalPushButtonImp to override LAMPushButtonImp.  This forces the button to be invalidated, and then updated, both before and after it's moved.

* In CKerberosManagerApp::RegisterTMClasses(), tell LPushButton to use CAMInvalPushButtonImp instead of LAMPushButtonImp .

* Bump version number to 1.5d3 .

* Release 1.5d3.

10/31/00:

* Add ResizeFrameBy() override to CAMInvalPushButtonImp.  We don't actually use this function, but it would have the same problem if we did.

* Add InvalControlRgn() method to CAMInvalPushButtonImp so that we don't have to repeat the same code 4 times.

* Remove #include "KerberosManagerUtils.h" from CKrbSession.cp.

* Remove KerberosManagerUtils.cp from all targets - we're not using it anymore.

* Make some modifications to Main Window ppob so that text item boundaries all line up.

* Add lots of members to CKMMainWindow to remember initial positions of items, so that we can do absolute positioning later on.

* Add code to CKMMainWindow::FinishCreateSelf() to store initial positions of items.

* Rewrite CKMMainWindow::DoSetBounds() with new repositioning algorithm that uses initial position and initial width of window to calculate new positions.  This new method should prevent the "button drift" we were seeing after repeatedly resising the window.

* Add more code to CKMMainWindow::FinishCreateSelf() and CKMMainWindow::DoSetBounds() to resize the active user text fields so that they get larger when the window does (that wasn't happening previously, but no one noticed).

11/1/00:

* Tweak header section of ticket info window so that it displays more information.

* Bump version number up to 1.5d4.

* Add check to see if we're running under MacOS X before trying to launch TicketKeeper (and don't launch if we are).

* Change tix info window ppob to "Stagger on Parent Screen", not "Stagger on Parent Window."  The stagger on parent window wasn't being honored under 9 (not sure why), but it was under Carbon, resulting in inconsistent behavior.  Now they both behave the same.

11/2/00:

* Add ae_ShowPreferences constant to CKerberosManagerApp.

* Add ae_ShowPreferences handler to CKerberosManagerApp::HandleAppleEvent().

* Add aete, aedt resources for Show Preferences.  (This is all in aid of supporting new system-wide preferences menu under X.)

* Add constants for File and Edit menus to CKerberosManagerApp.h .

* Add code to CKerberosManagerApp::Initialize() to enable system-wide Prefs menu item under X and remove "regular" Quit and Preferences menu items.

11/3/00:

* Fiddle with Tix Info window layout some more for better Aqua Appearance.

* Released 1.5d4.

11/6/00:

* Add CTicketKeeperLibGlue.cp and CSharedLibraryGlue.cp objects (borrowed and modified from Kerberos Control Strip) so that we can avoid linking against TKLib (which we don't want to do on X).

* Change calls to TKLib to calls to CTicketKeeperLibGlue in CKerberosManagerApp.

* Remove checks for presents of TicketKeeperLib, they're moot since we're not linking.

* Remove TicketKeeperLibIsPresent_ macro from CKerberosManagerApp.h (no longer used).

* Remove all versions of TicketKeeperLib from targets in KM.

* Add check to CKerberosManagerApp::LaunchTicketKeeper() to see if TK is already running; if it is, just return true.  This consolidates almost all calls to TicketKeeperLib in one function.

11/7/00:

* Add try's and catch's to calls to CTicketKeeperLibGlue.

* Replace Gestalt check for Mac OS X with a check for Aqua menu layout when checking to see if we should adjust the menus for X.

11/9/00:

* Create CLifetimePrefsDialog and add it to all targets.

* Create ppob for Lifetime Preferences dialog.

* Add "Ticket Lifetime Preferences" item to Debug menu.

* Add support for "Ticket Lifetime Preferences" menu item to CKerberosManagerApp.

* Bump version up to 1.5d5.

11/13/00:

* In CKrbSession::GetCacheInfo() and CTicketInfoWindow::InitializeWindow(), change the way v4 ticket end time is calculated to accommodate CCache v4, which now returns the lifetime in seconds, not 5-minute blocks.

* Change Ticket Lifetime Preferences window to not accept negative or decimal numbers.

11/14/00:

* Remove ellipses from "About" menu items.

* Rename "Get Credentials Info" menu item to "Get Ticket Info".

* Rename "New Login..." menu item to "Get New Tickets..."

* Rearrange Kerberos menu items to match ordering of other Kerberos menus.

* Rename "New Login" button to "Get New Tickets..." in main window.

* Rename "Renew..." button in  main window to "Renew Tickets...".

* Increase minimum size of main window to fit changes in button names.

* Change ticket list to use lowercase "v" in "v4/v5".

* Add Kerberos MDEF resource file to all targets.

* Set "Change Active Users" menu to use the Kerberos MDEF, so that it tears off like the Kerberos Menu and Kerberos CS strip.

* Fix CPrincList::DrawCell() so that it can deal with really long lifetimes (and display days if necessary).

11/15/00:

* Change checks for displaying "expired" in ticket info window so that it can recognize long lifetimes.

* Have ticket info window display "Essentially Infinite" for really long lifetimes, because due to library limitations we currently can't display the correct info.

* Add code to CKMMainWindow::FindCommandStatus() to have the Renew, Destroy, and Change Password items include the principal they're going to apply to.

* Add CCommanderView to all targets.

* Redesign Prefs control panel to use tab group and multipaneview.  Create a lot of subsidiary ppobs for the individual panels.

* Add function CKrbPrefsDialog::LinkToBroadcasters() to link up the panels of the MultiPanelViews as listeners.

* Add code to CKrbPrefsDialog::FinishCreateSelf() to create the multipanelview panes.

* Add CKrbPrefsDialog::ListenToMessage to RestoreTarget() when the panels of the MultiPanelView switched.

11/16/00:

* Add resource IDs for the new Tabs control and panels to CKrbPrefsDialog.cp.

* Copy code from CLifetimePrefsDialog into CKrbPrefsDialog to handle Lifetime pane.

* Add mIsOkayToClose member to CKrbPrefsDialog.

* Add AllowClose() member to CKrbPrefsDialog.

* Switch code in CKerberosManagerApp::ObeyCommand() that handles cmd_Preferences to use a StDialogHandler instead of a regular dialog.

11/17/00:

* Fixed code in CKrbPrefsDialog::CopyRealmsListToPopupMenu() that converted a KL realm string to a Pascal string and then told LoginLib to free that, which caused random parts of memory to be overwritten and freed.  Now make a copy of that string before converting it...

* Remove cmd_PrefsOK and cmd_PrefsCancel constants from CKrbPrefsDialog, they are no longer used.

11/29/00:

* Add some type conversions to CKrbPrefsDialog to keep the compiler happy.

* Edit Floating Window preferences PPOB to add checkboxes for options.

* Add constants for floating window prefs checkboxes to CKrbPrefsDialog.h .

* #include CTicketKeeperLibGlue in CKrbPrefsDialog.

11/30/00:

* Add functions for setting floating window features to CTicketKeeperLibGlue.

* Add code to CKrbPrefsDialog::CopySettingsToPrefs to read values of floating window checkboxes and tell TKLib to set them properly.

* Change main window's title to be "Kerberos".  Change title text in main window to just say "Kerberos" and remove "A utility for..." text.

* Go through ppobs and change all text to reflect new component names.

* Go through and change all text references to "Kerberos Manager" to "the Kerberos Control Panel".

* Change KM preferences resource's name to be "Kerberos CP Preferences" (not "Kerberos Manager Preferences").

* Rename targets to "Kerberos CP.foo" and output name to "Kerberos.foo".

* Go through and change all strings to reference new component names (again).

* Released 1.5d5.

12/1/00:

* Upped version number to 1.5d6.

* Set Floating Window Options checkboxes to always be on, not off.

* Remove code from CKMMainWindow that displayed usernames in "Renew Tickets", "Destroy Tickets", "Change Password" menus.

* Add code to CKrbPrefsDialog::ListenToMessage() to update the Admin panel's default lifetime setting when the Login Options lifetime slider setting is changed.

* Add code to CKrbPrefsDialog::ListenToMessage() to update the LoginOptions lifetime slider with info from the Admin panel settings when the panel switches to the Login Options panel, so that everything stays in sync.

* Add "BSD Me!" menu command to debug menu.

* Add support for cmd_BSDMe to CKMMainWindow::ObeyCommand().

12/4/00:

* Rename "Get New Tickets" button and menu item to "Get Tickets".

* Add SwapButtonNames() to CKMMainWindow for BSD Easter Egg.

12/5/00:

* Add CBSDAttachment to all targets.

* Remove SwapButtonNames(), replace with BSDButtonNames() and StandardButtonNames(), in CKMainWindow.

* Add call to AddAttachment(CBSDAttachment) to CKMMainWindow::CKMMainWindow.

* Add handler for CBSDAttachment::msg_BSDLayout and msg_CBSDAttachment::msg_MacLayout to CKMMainWindow::ListenToMessage().

* Change version number to 1.5a1.

12/6/00:

* Change graphic in "About Kerberos for Macintosh" to not have the MIT in it.

* Change graphic in "About Kerberos" to not say "Kerberos Manager".

* Fix a bunch of headers to use FOUR_CHAR_CODE() in their classID enums.  Nothing was being hurt by not doing this, but it's the right thing to do.

12/7/00:

* Add code to CKerberosManagerApp::Initialize() to prevent Carbon KCP from running under 9 when version is final.

12/8/00:

* Tweak layout of tabbed prefs dialog to look better under X.

* Add code to CKerberosManagerApp::CreateMainWindow() to make sure stored pref size is valid, that is, falls within the min and max size of the window, and fix before using the prefs values if they don't.

* Remove cmd_BSDMe from CKerberosManagerApp.h .

* Remove handling for cmd_BSDMe from CKMMainWindow::ObeyCommand() .

* Remove BSD Me! command from the Debug menu ppob.

* Go back to using TicketKeeperLib directly instead of TKLibGlue in CKrbPrefsDialog.cp.

* Go back to using TicketKeeperLib directly instead of TKLibGlue in CKerberosManagerGlue.cp.

* Remove CTicketKeeperLibGlue.cp from all targets.

* Add code to disable Launch, Kill TicketKeeper menu items in Carbon KM.

* CKerberosManagerApp::LaunchTicketKeeper() now mostly #ifdef'ed out on Carbon; just returns true and does nothing else (so basically it won't try to launch TK).

* Add #ifdefs for Carbon in CKrbPrefsDialog and the floater options.

* Add support for reading the floater options in CKrbPrefsDialog::CopyPrefsToSettings() .

* Released 1.5a1.

12/14/00:

* Bumped version number up to 1.5a2.

* Changed output names for all binaries again.

* Released 1.5a2.

12/19/00:

* Removed header stuff from main window, resized to make window not quite as tall and a smidgen wider.

* Removed code from CKMMainWindow::DoSetBounds() that repositioned header text and header icon (now that they're gone).

* Changed "Admin" prefs tab name back to "Lifetimes".

* Created new tab# resource ID 131 for Prefs tabs under Mac OS X.

* Make two new views with different tab controls for different prefs under 9 and X, and change main prefs ppob to have a multi-panel view that contains those two.

* More ppob changes to support more multipanelviews.

* Changes to CKrbPrefsDialog to support the two different MultiPanelViews.

* Changed version number to 1.5a3.

* Released 1.5a3.

1/4/01:

* Don't attempt to disable floater checkboxes under MacOS X in CKrbPrefsDialog::FinishCreateSelf() - they don't exist!

* Changed version number to 1.5a4.

* Add calls to SwitchToPanel() in CKrbPrefsDialog::FinishCreateSelf() so that both panels aren't show at once.

* Change all references to "kerberosVersion_Any" to "kerberosVersion_All", which is what we really want, in CKrbSession.

1/8/01:

* Add code to CKrbSession::GetCacheInfo() to detect if cache is valid, and if not, enter 0 as the expiration time for individual tickets.  (Otherwise the expanded ticket list will display tickets with valid expiration times even when they're not really valid.)

* Change CKrbSession::SpendTime() to use KLLastChangedTime() instead of cc_context_get_change_time().  This should allow KM to detect tickets becoming invalid because the IP address changes.

1/10/01:

* In CKrbPrefsDialog, make sure floater panel isn't displayed in Carbon version under both 9 and X.

* In CPrincList::DrawCell(), add code to set theme background and pattern to pure white when under Appearance Manager 1.1 or later.  This should make the grey shading of principals work correctly under all themes.

1/11/01:

* Remove CKerberosManagerApp::ShowAboutBox() function (we're going down to one about box).

* Rename CKerberosManagerApp::ShowAboutKfMBox() to ShowAboutBox() .  Now choosing "About Kerberos" will display what used to be the "About KfM" about box.

* Remove "About Kerberos for Macintosh" menu item.

1/12/01:

* Tweak about box layout.

* Remove "changes may not take effect until you click OK" warning from the Preferences Lifetime pane.

1/24/01:

* Removed seconds edit boxes from the Ticket Lifetimes prefs panel.

* Add separators, better labels to Ticket Lifetimes prefs panel.

* Removed code and constants that handle seconds edit boxes from CKrbPrefsDialog.cp .

1/25/01:

* Add mTabsMultiPanelView member to CKrbPrefsDialog.cp .

* Change most FindByPaneID calls in CKrbPrefsDialog to search mTabsMultiPanelView, not "this" (the entire dialog), to make sure they find the control in the correct view hierarchy.  (Otherwise sometimes it would find the other, and the prefs dialog didn't update correctly.)

* Change Pref dialog's MultiPaneView to have an initial pane of 0.  That solves the problem of both panes being created.

* Remove all the mTabsMultiPaneView FindPaneByID stuff, since we don't need it anymore.

* Add code to CKrbPrefsDialog to display 0 minutes as "00" in the Ticket Lifetimes panel.

1/26/01:

* Added "Version:" label to last line of About box.

1/31/01:

* Added code to CPrincList::DrawCell to draw time remaing in red if less than 5 minutes remain as a "near expiration warning."

* Added code to CKMMainWindow::UpdateActiveUserInfo() to draw time remaing in red if less than 5 minutes remain as a "near expiration warning."

2/1/01:

* Add code to CTicketInfoWindow::InitializeWindow() to display expired warning if tickets are invalid due to IP addresses.

* Change all "OSStatus" used for LoginLib errors to "KLStatus" type througout.

* Add code to select the default user if there isn't already a selection in CPrincList::UpdateListFromCache() .

* Released 1.5a4.

2/5/01:

* Malloc for copying realm string was one short in CKrbPrefsDialog::CopyRealmsListToPopupMenu().  Added a "+1".  This caused a crash when trying to get tickets after opening the prefs dialog.

* Bumped version number up to 1.5a5.  Added "2001" to version string.

2/16/01:

* Add mItemExpiredTextTrait member and GetItemExpiredTextTrait() method to CTicketListItem.

* Add several new text trait constants to CTicketListItem.h.

* Add inItemExpiredTextTrait to CTicketListItem and descendents constructors.

2/19/01:

* Bump version number to 1.5a6.

* Changes in CPrincList::DrawCell() to draw expired items using item's expiredTextTraits.

* Add code to CKMMainWindow::UpdateActiveUserInfo() to draw active user as italic when expired.

* Renamed "Floater Options" prefs tab to "Floating Window".

2/20/01:

* Set mIsOkayToClose to true at the start of CKrbPrefsDialog::CopySettingsToPrefs() .  This fixes the "can't OK the prefs dialog after entering a bad lifetime value" bug, which was happening because mIsOkayToClose wasn't getting reset each time.

* Add Asserts to CPrincList::HiliteCellActively() and HiliteCellInactively() to warn when they try to operate on a bogus cell (which probably mean a bad cell range was passed into SelectCell() ).

* Add code to CPriceList::ClickSelf() to re-select a principal when a ticket hierarchy is collapsed and the selection was on one of the items that was collapsed.

* Rip out code from CKMMainWindow::UpdateActiveUserInfo() to draw Active User info as italic when expired. No one liked it.

2/21/01:

* CTicketInfoWindow::InitializeWindow() now draws times in small system font; however this has no effect at the moment because of a bug in PP 2.1.  This will be fixed in PP 2.1.1.

* Make space for "expired warning" in ticket info larger to accomodate "bad IP address" message.

* CTicketInfoWindow::InitializeWindow() now distinguishes between expired tickets and tickets not valid because of IP address change.

* Changed pop-up menus in prefs to say "Remember foo from last Kerberos login" instead of "Remember from last login".

* In CKrbSession, after calling KLTicketExpirationTime(KerbersoVersion_All), check for klNoCredentialsError, and call again with KerberosVersion_Any, to catch the "srvtab case" where realm supports both Kerb versions but only got tix for one version (you have to work hard to do this, but there are some valid cases and Kerberos Manager should work right in those cases).

2/22/01:

* Add constants for ticket validity to CTicketListItem.h (kTicketValid, kTicketInvalidBadAddress, kTicketInvalidUnknown).

* Add member mTicketItemIsValid to CTicketListItem.  Add parameter to constructor for it.

* Add GetItemValidity(), SetItemValidity() methods to CTicketListItem.

* Add inItemValidity paramteter to CTicketListItem subclasses.

* Add checks for item validity to CKrbSession::GetCacheInfo(), and pass the results along when creating ticket list items.  Also add assertions for unexpected errors from KLTicketExpireTime.

* Add code to check for and draw "not valid" in ticket list when items are not valid to CPrincList::DrawCell().

* Rename mCurrentFoo to mActiveUserFoo in CKrbSession to better reflect their use.

* Add mCurrentUserValidity to CKrbSession.

* Change CKrbSession::SetActiveUserInfo() to take a cacheValidity parameter.

* Check for and pass cacheValidity out of CKrbSession::SetActiveUserFromCache().

* Add outValidity parameter to CKrbSession::GetActiveUserInfo().  Rename other parameters to better names.

* Check for and pass cacheValidity out of CKrbSession::SetPrincipalAsDefault().

* CKMMainWindow::UpdateActiveUserInfo() now checks the validity of the active user and displays the appropriate message if their tix aren't valid.

* Rename some variables in CKMMainWindow::UpdateActiveUserInfo() to be more descriptive.

2/23/01:

* Fix bug in Ticket Info Window that displayed expired tickets as "not valid - unknown reason".

* Make fields that display info in Active User Info box wider (so that "Tickets Not Valid" message fits, although they really should have been as long as possible anyway).

* Add a couple more text traits to CKerberosManagerApp.h.

* Add new "status" field to tix info window times panel to replace "Expired Warning" field.

* Rework "expired" field code in CTicketInfoWindow::InitializeWindow() to work with new status field (which also now displays "valid" not in red).

3/7/01:

* Add inPrincVersion paramter to CKrbSession::DoLogout() .

* Rewrite CKrbSession::DoLogout() to use KLDestroyTickets() instead of cc_cache_destroy().

* Get rid of the "possible unwanted ;" warning in CKrbManagerApp::LaunchTicketKeeper() .

* In CKrbManagerApp::Initialize(), don't call CheckLocation() under Mac OS X, since we don't know what to do if it fails.

3/8/01:

* Add code to CKMMainWindow::UpdateUsersMenu() to draw expired/invalid users as italic in the users menu.

3/14/01:

* Update access paths and #includes to match new tree structure.  Lots of files were touched.

* Released KCP 1.5a6.

3/20/01:

* Miro added some more headers due to tree rearrangement.

* Adjusted main window, login options prefs ppobs for better Aqua layout.

* Changed version number to 1.5a7.

* Released KCP 1.5a8.

3/30/01:

* Changed version number ot 1.5a8.

* Added 'plst' resource to Carbon targets (actually includes info from file Info.plist).

* Added CarbonPrefix.h as Rez prefix in Carbon targets.

* Added RuntimeLib:Headers: access path to Carbon targets (for CarbonPrefix.h).

* Don't try to include balloon help resources in Carbon targets.

* Remove carb.r (and thus 'carb' 0) resource from Carbon targets (superseded by plist).

4/2/01:

* Changed version number to 1.5b1.

4/18/01:

* Added call to CEditRealmsDialogs::SetButtonStatus() after realms are added or removed in CEditRealmsDialogs::ListenToMessage().  This fixes some suboptimal button updating issues.

* Changed version number to 1.5b2.

* In CKrbSession::SetActiveUserFromCache() and CKrbSession::GetCacheInfo(), get DisplayStrings for principals as well as "real" princpal strings.  Use display strings as appropriate.

* Remove CLifetimePrefsDialog from all targets (it's been integrated into Prefs dialog).

* Remove references to CLifetimePrefsDialog from CKerberosManagerApp.cp .

* Remove "Ticket Lifetimes" from Debug menu.

* Remove ppob for Ticket Lifetimes Dialog from ppob.

* Remove some other outdated ppobs of old dialog designs.

4/19/01:

* Added mTicketItemDisplayString member to CTicketListItem so that we can retain both the "real" principal and the display principal.

* Add inDisplayString to CTicketListItem constructor.

* Add GetItemDisplayString(), SetItemDisplayString() to CTicketListItem.

* Add inDisplayString to CTicketListPrincipalItem, CTicketListSubPrincipalItem, CTicketListCredentialsItem constructors.

* Updated calls to CTicketListItem constructors to pass in display string parameter in CKrbSession.

* Changed some calls to ticketItem->GetItemPrincpalString() to ticketItem->GetItemDisplayString() as appropriate.

4/27/01:

* Add function CKerberosManagerApp::GetMainWindowRef().

* Rename fKrbSession to mKrbSession in CPrincList.

* Add call to update active user info after the ticket list has been updated by a collapse/expand in CPrincList::ClickSelf().

* Change CKMMainWindow::UpdateActiveUserInfo() to update every 30 seconds instead of every 60.

* Add forceUpdate parameter to CKMMainWindow::UpdateActiveUserInfo() to force an update regardless of the time since the last one or state of the cache.

* Released 1.5b2.

5/11/01:

* Add new method CTicketInfoWindow::ClickInGoAway() that handles option-close to close all ticket info windows at once.

* Change version number to 1.5b3.

6/6/01:

* Fix spelling error in Login Options pop-up menu.

* Reposition "Always expand new ticket list" checkbox.

* Changed version number to 1.5fc1.

* Released 1.5fc1.

6/18/01:

* Added some catches to specifically handle CCache errors to CKrbSession::GetCacheInfo().

* Changed version number to 1.5fc2.

* Released 1.5fc2.

6/20/01:

* Added check to make sure minimum lifetime can't be set below 5 minutes in non-debug versions in CKrbPrefsDialog::CopySettingsToPrefs() .

* Changed version number to 1.5 (final).

* Moved lines that set color of status to red to be inside if blocks to avoid coloring the "Status" of service tickets that are still valid when the TGTs are expired in CTicketInfoWindow::InitializeWindow() .

6/21/01:

* Add call to CTicketInfoWindow::InitializeWindow() when the window already exists and we're just reselecting it in CTicketListCredentialsItem::OpenTicketInfoWindow().  That way the ticket info window will update in case the ticket's status has changed.

* Kerberos Control Panel 1.5 is released!

7/10/01:

* Add code to CKrbPreferences::InitializeFromPrefsFile() to try to create the prefs file if a readable one can't be found; this is for consistency with other KfM behavior, according to Miro.  Fix a couple of other minor bugs in the prefs code.

* Increased version number to 1.6d1.

7/11/01:

* Changed version number to 1.6a1.

8/6/01:

* Added allowed version to Debug.Assert.h from DebuggingLib.

* Removed CSharedLibraryGlue.cp from all targets - we're not using it anymore.

8/10/01:

* Turn "enums always int" options on in all targets to match change in Debugging library.

* Changed version number to 1.6a2.

8/13/01:

* Started conversion to CodeWarrior Pro 7 and PowerPlant 2.2.

* Added #define I_HAVE_STAT_H to pwd.h because apparently now we have stat (there's a stat.mac.h in the CWP tree too, but CW isn't finding that - possibly it should be.) (revised this fix on 9/25/01)

* In CKerberosManagerApp.c, register LTabsControl as a LAMControlImp, not an LAMTabsControlImp (which is obsolete).  Don't include LAMTabsControlImp.h anymore.

* Remove LAMTabsControlImp.cp from all targets.

* In CKerberosManagerApp.c, register LTextGroupBox as a LAMTextGroupBoxImp, not an LAMControlViewImp (which is obsolete).  Don't include LAMControlViewImp.h anymore.   Include LAMTextGroupBoxImp.h .

* Remove LAMControlViewImp.cp from all targets.

* Add LAMTextGroupBoxImp.cp to all targets.

* Remove LAMEditText.cp override - they've fixed the bug with UH 3.4 that we were using our override to fix.  Now use the standard PP file.

* In all targets, delete "Compiler:" from my access path, and replace it with "Compiler:MSL:", this solves the problem of CW searching (and trying to use) Java headers.

* Remove LAMPopupButtonImp.cp override - they've fixed the bug with UH 3.4 that we were using our override to fix.  Now use the standard PP file.

* Remove CDialogBoxNoDefaultOutline.cp from all targets - hopefully we don't need it anymore because they've fixed the bug.

* Remove all references to CDialogBoxNoDefaultOutline.cp in other classes.

* Remove LGADialog.cp from all targets - it's obsolete.

* Remove CustomTextColorCDEF.cp from all targets - it's obsolete.

8/15/01:

* Added CarbonFrameworkLib, LCFObject.cp, LCFString.cp, LCFURL.cp, UMachOFunctions.cp to Carbon targets.  Needed by new PP.

* Removed DebuggingLib and access paths to DebuggingLib from all targets because they conflict with CWP7's UDebugging.cp.

* Added UDebugging.cp, MetroNubUtils.c to all targets to make up for removing DebuggingLib.  Also add "MNU Carbon Lib" to Carbon targets.

* Change precomplied headers to #include <UDebugging.h> instead of <Debug.h>.

* Add LTimerTask.cp, LTimerTaskFunctor.cp to Carbon targets (required by PP 2.2 final).

* Replace UWMgr20Desktop.cp with UCarbonDesktop.cp in Carbon targets.

* Register LPushButton with LAMPushButtonImp instead of CInvalPushButtonImp.  The bug we were working around with CInvalPushButtonImp is fixed by PP 2.2.

* Remove CInvalPushButtonImp.cp from all targets.

* Fix a lot of ppob's that were trying to use CDialogBoxNoDefaultOutline which I removed previously.

8/16/01:

* Remove HiliteCellActively(), HiliteCellInActively(), HiliteSelection(), DrawSelf(), ApplyForeAndBackColors(), SetForeAndBackColors(), GetForeAndBackColors() overrides from CPrincList.  PowerPlant now handles drawing tables with white backgrounds.

* Remove DrawSelf(), ApplyForeAndBackColors(), SetForeAndBackColors(), GetForeAndBackColors() overrides from CTextColumnColorized, because PP now handles drawing tables with white backgrounds.  We still need the override class for the drag and drop stuff, though.

8/20 - 8/22:

* Add Mach-O debug target (using "Convert Target to Mach-O" feature).

* Lots of little header changes and #if TARGET_RT_MAC_MACHO around stuff that doesn't apply to Mach-o (like checking for CFM libraries, ticket keeper).

* Add lots of PowerPlant classes to the Mach-O to make the Mach-O linking happy; it's not clear *why* it wants them.

* Removed CustomColorControlMDEF from all targets, it's obsolete.

* Add EmptyMenu.rsrc to all targets - the preferences dialog needed it now.

8/27:

* Edited CKerberosManagerApp::Run() check for PP to allow version 2.2, since they still haven't changed the default Run().

8/28:

* Disabled active users menu from using Kerberos MDEF in hopes that this would solve our menu-loading problem.  It doesn't, but leave it off for now anyway.

8/29:

* Don't use #s in sprintf in CPrincList::DrawCell(), this doesn't work with BSD under Mach-O.  Changed to use LString::PtoCStr beforehand.

* Re-enable active users menu from using Kerberos MDEF.  Doesn't hurt Mach-O any to do this, and we get the vers 2 resource for free.

* Re-enable red expiration warnings by using SetPortTextTraits in CPricList::DrawCell().

8/30:

* Create and set up Mach-O non-debug target (although only debug Kerberos.framework is available so this is a little silly).

* Link Mach-O debug target against Carbon, System, CoreFoundation debug frameworks instead of non-debug.  No noticeable difference.

* Create pre-compiled header files for non-debug Mach-O target.

8/31/01:

* Put real error (instead of Assert) in CKrbSession::SpendTime() when no preferences file can be found.

* Add HiliteCellActively, HiliteCellInactively overrides back to CPrincList.  We need them to tag the cell's selection state.

9/5/01:

* Remove UControlRegistry from all targets.  We don't need it, and it's the cause of us needing to link in bunches of extra PP classes we don't need.

* Remove tons of PP classes that we added earlier.  This brings the binary size of KCP Mach-O down some.

9/7/01:

* Add call to UpdateCollapsedWindowDockTile() to CKMMainWindow::UpdateActiveUserInfo().  This sometimes, but not always, makes the minimized KCP window update.

9/11/01:

* Add CKMMainWindow::UpdateDockIcon(), which will change the dock's icon to reflect the active user's ticket status.  Add call to UpdateDockIcon to UpdateActiveUserInfo().

* Added icns resources 129, 130 for "warning" and "expired" icons.

* Add #define RunningUnderMacOSX() to true if TARGET_RT_MAC_MACHO is true to Mach-O target compiled headers.

9/17 - 9/19/01:

* Added support for drawing time remaining in dock tile icon.

* Designed and added new large 32-bit icon.

* Added code to generate dock menu to CKerberosManagerApp::Initialize().

* Added new static method CKerberosManagerapp::DockMenuCommandHandler() to handle Carbon events from dock menu.

9/20/01:

* Added theme attachment to about box so it gets the good background on Mac OS X.  Redid banner in about box to remove "MIT."  Re-laid out about box to center everything (whyever did I think the last layout was good?)

* Renamed old Info.plist file in Resource folder (that's included by KerberosManage.r) to Carbon.Info.plist because I want to put the "real" Info.plist in that folder too.

* Made dock menu event handlers methods of the CKerberosManagerApp class so they can be disposed of properly.

* Move dock menu setup stuff into new function CKerberosManagerApp::SetupDockMenuAndHandlers() .

* Add new Carbon event handler CKerberosManagerApp::DockMenuSetupHandler() so we can adjust the dock menu on the fly.

* Change CPrincList::GetSelectedPrincipal() to return a Boolean instead of 0 for success and -1 for failure.

* Adjust CKMMainWindow::ObeyCommand() so that renew and destroy don't work if no principal is selected.

* Add new function CPrincList::GetActivePrincipal() .

* Add new command constants, cmd_DestroyActiveUser and cmd_RenewActiveUser (for the dock menu).  Rename old constants to cmd_DestroySelectedUser and cmd_RenewSelectedUser for clarity.

9/21/01:

* Added Gestalt check for 10.1 in Mach-O mversion.

* Filled out CKerberosManagerApp::DockMenuSetupHandler(), moving dock menu creation to here from SetupDockMenuAndHandlers().  Also disables items when appropriate and builds list of users.

* Added support for changing active users to CKerberosManagerApp::DockMenuCommandHandler() .

9/24/01:

* Add new checkbox for "display time remaining in dock" to Display Options dialog ppob.

* Add new constant for new checkbox to CKrbPrefsDialog.h.

* Revise TicketManagerPrefs struct, eliminating all the prefs we don't use anymore and adding one for displayTimeInDock.

* Modify CKrbPreferences::InitializeMiscPrefsFromHandle() to read old v2 stuff into temp variables instead of preferences structure.

* Modify CKrbPreferences::WritePrefsToDisk() to write out v3 prefs structure.

* Modify CKrbPreferences::InitializeFromHardcodedDefaults() to initialize v3 prefs structure.

* Add new functions GetDisplayTimeInDock() and SetDisplayTimeInDock() to CKrbPreferences.

* Add code to CKrbPrefsDialog to display and save "display time remaining in dock" preference.

* Add member mKrbPrefsRef to CKMMainWindow, and initialize it in FinishCreateSelf() .  Remove places in code where we found the prefs ref on the fly.

* Add code to CKMMainWindow::UpdateDockIcon() to only draw time remaining in dock if the DisplayTimeInDock preference is set.

* Add code to CKMMainWindow::ListenToMessages() to listen for changes to time remaining draw pref.

* Add "Display time remaining in icon" option to dock menu (edit menu ppob, add constants to CKerberosManagerApp).

* Add support for displaying and setting checkmark on "Display time remaining in icon" option in CKerberosManagerApp::DockMenuSetupHandler() .

* Add support for handing "Display time remaining in icon" dock menu item in CKerberosManagerApp::DockMenuCommandHandler() .

* Add code to restore dock icon in CKerberosManagerApp destructor - we need to do this if the user has added the Kerberos icon to their dock when it wasn't running; if we don't restore the last time and keystate gets stuck on the dock.

9/25/01:

* Change CKMMainWindow::AttemptClose() and CKMMainWindow::DoClose() so that on Mac OS X, closing the window merely hides the window, not quits the app.

* Change CKMMainWindow::DoCommand() so that cmd_Close calls AttemptClose() (instead of handling it directly - reducing code duplication).

* Add 'aedt' resource for reopen AppleEvent.

* Add CKerberosManagerApp::DoReopenApp() method to re-show the window.

* Add "Show Ticket List" menu item to file menu.  Add cmd_ShowTicketList constant to CKerberosManagerApp.h, and add handlers for it to CKerberosManagerApp::FindCommandStatus() and CKerberosManagerApp::ObeyCommand() .

* Renumber new icons to 200-202, from 128-130.  Reinstall old icons as ID 128.  We should still get the new big icon under OS X, but the old icons unders Mac OS 9.

9/26/01:

* Set more of the text fields of the ticket info window to be the small system font.

* Added Info.debug.plist file for debug Mach-O build.

* Declared 1.6a2.

9/27/01:

* Add special cases to CKerberosManagerApp::DockMenuCommandHandler() to handle pop-up menus in prefs dialog.

* Added CKrbPrefsDialog::ObeyCommand() to handle commands sent by CKerberosManagerApp::DockMenuCommandHandler() hack.

* Add command IDs to the two dialog popup menu ppobs, although I don't think they're actually used now.

* Re-declared 1.6a2.

10/2/01:

* Rez prefix file that fixes problems with TARGET_API_MAC_CARBON not being defined properly by CW wasn't included in Carbon non-debug target, causing Carbon non-debug KM to launch in Classic.  Fixed.

10/3/01:

* Changed version number to 1.6a3.

* Added CFBundleName keys to both plists to fix crummy application menu name.

* In CKMMainWindow::UpdateActiveUserInfo(), set shortTimeString (for dock icon time remaining) to "--:--" instead of empty when tix are expired.

10/22/01:

* Fixed CKerberosManagerApp::DockMenuCommandHandler() so that it returns eventNotHandledErr for anything that's not explicitly a dock menu command.  This allows us to remove all the special-case menu handling and hacks I had in for the regular menus and pop-up menu.

* Changed CKrbPrefsDialog::CopySettingsToPrefs() so that it doesn't write out the ticket options if "remember last used ticket options" was set.  This avoids overwriting the default lifetime with the possibly out-of-date value in the prefs when the "remember last used ticket options" is set (in theory this should have been a harmless operation but the out-of-date value, caused by a login library bug, made it not so harmless).

11/6:

* Changed "Kerberos" menu name to "Tickets" in ppob.

* Declared 1.6a3.

11/9:

* Add PrivateDebuggingLib and PrivateMoreFilesLib to KM source (sigh).

* Add call to UnregisterIconRef() in CKMMainWindow::UpdateDockIcon() .

11/13:

* Bracket CKerberosManagerApp::CheckLocation(),  CKerberosManagerApp::LauchDateTime() with #if !TARGET_RT_MAC_MACHO so that ithey aren't compiled for Mach-O, where they're not called or wanted.

* Move MoreFiles headers MoreFilesExtras.h and Search.h to not be included when compiling for Mach-O in CKerberosManagerApp.cp .

* Start adding files from PrivateMoreFilesLib and PrivateDebuggingLib to KM project.

* Changed wording of two of the Floater options preferences to make Miro happy.

* Changed version number to 1.6b1.

* Declared 1.6b1.

11/27:

* Removed call to krb5_free_data_contents() from CTicketInfoWindow::InitializeWindow() because it was freeing up something we freed up later, leading to crashes.

* Changed verison number to 1.6b2.

* Changed strchr() to strrchr() in CKrbSession::GetActiveUserInfo().  This is slightly less lame than looking for the first @ sign.

12/3:

* Add UKerberos5Context member to CKrbSession.  This in order to solve a sleep bug - the repeated call to KLLastChangedTime() in SpendTime() when no other context was being used caused a continual disk hit which would cause KM to prevent the Mac from going to sleep.  Having a context available prevents this, thanks to the Miro profile sharing optimizations.

* Declare 1.6b2.

12/6:

* Fix version in plists (again).

12/7:

* Rearrange search paths so that private debugging, MoreFilesLib, and WrappersLib are before the Framework.

* Changed version number to 1.6b3.

12/11:

* Added "Sync Credentials Cache" menu item to Debug menu, only available under Classic.  Added appropriate support to CKerberosManagerApp::FindCommandStatus() and CKerberosManagerApp::ObeyCommand().

* Added new prefs tab ppob for the tabs we want to display under Classic.

* Added support for Classic prefs tabs to CKrbPrefsDialog.  This involved if'ing a lot of the prefs setting and reading code, since it only applies if the Login Options are showing, which they aren't under Classic.

* Add 	#define RunningUnderClassic() 	false to Mach-O pre-compiled headers, since we don't have access to Utilities lib in that environment.

12/12:

* Disable the Edit Favorite Realms menu option when under Classic in CKerberosManagerApp::FindCommandStatus() .

* Fix bug in CKrbPrefsDialog::CopyPrefsToSettings() where the username would not be displayed properly in the "Always use this username" field if the username was only 1 letter long.  (Login Library handled this properly, just not the KM dialog.)

* 1.6b3 released.

1/7/02:

* Add mini class CDockIconRestorer in CKerberosManagerapp.cp to restore the dock icon to its normal state in deconstructor; declare a global variable of this class so the icon gets restored even if Kerberos app quits unexpectedly.

* Up version to 1.6b4.  Update copyright string to say 2002.

1/25/02:

* Up version to 1.6b5 in both plists and rsrc file.

* Recompiled with CodeWarrior Pro 7.2.  No changes needed to do this.

1/29/02:

* New KerberosManager.icns that isn't identical to the "valid tickets" dock icon state.

* Add showTicketListAtStarup member to prefs structure in CKrbPreferences.h.

* Add msg_PrefsShowTicketListAtStartupChanged, GetShowTicketListAtStartup(), SetShowTicketListAtStartup() to CKrbPreferences.

* Update prefs version number to v4, adjust prefs reading and writing code accordingly.

* Add rShowTicketListAtStartupCheckbox to CKrbPrefsDialog.h .  Add support for the checkbox throughout CKrbPrefsDialog .

* In CKerberosManagerApp::CreateMainWindow(), only show main window if not on Mac OS X, or otherwise, obey "show ticket list window at startup" preference.

2/4/02:

* Remove showTicketListAtStartup member from CKrbPreferences.h, and replace with ticketListStartupDisplayOption, ticketListLastOpen members.  Add relevant accessors, update prefs reading and writing code.

* Update prefs version number to v5.

* In CKerberosManagerApp::CreateMainWindow(), decide whether to show main window based on ticketListStartupDisplayOption, ticketListLastOpen.

2/5/02:

* Add DoQuit override to CKerberosManagerApp so we can save the open/close state of the ticket list window to the prefs, if we're supposed to.

* Edit KM Options View ppob to include radio buttons for ticket list startup state, replacing "show ticket list at startup" checkbox.

* Lots of changes to CKrbPrefsDialog to accomodate new ticket list startup state radio buttons, remove code referring to "show ticket list at startup" checkbox.

* Rename CKrbPrefsDialog::CopyPrefsToSettings() to CopyPrefsToDialogSettings(), CKrbPrefsDialog::CopySettingsToPrefs() to CopyDialogSettingsToPrefs() for clarity.

* Increase version number to 1.6fc1, 4.0fc1 in .rsrc and plists.

* 4.0fc1 declared.

2/8/02:

* Increase version number to 1.6fc2, 4.0fc2 in .rsrc and plists.

2/12/02:

* Switch ControlsLib, WindowsLib, and AppearanceLib to be weak-linked in 9 and 9 debug builds.  This addresses problems running KCP on Mac OS 8.1.

2/19/02:

* Changed version number to 1.6, 4.0 final in .rsrc and plists.

* Released Kerberos (app, CP) 1.6 final.

3/20/02:

* Changed a lot of #includes to be ifdefed on either __APPLE_CC__ or __MWERKS__ in attempt to get things working under ProjectBuilder.

* New file: KM_Headers.MOd.ph prefix header for ProjectBuilder debugging build

* Added pbxproj file.

* CVS removed the following long out of date files:
	LAMPopupButtonImp.h
	LEditTExt.h
	CSharedLibraryGlue.c
	CSharedLibraryGlue.h
	CTicketKeeperLibGlue.c
	CTicketKeeperLibGlue.h
	CPrincItem.h
	CPrincItem.c
	CStr255Comparator.h
	CAMInvalPushButton.h
	CChangePasswordDialog.h
	CDialogBoxNoDefaultOutline.h
	CLoginDialog.h
	Carbon.Info.plist

* Deleted Kerberos CP.CB, Kerberos CP.CBd targets; we really don't care about CFM Carbon anymore.

* All references to Carbon libraries for OS 9 removed as well.

* Upped version number to 1.7a1 in .rsrc file and plists.

* Remove inclusion of old Carbon.plist from KerberosManager.r .  

4/2/02:

* Changed a lot of #includes to be #if on TARGET_RT_MAC_CFM or TARGET_RT_MAC_MACHO (instead of __MWERKS__ and __APPLE_CC__), since headers have changed in the new framework layout.

* Replaced old copies of private libs with copies from new repository.  We'll need to update the KM modules file eventually to deal with this.

4/3/02:

* Add some typecasts to Login Library calls to make the compiler happy again the new framework on Mach-O.

4/5/02:

* Moved to new, Mac OS X-only repository.  Many files renamed from "KerberosManager.*" to "KerberosApp.*".

* Renamed CTicketListCredentialstem.cp file (note missing "I" before "tem") to CTicketListCredentialsItem.cp .

* Updated project to refer to renamed files.

* Removed 9 targets.

* Removed reference to Kerberos MDEF, which was 9-only.

* Renamed Mach-O targets.

* Updated access paths to new tree layout.

* No more PrivateWrappersLib, PrivateMoreFilesLib, PrivateDebuggingLib.  Point directly to sources in the tree.

* Updated plists to refer to new name of icns file.

* Add braces to some switch statements to protect variables declared in cases, in CKrbPrefsDialog.cp and other files.

* Remove unused variable prefsSize from CKrbPreferences::InitializeMiscPrefsFromHandle() .

4/8/02:

* Added .icns to pbx project, filled out Info.pList information.

4/9/02:

* Specified PP_PowerPlant namespace for all PowerPlant things in CTextColumnColorized.h, and added PP_Using_Namespace_PowerPlant to top of CTextColumnColorized.cp to make gcc3 happy.

* Add PowerPlant namespace stuff throughout all KerberosApp custom classes.

* Change some UProfile assigns to UProfile constructors with parameters in CEditRealmsDialog.cp to make gcc3 happy.

* Add second egg option to CBSDAttachment and CKMMainWindow .

4/10/02:

* Add copy of PowerPlant 2.2 to project, rename it PrivatePowerPlant.  Redo all Powerplant file references in pbx project to point at that and group relative.  Remove some unused files.

* Remove some unused variables and commented out code and fix a signed vs. unsigned warning in CPrincList.cp.

* Remove some unused variables and fix a signed vs. unsigned warning in CKMMainWindow.cp.

4/12/02:

* #ifdef the two [] operators of LString.cp in PowerPlant because they make gcc3 spew a zillion errors.

* Go through and eliminate some unused variables, typecast some things to make gcc happy.

4/23/02:

* Remove old 32x32 icon resources ID 128 from resources, as well as FREF and BNDL.  They're not used on Mac OS X anymore, and they seem to occasionally confuse the Mac OS X finder into using the old icons.

* Add code to CKerberosManagerApp::ShowAboutBox() to display version number of new 4.5 framework.

5/23/02:

* Remove bogus resetting of data back to beginning of addresses array in v5 ticket IP address parsing in CTicketInfoWindow.cp.

5/30/01:

* Increased sleep time passed to WNE by setting mSleepTime in CKerberosManagerApp constructor.  This improves performance.

* Told PowerPlant to use Carbon timers for periodical tasks by setting PP_Uses_Periodical_Timers to be 1 in all the prefix headers.

* In CKMMainWindow::FinishCreateSelf(), pass 0.5 seconds as the timer firing time to the idler.

* In CKrbSession::FinishCreateSelf(), pass 0.5 seconds as the timer firing time to the idler.

5/31/02:

* Add exception handling to CPrincList::UpdateListFromCache() .  This handles some of the cases where the cache changes unexpected while the list is being redrawn.

* Add more exception handling and special-case certain errors not to show asserts in CKrbSession::GetCacheInfo() to handle cases where ccache changes unexpectedly while it's being drawn.

* Add error handling for cache changing during CKrbSession::SetPrincipalAsDefault() .

6/3/01:

* More checks to CKrbSession for the CCache disappearing unexpected.

6/4/01:

* Add kTicketInvalidPostDate constant to CTicketListItem.h .

* Add support for correctly indicating post-dated tickets in CKMMainWindow::UpdateActiveUserInfo() .

* Add support for correcling indicating post-dated tickets in CPrincList::DrawCell().

* Add checks for post-dated tickets throughout CKrbSession.

* Add support for correcting indicating post-dated tickets in CTicketInfoWindow.

* Change everything from "PostDated" to "Need(s)Validation", which we decided was a more accurate term.

6/5/02:

* Add CFBundleIdentifier to Info.plists used by CodeWarrior.

6/6/02:

* Add keys for CFPreferences tp use to CKrbPreferences.cp.

* Add CFPreferences writing code to CKrbPreferences::WritePrefsToDisk().

* Add new function CKrbPreferences::InitializeFromCFPreferences().

* Eliminate CKrbPreferences::InitializeFromApplDefaults(), we aren't supporting resource-based prefs so this function is no longer appropriate (and there's no need to support it for backwards compatibility, since it was just internal anyway).

* Remove applications copy of resource-based prefs from KerberosApp.rsrc.

* Remove PICT ID 200, the old Kerberos Manager banner, from KerberosApp.rsrc.

* Gut CKrbPreferences::WritePrefsToDisk() so that it just does CFPrefs stuff.

* First thing CKrbPreferences::InitKrbPreferences() does it call InitializeFromCFPreferences().

* Rename CKrbPreferences::InitializeFromPrefsFile() to InitializeFromPrefsResourceFile() .

* Rename kCurrentTMMiscPrefsVersion to kCurrentKMMiscPrefsVersion .

* Don't try to get full path name to display in "can't save prefs" dialog in CKrbPreferences::PrefsChanged() , since we aren't using the KerberosPreferences library (which had that info) anymore.

* Remove section of code in CKrbPreferences::InitializeFromPrefsResourceFile() that tried to create prefs file for future use if one couldn't be found at that time.  We don't want to do that.

* CKrbPreferences::WritePrefsToDisk() now returns Boolean instead of OSErr.

* Remove CKerberosManagerApp::LaunchDateTime(), since it's not used anymore.

* Remove msg_LaunchDateTime from CKerberosManagerApp, since it's not used anymore.

* Remove PICT ID 130 (Date Time control panel icon) from KerberosApp.rsrc, since it's not used anymore.

* Remove CKerberosManagerApp::CheckLocation(), since it's not used anymore.  Remove related constants and resources.

* Remove CKerberosManagerApp::LaunchTicketKeeper(), since it's not used anymore.  Remove related constants and messages.

* Remove CKerberosManagerApp::Initialize() checks for CFM libraries, since we aren't using them anymore.

* Change all dialog text references to "Kerberos control panel" to "Kerberos application."

* Don't include KerberosDebug.h in the precompiled headers for CodeWarrior builds.  This causes asertions to fire silently.

* Unchecked references to MoreFiles files in pbproj file, since we don't need them anymore.

* Removed references to MoreFiles files in CW project file, since we don't need them anymore.  Removed access paths to them.

* Increased version number to "1.7.3" in pbproj file.

* Increased version number to 1.7a3 in rsrc file.

6/17/02:

* Modify size of buttons in Main Window and Prefs window ppobs so that they fit new Jaguar metrics.

* Call UnregisterIconRef *after* ReleaseIconRef in CKMMainWindow::UpdateDockIcon().  This is the correct order, and fixes a major memory leak under Jaguar.

* Increased version number to 1.7b1.

6/18/02:

* Made sure KLPrincipals are disposed of when exceptions are thrown in CKrbSession.cp.

* Made sure any principals in the ticket list array are disposed of when an exception is thrown in CKrbSession::GetCacheInfo().

* Don't try to update the minimized window's icon twice in CKMMainWindow::UpdateActiveUserInfo().  This was an attempt to work around failings of this feature to work quit right in Puma, and those issues seem to have been resolved in Jaguar.

* Changed version number to 1.7fc1.

6/19/02:

* After disposing of all principals in CKrbSession::GetCacheInfo(), set them to nil, so that if we jump out of the loop at the wrong time due to an exception, the excption cleanup code doesn't try to double-dispose.

* Disable the ticket array cleanup code in  CKrbSession::GetCacheInfo() for fear of causing crashes.

* Changed version number to 1.7.

6/21/02:

* CKMMainWindow::UpdateDockIcon() now draws the icon using a CGContext instead of a GrafPtr.  This solves the "can't draw non-square icons" problem.  The time remaining drawing remains QuickDraw based for now.

* Defined new Txtr in the KerberosApp.ppob called "Dock Time Remaining Font" and new #define for it in KerberosManagerApp.h .

* Version to 1.7.1.

6/24/02:

* Remove mK5Context member from CKrbSession.  It wasn't being used anymore, and caused a problem if there was no config file, causing the CKrbSession constructor to throw.

* Added check for KRB5_CONFIG_CANTOPEN error to CKrbSession::SpendTime() and give appropriate message.

* Don't give error message in CKrbPreferences when finding an old-style resource prefs file fails after finding a CFPrefs file failed; just continue to hardcoded defaults.

* Don't display times with N days + 0-5 mins as red text in the ticket list.

* Change way over a day long tickets are displayed in the ticket list to a more attractive format.

1/28/03:

* Removed calls to KLSetApplicationOptions() in CKerberosManagerApp and login event filter function.

2/25/03:

* Turned on pre-compiled header support in pbproj.

* Replaced private copies of LAMControlImp.cp, LAMControlImp.h, LAMPopupButtonImp.cp, LAMPopupButtonImp.h, LAMStaticTextImp.cp, LAMStaticTextImp.h, LControlImp.cp, LControlImp.h with CW 8/PP 22.1 versions to avoid linker errors.

* Replaced local copy of UGAColorRamp.cp, UGAColorRamp.h to match CW 8.2/PP 2.2.1 in order to avoid "illegal function overload" error.

* Updated CW project file to work with CodeWarrior 8.

* Updated PowerPlant version check in CKerberosManagerApp.cp for 2.2.1.

2/26/03:

* Added a bunch of new text traits called TicketItemFoo to the ppob and to CTicketItem.h .  We will use these instead of GenevaFoo.  Currently these are set to System Font size 10 plus modifiers.

* Changed constructors of various CTicketItem classes to use new font constants.

* Messed around with CPrincList::HiliteCellActively() and CPrincList::HiliteCellInactively() to draw highlighting first, then text, to avoid anti-alising looking terrible on highlighted cells.

2/27/03:

* Don't call UpdateActiveUserInfo() with forceUpdate in CPrincList::ClickSelf().  This was unnecessary, and caused extra flicker and slowness.

* Don't call QDFlushPort in CKMMainWindow::UpdateActiveUserInfo(); that was a failed attempt to get a minimized window to update.  It was extra.

2/28/03 - 5/8/03:

* More work on cleaning up aliased text, especially in Edit Favorite Realms dialog.

* Added field for DNS realms to Edit Favorite Realms dialog.

5/9/03:

* Added support for KLRenewInitialTickets() to CKrbSession::DoRenew() .

* Removed all the Mac OS 9 and less OS version checks.

* Removed Kerberos.r, all the stuff in there applied to Mac OS 9.  (This is only relevant to the CW build.)

* Chagned ticket list to use 11-point Lucida Grande in attempt to avoid ugliness on systems with anti-alias set low.

* Increased kCellHeight in CPrincList.h to 16 from 15 to accomodate larger point size text.

* Changed Apple menu ppob to put separator after "About Kerberos" menu item.  Should have done that a long time ago...

5/13/03:

* Ripped out stuff in CKrbPrefsDialog.h and .cp, and ppob for prefs dialog that were for OS 9 and Classic.

* Renumbered enums to account for removal of OS 9 items and addition of Ticket Options tab.

* Split "Ticket Options" prefs tab into two tabs, "Username Defaults" and "Ticket Defaults", to make room for new items.

* Make field for username default larger.

* Move ticket lifetime slider to be top item in Ticket Lifetime tab.

* Redo code in CKrbPrefsDialog.cp to account for tab changes.

* Removed "Always proxiable" checkbox and replaced it with "Always addressless tickets" checkbox in ppob.

* Removed support for setting proxiable option in CKrbPrefsDialog.cp.

* Added support for setting addressless option in CKrbPrefsDialog.cp.

5/14/03:

* Added Reneable checkbox and slider to prefs dialog - changes to ppobs and CKrbPrefsDialog.cp and .h .

* CPrincList::DrawCell() no longer draws ticket flag indicators for each ticket item.

5/15/03:

* Added Renewable Lifetime Range fields to Prefs dialog - changes to ppobs and CKrbPrefsDialog.cp and .h .

5/16/03:

* Added "Renewable until:" lifetime to ticket info window for v5 tickets.  Changes to ppobs and CTicketInfoWindow.cp.

* Return of the proxiable checkbox.

* Beautified Ticket Info Window and Main Window so they look good when Font Smoothing is set to 11 and larger (previously only looked good for 9 and larger).

5/19/03:

* New function CKrbPrefsDialog::SetSliderCaption() for displaying slider times as nice text.  Replaced code that changed Renewable Time slider caption with call to it.

5/20/03:

* Fix tab group order of Time Ranges ppob.

* Fix conversion of default renewable time from slider to time range edit fields.

* Lifteime slider now uses SetSliderCaption() as well for time display.

* New function CKrbPrefsDialog::SetSliderRangeAndIncrement() to make slides behave like login dialog ones - with nice rounded increments that change as the size of the range changes.

* New CKrbPrefsDialog members: mLifetimeSliderIncrement, mRenewSliderIncrement.

* Update lifetime slider code to use SetSliderRangeAndIcrement().

5/29/03:

* Removed krbdev@mit.edu address from the about box.

5/30/03:

* Renewable slider now uses SetSliderRangeAndIncrement() .

* Sliders in prefs dialog have more ticks.

* Removed default ticket lifetime and default renewable lifetime edit fields from the "Lifetime Ranges" panel to avoid conflicts with sliders which could set seconds, and the edit fields couldn't.  Also simplified code.

* More frobbing to get the slider range and increment stuff actually working properly.  It does.

6/2/03:

* Added "days" edit fields to the ticket lifetime range edit fields.

* Added a couple lines to CPrincList::ClickCell() so that double-clicking on credentials lines displays the ticket info window.

6/6/03:

* Improved spacing of lines in about box.

* Fixed ribbing misalignments in prefs dialog.

* Fixed ppob ID numbers on prefs panes so that "display time remaining in dock icon" preference works again.

6/9/03:

* Added IsTicketRenewable() method to CTicketListItem and CTicketListCredentialsItem .

6/10/03:

* Added mTicketStartTime to CTicketListItem (and descendents).  Modified constructors to take inStartTime.

* Add GetItemStartTime(), SetItemStartTime() methods to CTicketListItem .

* Get ticket start times in CKrbSession::GetCacheInfo and pass them into ticket items when created.

* Add CKrbSession::DoAutoRenew() .

* Add CPrincList::CheckPrincipalsForAutoRenew() to scan the list for principals to auto-renew.

* Add mPrincipalIsRenewable, SetPrincipalIsRenewable(), IsTicketRenewable() to CTicketListPrincipalItem.

* Add code to CKrbSession::GetCacheInfo() to determine whether principal should be considered renewable while iterating through the principal's creds, and set the princItem accordingly.

* Add call to CheckPrincipalsForAutoRenewal() to UpdateActiveUserInfo() .

6/11/03:

* Add "Auto renew renewable tickets" to "Display Options" panel ppob.

* Add resource constant for auto renew tickets to CKrbPrefsOptions.h.

* Add code to read and set auto renew tickets checkbox to CKrbPrefsOptions.cp.

* Add autoRenewTickets to mPrefs structure in CKrbPreferences .

* Increase current prefs version to 7 in CKrbPreferences .

* Add code to read and save the auto renew tickets preference to CKrbPreferences .

* Add check for auto-renew prefs to CKMMainWindow::UpdateActiveUserInfo() before calling CheckPrincipalsForAutoRenewal() .

* Modify error dialog to get rid of silly group box.

* Renamed "Display Options" prefs tab to "Other Options".

* CKrbSession::DoAutoRenew() now returns Boolean based on whether it succeeded or not.

* Add mRenewAttemptHalflife, SetRenewAttemptHalflife(), GetRenewAttemptHalflife() to CTicketListPrincipalItem .  Initialize mRenewAttemptHalflife in the constructor.

* Add code to CPrincList::CheckPrincipalsForAutoRenewal() to decrement mRenewAttemptHalflife when renewal fails, and to not attempt renewals after the tickets have expired.

6/17/03:

* New icons, with grey rounded square and embossed keys.

* Time remaining in icon is now black instead of white, and moved up a pixel.

6/24/03:

* Adjust size of prefs and ticket info views to accomodate larger group boxes on Panther.  Fix other small alignment issues.

* Make active user info subitems of active user group in main window to fix Panther drawing problems.

* Changes to CKMMainWindow::DoSetBounds() to account for active user items being subitems of active user group box.

* CEditRealmsDialog::FillAllRealmsTable() now copes if there's not a configuration file.

6/25/03:

* "Show Ticket List" now has key equivalent of command-T.

7/10/03:

* "Other Options" tab in Prefs renamed to "Behavior."

* Another set of new icons.

7/11/03:

* Add CKrbPrefsDialog::ValidateTimeRangeValues() to give error messages if there's a problem with the lifetime edit fields (min greater than max).

* Add call to ValidateTimeRangeValues() to CKrbPrefsDialog::CopyDialogSettingsToPrefs().

* Add call to ValidateTimeRangeValues() to CKrbPrefsDialog::ListenToMessage() when switching to a different panel, and switch back to lifetime range panel if it fails.

* Improve display of single-digit time values in lifetime range edit fields by always appending 0 in front of them for hours and minutes fields.

7/14/03:

* Tell LDebugMenuAttachement that ZoneRanger is never present by setting zrPresent to false no matter what the results of the search in LDebugMenuAttachment::PreprocessMenu().  If ZoneRanger had been installed previously and deleted, the PP search turned up the wrong answer, causing
Kerberos.app to assert and refuse to run.

* Initialize autoRenewTickets pref in CKrbPreferences::InitializeFromHardcodedDefaults() .

* Delete CKrbPreferences::InitializeFromPrefsResourceFile() and related function InitializeFromHandle() .  We no longer support reading legacy resources file, and we no longer depend on the deprecated KerberosPreferencesLib .

* Delete some old resource preferences-related consts from CKrbPreferences.cp .

7/16/03:

* Comment out call to UpdateCollapsedWindowDockTile() in CKMMainWindow::UpdateActiveUserInfo() .  It doesn't work right half the time, and I'm suspicious that might be a memory leak.  So folks will just have to deal with minimized windows not updating.

* Swapped position of "Display time in dock icon" and "Always renew renewable tickets" checkboxes in prefs.

8/20/03:

* Moved Ticket List labels back out of group box hierarchy in Main Window ppob so they're visible again.

* Updated CW project to reflect new location of Kerberos.rsrc file.

8/22/03:

* Make version string reading in CKerberosManagerApp::ShowAboutBox() safe for Japanese and other things that use two bytes for characters.

9/17/03:

* Changed CKrbPreferences::PrefsChanges() to take a parameter saying whether it should display an error if the write failed.  This is to avoid displaying an error if a user moves the window but prefs aren't writable for some reason.

* CKrbPrefereces::SetMainWindowRect() sends "false" to PrefsChanged().