#include "windows.h" #include "global.h" #include "extmgr.h" #include "stdnames.h" #include "nsfnote.h" #include "nsferr.h" #include "odserr.h" #include "osmem.h" #include "oserr.h" #include "misc.h" #include "nsfdb.h" #include "textlist.h" #include "addin.h" #include "adminp.h" #include "dname.h" WORD gRecursionID; FARPROC gHandlerProc; CRITICAL_SECTION gCriticalSection; BOOL gHooksRegistered = FALSE; HINSTANCE hDllInstance = (HINSTANCE) 0; HEMREGISTRATION hRetRegistration; #define PROXY_DATABASE "admin4.nsf" #define MAILBOX_NAME "mail.box" #define SUBJECT "Your new home server" #define BODY_TEXT_1 "This weekend, your home server is being changed to " #define BODY_TEXT_2 ". Please change references from your old home server to your new home server in Connection, Locations, and Account documents in your Personal Address Book" #define BODY_TEXT_3 " and in the Access Control List of any local replicas of your mail file" /****** LOCAL FUNCTION PROTOTYES ******************************************/ STATUS FAR PASCAL MainEntryPoint( void ); BOOL WINAPI LibMain( HINSTANCE hInstance, DWORD fdwReason, LPVOID lpReserved ); STATUS FAR PASCAL EMHandlerProc( EMRECORD FAR *pRecord ); NotesSDKMainModule /*************************************************************************/ /***************************************************************************/ STATUS FAR PASCAL EMHandlerProc( EMRECORD FAR *pRecord ) { STATUS sStatus = NOERROR; BYTE szWrk[MAXWORD]; BYTE szMessage[MAXSPRINTF]; BYTE *pTmp = NULL, *pHold = NULL; WORD wRetLen, wLen, i, j; WORD wListSize, wNumEntries, wEntNum = 0; BYTE *pList = NULL; BYTE szName[MAXUSERNAME], *pRetText = NULL, szRetName[MAXUSERNAME]; WORD wEntryNum, wDataType, wRetTextLen = 0; DWORD dwValueLen; BLOCKID bidValue; if (EM_ADMINPPROCESSREQUEST == pRecord->EId) { VARARG_PTR pArgs; NOTEHANDLE nhReplaceMailReqNoteHandle; NOTEHANDLE nhReplaceMailRespNoteHandle; pArgs = pRecord->Ap; nhReplaceMailReqNoteHandle = VARARG_GET(pArgs, NOTEHANDLE); nhReplaceMailRespNoteHandle = VARARG_GET(pArgs, NOTEHANDLE); if ((nhReplaceMailReqNoteHandle != NULLHANDLE) && (nhReplaceMailRespNoteHandle != NULLHANDLE)) { char chTextBuffer[MAXSPRINTF]; memset(chTextBuffer, sizeof(chTextBuffer), 0); if (NSFItemGetText( nhReplaceMailReqNoteHandle, ADMINP_ACTION_ITEM, chTextBuffer, sizeof(chTextBuffer) - 1) != 0) { /* a successful Replace Mail File Fields request? */ if ((memcmp( chTextBuffer, AdminpReplaceMailFileFields, sizeof(AdminpReplaceMailFileFields) - 1) == 0) && (NSFItemIsPresent( nhReplaceMailRespNoteHandle, ADMINP_LOG_STATUS_ITEM, (sizeof(ADMINP_LOG_STATUS_ITEM) - 1)) == FALSE)) { if (EM_AFTER == pRecord->NotificationType) { DBHANDLE dbhAdminpDbHandle; if ((sStatus = NSFDbOpen(PROXY_DATABASE, &dbhAdminpDbHandle)) == NOERROR) { NOTEHANDLE nhPushChangesReqNoteHandle; /* copy the fields into the Push Changes to New Mail Server request replacing the action and the server */ if ((sStatus = NSFNoteCopy(nhReplaceMailReqNoteHandle, &nhPushChangesReqNoteHandle)) == NOERROR) { OID FAR retOID; if ((sStatus = NSFDbGenerateOID(dbhAdminpDbHandle, &retOID)) == NOERROR) { NSFNoteSetInfo(nhPushChangesReqNoteHandle, _NOTE_OID, &retOID); NSFNoteSetInfo(nhPushChangesReqNoteHandle, _NOTE_ID, NULL); NSFNoteSetInfo(nhPushChangesReqNoteHandle, _NOTE_DB, &dbhAdminpDbHandle); if ((sStatus = NSFItemDelete( nhPushChangesReqNoteHandle, ADMINP_ACTION_ITEM, sizeof(ADMINP_ACTION_ITEM) - 1)) == NOERROR) { if ((sStatus = NSFItemAppend(nhPushChangesReqNoteHandle, ITEM_SIGN | ITEM_SUMMARY | ITEM_PROTECTED, ADMINP_ACTION_ITEM, (sizeof(ADMINP_ACTION_ITEM) -1), TYPE_TEXT, AdminpLastPushToNewMailServer, sizeof(AdminpLastPushToNewMailServer) - 1)) == NOERROR) { if (NSFItemGetText( nhReplaceMailReqNoteHandle, ADMINP_DOC_MAIL_SERVER_ITEM, chTextBuffer, sizeof(chTextBuffer) - 1) != 0) { if ((sStatus = NSFItemDelete( nhPushChangesReqNoteHandle, ADMINP_DOC_SERVER_ITEM, sizeof(ADMINP_DOC_SERVER_ITEM) - 1)) == NOERROR) { if ((sStatus = NSFItemAppend(nhPushChangesReqNoteHandle, ITEM_SIGN | ITEM_SUMMARY | ITEM_PROTECTED, ADMINP_DOC_SERVER_ITEM, (sizeof(ADMINP_DOC_SERVER_ITEM) -1), TYPE_TEXT, chTextBuffer, strlen(chTextBuffer))) == NOERROR) { /* sign and save the Push Changes to New Mail Server request */ if ((sStatus = NSFNoteUpdate(nhPushChangesReqNoteHandle, 0)) == NOERROR) { NOTEID nidPushChangesReqNoteId; NSFNoteGetInfo( nhPushChangesReqNoteHandle, _NOTE_ID, &nidPushChangesReqNoteId); NSFNoteClose(nhPushChangesReqNoteHandle); nhPushChangesReqNoteHandle = NULLHANDLE; if ((sStatus = NSFNoteOpen( dbhAdminpDbHandle, nidPushChangesReqNoteId, OPEN_EXPAND, &nhPushChangesReqNoteHandle)) == NOERROR) { if ((sStatus = NSFNoteSign(nhPushChangesReqNoteHandle)) == NOERROR) sStatus = NSFNoteUpdate(nhPushChangesReqNoteHandle, 0); } } } } } } } } if (nhPushChangesReqNoteHandle != NULLHANDLE) NSFNoteClose(nhPushChangesReqNoteHandle); } NSFDbClose(dbhAdminpDbHandle); } /* if ((sStatus = NSFDbOpen */ } else { DBHANDLE dbhMailBoxHandle = NULLHANDLE; if ((sStatus = NSFDbOpen( MAILBOX_NAME, &dbhMailBoxHandle)) == NOERROR) { HANDLE hMessageHandle = NULLHANDLE; HANDLE hBodyItemHandle = NULLHANDLE; if ((sStatus = NSFNoteCreate( dbhMailBoxHandle, &hMessageHandle)) == NOERROR) { char chNewMailServerNameAbbrev[MAXUSERNAME]; if ((sStatus = NSFItemSetText( hMessageHandle, FIELD_FORM, MAIL_MEMO_FORM, sizeof(MAIL_MEMO_FORM) - 1)) != NOERROR) goto closeMessageHandle; if ((sStatus = NSFItemSetText( hMessageHandle, FIELD_TYPE_TYPE, MAIL_MEMO_FORM, sizeof(MAIL_MEMO_FORM) - 1)) != NOERROR) goto closeMessageHandle; NSFItemGetText( nhReplaceMailReqNoteHandle, ADMINP_NAME_LIST_ITEM, chTextBuffer, sizeof(chTextBuffer) - 1); if ((sStatus = NSFItemSetText( hMessageHandle, MAIL_RECIPIENTS_ITEM, chTextBuffer, strlen(chTextBuffer))) != NOERROR) goto closeMessageHandle; if ((sStatus = NSFItemSetText( hMessageHandle, MAIL_SENDTO_ITEM, chTextBuffer, strlen(chTextBuffer))) != NOERROR) goto closeMessageHandle; NSFItemGetText( nhReplaceMailReqNoteHandle, ADMINP_DOC_AUTHOR_ITEM, chTextBuffer, sizeof(chTextBuffer) - 1); if ((sStatus = NSFItemSetText( hMessageHandle, MAIL_FROM_ITEM, chTextBuffer, strlen(chTextBuffer))) != NOERROR) goto closeMessageHandle; if ((sStatus = NSFItemSetText( hMessageHandle, MAIL_SUBJECT_ITEM, SUBJECT, sizeof(SUBJECT) - 1)) != NOERROR) goto closeMessageHandle; if ((sStatus = NSFItemSetText( hMessageHandle, MAIL_DELIVERYPRIORITY_ITEM, "H", MAXWORD)) == NOERROR) { char chBodyBuffer[MAXSPRINTF * 2]; WORD wBufferLeft = MAXSPRINTF * 2; NSFItemGetText( nhReplaceMailReqNoteHandle, ADMINP_DOC_DEST_SERVER_ITEM, chTextBuffer, sizeof(chTextBuffer) - 1); DNAbbreviate( 0, NULL, chTextBuffer, chNewMailServerNameAbbrev, sizeof(chNewMailServerNameAbbrev), NULL); strncpy(chBodyBuffer, BODY_TEXT_1, sizeof(chBodyBuffer)); wBufferLeft = wBufferLeft - strlen(chBodyBuffer); strncat(chBodyBuffer, chNewMailServerNameAbbrev, wBufferLeft); wBufferLeft = wBufferLeft - strlen(chBodyBuffer); strncat(chBodyBuffer, BODY_TEXT_2, sizeof(chBodyBuffer)); wBufferLeft = wBufferLeft - strlen(chBodyBuffer); strncat(chBodyBuffer, BODY_TEXT_3, sizeof(chBodyBuffer)); if ((sStatus = NSFItemAppend( hMessageHandle, ITEM_SUMMARY, MAIL_BODY_ITEM, (sizeof(MAIL_BODY_ITEM) -1), TYPE_TEXT, chBodyBuffer, strlen(chBodyBuffer))) != NOERROR) goto closeMessageHandle; sStatus = NSFNoteUpdate(hMessageHandle, 0); } closeMessageHandle: NSFNoteClose(hMessageHandle); } /* if ((sStatus = (NSFNoteCreate*/ NSFDbClose(dbhMailBoxHandle); } /* if ((sStatus = NSFDbOpen( */ } /* if (sStatus == NOERROR) */ } /* if ((IntlTextEqualCaseInsensitive */ } /* if (NSFItemGetText( */ } /* if (nhReplaceMailReqNoteHandle != NULLHANDLE) */ } /* if (EM_ADMINPPROCESSREQUEST == pRecord->EId) */ return(ERR_EM_CONTINUE); } /***************************************************************************/ STATUS near PASCAL Reg( void ) { STATUS error = NOERROR; error = EMRegister( EM_ADMINPPROCESSREQUEST, EM_REG_BEFORE | EM_REG_AFTER, (EMHANDLER)gHandlerProc, gRecursionID, &hRetRegistration ); return(error); } /***************************************************************************/ STATUS FAR PASCAL MainEntryPoint( void ) { STATUS error = NOERROR; BYTE *pList = NULL; /* * When run on a server the dll is called multiple times. ths flag * keeps the main code from being executed more than once. */ if(gHooksRegistered) goto Done; gHooksRegistered = TRUE; gHandlerProc = (FARPROC)(EMHandlerProc); /* Next get a recursion ID for the run */ error = EMCreateRecursionID(&gRecursionID); if(!error) error = Reg(); Done: return(error); } /***************************************************************************/ BOOL WINAPI LibMain( HINSTANCE hInstance, DWORD fdwReason, LPVOID lpReserved ) { switch(fdwReason) { case DLL_PROCESS_ATTACH: InitializeCriticalSection(&gCriticalSection); gHandlerProc = (FARPROC)MakeProcInstance((FARPROC)EMHandlerProc, hInstance); break; case DLL_PROCESS_DETACH: gHooksRegistered = FALSE; FreeProcInstance( gHandlerProc ); DeleteCriticalSection(&gCriticalSection); EMDeregister(hRetRegistration); break; } return(TRUE); } /***************************************************************************/