#include "ostream.h"
#include "master-service.h"
#include "mail-session.h"
+#include "mail-user.h"
#include "mail-command.h"
#include "fifo-input-connection.h"
return mail_session_disconnect_parse(args, error_r);
if (strcmp(cmd, "UPDATE-SESSION") == 0)
return mail_session_update_parse(args, error_r);
+ if (strcmp(cmd, "ADD-USER") == 0)
+ return mail_user_add_parse(args, error_r);
if (strcmp(cmd, "UPDATE-CMD") == 0)
return mail_command_update_parse(args, error_r);
/* Copyright (c) 2011-2016 Dovecot authors, see the included COPYING file */
#include "lib.h"
+#include "buffer.h"
#include "ioloop.h"
#include "hash.h"
#include "llist.h"
+#include "base64.h"
#include "global-memory.h"
#include "stats-settings.h"
#include "mail-stats.h"
mail_domain_refresh(user->domain, diff_stats);
}
+int mail_user_add_parse(const char *const *args, const char **error_r)
+{
+ struct mail_user *user;
+ struct stats *diff_stats;
+ buffer_t *buf;
+ const char *service, *error;
+
+ /* <user> <service> <diff stats> */
+ if (str_array_length(args) < 3) {
+ *error_r = "ADD-USER: Too few parameters";
+ return -1;
+ }
+
+ user = mail_user_login(args[0]);
+ service = args[1];
+
+ buf = buffer_create_dynamic(pool_datastack_create(), 256);
+ if (base64_decode(args[2], strlen(args[2]), NULL, buf) < 0) {
+ *error_r = t_strdup_printf("ADD-USER %s %s: Invalid base64 input",
+ user->name, service);
+ return -1;
+ }
+ diff_stats = stats_alloc(pool_datastack_create());
+ if (!stats_import(buf->data, buf->used, user->stats, diff_stats, &error)) {
+ *error_r = t_strdup_printf("ADD-USER %s %s: %s",
+ user->name, service, error);
+ return -1;
+ }
+ mail_user_refresh(user, diff_stats);
+ return 0;
+}
+
void mail_users_free_memory(void)
{
unsigned int diff;
void mail_user_refresh(struct mail_user *user,
const struct stats *diff_stats) ATTR_NULL(2);
+int mail_user_add_parse(const char *const *args, const char **error_r);
void mail_user_ref(struct mail_user *user);
void mail_user_unref(struct mail_user **user);