~james-page/ubuntu/raring/dovecot/autopkgtest

« back to all changes in this revision

Viewing changes to src/lib-storage/mail-search.c

  • Committer: Package Import Robot
  • Author(s): James Page
  • Date: 2012-06-11 11:11:54 UTC
  • mfrom: (1.15.2) (4.1.27 sid)
  • Revision ID: package-import@ubuntu.com-20120611111154-678cwbdj6ktgsv1h
Tags: 1:2.1.7-1ubuntu1
* Merge from Debian unstable, remaining changes:
  + Add mail-stack-delivery package:
    - Update d/rules
    - d/control: convert existing dovecot-postfix package to a dummy
      package and add new mail-stack-delivery package.
    - Update maintainer scripts.
    - Rename d/dovecot-postfix.* to debian/mail-stack-delivery.*
    - d/mail-stack-delivery.preinst: Move previously installed backups and
      config files to a new package namespace.
    - d/mail-stack-delivery.prerm: Added to handle downgrades.
  + Use Snakeoil SSL certificates by default:
    - d/control: Depend on ssl-cert.
    - d/dovecot-core.postinst: Relax grep for SSL_* a bit.
  + Add autopkgtest to debian/tests/*.
  + Add ufw integration:
    - d/dovecot-core.ufw.profile: new ufw profile.
    - d/rules: install profile in dovecot-core.
    - d/control: dovecot-core - suggest ufw.
  + d/{control,rules}: enable PIE hardening.
  + d/dovecot-core.dirs: Added usr/share/doc/dovecot-core
  + Add apport hook:
    - d/rules, d/source_dovecot.py
  + Add upstart job:
    - d/rules, d/dovecot-core.dovecot.upstart, d/control,
      d/dovecot-core.dirs, dovecot-imapd.{postrm, postinst, prerm},
      d/dovecot-pop3d.{postinst, postrm, prerm}.
      d/mail-stack-deliver.postinst: Convert init script to upstart.
  + d/control: Added Pre-Depends: dpkg (>= 1.15.6) to dovecot-dbg to support
    xz compression in Ubuntu.
  + d/control: Demote dovecot-common Recommends: to Suggests: to prevent
    install of extra packages on upgrade.
  + d/patches/dovecot-drac.patch: Updated with version for dovecot >= 2.0.0.
  + d/control: Drop B-D on systemd.
* Dropped changes:
  + d/patches/fix-racey-restart.patch: part of 2.1.x, no longer required.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* Copyright (c) 2002-2011 Dovecot authors, see the included COPYING file */
 
1
/* Copyright (c) 2002-2012 Dovecot authors, see the included COPYING file */
2
2
 
3
3
#include "lib.h"
4
4
#include "array.h"
99
99
 
100
100
                        arg->value.mailbox_glob =
101
101
                                imap_match_init(default_pool, arg->value.str,
102
 
                                                TRUE, ns->sep);
 
102
                                                TRUE, mail_namespace_get_sep(ns));
103
103
                        break;
104
104
                }
105
105
                case SEARCH_INTHREAD:
110
110
                                              struct mail_search_args, 1);
111
111
                                thread_args->pool = args->pool;
112
112
                                thread_args->args = arg->value.subargs;
113
 
                                thread_args->charset = args->charset;
114
113
                                thread_args->simplified = TRUE;
115
114
                                /* simplification should have unnested all
116
115
                                   inthreads, so we'll assume that
158
157
                case SEARCH_KEYWORDS:
159
158
                        if (arg->value.keywords == NULL)
160
159
                                break;
161
 
                        mailbox_keywords_unref(args->box, &arg->value.keywords);
 
160
                        mailbox_keywords_unref(&arg->value.keywords);
162
161
                        break;
163
162
                case SEARCH_MAILBOX_GLOB:
164
163
                        if (arg->value.mailbox_glob == NULL)
266
265
 
267
266
        new_arg = p_new(pool, struct mail_search_arg, 1);
268
267
        new_arg->type = arg->type;
269
 
        new_arg->not = arg->not;
 
268
        new_arg->match_not = arg->match_not;
270
269
        new_arg->match_always = arg->match_always;
271
270
        new_arg->nonmatch_always = arg->nonmatch_always;
272
271
        new_arg->value.search_flags = arg->value.search_flags;
309
308
        case SEARCH_KEYWORDS:
310
309
        case SEARCH_BODY:
311
310
        case SEARCH_TEXT:
312
 
        case SEARCH_BODY_FAST:
313
 
        case SEARCH_TEXT_FAST:
314
311
        case SEARCH_GUID:
315
312
        case SEARCH_MAILBOX:
316
313
        case SEARCH_MAILBOX_GUID:
344
341
        struct mail_search_args *new_args;
345
342
 
346
343
        new_args = mail_search_build_init();
347
 
        new_args->charset = p_strdup(new_args->pool, args->charset);
348
344
        new_args->simplified = args->simplified;
349
345
        new_args->have_inthreads = args->have_inthreads;
350
346
        new_args->args = mail_search_arg_dup(new_args->pool, args->args);
408
404
 
409
405
                        subarg = subarg->next;
410
406
                }
411
 
                if (arg->not && arg->result != -1)
 
407
                if (arg->match_not && arg->result != -1)
412
408
                        arg->result = !arg->result;
413
409
        } else if (arg->type == SEARCH_OR) {
414
410
                /* OR-list of conditions */
