mirror of
				https://bitbucket.org/jsuto/piler.git
				synced 2025-11-04 09:12:27 +01:00 
			
		
		
		
	folder import fixes
Change-Id: I25e5353420ae402a0905dcd885c69742fa7f7513 Signed-off-by: SJ <sj@acts.hu>
This commit is contained in:
		
							
								
								
									
										2
									
								
								configure
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								configure
									
									
									
									
										vendored
									
									
								
							@@ -4866,7 +4866,7 @@ echo; echo
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
CFLAGS="$static -O2 -Wall -g"
 | 
					CFLAGS="$static -O2 -Wall -g"
 | 
				
			||||||
LIBS="$antispam_libs $sunos_libs "
 | 
					LIBS="$antispam_libs $sunos_libs "
 | 
				
			||||||
OBJS="dirs.o base64.o misc.o counters.o cfg.o sig.o decoder.o hash.o parser.o parser_utils.o rules.o smtp.o session.o message.o attachment.o digest.o store.o archive.o tai.o import.o import_maildir.o import_mailbox.o import_pop3.o import_imap.o import_gui.o imap.o pop3.o extract.o folder_extra.o mydomains.o $objs"
 | 
					OBJS="dirs.o base64.o misc.o counters.o cfg.o sig.o decoder.o hash.o parser.o parser_utils.o rules.o smtp.o session.o message.o attachment.o digest.o store.o archive.o tai.o import.o import_maildir.o import_mailbox.o import_pop3.o import_imap.o import_gui.o imap.o pop3.o extract.o folder.o mydomains.o $objs"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ac_config_files="$ac_config_files Makefile src/Makefile etc/Makefile util/Makefile init.d/Makefile unit_tests/Makefile contrib/imap/Makefile"
 | 
					ac_config_files="$ac_config_files Makefile src/Makefile etc/Makefile util/Makefile init.d/Makefile unit_tests/Makefile contrib/imap/Makefile"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -544,7 +544,7 @@ echo; echo
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
CFLAGS="$static -O2 -Wall -g"
 | 
					CFLAGS="$static -O2 -Wall -g"
 | 
				
			||||||
LIBS="$antispam_libs $sunos_libs "
 | 
					LIBS="$antispam_libs $sunos_libs "
 | 
				
			||||||
OBJS="dirs.o base64.o misc.o counters.o cfg.o sig.o decoder.o hash.o parser.o parser_utils.o rules.o smtp.o session.o message.o attachment.o digest.o store.o archive.o tai.o import.o import_maildir.o import_mailbox.o import_pop3.o import_imap.o import_gui.o imap.o pop3.o extract.o folder_extra.o mydomains.o $objs"
 | 
					OBJS="dirs.o base64.o misc.o counters.o cfg.o sig.o decoder.o hash.o parser.o parser_utils.o rules.o smtp.o session.o message.o attachment.o digest.o store.o archive.o tai.o import.o import_maildir.o import_mailbox.o import_pop3.o import_imap.o import_gui.o imap.o pop3.o extract.o folder.o mydomains.o $objs"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AC_CONFIG_FILES([Makefile src/Makefile etc/Makefile util/Makefile init.d/Makefile unit_tests/Makefile contrib/imap/Makefile])
 | 
					AC_CONFIG_FILES([Makefile src/Makefile etc/Makefile util/Makefile init.d/Makefile unit_tests/Makefile contrib/imap/Makefile])
 | 
				
			||||||
AC_OUTPUT
 | 
					AC_OUTPUT
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -71,7 +71,7 @@ backlog=20
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
workdir=/var/piler/tmp
 | 
					workdir=/var/piler/tmp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
; whether to enable writing folder_message table (1) or not (0)
 | 
					; whether the daemon is enabled writing folder_message table (1) or not (0)
 | 
				
			||||||
enable_folders=0
 | 
					enable_folders=0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
