POPFILE.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:9k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /******************************************************************************
  2. *       This is a part of the Microsoft Source Code Samples.
  3. *       Copyright (C) 1992-1997 Microsoft Corporation.
  4. *       All rights reserved. 
  5. *       This source code is only intended as a supplement to 
  6. *       Microsoft Development Tools and/or WinHelp documentation.
  7. *       See these sources for detailed information regarding the 
  8. *       Microsoft samples programs.
  9. ******************************************************************************/
  10. //+---------------------------------------------------------------------------
  11. //
  12. //  File:       popfile.c
  13. //
  14. //  Contents:
  15. //
  16. //  Classes:
  17. //
  18. //  Functions:
  19. //
  20. //----------------------------------------------------------------------------
  21. #include "pop3srvp.h"
  22. #pragma hdrstop
  23. #define POP3_LOCKFILE       TEXT("poplock")
  24. #define POP3_LOCKFILE_NAME  TEXT("\") POP3_LOCKFILE
  25. #define POP3_SEARCH         TEXT("\*.*")
  26. WCHAR   BaseDirectory[MAX_PATH];
  27. //+---------------------------------------------------------------------------
  28. //
  29. //  Function:   LockMailDirectory
  30. //
  31. //  Synopsis:   Attempts to lock the mail directory
  32. //
  33. //  Arguments:  [hUserToken] -- Token of user
  34. //              [pszPath]    -- path to the mail directory
  35. //
  36. //  Returns:    Handle of lock file on success, or NULL
  37. //
  38. //  History:    1-06-95   RichardW   Created
  39. //
  40. //  Notes:
  41. //
  42. //----------------------------------------------------------------------------
  43. HANDLE
  44. LockMailDirectory(
  45.     HANDLE          hUserToken,
  46.     PCHAR           pszPath)
  47. {
  48.     WCHAR   PathToOpen[MAX_PATH];
  49.     WCHAR   WidePath[64];
  50.     HANDLE  hLockFile;
  51.     //
  52.     // Build lock file name
  53.     //
  54.     MultiByteToWideChar(
  55.         CP_ACP, MB_PRECOMPOSED,
  56.         pszPath, -1,
  57.         WidePath, sizeof(WidePath) / sizeof(WCHAR) );
  58.     wcscpy(PathToOpen, BaseDirectory);
  59.     wcscat(PathToOpen, WidePath);
  60.     wcscat(PathToOpen, POP3_LOCKFILE_NAME);
  61.     //
  62.     // Impersonate the client
  63.     //
  64. #ifdef SECURE_BUILD
  65.     ImpersonateLoggedOnUser(hUserToken);
  66. #endif
  67.     //
  68.     // Attempt to create the file.  This will fail if it already exists,
  69.     // which would indicate that another thread/client is accessing this
  70.     // mailbox.
  71.     //
  72.     DebugLog((DEB_TRACE, "Opening lock file as %wsn", PathToOpen));
  73.     hLockFile = CreateFile( PathToOpen,
  74.                             GENERIC_READ | GENERIC_WRITE,
  75.                             0,
  76.                             NULL,
  77.                             CREATE_NEW,
  78.                             FILE_ATTRIBUTE_NORMAL |
  79.                             FILE_FLAG_DELETE_ON_CLOSE,
  80.                             NULL);
  81.     //
  82.     // Done being the client.  Back to server security
  83.     //
  84.     RevertToSelf();
  85.     //
  86.     // Return a handle, or NULL if failed
  87.     //
  88.     return(hLockFile != INVALID_HANDLE_VALUE ? hLockFile : NULL);
  89. }
  90. //+---------------------------------------------------------------------------
  91. //
  92. //  Function:   OpenMailMessage
  93. //
  94. //  Synopsis:   Opens the specified mail message as the user
  95. //
  96. //  Arguments:  [MessageId]  --
  97. //              [pDir]       --
  98. //              [hUserToken] --
  99. //
  100. //  History:    1-08-95   RichardW   Created
  101. //
  102. //  Notes:
  103. //
  104. //----------------------------------------------------------------------------
  105. HANDLE
  106. OpenMailMessage(
  107.     DWORD               MessageId,
  108.     PPopMailDirectory   pDir,
  109.     HANDLE              hUserToken)
  110. {
  111.     HANDLE  hMailFile;
  112.     WCHAR   Path[MAX_PATH];
  113.     //
  114.     // Impersonate the client
  115.     //
  116. #ifdef SECURE_BUILD
  117.     ImpersonateLoggedOnUser(hUserToken);
  118. #endif
  119.     //
  120.     // Attempt to create the file.  This will fail if it already exists,
  121.     // which would indicate that another thread/client is accessing this
  122.     // mailbox.
  123.     //
  124.     wcscpy(Path, pDir->pBaseDir);
  125.     wcscat(Path, TEXT("\"));
  126.     wcscat(Path, pDir->Messages[MessageId].pszFileName);
  127.     hMailFile = CreateFile( Path,
  128.                             GENERIC_READ | GENERIC_WRITE,
  129.                             0,
  130.                             NULL,
  131.                             OPEN_EXISTING,
  132.                             FILE_ATTRIBUTE_HIDDEN,
  133.                             NULL);
  134.     //
  135.     // Done being the client.  Back to server security
  136.     //
  137.     RevertToSelf();
  138.     //
  139.     // Return a handle, or NULL if failed
  140.     //
  141.     return(hMailFile != INVALID_HANDLE_VALUE ? hMailFile : NULL);
  142. }
  143. //+---------------------------------------------------------------------------
  144. //
  145. //  Function:   UnlockMailDirectory
  146. //
  147. //  Synopsis:   Unlocks the mail directory
  148. //
  149. //  Arguments:  [hLockFile] -- Handle of lock file to close
  150. //
  151. //  Returns:    TRUE if success, FALSE if failure
  152. //
  153. //  History:    1-06-95   RichardW   Created
  154. //
  155. //  Notes:
  156. //
  157. //----------------------------------------------------------------------------
  158. BOOL
  159. UnlockMailDirectory(
  160.     HANDLE      hLockFile)
  161. {
  162.     //
  163.     // Since the lock file was opened with DELETE_ON_CLOSE semantics, it will
  164.     // softly and silently vanish away when we close this, the one handle to
  165.     // it.
  166.     //
  167.     return(CloseHandle(hLockFile));
  168. }
  169. //+---------------------------------------------------------------------------
  170. //
  171. //  Function:   ReadMailDirectory
  172. //
  173. //  Synopsis:   Reads in a list of all the files in the directory
  174. //
  175. //  Arguments:  [hUserToken] --
  176. //              [pszPath]    --
  177. //
  178. //  Returns:
  179. //
  180. //  History:    1-08-95   RichardW   Created
  181. //
  182. //  Notes:
  183. //
  184. //----------------------------------------------------------------------------
  185. PPopMailDirectory
  186. ReadMailDirectory(
  187.     HANDLE          hUserToken,
  188.     PCHAR           pszPath)
  189. {
  190.     WIN32_FIND_DATA     FindData;
  191.     PPopMailDirectory   pDir;
  192.     WCHAR               MailDir[MAX_PATH];
  193.     WCHAR               WidePath[64];
  194.     HANDLE              hSearch;
  195.     PPopMessageHeader   pExtraHeaders;
  196.     PPopMessageHeader   pHeader;
  197.     DWORD               RemainingHeaders;
  198.     MultiByteToWideChar(
  199.         CP_ACP, MB_PRECOMPOSED,
  200.         pszPath, -1,
  201.         WidePath, sizeof(WidePath) / sizeof(WCHAR) );
  202.     wcscpy(MailDir, BaseDirectory);
  203.     wcscat(MailDir, WidePath);
  204.     pDir = LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, sizeof(PopMailDirectory));
  205.     pDir->pBaseDir = LocalAlloc(LMEM_FIXED, (wcslen(MailDir) + 1) * sizeof(WCHAR));
  206.     wcscpy(pDir->pBaseDir, MailDir);
  207.     wcscat(MailDir, POP3_SEARCH);
  208. #ifdef SECURE_BUILD
  209.     ImpersonateLoggedOnUser(hUserToken);
  210. #endif
  211.     hSearch = FindFirstFile(MailDir, &FindData);
  212.     if (hSearch == INVALID_HANDLE_VALUE)
  213.     {
  214.         DebugLog((DEB_TRACE, "FindFirst FAILED!, %dn", GetLastError()));
  215.         RevertToSelf();
  216.         return(NULL);
  217.     }
  218.     pExtraHeaders = LocalAlloc(LMEM_FIXED, sizeof(PopMessageHeader) * 10);
  219.     RemainingHeaders = 10;
  220.     pHeader = pExtraHeaders;
  221.     do
  222.     {
  223.         if (FindData.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY |
  224.                                         FILE_ATTRIBUTE_SYSTEM |
  225.                                         FILE_ATTRIBUTE_HIDDEN) )
  226.         {
  227.             continue;   // Skip non-normal files
  228.         }
  229.         if (wcsicmp(FindData.cFileName,POP3_LOCKFILE) == 0)
  230.         {
  231.             continue;   // Skip our lock file
  232.         }
  233.         DebugLog((DEB_TRACE, "ReadDir:  Message %ws, size %dn",
  234.                 FindData.cFileName, FindData.nFileSizeLow));
  235.         pHeader->Flags = 0;
  236.         pDir->TotalSize += FindData.nFileSizeLow;
  237.         pHeader->Size = FindData.nFileSizeLow;
  238.         pHeader->pszFileName = LocalAlloc(LMEM_FIXED,
  239.                             (wcslen(FindData.cFileName) + 1) * sizeof(WCHAR) );
  240.         wcscpy(pHeader->pszFileName, FindData.cFileName);
  241.         pHeader++;
  242.         RemainingHeaders--;
  243.         if (RemainingHeaders == 0)
  244.         {
  245.             PPopMessageHeader   pTemp;
  246.             pTemp = LocalAlloc(LMEM_FIXED, sizeof(PopMessageHeader) * (pDir->cMessages + 20));
  247.             CopyMemory(pTemp, pExtraHeaders, sizeof(PopMessageHeader) * (pDir->cMessages + 10));
  248.             LocalFree(pExtraHeaders);
  249.             pExtraHeaders = pTemp;
  250.             RemainingHeaders = 10;
  251.             pDir->cMessages += 10;
  252.         }
  253.     } while (FindNextFile(hSearch, &FindData));
  254.     pDir->cMessages += (10 - RemainingHeaders);
  255.     pDir->Messages = pExtraHeaders;
  256.     FindClose(hSearch);
  257.     pDir->cAvailMessages = pDir->cMessages;
  258.     pDir->AvailSize = pDir->TotalSize;
  259.     RevertToSelf();
  260.     return(pDir);
  261. }
  262. BOOL
  263. CommitMailDirectory(
  264.     PPopMailDirectory   pDir,
  265.     HANDLE              hUserToken)
  266. {
  267.     DWORD   i;
  268.     WCHAR   Path[MAX_PATH];
  269.     PWSTR   pszPath;
  270.     wcscpy(Path, pDir->pBaseDir);
  271.     wcscat(Path, TEXT("\"));
  272.     pszPath = Path + wcslen(Path);
  273. #ifdef SECURE_BUILD
  274.     ImpersonateLoggedOnUser(hUserToken);
  275. #endif
  276.     for (i = 0; i < pDir->cMessages ; i++)
  277.     {
  278.         if (pDir->Messages[i].Flags & POP3_MESSAGE_DELETE)
  279.         {
  280.             wcscpy(pszPath, pDir->Messages[i].pszFileName);
  281.             DeleteFile(Path);
  282.         }
  283.     }
  284.     RevertToSelf();
  285.     return(TRUE);
  286. }
  287. void
  288. FreeMailDirectory(
  289.     PPopMailDirectory   pDir)
  290. {
  291.     DWORD   i;
  292.     for (i = 0 ; i < pDir->cMessages ; i++ )
  293.     {
  294.         LocalFree(pDir->Messages[i].pszFileName);
  295.     }
  296.     LocalFree(pDir->Messages);
  297.     LocalFree(pDir);
  298. }