emsmdbp_object.c File Reference

Server-side specific objects init/release routines. More...

#include <ctype.h>
#include "mapiproxy/dcesrv_mapiproxy.h"
#include "mapiproxy/libmapiproxy/libmapiproxy.h"
#include "mapiproxy/libmapiproxy/fault_util.h"
#include "mapiproxy/libmapiserver/libmapiserver.h"
#include "mapiproxy/libmapistore/mapistore_nameid.h"
#include "libmapi/property_tags.h"
#include "libmapi/property_altnames.h"
#include "dcesrv_exchange_emsmdb.h"

Functions

_PUBLIC_ enum mapistore_error emsmdbp_folder_delete (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *parent_folder, uint64_t fid, uint8_t flags)
 
_PUBLIC_ enum mapistore_error emsmdbp_folder_delete_indexing_records (struct mapistore_context *mstore_ctx, uint32_t context_id, char *username, uint64_t fid, uint64_t *deleted_fmids, uint32_t deleted_fmids_count, uint8_t flags)
 
enum MAPISTATUS emsmdbp_folder_get_recursive_folder_count (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *folder, uint32_t *row_countp)
 
_PUBLIC_ uint32_t emsmdbp_get_contextID (struct emsmdbp_object *object)
 
char * emsmdbp_get_owner (struct emsmdbp_object *object)
 
bool emsmdbp_is_mailboxstore (struct emsmdbp_object *object)
 
bool emsmdbp_is_mapistore (struct emsmdbp_object *object)
 
_PUBLIC_ enum MAPISTATUS emsmdbp_object_attach_sharing_metadata_XML_file (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *sharing_object)
 
_PUBLIC_ struct emsmdbp_object * emsmdbp_object_attachment_init (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, uint64_t messageID, struct emsmdbp_object *parent)
 
_PUBLIC_ int emsmdbp_object_copy_properties (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *source_object, struct emsmdbp_object *target_object, struct SPropTagArray *excluded_properties, bool deep_copy)
 
_PUBLIC_ enum MAPISTATUS emsmdbp_object_create_folder (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *parent_folder, TALLOC_CTX *mem_ctx, uint64_t fid, struct SRow *rowp, bool force_container_class, struct emsmdbp_object **new_folderp)
 
static int emsmdbp_object_destructor (void *data)
 
_PUBLIC_ struct emsmdbp_object * emsmdbp_object_folder_init (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, uint64_t folderID, struct emsmdbp_object *parent_object)
 
_PUBLIC_ struct emsmdbp_object * emsmdbp_object_ftcontext_init (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *parent)
 
_PUBLIC_ struct emsmdbp_object * emsmdbp_object_init (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *parent_object)
 
_PUBLIC_ struct emsmdbp_object * emsmdbp_object_mailbox_init (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, const char *essDN, bool mailboxstore)
 
_PUBLIC_ struct emsmdbp_object * emsmdbp_object_message_init (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, uint64_t messageID, struct emsmdbp_object *parent)
 
_PUBLIC_ enum MAPISTATUS emsmdbp_object_open_folder_by_fid (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *context_object, uint64_t fid, struct emsmdbp_object **folder_object_p)
 
static enum MAPISTATUS emsmdbp_object_sharing_metadata_property (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *sharing_object, struct Binary_r **attach_bin, TALLOC_CTX *mem_ctx)
 
static enum MAPISTATUS emsmdbp_object_sharing_metadata_providers_node (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *sharing_object, char *remote_uid, char *remote_store_uid, char *target_recipients, char **providers_node, TALLOC_CTX *mem_ctx)
 
static enum MAPISTATUS emsmdbp_object_sharing_metadata_recipients_attr (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *sharing_object, char **target_recipients_attr, TALLOC_CTX *mem_ctx)
 
_PUBLIC_ struct emsmdbp_object * emsmdbp_object_stream_init (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *parent)
 
_PUBLIC_ struct emsmdbp_object * emsmdbp_object_synccontext_init (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *parent_object)
 
_PUBLIC_ enum MAPISTATUS emsmdbp_object_table_get_recursive_row_props (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *context_object, DATA_BLOB *datablob, struct SPropTagArray *properties, uint64_t current_fid, int64_t *remaining, uint32_t *count)
 
_PUBLIC_ struct emsmdbp_object * emsmdbp_object_table_init (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *parent)
 
static void * get_emsmdbp_data (enum MAPITAGS ul_prop_tag, struct SPropTagArray *s_prop_tag_array, void **data_pointers, enum MAPISTATUS *retvals)
 