; discard a message if it's shorter than this value (in bytes)
 | 
					; discard a message if it's shorter than this value (in bytes)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -84,6 +84,7 @@
 | 
				
			|||||||
#define SQL_RETENTION_RULE_TABLE "retention_rule"
 | 
					#define SQL_RETENTION_RULE_TABLE "retention_rule"
 | 
				
			||||||
#define SQL_FOLDER_RULE_TABLE "folder_rule"
 | 
					#define SQL_FOLDER_RULE_TABLE "folder_rule"
 | 
				
			||||||
#define SQL_FOLDER_EXTRA_TABLE "folder_extra"
 | 
					#define SQL_FOLDER_EXTRA_TABLE "folder_extra"
 | 
				
			||||||
 | 
					#define SQL_FOLDER_EMAIL_TABLE "folder_email"
 | 
				
			||||||
#define SQL_COUNTER_TABLE "counter"
 | 
					#define SQL_COUNTER_TABLE "counter"
 | 
				
			||||||
#define SQL_OPTION_TABLE "option"
 | 
					#define SQL_OPTION_TABLE "option"
 | 
				
			||||||
#define SQL_DOMAIN_TABLE "domain"
 | 
					#define SQL_DOMAIN_TABLE "domain"
 | 
				
			||||||
@@ -106,6 +107,7 @@
 | 
				
			|||||||
#define SQL_PREPARED_STMT_QUERY_ATTACHMENT           "SELECT `attachment_id`, `ptr` FROM " SQL_ATTACHMENT_TABLE " WHERE piler_id=? ORDER BY attachment_id ASC"
 | 
					#define SQL_PREPARED_STMT_QUERY_ATTACHMENT           "SELECT `attachment_id`, `ptr` FROM " SQL_ATTACHMENT_TABLE " WHERE piler_id=? ORDER BY attachment_id ASC"
 | 
				
			||||||
#define SQL_PREPARED_STMT_GET_FOLDER_ID              "SELECT `id` FROM " SQL_FOLDER_TABLE " WHERE `name`=? AND `parent_id`=?"
 | 
					#define SQL_PREPARED_STMT_GET_FOLDER_ID              "SELECT `id` FROM " SQL_FOLDER_TABLE " WHERE `name`=? AND `parent_id`=?"
 | 
				
			||||||
#define SQL_PREPARED_STMT_GET_FOLDER_EXTRA_ID        "SELECT `id` FROM " SQL_FOLDER_EXTRA_TABLE " WHERE `name`=? AND `uid`=?"
 | 
					#define SQL_PREPARED_STMT_GET_FOLDER_EXTRA_ID        "SELECT `id` FROM " SQL_FOLDER_EXTRA_TABLE " WHERE `name`=? AND `uid`=?"
 | 
				
			||||||
 | 
					#define SQL_PREPARED_STMT_GET_FOLDER_UID_BY_EMAIL    "SELECT `uid` FROM " SQL_FOLDER_EMAIL_TABLE " WHERE `email`=?"
 | 
				
			||||||
#define SQL_PREPARED_STMT_INSERT_INTO_FOLDER_TABLE   "INSERT INTO `" SQL_FOLDER_TABLE "` (`name`, `parent_id`) VALUES(?,?)"
 | 
					#define SQL_PREPARED_STMT_INSERT_INTO_FOLDER_TABLE   "INSERT INTO `" SQL_FOLDER_TABLE "` (`name`, `parent_id`) VALUES(?,?)"
 | 
				
			||||||
#define SQL_PREPARED_STMT_INSERT_INTO_FOLDER_EXTRA_TABLE   "INSERT INTO `" SQL_FOLDER_EXTRA_TABLE "` (`name`, `uid`) VALUES(?,?)"
 | 
					#define SQL_PREPARED_STMT_INSERT_INTO_FOLDER_EXTRA_TABLE   "INSERT INTO `" SQL_FOLDER_EXTRA_TABLE "` (`name`, `uid`) VALUES(?,?)"
 | 
				
			||||||