430
426
 
431
427
                        subarg = subarg->next;
432
428
                }
433
 
                if (arg->not && arg->result != -1)
 
429
                if (arg->match_not && arg->result != -1)
434
430
                        arg->result = !arg->result;
435
431
        } else {
436
432
                /* just a single condition */
497
493
                              sizeof(const char *));
498
494
                break;
499
495
        case SEARCH_BODY:
500
 
        case SEARCH_BODY_FAST:
501
496
                *have_body = TRUE;
502
497
                break;
503
498
        case SEARCH_TEXT:
504
 
        case SEARCH_TEXT_FAST:
505
499
                *have_text = TRUE;
506
500
                *have_body = TRUE;
507
501
                break;
560
554
                return TRUE;
561
555
        case SEARCH_MAILBOX:
562
556
                ret = strcmp(arg->value.str, vname) == 0;
563
 
                return ret != arg->not;
 
557
                return ret != arg->match_not;
564
558
        case SEARCH_MAILBOX_GLOB: {
565
559
                T_BEGIN {
566
560
                        struct imap_match_glob *glob;
569
563
                                               arg->value.str, TRUE, sep);
570
564
                        ret = imap_match(glob, vname) == IMAP_MATCH_YES;
571
565
                } T_END;
572
 
                return ret != arg->not;
 
566
                return ret != arg->match_not;
573
567
        }
574
568
        default:
575
569
                break;
619
613
                new_kw = mailbox_keywords_create_from_indexes(box,
620
614
                                                              &new_indexes);
621
615
        } T_END;
622
 
        mailbox_keywords_unref(box, _kw1);
623
 
        mailbox_keywords_unref(box, _kw2);
 
616
        mailbox_keywords_unref(_kw1);
 
617
        mailbox_keywords_unref(_kw2);
624
618
        return new_kw;
625
619
}
626
620
 
635
629
        prev_flags_arg = prev_not_flags_arg = NULL;
636
630
        prev_kw_arg = prev_not_kw_arg = NULL;
