windows-nt/Source/XPSP1/NT/net/sfm/uam/uam5src/uamsrc/uamutils.c
2020-09-26 16:20:57 +08:00

1 line
9.8 KiB
C

// ===========================================================================
// UAMUtils.cp © 1997 Microsoft Corp. All rights reserved.
// ===========================================================================
// General utilities used by the Microsoft User Authentication Method.
//
// ===========================================================================
#include <Errors.h>
#include <String.h>
#include <stdio.h>
#include "UAMDebug.h"
#include "UAMUtils.h"
#include "UAMNetwork.h"
#include "UAMDialogs.h"
// ---------------------------------------------------------------------------
// ¥ UAM_PStrCopy()
// ---------------------------------------------------------------------------
// Custom routine for copying pascal style strings. Copies inSrcString into
// inDestString. Careful here since this routine doesn't know how long a
// string can be, don't copy a 255 byte string into a 32 byte string. BOOM!
void UAM_PStrCopy(const StringPtr inSrcString, StringPtr inDestString)
{
Assert_(inSrcString != NULL);
Assert_(inDestString != NULL);
BlockMove(inSrcString, inDestString, inSrcString[0] + 1);
inDestString[0] = inSrcString[0];
}
// ---------------------------------------------------------------------------
// ¥ UAM_AppendPStr()
// ---------------------------------------------------------------------------
// Custom routine for appending one pascal style string to another.
// inAppendStr in pasted to the end of inBase. inDestSize if the maximum size
// the new string can be.
void UAM_AppendPStr(Str255 inBase, const Str255 inAppendStr, short inDestSize)
{
Assert_(inBase != NULL);
Assert_(inAppendStr != NULL);
Assert_(inDestSize > 0);
short charsToCopy = inAppendStr[0];
if ((inBase[0] + charsToCopy) > (inDestSize - 1)) {
charsToCopy = inDestSize - 1 - inBase[0];
}
BlockMove(inAppendStr + 1, inBase + inBase[0] + 1, charsToCopy);
inBase[0] += charsToCopy;
}
#pragma mark-
// ---------------------------------------------------------------------------
// ¥ UAM_FrontWindowRect()
// ---------------------------------------------------------------------------
// Returns the rect of the front-most window is global coordinates.
void UAM_FrontWindowRect(Rect *outWindowRect)
{
WindowPtr theWindow = FrontWindow();
Point thePoint;
Rect theRect;
theRect = theWindow->portRect;
thePoint.h = theWindow->portRect.left;
thePoint.v = theWindow->portRect.top;
LocalToGlobal(&thePoint);
theRect.left = thePoint.h;
theRect.top = thePoint.v;
thePoint.h = theWindow->portRect.right;
thePoint.v = theWindow->portRect.bottom;
LocalToGlobal(&thePoint);
theRect.right = thePoint.h;
theRect.bottom = thePoint.v;
*outWindowRect = theRect;
}
// ---------------------------------------------------------------------------
// ¥ UAM_GetUserName()
// ---------------------------------------------------------------------------
// Returns the default user name as set in the Sharing Setup/File Sharing
// dialogs. This would also be considered the old 'Chooser' name.
void UAM_GetUserName(StringPtr outUserName)
{
StringHandle theString = NULL;
outUserName[0] = 0;
theString = GetString(STR_ChooserUserName);
if (theString != NULL)
{
UAM_PStrCopy(*theString, outUserName);
}
}
// ---------------------------------------------------------------------------
// ¥ UAM_GetWorkStationName()
// ---------------------------------------------------------------------------
// Returns the workstation name as set in the Sharing Setup/File Sharing
// dialogs.
void UAM_GetWorkStationName(Str255 outWSName)
{
StringHandle theString = NULL;
outWSName[0] = 0;
theString = GetString(STR_Sys7WorkStationName);
if (theString != NULL)
{
HLock((Handle)theString);
UAM_PStrCopy(*theString, outWSName);
HUnlock((Handle)theString);
}
}
// ---------------------------------------------------------------------------
// ¥ UAM_AFPClientSupportsOurUAM
// ---------------------------------------------------------------------------
// Returns TRUE if the client we're on is running AppleShare Client 3.8
// or later.
Boolean UAM_AFPClientSupportsOurUAM(void)
{
short theCfgWord;
short theVersion = UAM_AppleShareVersion(&theCfgWord);
if (theVersion <= gestaltAFPClient3_7_2)
{
StopAlert(ALRT_WrongClientVers, NULL);
return(false);
}
return(true);
}
#pragma mark-
// ---------------------------------------------------------------------------
// ¥ UAM_VersionString
// ---------------------------------------------------------------------------
// Returns a string containing the version of this build.
void UAM_VersionString(Str32 outVersionString)
{
Handle theVersHandle;
long theVersion;
unsigned char theVer1, theVer2, theVer3, theRelStatus, thePrereleaseNum;
Str32 theTempStr;
outVersionString[0] = 0;
UAM_PStrCopy("\pv", outVersionString);
theVersHandle = Get1Resource('vers', 1);
if (theVersHandle)
{
theVersion = *((long *)(*theVersHandle));
ReleaseResource(theVersHandle);
theVer1 = ((char *)&theVersion)[0];
theVer1 = (((theVer1 & 0xF0) >> 4) * 10) + (theVer1 & 0x0F);
theVer2 = (((char *)&theVersion)[1] & 0xF0) >> 4;
theVer3 = (((char *)&theVersion)[1] & 0x0F);
theRelStatus = ((char *)&theVersion)[2];
thePrereleaseNum = ((char *)&theVersion)[3];
NumToString((long)theVer1, theTempStr);
UAM_AppendPStr(outVersionString, theTempStr, sizeof(Str32));
UAM_AppendPStr(outVersionString, "\p.", sizeof(Str32));
NumToString((long)theVer2, theTempStr);
UAM_AppendPStr(outVersionString, theTempStr, sizeof(Str32));
if (theVer3 != 0)
{
UAM_AppendPStr(outVersionString, "\p.", sizeof(Str32));
NumToString((long)theVer3, theTempStr);
UAM_AppendPStr(outVersionString, theTempStr, sizeof(Str32));
}
switch(theRelStatus)
{
case 0x20:
UAM_AppendPStr(outVersionString, "\pd", sizeof(Str32));
break;
case 0x40:
UAM_AppendPStr(outVersionString, "\pa", sizeof(Str32));
break;
case 0x60:
UAM_AppendPStr(outVersionString, "\pb", sizeof(Str32));
break;
default:
break;
}
if (theRelStatus != 0x80)
{
NumToString((long)thePrereleaseNum, theTempStr);
UAM_AppendPStr(outVersionString, theTempStr, sizeof(Str32));
}
}
}
// ---------------------------------------------------------------------------
// ¥ UAM_GetAFPInfo
// ---------------------------------------------------------------------------
// Return the AFP version string and the default user name.
void UAM_GetAFPVersionString( AFPSrvrInfo *inInfo,
ClientUAMCallbackRec *inCallbacks,
Str32 &ioAFPVersion,
Str32 &ioDefaultUserName )
{
struct AFPClientInfo *theClientInfo = NULL;
short theIndex;
StringPtr theVersionBuf;
UInt32 theVersionBufSize;
Boolean theResult;
#if GENERATING68K
OSStatus theError;
#endif
Assert_(inCallbacks != NULL);
Assert_(inInfo != NULL);
Assert_(ioAFPVersion != NULL);
Assert_(ioDefaultUserName != NULL);
ioAFPVersion[0] = 0;
ioDefaultUserName[0] = 0;
if ((inCallbacks) && (inInfo))
{
//
//Use the UAM callback GetClientInfo() to get the client info.
//
#if GENERATING68K
theError = inCallbacks->GetClientInfoUPP(kAFPClientInfo, (ClientInfo **)&theClientInfo);
if (theError != noErr)
{
UAM_ReportError(theError);
return;
}
#else
CallUniversalProc( inCallbacks->GetClientInfoUPP,
kGetClientInfoProcInfo,
kAFPClientInfo,
(ClientInfo **)&theClientInfo );
#endif
Assert_(theClientInfo != NULL);
if (theClientInfo)
{
//
//Stuff the default user name in the return parameter.
//
UAM_PStrCopy(theClientInfo->fDefaultUserName, ioDefaultUserName);
//
//Go through the list of AFP versions supported on this client
//and try to find them in the SrvrInfoBuffer, first match
//succeeds.
//
theVersionBuf = (StringPtr)((UInt32)inInfo + inInfo->fVerCountOffset + 1);
theVersionBufSize = (inInfo->fUAMCountOffset - inInfo->fVerCountOffset) - 1;
for (theIndex = 0; theIndex < theClientInfo->fNumAFPVersions; theIndex++)
{
theResult = UAM_FindStringInBuffer(
theClientInfo->fAFPVersionStrs[theIndex],
theVersionBuf,
theVersionBufSize );
if (theResult)
{
UAM_PStrCopy(theClientInfo->fAFPVersionStrs[theIndex], ioAFPVersion);
return;
}
}
}
}
}
// ---------------------------------------------------------------------------
// ¥ UAM_FindStringInBuffer
// ---------------------------------------------------------------------------
// Finds a pascal string within a buffer.
Boolean UAM_FindStringInBuffer(StringPtr inString, StringPtr inBuffer, short inBufferSize)
{
short i = 0;
short theLen;
theLen = inBuffer[i];
while(TRUE)
{
if (memcmp(&inBuffer[i], inString, theLen + 1) != 0)
{
i += theLen + 1;
theLen = inBuffer[i];
if (i >= inBufferSize)
break;
}
else {
return(TRUE);
}
}
return(FALSE);
}
// ---------------------------------------------------------------------------
// ¥ UAM_AppleShareVersion()
// ---------------------------------------------------------------------------
// Returns the version of AppleShare running on the host computer.
short UAM_AppleShareVersion(short *upperWord)
{
long theResult;
OSErr theError;
theError = Gestalt(gestaltAFPClient, &theResult);
if (!theError)
{
if (upperWord != NULL) {
*upperWord = (theResult & gestaltAFPClientAttributeMask);
}
return(theResult & gestaltAFPClientVersionMask);
}
return(0);
}
// ---------------------------------------------------------------------------
// ¥ UAM_KeyDown()
// ---------------------------------------------------------------------------
// Returns TRUE if the passed keycode is currently held down.
Boolean UAM_KeyDown(Int16 inKeycode)
{
KeyMapByteArray theKeyMap;
GetKeys((UInt32*)theKeyMap);
return((theKeyMap[inKeycode>>3] >> (inKeycode & 7)) & 1);
}