Detailed Description

Server-side specific objects init/release routines.

Function Documentation

_PUBLIC_ enum mapistore_error emsmdbp_folder_delete ( struct emsmdbp_context *  emsmdbp_ctx,
struct emsmdbp_object *  parent_folder,
uint64_t  fid,
uint8_t  flags 
)

Delete a folder.

Parameters
emsmdbp_ctxpointer to the emsmdbp context
parent_folderthe parent folder
fidthe folder identifier to delete from parent_folder
flagsthe delete flags.

Possible values for flags are:

  1. DEL_MESSAGES Delete all the messages in the folder
  2. DEL_FOLDERS Delete the subfolder and all of its subfolders
  3. DELETE_HARD_DELETE Hard delete the folder
Returns
MAPISTORE_SUCCESS on success, otherwise MAPISTORE error.

References emsmdbp_folder_delete_indexing_records(), emsmdbp_get_contextID(), emsmdbp_get_owner(), emsmdbp_is_mailboxstore(), emsmdbp_is_mapistore(), openchangedb_delete_folder(), openchangedb_get_mapistoreURI(), and oxosfld_is_special_folder().

Referenced by EcDoRpc_RopDeleteFolder(), and EcDoRpc_RopSyncImportDeletes().

_PUBLIC_ enum mapistore_error emsmdbp_folder_delete_indexing_records ( struct mapistore_context *  mstore_ctx,
uint32_t  context_id,
char *  username,
uint64_t  fid,
uint64_t *  deleted_fmids,
uint32_t  deleted_fmids_count,
uint8_t  flags 
)

Delete the fmids from a folder in the indexing database.

Parameters
mstore_ctxpointer to the mapistore context
context_idthe context identifier
usernamethe owner of the folder to delete its entries
fidthe folder identifier
deleted_fmidthe array of child fmids from the folder
deleted_fmid_countthe number of deleted_fmids
flagsthe delete flags. See emsmdbp_folder_delete for details.
Returns
MAPISTORE_SUCCESS on success, otherwise MAPISTORE error.

Referenced by emsmdbp_folder_delete().

enum MAPISTATUS emsmdbp_folder_get_recursive_folder_count ( struct emsmdbp_context *  emsmdbp_ctx,
struct emsmdbp_object *  folder,
uint32_t *  row_countp 
)

Return the full number of folders within specified folder's hierarchy

Parameters
emsmdbp_ctxpointer to the emsmdbp context
folderpointer to the emsmdb folder to start the count from
row_countppointer on the number of folders to return
Returns
MAPI_E_SUCCESS on success, otherwise MAPI_ERROR

References emsmdbp_get_contextID(), emsmdbp_object_open_folder_by_fid(), mapi_handles_add(), and mapi_handles_delete().

Referenced by EcDoRpc_RopGetHierarchyTable().

char* emsmdbp_get_owner ( struct emsmdbp_object *  object)
bool emsmdbp_is_mailboxstore ( struct emsmdbp_object *  object)

Convenient function to determine whether specified mapi_handles refers to object within mailbox or public folders store.

Parameters
objectpointer to the emsmdp object
Returns
true if parent is within mailbox store, otherwise false

Referenced by emsmdbp_folder_delete().

_PUBLIC_ enum MAPISTATUS emsmdbp_object_attach_sharing_metadata_XML_file ( struct emsmdbp_context *  emsmdbp_ctx,
struct emsmdbp_object *  sharing_object 
)

Create a sharing metadata XML file for folder sharing invitation, request and response and store it as attachment in the sharing object. See [MS-OXSHARE] for this kind of messages and [MS-OXSHRMSG] for the XML format.

Parameters
emsmdbp_ctxpointer to the emsmdb provider context
sharing_objectthe original sharing message object to dump the XML data from
Returns
MAPI_E_SUCCESS on success, a MAPI error code otherwise

References emsmdbp_get_contextID(), emsmdbp_is_mapistore(), emsmdbp_object_attachment_init(), and emsmdbp_object_sharing_metadata_property().

Referenced by EcDoRpc_RopTransportSend().

_PUBLIC_ struct emsmdbp_object* emsmdbp_object_attachment_init ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context *  emsmdbp_ctx,
uint64_t  messageID,
struct emsmdbp_object *  parent 
)

Initialize a attachment object

Parameters
mem_ctxpointer to the memory context
emsmdbp_ctxpointer to the emsmdb provider cotnext
folderIDthe folder identifier
messageIDthe message identifier
parentemsmdbp object of the parent

References emsmdbp_object_init().

