BOOL EncryptSignRichEditText(char** ppBuffer, long* pLength, BOOL bEncrypt, BOOL bSign, char** pAddresses, long NumAddresses, char* pAttachments, char** ppOutAttachments) { BOOL ReturnValue = FALSE; void* pOutput = NULL; long outSize = 0; PGPError error = kPGPError_NoErr; PGPOptionListRef userOptions = NULL; PGPclRecipientDialogStruct *prds = NULL; char szExe[256]; char szDll[256]; LoadString(g_hinst, IDS_EXE, szExe, sizeof(szExe)); LoadString(g_hinst, IDS_DLL, szDll, sizeof(szDll)); // allocate a recipient dialog structure prds = (PGPclRecipientDialogStruct *) calloc(sizeof(PGPclRecipientDialogStruct), 1); if (!prds) { PGPclErrorBox(g_hwndEudoraMainWindow, kPGPError_OutOfMemory); return FALSE; } error = PGPclOpenDefaultKeyrings(g_pgpContext, kPGPOpenKeyDBFileOptions_Mutable, &(prds->keydbOriginal)); if (IsPGPError(error)) error = PGPclOpenDefaultKeyrings(g_pgpContext, kPGPOpenKeyDBFileOptions_None, &(prds->keydbOriginal)); if (IsPGPError(error)) { char szTitle[255]; char szBuffer[1024]; LoadString(g_hinst, IDS_DLL, szTitle, 254); LoadString(g_hinst, IDS_Q_NOKEYRINGS, szBuffer, 1023); if (MessageBox(g_hwndEudoraMainWindow, szBuffer, szTitle, MB_YESNO)) { char szPath[MAX_PATH]; PGPclGetPath(kPGPclPGPkeysExeFile, szPath, MAX_PATH-1); PGPclExecute(szPath, SW_SHOW); } return S_FALSE; } if(prds && bEncrypt) { char szTitle[256] = {0x00}; // title for recipient dialog UINT recipientReturn = FALSE; // recipient dialog result LoadString(GetModuleHandle("PGPplugin.dll"), IDS_TITLE_RECIPIENTDIALOG, szTitle, sizeof(szTitle)); if( IsntPGPError(error) ) { prds->context = g_pgpContext; prds->tlsContext = g_tlsContext; prds->Version = kPGPCurrentRecipVersion; prds->hwndParent = g_hwndEudoraMainWindow; prds->szTitle = szTitle; prds->dwOptions = kPGPclASCIIArmor; prds->dwDisableFlags = kPGPclDisableWipeOriginal | kPGPclDisableASCIIArmor | kPGPclDisableSelfDecryptingArchive | kPGPclDisableInputIsText; prds->dwNumRecipients = NumAddresses; prds->szRecipientArray = pAddresses; // If shift is pressed, force the dialog to pop. if (GetAsyncKeyState( VK_CONTROL) & 0x8000) prds->dwDisableFlags |= kPGPclDisableAutoMode; // See who we wish to encrypt this to recipientReturn = PGPclRecipientDialog( prds ); } if (prds->keydbAdded != NULL) { PGPUInt32 numKeys; PGPKeySetRef keySet; PGPNewKeySet(prds->keydbAdded, &keySet); PGPCountKeys(keySet, &numKeys); if (numKeys > 0) PGPclImportKeys(g_pgpContext, g_tlsContext, prds->hwndParent, keySet, prds->keydbOriginal, kPGPclNoDialogForValidSingletons); PGPFreeKeySet(keySet); PGPFreeKeyDB(prds->keydbAdded); prds->keydbAdded = NULL; } if (!recipientReturn) { if (prds->keydbSelected != NULL) PGPFreeKeyDB(prds->keydbSelected); PGPFreeKeyDB(prds->keydbOriginal); free(prds); return FALSE; } } if( IsntPGPError(error) ) { error = EncryptSignBuffer(g_hinst, g_hwndEudoraMainWindow, g_pgpContext, g_tlsContext, szExe, szDll, *ppBuffer, *pLength, prds, NULL, &userOptions, &pOutput, &outSize, bEncrypt, bSign, FALSE, FALSE); } else { PGPclEncDecErrorBox(g_hwndEudoraMainWindow, error); } *pLength = outSize; if( IsntPGPError(error) ) { if( pOutput ) { *ppBuffer = (char*)HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, *ppBuffer, *pLength + 1); if(*ppBuffer) { ReturnValue = TRUE; memcpy(*ppBuffer, (char*)pOutput, *pLength); *(*ppBuffer + *pLength) = 0x00; // NULL terminate the string memset(pOutput, 0x00, *pLength); } else { error = kPGPError_OutOfMemory; } PGPFreeData(pOutput); } } // are there attachments? if(IsntPGPError(error) && pAttachments && *pAttachments) { error = EncryptAttachments( pAttachments, ppOutAttachments, prds, userOptions, bEncrypt, bSign); } if(userOptions != NULL) { PGPFreeOptionList(userOptions); } if (prds) { if (prds->keydbSelected != NULL) PGPFreeKeyDB(prds->keydbSelected); PGPFreeKeyDB(prds->keydbOriginal); free(prds); } return ReturnValue; }
PluginError PerformTranslation( short trans_id, char* in_file, char* out_file, char** addresses, emsMIMEtypeP in_mime, emsMIMEtypeP* out_mime ) { PluginError pluginReturn = EMSR_UNKNOWN_FAIL; BOOL bSign = FALSE; PGPError error = 0; PGPSize mimeBodyOffset = 0; char szExe[256]; char szDll[256]; assert(in_file); assert(out_file); LoadString(g_hinst, IDS_EXE, szExe, sizeof(szExe)); LoadString(g_hinst, IDS_DLL, szDll, sizeof(szDll)); switch( trans_id ) { case kEncryptTranslatorID: case kSignTranslatorID: case kEncryptAndSignTranslatorID: { char** RecipientList = NULL; unsigned long numRecipients = 0; PGPOptionListRef pgpOptions = NULL; PGPOptionListRef signOptions = NULL; char mimeSeparator[kPGPMimeSeparatorSize]; PRECIPIENTDIALOGSTRUCT prds = NULL; // allocate a recipient dialog structure prds = (PRECIPIENTDIALOGSTRUCT) calloc(sizeof(RECIPIENTDIALOGSTRUCT), 1); if(prds) { char szTitle[256] = {0x00}; // title for recipient dialog UINT recipientReturn = FALSE; // recipient dialog result error = PGPsdkLoadDefaultPrefs(g_pgpContext); if (IsPGPError(error)) { PGPclEncDecErrorBox(g_hwndEudoraMainWindow, error); return EMSR_UNKNOWN_FAIL; } error = PGPOpenDefaultKeyRings(g_pgpContext, (PGPKeyRingOpenFlags)0, &(prds->OriginalKeySetRef)); if (IsPGPError(error)) { PGPclEncDecErrorBox(g_hwndEudoraMainWindow, error); return EMSR_UNKNOWN_FAIL; } if ((trans_id == kEncryptTranslatorID) || (trans_id == kEncryptAndSignTranslatorID)) { if(addresses) // do we have addresses to pass along { numRecipients = CreateRecipientList(addresses, &RecipientList); } LoadString(GetModuleHandle("PGPplugin.dll"), IDS_TITLE_RECIPIENTDIALOG, szTitle, sizeof(szTitle)); prds->Context = g_pgpContext; prds->tlsContext = g_tlsContext; prds->Version = CurrentPGPrecipVersion; prds->hwndParent = g_hwndEudoraMainWindow; prds->szTitle = szTitle; prds->dwOptions = PGPCL_ASCIIARMOR; prds->dwDisableFlags = PGPCL_DISABLE_WIPEORIG | PGPCL_DISABLE_ASCIIARMOR | PGPCL_DISABLE_SDA; prds->dwNumRecipients = numRecipients; prds->szRecipientArray = RecipientList; /* Disable FYEO if there's an attachment or HTML */ if (in_mime && !match_mime_type(in_mime, "text", "plain")) prds->dwDisableFlags |= PGPCL_DISABLE_FYEO; // If shift is pressed, force the dialog to pop. if (GetAsyncKeyState( VK_CONTROL) & 0x8000) prds->dwDisableFlags|=PGPCL_DISABLE_AUTOMODE; // See who we wish to encrypt this to recipientReturn = PGPclRecipientDialog( prds ); if (prds->AddedKeys != NULL) { PGPUInt32 numKeys; PGPCountKeys(prds->AddedKeys, &numKeys); if (numKeys > 0) PGPclQueryAddKeys(g_pgpContext, g_tlsContext, g_hwndEudoraMainWindow, prds->AddedKeys, NULL); PGPFreeKeySet(prds->AddedKeys); prds->AddedKeys = NULL; } if (!recipientReturn) { if (RecipientList) FreeRecipientList(RecipientList, numRecipients); if (prds->SelectedKeySetRef != NULL) PGPFreeKeySet(prds->SelectedKeySetRef); PGPFreeKeySet(prds->OriginalKeySetRef); free(prds); return EMSR_UNKNOWN_FAIL; } } if( IsntPGPError(error) ) { error = PGPBuildOptionList(g_pgpContext, &pgpOptions, PGPOOutputLineEndType(g_pgpContext, kPGPLineEnd_CRLF), PGPOPGPMIMEEncoding(g_pgpContext, TRUE, &mimeBodyOffset, mimeSeparator), PGPOLastOption(g_pgpContext) ); } if(IsntPGPError( error)) { error = EncryptSignFile(g_hinst, g_hwndEudoraMainWindow, g_pgpContext, g_tlsContext, szExe, szDll, in_file, prds, pgpOptions, &signOptions, out_file, ((trans_id == kSignTranslatorID) ? FALSE : TRUE ), ((trans_id == kEncryptTranslatorID) ? FALSE : TRUE ), FALSE); PGPFreeOptionList(pgpOptions); PGPFreeOptionList(signOptions); } else { PGPclEncDecErrorBox (NULL, error); } if (RecipientList) FreeRecipientList(RecipientList, numRecipients); if (prds->SelectedKeySetRef != NULL) PGPFreeKeySet(prds->SelectedKeySetRef); PGPFreeKeySet(prds->OriginalKeySetRef); free(prds); if( IsntPGPError(error) ) { if( out_mime ) { pluginReturn = BuildEncryptedPGPMIMEType( out_mime, mimeSeparator ); if(EMSR_OK == pluginReturn) { pluginReturn = AddMIMEParam(*out_mime, "PGPFormat", "PGPMIME-encrypted" ); } } } } break; } case kDecryptTranslatorID: case kVerifyTranslatorID: { char *szTempFile = NULL; BOOL bFYEO = FALSE; void *pOutput = NULL; PGPSize outSize = 0; error = DecryptVerifyFile(g_hinst, g_hwndEudoraMainWindow, g_pgpContext, g_tlsContext, szExe, szDll, in_file, TRUE, FALSE, &szTempFile, &pOutput, &outSize, &bFYEO); if( IsntPGPError(error) ) { if ((bFYEO)||(GetSecureViewerPref((void *)g_pgpContext))) TempestViewer((void *)g_pgpContext,NULL,pOutput,outSize, bFYEO); CopyFile(szTempFile, out_file, FALSE); DeleteFile(szTempFile); if( out_mime ) { ParseFileForMIMEType( out_file, out_mime ); } if ((bFYEO)||(GetSecureViewerPref((void *)g_pgpContext))) pluginReturn = EMSR_UNKNOWN_FAIL; else pluginReturn = EMSR_OK; } if (szTempFile != NULL) PGPFreeData(szTempFile); if (pOutput != NULL) PGPFreeData(pOutput); break; } } return pluginReturn; }
PGPError GetRecipients(HWND hwnd, char *szNames, PGPContextRef pgpContext, PGPtlsContextRef tlsContext, RECIPIENTDIALOGSTRUCT *prds) { HINSTANCE hWAB = NULL; LPWABOPEN pWABOpen = NULL; LPADRBOOK pAdrBook = NULL; LPWABOBJECT pWABObject = NULL; AdrBookTable * pTable = NULL; UINT nNumEntries = 0; UINT nIndex; DWORD dwNumRecips = 0; BOOL bGotRecipients = FALSE; BOOL bAddressBook = FALSE; char szTitle[256]; char * szName; char * szEmail; char * szNewRecipient; char ** szOldRecipients; char ** szRecipientArray = NULL; PGPKeySetRef pubKeySet = NULL; PGPError err = kPGPError_NoErr; if (LoadWAB(&hWAB, &pWABOpen, &pAdrBook, &pWABObject)) if (ReadWAB(pAdrBook, pWABObject, &pTable, &nNumEntries)) bAddressBook = TRUE; szName = strtok(szNames, ",;"); while (szName) { szEmail = szName; if (bAddressBook) { for (nIndex=0; nIndex<nNumEntries; nIndex++) { if ((!_stricmp(szName, pTable[nIndex].szName)) && (pTable[nIndex].szEmail != NULL)) { szEmail = pTable[nIndex].szEmail; nIndex = nNumEntries; } } } szNewRecipient = (char *) calloc(sizeof(char), strlen(szEmail)+1); strcpy(szNewRecipient, szEmail); szOldRecipients = szRecipientArray; szRecipientArray = (char **) calloc(sizeof(char *), dwNumRecips+1); if (dwNumRecips > 0) { UINT i; for (i=0; i<dwNumRecips; i++) (szRecipientArray)[i] = szOldRecipients[i]; } (szRecipientArray)[dwNumRecips] = szNewRecipient; dwNumRecips++; szName = strtok(NULL, ",;"); } UIGetString(szTitle, sizeof(szTitle), IDS_RECIPIENTDIALOG); prds->Version = CurrentPGPrecipVersion; prds->hwndParent = hwnd; prds->szTitle = "Recipient Selection"; prds->Context = pgpContext; prds->tlsContext = tlsContext; prds->SelectedKeySetRef = NULL; prds->szRecipientArray = szRecipientArray; prds->dwNumRecipients = dwNumRecips; prds->dwOptions = PGPCL_ASCIIARMOR; prds->dwFlags = 0; prds->dwDisableFlags = PGPCL_DISABLE_ASCIIARMOR | PGPCL_DISABLE_WIPEORIG | PGPCL_DISABLE_SDA; prds->AddedKeys = NULL; bGotRecipients = PGPclRecipientDialog(prds); if (prds->AddedKeys != NULL) { PGPUInt32 numKeys; PGPCountKeys(prds->AddedKeys, &numKeys); if (numKeys > 0) PGPclQueryAddKeys(pgpContext, tlsContext, hwnd, prds->AddedKeys, NULL); PGPFreeKeySet(prds->AddedKeys); prds->AddedKeys = NULL; } if (bGotRecipients != TRUE) { err = kPGPError_UserAbort; goto GetRecipientsError; } FreeWAB(hWAB, pAdrBook, pWABObject, pTable, nNumEntries); return err; GetRecipientsError: FreeRecipients(prds); FreeWAB(hWAB, pAdrBook, pWABObject, pTable, nNumEntries); return err; }