1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.apache.james.fetchmail;
23
24 import java.net.UnknownHostException;
25 import java.util.HashSet;
26 import java.util.Set;
27 import java.util.StringTokenizer;
28
29 import javax.mail.internet.ParseException;
30
31 import org.apache.avalon.framework.configuration.Configuration;
32 import org.apache.avalon.framework.configuration.ConfigurationException;
33 import org.apache.avalon.framework.logger.Logger;
34 import org.apache.james.api.dnsservice.DNSService;
35 import org.apache.james.api.user.UsersRepository;
36 import org.apache.james.services.MailServer;
37 import org.apache.mailet.MailAddress;
38
39
40
41
42
43
44
45
46 class ParsedConfiguration
47 {
48
49
50
51 private Logger fieldLogger;
52
53
54
55
56
57 private String fieldJavaMailFolderName = "INBOX";
58
59
60
61
62
63
64 private String fieldJavaMailProviderName = "pop3";
65
66
67
68
69
70
71 public String getJavaMailFolderName()
72 {
73 return fieldJavaMailFolderName;
74 }
75
76
77
78
79
80
81 public String getJavaMailProviderName()
82 {
83 return fieldJavaMailProviderName;
84 }
85
86
87
88
89
90
91 protected void setJavaMailFolderName(String javaMailFolderName)
92 {
93 fieldJavaMailFolderName = javaMailFolderName;
94 }
95
96
97
98
99
100
101 protected void setJavaMailProviderName(String javaMailProviderName)
102 {
103 fieldJavaMailProviderName = javaMailProviderName;
104 }
105
106
107
108
109
110
111
112
113 private boolean fieldFetchAll = false;
114
115
116
117
118
119 private String fieldFetchTaskName;
120
121
122
123
124
125 private String fieldHost;
126
127
128
129
130
131 private boolean fieldLeave = false;
132
133
134
135
136
137 private boolean fieldLeaveBlacklisted = true;
138
139
140
141
142
143
144 private boolean fieldLeaveRemoteRecipient = true;
145
146
147
148
149
150
151 private boolean fieldLeaveUserUndefined = true;
152
153
154
155
156
157
158 private boolean fieldLeaveUndeliverable = true;
159
160
161
162
163
164
165 private boolean fieldMarkSeen = true;
166
167
168
169
170
171 private boolean fieldMarkBlacklistedSeen = false;
172
173
174
175
176
177 private boolean fieldMarkRemoteRecipientSeen = false;
178
179
180
181
182
183 private boolean fieldMarkUserUndefinedSeen = false;
184
185
186
187
188
189 private boolean fieldMarkUndeliverableSeen = false;
190
191
192
193
194
195 private boolean fieldDeferRecipientNotFound = false;
196
197
198
199
200
201 private boolean fieldRecurse = false;
202
203
204
205
206
207 private MailServer fieldServer;
208
209
210
211
212
213 private String fieldDefaultDomainName;
214
215
216
217
218
219 private boolean fieldRejectUserUndefined;
220
221
222
223
224
225 private int fieldRemoteReceivedHeaderIndex = -1;
226
227
228
229
230
231
232 private boolean fieldLeaveRemoteReceivedHeaderInvalid = true;
233
234
235
236
237
238 private boolean fieldMarkRemoteReceivedHeaderInvalidSeen = false;
239
240
241
242
243 private boolean fieldRejectRemoteReceivedHeaderInvalid;
244
245
246
247
248 private boolean fieldRejectRecipientNotFound;
249
250
251
252
253
254 private boolean fieldLeaveRecipientNotFound;
255
256
257
258
259
260 private boolean fieldMarkRecipientNotFoundSeen;
261
262
263
264
265 private boolean fieldRejectBlacklisted;
266
267
268
269
270
271 private boolean fieldRejectRemoteRecipient;
272
273
274
275
276 private Set fieldBlacklist;
277
278
279
280
281
282 private int fieldMaxMessageSizeLimit = 0;
283
284
285
286
287 private boolean fieldRejectMaxMessageSizeExceeded;
288
289
290
291
292 private boolean fieldLeaveMaxMessageSizeExceeded;
293
294
295
296
297
298 private boolean fieldMarkMaxMessageSizeExceededSeen;
299
300
301
302
303 private UsersRepository fieldLocalUsers;
304
305
306
307
308
309 private DNSService dnsServer;
310
311
312
313
314
315
316 private ParsedConfiguration()
317 {
318 super();
319 }
320
321
322
323
324
325
326
327
328
329
330 public ParsedConfiguration(Configuration configuration, Logger logger, MailServer server, UsersRepository localUsers,DNSService dnsServer) throws ConfigurationException
331 {
332 this();
333 setLogger(logger);
334 setServer(server);
335 setLocalUsers(localUsers);
336 setDNSServer(dnsServer);
337 configure(configuration);
338 }
339
340
341
342
343 protected void configure(Configuration conf) throws ConfigurationException
344 {
345 setHost(conf.getChild("host").getValue());
346
347 setFetchTaskName(conf.getAttribute("name"));
348 setJavaMailProviderName(
349 conf.getChild("javaMailProviderName").getValue());
350 setJavaMailFolderName(conf.getChild("javaMailFolderName").getValue());
351 setRecurse(conf.getChild("recursesubfolders").getValueAsBoolean());
352
353 Configuration recipientNotFound = conf.getChild("recipientnotfound");
354 setDeferRecipientNotFound(
355 recipientNotFound.getAttributeAsBoolean("defer"));
356 setRejectRecipientNotFound(
357 recipientNotFound.getAttributeAsBoolean("reject"));
358 setLeaveRecipientNotFound(
359 recipientNotFound.getAttributeAsBoolean("leaveonserver"));
360 setMarkRecipientNotFoundSeen(
361 recipientNotFound.getAttributeAsBoolean("markseen"));
362
363 Configuration defaultDomainName = conf.getChild("defaultdomain", false);
364 if (null != defaultDomainName)
365 setDefaultDomainName(defaultDomainName.getValue());
366
367 setFetchAll(conf.getChild("fetchall").getValueAsBoolean());
368
369 Configuration fetched = conf.getChild("fetched");
370 setLeave(fetched.getAttributeAsBoolean("leaveonserver"));
371 setMarkSeen(fetched.getAttributeAsBoolean("markseen"));
372
373 Configuration remoterecipient = conf.getChild("remoterecipient");
374 setRejectRemoteRecipient(
375 remoterecipient.getAttributeAsBoolean("reject"));
376 setLeaveRemoteRecipient(
377 remoterecipient.getAttributeAsBoolean("leaveonserver"));
378 setMarkRemoteRecipientSeen(
379 remoterecipient.getAttributeAsBoolean("markseen"));
380
381 Configuration blacklist = conf.getChild("blacklist");
382 setBlacklist(blacklist.getValue(""));
383 setRejectBlacklisted(blacklist.getAttributeAsBoolean("reject"));
384 setLeaveBlacklisted(blacklist.getAttributeAsBoolean("leaveonserver"));
385 setMarkBlacklistedSeen(blacklist.getAttributeAsBoolean("markseen"));
386
387 Configuration userundefined = conf.getChild("userundefined");
388 setRejectUserUndefined(userundefined.getAttributeAsBoolean("reject"));
389 setLeaveUserUndefined(
390 userundefined.getAttributeAsBoolean("leaveonserver"));
391 setMarkUserUndefinedSeen(
392 userundefined.getAttributeAsBoolean("markseen"));
393
394 Configuration undeliverable = conf.getChild("undeliverable");
395 setLeaveUndeliverable(
396 undeliverable.getAttributeAsBoolean("leaveonserver"));
397 setMarkUndeliverableSeen(
398 undeliverable.getAttributeAsBoolean("markseen"));
399
400 Configuration remotereceivedheader = conf.getChild("remotereceivedheader", false);
401 if (null != remotereceivedheader)
402 {
403 setRemoteReceivedHeaderIndex(
404 remotereceivedheader.getAttributeAsInteger("index"));
405 setRejectRemoteReceivedHeaderInvalid(
406 remotereceivedheader.getAttributeAsBoolean("reject"));
407 setLeaveRemoteReceivedHeaderInvalid(
408 remotereceivedheader.getAttributeAsBoolean("leaveonserver"));
409 setMarkRemoteReceivedHeaderInvalidSeen(
410 remotereceivedheader.getAttributeAsBoolean("markseen"));
411 }
412
413 Configuration maxmessagesize = conf.getChild("maxmessagesize", false);
414 if (null != maxmessagesize)
415 {
416 setMaxMessageSizeLimit(
417 maxmessagesize.getAttributeAsInteger("limit") * 1024);
418 setRejectMaxMessageSizeExceeded(
419 maxmessagesize.getAttributeAsBoolean("reject"));
420 setLeaveMaxMessageSizeExceeded(
421 maxmessagesize.getAttributeAsBoolean("leaveonserver"));
422 setMarkMaxMessageSizeExceededSeen(
423 maxmessagesize.getAttributeAsBoolean("markseen"));
424 }
425
426 if (getLogger().isDebugEnabled())
427 {
428 getLogger().info(
429 "Configured FetchMail fetch task " + getFetchTaskName());
430 }
431 }
432
433
434
435
436
437
438
439
440 public boolean isFetchAll()
441 {
442 return fieldFetchAll;
443 }
444
445
446
447
448
449 public String getFetchTaskName()
450 {
451 return fieldFetchTaskName;
452 }
453
454
455
456
457
458 public String getHost()
459 {
460 return fieldHost;
461 }
462
463
464
465
466
467 public boolean isLeave()
468 {
469 return fieldLeave;
470 }
471
472
473
474
475
476 public boolean isMarkSeen()
477 {
478 return fieldMarkSeen;
479 }
480
481
482
483
484
485
486
487
488 protected boolean isOpenReadOnly()
489 {
490 return isLeave()
491 && !isMarkSeen()
492 && isLeaveBlacklisted()
493 && !isMarkBlacklistedSeen()
494 && isLeaveRemoteRecipient()
495 && !isMarkRemoteRecipientSeen()
496 && isLeaveUserUndefined()
497 && !isMarkUserUndefinedSeen()
498 && isLeaveUndeliverable()
499 && !isMarkUndeliverableSeen()
500 && isLeaveMaxMessageSizeExceeded()
501 && !isMarkMaxMessageSizeExceededSeen()
502 && isLeaveRemoteReceivedHeaderInvalid()
503 && !isMarkRemoteReceivedHeaderInvalidSeen()
504 ;
505 }
506
507
508
509
510
511 public boolean isRecurse()
512 {
513 return fieldRecurse;
514 }
515
516
517
518
519
520 public MailServer getServer()
521 {
522 return fieldServer;
523 }
524
525
526
527
528
529 protected void setFetchAll(boolean fetchAll)
530 {
531 fieldFetchAll = fetchAll;
532 }
533
534
535
536
537
538 protected void setFetchTaskName(String fetchTaskName)
539 {
540 fieldFetchTaskName = fetchTaskName;
541 }
542
543
544
545
546
547 protected void setHost(String host)
548 {
549 fieldHost = host;
550 }
551
552
553
554
555
556 protected void setLeave(boolean keep)
557 {
558 fieldLeave = keep;
559 }
560
561
562
563
564
565 protected void setMarkSeen(boolean markSeen)
566 {
567 fieldMarkSeen = markSeen;
568 }
569
570
571
572
573
574 protected void setRecurse(boolean recurse)
575 {
576 fieldRecurse = recurse;
577 }
578
579
580
581
582
583 protected void setServer(MailServer server)
584 {
585 fieldServer = server;
586 }
587
588
589
590
591
592 public Logger getLogger()
593 {
594 return fieldLogger;
595 }
596
597
598
599
600
601 protected void setLogger(Logger logger)
602 {
603 fieldLogger = logger;
604 }
605
606
607
608
609
610 public UsersRepository getLocalUsers()
611 {
612 return fieldLocalUsers;
613 }
614
615
616
617
618
619 protected void setLocalUsers(UsersRepository localUsers)
620 {
621 fieldLocalUsers = localUsers;
622 }
623
624
625
626
627
628
629 public DNSService getDNSServer()
630 {
631 return dnsServer;
632 }
633
634
635
636
637
638
639 protected void setDNSServer(DNSService dnsServer)
640 {
641 this.dnsServer = dnsServer;
642 }
643
644
645
646
647
648 public boolean isLeaveBlacklisted()
649 {
650 return fieldLeaveBlacklisted;
651 }
652
653
654
655
656
657 public boolean isMarkBlacklistedSeen()
658 {
659 return fieldMarkBlacklistedSeen;
660 }
661
662
663
664
665
666 protected void setLeaveBlacklisted(boolean keepRejected)
667 {
668 fieldLeaveBlacklisted = keepRejected;
669 }
670
671
672
673
674
675 protected void setMarkBlacklistedSeen(boolean markRejectedSeen)
676 {
677 fieldMarkBlacklistedSeen = markRejectedSeen;
678 }
679
680
681
682
683
684 public Set getBlacklist()
685 {
686 return fieldBlacklist;
687 }
688
689
690
691
692
693 protected void setBlacklist(Set blacklist)
694 {
695 fieldBlacklist = blacklist;
696 }
697
698
699
700
701
702 protected void setBlacklist(String blacklistValue)
703 throws ConfigurationException
704 {
705 StringTokenizer st = new StringTokenizer(blacklistValue, ", \t", false);
706 Set blacklist = new HashSet();
707 String token = null;
708 while (st.hasMoreTokens())
709 {
710 try
711 {
712 token = st.nextToken();
713 blacklist.add(new MailAddress(token));
714 }
715 catch (ParseException pe)
716 {
717 throw new ConfigurationException(
718 "Invalid blacklist mail address specified: " + token);
719 }
720 }
721 setBlacklist(blacklist);
722 }
723
724
725
726
727
728 public boolean isRejectUserUndefined()
729 {
730 return fieldRejectUserUndefined;
731 }
732
733
734
735
736
737 protected void setRejectUserUndefined(boolean localRecipientsOnly)
738 {
739 fieldRejectUserUndefined = localRecipientsOnly;
740 }
741
742
743
744
745
746 public boolean isMarkUserUndefinedSeen()
747 {
748 return fieldMarkUserUndefinedSeen;
749 }
750
751
752
753
754
755 protected void setMarkUserUndefinedSeen(boolean markExternalSeen)
756 {
757 fieldMarkUserUndefinedSeen = markExternalSeen;
758 }
759
760
761
762
763
764 public boolean isLeaveUserUndefined()
765 {
766 return fieldLeaveUserUndefined;
767 }
768
769
770
771
772
773 protected void setLeaveUserUndefined(boolean leaveExternal)
774 {
775 fieldLeaveUserUndefined = leaveExternal;
776 }
777
778
779
780
781
782 public boolean isLeaveRemoteRecipient()
783 {
784 return fieldLeaveRemoteRecipient;
785 }
786
787
788
789
790
791 public boolean isMarkRemoteRecipientSeen()
792 {
793 return fieldMarkRemoteRecipientSeen;
794 }
795
796
797
798
799
800 protected void setLeaveRemoteRecipient(boolean leaveRemoteRecipient)
801 {
802 fieldLeaveRemoteRecipient = leaveRemoteRecipient;
803 }
804
805
806
807
808
809 protected void setMarkRemoteRecipientSeen(boolean markRemoteRecipientSeen)
810 {
811 fieldMarkRemoteRecipientSeen = markRemoteRecipientSeen;
812 }
813
814
815
816
817
818 public boolean isRejectRemoteRecipient()
819 {
820 return fieldRejectRemoteRecipient;
821 }
822
823
824
825
826
827 protected void setRejectRemoteRecipient(boolean rejectRemoteRecipient)
828 {
829 fieldRejectRemoteRecipient = rejectRemoteRecipient;
830 }
831
832
833
834
835
836 public String getDefaultDomainName()
837 {
838 String defaultDomainName = null;
839 if (null == (defaultDomainName = getDefaultDomainNameBasic()))
840 {
841 updateDefaultDomainName();
842 return getDefaultDomainName();
843 }
844 return defaultDomainName;
845 }
846
847
848
849
850
851 private String getDefaultDomainNameBasic()
852 {
853 return fieldDefaultDomainName;
854 }
855
856
857
858
859
860 protected void setDefaultDomainName(String defaultDomainName) throws ConfigurationException
861 {
862 validateDefaultDomainName(defaultDomainName);
863 setDefaultDomainNameBasic(defaultDomainName);
864 }
865
866
867
868
869
870 private void setDefaultDomainNameBasic(String defaultDomainName)
871 {
872 fieldDefaultDomainName = defaultDomainName;
873 }
874
875
876
877
878
879 protected void validateDefaultDomainName(String defaultDomainName) throws ConfigurationException
880 {
881 if (!getServer().isLocalServer(defaultDomainName))
882 {
883 throw new ConfigurationException(
884 "Default domain name is not a local server: "
885 + defaultDomainName);
886 }
887 }
888
889
890
891
892 protected String computeDefaultDomainName()
893 {
894 String hostName = null;
895 try
896 {
897 hostName = getDNSServer().getLocalHost().getCanonicalHostName();
898 }
899 catch (UnknownHostException ue)
900 {
901 hostName = "localhost";
902 }
903 return hostName;
904 }
905
906
907
908
909 protected void updateDefaultDomainName()
910 {
911 setDefaultDomainNameBasic(computeDefaultDomainName());
912 }
913
914
915
916
917
918 public boolean isLeaveUndeliverable()
919 {
920 return fieldLeaveUndeliverable;
921 }
922
923
924
925
926
927 public boolean isMarkUndeliverableSeen()
928 {
929 return fieldMarkUndeliverableSeen;
930 }
931
932
933
934
935
936 protected void setLeaveUndeliverable(boolean leaveUndeliverable)
937 {
938 fieldLeaveUndeliverable = leaveUndeliverable;
939 }
940
941
942
943
944
945 protected void setMarkUndeliverableSeen(boolean markUndeliverableSeen)
946 {
947 fieldMarkUndeliverableSeen = markUndeliverableSeen;
948 }
949
950
951
952
953
954 public boolean isRejectBlacklisted()
955 {
956 return fieldRejectBlacklisted;
957 }
958
959
960
961
962
963 protected void setRejectBlacklisted(boolean rejectBlacklisted)
964 {
965 fieldRejectBlacklisted = rejectBlacklisted;
966 }
967
968
969
970
971
972 public boolean isLeaveRecipientNotFound()
973 {
974 return fieldLeaveRecipientNotFound;
975 }
976
977
978
979
980
981 public boolean isMarkRecipientNotFoundSeen()
982 {
983 return fieldMarkRecipientNotFoundSeen;
984 }
985
986
987
988
989
990 public boolean isRejectRecipientNotFound()
991 {
992 return fieldRejectRecipientNotFound;
993 }
994
995
996
997
998
999 protected void setLeaveRecipientNotFound(boolean leaveRecipientNotFound)
1000 {
1001 fieldLeaveRecipientNotFound = leaveRecipientNotFound;
1002 }
1003
1004
1005
1006
1007
1008 protected void setMarkRecipientNotFoundSeen(boolean markRecipientNotFoundSeen)
1009 {
1010 fieldMarkRecipientNotFoundSeen = markRecipientNotFoundSeen;
1011 }
1012
1013
1014
1015
1016
1017 protected void setRejectRecipientNotFound(boolean rejectRecipientNotFound)
1018 {
1019 fieldRejectRecipientNotFound = rejectRecipientNotFound;
1020 }
1021
1022
1023
1024
1025
1026 public boolean isDeferRecipientNotFound()
1027 {
1028 return fieldDeferRecipientNotFound;
1029 }
1030
1031
1032
1033
1034
1035 protected void setDeferRecipientNotFound(boolean deferRecipientNotFound)
1036 {
1037 fieldDeferRecipientNotFound = deferRecipientNotFound;
1038 }
1039
1040
1041
1042
1043
1044 public int getRemoteReceivedHeaderIndex()
1045 {
1046 return fieldRemoteReceivedHeaderIndex;
1047 }
1048
1049
1050
1051
1052
1053 protected void setRemoteReceivedHeaderIndex(int remoteReceivedHeaderIndex)
1054 {
1055 fieldRemoteReceivedHeaderIndex = remoteReceivedHeaderIndex;
1056 }
1057
1058
1059
1060
1061
1062 public boolean isLeaveMaxMessageSizeExceeded()
1063 {
1064 return fieldLeaveMaxMessageSizeExceeded;
1065 }
1066
1067
1068
1069
1070
1071 public boolean isMarkMaxMessageSizeExceededSeen()
1072 {
1073 return fieldMarkMaxMessageSizeExceededSeen;
1074 }
1075
1076
1077
1078
1079
1080 public int getMaxMessageSizeLimit()
1081 {
1082 return fieldMaxMessageSizeLimit;
1083 }
1084
1085
1086
1087
1088
1089 public boolean isRejectMaxMessageSizeExceeded()
1090 {
1091 return fieldRejectMaxMessageSizeExceeded;
1092 }
1093
1094
1095
1096
1097
1098 protected void setLeaveMaxMessageSizeExceeded(boolean leaveMaxMessageSize)
1099 {
1100 fieldLeaveMaxMessageSizeExceeded = leaveMaxMessageSize;
1101 }
1102
1103
1104
1105
1106
1107 protected void setMarkMaxMessageSizeExceededSeen(boolean markMaxMessageSizeSeen)
1108 {
1109 fieldMarkMaxMessageSizeExceededSeen = markMaxMessageSizeSeen;
1110 }
1111
1112
1113
1114
1115
1116 protected void setMaxMessageSizeLimit(int maxMessageSizeLimit)
1117 {
1118 fieldMaxMessageSizeLimit = maxMessageSizeLimit;
1119 }
1120
1121
1122
1123
1124
1125 protected void setRejectMaxMessageSizeExceeded(boolean rejectMaxMessageSize)
1126 {
1127 fieldRejectMaxMessageSizeExceeded = rejectMaxMessageSize;
1128 }
1129
1130
1131
1132
1133
1134 public boolean isLeaveRemoteReceivedHeaderInvalid()
1135 {
1136 return fieldLeaveRemoteReceivedHeaderInvalid;
1137 }
1138
1139
1140
1141
1142
1143 public boolean isMarkRemoteReceivedHeaderInvalidSeen()
1144 {
1145 return fieldMarkRemoteReceivedHeaderInvalidSeen;
1146 }
1147
1148
1149
1150
1151
1152 public boolean isRejectRemoteReceivedHeaderInvalid()
1153 {
1154 return fieldRejectRemoteReceivedHeaderInvalid;
1155 }
1156
1157
1158
1159
1160
1161 protected void setLeaveRemoteReceivedHeaderInvalid(boolean leaveRemoteReceivedHeaderInvalid)
1162 {
1163 fieldLeaveRemoteReceivedHeaderInvalid =
1164 leaveRemoteReceivedHeaderInvalid;
1165 }
1166
1167
1168
1169
1170
1171 protected void setMarkRemoteReceivedHeaderInvalidSeen(boolean markRemoteReceivedHeaderInvalidSeen)
1172 {
1173 fieldMarkRemoteReceivedHeaderInvalidSeen =
1174 markRemoteReceivedHeaderInvalidSeen;
1175 }
1176
1177
1178
1179
1180
1181 protected void setRejectRemoteReceivedHeaderInvalid(boolean rejectRemoteReceivedHeaderInvalid)
1182 {
1183 fieldRejectRemoteReceivedHeaderInvalid =
1184 rejectRemoteReceivedHeaderInvalid;
1185 }
1186
1187 }