Exemple #1
0
static PyObject *py_MAPIStoreMGMT_send_newmail(PyMAPIStoreMGMTObject *self, PyObject *args)
{
	int		ret;
	const char	*username;
	const char	*storeuser;
	const char	*FolderURI;
	const char	*MessageURI;
	uint64_t	FolderID;
	uint64_t	MessageID;
	bool		softdeleted;
	PyMAPIStoreGlobals *globals;

	if (!PyArg_ParseTuple(args, "ssss", &username, &storeuser, &FolderURI, &MessageURI)) {
		return NULL;
	}

	/* Turn MessageURI into MessageID from indexing database */
	ret = mapistore_indexing_record_get_fmid(self->mgmt_ctx->mstore_ctx, storeuser, MessageURI, 
						 false, &MessageID, &softdeleted);
	if (ret != MAPISTORE_SUCCESS || softdeleted == true) {
		return PyBool_FromLong(false);
	}

	/* Turn FolderURI into FolderID from openchangedb or indexing database */
	globals = get_PyMAPIStoreGlobals();
	ret = openchangedb_get_fid(globals->ocdb_ctx, FolderURI, &FolderID);
	if (ret != MAPI_E_SUCCESS) {
		ret = mapistore_indexing_record_get_fmid(self->mgmt_ctx->mstore_ctx, username, FolderURI, false,
							 &FolderID, &softdeleted);
		if (ret != MAPISTORE_SUCCESS || softdeleted == true) {
			return PyBool_FromLong(false);
		}
	}

	/* Send notification on user queue */
	ret = mapistore_mgmt_send_newmail_notification(self->mgmt_ctx, username, FolderID, 
						       MessageID, MessageURI);

	return PyBool_FromLong((ret == MAPISTORE_SUCCESS) ? true : false);
}
/* 
 * ListRootContent
 *
 * This function list items included in Root maildir 
 * we have to omit .Sent .Trash .Outbox and .Drafts  subfolders as these are accessed
 * thru other RootFolder (on MAPI)
 *
 */