Referenced by EcDoRpc_RopCreateAttach(), EcDoRpc_RopOpenAttach(), and emsmdbp_object_attach_sharing_metadata_XML_file().

_PUBLIC_ int emsmdbp_object_copy_properties ( struct emsmdbp_context *  emsmdbp_ctx,
struct emsmdbp_object *  source_object,
struct emsmdbp_object *  target_object,
struct SPropTagArray *  excluded_properties,
bool  deep_copy 
)

Copy properties from an object to another object

Parameters
emsmdbp_ctxpointer to the emsmdb provider context
source_objectpointer to the source object
target_objectpointer to the target object
excluded_propertiespointer to a SPropTagArray listing properties that must not be copied
deep_copyindicates whether subobjects must be copied
Returns
Allocated emsmdbp object on success, otherwise NULL

References emsmdbp_is_mapistore().

Referenced by EcDoRpc_RopCopyTo().

_PUBLIC_ enum MAPISTATUS emsmdbp_object_create_folder ( struct emsmdbp_context *  emsmdbp_ctx,
struct emsmdbp_object *  parent_folder,
TALLOC_CTX *  mem_ctx,
uint64_t  fid,
struct SRow *  rowp,
bool  force_container_class,
struct emsmdbp_object **  new_folderp 
)

Create a folder

Parameters
emsmdbp_ctxpointer to the emsmdbp context
parent_folderpointer to parent folder where to create the new folder
mem_ctxpointer to the memory context
fidFolder Identifier to assign the new folder object
rowpthe properties to set to the new folder
force_container_classforce the usage of Fallback role if we are creating a mapistore root folder and the container class is not available at rowp parameter
[out]new_folderplocation to store new emsmdbp object on success
Returns
MAPISTATUS error code

References emsmdbp_get_contextID(), emsmdbp_is_mapistore(), emsmdbp_object_folder_init(), and openchangedb_get_fid_by_name().

Referenced by EcDoRpc_RopCreateFolder(), and EcDoRpc_RopSyncImportHierarchyChange().

static int emsmdbp_object_destructor ( void *  data)
static

talloc destructor for emsmdbp_objects

Parameters
datageneric pointer on data
Returns
0 on success, otherwise -1

References emsmdbp_get_contextID(), and emsmdbp_is_mapistore().

Referenced by emsmdbp_object_init().

_PUBLIC_ struct emsmdbp_object* emsmdbp_object_folder_init ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context *  emsmdbp_ctx,
uint64_t  folderID,
struct emsmdbp_object *  parent_object 
)

Initialize a folder object

Parameters
mem_ctxpointer to the memory context
emsmdbp_ctxpointer to the emsmdb provider context
folderIDthe folder identifier
parentemsmdbp object of the parent folder for this folder
Returns
Allocated emsmdbp object on success, otherwise NULL

References emsmdbp_object_init().

Referenced by emsmdbp_object_create_folder(), and emsmdbp_object_open_folder_by_fid().

_PUBLIC_ struct emsmdbp_object* emsmdbp_object_ftcontext_init ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context *  emsmdbp_ctx,
struct emsmdbp_object *  parent 
)

Initialize a ftcontext object

Parameters
mem_ctxpointer to the memory context
emsmdbp_ctxpointer to the emsmdb provider cotnext
whole_storewhether the subscription applies to the specified change on the entire store or stricly on the specified folder/message
folderIDthe folder identifier
messageIDthe message identifier
parentemsmdbp object of the parent

References emsmdbp_object_init().

Referenced by EcDoRpc_RopFastTransferSourceCopyTo(), and EcDoRpc_RopSyncGetTransferState().

_PUBLIC_ struct emsmdbp_object* emsmdbp_object_init ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context *  emsmdbp_ctx,
struct emsmdbp_object *  parent_object 
)

Initialize an emsmdbp_object

Parameters
mem_ctxpointer to the memory context
emsmdbp_ctxpointer to the emsmdb provider context
Returns
Allocated emsmdbp object on success, otherwise NULL

References emsmdbp_object_destructor().

Referenced by emsmdbp_object_attachment_init(), emsmdbp_object_folder_init(), emsmdbp_object_ftcontext_init(), emsmdbp_object_mailbox_init(), emsmdbp_object_message_init(), emsmdbp_object_stream_init(), emsmdbp_object_synccontext_init(), and emsmdbp_object_table_init().

_PUBLIC_ struct emsmdbp_object* emsmdbp_object_mailbox_init ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context *  emsmdbp_ctx,
const char *  essDN,
bool  mailboxstore 
)

