windows-nt/Source/XPSP1/NT/net/sfm/uam/uam5src/uamsrc/uamkeychain.c

1 line
13 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
// =========================================================================== // UAMKeychain.c <09> 1999-2000 Microsoft Corp. All rights reserved. // =========================================================================== // Keychain support routines for the MS UAM. // // =========================================================================== #include "UAMDebug.h" #include "UAMUtils.h" #include "UAMMain.h" #include "UAMDialogs.h" #include "UAMNetwork.h" #include "UAMKeychain.h" Boolean gKeychainAvailable = false; Boolean gAllowedToSavePswd = false; extern Str32 gServerName; extern Str32 gUserName; extern Str32 gZoneName; extern OTAddress* gServerAddress; extern long gSupportedUAMs; // --------------------------------------------------------------------------- // <09> UAM_KCInitialize() // --------------------------------------------------------------------------- // See if the keychain is supported on this machine as well as perform some // initialization for our keychain support. void UAM_KCInitialize(UAMArgs* inUAMArgs) { UInt32 theVersion; SInt32 theResponse; OSErr theError; gKeychainAvailable = false; gAllowedToSavePswd = false; // //Do a check here to make sure that we're running on a //system version that we support. // theError = Gestalt(gestaltSystemVersion, &theResponse); if (theError != noErr) { // //If there's an error calling Gestalt(), we're in real trouble. // return; } if (LoWord(theResponse) < 0x0900) { // //We don't support any OS older than MacOS 9.0. This is //because the old Keychain (v1.01) on older systems is //not stable enough and crashes often. // return; } // //Let's see if the Apple KeyChain manager is available and //remember it. // gKeychainAvailable = KeychainManagerAvailable(); if (gKeychainAvailable) { // //Get the version of the keychain manager. OS9 uses //v2.0 and is the first shipping version. However, v1.0 //was available to pre-OS9 macs. // KCGetKeychainManagerVersion(&theVersion); // //The version is kept in the hi-word of the return. // if (HiWord(theVersion) >= 0x0200) { // //Just in case someone else turned it off, we make sure //interaction is enabled. This call is only supported in //Keychain 2.0 or later. // KCSetInteractionAllowed(true); } } // //BIT_2 of the srvr flags tells us if the user is allowed //to save their passwords in the keychain. // gAllowedToSavePswd = ((inUAMArgs->Opt.open.srvrInfo->fFlags & BIT_2) == 0); } // --------------------------------------------------------------------------- // <09> UAM_KCAvailable() // --------------------------------------------------------------------------- // Returns TRUE if the keychain is available on this machine as well as if // the AFP server allows clients to save passwords on the workstation. Boolean UAM_KCAvailable(void) { return(((gKeychainAvailable) && (gAllowedToSavePswd)) ? true : false); } // --------------------------------------------------------------------------- // <09> UAM_KCDeleteItem() // --------------------------------------------------------------------------- // Deletes a keychain item that pertains to this username & server. OSStatus UAM_KCDeleteItem( StringPtr inUserName, Str255 inServerName ) { OSStatus theStatus; KCItemRef theItem = NULL; theStatus = UAM_KCFindAppleSharePassword( inUserName, NULL, inServerName, &theItem ); if (theStatus != noErr) { // //We couldn't find an existing keychain item matching //the criteria. Bail. // return(theStatus); } Assert_(theItem != NULL); if (theItem != NULL) { // //We found the item, remove it from the keychain. // theStatus = KCDeleteItem(theItem); // //The keychain manager allocated this memory, we need to //free it. For free builds, we don't do anything if this //fails since there's nothing we or the user can do about it. // if (KCReleaseItem(&theItem) != noErr) { DbgPrint_((DBGBUFF, "KCReleaseItem() failed")); } } return(theStatus)