#define SQL_PREPARED_STMT_UPDATE_METADATA_REFERENCE  "UPDATE " SQL_METADATA_TABLE " SET reference=? WHERE message_id=? AND reference=''"
 | 
					#define SQL_PREPARED_STMT_UPDATE_METADATA_REFERENCE  "UPDATE " SQL_METADATA_TABLE " SET reference=? WHERE message_id=? AND reference=''"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -286,6 +286,7 @@ struct memcached_server {
 | 
				
			|||||||
struct import {
 | 
					struct import {
 | 
				
			||||||
   char *extra_recipient;
 | 
					   char *extra_recipient;
 | 
				
			||||||
   char *move_folder;
 | 
					   char *move_folder;
 | 
				
			||||||
 | 
					   char *email;
 | 
				
			||||||
   int status;
 | 
					   int status;
 | 
				
			||||||
   int total_messages;
 | 
					   int total_messages;
 | 
				
			||||||
   int processed_messages;
 | 
					   int processed_messages;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * folder_extra.c, SJ
 | 
					 * folder.c, SJ
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
@@ -18,6 +18,33 @@
 | 
				
			|||||||
#include <piler.h>
 | 
					#include <piler.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void get_folder_uid_by_email(struct session_data *sdata, struct __data *data){
 | 
				
			||||||
 | 
					   int uid = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   data->import->uid = uid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if(prepare_sql_statement(sdata, &(data->stmt_get_folder_id), SQL_PREPARED_STMT_GET_FOLDER_UID_BY_EMAIL) == ERR) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   p_bind_init(data);
 | 
				