Initialize a mailbox object

Parameters
mem_ctxpointer to the memory context
emsmdbp_ctxpointer to the emsmdb provider context
requestpointer to the Logon MAPI request
mailboxstoreboolean which specifies whether the mailbox object is a PF store or a private mailbox store
Returns
Allocated emsmdbp object on success, otherwise NULL

References emsmdbp_object_init(), openchangedb_get_PublicFolderID(), and openchangedb_get_SystemFolderID().

Referenced by EcDoRpc_RopLogon().

_PUBLIC_ struct emsmdbp_object* emsmdbp_object_message_init ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context *  emsmdbp_ctx,
uint64_t  messageID,
struct emsmdbp_object *  parent 
)

Initialize a message object

Parameters
mem_ctxpointer to the memory context
emsmdbp_ctxpointer to the emsmdb provider context
messageIDthe message identifier
parentemsmdbp object of the parent
Returns
Allocated emsmdbp object on success, otherwise NULL

References emsmdbp_object_init().

Referenced by EcDoRpc_RopCreateMessage(), EcDoRpc_RopOpenEmbeddedMessage(), and EcDoRpc_RopSyncImportMessageChange().

_PUBLIC_ enum MAPISTATUS emsmdbp_object_open_folder_by_fid ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context *  emsmdbp_ctx,
struct emsmdbp_object *  context_object,
uint64_t  fid,
struct emsmdbp_object **  folder_object_p 
)

Return the folder object associated to specified folder identified

Parameters
mem_ctxpointer to the memory context
emsmdbp_ctxpointer to the emsmdbp context
context_objectpointer to current context object
fidpointer to the Folder Identifier to lookup
[out]folder_object_plocation to store emsmdbp object on success
Returns
MAPISTATUS error code

References emsmdbp_object_folder_init().

Referenced by EcDoRpc_RopCreateFolder(), EcDoRpc_RopCreateMessage(), EcDoRpc_RopOpenFolder(), EcDoRpc_RopSyncImportHierarchyChange(), EcDoRpc_RopSyncImportMessageMove(), emsmdbp_folder_get_recursive_folder_count(), and emsmdbp_object_table_get_recursive_row_props().

static enum MAPISTATUS emsmdbp_object_sharing_metadata_property ( struct emsmdbp_context *  emsmdbp_ctx,
struct emsmdbp_object *  sharing_object,
struct Binary_r **  attach_bin,
TALLOC_CTX *  mem_ctx 
)
static

Create the XML file from the sharing message object and store it as binary property in attach_bin out parameter.

Parameters
emsmdbp_ctxpointer to the emsmdb provider cotnext
sharing_objectthe sharing message object to get the XML data from
[out]attach_binpointer to Binary_r property value pointer where the XML data is stored
mem_ctxpointer to memory context where the attach_bin is created
Note
On success attach_bin is allocated in mem_ctx. It is up to the developer to free that memory context when it is not needed anymore.
Returns
MAPI_E_SUCCESS on success, a mapi error code otherwise

References emsmdbp_object_sharing_metadata_providers_node(), emsmdbp_object_sharing_metadata_recipients_attr(), and get_emsmdbp_data().

Referenced by emsmdbp_object_attach_sharing_metadata_XML_file().

static enum MAPISTATUS emsmdbp_object_sharing_metadata_providers_node ( struct emsmdbp_context *  emsmdbp_ctx,
struct emsmdbp_object *  sharing_object,
char *  remote_uid,
char *  remote_store_uid,
char *  target_recipients,
char **  providers_node,
TALLOC_CTX *  mem_ctx 
)
static

Store the Providers node into providers_node out parameter.

Parameters
emsmdbp_ctxpointer to the emsmdb provider cotnext
sharing_objectthe sharing message object to get the XML data from
remote_uidstring with the folder id to share, NULL when no required
remote_store_uidstring with the mailbox id where the folder belongs to, NULL when non-required
target_recipientsthe string where the recipients' email addresses separated by semi colons are stored
[out]providers_nodepointer to string where the Providers XML node is stored
mem_ctxpointer to memory context where the providers_node is created
Note
On success providers_node string is allocated in mem_ctx. It is up to the developer to free that memory context when it is not needed anymore.
Returns
MAPI_E_SUCCESS on success, a mapi error code otherwise

Referenced by emsmdbp_object_sharing_metadata_property().

static enum MAPISTATUS emsmdbp_object_sharing_metadata_recipients_attr ( struct emsmdbp_context *  emsmdbp_ctx,
struct emsmdbp_object *  sharing_object,
char **  target_recipients_attr,
TALLOC_CTX *  mem_ctx 
)
static