void ListINBOXContent(struct EasyLinuxContext *elContext)
{
DIR *dDir, *dMsg;
struct dirent *dEntry, *dEMsg;
char *SpecialNames[] = {".Sent",".Trash",".Outbox",".Drafts"};
char *tmpName, *Uri, *MsgFolder, *MsgFullPath;
int i, j, k, l, m, n, len, Ok, nSub, SoftDeleted, Res;  
uint64_t  *FMID;
struct stat Stat, dStat;


stat(elContext->Indexing->name, &Stat); 
DEBUG(0, ("MAPIEasyLinux :   Tdb %i\n", Stat.st_mtime));  // time_t        st_mtime;    /* Heure dernière modification   */
  
len=4; // len=4 number of specials folders

DEBUG(0,("MAPIEasyLinux :      Scan dirs in %s \n", elContext->RootFolder.FullPath));
dMsg = opendir(elContext->RootFolder.FullPath);
while ((dEntry = readdir(dMsg))) 
  {
  // We have to avoid non Maildir folders
  Ok=1;
  if ( (dEntry->d_type == isDir) && (dEntry->d_name[0] == '.') && (dEntry->d_name[1] != 0) && (dEntry->d_name[1] != '.') )
    {
    for(i=0 ; i<len ; i++)
      {  // Maildir cannot Start with .Sent, .Trash, .Outbox or .Drafts because those are used in different backend
      len = strlen(SpecialNames[i]);
      if( !strncmp(SpecialNames[i], dEntry->d_name, len) )
        Ok=0;
      }
    if( Ok )
      {  // We found a Maildir folder in the form .Folder1.Folder2.Folder3
      DEBUG(0,("MAPIEasyLinux :        Find %s \n", dEntry->d_name));
      }
    }
  }
return;





// Scan for messages   in cur dir
MsgFolder = (char *)talloc_asprintf(elContext->mem_ctx, "%scur", elContext->RootFolder.FullPath);
DEBUG(0,("MAPIEasyLinux :      Scan messages in %s \n", MsgFolder));
dMsg = opendir(MsgFolder);
while ((dEMsg = readdir(dMsg))) 
  {
  if ( dEMsg->d_type == isFile )
    {  // We find a message
    tmpName = talloc_asprintf(elContext->mem_ctx, "*%s*", dEMsg->d_name);
    len = strlen(tmpName);
    // Remove flags part of message: 1368218756.V801I471c4M321821.OpenChange:2,S should be -> *1368218756.V801I471c4M321821.OpenChange*
    for(k=0 ; k<len ; k++)
      {
      if( tmpName[k] == ':' )
        {
        dEMsg->d_name[k-1] = 0;
        tmpName[k] = 0;
        }
      }
    // Now search it in indexing.tdb  
    FMID = (uint64_t *)talloc_zero_size(elContext->mem_ctx, sizeof(uint64_t));
    Res = mapistore_indexing_record_get_fmid(elContext->mstore_ctx, elContext->User.uid, tmpName, true, FMID, (_Bool *) &SoftDeleted);
    if( Res != MAPISTORE_SUCCESS )  
      {  // No FMID exist for this folder -> add one
			DEBUG(3,("MAPIEasyLinux :        Test for %s using %s Not Found \n",elContext->User.uid, tmpName));
			openchangedb_get_new_folderID(elContext->LdbTable, FMID);
			MsgFullPath = talloc_asprintf(elContext->mstore_ctx, "%s/%s",MsgFolder,dEMsg->d_name);
			mapistore_indexing_record_add(elContext->mem_ctx,elContext->mstore_ctx->indexing_list, *FMID, MsgFullPath);
			DEBUG(0,("MAPIEasyLinux :          Add %lX:%s \n",*FMID, MsgFullPath));
			talloc_unlink(elContext->mstore_ctx, MsgFullPath);
			}
		else
			DEBUG(0,("MAPIEasyLinux :          OK 0x%lX:%s\n",*FMID, dEMsg->d_name));
		talloc_unlink(elContext->mem_ctx, FMID);
    }
  }
talloc_unlink(elContext->mem_ctx, MsgFolder);

// Scan for messages in new dir
MsgFolder = (char *)talloc_asprintf(elContext->mem_ctx, "%snew", elContext->RootFolder.FullPath);
DEBUG(0,("MAPIEasyLinux :      Scan messages in %s \n", MsgFolder));
dMsg = opendir(MsgFolder);
while ((dEMsg = readdir(dMsg))) 
  {
  if ( dEMsg->d_type == isFile )
    {  // We find a message
    tmpName = talloc_asprintf(elContext->mem_ctx, "*%s*", dEMsg->d_name);
    len = strlen(tmpName);
    // Remove flags part of message: 1368218756.V801I471c4M321821.OpenChange:2,S should be -> *1368218756.V801I471c4M321821.OpenChange*
    for(k=0 ; k<len ; k++)
      {
      if( tmpName[k] == ':' )
        {
        dEMsg->d_name[k-1] = 0;
        tmpName[k] = 0;
        }
      }
    // Now search it in indexing.tdb  
    FMID = (uint64_t *)talloc_zero_size(elContext->mem_ctx, sizeof(uint64_t));
    Res = mapistore_indexing_record_get_fmid(elContext->mstore_ctx, elContext->User.uid, tmpName, true, FMID, (_Bool *) &SoftDeleted);
    if( Res != MAPISTORE_SUCCESS )  
      {  // No FMID exist for this folder -> add one
			DEBUG(3,("MAPIEasyLinux :        Test for %s using %s Not Found \n",elContext->User.uid, tmpName));
			openchangedb_get_new_folderID(elContext->LdbTable, FMID);
			MsgFullPath = talloc_asprintf(elContext->mstore_ctx, "%s/%s",MsgFolder,dEMsg->d_name);
			mapistore_indexing_record_add(elContext->mem_ctx,elContext->mstore_ctx->indexing_list, *FMID, MsgFullPath);
			DEBUG(0,("MAPIEasyLinux :          Add %lX:%s \n",*FMID, MsgFullPath));
			talloc_unlink(elContext->mstore_ctx, MsgFullPath);
			}
		else
			DEBUG(0,("MAPIEasyLinux :          OK 0x%lX:%s\n",*FMID, dEMsg->d_name));
		talloc_unlink(elContext->mem_ctx, FMID);
    }
  }
talloc_unlink(elContext->mem_ctx, MsgFolder);

  
dDir = opendir(elContext->RootFolder.FullPath);
while ((dEntry = readdir(dDir))) 
  {
  // We have to avoid non Maildir folders
  Ok=1;
  if ( (dEntry->d_type == isDir) && (dEntry->d_name[0] == '.') && (dEntry->d_name[1] != 0) && (dEntry->d_name[1] != '.') )
    {
    for(i=0 ; i<len ; i++)
      {  // Maildir cannot Start with .Sent, .Trash, .Outbox or .Drafts because those are used in different backend
      len = strlen(SpecialNames[i]);
      if( !strncmp(SpecialNames[i], dEntry->d_name, len) )
        Ok=0;
      }
    if( Ok )
      {  // We found a Maildir folder in the form .Folder1.Folder2.Folder3
      DEBUG(3,("MAPIEasyLinux :      Find %s  in INBOX%s  \n", dEntry->d_name, elContext->RootFolder.RelPath));
      tmpName = talloc_strdup(elContext->mem_ctx,dEntry->d_name);
      // Count number of subfolders
      nSub=0;
      len = strlen(dEntry->d_name);
      for( i=0 ; i<len ; i++)
        {
        if( dEntry->d_name[i] == '.' )
          {
          nSub++;      
          if( i>0 ) 
          	tmpName[i] = 0; // Split tmpName, avoid first .
          }
        }
      // Now, we have to split folder name into indiviual folder eg: Folder1/  Folder1/Folder2  Folder1/Folder2/Folder3/ 
      FMID = talloc_zero_size(elContext->mem_ctx, sizeof(uint64_t) );
      for( i=0 ; i<nSub ; i++)
        {
        // is EasyLinux://INBOX/<tmpName>/ associated with a FMID ?  Leadind / mean Folder
        Uri = talloc_asprintf(elContext->mem_ctx,"EasyLinux://INBOX/%s/",tmpName);
        Res = mapistore_indexing_record_get_fmid(elContext->mstore_ctx, elContext->User.uid, Uri, false, FMID, (_Bool *) &SoftDeleted);
        if( (Res != MAPISTORE_SUCCESS) )
          {  // No FMID exist for this folder -> add one
					DEBUG(3,("MAPIEasyLinux :        Test for %s using %s Not Found \n",elContext->User.uid, Uri));
					openchangedb_get_new_folderID(elContext->LdbTable, FMID);
					mapistore_indexing_record_add(elContext->mem_ctx,elContext->mstore_ctx->indexing_list, *FMID, Uri);
					DEBUG(0,("MAPIEasyLinux :          Add %lX:%s \n",*FMID, Uri));
					}
				else
				  DEBUG(0,("MAPIEasyLinux :          OK 0x%lX:%s\n",*FMID, Uri));
				  
        j=0;
        for(j=0 ; j<len ; j++)
          {
          if( tmpName[j] == 0 )
            {
            tmpName[j] = '.';
            j=len;
            }
          }
        }
      talloc_unlink(elContext->mem_ctx, FMID);
      // Scan for messages  subdirs in cur dir
			MsgFolder = (char *)talloc_asprintf(elContext->mem_ctx, "%s%s/cur", elContext->RootFolder.FullPath, dEntry->d_name);
			DEBUG(0,("MAPIEasyLinux :      Scan messages in %s \n", MsgFolder));
			dMsg = opendir(MsgFolder);
			while ((dEMsg = readdir(dMsg))) 
			  {
			  if ( dEMsg->d_type == isFile )
			    {  // We find a message
			    tmpName = talloc_asprintf(elContext->mem_ctx, "*%s*", dEMsg->d_name);
			    len = strlen(tmpName);
			    // Remove flags part of message: 1368218756.V801I471c4M321821.OpenChange:2,S should be -> *1368218756.V801I471c4M321821.OpenChange*
			    for(k=0 ; k<len ; k++)
			      {
			      if( tmpName[k] == ':' )
			        {
			        dEMsg->d_name[k-1] = 0;
			        tmpName[k] = 0;
			        }
			      }
			    // Now search it in indexing.tdb  
			    FMID = (uint64_t *)talloc_zero_size(elContext->mem_ctx, sizeof(uint64_t));
			    Res = mapistore_indexing_record_get_fmid(elContext->mstore_ctx, elContext->User.uid, tmpName, true, FMID, (_Bool *) &SoftDeleted);
			    if( Res != MAPISTORE_SUCCESS )  
			      {  // No FMID exist for this folder -> add one
						DEBUG(3,("MAPIEasyLinux :        Test for %s using %s Not Found \n",elContext->User.uid, tmpName));
						openchangedb_get_new_folderID(elContext->LdbTable, FMID);
						MsgFullPath = talloc_asprintf(elContext->mstore_ctx, "%s/%s",MsgFolder,dEMsg->d_name);
						mapistore_indexing_record_add(elContext->mem_ctx,elContext->mstore_ctx->indexing_list, *FMID, MsgFullPath);
						DEBUG(0,("MAPIEasyLinux :          Add %lX:%s \n",*FMID, MsgFullPath));
						talloc_unlink(elContext->mstore_ctx, MsgFullPath);
						}
					else
						DEBUG(0,("MAPIEasyLinux :          OK 0x%lX:%s\n",*FMID, dEMsg->d_name));
					talloc_unlink(elContext->mem_ctx, FMID);
			    }
			  } 
			talloc_unlink(elContext->mem_ctx, MsgFolder);
      // Scan for messages  subdirs in new dir
			MsgFolder = (char *)talloc_asprintf(elContext->mem_ctx, "%s%s/new", elContext->RootFolder.FullPath, dEntry->d_name);
			DEBUG(0,("MAPIEasyLinux :      Scan messages in %s \n", MsgFolder));
			dMsg = opendir(MsgFolder);
			while ((dEMsg = readdir(dMsg))) 
			  {
			  if ( dEMsg->d_type == isFile )
			    {  // We find a message
			    tmpName = talloc_asprintf(elContext->mem_ctx, "*%s*", dEMsg->d_name);
			    len = strlen(tmpName);
			    // Remove flags part of message: 1368218756.V801I471c4M321821.OpenChange:2,S should be -> *1368218756.V801I471c4M321821.OpenChange*
			    for(k=0 ; k<len ; k++)
			      {
			      if( tmpName[k] == ':' )
			        {
			        dEMsg->d_name[k-1] = 0;
			        tmpName[k] = 0;
			        }
			      }
			    // Now search it in indexing.tdb  
			    FMID = (uint64_t *)talloc_zero_size(elContext->mem_ctx, sizeof(uint64_t));
			    Res = mapistore_indexing_record_get_fmid(elContext->mstore_ctx, elContext->User.uid, tmpName, true, FMID, (_Bool *) &SoftDeleted);
			    if( Res != MAPISTORE_SUCCESS )  
			      {  // No FMID exist for this folder -> add one
						DEBUG(3,("MAPIEasyLinux :        Test for %s using %s Not Found \n",elContext->User.uid, tmpName));
						openchangedb_get_new_folderID(elContext->LdbTable, FMID);
						MsgFullPath = talloc_asprintf(elContext->mstore_ctx, "%s/%s",MsgFolder,dEMsg->d_name);
						mapistore_indexing_record_add(elContext->mem_ctx,elContext->mstore_ctx->indexing_list, *FMID, MsgFullPath);
						DEBUG(0,("MAPIEasyLinux :          Add %lX:%s \n",*FMID, MsgFullPath));
						talloc_unlink(elContext->mstore_ctx, MsgFullPath);
						}
					else
						DEBUG(0,("MAPIEasyLinux :          OK 0x%lX:%s\n",*FMID, dEMsg->d_name));
					talloc_unlink(elContext->mem_ctx, FMID);
			    }
			  } 
			talloc_unlink(elContext->mem_ctx, MsgFolder);
			
      talloc_unlink(elContext->mem_ctx, tmpName);
      }
    }
  }
closedir(dDir);
}