			||||||
 | 
					   data->sql[data->pos] = data->import->email; data->type[data->pos] = TYPE_STRING; data->pos++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if(p_exec_query(sdata, data->stmt_get_folder_id, data) == OK){
 | 
				
			||||||
 | 
					      p_bind_init(data);
 | 
				
			||||||
 | 
					      data->sql[data->pos] = (char *)&uid; data->type[data->pos] = TYPE_LONG; data->len[data->pos] = sizeof(unsigned long); data->pos++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      p_store_results(data->stmt_get_folder_id, data);
 | 
				
			||||||
 | 
					      p_fetch_results(data->stmt_get_folder_id);
 | 
				
			||||||
 | 
					      p_free_results(data->stmt_get_folder_id);
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   printf("uid=%d\n", uid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   close_prepared_statement(data->stmt_get_folder_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   data->import->uid = uid;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int get_folder_extra_id(struct session_data *sdata, struct __data *data, char *foldername){
 | 
					int get_folder_extra_id(struct session_data *sdata, struct __data *data, char *foldername){
 | 
				
			||||||
   int id=ERR_FOLDER;
 | 
					   int id=ERR_FOLDER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -98,8 +98,8 @@ int import_message(char *filename, struct session_data *sdata, struct __data *da
 | 
				
			|||||||
         rc = process_message(sdata, &state, data, cfg);
 | 
					         rc = process_message(sdata, &state, data, cfg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      /*
 | 
					      /*
 | 
				
			||||||
       * if pilerimport was invoked with --uid, and this is a duplicate,
 | 
					       * if pilerimport was invoked with --email (then queried the matching uid!),
 | 
				
			||||||
       * then add it to the folder_extra table
 | 
					       * and this is a duplicate, then add it to the folder_extra table
 | 
				
			||||||
       */
 | 
					       */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if(rc == ERR_EXISTS && data->import->uid > 0){
 | 
					      if(rc == ERR_EXISTS && data->import->uid > 0){
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -59,6 +59,7 @@ int file_from_archive_to_network(char *filename, int sd, int tls_enable, struct
 | 
				
			|||||||
int get_folder_id(struct session_data *sdata, struct __data *data, char *foldername, int parent_id);
 | 
					int get_folder_id(struct session_data *sdata, struct __data *data, char *foldername, int parent_id);
 | 
				
			||||||
int add_new_folder(struct session_data *sdata, struct __data *data, char *foldername, int parent_id);
 | 
					int add_new_folder(struct session_data *sdata, struct __data *data, char *foldername, int parent_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void get_folder_uid_by_email(struct session_data *sdata, struct __data *data);
 | 
				
			||||||
int get_folder_extra_id(struct session_data *sdata, struct __data *data, char *foldername);
 | 
					int get_folder_extra_id(struct session_data *sdata, struct __data *data, char *foldername);
 | 
				
			||||||
int add_new_folder_extra(struct session_data *sdata, struct __data *data, char *foldername);
 | 
					int add_new_folder_extra(struct session_data *sdata, struct __data *data, char *foldername);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,7 +50,7 @@ void usage(){
 | 
				
			|||||||
   printf("    -f <imap folder>                  IMAP folder name to import\n");
 | 
					   printf("    -f <imap folder>                  IMAP folder name to import\n");
 | 
				
			||||||
   printf("    -g <imap folder>                  Move email after import to this IMAP folder\n");
 | 
					   printf("    -g <imap folder>                  Move email after import to this IMAP folder\n");
 | 
				
			||||||
   printf("    -F <folder>                       Piler folder name to assign to this import\n");
 | 
					   printf("    -F <folder>                       Piler folder name to assign to this import\n");
 | 
				
			||||||
   printf("    --uid <uidr>                      UID to assign to this import\n");
 | 
					   printf("    --email <email@address>           Email address to assign to this import\n");
 | 
				
			||||||
   printf("    -R                                Assign IMAP folder names as Piler folder names\n");
 | 
					   printf("    -R                                Assign IMAP folder names as Piler folder names\n");
 | 
				
			||||||
   printf("    -b <batch limit>                  Import only this many emails\n");
 | 
					   printf("    -b <batch limit>                  Import only this many emails\n");
 | 
				
			||||||
   printf("    -s <start position>               Start importing POP3 emails from this position\n");
 | 
					   printf("    -s <start position>               Start importing POP3 emails from this position\n");
 | 
				
			||||||
@@ -90,6 +90,7 @@ int main(int argc, char **argv){
 | 
				
			|||||||
   import.download_only = 0;
 | 
					   import.download_only = 0;
 | 
				
			||||||
   import.timeout = 30;
 | 
					   import.timeout = 30;
 | 
				
			||||||
   import.uid = 0;
 | 
					   import.uid = 0;
 | 
				
			||||||
 | 
					   import.email = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   data.import = &import;
 | 
					   data.import = &import;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -116,7 +117,7 @@ int main(int argc, char **argv){
 | 
				
			|||||||
            {"skiplist",     required_argument,  0,  'x' },
 | 
					            {"skiplist",     required_argument,  0,  'x' },
 | 
				
			||||||
            {"folder",       required_argument,  0,  'F' },
 | 
					            {"folder",       required_argument,  0,  'F' },
 | 
				
			||||||
            {"folder_imap",  required_argument,  0,  'f' },
 | 
					            {"folder_imap",  required_argument,  0,  'f' },
 | 
				
			||||||
            {"uid",          required_argument,  0,  'U' },
 | 
					            {"email",        required_argument,  0,  'E' },
 | 
				
			||||||
            {"add-recipient",required_argument,  0,  'a' },
 | 
					            {"add-recipient",required_argument,  0,  'a' },
 | 
				
			||||||
            {"batch-limit",  required_argument,  0,  'b' },
 | 
					            {"batch-limit",  required_argument,  0,  'b' },
 | 
				
			||||||
            {"timeout",      required_argument,  0,  't' },
 | 
					            {"timeout",      required_argument,  0,  't' },
 | 
				
			||||||
@@ -135,9 +136,9 @@ int main(int argc, char **argv){
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      int option_index = 0;
 | 
					      int option_index = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      c = getopt_long(argc, argv, "c:m:M:e:d:i:K:u:p:P:x:F:f:a:b:t:s:g:U:GDRrozqh?", long_options, &option_index);
 | 
					      c = getopt_long(argc, argv, "c:m:M:e:d:i:K:u:p:P:x:F:f:a:b:t:s:g:E:GDRrozqh?", long_options, &option_index);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
      c = getopt(argc, argv, "c:m:M:e:d:i:K:u:p:P:x:F:f:a:b:t:s:g:U:GDRrozqh?");
 | 
					      c = getopt(argc, argv, "c:m:M:e:d:i:K:u:p:P:x:F:f:a:b:t:s:g:E:GDRrozqh?");
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if(c == -1) break;
 | 
					      if(c == -1) break;
 | 
				
			||||||
@@ -182,8 +183,8 @@ int main(int argc, char **argv){
 | 
				
			|||||||
                    username = optarg;
 | 
					                    username = optarg;
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         case 'U' :
 | 
					         case 'E' :
 | 
				
			||||||
                    data.import->uid = atoi(optarg);
 | 
					                    data.import->email = optarg;
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         case 'p' :
 | 
					         case 'p' :
 | 
				
			||||||
@@ -305,7 +306,12 @@ int main(int argc, char **argv){
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if(folder){
 | 
					   if(folder){
 | 
				
			||||||
      if(data.import->uid > 0){
 | 
					
 | 
				
			||||||
 | 
					      cfg.enable_folders = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if(data.import->email){
 | 
				
			||||||
 | 
					         get_folder_uid_by_email(&sdata, &data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         data.folder = get_folder_extra_id(&sdata, &data, folder);
 | 
					         data.folder = get_folder_extra_id(&sdata, &data, folder);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         if(data.folder == ERR_FOLDER){
 | 
					         if(data.folder == ERR_FOLDER){
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -279,15 +279,15 @@ create table if not exists `folder` (
 | 
				
			|||||||
) Engine=InnoDB;
 | 
					) Engine=InnoDB;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
create table if not exists `folder_user` (
 | 
					create table if not exists `folder_email` (
 | 
				
			||||||
   `id` bigint unsigned not null,
 | 
					   `uid` int unsigned not null auto_increment,
 | 
				
			||||||
   `uid` int unsigned not null,
 | 
					   `email` char(128) not null unique,
 | 
				
			||||||
   key `folder_user_idx` (`id`),
 | 
					   key `folder_user_idx` (`uid`)
 | 
				
			||||||
   key `folder_user_idx2` (`uid`)
 | 
					   key `folder_user_idx2` (`email`)
 | 
				
			||||||
) ENGINE=InnoDB;
 | 
					) ENGINE=InnoDB;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
create table if not exists `folder_extra` (
 | 
					create table if not exists `folder_user` (
 | 
				
			||||||
   `id` int unsigned not null auto_increment,
 | 
					   `id` int unsigned not null auto_increment,
 | 
				
			||||||
   `uid` int unsigned not null,
 | 
					   `uid` int unsigned not null,
 | 
				
			||||||
   `name` char(64) not null,
 | 
					   `name` char(64) not null,
 | 
				
			||||||
@@ -301,7 +301,7 @@ create table if not exists `folder_message` (
 | 
				
			|||||||
   `folder_id` bigint not null,
 | 
					   `folder_id` bigint not null,
 | 
				
			||||||
   `message_id` bigint not null,
 | 
					   `message_id` bigint not null,
 | 
				
			||||||
   `uid` int not null,
 | 
					   `uid` int not null,
 | 
				
			||||||
   unique(`folder_id`, `message_id`, `uid`),
 | 
					   unique(`message_id`, `uid`),
 | 
				
			||||||
   key (`id`)
 | 
					   key (`id`)
 | 
				
			||||||
) ENGINE=InnoDB;
 | 
					) ENGINE=InnoDB;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user