Store the target recipients attribute in out parameter.

Parameters
emsmdbp_ctxpointer to the emsmdb provider cotnext
sharing_objectthe sharing message object to get the XML data from
[out]pointerto string where the TargetRecipients XML attribute is stored
mem_ctxpointer to memory context where the target_recipients_attr is created
Note
On success target_recipients_attr string is allocated in mem_ctx. It is up to the developer to free that memory context when it is not needed anymore.
Returns
MAPI_E_SUCCESS on success, a mapi error code otherwise

References emsmdbp_get_contextID().

Referenced by emsmdbp_object_sharing_metadata_property().

_PUBLIC_ struct emsmdbp_object* emsmdbp_object_stream_init ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context *  emsmdbp_ctx,
struct emsmdbp_object *  parent 
)

Initialize a stream object

Parameters
mem_ctxpointer to the memory context
emsmdbp_ctxpointer to the emsmdb provider cotnext
propertythe stream property identifier
parentemsmdbp object of the parent

References emsmdbp_object_init().

Referenced by EcDoRpc_RopOpenStream().

_PUBLIC_ struct emsmdbp_object* emsmdbp_object_synccontext_init ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context *  emsmdbp_ctx,
struct emsmdbp_object *  parent_object 
)

Initialize a synccontext object

Parameters
mem_ctxpointer to the memory context
emsmdbp_ctxpointer to the emsmdb provider cotnext
whole_storewhether the subscription applies to the specified change on the entire store or stricly on the specified folder/message
folderIDthe folder identifier
messageIDthe message identifier
parentemsmdbp object of the parent

References emsmdbp_object_init(), and openchangedb_get_MailboxReplica().

Referenced by EcDoRpc_RopSyncConfigure(), and EcDoRpc_RopSyncOpenCollector().

_PUBLIC_ enum MAPISTATUS emsmdbp_object_table_get_recursive_row_props ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context *  emsmdbp_ctx,
struct emsmdbp_object *  context_object,
DATA_BLOB *  datablob,
struct SPropTagArray *  properties,
uint64_t  current_fid,
int64_t *  remaining,
uint32_t *  count 
)

This function process the hierarchy of folders recursively and fill requested rows.

Parameters
mem_ctxpointer to the memory context
emsmdbp_ctxpointer to the emsmdb context
context_objectpointer to the context object
datablobpointer to the DATA blob to fill
propertiespointer to the array of properties used to fill a row of the table
current_fidthe FolderID of the folder to open and process
remainingpointer on the remaining rows to process
countpointer on the number of rows processed to return
Note
This implementation is very preliminary and lacks several use cases:
  1. It does not handle backward read
  2. It does not handle positioning of the folder object and rewind of the hierarchy when position != 0

We currently rely on Outlook asking for 4096 rows to fill this buffer in one operation.

Returns
MAPI_E_SUCCESS on success, otherwise MAPI error.

References emsmdbp_get_contextID(), emsmdbp_object_open_folder_by_fid(), mapi_handles_add(), and mapi_handles_delete().

Referenced by EcDoRpc_RopQueryRows().

_PUBLIC_ struct emsmdbp_object* emsmdbp_object_table_init ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context *  emsmdbp_ctx,
struct emsmdbp_object *  parent 
)

Initialize a table object

Parameters
mem_ctxpointer to the memory context
emsmdbp_ctxpointer to the emsmdb provider context
parentemsmdbp object of the parent
Returns
Allocated emsmdbp object on success, otherwise NULL

References emsmdbp_object_init().

Referenced by EcDoRpc_RopGetPermissionsTable(), and EcDoRpc_RopGetRulesTable().

static void* get_emsmdbp_data ( enum MAPITAGS  ul_prop_tag,
struct SPropTagArray *  s_prop_tag_array,
void **  data_pointers,
enum MAPISTATUS *  retvals 
)
static

Convenience function to extract values from data_pointers safely.

Parameters
ulPropTagMAPI property tag
SPropTagArrayarray of property tags
data_pointersarray with the property values that matches the previous SPropTagArray
retvalsarray of returned value result of getting the property
Returns
pointer to the property value, NULL otherwise

Referenced by emsmdbp_object_sharing_metadata_property().


Creative Commons License
Creative Commons Attribution icon Creative Commons Share Alike icon
This content is licensed under the Creative Commons
Attribution ShareAlike License v. 3.0:
http://creativecommons.org/licenses/by-sa/3.0/