static int cmd_show_mailboxes(struct backup *backup, const struct cyrbu_cmd_options *options) { struct backup_mailbox *mailbox = NULL; struct backup_mailbox_message *record = NULL; int i; for (i = 0; i < strarray_size(options->argv); i++) { char ts_deleted[32] = ""; const char *arg = strarray_nth(options->argv, i); /* argument could be a uniqueid */ mailbox = backup_get_mailbox_by_uniqueid(backup, arg, 1); /* or it could be an mboxname */ if (!mailbox) { mbname_t *mbname = mbname_from_intname(arg); if (!mbname) continue; mailbox = backup_get_mailbox_by_name(backup, mbname, 1); mbname_free(&mbname); } /* or it could be junk */ if (!mailbox) continue; fprintf(stdout, "mboxname: %s\n", mailbox->mboxname); fprintf(stdout, "uniqueid: %s\n", mailbox->uniqueid); if (mailbox->deleted) { strftime(ts_deleted, sizeof(ts_deleted), "%F %T", localtime(&mailbox->deleted)); fprintf(stdout, "deleted: %s\n", ts_deleted); } fprintf(stdout, "messages:\n"); fprintf(stdout, " uid expunged time guid\n"); for (record = mailbox->records->head; record; record = record->next) { char ts_expunged[32] = " "; if (record->expunged) strftime(ts_expunged, sizeof(ts_expunged), "%F %T", localtime(&record->expunged)); fprintf(stdout, "%10d %s %s\n", record->uid, ts_expunged, message_guid_encode(&record->guid)); } fprintf(stdout, "\n"); backup_mailbox_free(&mailbox); } return 0; }
static int _index_expunge(struct backup *backup, struct dlist *dl, time_t ts, off_t dl_offset) { syslog(LOG_DEBUG, "indexing EXPUNGE at " OFF_T_FMT "...\n", dl_offset); const char *mboxname; const char *uniqueid; struct dlist *uidl; struct dlist *di; struct backup_mailbox *mailbox = NULL; int r = 0; if (!dlist_getatom(dl, "MBOXNAME", &mboxname)) return IMAP_PROTOCOL_BAD_PARAMETERS; if (!dlist_getatom(dl, "UNIQUEID", &uniqueid)) return IMAP_PROTOCOL_BAD_PARAMETERS; if (!dlist_getlist(dl, "UID", &uidl)) return IMAP_PROTOCOL_BAD_PARAMETERS; mbname_t *mbname = mbname_from_intname(mboxname); mailbox = backup_get_mailbox_by_name(backup, mbname, 0); mbname_free(&mbname); if (!mailbox) return IMAP_MAILBOX_NONEXISTENT; /* verify that uniqueid matches */ if (strcmp(mailbox->uniqueid, uniqueid) != 0) { syslog(LOG_ERR, "%s: uniqueid mismatch for %s: %s on wire, %s in index", __func__, mboxname, uniqueid, mailbox->uniqueid); r = IMAP_PROTOCOL_BAD_PARAMETERS; } for (di = uidl->head; di && !r; di = di->next) { struct sqldb_bindval bval[] = { { ":mailbox_id", SQLITE_INTEGER, { .i = mailbox->id } },
static int restore_add_object(const char *object_name, const struct restore_options *options, struct backup *backup, struct backup_mailbox_list *mailbox_list, struct sync_folder_list *reserve_folder_list, struct sync_reserve_list *reserve_list) { struct backup_mailbox *mailbox = NULL; struct backup_message *message = NULL; struct message_guid tmp_guid; size_t len; int r; /* try to work out what we're restoring */ len = strlen(object_name); if (len == 24 && strspn(object_name, HEX_DIGITS) == len) { /* looks like a non-libuuid uniqueid */ mailbox = backup_get_mailbox_by_uniqueid(backup, object_name, BACKUP_MAILBOX_ALL_RECORDS); } else if (len == 36 && strspn(object_name, "-" HEX_DIGITS) == len) { /* looks like a libuuid uniqueid */ mailbox = backup_get_mailbox_by_uniqueid(backup, object_name, BACKUP_MAILBOX_ALL_RECORDS); } else if (message_guid_decode(&tmp_guid, object_name)) { /* looks like it's a message guid */ message = backup_get_message(backup, &tmp_guid); } else if (strchr(object_name, '.')) { /* has a dot, might be an mboxname */ mbname_t *mbname = mbname_from_intname(object_name); mailbox = backup_get_mailbox_by_name(backup, mbname, BACKUP_MAILBOX_ALL_RECORDS); mbname_free(&mbname); } else { /* not sure what it is, guess mboxname? */ mbname_t *mbname = mbname_from_intname(object_name); mailbox = backup_get_mailbox_by_name(backup, mbname, BACKUP_MAILBOX_ALL_RECORDS); mbname_free(&mbname); } /* add it to the restore lists */ if (mailbox) { r = restore_add_mailbox(mailbox, options, mailbox_list, reserve_folder_list, reserve_list); if (!r && options->do_submailboxes) { char prefix[MAX_MAILBOX_NAME + 1]; int len; len = snprintf(prefix, sizeof(prefix), "%s.", mailbox->mboxname); /* can only be submailboxes if parent's name is short enough... */ if (len < MAX_MAILBOX_NAME) { struct submailbox_rock rock = { prefix, strlen(prefix), options, mailbox_list, reserve_folder_list, reserve_list, }; r = backup_mailbox_foreach(backup, 0, BACKUP_MAILBOX_ALL_RECORDS, submailbox_cb, &rock); } } backup_mailbox_free(&mailbox); } else if (message) { struct backup_mailbox_list *mailboxes = NULL; if (!options->override_mboxname) mailboxes = backup_get_mailboxes_by_message(backup, message, BACKUP_MAILBOX_MATCH_RECORDS); r = restore_add_message(message, mailboxes, options, mailbox_list, reserve_folder_list, reserve_list); if (mailboxes) { backup_mailbox_list_empty(mailboxes); free(mailboxes); } backup_message_free(&message); } else { r = IMAP_MAILBOX_NONEXISTENT; } return r; }