637
631
        while (args != NULL) {
638
 
                if (args->not && (args->type == SEARCH_SUB ||
639
 
                                  args->type == SEARCH_OR)) {
 
632
                if (args->match_not && (args->type == SEARCH_SUB ||
 
633
                                        args->type == SEARCH_OR)) {
640
634
                        /* neg(p and q and ..) == neg(p) or neg(q) or ..
641
635
                           neg(p or q or ..) == neg(p) and neg(q) and .. */
642
636
                        args->type = args->type == SEARCH_SUB ?
643
637
                                SEARCH_OR : SEARCH_SUB;
644
 
                        args->not = FALSE;
 
638
                        args->match_not = FALSE;
645
639
                        sub = args->value.subargs;
646
640
                        do {
647
 
                                sub->not = !sub->not;
 
641
                                sub->match_not = !sub->match_not;
648
642
                                sub = sub->next;
649
643
                        } while (sub != NULL);
650
644
                }
671
665
                }
672
666
 
673
667
                /* merge all flags arguments */
674
 
                if (args->type == SEARCH_FLAGS && !args->not && parent_and) {
 
668
                if (args->type == SEARCH_FLAGS &&
 
669
                    !args->match_not && parent_and) {
675
670
                        if (prev_flags_arg == NULL)
676
671
                                prev_flags_arg = args;
677
672
                        else {
681
676
                                args = args->next;
682
677
                                continue;
683
678
                        }
684
 
                } else if (args->type == SEARCH_FLAGS && args->not &&
 
679
                } else if (args->type == SEARCH_FLAGS && args->match_not &&
685
680
                           !parent_and) {
686
681
                        if (prev_not_flags_arg == NULL)
687
682
                                prev_not_flags_arg = args;
695
690
                }
696
691
 
697
692
                /* merge all keywords arguments */
698
 
                if (args->type == SEARCH_KEYWORDS && !args->not && parent_and) {
 
693
                if (args->type == SEARCH_KEYWORDS &&
 
694
                    !args->match_not && parent_and) {
699
695
                        if (prev_kw_arg == NULL)
700
696
                                prev_kw_arg = args;
701
697
                        else {
707
703
                                args = args->next;
708
704
                                continue;
709
705
                        }
710
 
                } else if (args->type == SEARCH_KEYWORDS && args->not &&
711
 
                           !parent_and) {
 
706
                } else if (args->type == SEARCH_KEYWORDS &&
 
707
                           args->match_not && !parent_and) {
712
708
                        if (prev_not_kw_arg == NULL)
713
709
                                prev_not_kw_arg = args;
714
710
                        else {
809
805
                                       const struct mail_search_arg *arg2)
810
806
{
811
807
        if (arg1->type != arg2->type ||
812
 
            arg1->not != arg2->not)
 
808
            arg1->match_not != arg2->match_not)
813
809
                return FALSE;
814
810
 
815
811
        switch (arg1->type) {
850
846
                /* fall through */
851
847
        case SEARCH_BODY:
852
848
        case SEARCH_TEXT:
853
 
        case SEARCH_BODY_FAST:
854
 
        case SEARCH_TEXT_FAST:
855
849
        case SEARCH_GUID:
856
850
        case SEARCH_MAILBOX:
857
851
        case SEARCH_MAILBOX_GUID:
895
889
        i_assert(args1->simplified == args2->simplified);
896
890
        i_assert(args1->box == args2->box);
897
891
 
898
 
        if (null_strcmp(args1->charset, args2->charset) != 0)
899
 
                return FALSE;
900
 
 
901
892
        return mail_search_arg_equals(args1->args, args2->args);
902
893
}
 
894
 
 
895
static void
 
896
mail_search_args_result_serialize_arg(const struct mail_search_arg *arg,
 
897
                                      buffer_t *dest)
 
898
{
 
899
        const struct mail_search_arg *subarg;
 
900
 
 
901
        buffer_append_c(dest, arg->result < 0 ? 0xff : arg->result);
 
902
 
 
903
        switch (arg->type) {
 
904
        case SEARCH_OR:
 
905
        case SEARCH_SUB:
 
906
        case SEARCH_INTHREAD:
 
907
                subarg = arg->value.subargs;
 
908
                for (; subarg != NULL; subarg = subarg->next)
 
909
                        mail_search_args_result_serialize_arg(subarg, dest);
 
910
        default:
 
911
                break;
 
912
        }
 
913
}
 
914
 
 
915
void mail_search_args_result_serialize(const struct mail_search_args *args,
 
916
                                       buffer_t *dest)
 
917
{
 
918
        mail_search_args_result_serialize_arg(args->args, dest);
 
919
}
 
920
 
 
921
static void
 
922
mail_search_args_result_deserialize_arg(struct mail_search_arg *arg,
 
923
                                        const unsigned char **data,
 
924
                                        size_t *size)
 
925
{
 
926
        struct mail_search_arg *subarg;
 
927
 
 
928
        i_assert(*size > 0);
 
929
        arg->result = **data == 0xff ? -1 : **data;
 
930
        *data += 1; *size -= 1;
 
931
 
 
932
        switch (arg->type) {
 
933
        case SEARCH_OR:
 
934
        case SEARCH_SUB:
 
935
        case SEARCH_INTHREAD:
 
936
                subarg = arg->value.subargs;
 
937
                for (; subarg != NULL; subarg = subarg->next) {
 
938
                        mail_search_args_result_deserialize_arg(subarg,
 
939
                                                                data, size);
 
940
                }
 
941
        default:
 
942
                break;
 
943
        }
 
944
}
 
945
 
 
946
void mail_search_args_result_deserialize(struct mail_search_args *args,
 
947
                                         const unsigned char *data, size_t size)
 
948
{
 
949
        mail_search_args_result_deserialize_arg(args->args, &data, &size);
 
950
}