From 8f6e3e2a2dc09399a99d517c44f0e5a7cc3a12e7 Mon Sep 17 00:00:00 2001 From: Nick Bebout Date: Tue, 14 Jun 2011 05:59:46 -0500 Subject: [PATCH] 1.422 --- CONCEPTION | 26 - CREDITS | 8 +- ChangeLog | 62 +- INSTALL | 63 +- Makefile | 13 +- README | 10 +- RECORD | 46 - TIME | 4 + TODO | 13 +- VERSION | 2 +- VERSION_EXE | 2 +- adwords | 6 - freshmeat | 10 - freshmeat_submition.inp | 15 - freshmeat_submition.json | 9 - freshmeat_submition.out | 12 - imapsync | 330 +- imapsync-1.366 | 4310 ------------------------- imapsync-1.404 | 4830 ---------------------------- imapsync.exe | Bin 5820177 -> 0 bytes index.shtml | 51 +- lsm.imapsync | 16 - memo | 40 +- paypal.shtml | 4 +- paypal_reply/8859_utf8 | 13 - paypal_reply/TODO | 6 - paypal_reply/memo | 147 - paypal_reply/paypal_bilan | 773 ----- paypal_reply/paypal_bilan_1.22 | 756 ----- paypal_reply/paypal_build_invoices | 83 - paypal_reply/paypal_build_reply | 160 - paypal_reply/paypal_functions | 227 -- paypal_reply/paypal_imapget | 134 - paypal_reply/paypal_mimeexplode | 187 -- paypal_reply/paypal_run_dev | 30 - paypal_reply/paypal_run_laposte | 30 - paypal_reply/paypal_run_petite | 30 - paypal_reply/paypal_send | 71 - paypal_reply/paypal_send_invoices | 43 - paypal_return.shtml | 12 +- t/01_connect | 15 - t/01_connect.229.dump | 16 - t/02_append_string | 35 - t/03_message_to_file | 53 - t/03_message_to_file.dump | 91 - t/04_parse_headers | 21 - t/05_parse_headers_ssl | 26 - t/06_parse_headers_ssl_titi | 26 - tests.sh | 156 +- tools/wonko_ruby_imapsync | 116 - 50 files changed, 576 insertions(+), 12563 deletions(-) delete mode 100644 CONCEPTION delete mode 100644 RECORD delete mode 100644 adwords delete mode 100644 freshmeat delete mode 100644 freshmeat_submition.inp delete mode 100644 freshmeat_submition.json delete mode 100644 freshmeat_submition.out delete mode 100755 imapsync-1.366 delete mode 100755 imapsync-1.404 delete mode 100755 imapsync.exe delete mode 100644 lsm.imapsync delete mode 100755 paypal_reply/8859_utf8 delete mode 100644 paypal_reply/TODO delete mode 100644 paypal_reply/memo delete mode 100755 paypal_reply/paypal_bilan delete mode 100755 paypal_reply/paypal_bilan_1.22 delete mode 100644 paypal_reply/paypal_build_invoices delete mode 100755 paypal_reply/paypal_build_reply delete mode 100755 paypal_reply/paypal_functions delete mode 100755 paypal_reply/paypal_imapget delete mode 100755 paypal_reply/paypal_mimeexplode delete mode 100755 paypal_reply/paypal_run_dev delete mode 100755 paypal_reply/paypal_run_laposte delete mode 100755 paypal_reply/paypal_run_petite delete mode 100755 paypal_reply/paypal_send delete mode 100644 paypal_reply/paypal_send_invoices delete mode 100755 t/01_connect delete mode 100644 t/01_connect.229.dump delete mode 100755 t/02_append_string delete mode 100755 t/03_message_to_file delete mode 100644 t/03_message_to_file.dump delete mode 100755 t/04_parse_headers delete mode 100755 t/05_parse_headers_ssl delete mode 100755 t/06_parse_headers_ssl_titi delete mode 100644 tools/wonko_ruby_imapsync diff --git a/CONCEPTION b/CONCEPTION deleted file mode 100644 index a786035..0000000 --- a/CONCEPTION +++ /dev/null @@ -1,26 +0,0 @@ - -===== Synopsis ===== - -$mailbox_1 = Mail::imapsync::mailbox->new(); -$mailbox_2 = Mail::imapsync::mailbox->new(); - - -$mailbox_1->host('imap1.lala.org'); -$mailbox_1->user('toto1'); -... - -$mailbox_2->host('imap2.lala.org'); -$mailbox_2->user('toto2'); -... - - -$transfer = Mail::imapsync::transfer->new(); -$transfer->sync($mailbox_1, $mailbox_2); - - -- an object for mailbox -- an object for a transfer -- ?an object for a folder? -- ?an object for a message? - - diff --git a/CREDITS b/CREDITS index bb21e8b..f2391a8 100644 --- a/CREDITS +++ b/CREDITS @@ -1,5 +1,5 @@ #!/bin/cat -# $Id: CREDITS,v 1.156 2011/03/15 00:51:57 gilles Exp gilles $ +# $Id: CREDITS,v 1.157 2011/05/07 02:30:05 gilles Exp gilles $ If you want to make a donation to the author, Gilles LAMIRAL, use any of the following ways: @@ -30,6 +30,10 @@ I thank very much all of these people. I thank also very much all people who bought imapsync from the homepage but I don't cite them here. +Unknow +Contributed by giving the book +20.31 "Fluid Concepts And Creative Analogies: Computer Models Of The Fundamental Mechanisms Of Thought" + Khalid Shakir Contributed by giving the book 75.00 "Selected Papers on Fun and Games [Hardcover]" @@ -996,6 +1000,8 @@ Eric Yung Total amount of book prices : c \ +20.31+\ +\ 75.00+\ \ 35.16+\ diff --git a/ChangeLog b/ChangeLog index 24f3c03..0f77648 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,17 +1,71 @@ RCS file: RCS/imapsync,v Working file: imapsync -head: 1.411 +head: 1.422 branch: locks: strict - gilles: 1.411 + gilles: 1.422 access list: symbolic names: keyword substitution: kv -total revisions: 411; selected revisions: 411 +total revisions: 422; selected revisions: 422 description: ---------------------------- -revision 1.411 locked by: gilles; +revision 1.422 locked by: gilles; +date: 2011/05/08 17:21:38; author: gilles; state: Exp; lines: +17 -12 +Added --debugLIST to track messages list uid or number only. +Bugfix: a lack of variable initialisation caused to fetch no existing messages. + The APPEND error then the FETCH 0 byte error may be fixed now. +---------------------------- +revision 1.421 +date: 2011/05/08 12:28:10; author: gilles; state: Exp; lines: +8 -8 +relogin1 before each folder select. +---------------------------- +revision 1.420 +date: 2011/05/08 00:54:05; author: gilles; state: Exp; lines: +15 -18 +--splitX are set into sub login_imap() now. +---------------------------- +revision 1.419 +date: 2011/05/08 00:36:36; author: gilles; state: Exp; lines: +58 -8 +Added --relogin1 option (--relogin1 5) to force a reconnection when FETCH message fails on host1. +---------------------------- +revision 1.418 +date: 2011/05/07 22:15:36; author: gilles; state: Exp; lines: +95 -38 +Added --debugcontent to avoid debugging content (can be big) with --debug option. +Added --debugflags to permit flag debugging only. +Added --flagsCase to correct flag case that are not RFC compliant \SEEN -> \Seen (on by default). +Added output to track 0 byte messages during the fetch on host1. +---------------------------- +revision 1.417 +date: 2011/05/05 16:12:02; author: gilles; state: Exp; lines: +7 -7 +Bugfix. --proxyauth2 was setting proxyauth1! +Thanks to Denis BREAN! +---------------------------- +revision 1.416 +date: 2011/05/01 20:44:40; author: gilles; state: Exp; lines: +8 -8 +MDaemon 12 +Exchange 6.5 host1 +---------------------------- +revision 1.415 +date: 2011/04/30 15:33:31; author: gilles; state: Exp; lines: +20 -14 +Bugfix. Modified create_folder() to avoid Inbox -> INBOX problem ("already exists"). +---------------------------- +revision 1.414 +date: 2011/04/30 00:25:38; author: gilles; state: Exp; lines: +41 -19 +Bugfix. --maxsize --minsize now work with --useuid +Bugfix. flag sync of already transfered messages now take care of --maxsize --minsize options. +---------------------------- +revision 1.413 +date: 2011/04/28 22:55:48; author: gilles; state: Exp; lines: +25 -12 +--delete2 implies --expunge2 now unless --noexpunge2 is given. +exit if --delete and --delete2 are given together. +Same behavior for --expunge or --expunge1. +---------------------------- +revision 1.412 +date: 2011/04/28 14:49:59; author: gilles; state: Exp; lines: +17 -15 +Added 0 length message tracking when fetching host1. +---------------------------- +revision 1.411 date: 2011/04/19 23:34:30; author: gilles; state: Exp; lines: +19 -11 Bugfix for "Folders in host2 not in host1" list when folders are given by --folder option or equivalent. The old list listed too many folders with --folder INBOX for example. diff --git a/INSTALL b/INSTALL index 037f8e6..87d6284 100644 --- a/INSTALL +++ b/INSTALL @@ -1,4 +1,4 @@ -# $Id: INSTALL,v 1.19 2010/11/09 02:52:18 gilles Exp gilles $ +# $Id: INSTALL,v 1.20 2011/05/07 02:14:58 gilles Exp gilles $ # # INSTALL file for imapsync # imapsync : IMAP sync or copy tool. @@ -7,15 +7,15 @@ INTRODUCTION ------------ imapsync works fine under any Unix OS with perl. - imapsync works fine under Windows (2000, XP) and ActiveState's 5.8 Perl + imapsync.exe works fine under Windows XP, Vista, Seven, 20XX. - imapsync is already available directly on the following distributions (at least): - FreeBSD, Debian, Ubuntu, Gentoo, NetBSD, Darwin, Mandriva and OpenBSD (yeah!). - Get imapsync at - http://www.linux-france.org/prj/imapsync/dist/ +UNIX +---- - You'll find a compressed tarball called imapsync-x.xx.tgz + Buy imapsync at + http://www.linux-france.org/prj/imapsync/ + You'll have access to a compressed tarball called imapsync-x.xx.tgz where x.xx is the version number. Untar the tarball where you want (on Unix): @@ -24,14 +24,30 @@ INTRODUCTION Go into the directory imapsync-x.xx and read the INSTALL file. You're already reading the INSTALL file. -GETTING +WINDOWS ------- -http://www.linux-france.org/prj/imapsync/dist/ -PREREQUISITES +a) Simplest way: + +- Buy imapsync.exe at http://www.linux-france.org/prj/imapsync/ +- Use imapsync.exe. + +b) Hard way: + +- Get imapsync-x.xx.tgz +- Install Perl if it isn't already installed. + Strawberry Perl is a good candidate +- Use PPM to install modules listed in the PREREQUISITES section. + PPM is Perl Package Manager. + + + +PREREQUISITES ------------- +This section doesn't concern Windows imapsync.exe users. + You need : - Perl try : perl -v @@ -101,34 +117,21 @@ Everything in one command: perl -mMail::IMAPClient -mDigest::MD5 -mTerm::ReadKey -mIO::Socket::SSL \ -mFile::Spec -mDigest::HMAC_MD5 -mAuthen::NTLM -e '' -INSTALLING ----------- +INSTALLING on Unix +------------------ + To see what will be done, just run: -make -n install + make -n install To install imapsync, just run: -make install + make install or copy the file imapsync where you want it to be. -WINDOWS -------- - -a) Simplest way: - -- Use imapsync.exe - -b) Hard way: - -- Install Perl if it isn't already installed. - Strawberry Perl is a good candidate -- Use PPM to install modules listed in the PREREQUISITES section. - PPM is Perl Package Manager. - -TESTING -------- +TESTING on Unix +--------------- The test will break as they are home specific. You need a running imap server on localhost with several accounts diff --git a/Makefile b/Makefile index 61c8a80..2d47efa 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ -# $Id: Makefile,v 1.67 2011/04/20 01:20:06 gilles Exp gilles $ +# $Id: Makefile,v 1.72 2011/05/09 00:11:00 gilles Exp gilles $ .PHONY: help usage all @@ -93,7 +93,10 @@ test_quick_3xx: imapsync tests.sh CMD_PERL='perl -I./Mail-IMAPClient-3.28/lib' /usr/bin/time sh tests.sh locallocal 1>/dev/null testv: - nice -40 sh -x tests.sh + sh -x tests.sh + +testv3: + CMD_PERL='perl -I./Mail-IMAPClient-3.28/lib' sh -x tests.sh test: .test_229 .test_3xx @@ -193,8 +196,8 @@ tarball: cidone all imapsync.exe echo making tarball $(DIST_FILE) mkdir -p dist mkdir -p ../prepa_dist/$(DIST_NAME) - rsync -aCv --delete --omit-dir-times --exclude dist/ ./ ../prepa_dist/$(DIST_NAME)/ - rsync -av ./imapsync.exe ../prepa_dist/$(DIST_NAME)/ + rsync -aCv --delete --omit-dir-times --exclude dist/ --exclude imapsync.exe ./ ../prepa_dist/$(DIST_NAME)/ + #rsync -av ./imapsync.exe ../prepa_dist/$(DIST_NAME)/ cd ../prepa_dist && (tar czfv $(DIST_FILE) $(DIST_NAME) || tar czfv $(DIST_FILE) $(DIST_NAME)) #ln -f ../prepa_dist/$(DIST_FILE) dist/ cd ../prepa_dist && md5sum $(DIST_FILE) > $(DIST_FILE).md5.txt @@ -202,7 +205,7 @@ tarball: cidone all imapsync.exe ls -l ../prepa_dist/$(DIST_FILE) ks: - rsync -avz . imapsync@ks.lamiral.info:public_html/imapsync + rsync -avz --delete . imapsync@ks.lamiral.info:public_html/imapsync { cd /g/var/paypal_reply/ &&\ rsync -av url_exe url_release url_source imapsync@ks.lamiral.info:/g/var/paypal_reply/ \ ; } diff --git a/README b/README index e24a4e1..8fcd6c0 100644 --- a/README +++ b/README @@ -3,7 +3,7 @@ NAME Synchronise mailboxes between two imap servers. Good at IMAP migration. More than 36 different IMAP server softwares supported with success. - $Revision: 1.411 $ + $Revision: 1.422 $ SYNOPSIS To synchronise imap account "foo" on "imap.truc.org" to imap account @@ -77,7 +77,7 @@ USAGE [--minage ] [--skipheader ] [--useheader ] [--useheader ] - [--nouid1] [--nouid1] + [--nouid1] [--nouid2] [--usecache] [--skipsize] [--allowsizemismatch] [--delete] [--delete2] @@ -332,10 +332,10 @@ IMAP SERVERS - iPlanet Messaging server 4.15, 5.1, 5.2 - IMail 7.15 (Ipswitch/Win2003), 8.12, 11.03 [host1] - MailEnable 4.23 [host1] [host2] - - MDaemon 7.0.1, 8.0.2, 8.1, 9.5.4 (Windows server 2003 R2 platform) + - MDaemon 7.0.1, 8.0.2, 8.1, 9.5.4 (Windows server 2003 R2 platform), 12 [host2] - Mercury 4.1 (Windows server 2000 platform) - Microsoft Exchange Server 5.5, 6.0.6249.0[host1], 6.0.6487.0[host1], - 6.5.7638.1 [host2], Exchange 2007 SP1 (with Update Rollup 2), + 6.5.7638.1 [host2], 6.5 [host1], Exchange 2007 SP1 (with Update Rollup 2), Exchange2007-EP-SP2, Exchange 2010 RTM (Release to Manufacturing) [host2] - Mirapoint @@ -422,5 +422,5 @@ SIMILAR SOFTWARES Feedback (good or bad) will often be welcome. - $Id: imapsync,v 1.411 2011/04/19 23:34:30 gilles Exp gilles $ + $Id: imapsync,v 1.422 2011/05/08 17:21:38 gilles Exp gilles $ diff --git a/RECORD b/RECORD deleted file mode 100644 index 108f272..0000000 --- a/RECORD +++ /dev/null @@ -1,46 +0,0 @@ - -+------------------+ -| imapsync records | -+------------------+ - -You can add your own record if you want. -Here is a template. -------------------------------------------------------------------------------- -Your Name/Compagny : -Time to migrate : -Number of mailboxes : -Total size : -Comment : - -------------------------------------------------------------------------------- -Your Name/Compagny : Thomas Hallock/Medicus Insurance Company -Time to migrate : The initial sync took about 15 hours. We mirrored the -"from" and "to" mailboxes via cron for a couple of weeks during the -transition. Each day after the initial sync, the script would run for -about 3 hours to catch up with the day-to-day changes. Our mail -server is a Dual-Core Intel Xeon XServe. - -Number of mailboxes : 25 -Total size : 40+ GB - -Comment : It worked flawlessly, -and was even able to address issues I wouldn't have expected it -could, such as synchronizing deletions, and handling differing IMAP -path prefixes between the to and from servers. - -------------------------------------------------------------------------------- -Your Name/Compagny : Olivier Morel -Time to migrate : 18 hours -Number of mailboxes : 2200 -Total size : 18 Go -Comment : Nous avons terminé notre migration et récupéré l'ensemble - des boites aux lettres grace à votre outil, tout s'est - déroulé à merveille. -------------------------------------------------------------------------------- -Your Name/Compagny : anonymous -Time to migrate : ? -Number of mailboxes : ~10000 mailboxes -Total size : ~70Gb of data -Comment : from Rockliffe Mailsite 4.5 to Courier 4.1.1.20060828-5. - - diff --git a/TIME b/TIME index 833c036..0763dd5 100644 --- a/TIME +++ b/TIME @@ -1,3 +1,7 @@ +300 Release 1.417. Some numbers section. INSTALL file. + 60 Bugfix. --maxsize --minsize now work with --useuid + flag sync of already transfered messages now take care of --maxsize --minsize options. +120 Exit on --delete --delete2. --expunge1 same as --expunge. --delete2 implies --expunge2. +120 Handle the APPEND with {0} byte error just after fetching the message on host1. 40 Groupwize and authuser. Does not work. 540 Invoices build. 35 Bug bug_zero_byte() tests.sh No bug found here. email. diff --git a/TODO b/TODO index e1bf2ba..0a1b661 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,5 @@ #!/bin/cat -# $Id: TODO,v 1.95 2011/04/16 20:16:47 gilles Exp gilles $ +# $Id: TODO,v 1.96 2011/04/26 10:48:03 gilles Exp gilles $ TODO file for imapsync ---------------------- @@ -15,8 +15,6 @@ Add a best practice migration tips document. Write a Mail::imapsync package and use it. -write a comment to http://blog.migrationwiz.com/2010/12/09/imapsync-vs-migrationwiz/ - Fix the mailing-list archive bug with From at the beginning of a line http://www.linux-france.org/prj/imapsync_list/msg00307.html @@ -25,7 +23,10 @@ Evaluate http://www.rackspace.com/apps/email_hosting/migrations http://www.yippiemove.com/ -Make --delete2 works with --useuid +Fix Exchange 2010 SP1 issue with --foldersizes when +host2 folders don't exist. $imap->exists calls STATUS. +Is it RFC compliant or an Exchange bug? +Exchange quit after 10 errors. Fix "\Forwarded" flag bug in courier. Does \lalala can be forbidden (courier does a @@ -158,6 +159,10 @@ http://asg.web.cmu.edu/cyrus/download/imapd/altnamespace.html =========================================================================== +DONE. Make --delete2 works with --useuid + +DONE. write a comment to http://blog.migrationwiz.com/2010/12/09/imapsync-vs-migrationwiz/ + DONE. Read http://bugs.gentoo.org/show_bug.cgi?id=354831 Nice conversation. diff --git a/VERSION b/VERSION index f812671..fefe318 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.411 +1.422 diff --git a/VERSION_EXE b/VERSION_EXE index fa83683..9206104 100644 --- a/VERSION_EXE +++ b/VERSION_EXE @@ -1 +1 @@ -1.411 +1.422 diff --git a/adwords b/adwords deleted file mode 100644 index b4503f3..0000000 --- a/adwords +++ /dev/null @@ -1,6 +0,0 @@ -IMAP migration tool -Buy imapsync.exe + source for 30 € -30 days money-back guarantee -linux-france.org/prj/imapsync/ -www.linux-france.org/prj/imapsync/ - diff --git a/freshmeat b/freshmeat deleted file mode 100644 index abffb76..0000000 --- a/freshmeat +++ /dev/null @@ -1,10 +0,0 @@ -http://freshmeat.net/projects/imapsync/ - -imapsync is a tool for facilitating incremental recursive IMAP -transfers from one mailbox to another. It is useful for mailbox -migration, and reduces the amount of data transferred by only copying -messages that are not present on both servers. Read, unread, and -deleted flags are preserved, and the process can be stopped and -resumed. The original messages can optionally be deleted after a -successful transfer. - diff --git a/freshmeat_submition.inp b/freshmeat_submition.inp deleted file mode 100644 index ce85cb0..0000000 --- a/freshmeat_submition.inp +++ /dev/null @@ -1,15 +0,0 @@ - -# -#RELEASE_FOCUS="Initial freshmeat announcement" -#RELEASE_FOCUS="Documentation" -#RELEASE_FOCUS="Code cleanup" -RELEASE_FOCUS="Minor feature enhancements" -#RELEASE_FOCUS="Major feature enhancements" -#RELEASE_FOCUS="Minor bugfixes" -#RELEASE_FOCUS="Major bugfixes" -#RELEASE_FOCUS="Minor security fixes" -#RELEASE_FOCUS="Major security fixes" -#TEXT_BODY="Syntax cleanup" -#TEXT_BODY="Updated documentation" - -TEXT_BODY="Several improvements to reach better usability. Authentication cram-md5 is not used by default (too few server support it). Issues from servers changing or adding header are avoided. Now imapsync has a way to handle efficiently no header in messages. The imap server dkimap is supported (dkimap isn't a uid capability server). Added NTLM authentication with domain. Added --minsize option to transfer messages bigger than a given size. Added memory consumption measurement to compute how much concurrent imapsync can run in parallel on a system. Imapsync is no longer gratis from the home page." diff --git a/freshmeat_submition.json b/freshmeat_submition.json deleted file mode 100644 index abc407c..0000000 --- a/freshmeat_submition.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "release": { - "tag_list": "stable, Minor feature enhancements", - "version": "1.383", - "hidden_from_frontpage": false, - "changelog": "Since last public release 1.350 several improvements have been made to reach a better usability. By default, authentication cram-md5 is not used (too few server support it) so --noauthmd5 option becomes useless. To avoid issues from servers changing or adding header option --useheader Message-Id is on by default too. Now imapsync has a way to handle efficiently no headers in messages (take first 2KB body). The imap server dkimap is now supported (it was not because dkimap is not a uid capability server). NTLM authentication with domain is supported. Added --minsize option to transfer messages bigger than a given size. Added memory consumption measurement to compute how much concurrent imapsync can run in parallel on a system. Imapsync is no longer gratis from the home page. Imapsync license has not changed, it is still a WTFPL software. Thanks again to the freshmeat guy who corrects my bad and poorly English!" - } -} - diff --git a/freshmeat_submition.out b/freshmeat_submition.out deleted file mode 100644 index 391d5de..0000000 --- a/freshmeat_submition.out +++ /dev/null @@ -1,12 +0,0 @@ -Project: imapsync -Version: 1.293 -Release-Focus: Minor bugfixes -Hide: N -Home-Page-URL: http://www.linux-france.org/prj/imapsync/ -Gzipped-Tar-URL: http://www.linux-france.org/prj/imapsync/dist/ - -Bug fixes. - -Many thanks to the freshmeat folk that correct my bad and poorly English ! - - diff --git a/imapsync b/imapsync index c97dadb..e6ba579 100755 --- a/imapsync +++ b/imapsync @@ -20,7 +20,7 @@ Synchronise mailboxes between two imap servers. Good at IMAP migration. More than 36 different IMAP server softwares supported with success. -$Revision: 1.411 $ +$Revision: 1.422 $ =head1 SYNOPSIS @@ -99,7 +99,7 @@ The option list: [--minage ] [--skipheader ] [--useheader ] [--useheader ] - [--nouid1] [--nouid1] + [--nouid1] [--nouid2] [--usecache] [--skipsize] [--allowsizemismatch] [--delete] [--delete2] @@ -380,10 +380,10 @@ Success stories reported with the following 41 imap servers - iPlanet Messaging server 4.15, 5.1, 5.2 - IMail 7.15 (Ipswitch/Win2003), 8.12, 11.03 [host1] - MailEnable 4.23 [host1] [host2] - - MDaemon 7.0.1, 8.0.2, 8.1, 9.5.4 (Windows server 2003 R2 platform) + - MDaemon 7.0.1, 8.0.2, 8.1, 9.5.4 (Windows server 2003 R2 platform), 12 [host2] - Mercury 4.1 (Windows server 2000 platform) - Microsoft Exchange Server 5.5, 6.0.6249.0[host1], 6.0.6487.0[host1], - 6.5.7638.1 [host2], Exchange 2007 SP1 (with Update Rollup 2), + 6.5.7638.1 [host2], 6.5 [host1], Exchange 2007 SP1 (with Update Rollup 2), Exchange2007-EP-SP2, Exchange 2010 RTM (Release to Manufacturing) [host2] - Mirapoint @@ -496,7 +496,7 @@ Entries for imapsync: Feedback (good or bad) will often be welcome. -$Id: imapsync,v 1.411 2011/04/19 23:34:30 gilles Exp gilles $ +$Id: imapsync,v 1.422 2011/05/08 17:21:38 gilles Exp gilles $ =cut @@ -540,13 +540,16 @@ use constant { my( $rcs, $pidfile, - $debug, $debugimap, $debugimap1, $debugimap2, $nb_errors, + $debug, $debugimap, $debugimap1, $debugimap2, $debugcontent, $debugflags, + $debugLIST, + $nb_errors, $host1, $host2, $port1, $port2, $user1, $user2, $domain1, $domain2, $password1, $password2, $passfile1, $passfile2, @folder, @include, @exclude, @folderrec, $prefix1, $prefix2, - @regextrans2, @regexmess, @regexflag, + @regextrans2, @regexmess, @regexflag, + $flagsCase, $sep1, $sep2, $syncinternaldates, $idatefromheader, @@ -589,6 +592,7 @@ my( $authmech1, $authmech2, $split1, $split2, $reconnectretry1, $reconnectretry2, + $relogin1, $relogin2, $tests, $test_builder, $tests_debug, $allow3xx, $justlogin, $tmpdir, @@ -604,7 +608,7 @@ my( # global variables initialisation -$rcs = '$Id: imapsync,v 1.411 2011/04/19 23:34:30 gilles Exp gilles $ '; +$rcs = '$Id: imapsync,v 1.422 2011/05/08 17:21:38 gilles Exp gilles $ '; $total_bytes_transferred = 0; $total_bytes_skipped = 0; @@ -646,7 +650,14 @@ $pidfile ||= $tmpdir . '/imapsync.pid'; # allow Mail::IMAPClient 3.0.xx by default $allow3xx = defined($allow3xx) ? $allow3xx : 1; -$takebody = defined($takebody) ? $takebody : 1; +$takebody = defined( $takebody ) ? $takebody : 1; + +# turn on RFC standard flags correction like \SEEN -> \Seen +$flagsCase = defined( $flagsCase ) ? $flagsCase : 1 ; + +# turn on relogin 5 by default +$relogin1 = defined( $relogin1 ) ? $relogin1 : 5 ; +$relogin2 = defined( $relogin2 ) ? $relogin2 : 5 ; if ( $fast ) { # $useuid = 1 ; @@ -718,6 +729,19 @@ if ($delete) { } } +if ( $delete2 ) { + if ( ! defined( $expunge2 ) ) { + $expunge2 = 1 ; + } +} + +if ( $delete and $delete2 ) { + print "Warning: using --delete and --delete2 is almost always a bad idea, exiting imapsync\n" ; + exit_clean( 0 ) ; +} + + + if($idatefromheader) { print "Turned ON idatefromheader, ", "will set the internal dates on host2 from the 'Date:' header line.\n"; @@ -803,15 +827,14 @@ $debugimap1 and print "Host1 connection\n"; $imap1 = login_imap($host1, $port1, $user1, $domain1, $password1, $debugimap1, $timeout, $fastio1, $ssl1, $tls1, $authmech1, $authuser1, $reconnectretry1, - $proxyauth1, $uid1); + $proxyauth1, $uid1, $split1); $debugimap2 and print "Host2 connection\n"; $imap2 = login_imap($host2, $port2, $user2, $domain2, $password2, $debugimap2, $timeout, $fastio2, $ssl2, $tls2, $authmech2, $authuser2, $reconnectretry2, - $proxyauth2, $uid2); + $proxyauth2, $uid2, $split2); -# history $debug and print "Host1 Buffer I/O: ", $imap1->Buffer(), "\n"; $debug and print "Host2 Buffer I/O: ", $imap2->Buffer(), "\n"; @@ -829,9 +852,6 @@ print "Host2 capability: ", join(" ", $imap2->capability_update()), "\n"; exit_clean(0) if ($justlogin); -$split1 and $imap1->Split($split1); -$split2 and $imap2->Split($split2); - # # Folder stuff # @@ -980,14 +1000,14 @@ print "++++ Looping on each folder\n"; FOLDER: foreach my $h1_fold (@h1_folders_wanted) { my $h2_fold = imap2_folder_name($h1_fold); - + #relogin1( ) if ( $relogin1 ) ; printf("%-35s -> %-35s\n", "[$h1_fold]", "[$h2_fold]"); select_folder($imap1, $h1_fold, 'Host1') or next FOLDER; if ( ! exists($h2_folders_all{$h2_fold})) { - create_folder($imap2, $h2_fold, 'Host2') or next FOLDER; + create_folder( $imap2, $h2_fold, $h1_fold ) or next FOLDER; } acls_sync($h1_fold, $h2_fold); @@ -998,7 +1018,7 @@ FOLDER: foreach my $h1_fold (@h1_folders_wanted) { #print "%%% @select_results\n"; my $permanentflags2 = permanentflags(@select_results); $debug and print "permanentflags: $permanentflags2\n" ; - if ($expunge){ + if ( $expunge or $expunge1 ){ print "Expunging host1 $h1_fold\n"; unless($dry) { $imap1->expunge() }; #print "Expunging host2 $h2_fold\n"; @@ -1014,12 +1034,12 @@ FOLDER: foreach my $h1_fold (@h1_folders_wanted) { my @h1_msgs = select_msgs($imap1); - $debug and print "LIST Host1: ", scalar(@h1_msgs), " messages [@h1_msgs]\n"; + ( $debug or $debugLIST ) and print "LIST Host1: ", scalar(@h1_msgs), " messages [@h1_msgs]\n"; # internal dates on host2 are after the ones on host1 # normally... my @h2_msgs = select_msgs($imap2); - $debug and print "LIST Host2: ", scalar(@h2_msgs), " messages [@h2_msgs]\n"; + ( $debug or $debugLIST ) and print "LIST Host2: ", scalar(@h2_msgs), " messages [@h2_msgs]\n"; my $cache_base = "$tmpdir/imapsync_cache/$host1/$user1/$host2/$user2"; my $cache_dir = cache_folder( $cache_base, $h1_fold, $h2_fold ); @@ -1052,9 +1072,11 @@ FOLDER: foreach my $h1_fold (@h1_folders_wanted) { delete @h2_msgs_no_cache{ @h2_msgs_in_cache } ; my @h1_msgs_no_cache = keys %h1_msgs_no_cache ; + #print "h1_msgs_no_cache: [@h1_msgs_no_cache]\n" ; my @h2_msgs_no_cache = keys %h2_msgs_no_cache ; my @h2_msgs_delete2_no_cache = () ; + %h1_msgs_copy_by_uid = ( ) ; if ( $useuid ) { # use uid so we have to avoid getting header @@ -1184,6 +1206,10 @@ FOLDER: foreach my $h1_fold (@h1_folders_wanted) { print "uidexpunge $cnt message(s)\n"; $imap2->uidexpunge(\@h2_expunge) if !$dry; } + if ($expunge2){ + print "Expunging host2 folder $h2_fold\n"; + unless($dry) { $imap2->expunge() }; + } } my $h2_uidnext = $imap2->uidnext( $h2_fold ) ; @@ -1192,19 +1218,6 @@ FOLDER: foreach my $h1_fold (@h1_folders_wanted) { my $h1_size = $h1_hash{$m_id}{'s'}; my $h1_msg = $h1_hash{$m_id}{'m'}; my $h1_idate = $h1_hash{$m_id}{'D'}; - - if (defined $maxsize and $h1_size >= $maxsize) { - print "msg $h1_fold/$h1_msg skipping ($h1_size exceeds maxsize limit $maxsize bytes)\n"; - $total_bytes_skipped += $h1_size; - $nb_msg_skipped += 1; - next MESS; - } - if (defined $minsize and $h1_size <= $minsize) { - print "msg $h1_fold/$h1_msg skipping ($h1_size smaller than minsize $minsize bytes)\n"; - $total_bytes_skipped += $h1_size; - $nb_msg_skipped += 1; - next MESS; - } unless (exists($h2_hash{$m_id})) { # copy @@ -1224,7 +1237,7 @@ FOLDER: foreach my $h1_fold (@h1_folders_wanted) { #$debug and print "MESSAGE $m_id\n"; my $h2_msg = $h2_hash{$m_id}{'m'}; - sync_flags( $h1_msg, $h2_msg, $h2_fold, $permanentflags2, $h1_fir_ref, $h2_fir_ref ) ; + sync_flags( $h1_fold, $h1_msg, $h2_fold, $h2_msg, $permanentflags2, $h1_fir_ref, $h2_fir_ref ) ; # Good my $h2_size = $h2_hash{$m_id}{'s'}; @@ -1235,7 +1248,7 @@ FOLDER: foreach my $h1_fold (@h1_folders_wanted) { unless( $dry ) { $imap1->delete_message( $h1_msg ); $h1_nb_msg_deleted += 1; - $imap1->expunge() if ( $expunge ); + $imap1->expunge() if ( $expunge or $expunge1 ); } } @@ -1244,20 +1257,21 @@ FOLDER: foreach my $h1_fold (@h1_folders_wanted) { MESS_IN_CACHE: foreach my $h1_msg ( @h1_msgs_in_cache ) { my $h2_msg = $cache_1_2_ref->{ $h1_msg } ; $debugcache and print "cache messages update $h1_msg->$h2_msg\n"; - sync_flags( $h1_msg, $h2_msg, $h2_fold, $permanentflags2, $h1_fir_ref, $h2_fir_ref ) ; + sync_flags( $h1_fold, $h1_msg, $h2_fold, $h2_msg, $permanentflags2, $h1_fir_ref, $h2_fir_ref ) ; my $h1_size = $h1_fir_ref->{ $h1_msg }->{ 'RFC822.SIZE' } ; $total_bytes_skipped += $h1_size; $nb_msg_skipped += 1; } + #print "Messages by uid: ", map { "$_ " } keys %h1_msgs_copy_by_uid, "\n" ; MESS_BY_UID: foreach my $h1_msg ( sort { $a <=> $b } keys %h1_msgs_copy_by_uid ) { # copy_message - #print "Copy by uid $h1_fold/$h1_msg\n" ; + $debug and print "Copy by uid $h1_fold/$h1_msg\n" ; copy_message( $h1_msg, $h1_fold, $h2_fold, $h1_fir_ref, $permanentflags2, $cache_dir ) ; } - if ($expunge1){ + if ($expunge or $expunge1){ print "Expunging host1 folder $h1_fold\n"; unless($dry) { $imap1->expunge() }; } @@ -1269,18 +1283,34 @@ FOLDER: foreach my $h1_fold (@h1_folders_wanted) { $debug and print "Time: ", timenext(), " s\n"; } +sub size_filtered_flag { + my( $h1_size ) = @_ ; + + if (defined $maxsize and $h1_size >= $maxsize) { + return( 1 ) ; + } + if (defined $minsize and $h1_size <= $minsize) { + return( 1 ) ; + } + return( 0 ) ; +} + sub sync_flags { - my ( $h1_msg, $h2_msg, $h2_fold, $permanentflags2, $h1_fir_ref, $h2_fir_ref ) = @_ ; - $debug and print "sync flags $h1_msg->$h2_msg\n"; + my ( $h1_fold, $h1_msg, $h2_fold, $h2_msg, $permanentflags2, $h1_fir_ref, $h2_fir_ref ) = @_ ; + $debug and print "sync flags $h1_fold/$h1_msg->$h2_fold/$h2_msg\n"; + + my $h1_size = $h1_fir_ref->{$h1_msg}->{"RFC822.SIZE"} ; + return() if size_filtered_flag( $h1_size ) ; # used cached flag values for efficiency my $h1_flags = $h1_fir_ref->{ $h1_msg }->{ "FLAGS" } ; my $h2_flags = $h2_fir_ref->{ $h2_msg }->{ "FLAGS" } ; # RFC 2060: This flag can not be altered by any client - $h1_flags =~ s@\\Recent\s?@@gi; - $h1_flags = flags_regex($h1_flags) if @regexflag; - $h1_flags = flags_filter($h1_flags, $permanentflags2) if ( $permanentflags2 ); + $h1_flags =~ s@\\Recent\s?@@gi ; + $h1_flags = flags_regex( $h1_flags ) if @regexflag; + $h1_flags = flagsCase( $h1_flags ) if $flagsCase ; + $h1_flags = flags_filter( $h1_flags, $permanentflags2) if ( $permanentflags2 ) ; # compare flags - set flags if there a difference my @h1_flags = sort split(' ', $h1_flags ); @@ -1288,7 +1318,9 @@ sub sync_flags { my $diff = compare_lists( \@h1_flags, \@h2_flags ); #$diff = 1 ; - $diff and $debug and print "msg $h2_fold/$h2_msg replacing h2 flags( $h2_flags ) with h1 flags( $h1_flags )\n"; + $debugflags and print "msg h1 $h1_fold/$h1_msg flags( $h1_flags ) h2 $h2_fold/$h2_msg flags( $h2_flags )\n" ; + $diff and ( $debug or $debugflags ) + and print "msg $h2_fold/$h2_msg replacing h2 flags( $h2_flags ) with h1 flags( $h1_flags )\n"; # This sets flags so flags can be removed with this # When you remove a \Seen flag on host1 you want to it # to be removed on host2. Just add flags is not what @@ -1546,12 +1578,52 @@ sub justconnect { } +sub relogin1 { + $imap1 = relogin_imap( + $imap1, + $host1, $port1, $user1, $domain1, $password1, + $debugimap1, $timeout, $fastio1, $ssl1, $tls1, + $authmech1, $authuser1, $reconnectretry1, + $proxyauth1, $uid1, $split1) ; + + $relogin1-- if ( $relogin1 ) ; +} + +sub relogin2 { + $imap2 = relogin_imap( + $imap2, + $host2, $port2, $user2, $domain2, $password2, + $debugimap2, $timeout, $fastio2, $ssl2, $tls2, + $authmech2, $authuser2, $reconnectretry2, + $proxyauth2, $uid2, $split2) ; + + $relogin2-- if ( $relogin2 ) ; +} + +sub relogin_imap { + my($imap, + $host, $port, $user, $domain, $password, + $debugimap, $timeout, $fastio, + $ssl, $tls, $authmech, $authuser, $reconnectretry, + $proxyauth, $uid, $split) = @_; + + my $folder_current = $imap->Folder ; + $imap->logout( ) ; + $imap = login_imap( + $host, $port, $user, $domain, $password, + $debugimap, $timeout, $fastio, + $ssl, $tls, $authmech, $authuser, $reconnectretry, + $proxyauth, $uid, $split + ) ; + $imap->select( $folder_current ) if defined( $folder_current ) ; + return( $imap ) ; +} sub login_imap { my($host, $port, $user, $domain, $password, $debugimap, $timeout, $fastio, $ssl, $tls, $authmech, $authuser, $reconnectretry, - $proxyauth, $uid) = @_; + $proxyauth, $uid, $split ) = @_; my ($imap); $imap = Mail::IMAPClient->new(); @@ -1626,7 +1698,8 @@ sub login_imap { die_clean("$info [LOGIN]: ", $imap->LastError, "\n"); } $proxyauth && $imap->proxyauth($user); - + $split and $imap->Split( $split ) ; + print "Success login on [$host] with user [$user] auth [$authmech]\n"; return($imap); } @@ -1654,8 +1727,8 @@ sub banner_imapsync { my @argv_copy = @_; my $banner_imapsync = join("", '$RCSfile: imapsync,v $ ', - '$Revision: 1.411 $ ', - '$Date: 2011/04/19 23:34:30 $ ', + '$Revision: 1.422 $ ', + '$Date: 2011/05/08 17:21:38 $ ', "\n",localhost_info(), "\n", "Command line used:\n", "$0 ", command_line_nopassword(@argv_copy), "\n", @@ -1724,13 +1797,19 @@ sub select_folder { sub create_folder { - my ($imap, $folder, $hostside) = @_; - print "$hostside folder $folder does not exist\n"; - print "Creating folder [$folder]\n"; - if ( ! $dry){ - if ( ! $imap->create($folder)){ - warn "Couldn't create [$folder] on $hostside: ", - $imap->LastError,"\n"; + my( $imap2, $h2_fold, $h1_fold ) = @_ ; + + if ( $imap2->exists( $h2_fold ) ) { + print "Folder $h2_fold already exists on host2.\n"; + return( 1 ) ; + }else{ + print "Folder $h2_fold does not exist on host2.\n"; + } + print "Creating folder [$h2_fold] on host2.\n"; + if ( ! $dry ){ + if ( ! $imap2->create($h2_fold)){ + warn "Couldn't create folder [$h2_fold] from [$h1_fold]: ", + $imap2->LastError,"\n"; $nb_errors++; return(0); }else{ @@ -2197,10 +2276,10 @@ sub flags_regex { my ($h1_flags) = @_; foreach my $regexflag (@regexflag) { my $h1_flags_orig = $h1_flags; - $debug and print "eval \$h1_flags =~ $regexflag\n"; + $debugflags and print "eval \$h1_flags =~ $regexflag\n"; eval("\$h1_flags =~ $regexflag"); die_clean("error: eval regexflag '$regexflag': $@\n") if $@; - $debug and print "regexflag $regexflag [$h1_flags_orig] -> [$h1_flags]\n"; + $debugflags and print "regexflag $regexflag [$h1_flags_orig] -> [$h1_flags]\n"; } return($h1_flags); } @@ -2284,7 +2363,51 @@ sub flags_filter { return($flags_out); } +sub flagsCase { + my $flags = shift ; + + my @flags = split( /\s+/, $flags ); + my %rfc_flags = map { $_ => 1 } split(' ', '\Answered \Flagged \Deleted \Seen \Draft' ); + my @flags_out = map { exists $rfc_flags{ ucsecond( lc( $_ ) ) } ? ucsecond( lc( $_ ) ) : $_ } @flags ; + my $flags_out = join( ' ', @flags_out ) ; + #print "%%%$flags_out%%%\n" ; + return( $flags_out ) ; +} + +sub tests_flagsCase { + ok( '\Seen' eq flagsCase( '\Seen' ), 'flagsCase: \Seen -> \Seen' ) ; + ok( '\Seen' eq flagsCase( '\SEEN' ), 'flagsCase: \SEEN -> \Seen' ) ; + + ok( '\Seen \Draft' eq flagsCase( '\SEEN \DRAFT' ), 'flagsCase: \SEEN \DRAFT -> \Seen \Draft' ) ; + ok( '\Draft \Seen' eq flagsCase( '\DRAFT \SEEN' ), 'flagsCase: \DRAFT \SEEN -> \Draft \Seen' ) ; + + ok( '\Draft LALA \Seen' eq flagsCase( '\DRAFT LALA \SEEN' ), 'flagsCase: \DRAFT LALA \SEEN -> \Draft LALA \Seen' ) ; + ok( '\Draft lala \Seen' eq flagsCase( '\DRAFT lala \SEEN' ), 'flagsCase: \DRAFT lala \SEEN -> \Draft lala \Seen' ) ; +} + +sub ucsecond { + my $string = shift ; + my $output ; + + return( $string ) if ( 1 >= length( $string ) ) ; + $output = substr( $string, 0, 1) . uc( substr( $string, 1, 1 ) ) if ( 2 == length( $string ) ) ; + $output = substr( $string, 0, 1) . uc( substr( $string, 1, 1 ) ) . substr( $string, 2 ); + #print "UUU $string -> $output\n" ; + return( $output ) ; +} + + +sub tests_ucsecond { + ok( 'aBcde' eq ucsecond( 'abcde' ), 'ucsecond: abcde -> aBcde' ) ; + ok( 'ABCDE' eq ucsecond( 'ABCDE' ), 'ucsecond: ABCDE -> ABCDE' ) ; + ok( 'ABCDE' eq ucsecond( 'AbCDE' ), 'ucsecond: AbCDE -> ABCDE' ) ; + ok( 'ABCde' eq ucsecond( 'AbCde' ), 'ucsecond: AbCde -> ABCde' ) ; + ok( 'A' eq ucsecond( 'A' ), 'ucsecond: A -> A' ) ; + ok( 'AB' eq ucsecond( 'Ab' ), 'ucsecond: Ab -> AB' ) ; + ok( '\B' eq ucsecond( '\b' ), 'ucsecond: \b -> \B' ) ; + ok( '\Bcde' eq ucsecond( '\bcde' ), 'ucsecond: \bcde -> \Bcde' ) ; +} sub select_msgs { my ($imap) = @_; @@ -2346,24 +2469,53 @@ sub lastuid { return( $lastuid ) ; } +sub size_filtered { + my( $h1_size, $h1_msg, $h1_fold, $h2_fold ) = @_ ; + + if (defined $maxsize and $h1_size >= $maxsize) { + print "msg $h1_fold/$h1_msg skipped ($h1_size exceeds maxsize limit $maxsize bytes)\n"; + $total_bytes_skipped += $h1_size; + $nb_msg_skipped += 1; + return( 1 ) ; + } + if (defined $minsize and $h1_size <= $minsize) { + print "msg $h1_fold/$h1_msg skipped ($h1_size smaller than minsize $minsize bytes)\n"; + $total_bytes_skipped += $h1_size; + $nb_msg_skipped += 1; + return( 1 ) ; + } + return( 0 ) ; +} + sub copy_message { # copy my ( $h1_msg, $h1_fold, $h2_fold, $h1_fir_ref, $permanentflags2, $cache_dir ) = @_ ; $debug and print "msg $h1_fold/$h1_msg copying to $h2_fold\n"; - my $h1_size = $h1_fir_ref->{$h1_msg}->{"RFC822.SIZE"}; - my $h1_flags = $h1_fir_ref->{$h1_msg}->{"FLAGS"}; - my $h1_idate = $h1_fir_ref->{$h1_msg}->{"INTERNALDATE"}; + my $h1_size = $h1_fir_ref->{$h1_msg}->{"RFC822.SIZE"} || '' ; + my $h1_flags = $h1_fir_ref->{$h1_msg}->{"FLAGS"} || '' ; + my $h1_idate = $h1_fir_ref->{$h1_msg}->{"INTERNALDATE"} || '' ; + + return() if size_filtered( $h1_size, $h1_msg, $h1_fold, $h2_fold ) ; my $string; + #print "SLEEP 5\n" and sleep 5 ; + print "- msg $h1_fold/$h1_msg S[$h1_size] F[$h1_flags] I[$h1_idate] has RFC822.SIZE null!\n" if ( ! $h1_size ) ; + + $string = $imap1->message_string($h1_msg); - unless (defined($string)) { + + + my $string_len = defined( $string ) ? length( $string ) : '' ; # length or undef + #print "- msg $h1_fold/$h1_msg {$string_len}\n" ; + unless ( defined( $string ) and $string_len ) { # undef or 0 length warn - "- msg $h1_fold/$h1_msg could not be fetched: ", - $imap1->LastError, "\n"; - $nb_errors++; - $total_bytes_error += $h1_size; + "- msg $h1_fold/$h1_msg {$string_len} S[$h1_size] F[$h1_flags] I[$h1_idate] could not be fetched: ", + $imap1->LastError, "\n" ; + $nb_errors++ ; + $total_bytes_error += $h1_size if ( $h1_size ) ; + #relogin1( ) if ( $relogin1 ) ; return( ) ; } @@ -2371,7 +2523,7 @@ sub copy_message { $string = regexmess($string); } - $debug and print + $debugcontent and print "=" x80, "\n", "F message content begin next line\n", $string, @@ -2395,7 +2547,7 @@ sub copy_message { # RFC 2060: This flag can not be altered by any client $h1_flags =~ s@\\Recent\s?@@gi; $h1_flags = flags_regex($h1_flags) if @regexflag; - + $h1_flags = flagsCase( $h1_flags ) if $flagsCase ; $h1_flags = flags_filter($h1_flags, $permanentflags2) if ($permanentflags2); my $new_id; @@ -2407,7 +2559,7 @@ sub copy_message { $new_id = $imap2->append_string($h2_fold, $string, $h1_flags, $h1_date); unless($new_id){ no warnings 'uninitialized'; - warn "- msg $h1_fold/$h1_msg couldn't append (Subject:[". + warn "- msg $h1_fold/$h1_msg {$string_len} couldn't append (Subject:[". $imap1->subject($h1_msg)."]) to folder $h2_fold: ", $imap2->LastError, "\n"; $nb_errors++; @@ -2418,16 +2570,10 @@ sub copy_message { # good # $new_id is an id if the IMAP server has the # UIDPLUS capability else just a ref - - - - - - if ( $new_id !~ m{^\d+$} ) { $new_id = lastuid( $imap2, $h2_fold, $h2_uidguess ) ; } - printf( "msg %s/%-10s copied to %s/%-10s\n", $h1_fold, $h1_msg, $h2_fold, $new_id ); + printf( "msg %s/%-19s copied to %s/%-10s\n", $h1_fold, "$h1_msg {$string_len}", $h2_fold, $new_id ); $h2_uidguess++; $total_bytes_transferred += $h1_size; $nb_msg_transferred += 1; @@ -2438,9 +2584,10 @@ sub copy_message { unless($dry) { $imap1->delete_message($h1_msg); $h1_nb_msg_deleted += 1; - $imap1->expunge() if ($expunge); + $imap1->expunge() if ( $expunge or $expunge1 ); } } + #print "PRESS ENTER" and my $a = <> ; } } else{ @@ -2951,10 +3098,13 @@ sub get_options { exit 1; } my $opt_ret = GetOptions( - "debug!" => \$debug, - "debugimap!" => \$debugimap, - "debugimap1!" => \$debugimap1, - "debugimap2!" => \$debugimap2, + "debug!" => \$debug, + "debugLIST!" => \$debugLIST, + "debugcontent!" => \$debugcontent, + "debugflags!" => \$debugflags, + "debugimap!" => \$debugimap, + "debugimap1!" => \$debugimap1, + "debugimap2!" => \$debugimap2, "host1=s" => \$host1, "host2=s" => \$host2, "port1=i" => \$port1, @@ -2981,6 +3131,7 @@ sub get_options { "regextrans2=s" => \@regextrans2, "regexmess=s" => \@regexmess, "regexflag=s" => \@regexflag, + "flagsCase!" => \$flagsCase, "delete!" => \$delete, "delete2!" => \$delete2, "delete2folders!" => \$delete2folders, @@ -3028,12 +3179,14 @@ sub get_options { "authuser1=s" => \$authuser1, "authuser2=s" => \$authuser2, "proxyauth1" => \$proxyauth1, - "proxyauth2" => \$proxyauth1, + "proxyauth2" => \$proxyauth2, "split1=i" => \$split1, "split2=i" => \$split2, "buffersize=i" => \$buffersize, "reconnectretry1=i" => \$reconnectretry1, "reconnectretry2=i" => \$reconnectretry2, + "relogin1=i" => \$relogin1, + "relogin2=i" => \$relogin2, "tests" => \$tests, "tests_debug" => \$tests_debug, "allow3xx!" => \$allow3xx, @@ -3222,7 +3375,7 @@ sub check_last_release { } sub imapsync_version { - my $rcs = '$Id: imapsync,v 1.411 2011/04/19 23:34:30 gilles Exp gilles $ '; + my $rcs = '$Id: imapsync,v 1.422 2011/05/08 17:21:38 gilles Exp gilles $ '; $rcs =~ m/,v (\d+\.\d+)/; my $VERSION = ($1) ? $1: "UNKNOWN"; return($VERSION); @@ -3469,6 +3622,8 @@ Several options are mandatory. --useuid : Use uid instead of header as a criterium to sync. --usecache is then implied unless --nousecache --debug : debug mode. +--debugcontent : debug content of the messages transfered. +--debugflags : debug flags. --debugimap1 : imap debug mode for host1. imap debug is very verbose. --debugimap2 : imap debug mode for host2. --debugimap : imap debug mode for host1 and host2. @@ -3730,11 +3885,7 @@ sub tests_debug { SKIP: { skip "No test in normal run" if ( not $tests_debug ); - tests_clean_cache( ) ; - tests_match_a_cache_file( ) ; - tests_touch( ) ; - tests_cache_map( ) ; - tests_get_cache( ) ; + tests_flagsCase( ) ; } } @@ -3747,7 +3898,7 @@ sub tests { tests_regexmess(); tests_flags_regex(); tests_permanentflags(); - tests_flags_filter(); + tests_flags_filter( ) ; tests_imap2_folder_name(); tests_command_line_nopassword(); tests_good_date(); @@ -3763,6 +3914,8 @@ sub tests { tests_clean_cache( ) ; tests_match_a_cache_file( ) ; tests_touch( ) ; + tests_ucsecond( ) ; + } } @@ -4737,7 +4890,6 @@ sub Reconnect_counter { $self->{Reconnect_counter} = 0 if ( not defined( $self->{Reconnect_counter} ) ) ; if (@_) { $self->{Reconnect_counter} = shift } return $self->{Reconnect_counter}; - } diff --git a/imapsync-1.366 b/imapsync-1.366 deleted file mode 100755 index 7ae5354..0000000 --- a/imapsync-1.366 +++ /dev/null @@ -1,4310 +0,0 @@ -#!/usr/bin/perl - -# structure -# pod documentation -# pragmas -# main program -# global variables initialisation -# default values -# folder loop -# subroutines -# IMAPClient 2.2.9 overrides -# IMAPClient 2.2.9 3.xx ads - -=pod - -=head1 NAME - -imapsync - IMAP synchronisation, sync, copy or migration -tool. Synchronise mailboxes between two imap servers. Good -at IMAP migration. More than 36 different IMAP server softwares -supported with success. - -$Revision: 1.366 $ - -=head1 SYNOPSIS - -To synchronise imap account "foo" on "imap.truc.org" - to imap account "bar" on "imap.trac.org" - with foo password "secret1" - and bar password "secret2": - - imapsync \ - --host1 imap.truc.org --user1 foo --password1 secret1 \ - --host2 imap.trac.org --user2 bar --password2 secret2 - -=head1 INSTALL - - imapsync works fine under any Unix OS with perl. - imapsync works fine under Windows (2000, XP) - with Strawberry Perl 5.10 or 5.12 - or as a standalone binary software imapsync.exe - -imapsync is already available directly on the following distributions -(at least): -FreeBSD, Debian, Ubuntu, Gentoo, Fedora, -NetBSD, Darwin, Mandriva and OpenBSD (yeah!). - - Get imapsync at - http://www.linux-france.org/prj/imapsync/ - - You'll find a compressed tarball called imapsync-x.xx.tgz - where x.xx is the version number. Untar the tarball where - you want (on Unix): - - tar xzvf imapsync-x.xx.tgz - - Go into the directory imapsync-x.xx and read the INSTALL file. - The INSTALL file is also at - http://www.linux-france.org/prj/imapsync/INSTALL - - The freshmeat record is at http://freshmeat.net/projects/imapsync/ - -=head1 USAGE - - imapsync [options] - -To get a description of each option just run imapsync like this: - - imapsync --help - imapsync - -The option list: - - imapsync [--host1 server1] [--port1 ] - [--user1 ] [--passfile1 ] - [--host2 server2] [--port2 ] - [--user2 ] [--passfile2 ] - [--ssl1] [--ssl2] - [--tls1] [--tls2] - [--authmech1 ] [--authmech2 ] - [--noauthmd5] - [--folder --folder ...] - [--folderrec --folderrec ...] - [--include ] [--exclude ] - [--prefix2 ] [--prefix1 ] - [--regextrans2 --regextrans2 ...] - [--sep1 ] - [--sep2 ] - [--justfolders] [--justfoldersizes] [--justconnect] [--justbanner] - [--syncinternaldates] - [--idatefromheader] - [--buffersize ] - [--syncacls] - [--regexmess ] [--regexmess ] - [--maxsize ] - [--minsize ] - [--maxage ] - [--minage ] - [--skipheader ] - [--useheader ] [--useheader ] - [--skipsize] [--allowsizemismatch] - [--delete] [--delete2] - [--expunge] [--expunge1] [--expunge2] [--uidexpunge2] - [--subscribed] [--subscribe] [--subscribe_all] - [--nofoldersizes] - [--dry] - [--debug] [--debugimap][--debugimap1][--debugimap2] - [--timeout ] [--fast] - [--split1] [--split2] - [--reconnectretry1 ] [--reconnectretry2 ] - [--pidfile ] - [--tmpdir ] - [--version] [--help] - -=cut -# comment - -=pod - -=head1 DESCRIPTION - -The command imapsync is a tool allowing incremental and -recursive imap transfer from one mailbox to another. - -By default all folders are transferred, recursively. - -We sometimes need to transfer mailboxes from one imap server to -another. This is called migration. - -imapsync is a good tool because it reduces the amount -of data transferred by not transferring a given message if it -is already on both sides. Same headers -and the transfer is done only once. All flags are -preserved, unread will stay unread, read will stay read, -deleted will stay deleted. You can stop the transfer at any -time and restart it later, imapsync works well with bad -connections. imapsync is CPU hungry so nice and renice -commands can be a good help. imapsync can be memory hungry too, -especially with large messages. - -You can decide to delete the messages from the source mailbox -after a successful transfer (it is a good feature when migrating). -In that case, use the --delete --expunge1 options. - -You can also just synchronize a mailbox A from another mailbox B -in case you just want to keep a "live" copy of B in A (--delete2 -may help) - -=head1 OPTIONS - -To get a description of each option just invoke: - -imapsync --help - -=head1 HISTORY - -I wrote imapsync because an enterprise (basystemes) paid me to install -a new imap server without losing huge old mailboxes located on a far -away remote imap server accessible by a low bandwidth link. The tool -imapcp (written in python) could not help me because I had to verify -every mailbox was well transferred and delete it after a good -transfer. imapsync started life as a copy_folder.pl patch. -The tool copy_folder.pl comes from the Mail-IMAPClient-2.1.3 perl -module tarball source (in the examples/ directory of the tarball). - -=head1 EXAMPLE - -While working on imapsync parameters please run imapsync in -dry mode (no modification induced) with the --dry -option. Nothing bad can be done this way. - -To synchronize the imap account "buddy" (with password "secret1") -on host "imap.src.fr" to the imap account "max" (with password "secret2") -on host "imap.dest.fr": - - imapsync --host1 imap.src.fr --user1 buddy --password1 secret1 \ - --host2 imap.dest.fr --user2 max --password2 secret2 - -Then you will have max's mailbox updated from buddy's -mailbox. - -=head1 SECURITY - -You can use --passfile1 instead of --password1 to give the -password since it is safer. With --password1 option any user -on your host can see the password by using the 'ps auxwwww' -command. Using a variable (like $PASSWORD1) is also -dangerous because of the 'ps auxwwwwe' command. So, saving -the password in a well protected file (600 or rw-------) is -the best solution. - -imasync is not totally protected against sniffers on the -network since passwords may be transferred in plain text -if CRAM-MD5 is not supported by your imap servers. Use ---ssl1 (or --tls1) and --ssl2 (or --tls2) to enable -encryption on host1 and host2. - -You may authenticate as one user (typically an admin user), -but be authorized as someone else, which means you don't -need to know every user's personal password. Specify ---authuser1 "adminuser" to enable this on host1. In this -case, --authmech1 PLAIN will be used by default since it -is the only way to go for now. So don't use --authmech1 SOMETHING -with --authuser1 "adminuser", it will not work. -Same behavior with the --authuser2 option. - - -=head1 EXIT STATUS - -imapsync will exit with a 0 status (return code) if everything went good. -Otherwise, it exits with a non-zero status. - -So if you have an unreliable internet connection, you can use this loop -in a Bourne shell: - - while ! imapsync ...; do - echo imapsync not complete - done - -=head1 LICENSE - -imapsync is free, gratis and open source software cover by -the Do What The Fuck You Want To Public License (WTFPL). -See COPYING file included in the distribution or the web site -http://sam.zoy.org/wtfpl/COPYING - -=head1 MAILING-LIST - -The public mailing-list may be the best way to get support. - -To write on the mailing-list, the address is: - - -To subscribe, send any message (even empty) to: - -then just reply to the confirmation message. - -To unsubscribe, send a message to: - - -To contact the person in charge for the list: - - -The list archives may be available at: -http://www.linux-france.org/prj/imapsync_list/ -So consider that the list is public, anyone -can see your post. Use a pseudonym or do not -post to this list if you want to stay private. - -Thank you for your participation. - -=head1 AUTHOR - -Gilles LAMIRAL - -Feedback good or bad is always welcome. - -The newsgroup comp.mail.imap may be a good place to talk about -imapsync. I read it when imapsync is concerned. -A better place is the public imapsync mailing-list -(see below). - -Gilles LAMIRAL earns his living writing, installing, -configuring and teaching free, open and gratis -softwares. Do not hesitate to pay him for that services. - -=head1 BUG REPORT GUIDELINES - -Help us to help you: follow the following guidelines. - -Report any bugs or feature requests to the public mailing-list -or to the author. - -Before reporting bugs, read the FAQ, the README and the -TODO files. http://www.linux-france.org/prj/imapsync/ - -Upgrade to last imapsync release, maybe the bug -is already fixed. - -Upgrade to last Mail-IMAPClient Perl module. -http://search.cpan.org/dist/Mail-IMAPClient/ -maybe the bug is already fixed. - -Make a good title with word "imapsync" in it (my spam filter won't filter it), -Don't write an email title with just "imapsync" or "problem", -a good title is made of keywords summary, not too long (one visible line). - -Don't write imapsync in uppercase in the email title, we'll -know you run windows(tm) and you haven't read the README yet. - -Help us to help you: in your report, please include: - - - imapsync version. - - - output given with --debug --debugimap near the failure point. - Isolate a message or two in a folder 'BUG' and use - - imapsync ... --folder 'BUG' --debug --debugimap - - - imap server software on both side and their version number. - - - imapsync with all the options you use, the full command line - you use (except the passwords of course). - - - IMAPClient.pm version. - - - operating system running imapsync. - - - operating systems on both sides and the third side in case - you run imapsync on a foreign host from the both. - - - virtual software context (vmware, xen etc.) - -Most of those values can be found as a copy/paste at the begining of the output. - -One time in your life, read the paper -"How To Ask Questions The Smart Way" -http://www.catb.org/~esr/faqs/smart-questions.html -and then forget it. - -=head1 IMAP SERVERS - -Failure stories reported with the following 4 imap servers: - - - MailEnable 1.54 (Proprietary) http://www.mailenable.com/ - - DBMail 0.9, 2.0.7 (GPL). But DBMail 1.2.1 works. - Patient and confident testers are welcome. - - dkimap4 2.39 - - Imail 7.04 (maybe). - -Success stories reported with the following 36 imap servers -(software names are in alphabetic order): - - - 1und1 H mimap1 84498 [host1] - - Archiveopteryx 2.03, 2.04, 2.09, 2.10 [host2], 3.0.0 [host2] - (OSL 3.0) http://www.archiveopteryx.org/ - - BincImap 1.2.3 (GPL) (http://www.bincimap.org/) - - CommuniGatePro server (Redhat 8.0) (Solaris), CommuniGate Pro 5.2.17[host2] (CentOS 5.4) - - Courier IMAP 1.5.1, 2.2.0, 2.1.1, 2.2.1, 3.0.8, 3.0.3, 4.1.1 (GPL) - (http://www.courier-mta.org/) - - Critical Path (7.0.020) - - Cyrus IMAP 1.5, 1.6, 2.1, 2.1.15, 2.1.16, 2.1.18 - 2.2.1, 2.2.2-BETA, 2.2.10, 2.2.12, - v2.2.3-Invoca-RPM-2.2.3-8, - 2.3-alpha (OSI Approved), - v2.2.12-Invoca-RPM-2.2.12-3.RHEL4.1, - 2.2.13, - v2.3.1-Invoca-RPM-2.3.1-2.7.fc5, - v2.3.7, - (http://asg.web.cmu.edu/cyrus/) - - David Tobit V8 (proprietary Message system). - - DBMail 1.2.1, 2.0.4, 2.0.9, 2.2rc1 (GPL) (http://www.dbmail.org/). - 2.0.7 seems buggy. - - Deerfield VisNetic MailServer 5.8.6 [host1] - - Domino (Notes) 4.61[host1], 6.5, 5.0.6, 5.0.7, 7.0.2, 6.0.2CF1, 7.0.1[host1], 8.0.1[host1] - - Dovecot 0.99.10.4, 0.99.14, 0.99.14-8.fc4, 1.0-0.beta2.7, - 1.0.0 [dest/source] (LGPL) (http://www.dovecot.org/) - - Eudora WorldMail v2 - - GMX IMAP4 StreamProxy. - - Groupwise IMAP (Novell) 6.x and 7.0. Buggy so see the FAQ. - - iPlanet Messaging server 4.15, 5.1, 5.2 - - IMail 7.15 (Ipswitch/Win2003), 8.12 - - MDaemon 7.0.1, 8.0.2, 8.1, 9.5.4 (Windows server 2003 R2 platform) - - Mercury 4.1 (Windows server 2000 platform) - - Microsoft Exchange Server 5.5, 6.0.6249.0[host1], 6.0.6487.0[host1], - 6.5.7638.1 [host2], Exchange 2007 SP1 (with Update Rollup 2), - Exchange2007-EP-SP2, - Exchange 2010 RTM (Release to Manufacturing) [host2] - - Netscape Mail Server 3.6 (Wintel !) - - Netscape Messaging Server 4.15 Patch 7 - - OpenMail IMAP server B.07.00.k0 (Samsung Contact ?) - - OpenWave - - Qualcomm Worldmail (NT) - - Rockliffe Mailsite 5.3.11, 4.5.6 - - Samsung Contact IMAP server 8.5.0 - - Scalix v10.1, 10.0.1.3, 11.0.0.431 - - SmarterMail, Smarter Mail 5.0 Enterprise. - - SunONE Messaging server 5.2, 6.0 (SUN JES - Java Enterprise System) - - Sun Java(tm) System Messaging Server 6.2-2.05, 6.2-7.05 - - Sun Messaging Server 6.3 - - Surgemail 3.6f5-5 - - UW-imap servers (imap-2000b) rijkkramer IMAP4rev1 2000.287 - (RedHat uses UW like 2003.338rh), v12.264 Solaris 5.7 (OSI Approved) - (http://www.washington.edu/imap/) - - UW - QMail v2.1 - - Imap part of TCP/IP suite of VMS 7.3.2 - - Zimbra-IMAP 3.0.1 GA 160, 3.1.0 Build 279, 4.0.5, 4.5.2, 4.5.6, 5.5, 6.x - -Please report to the author any success or bad story with -imapsync and do not forget to mention the IMAP server -software names and version on both sides. This will help -future users. To help the author maintaining this section -report the two lines at the begining of the output if they -are useful to know the softwares. Example: - - Host1 software:* OK louloutte Cyrus IMAP4 v1.5.19 server ready - Host2 software:* OK Courier-IMAP ready - -You can use option --justconnect to get those lines. -Example: - - imapsync --host1 imap.troc.org --host2 imap.trac.org --justconnect - -Please rate imapsync at http://freshmeat.net/projects/imapsync/ -or better give the author a book, he likes books: -http://www.amazon.com/gp/registry/wishlist/1C9UNDIH3P7R7/ -(or its paypal account gilles.lamiral@laposte.net) - -=head1 HUGE MIGRATION - -Pay special attention to options ---subscribed ---subscribe ---delete ---delete2 ---expunge ---expunge1 ---expunge2 ---uidexpunge2 ---maxage ---minage ---maxsize ---useheader ---fast - -If you have many mailboxes to migrate think about a little -shell program. Write a file called file.csv (for example) -containing users and passwords. -The separator used in this example is ';' - -The file.csv file contains: - -user0001;password0001;user0002;password0002 -user0011;password0011;user0012;password0012 -... - -And the shell program is just: - - { while IFS=';' read u1 p1 u2 p2; do - imapsync --user1 "$u1" --password1 "$p1" --user2 "$u2" --password2 "$p2" ... - done ; } < file.csv - -Welcome in shell programming ! - -=head1 Hacking - -Feel free to hack imapsync as the WTFPL Licence permits it. - -=head1 Links - -Entries for imapsync: - http://www.imap.org/products/showall.php - - -=head1 SIMILAR SOFTWARES - - imap_tools : http://www.athensfbc.com/imap_tools - offlineimap : http://software.complete.org/offlineimap - mailsync : http://mailsync.sourceforge.net/ - imapxfer : http://www.washington.edu/imap/ - part of the imap-utils from UW. - mailutil : replace imapxfer in - part of the imap-utils from UW. - http://www.gsp.com/cgi-bin/man.cgi?topic=mailutil - imaprepl : http://www.bl0rg.net/software/ - http://freshmeat.net/projects/imap-repl/ - imap_migrate : http://freshmeat.net/projects/imapmigration/ - imapcopy : http://home.arcor.de/armin.diehl/imapcopy/imapcopy.html - migrationtool : http://sourceforge.net/projects/migrationtool/ - imapmigrate : http://sourceforge.net/projects/cyrus-utils/ - wonko_imapsync: http://wonko.com/article/554 - see also tools/wonko_ruby_imapsync - pop2imap : http://www.linux-france.org/prj/pop2imap/ - - -Feedback (good or bad) will often be welcome. - -$Id: imapsync,v 1.366 2010/10/25 17:15:52 gilles Exp $ - -=cut - - -# pragmas - -use warnings; -++$|; -use strict; -use Carp; -use Getopt::Long; -use Mail::IMAPClient; -use Digest::MD5 qw(md5_base64); -#use Term::ReadKey; -#use IO::Socket::SSL; -use MIME::Base64; -use English; -use File::Basename; -use POSIX qw(uname SIGALRM); -use Fcntl; -use File::Spec; -use File::Path qw(mkpath rmtree); -use IO::Socket qw(:crlf SOL_SOCKET SO_KEEPALIVE); -use Errno qw(EAGAIN EPIPE ECONNRESET); - -use Test::More 'no_plan'; - -eval { require 'usr/include/sysexits.ph' }; - -use constant { - Unconnected => 0, - Connected => 1, # connected; not logged in - Authenticated => 2, # logged in; no mailbox selected - Selected => 3, # mailbox selected -}; - - -# global variables - -my( - $rcs, $pidfile, - $debug, $debugimap, $debugimap1, $debugimap2, $nb_errors, - $host1, $host2, $port1, $port2, - $user1, $user2, $password1, $password2, $passfile1, $passfile2, - @folder, @include, @exclude, @folderrec, - $prefix1, $prefix2, - @regextrans2, @regexmess, @regexflag, - $sep1, $sep2, - $syncinternaldates, - $idatefromheader, - $usedatemanip, - $syncacls, - $fastio1, $fastio2, - $maxsize, $minsize, $maxage, $minage, - $skipheader, @useheader, - $skipsize, $allowsizemismatch, $foldersizes, $buffersize, - $delete, $delete2, - $expunge, $expunge1, $expunge2, $uidexpunge2, $dry, - $justfoldersizes, - $authmd5, - $subscribed, $subscribe, $subscribe_all, - $version, $help, - $justconnect, $justfolders, $justbanner, - $fast, - $total_bytes_transferred, - $total_bytes_skipped, - $total_bytes_error, - $nb_msg_transferred, - $nb_msg_skipped, - $nb_msg_skipped_dry_mode, - $h1_nb_msg_duplicate, - $h2_nb_msg_duplicate, - $h1_nb_msg_noheader, - $h2_nb_msg_noheader, - $h1_total_bytes_duplicate, - $h2_total_bytes_duplicate, - $h1_nb_msg_deleted, - $h2_nb_msg_deleted, - $timeout, - $timestart, $timeend, $timediff, - $timesize, $timebefore, - $ssl1, $ssl2, - $tls1, $tls2, - $authuser1, $authuser2, - $authmech1, $authmech2, - $split1, $split2, - $reconnectretry1, $reconnectretry2, - $tests, $test_builder, $tests_debug, - $allow3xx, $justlogin, - $tmpdir, - $releasecheck, - $max_msg_size_in_bytes, - $modules_version, - $delete2folders, -); - -# main program - -# global variables initialisation - -$rcs = '$Id: imapsync,v 1.366 2010/10/25 17:15:52 gilles Exp $ '; - -$total_bytes_transferred = 0; -$total_bytes_skipped = 0; -$total_bytes_error = 0; -$nb_msg_transferred = 0; -$nb_msg_skipped = $nb_msg_skipped_dry_mode = 0; -$h1_nb_msg_deleted = $h2_nb_msg_deleted = 0; -$h1_nb_msg_duplicate = $h2_nb_msg_duplicate = 0; -$h1_nb_msg_noheader = $h2_nb_msg_noheader = 0; -$h1_total_bytes_duplicate = $h2_total_bytes_duplicate = 0; - -$nb_errors = 0; -$max_msg_size_in_bytes = 0; - -unless(defined(&_SYSEXITS_H)) { - # 64 on my linux box. - eval 'sub EX_USAGE () {64;}' unless defined(&EX_USAGE); -} - -# @ARGV will be eat by get_options() -my @argv_copy = @ARGV; - -get_options(); - -$modules_version = defined($modules_version) ? $modules_version : 1; - -$releasecheck = defined($releasecheck) ? $releasecheck : 1; -my $warn_release = ($releasecheck) ? check_last_release() : ''; - -# default values - -$tmpdir ||= File::Spec->tmpdir(); -$pidfile ||= $tmpdir . '/imapsync.pid'; - -# allow Mail::IMAPClient 3.0.xx by default -$allow3xx = defined($allow3xx) ? $allow3xx : 1; - -print banner_imapsync(@argv_copy); - -print "Temp directory is $tmpdir\n"; - -is_valid_directory($tmpdir); -write_pidfile($pidfile) if ($pidfile); - -$modules_version and print "Modules version list:\n", modules_VERSION(), "\n"; - -check_lib_version() or - die "imapsync needs perl lib Mail::IMAPClient release 2.2.9, or 3.0.25 or superior \n"; - -exit_clean(0) if ($justbanner); - -# By default, 1000 at a time, not more. -$split1 ||= 1000; -$split2 ||= 1000; - -$host1 || missing_option("--host1") ; -$port1 ||= (defined $ssl1 and !defined $tls1) ? 993 : 143; - -$host2 || missing_option("--host2") ; -$port2 ||= (defined $ssl2 && !defined $tls2) ? 993 : 143; - -$debugimap1 = $debugimap2 = 1 if ($debugimap); - -# By default, don't take size to compare -$skipsize = (defined $skipsize) ? $skipsize : 1; - - -if ($justconnect) { - justconnect(); - exit_clean(0); -} - -$user1 || missing_option("--user1"); -$user2 || missing_option("--user2"); - -$syncinternaldates = defined($syncinternaldates) ? $syncinternaldates : 1; - -if($idatefromheader) { - print "Turned ON idatefromheader, ", - "will set the internal dates on host2 from the 'Date:' header line.\n"; - $syncinternaldates = 0; - -} -if ($syncinternaldates) { - print "Turned ON syncinternaldates, ", - "will set the internal dates (arrival dates) on host2 same as host1.\n"; -}else{ - print "Turned OFF syncinternaldates\n"; -} - - -if(defined($authmd5) and not($authmd5)) { - $authmech1 ||= 'LOGIN'; - $authmech2 ||= 'LOGIN'; -} -else{ - $authmech1 ||= $authuser1 ? 'PLAIN' : 'CRAM-MD5'; - $authmech2 ||= $authuser2 ? 'PLAIN' : 'CRAM-MD5'; -} - -$authmech1 = uc($authmech1); -$authmech2 = uc($authmech2); - -$authuser1 ||= $user1; -$authuser2 ||= $user2; - -print "Will try to use $authmech1 authentication on host1\n"; -print "Will try to use $authmech2 authentication on host2\n"; - -$syncacls = (defined($syncacls)) ? $syncacls : 0; -$foldersizes = (defined($foldersizes)) ? $foldersizes : 1; - -$fastio1 = (defined($fastio1)) ? $fastio1 : 0; -$fastio2 = (defined($fastio2)) ? $fastio2 : 0; - -$reconnectretry1 = (defined($reconnectretry1)) ? $reconnectretry1 : 3; -$reconnectretry2 = (defined($reconnectretry2)) ? $reconnectretry2 : 3; - -@useheader = ("ALL") unless (@useheader); - -print "Host1: imap server [$host1] port [$port1] user [$user1]\n"; -print "Host2: imap server [$host2] port [$port2] user [$user2]\n"; - -$password1 || $passfile1 || do { - $password1 = ask_for_password($authuser1 || $user1, $host1); -}; - -$password1 = (defined($passfile1)) ? firstline ($passfile1) : $password1; - -$password2 || $passfile2 || do { - $password2 = ask_for_password($authuser2 || $user2, $host2); -}; - -$password2 = (defined($passfile2)) ? firstline ($passfile2) : $password2; - -my $imap1 = (); -my $imap2 = (); - -$timestart = time(); -$timebefore = $timestart; - -$debugimap1 and print "Host1 connection\n"; -$imap1 = login_imap($host1, $port1, $user1, $password1, - $debugimap1, $timeout, $fastio1, $ssl1, $tls1, - $authmech1, $authuser1, $reconnectretry1); - -$debugimap2 and print "Host2 connection\n"; -$imap2 = login_imap($host2, $port2, $user2, $password2, - $debugimap2, $timeout, $fastio2, $ssl2, $tls2, - $authmech2, $authuser2, $reconnectretry2); - -# history - -$debug and print "Host1 Buffer I/O: ", $imap1->Buffer(), "\n"; -$debug and print "Host2 Buffer I/O: ", $imap2->Buffer(), "\n"; - - - -die_clean() unless $imap1->IsAuthenticated(); -print "Host1: state Authenticated\n"; -die_clean() unless $imap2->IsAuthenticated(); -print "Host2: state Authenticated\n"; - -print "Host1 capability: ", join(" ", $imap1->capability_update()), "\n"; -print "Host2 capability: ", join(" ", $imap2->capability_update()), "\n"; - - -exit_clean(0) if ($justlogin); - -$split1 and $imap1->Split($split1); -$split2 and $imap2->Split($split2); - -# -# Folder stuff -# - -my ( -@h1_folders_all, %h1_folders_all, @h1_folders_wanted, %requested_folder, %subscribed_folder, -@h2_folders_all, %h2_folders_all, @h2_folders_from_1, %h2_folders_from_1, -); - - -# Make a hash of subscribed folders in source server. -map { $subscribed_folder{$_} = 1 } $imap1->subscribed(); - -# All folders on host1 and host2 -@h1_folders_all = sort $imap1->folders(); -@h2_folders_all = sort $imap2->folders(); - -map { $h1_folders_all{$_} = 1} @h1_folders_all; -map { $h2_folders_all{$_} = 1} @h2_folders_all; - -if (scalar(@folder) or $subscribed or scalar(@folderrec)) { - # folders given by option --folder - if (scalar(@folder)) { - add_to_requested_folders(@folder); - } - - # option --subscribed - if ($subscribed) { - add_to_requested_folders(keys (%subscribed_folder)); - } - - # option --folderrec - if (scalar(@folderrec)) { - foreach my $folderrec (@folderrec) { - add_to_requested_folders($imap1->folders($folderrec)); - } - } -} -else { - # no include, no folder/subscribed/folderrec options => all folders - if (not scalar(@include)) { - add_to_requested_folders(@h1_folders_all); - } -} - - -# consider (optional) includes and excludes -if (scalar(@include)) { - foreach my $include (@include) { - my @included_folders = grep /$include/, @h1_folders_all; - add_to_requested_folders(@included_folders); - print "Including folders matching pattern '$include': @included_folders\n"; - } -} - -if (scalar(@exclude)) { - foreach my $exclude (@exclude) { - my @requested_folder = sort(keys(%requested_folder)); - my @excluded_folders = grep /$exclude/, @requested_folder; - remove_from_requested_folders(@excluded_folders); - print "Excluding folders matching pattern '$exclude': @excluded_folders\n"; - } -} - -# Remove no selectable folders - -foreach my $folder (keys(%requested_folder)) { - if ( not $imap1->selectable($folder)) { - print "Warning: ignoring folder $folder because it is not selectable\n"; - remove_from_requested_folders($folder); - } -} - - -my @requested_folder = sort(keys(%requested_folder)); - -@h1_folders_wanted = @requested_folder; - -my($h1_sep,$h2_sep); -# what are the private folders separators for each server ? - -$debug and print "Getting separators\n"; -$h1_sep = get_separator($imap1, $sep1, "--sep1"); -$h2_sep = get_separator($imap2, $sep2, "--sep2"); - -#my $h1_namespace = $imap1->namespace(); -#my $h2_namespace = $imap2->namespace(); -#$debug and print "Host1 namespace:\n", Data::Dumper->Dump([$h1_namespace]); -#$debug and print "Host2 namespace:\n", Data::Dumper->Dump([$h2_namespace]); - -my($h1_prefix,$h2_prefix); -$h1_prefix = get_prefix($imap1, $prefix1, "--prefix1"); -$h2_prefix = get_prefix($imap2, $prefix2, "--prefix2"); - - -print "Host1 separator and prefix: [$h1_sep][$h1_prefix]\n"; -print "Host2 separator and prefix: [$h2_sep][$h2_prefix]\n"; - - -foreach my $h1_fold (@h1_folders_wanted) { - my $h2_fold; - $h2_fold = imap2_folder_name($h1_fold); - $h2_folders_from_1{$h2_fold}++; -} - -@h2_folders_from_1 = sort keys(%h2_folders_from_1); - -if ($foldersizes) { - foldersizes("Host1", $imap1, @h1_folders_wanted); - foldersizes("Host2", $imap2, @h2_folders_from_1); -} - - -exit_clean(0) if ($justfoldersizes); - -print - "++++ Listing folders\n", - "Host1 folders list:\n", map("[$_]\n",@h1_folders_all),"\n", - "Host2 folders list:\n", map("[$_]\n",@h2_folders_all),"\n"; - -print - "Host1 subscribed folders list: ", - map("[$_] ", sort keys(%subscribed_folder)), "\n" - if ($subscribed); - -my @h2_folders_not_in_1; -@h2_folders_not_in_1 = list_folders_in_2_not_in_1(); - -print "Folders in host2 not in host1:\n", - map("[$_]\n", @h2_folders_not_in_1),"\n"; - -delete_folders_in_2_not_in_1() if $delete2folders; - -# folder loop -print "++++ Looping on each folder\n"; - -FOLDER: foreach my $h1_fold (@h1_folders_wanted) { - - last FOLDER if $imap1->IsUnconnected(); - last FOLDER if $imap2->IsUnconnected(); - - my $h2_fold = imap2_folder_name($h1_fold); - - printf("%-35s -> %-35s\n", "[$h1_fold]", "[$h2_fold]"); - unless ($imap1->select($h1_fold)) { - warn - "Host1 folder $h1_fold: Could not select: ", - $imap1->LastError, "\n"; - $nb_errors++; - next FOLDER; - } - - if ( ! exists($h2_folders_all{$h2_fold})) { - print "Host2 folder $h2_fold does not exist\n"; - print "Creating folder [$h2_fold]\n"; - unless ($dry){ - unless ($imap2->create($h2_fold)){ - warn "Couldn't create [$h2_fold]: ", - $imap2->LastError,"\n"; - $nb_errors++; - next FOLDER; - } - } - else{ - next FOLDER; - } - } - - acls_sync($h1_fold, $h2_fold); - - unless ($imap2->select($h2_fold)) { - warn - "Host2 folder $h2_fold: Could not select: ", - $imap2->LastError, "\n"; - $nb_errors++; - next FOLDER; - } - my @select_results = $imap2->Results(); - - #print "%%% @select_results\n"; - my $permanentflags2 = permanentflags(@select_results); - - if ($expunge){ - print "Expunging host1 $h1_fold\n"; - unless($dry) { $imap1->expunge() }; - #print "Expunging host2 $h2_fold\n"; - #unless($dry) { $imap2->expunge() }; - } - - if (($subscribe and exists $subscribed_folder{$h1_fold}) or $subscribe_all) { - print "Subscribing to folder $h2_fold on destination server\n"; - unless($dry) { $imap2->subscribe($h2_fold) }; - } - - next FOLDER if ($justfolders); - - last FOLDER if $imap1->IsUnconnected(); - last FOLDER if $imap2->IsUnconnected(); - - my @h1_msgs = select_msgs($imap1); - - $debug and print "LIST Host1: ", scalar(@h1_msgs), " messages [@h1_msgs]\n"; - # internal dates on host2 are after the ones on host1 - # normally... - my @h2_msgs = select_msgs($imap2); - - $debug and print "LIST Host2: ", scalar(@h2_msgs), " messages [@h2_msgs]\n"; - - my %h1_hash = (); - my %h2_hash = (); - - $debug and print "Host1 folder [$h1_fold] parsing headers\n"; - last FOLDER if $imap1->IsUnconnected(); - last FOLDER if $imap2->IsUnconnected(); - - my ($h1_heads_ref, $h1_fir_ref) = ({}, {}); - $h1_heads_ref = $imap1->parse_headers([@h1_msgs], @useheader) if (@h1_msgs); - $debug and print "Time headers: ", timenext(), " s\n"; - last FOLDER if $imap1->IsUnconnected(); - - @$h1_fir_ref{@h1_msgs} = (undef); - $h1_fir_ref = $imap1->fetch_hash_2("FLAGS", "INTERNALDATE", "RFC822.SIZE", $h1_fir_ref) - if (@h1_msgs); - $debug and print "Time fir: ", timenext(), " s\n"; - unless ($h1_fir_ref) { - warn - "Host1 folder $h1_fold: Could not fetch_hash_2 ", - scalar(@h1_msgs), " msgs: ", $imap1->LastError, "\n"; - $nb_errors++; - next FOLDER; - } - last FOLDER if $imap1->IsUnconnected(); - - - my @h1_msgs_duplicate; - foreach my $m (@h1_msgs) { - my $rc = parse_header_msg($imap1, $m, $h1_heads_ref, $h1_fir_ref, "F", \%h1_hash); - if (! defined($rc)) { - my $h1_size = $h1_fir_ref->{$m}->{"RFC822.SIZE"} || 0; - print "+ Skipping msg #$m:$h1_size on host1 folder $h1_fold (no header so we ignore this message)\n"; - $total_bytes_skipped += $h1_size; - $nb_msg_skipped += 1; - $h1_nb_msg_noheader +=1; - } elsif(0 == $rc) { - # duplicate - push(@h1_msgs_duplicate, $m); - # duplicate, same id same size? - my $h1_size = $h1_fir_ref->{$m}->{"RFC822.SIZE"} || 0; - $nb_msg_skipped += 1; - $h1_total_bytes_duplicate += $h1_size; - $h1_nb_msg_duplicate += 1; - } - } - $debug and print "Time parsing headers on host1: ", timenext(), " s\n"; - - $debug and print "Host2 folder [$h2_fold] parsing headers\n"; - - my ($h2_heads_ref, $h2_fir_ref) = ({}, {}); - $h2_heads_ref = $imap2->parse_headers([@h2_msgs], @useheader) if (@h2_msgs); - $debug and print "Time headers: ", timenext(), " s\n"; - last FOLDER if $imap2->IsUnconnected(); - - @$h2_fir_ref{@h2_msgs} = (undef); # fetch_hash_2 can select by uid with last arg as ref - $h2_fir_ref = $imap2->fetch_hash_2("FLAGS", "INTERNALDATE", "RFC822.SIZE", $h2_fir_ref) - if (@h2_msgs); - $debug and print "Time fir: ", timenext(), " s\n"; - last FOLDER if $imap2->IsUnconnected(); - - my @h2_msgs_duplicate; - foreach my $m (@h2_msgs) { - my $rc = parse_header_msg($imap2, $m, $h2_heads_ref, $h2_fir_ref, "T", \%h2_hash); - if (! defined($rc)) { - my $h2_size = $h2_fir_ref->{$m}->{"RFC822.SIZE"} || 0; - print "+ Skipping msg #$m:$h2_size in host2 folder $h2_fold (no header so we ignore this message)\n"; - $h2_nb_msg_noheader += 1 ; - } elsif(0 == $rc) { - # duplicate - my $h2_size = $h2_fir_ref->{$m}->{"RFC822.SIZE"} || 0; - $h2_nb_msg_duplicate += 1; - $h2_total_bytes_duplicate += $h2_size; - push(@h2_msgs_duplicate, $m); - } - } - $debug and print "Time parsing headers on host2: ", timenext(), " s\n"; - - $debug and print "++++ Verifying [$h1_fold] -> [$h2_fold]\n"; - # messages in host1 that are not in host2 - - my @h1_hash_keys_sorted_by_uid - = sort {$h1_hash{$a}{'m'} <=> $h1_hash{$b}{'m'}} keys(%h1_hash); - - #print map { $h1_hash{$_}{'m'} . " "} @h1_hash_keys_sorted_by_uid; - - my @h2_hash_keys_sorted_by_uid - = sort {$h2_hash{$a}{'m'} <=> $h2_hash{$b}{'m'}} keys(%h2_hash); - - - if($delete2) { - my @h2_expunge; - foreach my $m_id (@h2_hash_keys_sorted_by_uid) { - #print "$m_id "; - unless (exists($h1_hash{$m_id})) { - my $h2_msg = $h2_hash{$m_id}{'m'}; - my $h2_flags = $h2_hash{$m_id}{'F'} || ""; - my $isdel = $h2_flags =~ /\B\\Deleted\b/ ? 1 : 0; - print "msg $h2_fold/$h2_msg deleted on host2 [$m_id]\n" - if ! $isdel; - push(@h2_expunge, $h2_msg) if $uidexpunge2; - unless ($dry or $isdel) { - $imap2->delete_message($h2_msg); - $h2_nb_msg_deleted += 1; - } - } - } - foreach my $h2_msg (@h2_msgs_duplicate) { - print "msg $h2_fold/$h2_msg deleted [duplicate] on host2\n"; - push(@h2_expunge, $h2_msg) if $uidexpunge2; - unless ($dry) { - $imap2->delete_message($h2_msg); - $h2_nb_msg_deleted += 1; - } - } - - my $cnt = scalar @h2_expunge; - if(@h2_expunge and !$imap2->can("uidexpunge")) { - warn "uidexpunge not supported (< IMAPClient 3.17)\n"; - } - elsif(@h2_expunge) { - print "uidexpunge $cnt message(s)\n"; - $imap2->uidexpunge(\@h2_expunge) if !$dry; - } - } - - MESS: foreach my $m_id (@h1_hash_keys_sorted_by_uid) { - my $h1_size = $h1_hash{$m_id}{'s'}; - my $h1_msg = $h1_hash{$m_id}{'m'}; - my $h1_idate = $h1_hash{$m_id}{'D'}; - - if (defined $maxsize and $h1_size >= $maxsize) { - print "msg $h1_fold/$h1_msg skipping ($h1_size exceeds maxsize limit $maxsize bytes)\n"; - $total_bytes_skipped += $h1_size; - $nb_msg_skipped += 1; - next MESS; - } - if (defined $minsize and $h1_size <= $minsize) { - print "msg $h1_fold/$h1_msg skipping ($h1_size smaller than minsize $minsize bytes)\n"; - $total_bytes_skipped += $h1_size; - $nb_msg_skipped += 1; - next MESS; - } - - unless (exists($h2_hash{$m_id})) { - # copy - $debug and print "msg $h1_fold/$h1_msg copying to $h2_fold\n"; - last FOLDER if $imap1->IsUnconnected(); - last FOLDER if $imap2->IsUnconnected(); - my $string; - #print "Message_string Beg\n", memory_consumption(); - $string = $imap1->message_string($h1_msg); - #print "Message_string End\n", memory_consumption(); - unless (defined($string)) { - warn - "- msg $h1_fold/$h1_msg could not fetch [$m_id $h1_size]: ", - $imap1->LastError, "\n"; - $nb_errors++; - $total_bytes_error += $h1_size; - next MESS; - } - - #my $message_file = "tmp_imapsync_$$"; - #$imap1->select($h1_fold); - #unlink($message_file); - #$imap1->message_to_file($message_file, $h1_msg) or do { - # warn "Could not put message #$h1_msg to file $message_file", - # $imap1->LastError; - # $nb_errors++; - # $total_bytes_error += $h1_size; - # next MESS; - #}; - #$string = file_to_string($message_file); - #print "AAA1[$string]ZZZ\n"; - #unlink($message_file); - if (@regexmess) { - $string = regexmess($string); - - #string_to_file($string, $message_file); - } - - - $debug and print - "=" x80, "\n", - "F message content begin next line\n", - $string, - "F message content ended on previous line\n", "=" x 80, "\n"; - my $h1_date = ""; - if ($syncinternaldates) { - $h1_date = $h1_idate; - $debug and print "internal date from host1: [$h1_date]\n"; - $h1_date = good_date($h1_date); - $debug and print "internal date from host1: [$h1_date] (fixed)\n"; - } - - if ($idatefromheader) { - - $h1_date = $imap1->get_header($h1_msg,"Date"); - $debug and print "header date from host1: [$h1_date]\n"; - $h1_date = good_date($h1_date); - $debug and print "header date from host1: [$h1_date] (fixed)\n"; - } - - my $h1_flags = $h1_hash{$m_id}{'F'} || ""; - # RFC 2060: This flag can not be altered by any client - $h1_flags =~ s@\\Recent\s?@@gi; - $h1_flags = flags_regex($h1_flags) if @regexflag; - - $h1_flags = flags_filter($h1_flags, $permanentflags2) if ($permanentflags2); - - my $new_id; - $debug and print "msg $h1_fold/$h1_msg date [$h1_date] flags [$h1_flags] size [$h1_size]\n"; - last FOLDER if $imap1->IsUnconnected(); - last FOLDER if $imap2->IsUnconnected(); - $h1_date = undef if ($h1_date eq ""); - - unless ($dry) { - $max_msg_size_in_bytes = max($h1_size, $max_msg_size_in_bytes); - $new_id = $imap2->append_string($h2_fold, $string, $h1_flags, $h1_date); - unless($new_id){ - no warnings 'uninitialized'; - warn "- msg $h1_fold/$h1_msg couldn't append (Subject:[". - $imap1->subject($h1_msg)."]) to folder $h2_fold: ", - $imap2->LastError, "\n"; - $nb_errors++; - $total_bytes_error += $h1_size; - next MESS; - } - else{ - # good - # $new_id is an id if the IMAP server has the - # UIDPLUS capability else just a ref - print "msg $h1_fold/$h1_msg copied to $h2_fold/$new_id\n"; - $total_bytes_transferred += $h1_size; - $nb_msg_transferred += 1; - if($delete) { - print "msg $h1_fold/$h1_msg deleted on host1\n"; - unless($dry) { - $imap1->delete_message($h1_msg); - $h1_nb_msg_deleted += 1; - last FOLDER if $imap1->IsUnconnected(); - $imap1->expunge() if ($expunge); - last FOLDER if $imap1->IsUnconnected(); - } - } - } - } - else{ - $nb_msg_skipped_dry_mode += 1; - } - #unlink($message_file); - next MESS; - } - else{ - #my $h2_size = $h2_hash{$m_id}{'s'}; - my $h2_msg = $h2_hash{$m_id}{'m'}; - #my $h2_idate = $h2_hash{$m_id}{'D'}; - $debug and print "msg $h1_fold/$h1_msg equals $h2_fold/$h2_msg\n"; - $total_bytes_skipped += $h1_size; - $nb_msg_skipped += 1; - } - - $fast and next MESS; - #$debug and print "MESSAGE $m_id\n"; - my $h2_size = $h2_hash{$m_id}{'s'}; - my $h2_msg = $h2_hash{$m_id}{'m'}; - - # used cached flag values for efficiency - my $h1_flags = $h1_hash{$m_id}{'F'} || ""; - my $h2_flags = $h2_hash{$m_id}{'F'} || ""; - - # RFC 2060: This flag can not be altered by any client - $h1_flags =~ s@\\Recent\s?@@gi; - $h1_flags = flags_regex($h1_flags) if @regexflag; - $h1_flags = flags_filter($h1_flags, $permanentflags2) if ($permanentflags2); - - - # compare flags - set flags if there a difference - my @h1_flags = sort split(' ', $h1_flags ); - my @h2_flags = sort split(' ', $h2_flags ); - my $diff = compare_lists(\@h1_flags, \@h2_flags); - - $diff and $debug and print "msg $h2_fold/$h2_msg replacing h2 flags($h2_flags) with h1 flags($h1_flags)\n"; - - # This sets flags so flags can be removed with this - # When you remove a \Seen flag on host1 you want to it - # to be removed on host2. Just add flags is not what - # we need most of the time. - - if (!$dry and $diff and !$imap2->store($h2_msg, "FLAGS.SILENT (@h1_flags)") ) { - warn "- msg $h2_fold/$h2_msg could not add flags @h1_flags", - $imap2->LastError, "\n"; - #$nb_errors++; - } - last FOLDER if $imap2->IsUnconnected(); - - $debug and do { - my @h2_flags = @{ $imap2->flags($h2_msg) || [] }; - last FOLDER if $imap2->IsUnconnected(); - - print "host1 flags: $h1_flags\n", - "host2 flags: @h2_flags\n"; - - print "Looking dates\n"; - #my $h1_idate = $imap1->internaldate($h1_msg); - #my $h2_idate = $imap2->internaldate($h2_msg); - my $h1_idate = $h1_hash{$m_id}{'D'}; - my $h2_idate = $h2_hash{$m_id}{'D'}; - print - "host1 internal date: $h1_idate\n", - "host2 internal date: $h2_idate\n"; - - #unless ($h1_idate eq $h2_idate) { - # print "!!! Dates differs !!!\n"; - #} - }; - unless ($skipsize or ($h1_size == $h2_size)) { - # Bad size - print - "- msg $h1_fold/$h1_msg size diff $h1_size != $h2_size $h2_fold/$h2_msg\n"; - $nb_errors++; - } - else { - # Good - $debug and print - "msg $h1_fold/$h1_msg sizes ok $h1_size <=> $h2_size $h2_fold/$h2_msg\n"; - if($delete) { - print "msg $h1_fold/$h1_msg deleted on host1\n"; - unless($dry) { - $imap1->delete_message($h1_msg); - $h1_nb_msg_deleted += 1; - $imap1->expunge() if ($expunge); - } - } - } - } - if ($expunge1){ - print "Expunging host1 folder $h1_fold\n"; - unless($dry) { $imap1->expunge() }; - } - if ($expunge2){ - print "Expunging host2 folder $h2_fold\n"; - unless($dry) { $imap2->expunge() }; - } - -$debug and print "Time: ", timenext(), " s\n"; -} - -print "++++ End looping on each folder\n"; -#print memory_consumption(); - -my $memory_consumption = memory_consumption(); -my $memory_ratio = ($max_msg_size_in_bytes) ? - sprintf('%.1f', $memory_consumption / $max_msg_size_in_bytes) : "NA"; - - -$imap1->logout(); -$imap2->logout(); - -my $host1_reconnect_count = $imap1->Reconnect_counter() || 0; -my $host2_reconnect_count = $imap2->Reconnect_counter() || 0; - - -$timeend = time(); -$timediff = $timeend - $timestart; - -stats(); -exit_clean(1) if($nb_errors); -exit_clean(0); - -# END of main program - -# subroutines - -sub max { - return(undef) if (0 == scalar(@_)); - my @sorted = sort { $a <=> $b } @_; - return(pop(@sorted)); -} - -sub tests_max { - ok(0 == max(0), "max 0"); - ok(1 == max(1), "max 1"); - ok(-1 == max(-1), "max -1"); - ok(! defined(max()), "max no arg"); - ok(100 == max(1, 100), "max 1 100"); - ok(100 == max(100, 1), "max 100 1"); - ok(100 == max(100, 42, 1), "max 100 42 1"); - ok(100 == max(100, "42", 1), "max 100 42 1"); - ok(100 == max("100", "42", 1), "max 100 42 1"); - #ok(100 == max(100, "haha", 1), "max 100 42 1"); -} - -sub check_lib_version { - $debug and print "IMAPClient $Mail::IMAPClient::VERSION\n"; - if ($Mail::IMAPClient::VERSION eq '2.2.9') { - override_imapclient(); - return(1); - } - else{ - # 3.x.x is no longer buggy with imapsync. - if ($allow3xx) { - return(1); - }else{ - return(0); - } - } -} - -sub modules_VERSION { - - my @list_version; - - foreach my $module (qw( -Mail::IMAPClient -IO::Socket -IO::Socket::SSL -Digest::MD5 -Digest::HMAC_MD5 -Term::ReadKey)) - { - my $v = "?"; - - if (eval "require $module") { - # module is here - $v = eval "\$${module}::VERSION"; - }else{ - # no module - $v = "?"; - } - #print ("$module ", $v, "\n"); - push (@list_version, sprintf("%-20s %s\n", $module, $v)); - } - return(@list_version); -} - -# Construct a command line copy with passwords replaced by MASKED. -sub command_line_nopassword { - my @argv_copy = @_; - my @argv_nopassword; - while (@argv_copy) { - my $arg = shift(@argv_copy); # option name or value - if ($arg =~ m/-password[12]/) { - shift(@argv_copy); # password value - push(@argv_nopassword, $arg, "MASKED"); # option name and fake value - }else{ - push(@argv_nopassword, $arg); # same option or value - } - } - return("@argv_nopassword"); -} - -sub tests_command_line_nopassword { - - ok('' eq command_line_nopassword(), 'command_line_nopassword void'); - ok('--blabla' eq command_line_nopassword('--blabla'), 'command_line_nopassword --blabla'); - #print command_line_nopassword((qw{ --password1 secret1 })), "\n"; - ok('--password1 MASKED' eq command_line_nopassword(qw{ --password1 secret1}), 'command_line_nopassword --password1'); - ok('--blabla --password1 MASKED --blibli' - eq command_line_nopassword(qw{ --blabla --password1 secret1 --blibli }), 'command_line_nopassword --password1 --blibli'); - - -} - -sub ask_for_password { - my ($user, $host) = @_; - print "What's the password for $user\@$host? "; - Term::ReadKey::ReadMode(2); - my $password = <>; - chomp $password; - printf "\n"; - Term::ReadKey::ReadMode(0); - return $password; -} - - -sub myconnect { - my $self = shift; - - $debug and print "Entering myconnect\n"; - %$self = (%$self, @_); - - my $sock = (($self->Ssl) ? IO::Socket::SSL->new : IO::Socket::INET->new); - my $dp = ($self->Ssl ? 'imaps(993)' : 'imap(143)'); - - $debug and print "Calling configure\n"; - my $ret = $sock->configure({ - PeerAddr => $self->Server , - PeerPort => $self->Port||$dp , - Proto => 'tcp' , - Timeout => $self->Timeout||0 , - Debug => $self->Debug , - }); - unless ( defined($ret) ) { - $self->LastError( "$@\n"); - $@ = "$@"; - carp "$@" - unless defined wantarray; - return undef; - } - $sock->autoflush(1); - - my $banner = $sock->getline(); - $debug and print "Read: $banner"; - - $self->Banner($banner); - $self->RawSocket2($sock); - $self->State(Connected); - - if ($self->Tls) { - starttls($self); - } - - $self->Ignoresizeerrors($allowsizemismatch); - - if ($self->User and $self->Password) { - $debug and print "Calling login\n"; - return $self->login ; - } - else { - return $self; - } -} - - - - -sub starttls { - my $self = shift; - my $socket = $self->RawSocket2(); - - $debug and print "Entering starttls\n"; - unless ($self->has_capability("STARTTLS")) { - die_clean( "No STARTTLS capability" ); - } - print $socket, "\n"; - print $socket "z00 STARTTLS\015\012"; - CORE::select( undef, undef, undef, 0.025 ); - my $txt = $socket->getline(); - $debug and print "Read tls: $txt"; - unless($txt =~ /^z00 OK/){ - die_clean( "Invalid response for STARTTLS: $txt\n" ); - } - $debug and print "Calling start_SSL\n"; - unless(IO::Socket::SSL->start_SSL($socket, - { - SSL_version => "TLSV1", - SSL_startHandshake => 1, - SSL_verify_depth => 1, - })) - { - die_clean( "Couldn't start TLS: ".IO::Socket::SSL::errstr()."\n"); - } - if (ref($socket) ne "IO::Socket::SSL") { - die_clean( "Socket has NOT been converted to SSL"); - }else{ - $debug and print "Socket successfuly converted to SSL\n"; - } - $debug and print "Ending starttls\n"; -} - - - -sub connect_imap { - my($host, $port, $debugimap, $ssl, $tls) = @_; - my $imap = Mail::IMAPClient->new(); - $imap->Ssl($ssl) if ($ssl); - $imap->Tls($tls) if ($tls); - $imap->Server($host); - $imap->Port($port); - $imap->Debug($debugimap); - #$imap->connect() - myconnect($imap) - or die_clean("Can not open imap connection on [$host]: $@\n"); -} - -sub justconnect { - my $imap1 = (); - my $imap2 = (); - - $imap1 = connect_imap($host1, $port1, $debugimap1, $ssl1, $tls1); - print "Host1 software: ", server_banner($imap1); - print "Host1 capability: ", join(" ", $imap1->capability()), "\n"; - $imap2 = connect_imap($host2, $port2, $debugimap2, $ssl2, $tls2); - print "Host2 software: ", server_banner($imap2); - print "Host2 capability: ", join(" ", $imap2->capability()), "\n"; - $imap1->logout(); - $imap2->logout(); - -} - - -sub login_imap { - my($host, $port, $user, $password, - $debugimap, $timeout, $fastio, - $ssl, $tls, $authmech, $authuser, $reconnectretry) = @_; - my ($imap); - - $imap = Mail::IMAPClient->new(); - - $imap->Ssl($ssl) if ($ssl); - $imap->Tls($tls) if ($tls); - $imap->Clear(1); - $imap->Server($host); - $imap->Port($port); - $imap->Fast_io($fastio); - $imap->Buffer($buffersize || 4096); - $imap->Uid(1); - $imap->Peek(1); - $imap->Debug($debugimap); - $timeout and $imap->Timeout($timeout); - - $imap->Reconnectretry($reconnectretry) if ($reconnectretry); - - #$imap->connect() - myconnect($imap) - or die_clean("Can not open imap connection on [$host] with user [$user]: $@\n"); - - print "Banner: ", server_banner($imap); - - if ($imap->has_capability("AUTH=$authmech") - or $imap->has_capability($authmech) - ) { - printf("Host %s says it has CAPABILITY for AUTHENTICATE %s\n", - $imap->Server, $authmech); - } - else { - printf("Host %s says it has NO CAPABILITY for AUTHENTICATE %s\n", - $imap->Server, $authmech); - if ($authmech eq 'PLAIN') { - print "Frequently PLAIN is only supported with SSL, ", - "try --ssl1 or --ssl2 option\n"; - } - } - - $imap->Authmechanism($authmech) unless ($authmech eq 'LOGIN'); - $imap->Authcallback(\&plainauth) if $authmech eq "PLAIN"; - - - $imap->User($user); - $imap->Authuser($authuser); - $imap->Password($password); - unless ($imap->login()) { - my $info = "Error login: [$host] with user [$user] auth"; - my $einfo = $imap->LastError || @{$imap->History}[-1]; - chomp($einfo); - my $error = "$info [$authmech]: $einfo\n"; - print $error; # note: duplicating error on stdout/stderr - die_clean($error) if ($authmech eq 'LOGIN' or $imap->IsUnconnected() or $authuser); - print "Trying LOGIN Auth mechanism on [$host] with user [$user]\n"; - $imap->Authmechanism(""); - $imap->login() or - die_clean("$info [LOGIN]: ", $imap->LastError, "\n"); - } - print "Success login on [$host] with user [$user] auth [$authmech]\n"; - return($imap); -} - - -sub plainauth() { - my $code = shift; - my $imap = shift; - - my $string = sprintf("%s\x00%s\x00%s", $imap->User, - $imap->Authuser, $imap->Password); - return encode_base64("$string", ""); -} - - -sub server_banner { - my $imap = shift; - my $banner = $imap->Banner() || "No banner\n"; - return $banner; - } - - -sub banner_imapsync { - - my @argv_copy = @_; - my $banner_imapsync = join("", - '$RCSfile: imapsync,v $ ', - '$Revision: 1.366 $ ', - '$Date: 2010/10/25 17:15:52 $ ', - "\n",localhost_info(), "\n", - "Command line used:\n", - "$0 ", command_line_nopassword(@argv_copy), "\n", - ); -} - -sub is_valid_directory { - my $dir = shift; - return(1) if (-d $dir and -r _ and -w _); - # Trying to create it - mkpath($dir) or die "Error creating tmpdir $tmpdir : $!"; - die "Error with tmpdir $tmpdir : $!" if not (-d $dir and -r _ and -w _); - return(1); -} - - - - -sub write_pidfile { - my $pidfile = shift; - - print "PID file is $pidfile\n"; - if (-e $pidfile) { - warn "$pidfile already exists, overwriting it\n"; - } - open(PIDFILE, ">$pidfile") or do { - warn "Could not open $pidfile for writing"; - return undef; - }; - - print PIDFILE $PROCESS_ID; - close PIDFILE; - return($PROCESS_ID); -} - -sub exit_clean { - my $status = shift; - - unlink($pidfile); - exit($status); -} - -sub die_clean { - - unlink($pidfile); - die @_; -} - -sub missing_option { - my ($option) = @_; - die_clean("$option option must be used, run $0 --help for help\n"); -} - - - -sub tests_folder_routines { - ok( !is_requested_folder('folder_foo') ); - ok( add_to_requested_folders('folder_foo') ); - ok( is_requested_folder('folder_foo') ); - ok( !is_requested_folder('folder_NO_EXIST') ); - ok( !remove_from_requested_folders('folder_foo'), "removed folder_foo"); - ok( !is_requested_folder('folder_foo') ); - my @f; - ok( @f = add_to_requested_folders('folder_bar', 'folder_toto'), "add result: @f"); - ok( is_requested_folder('folder_bar') ); - ok( is_requested_folder('folder_toto') ); - ok( remove_from_requested_folders('folder_toto') ); - ok( !is_requested_folder('folder_toto') ); -} - - -sub is_requested_folder { - my ( $folder ) = @_; - - defined( $requested_folder{ $folder } ); -} - - -sub add_to_requested_folders { - my @wanted_folders = @_; - - foreach my $folder ( @wanted_folders ) { - ++$requested_folder{ $folder }; - } - return( keys( %requested_folder ) ); -} - -sub remove_from_requested_folders { - my @wanted_folders = @_; - - foreach my $folder (@wanted_folders) { - delete $requested_folder{$folder}; - } - return( keys(%requested_folder) ); -} - -sub compare_lists { - my ($list_1_ref, $list_2_ref) = @_; - - return(-1) if ((not defined($list_1_ref)) and defined($list_2_ref)); - return(0) if ((not defined($list_1_ref)) and not defined($list_2_ref)); # end if no list - return(1) if (not defined($list_2_ref)); # end if only one list - - if (not ref($list_1_ref)) {$list_1_ref = [$list_1_ref]}; - if (not ref($list_2_ref)) {$list_2_ref = [$list_2_ref]}; - - - my $last_used_indice = -1; - #print "\$#$list_1_ref:", $#$list_1_ref, "\n"; - #print "\$#$list_2_ref:", $#$list_2_ref, "\n"; - ELEMENT: - foreach my $indice ( 0 .. $#$list_1_ref ) { - $last_used_indice = $indice; - - # End of list_2 - return 1 if ($indice > $#$list_2_ref); - - my $element_list_1 = $list_1_ref->[$indice]; - my $element_list_2 = $list_2_ref->[$indice]; - my $balance = $element_list_1 cmp $element_list_2 ; - next ELEMENT if ($balance == 0) ; - return $balance; - } - # each element equal until last indice of list_1 - return -1 if ($last_used_indice < $#$list_2_ref); - - # same size, each element equal - return 0 -} - -sub tests_compare_lists { - - - my $empty_list_ref = []; - - ok( 0 == compare_lists() , 'compare_lists, no args'); - ok( 0 == compare_lists(undef) , 'compare_lists, undef = nothing'); - ok( 0 == compare_lists(undef, undef) , 'compare_lists, undef = undef'); - ok(-1 == compare_lists(undef , []) , 'compare_lists, undef < []'); - ok(-1 == compare_lists(undef , [1]) , 'compare_lists, undef < [1]'); - ok(-1 == compare_lists(undef , [0]) , 'compare_lists, undef < [0]'); - ok(+1 == compare_lists([]) , 'compare_lists, [] > nothing'); - ok(+1 == compare_lists([], undef) , 'compare_lists, [] > undef'); - ok( 0 == compare_lists([] , []) , 'compare_lists, [] = []'); - - ok(-1 == compare_lists([] , [1]) , 'compare_lists, [] < [1]'); - ok(+1 == compare_lists([1] , []) , 'compare_lists, [1] > []'); - - - ok( 0 == compare_lists([1], 1 ) , "compare_lists, [1] = 1 ") ; - ok( 0 == compare_lists( 1 , [1]) , "compare_lists, 1 = [1]") ; - ok( 0 == compare_lists( 1 , 1 ) , "compare_lists, 1 = 1 ") ; - ok(-1 == compare_lists( 0 , 1 ) , "compare_lists, 0 < 1 ") ; - ok(-1 == compare_lists(-1 , 0 ) , "compare_lists, -1 < 0 ") ; - ok(-1 == compare_lists( 1 , 2 ) , "compare_lists, 1 < 2 ") ; - ok(+1 == compare_lists( 2 , 1 ) , "compare_lists, 2 > 1 ") ; - - - ok( 0 == compare_lists([1,2], [1,2]) , "compare_lists, [1,2] = [1,2]") ; - ok(-1 == compare_lists([1], [1,2]) , "compare_lists, [1] < [1,2]") ; - ok(+1 == compare_lists([2], [1,2]) , "compare_lists, [2] > [1,2]") ; - ok(-1 == compare_lists([1], [1,1]) , "compare_lists, [1] < [1,1]") ; - ok(+1 == compare_lists([1, 1], [1]) , "compare_lists, [1, 1] > [1]") ; - ok( 0 == compare_lists([1 .. 20_000] , [1 .. 20_000]) - , "compare_lists, [1..20_000] = [1..20_000]") ; - ok(-1 == compare_lists([1], [3]) , 'compare_lists, [1] < [3]') ; - ok( 0 == compare_lists([2], [2]) , 'compare_lists, [0] = [2]') ; - ok(+1 == compare_lists([3], [1]) , 'compare_lists, [3] > [1]') ; - - ok(-1 == compare_lists(["a"], ["b"]) , 'compare_lists, ["a"] < ["b"]') ; - ok( 0 == compare_lists(["a"], ["a"]) , 'compare_lists, ["a"] = ["a"]') ; - ok( 0 == compare_lists(["ab"], ["ab"]) , 'compare_lists, ["ab"] = ["ab"]') ; - ok(+1 == compare_lists(["b"], ["a"]) , 'compare_lists, ["b"] > ["a"]') ; - ok(-1 == compare_lists(["a"], ["aa"]) , 'compare_lists, ["a"] < ["aa"]') ; - ok(-1 == compare_lists(["a"], ["a", "a"]), 'compare_lists, ["a"] < ["a", "a"]') ; - ok( 0 == compare_lists([split(" ", "a b")], ["a", "b"]), 'compare_lists, split') ; - ok( 0 == compare_lists([sort split(" ", "b a")], ["a", "b"]), 'compare_lists, sort split') ; -} - - - -sub get_prefix { - my($imap, $prefix_in, $prefix_opt) = @_; - my($prefix_out); - - $debug and print "Getting prefix namespace\n"; - if (defined($prefix_in)) { - print "Using [$prefix_in] given by $prefix_opt\n"; - $prefix_out = $prefix_in; - return($prefix_out); - } - $debug and print "Calling namespace capability\n"; - if ($imap->has_capability("namespace")) { - my $r_namespace = $imap->namespace(); - $prefix_out = $r_namespace->[0][0][0]; - return($prefix_out); - } - else{ - print - "No NAMESPACE capability in imap server ", - $imap->Server(),"\n", - "Give the prefix namespace with the $prefix_opt option\n"; - exit_clean(1); - } -} - - -sub get_separator { - my($imap, $sep_in, $sep_opt) = @_; - my($sep_out); - - - if ($sep_in) { - print "Using [$sep_in] given by $sep_opt\n"; - $sep_out = $sep_in; - return($sep_out); - } - $debug and print "Calling namespace capability\n"; - if ($imap->has_capability("namespace")) { - $sep_out = $imap->separator(); - return($sep_out) if defined $sep_out; - warn - "NAMESPACE request failed for ", - $imap->Server(), ": ", $imap->LastError, "\n"; - exit_clean(1); - } - else{ - warn - "No NAMESPACE capability in imap server ", - $imap->Server(),"\n", - "Give the separator character with the $sep_opt option\n"; - exit_clean(1); - } -} - -sub separator_invert { - # The separator we hope we'll never encounter: 00000000 - my $o_sep="\000"; - - my($h1_fold, $h1_sep, $h2_sep) = @_; - - my $h2_fold = $h1_fold; - $h2_fold =~ s@\Q$h2_sep@$o_sep@g; - $h2_fold =~ s@\Q$h1_sep@$h2_sep@g; - $h2_fold =~ s@\Q$o_sep@$h1_sep@g; - return($h2_fold); -} - - -sub tests_imap2_folder_name { - -$h1_prefix = $h2_prefix = ''; -$h1_sep = '/'; -$h2_sep = '.'; - -$debug and print -"prefix1: [$h1_prefix] -prefix2: [$h2_prefix] -sep1:[$h1_sep] -sep2:[$h2_sep] -"; - -ok('' eq imap2_folder_name(''), 'imap2_folder_name: empty string'); -ok('blabla' eq imap2_folder_name('blabla'), 'imap2_folder_name: blabla'); -ok('spam.spam' eq imap2_folder_name('spam/spam'), 'imap2_folder_name: spam/spam'); -ok('spam/spam' eq imap2_folder_name('spam.spam'), 'imap2_folder_name: spam.spam'); -ok('spam.spam/spam' eq imap2_folder_name('spam/spam.spam'), 'imap2_folder_name: spam/spam.spam'); -@regextrans2 = ('s,/,X,g'); -ok('' eq imap2_folder_name(''), 'imap2_folder_name: empty string [s,/,X,g]'); -ok('blabla' eq imap2_folder_name('blabla'), 'imap2_folder_name: blabla [s,/,X,g]'); -ok('spam.spam' eq imap2_folder_name('spam/spam'), 'imap2_folder_name: spam/spam [s,/,X,g]'); -ok('spamXspam' eq imap2_folder_name('spam.spam'), 'imap2_folder_name: spam.spam [s,/,X,g]'); -ok('spam.spamXspam' eq imap2_folder_name('spam/spam.spam'), 'imap2_folder_name: spam/spam.spam [s,/,X,g]'); - -@regextrans2 = ('s, ,_,g'); -ok('blabla' eq imap2_folder_name('blabla'), 'imap2_folder_name: blabla [s, ,_,g]'); -ok('bla_bla' eq imap2_folder_name('bla bla'), 'imap2_folder_name: blabla [s, ,_,g]'); - -@regextrans2 = ('s,(.*),\U$1,'); -ok('BLABLA' eq imap2_folder_name('blabla'), 'imap2_folder_name: blabla [s,\U(.*)\E,$1,]'); - - -} - -sub imap2_folder_name { - my ($h2_fold); - my ($x_fold) = @_; - # first we remove the prefix - $x_fold =~ s/^\Q$h1_prefix\E//; - $debug and print "removed host1 prefix: [$x_fold]\n"; - $h2_fold = separator_invert($x_fold,$h1_sep, $h2_sep); - $debug and print "inverted separators: [$h2_fold]\n"; - # Adding the prefix supplied by namespace or the --prefix2 option - $h2_fold = $h2_prefix . $h2_fold - unless(($h2_prefix eq "INBOX" . $h2_sep) and ($h2_fold =~ m/^INBOX$/i)); - $debug and print "added host2 prefix: [$h2_fold]\n"; - - # Transforming the folder name by the --regextrans2 option(s) - foreach my $regextrans2 (@regextrans2) { - my $h2_fold_before = $h2_fold; - eval("\$h2_fold =~ $regextrans2"); - $debug and print "[$h2_fold_before] -> [$h2_fold] using re [$regextrans2]\n"; - die_clean("error: eval regextrans2 '$regextrans2': $@\n") if $@; - } - return($h2_fold); -} - - -sub foldersizes { - - my ($side, $imap, @folders) = @_; - my $tot = 0; - my $tmess = 0; - - print "++++ Calculating sizes\n"; - foreach my $folder (@folders) { - my $stot = 0; - my $smess = 0; - printf("$side folder %-35s", "[$folder]"); - unless($imap->exists($folder)) { - print("does not exist yet\n"); - next; - } - unless ($imap->examine($folder)) { - warn - "$side Folder $folder: Could not examine: ", - $imap->LastError, "\n"; - $nb_errors++; - next; - } - - my $hash_ref = {}; - my @msgs = select_msgs($imap); - $smess = scalar(@msgs); - @$hash_ref{@msgs} = (undef); - unless ($smess == 0) { - $imap->fetch_hash_2("RFC822.SIZE",$hash_ref) or die_clean("$@"); - #print map {$hash_ref->{$_}->{"RFC822.SIZE"}, " "} keys %$hash_ref; - map {$stot += $hash_ref->{$_}->{"RFC822.SIZE"}} keys %$hash_ref; - } - - printf(" Size: %9s", $stot); - printf(" Messages: %5s\n", $smess); - $tot += $stot; - $tmess += $smess; - } - print "Total size: $tot\n"; - print "Total messages: $tmess\n"; - print "Time: ", timenext(), " s\n"; -} - -sub timenext { - my ($timenow, $timerel); - # $timebefore is global, beurk ! - $timenow = time; - $timerel = $timenow - $timebefore; - $timebefore = $timenow; - return($timerel); -} - - -sub tests_flags_regex { - - my $string; - ok('' eq flags_regex(''), "flags_regex, null string ''"); - ok('\Seen NonJunk $Spam' eq flags_regex('\Seen NonJunk $Spam'), 'flags_regex, nothing to do'); - ok('\Seen NonJunk $Spam' eq flags_regex('\Seen NonJunk $Spam'), 'flags_regex,'); - @regexflag = ('s/NonJunk//g'); - ok('\Seen $Spam' eq flags_regex('\Seen NonJunk $Spam'), "flags_regex, remove NonJunk: 's/NonJunk//g'"); - @regexflag = ('s/\$Spam//g'); - ok('\Seen NonJunk ' eq flags_regex('\Seen NonJunk $Spam'), 'flags_regex, remove $Spam: '."'s/\$Spam//g'"); - - @regexflag = ('s/\\\\Seen//g'); - - ok(' NonJunk $Spam' eq flags_regex('\Seen NonJunk $Spam'), 'flags_regex, remove \Seen: '. "'s/\\\\\\\\Seen//g'"); - - @regexflag = ('s/(\s|^)[^\\\\]\w+//g'); - ok('\Seen \Middle \End' eq flags_regex('\Seen NonJunk \Middle $Spam \End'), 'flags_regex, only \word [' . flags_regex('\Seen NonJunk \Middle $Spam \End'.']')); - ok(' \Seen \Middle \End1' eq flags_regex('Begin \Seen NonJunk \Middle $Spam \End1 End'), 'flags_regex, only \word [' . flags_regex('Begin \Seen NonJunk \Middle $Spam \End1 End'.']')); - - @regexflag = ('s/.*?(Keep1|Keep2|Keep3)/$1 /g'); - ok('Keep1 Keep2 ReB' eq flags_regex('ReA Keep1 REM Keep2 ReB'), "Keep only regex"); - #ok('Keep1 Keep2' eq flags_regex('Keep1 Keep2 Remove1'), "Keep only regex"); - ok('Keep1 Keep2 ' eq flags_regex('REM REM Keep1 Keep2'), "Keep only regex"); - ok('Keep1 Keep2 ' eq flags_regex('Keep1 REM REM Keep2'), "Keep only regex"); - ok('Keep1 Keep2 ' eq flags_regex('REM Keep1 REM REM Keep2'), "Keep only regex"); - ok('Keep1 Keep2 ' eq flags_regex('Keep1 Keep2'), "Keep only regex"); - ok('Keep1 ' eq flags_regex('REM Keep1'), "Keep only regex"); - - @regexflag = ('s/(Keep1|Keep2|Keep3) (?!(Keep1|Keep2|Keep3)).*/$1 /g'); - ok('Keep1 Keep2 ' eq flags_regex('Keep1 Keep2 ReB'), "Keep only regex"); - ok('Keep1 Keep2 ' eq flags_regex('Keep1 Keep2 REM REM REM'), "Keep only regex"); - ok('Keep2 ' eq flags_regex('Keep2 REM REM REM'), "Keep only regex"); - #ok('' eq flags_regex('REM REM'), "Keep only regex"); - - @regexflag = ('s/.*?(Keep1|Keep2|Keep3)/$1 /g', - 's/(Keep1|Keep2|Keep3) (?!(Keep1|Keep2|Keep3)).*/$1 /g'); - ok('Keep1 Keep2 ' eq flags_regex('REM Keep1 REM Keep2 REM'), "Keep only regex"); - ok('Keep1 Keep2 ' eq flags_regex('Keep1 REM Keep2 REM'), "Keep only regex"); - ok('Keep1 Keep2 ' eq flags_regex('REM Keep1 Keep2 REM'), "Keep only regex"); - ok('Keep1 Keep2 ' eq flags_regex('REM Keep1 REM Keep2'), "Keep only regex"); - ok('Keep1 Keep2 Keep3 ' eq flags_regex('REM Keep1 REM Keep2 REM REM Keep3 REM'), "Keep only regex"); - ok('Keep1 ' eq flags_regex('REM REM Keep1 REM REM REM '), "Keep only regex"); - ok('Keep1 Keep3 ' eq flags_regex('RE1 Keep1 RE2 Keep3 RE3 RE4 RE5 '), "Keep only regex"); - - @regexflag = ('s/(.*)/$1 jrdH8u/'); - ok('REM REM REM REM REM jrdH8u' eq flags_regex('REM REM REM REM REM'), "Keep only regex 's/(.*)/\$1 jrdH8u/'"); - @regexflag = ('s/jrdH8u *//'); - ok('REM REM REM REM REM ' eq flags_regex('REM REM REM REM REM jrdH8u'), "Keep only regex s/jrdH8u *//"); - - @regexflag = ( - 's/(.*)/$1 jrdH8u/', - 's/.*?(Keep1|Keep2|Keep3|jrdH8u)/$1 /g', - 's/(Keep1|Keep2|Keep3|jrdH8u) (?!(Keep1|Keep2|Keep3|jrdH8u)).*/$1 /g', - 's/jrdH8u *//' - ); - - ok('Keep1 Keep2 ' eq flags_regex('REM Keep1 REM Keep2 REM'), "Keep only regex 'REM Keep1 REM Keep2 REM'"); - ok('Keep1 Keep2 ' eq flags_regex('Keep1 REM Keep2 REM'), "Keep only regex"); - ok('Keep1 Keep2 ' eq flags_regex('REM Keep1 Keep2 REM'), "Keep only regex"); - ok('Keep1 Keep2 ' eq flags_regex('REM Keep1 REM Keep2'), "Keep only regex"); - ok('Keep1 Keep2 Keep3 ' eq flags_regex('REM Keep1 REM Keep2 REM REM Keep3 REM'), "Keep only regex"); - ok('Keep1 ' eq flags_regex('REM REM Keep1 REM REM REM '), "Keep only regex"); - ok('Keep1 Keep3 ' eq flags_regex('RE1 Keep1 RE2 Keep3 RE3 RE4 RE5 '), "Keep only regex"); - ok('' eq flags_regex('REM REM REM REM REM'), "Keep only regex"); - - @regexflag = ( - 's/(.*)/$1 jrdH8u/', - 's/.*?(\\\\Seen|\\\\Answered|\\\\Flagged|\\\\Deleted|\\\\Draft|jrdH8u)/$1 /g', - 's/(\\\\Seen|\\\\Answered|\\\\Flagged|\\\\Deleted|\\\\Draft|jrdH8u) (?!(\\\\Seen|\\\\Answered|\\\\Flagged|\\\\Deleted|\\\\Draft|jrdH8u)).*/$1 /g', - 's/jrdH8u *//' - ); - - ok('\\Deleted \\Answered ' - eq flags_regex('Blabla $Junk \\Deleted machin \\Answered truc'), "Keep only regex: Exchange case"); - ok('' eq flags_regex(''), "Keep only regex: Exchange case, null string"); - ok('' - eq flags_regex('Blabla $Junk machin truc'), "Keep only regex: Exchange case, no accepted flags "); - ok('\\Deleted \\Answered \\Draft \\Flagged ' - eq flags_regex('\\Deleted \\Answered \\Draft \\Flagged '), "Keep only regex: Exchange case"); - - - @regexflag = ( - 's/.*?(?:(\\\\(?:Answered|Flagged|Deleted|Seen|Draft)\s?)|$)/defined($1)?$1:q()/eg' - ); - - ok('\\Deleted \\Answered ' - eq flags_regex('Blabla \$Junk \\Deleted machin \\Answered truc'), - "Keep only regex: Exchange case (Phil)"); - - ok('' eq flags_regex(''), "Keep only regex: Exchange case, null string (Phil)"); - - ok('' - eq flags_regex('Blabla $Junk machin truc'), - "Keep only regex: Exchange case, no accepted flags (Phil)"); - - ok('\\Deleted \\Answered \\Draft \\Flagged ' - eq flags_regex('\\Deleted \\Answered \\Draft \\Flagged '), - "Keep only regex: Exchange case (Phil)"); - - -} - -sub flags_regex { - my ($h1_flags) = @_; - foreach my $regexflag (@regexflag) { - my $h1_flags_orig = $h1_flags; - $debug and print "eval \$h1_flags =~ $regexflag\n"; - eval("\$h1_flags =~ $regexflag"); - die_clean("error: eval regexflag '$regexflag': $@\n") if $@; - $debug and print "regexflag $regexflag [$h1_flags_orig] -> [$h1_flags]\n"; - } - return($h1_flags); -} - -sub acls_sync { - my($h1_fold, $h2_fold) = @_; - if ($syncacls) { - my $h1_hash = $imap1->getacl($h1_fold) - or warn "Could not getacl for $h1_fold: $@\n"; - my $h2_hash = $imap2->getacl($h2_fold) - or warn "Could not getacl for $h2_fold: $@\n"; - my %users = map({ ($_, 1) } (keys(%$h1_hash), keys(%$h2_hash))); - foreach my $user (sort(keys(%users))) { - my $acl = $h1_hash->{$user} || "none"; - print "acl $user: [$acl]\n"; - next if ($h1_hash->{$user} && $h2_hash->{$user} && - $h1_hash->{$user} eq $h2_hash->{$user}); - unless ($dry) { - print "setting acl $h2_fold $user $acl\n"; - $imap2->setacl($h2_fold, $user, $acl) - or warn "Could not set acl: $@\n"; - } - } - } -} - - -sub tests_permanentflags { - - my $string; - ok('' eq permanentflags(' * OK [PERMANENTFLAGS (\* \Draft \Answered)] Limited'), - 'permanentflags \*'); - ok('\Draft \Answered' eq permanentflags(' * OK [PERMANENTFLAGS (\Draft \Answered)] Limited'), - 'permanentflags \Draft \Answered'); - ok('\Draft \Answered' - eq permanentflags('Blabla', - ' * OK [PERMANENTFLAGS (\Draft \Answered)] Limited', - 'Blabla'), - 'permanentflags \Draft \Answered' - ); - ok('' eq permanentflags('Blabla'), 'permanentflags nothing'); -} - -sub permanentflags { - my @lines = @_; - - foreach my $line (@lines) { - if ($line =~ m{\[PERMANENTFLAGS \(([^)]+?)\)\]}) { - #print "%%%$1%%%\n"; - my $permanentflags = $1; - if ($permanentflags =~ m{\\\*}) { - $permanentflags = ''; - } - return($permanentflags); - }; - } -} - -sub tests_flags_filter { - - ok( '\Seen' eq flags_filter('\Seen', '\Draft \Seen \Answered'), 'flags_filter ' ); - ok( '' eq flags_filter('\Seen', '\Draft \Answered'), 'flags_filter ' ); - ok( '\Seen' eq flags_filter('\Seen', '\Seen'), 'flags_filter ' ); - ok( '\Seen' eq flags_filter('\Seen', ' \Seen '), 'flags_filter ' ); - ok( '\Seen \Draft' - eq flags_filter('\Seen \Draft', '\Draft \Seen \Answered'), 'flags_filter ' ); - ok( '\Seen \Draft' - eq flags_filter('\Seen \Draft', ' \Draft \Seen \Answered '), 'flags_filter ' ); - -} - -sub flags_filter { - my($flags, $allowed_flags) = @_; - - my @flags = split(/\s+/, $flags); - my %allowed_flags = map { $_ => 1 } split(' ', $allowed_flags ); - my @flags_out = map { exists $allowed_flags{$_} ? $_ : () } @flags; - - my $flags_out = join(' ', @flags_out); - #print "%%%$flags_out%%%\n"; - return($flags_out); -} - - - -sub select_msgs { - my ($imap) = @_; - my (@msgs,@max,@min,@union,@inter); - - unless (defined($maxage) or defined($minage)) { - @msgs = $imap->search("ALL"); - return(@msgs); - } - if (defined($maxage)) { - @max = $imap->sentsince(time - 86400 * $maxage); - } - if (defined($minage)) { - @min = $imap->sentbefore(time - 86400 * $minage); - } - SWITCH: { - unless(defined($minage)) {@msgs = @max; last SWITCH}; - unless(defined($maxage)) {@msgs = @min; last SWITCH}; - my (%union, %inter); - foreach my $m (@min, @max) {$union{$m}++ && $inter{$m}++} - @inter = keys(%inter); - @union = keys(%union); - # normal case - if ($minage <= $maxage) {@msgs = @inter; last SWITCH}; - # just exclude messages between - if ($minage > $maxage) {@msgs = @union; last SWITCH}; - - } - return(@msgs); -} - - - - -sub tests_regexmess { - - ok("blabla" eq regexmess("blabla"), "regexmess, no regexmess, nothing to do"); - - @regexmess = ('s/p/Z/g'); - ok("ZoZoZo" eq regexmess("popopo"), "regexmess, s/p/Z/g"); - - @regexmess = 's{c}{C}gxms'; - ok("H1: abC\nH2: Cde\n\nBody abC" - eq regexmess("H1: abc\nH2: cde\n\nBody abc"), - "regexmess, c->C"); - - @regexmess = 's{\AFrom\ }{From:}gxms'; - ok( '' - eq regexmess(''), - 'From mbox 1 add colon blank'); - - ok( 'From:' - eq regexmess('From '), - 'From mbox 2 add colo'); - - ok( "\n" . 'From ' - eq regexmess("\n" . 'From '), - 'From mbox 3 add colo'); - - ok( "From: zzz\n" . 'From ' - eq regexmess("From zzz\n" . 'From '), - 'From mbox 4 add colo'); - - @regexmess = 's{\AFrom\ [^\n]*(\n)?}{}gxms'; - ok( '' - eq regexmess(''), - 'From mbox 1 remove, blank'); - - ok( '' - eq regexmess('From '), - 'From mbox 2 remove'); - - ok( "\n" . 'From ' - eq regexmess("\n" . 'From '), - 'From mbox 3 remove'); - - #print "[", regexmess("From zzz\n" . 'From '), "]"; - ok( "" . 'From ' - eq regexmess("From zzz\n" . 'From '), - 'From mbox 4 remove'); - - - ok( -'Date: Sat, 10 Jul 2010 05:34:45 -0700 -From: - -Hello, -Bye.' - eq regexmess( -'From zzz -Date: Sat, 10 Jul 2010 05:34:45 -0700 -From: - -Hello, -Bye.' - ), - 'From mbox 5 remove'); -} - -sub regexmess { - my ($string) = @_; - foreach my $regexmess (@regexmess) { - $debug and print "eval \$string =~ $regexmess\n"; - eval("\$string =~ $regexmess"); - die_clean("error: eval regexmess '$regexmess': $@\n") if $@; - } - return($string); -} - - -sub stats { - print "++++ Statistics\n"; - print "Transfer time : $timediff sec\n"; - print "Messages transferred : $nb_msg_transferred "; - print "(could be $nb_msg_skipped_dry_mode without dry mode)" if ($dry); - print "\n"; - print "Messages skipped : $nb_msg_skipped\n"; - print "Messages found duplicate on host1 : $h1_nb_msg_duplicate\n"; - print "Messages found duplicate on host2 : $h2_nb_msg_duplicate\n"; - print "Messages void (noheader) on host1 : $h1_nb_msg_noheader\n"; - print "Messages void (noheader) on host2 : $h2_nb_msg_noheader\n"; - print "Messages deleted on host1 : $h1_nb_msg_deleted\n"; - print "Messages deleted on host2 : $h2_nb_msg_deleted\n"; - print "Total bytes transferred : $total_bytes_transferred\n"; - print "Total bytes duplicate host1 : $h1_total_bytes_duplicate\n"; - print "Total bytes duplicate host2 : $h2_total_bytes_duplicate\n"; - print "Total bytes skipped : $total_bytes_skipped\n"; - print "Total bytes error : $total_bytes_error\n"; - $timediff ||= 1; # No division per 0 - printf ("Message rate : %.1f messages/s\n", $nb_msg_transferred / $timediff); - printf ("Average bandwidth rate : %.1f KiB/s\n", $total_bytes_transferred / 1024 / $timediff); - print "Reconnections to host1 : $host1_reconnect_count\n"; - print "Reconnections to host2 : $host2_reconnect_count\n"; - printf ("Memory consumption : %.1f MB\n", $memory_consumption / 1024 / 1024); - print "Memory/biggest message ratio : $memory_ratio\n"; - print "Detected $nb_errors errors\n\n"; - - print $warn_release, "\n"; - print thank_author(); -} - -sub thank_author { - - return(join("", "Happy with this free, open and gratis DWTFPL software?\n", - "Encourage the author (Gilles LAMIRAL) by giving him a book\n", - "or just money via paypal:\n", - "http://www.linux-france.org/prj/imapsync/\n")); -} - -sub get_options { - my $numopt = scalar(@ARGV); - my $argv = join("¤", @ARGV); - - $test_builder = Test::More->builder; - $test_builder->no_ending(1); - - if($argv =~ m/-delete¤2/) { - print "May be you mean --delete2 instead of --delete 2\n"; - exit 1; - } - my $opt_ret = GetOptions( - "debug!" => \$debug, - "debugimap!" => \$debugimap, - "debugimap1!" => \$debugimap1, - "debugimap2!" => \$debugimap2, - "host1=s" => \$host1, - "host2=s" => \$host2, - "port1=i" => \$port1, - "port2=i" => \$port2, - "user1=s" => \$user1, - "user2=s" => \$user2, - "password1=s" => \$password1, - "password2=s" => \$password2, - "passfile1=s" => \$passfile1, - "passfile2=s" => \$passfile2, - "authmd5!" => \$authmd5, - "sep1=s" => \$sep1, - "sep2=s" => \$sep2, - "folder=s" => \@folder, - "folderrec=s" => \@folderrec, - "include=s" => \@include, - "exclude=s" => \@exclude, - "prefix1=s" => \$prefix1, - "prefix2=s" => \$prefix2, - "regextrans2=s" => \@regextrans2, - "regexmess=s" => \@regexmess, - "regexflag=s" => \@regexflag, - "delete!" => \$delete, - "delete2!" => \$delete2, - "delete2folders!" => \$delete2folders, - "syncinternaldates!" => \$syncinternaldates, - "idatefromheader!" => \$idatefromheader, - "syncacls!" => \$syncacls, - "maxsize=i" => \$maxsize, - "minsize=i" => \$minsize, - "maxage=i" => \$maxage, - "minage=i" => \$minage, - "buffersize=i" => \$buffersize, - "foldersizes!" => \$foldersizes, - "dry!" => \$dry, - "expunge!" => \$expunge, - "expunge1!" => \$expunge1, - "expunge2!" => \$expunge2, - "uidexpunge2!" => \$uidexpunge2, - "subscribed!" => \$subscribed, - "subscribe!" => \$subscribe, - "subscribe_all!" => \$subscribe_all, - "justbanner!" => \$justbanner, - "justconnect!"=> \$justconnect, - "justfolders!"=> \$justfolders, - "justfoldersizes!" => \$justfoldersizes, - "fast!" => \$fast, - "version" => \$version, - "help" => \$help, - "timeout=i" => \$timeout, - "skipheader=s" => \$skipheader, - "useheader=s" => \@useheader, - "skipsize!" => \$skipsize, - "allowsizemismatch!" => \$allowsizemismatch, - "fastio1!" => \$fastio1, - "fastio2!" => \$fastio2, - "ssl1!" => \$ssl1, - "ssl2!" => \$ssl2, - "tls1!" => \$tls1, - "tls2!" => \$tls2, - "authmech1=s" => \$authmech1, - "authmech2=s" => \$authmech2, - "authuser1=s" => \$authuser1, - "authuser2=s" => \$authuser2, - "split1=i" => \$split1, - "split2=i" => \$split2, - "reconnectretry1=i" => \$reconnectretry1, - "reconnectretry2=i" => \$reconnectretry2, - "tests" => \$tests, - "tests_debug" => \$tests_debug, - "allow3xx!" => \$allow3xx, - "justlogin!" => \$justlogin, - "tmpdir=s" => \$tmpdir, - "pidfile=s" => \$pidfile, - "releasecheck!" => \$releasecheck, - "modules_version!" => \$modules_version, - ); - - $debug and print "get options: [$opt_ret]\n"; - - # just the version - print imapsync_version(), "\n" and exit if ($version) ; - - if ($tests) { - $test_builder->no_ending(0); - tests(); - exit; - } - if ($tests_debug) { - $test_builder->no_ending(0); - tests_debug(); - exit; - } - - $help = 1 if ! $numopt; - load_modules(); - - # exit with --help option or no option at all - usage() and exit if ($help or ! $numopt) ; - - # don't go on if options are not all known. - exit(EX_USAGE()) unless ($opt_ret) ; - -} - - -sub load_modules { - - require IO::Socket::SSL if ($ssl1 or $ssl2 or $tls1 or $tls2); - - require Term::ReadKey if ( - ((not($password1 or $passfile1)) - or (not($password2 or $passfile2))) - and (not $help)); - - #require Data::Dumper if ($debug); -} - - - -sub parse_header_msg { - my ($imap, $m_uid, $s_heads, $s_fir, $s, $s_hash) = @_; - - my $head = $s_heads->{$m_uid}; - my $headnum = scalar(keys(%$head)); - $debug and print "Head NUM:", $headnum, "\n"; - unless($headnum) { print "Warning: no header used or found for message $m_uid\n"; } - my $headstr; - - foreach my $h (sort keys(%$head)){ - foreach my $val (sort @{$head->{$h}}) { - # no 8-bit data in headers ! - $val =~ s/[\x80-\xff]/X/g; - - # remove the first blanks (dbmail bug ?) - $val =~ s/^\s*(.+)$/$1/; - - # and uppercase header line - # (dbmail and dovecot) - - my $H = uc("$h: $val"); - # show stuff in debug mode - $debug and print "${s}H $H", "\n"; - - if ($skipheader and $H =~ m/$skipheader/i) { - $debug and print "Skipping header $H\n"; - next; - } - $headstr .= "$H"; - } - } - #return unless ($headstr); - unless ($headstr){ - # taking everything is too heavy, - # should take only 1 Ko - #print "no header so taking everything\n"; - #$headstr = $imap->message_string($m_uid); - - print "no header so we ignore this message\n"; - return undef; - } - my $size = $s_fir->{$m_uid}->{"RFC822.SIZE"}; - my $flags = $s_fir->{$m_uid}->{"FLAGS"}; - my $idate = $s_fir->{$m_uid}->{"INTERNALDATE"}; - $size = length($headstr) unless ($size); - my $m_md5 = md5_base64($headstr); - $debug and print "$s msg $m_uid:$m_md5:$size\n"; - my $key; - if ($skipsize) { - $key = "$m_md5"; - } - else { - $key = "$m_md5:$size"; - } - # 0 return code is used to identify duplicate message hash - return 0 if exists $s_hash->{"$key"}; - $s_hash->{"$key"}{'5'} = $m_md5; - $s_hash->{"$key"}{'s'} = $size; - $s_hash->{"$key"}{'D'} = $idate; - $s_hash->{"$key"}{'F'} = $flags; - $s_hash->{"$key"}{'m'} = $m_uid; -} - - -sub firstline { - # extract the first line of a file (without \n) - - my($file) = @_; - my $line = ""; - - open FILE, $file or die_clean("error [$file]: $! "); - chomp($line = ); - close FILE; - $line = ($line) ? $line: "error !EMPTY! [$file]"; - return $line; -} - - -sub file_to_string { - my($file) = @_; - my @string; - open FILE, $file or die_clean("error [$file]: $! "); - @string = ; - close FILE; - return join("", @string); -} - - -sub string_to_file { - my($string, $file) = @_; - sysopen(FILE, $file,O_WRONLY|O_TRUNC|O_CREAT, 0600) or die_clean("$! $file"); - print FILE $string; - close FILE; -} - -sub tests_is_a_release_number { - ok(is_a_release_number(1.351), 'is_a_release_number 1.351'); - ok(is_a_release_number(42.4242), 'is_a_release_number 42.4242'); - ok(is_a_release_number(imapsync_version()), 'is_a_release_number imapsync_version()'); - ok(! is_a_release_number('blabla' ), '! is_a_release_number blabla'); - -} - -sub is_a_release_number { - my $number = shift; - - $number =~ m{\d\.\d+}; -} - -sub check_last_release { - - my $public_release = not_long('imapsync_version_lfo'); - return('unknown') if ($public_release eq 'unknown'); - return('unknown') if (! is_a_release_number($public_release)); - return('timeout') if ($public_release eq 'timeout'); - - my $imapsync_here = imapsync_version(); - - if ($public_release > $imapsync_here) { - return("New imapsync release $public_release available"); - }else{ - return("This current imapsync is up to date"); - } -} - -sub imapsync_version { - my $rcs = '$Id: imapsync,v 1.366 2010/10/25 17:15:52 gilles Exp $ '; - $rcs =~ m/,v (\d+\.\d+)/; - my $VERSION = ($1) ? $1: "UNKNOWN"; - return($VERSION); -} - -sub tests_imapsync_basename { - - ok('imapsync' eq imapsync_basename(), 'imapsync_basename: imapsync'); - ok('blabla' ne imapsync_basename(), '! imapsync_basename: blabla'); -} - -sub imapsync_basename { - - return basename($0); - -} - -sub imapsync_version_lfo { - - my $local_version = imapsync_version(); - my $imapsync_basename = imapsync_basename(); - my $agent_info = "$OSNAME system, perl " - . sprintf("%vd", $PERL_VERSION) - . ", Mail::IMAPClient $Mail::IMAPClient::VERSION" - . " $imapsync_basename"; - my $sock = new IO::Socket::INET ( - PeerAddr => 'linux-france.org', - PeerPort => '80', - Proto => 'tcp'); - return('unknown') if not $sock; - print $sock - "GET /prj/imapsync/VERSION HTTP/1.0\n", - "User-Agent: imapsync/$local_version ($agent_info)\n", - "Host: www.linux-france.org\n\n"; - my @line = <$sock>; - close($sock); - my $last_release = $line[-1]; - chomp($last_release); - return($last_release); -} - -sub not_long { - #print "Entering not_long\n"; - my ($func) = @_; - my $val; - - # Doesn't work with gethostbyname (see perlipc) - #local $SIG{ALRM} = sub { die "alarm\n" }; - - if ('MSWin32' eq $OSNAME) { - local $SIG{ALRM} = sub { die "alarm\n" }; - }else{ - - POSIX::sigaction(SIGALRM, - POSIX::SigAction->new(sub { die "alarm" })) - or warn "Error setting SIGALRM handler: $!\n"; - } - - eval { - - alarm(3); - #print $func, "\n"; - { - no strict "refs"; - #print "Calling $func\n"; - $val = &$func(); - #print "End of $func\n"; - } - alarm(0); - }; - if ($@) { - if ($@ =~ /alarm/) { - # timed out - return('timeout'); - }else{ - alarm(0); - return('unknown'); # propagate unexpected errors - } - }else { - # didn't - return($val); - } -} - -sub localhost_info { - - my($infos) = join("", - "Here is a [$OSNAME] system (", - join(" ", - uname(), - ), - ")\n", - "With perl ", - sprintf("%vd", $PERL_VERSION), - " Mail::IMAPClient $Mail::IMAPClient::VERSION", - ); - return($infos); - -} - -sub usage { - my $localhost_info = localhost_info(); - my $thank = thank_author(); - my $warn_release =''; - $warn_release = check_last_release() if (not defined($releasecheck)); - print < : "from" imap server. Mandatory. ---port1 : port to connect on host1. Default is 143. ---user1 : user to login on host1. Mandatory. ---authuser1 : user to auth with on host1 (admin user). - Avoid using --authmech1 SOMETHING with --authuser1. ---password1 : password for the user1. Dangerous, use --passfile1 ---passfile1 : password file for the user1. Contains the password. ---host2 : "destination" imap server. Mandatory. ---port2 : port to connect on host2. Default is 143. ---user2 : user to login on host2. Mandatory. ---authuser2 : user to auth with on host2 (admin user). ---password2 : password for the user2. Dangerous, use --passfile2 ---passfile2 : password file for the user2. Contains the password. ---noauthmd5 : don't use MD5 authentification. ---authmech1 : auth mechanism to use with host1: - PLAIN, LOGIN, CRAM-MD5 etc. Use UPPERCASE. ---authmech2 : auth mechanism to use with host2. See --authmech1 ---ssl1 : use an SSL connection on host1. ---ssl2 : use an SSL connection on host2. ---tls1 : use an TLS connection on host1. ---tls2 : use an TLS connection on host2. ---folder : sync this folder. ---folder : and this one, etc. ---folderrec : sync this folder recursively. ---folderrec : and this one, etc. ---include : sync folders matching this regular expression ---include : or this one, etc. - in case both --include --exclude options are - use, include is done before. ---exclude : skips folders matching this regular expression - Several folders to avoid: - --exclude 'fold1|fold2|f3' skips fold1, fold2 and f3. ---exclude : or this one, etc. ---tmpdir : where to store temporary files and subdirectories. - Will be created if it doesn't exist. - Default is system specific and should be ok. ---pidfile : the file where imapsync pid is written. ---prefix1 : remove prefix to all destination folders - (usually INBOX. for cyrus imap servers) - you can use --prefix1 if your source imap server - does not have NAMESPACE capability. ---prefix2 : add prefix to all destination folders - (usually INBOX. for cyrus imap servers) - use --prefix2 if your target imap server does not - have NAMESPACE capability. ---regextrans2 : Apply the whole regex to each destination folders. ---regextrans2 : and this one. etc. - When you play with the --regextrans2 option, first - add also the safe options --dry --justfolders - Then, when happy, remove --dry, remove --justfolders ---regexmess : Apply the whole regex to each message before transfer. - Example: 's/\\000/ /g' # to replace null by space. ---regexmess : and this one. ---regexmess : and this one, etc. ---regexflag : Apply the whole regex to each flags list. - Example: 's/\"Junk"//g' # to remove "Junk" flag. ---regexflag : and this one, etc. ---sep1 : separator in case namespace is not supported. ---sep2 : idem. ---delete : delete messages on host1 server after - a successful transfer. Useful in case you - want to migrate from one server to another one. - With imap, "delete" tags messages as deleted, they - are not really deleted. See expunge. ---delete2 : delete messages in host2 that are not in - host1 server. ---delete2folders : delete folders in host2 that are not in - host1 server. For safety try it like this: - --delete2folders --dry --justfolders --nofoldersizes ---expunge : expunge messages on host1. - expunge really deletes messages marked deleted. - expunge is made at the beginning, on host1 only. - Newly transferred messages are expunged if - option --expunge is given. - No expunge is done on destination account - (see --expunge2) but it may change in future releases. ---expunge1 : expunge messages on host1. ---expunge2 : expunge messages on host2. ---uidexpunge2 : uidexpunge messages on the destination imap server - that are not on the source server, requires --delete2 ---syncinternaldates : sets the internal dates on host2 same as host1. - Turned on by default. Internal date is the date - a message arrived on a host (mtime). ---idatefromheader : sets the internal dates on host2 same as the - "Date:" headers. ---buffersize : sets the size of a block of I/O. ---maxsize : skip messages larger (or equal) than bytes ---minsize : skip messages smaller (or equal) than bytes ---maxage : skip messages older than days. - final stats (skipped) don't count older messages - see also --minage ---minage : skip messages newer than days. - final stats (skipped) don't count newer messages - You can do (+ are the messages selected): - past|----maxage+++++++++++++++>now - past|+++++++++++++++minage---->now - past|----maxage+++++minage---->now (intersection) - past|++++minage-----maxage++++>now (union) ---skipheader : Don't take into account header keyword - matching ex: --skipheader 'X.*' ---useheader : Use this header to compare messages on both sides. - Ex: Message-ID or Subject or Date. ---useheader and this one, etc. ---skipsize : Don't take message size into account to compare - messages on both sides. On by default. - Use --no-skipsize for using size comparaison. ---allowsizemismatch : allow RFC822.SIZE != fetched msg size - consider also --skipsize to avoid duplicate messages - when running syncs more than one time per mailbox ---dry : do nothing, just print what would be done. ---subscribed : transfers subscribed folders. ---subscribe : subscribe to the folders transferred on the - host2 that are subscribed on host1. ---subscribe_all : subscribe to the folders transferred on the - host2 even if they are not subscribed on host1. ---nofoldersizes : Do not calculate the size of each folder in bytes - and message counts. Default is to calculate them. ---justfoldersizes : exit after printed the folder sizes. ---syncacls : Synchronises acls (Access Control Lists). ---nosyncacls : Does not synchronise acls. This is the default. ---debug : debug mode. ---debugimap1 : imap debug mode for host1. imap debug is very verbose. ---debugimap2 : imap debug mode for host2. ---debugimap : imap debug mode for host1 and host2. ---version : print software version. ---noreleasecheck : do not check for new imapsync release (a http request). ---justconnect : just connect to both servers and print useful - information. Need only --host1 and --host2 options. ---justlogin : just login to both host1 and host2 with users - credentials, then exit. ---justfolders : just do things about folders (ignore messages). ---fast : be faster (just does not sync flags of messages - already transfered). ---reconnectretry1 : reconnect to host1 if connection is lost up to - times per imap command (default is 3) ---reconnectretry2 : same as --reconnectretry1 but for host2 ---split1 : split the requests in several parts on host1. - is the number of messages handled per request. - default is like --split1 1000. ---split2 : same thing on host2. ---fastio1 : use fastio with host1. ---fastio2 : use fastio with host2. ---timeout : imap connect timeout. ---help : print this help. - -Example: to synchronise imap account "foo" on "imap.truc.org" - to imap account "bar" on "imap.trac.org" - with foo password "secret1" - and bar password "secret2" - -$0 \\ - --host1 imap.truc.org --user1 foo --password1 secret1 \\ - --host2 imap.trac.org --user2 bar --password2 secret2 - -$localhost_info -$rcs -$warn_release - -$thank -EOF -} - - -sub good_date { - # two incoming formats: - # header Tue, 24 Aug 2010 16:00:00 +0200 - # internal 24-Aug-2010 16:00:00 +0200 - - # outgoing format: internal date format - # 24-Aug-2010 16:00:00 +0200 - - my ($d) = @_; - return ('') if not defined($d); - - if ( $d =~ m{(\d?)(\d-...-\d{4})( \d{2}:\d{2}:\d{2})( (?:\+|-)\d{4})?}o ) { - #print "internal: [$1][$2][$3][$4]\n"; - my ($day_1, $date_rest, $hour, $zone) = ($1,$2,$3,$4); - $day_1 = '0' if ($day_1 eq ''); - $zone = '' if not defined($zone); - $d = $day_1 . $date_rest . $hour . $zone; - - - }elsif ($d =~ m{(?:.{3}, )(\d?)(\d) (...) (\d{4})( \d{2}:\d{2}:\d{2})( (?:\+|-)\d{4})?}o ) { - #print "header: [$1][$2][$3][$4][$5][$6]\n"; - my ($day_1, $day_rest, $month, $year, $hour, $zone) = ($1,$2,$3,$4,$5,$6); - $day_1 = '0' if ($day_1 eq ''); - $zone = '' if not defined($zone); - $d = $day_1 . "$day_rest-$month-$year" . $hour . $zone; - - }else{ - # unknown/unmatch => return same string - return($d); - } - - $d = qq("$d"); - return($d); -} - -sub memory_consumption { - # memory consumed by imapsync until now in bytes - return((memory_consumption_of_pids())[0]); -} - -sub memory_consumption_of_pids { - - my @PID = (@_) ? @_ : ($PROCESS_ID); - - #print "PIDs: @PID\n"; - my @val; - if ('MSWin32' eq $OSNAME) { - @val = memory_consumption_of_pids_win32(@PID); - }else{ - # Unix - my @ps = qx{ ps o vsz @PID }; - shift @ps; # First line is column name "VSZ" - chomp @ps; - # convert to - @val = map { $_ * 1024 } @ps; - return(@val); - } -} - -sub memory_consumption_of_pids_win32 { - # Windows - my @PID = @_; - my %PID; - # hash of pids as key values - map { $PID{$_}++ } @PID; - - # Does not work but should reading the tasklist documentation - #@ps = qx{ tasklist /FI "PID eq @PID" }; - - my @ps = qx{ tasklist /NH /FO CSV }; - #print "-" x 80, "\n", @ps, "-" x 80, "\n"; - my @val; - foreach my $line (@ps) { - my($name, $pid, $mem) = (split(',', $line))[0,1,4]; - next if (! $pid); - #print "[$name][$pid][$mem]"; - if ($PID{remove_qq($pid)}) { - #print "MATCH !\n"; - chomp($mem); - $mem = remove_qq($mem); - $mem = remove_Ko($mem); - $mem = remove_not_num($mem); - #print "[$mem]\n"; - push(@val, $mem * 1024); - } - } - return(@val); -} - -sub remove_not_num { - - my $string = shift; - $string =~ tr/0-9//cd; - #print "tr [$string]\n"; - return($string); -} - -sub tests_remove_not_num { - - ok('123' eq remove_not_num(123), 'remove_not_num( 123 )'); - ok('123' eq remove_not_num('123'), "remove_not_num( '123' )"); - ok('123' eq remove_not_num('12 3'), "remove_not_num( '12 3' )"); - ok('123' eq remove_not_num('a 12 3 Ko'), "remove_not_num( 'a 12 3 Ko' )"); -} - -sub remove_Ko { - my $string = shift; - if ($string =~ /^(.*) Ko$/) { - return($1); - }else{ - return($string); - } -} - -sub remove_qq { - my $string = shift; - if ($string =~ /^"(.*)"$/) { - return($1); - }else{ - return($string); - } -} - -sub memory_consumption_ratio { - - my ($base) = @_; - $base ||= 1; - my $consu = memory_consumption(); - return($consu / $base); -} - -sub tests_memory_consumption { - - ok(print join("\n", memory_consumption_of_pids()), "\n"); - ok(print join("\n", memory_consumption_of_pids('1')), "\n"); - ok(print join("\n", memory_consumption_of_pids('1', $$)), "\n"); - - ok(print memory_consumption_ratio(), "\n"); - ok(print memory_consumption_ratio(1), "\n"); - ok(print memory_consumption_ratio(10), "\n"); - - ok(print memory_consumption(), "\n"); -} - -sub tests_good_date { - - ok('' eq good_date(), 'good_date no arg'); - ok('"24-Aug-2010 16:00:00 +0200"' eq good_date('24-Aug-2010 16:00:00 +0200'), 'good_date internal 2digit zone'); - ok('"24-Aug-2010 16:00:00"' eq good_date('24-Aug-2010 16:00:00'), 'good_date internal 2digit no zone'); - ok('"01-Sep-2010 16:00:00 +0200"' eq good_date( '1-Sep-2010 16:00:00 +0200'), 'good_date internal SP 1digit'); - ok('"24-Aug-2010 16:00:00 +0200"' eq good_date('Tue, 24 Aug 2010 16:00:00 +0200'), 'good_date header 2digit zone'); - ok('"01-Sep-2010 16:00:00"' eq good_date('Wed, 1 Sep 2010 16:00:00'), 'good_date header SP 1digit zone'); - ok('"01-Sep-2010 16:00:00 +0200"' eq good_date('Wed, 1 Sep 2010 16:00:00 +0200'), 'good_date header SP 1digit zone'); - ok('"01-Sep-2010 16:00:00 +0200"' eq good_date('Wed, 1 Sep 2010 16:00:00 +0200 (CEST)'), 'good_date header SP 1digit zone'); - -} - - -sub tests_list_keys_in_2_not_in_1 { - - my @list; - ok( ! list_keys_in_2_not_in_1( {}, {}), 'list_keys_in_2_not_in_1: {} {}'); - ok( 0 == compare_lists( [], [ list_keys_in_2_not_in_1( {}, {} ) ] ), 'list_keys_in_2_not_in_1: {} {}'); - ok( 0 == compare_lists( ['a','b'], [ list_keys_in_2_not_in_1( {}, {'a' => 1, 'b' => 1}) ]), 'list_keys_in_2_not_in_1: {} {a, b}'); - ok( 0 == compare_lists( ['b'], [ list_keys_in_2_not_in_1( {'a' => 1}, {'a' => 1, 'b' => 1}) ]), 'list_keys_in_2_not_in_1: {a} {a, b}'); - ok( 0 == compare_lists( [], [ list_keys_in_2_not_in_1( {'a' => 1, 'b' => 1}, {'a' => 1, 'b' => 1}) ]), 'list_keys_in_2_not_in_1: {a, b} {a, b}'); - ok( 0 == compare_lists( [], [ list_keys_in_2_not_in_1( {'a' => 1, 'b' => 1, 'c' => 1}, {'a' => 1, 'b' => 1}) ]), 'list_keys_in_2_not_in_1: {a, b, c} {a, b}'); - ok( 0 == compare_lists( ['b'], [ list_keys_in_2_not_in_1( {'a' => 1, 'c' => 1}, {'a' => 1, 'b' => 1}) ]), 'list_keys_in_2_not_in_1: {a, b, c} {a, b}'); - -} - -sub list_keys_in_2_not_in_1 { - - my $folders1_ref = shift; - my $folders2_ref = shift; - my @list; - - foreach my $folder ( sort keys %$folders2_ref ) { - next if exists($folders1_ref->{$folder}); - push(@list, $folder); - } - return(@list); -} - - -sub list_folders_in_2_not_in_1 { - - my (@h2_folders_not_in_1, %h2_folders_not_in_1); - @h2_folders_not_in_1 = list_keys_in_2_not_in_1( \%h1_folders_all, \%h2_folders_all); - map { $h2_folders_not_in_1{$_} = 1} @h2_folders_not_in_1; - @h2_folders_not_in_1 = list_keys_in_2_not_in_1( \%h2_folders_from_1, \%h2_folders_not_in_1); - - return( reverse @h2_folders_not_in_1 ); -} - -sub delete_folders_in_2_not_in_1 { - - my $dry_message = ''; - $dry_message = "\t(not really since --dry mode)" if $dry; - foreach my $folder (@h2_folders_not_in_1) { - - my $res = $dry; # always success in dry mode! - $res = $imap2->delete($folder) if ( ! $dry ) ; - if ($res) { - print "Delete $folder", "$dry_message", "\n"; - }else{ - print "Delete $folder failure", "\n"; - } - } -} - -sub tests_debug { - - SKIP: { - skip "No test in normal run" if (not $tests_debug); - tests_list_keys_in_2_not_in_1(); - } -} - -sub tests { - - SKIP: { - skip "No test in normal run" if (not $tests); - tests_folder_routines(); - tests_compare_lists(); - tests_regexmess(); - tests_flags_regex(); - tests_permanentflags(); - tests_flags_filter(); - tests_imap2_folder_name(); - tests_command_line_nopassword(); - tests_good_date(); - tests_max(); - tests_remove_not_num(); - tests_memory_consumption(); - tests_is_a_release_number(); - tests_imapsync_basename(); - tests_list_keys_in_2_not_in_1(); - } -} - -# IMAPClient 2.2.9 overrides - -sub override_imapclient { -no warnings 'redefine'; -no strict 'subs'; - -use constant Unconnected => 0; -use constant Connected => 1; # connected; not logged in -use constant Authenticated => 2; # logged in; no mailbox selected -use constant Selected => 3; # mailbox selected -use constant INDEX => 0; # Array index for output line number -use constant TYPE => 1; # Array index for line type - # (either OUTPUT, INPUT, or LITERAL) -use constant DATA => 2; # Array index for output line data -use constant NonFolderArg => 1; # Value to pass to Massage to - # indicate non-folder argument - - -*Mail::IMAPClient::append_file = sub { - - my $self = shift; - my $folder = $self->Massage(shift); - my $file = shift; - my $control = shift || undef; - my $count = $self->Count($self->Count+1); - my $flags = shift || undef; - my $date = shift || undef; - - if (defined($flags)) { - $flags =~ s/^\s+//g; - $flags =~ s/\s+$//g; - } - - if (defined($date)) { - $date =~ s/^\s+//g; - $date =~ s/\s+$//g; - } - - $flags = "($flags)" if $flags and $flags !~ /^\(.*\)$/ ; - $date = qq/"$date"/ if $date and $date !~ /^"/ ; - - - unless ( -f $file ) { - $self->LastError("File $file not found.\n"); - return undef; - } - - my $fh = IO::File->new($file) ; - - unless ($fh) { - $self->LastError("Unable to open $file: $!\n"); - $@ = "Unable to open $file: $!" ; - carp "unable to open $file: $!"; - return undef; - } - - my $bare_nl_count = scalar grep { /^\x0a$|[^\x0d]\x0a$/} <$fh>; - - seek($fh,0,0); - - my $clear = $self->Clear; - - $self->Clear($clear) - if $self->Count >= $clear and $clear > 0; - - my $length = ( -s $file ) + $bare_nl_count; - - my $string = "$count APPEND $folder " . - ( $flags ? "$flags " : "" ) . - ( $date ? "$date " : "" ) . - "{" . $length . "}\x0d\x0a" ; - - $self->_record($count,[ $self->_next_index($count), "INPUT", "$string" ] ); - - my $feedback = $self->_send_line("$string"); - - unless ($feedback) { - $self->LastError("Error sending '$string' to IMAP: $!\n"); - $fh->close; - return undef; - } - - my ($code, $output) = ("",""); - - until ( $code ) { - $output = $self->_read_line or $fh->close, return undef; - foreach my $o (@$output) { - $self->_record($count,$o); # $o is already an array ref - ($code) = $o->[DATA] =~ /(^\+|^\d+\sNO|^\d+\sBAD)/i; - if ($o->[DATA] =~ /^\*\s+BYE/) { - carp $o->[DATA]; - $self->State(Unconnected); - $fh->close; - return undef ; - } elsif ( $o->[DATA]=~ /^\d+\s+(NO|BAD)/i ) { - carp $o->[DATA]; - $fh->close; - return undef; - } - } - } - - { # Narrow scope - # Slurp up headers: later we'll make this more efficient I guess - local $/ = "\x0d\x0a\x0d\x0a"; - my $text = <$fh>; - $text =~ s/\x0d?\x0a/\x0d\x0a/g; - $self->_record($count,[ $self->_next_index($count), "INPUT", "{From file $file}" ] ) ; - $feedback = $self->_send_line($text); - - unless ($feedback) { - $self->LastError("Error sending append msg text to IMAP: $!\n"); - $fh->close; - return undef; - } - _debug($self, "control points to $$control\n") if ref($control) and $self->Debug; - $/ = ref($control) ? "\x0a" : $control ? $control : "\x0a"; - while (defined($text = <$fh>)) { - $text =~ s/\x0d?\x0a/\x0d\x0a/g; - $self->_record( $count, - [ $self->_next_index($count), "INPUT", "{from $file}\x0d\x0a" ] - ); - $feedback = $self->_send_line($text,1); - - unless ($feedback) { - $self->LastError("Error sending append msg text to IMAP: $!\n"); - $fh->close; - return undef; - } - } - $feedback = $self->_send_line("\x0d\x0a"); - - unless ($feedback) { - $self->LastError("Error sending append msg text to IMAP: $!\n"); - $fh->close; - return undef; - } - } - - # Now for the crucial test: Did the append work or not? - ($code, $output) = ("",""); - - my $uid = undef; - until ( $code ) { - $output = $self->_read_line or return undef; - foreach my $o (@$output) { - $self->_record($count,$o); # $o is already an array ref - $self->_debug("append_file: Deciding if " . $o->[DATA] . " has the code.\n") - if $self->Debug; - ($code) = $o->[DATA] =~ /^\d+\s(NO|BAD|OK)/i; - # try to grab new msg's uid from o/p - $o->[DATA] =~ m#UID\s+\d+\s+(\d+)\]# and $uid = $1; - if ($o->[DATA] =~ /^\*\s+BYE/) { - carp $o->[DATA]; - $self->State(Unconnected); - $fh->close; - return undef ; - } elsif ( $o->[DATA]=~ /^\d+\s+(NO|BAD)/i ) { - carp $o->[DATA]; - $fh->close; - return undef; - } - } - } - $fh->close; - - if ($code !~ /^OK/i) { - return undef; - } - - - return defined($uid) ? $uid : $self; -}; - - - - -*Mail::IMAPClient::fetch_hash = sub { - # taken from original lib, - # just added split code. - my $self = shift; - my $hash = ref($_[-1]) ? pop @_ : {}; - my @words = @_; - for (@words) { - s/([\( ])FAST([\) ])/${1}FLAGS INTERNALDATE RFC822\.SIZE$2/i ; - s/([\( ])FULL([\) ])/${1}FLAGS INTERNALDATE RFC822\.SIZE ENVELOPE BODY$2/i ; - } - my $msgs_ref_all = scalar($self->messages); - my $split = $self->Split() || scalar(@$msgs_ref_all); - while(my @msgs = splice(@$msgs_ref_all, 0, $split)) { - #print "SPLIT: @msgs\n"; - my $msgs_ref = \@msgs; - my $output = scalar($self->fetch($msgs_ref,"(" . join(" ",@_) . ")")) - ; # unless grep(/\b(?:FAST|FULL)\b/i,@words); - my $x; - for ($x = 0; $x <= $#$output ; $x++) { - my $entry = {}; - my $l = $output->[$x]; - if ($self->Uid) { - my($uid) = $l =~ /\((?:.* )?UID (\d+).*\)/i; - next unless $uid; - if ( exists $hash->{$uid} ) { - $entry = $hash->{$uid} ; - } - else { - $hash->{$uid} ||= $entry; - } - } - else { - my($mid) = $l =~ /^\* (\d+) FETCH/i; - next unless $mid; - if ( exists $hash->{$mid} ) { - $entry = $hash->{$mid} ; - } - else { - $hash->{$mid} ||= $entry; - } - } - - foreach my $w (@words) { - if ( $l =~ /\Q$w\E\s*$/i ) { - $entry->{$w} = $output->[$x+1]; - $entry->{$w} =~ s/(?:\x0a?\x0d)+$//g; - chomp $entry->{$w}; - } - else { - $l =~ /\( # open paren followed by ... - (?:.*\s)? # ...optional stuff and a space - \Q$w\E\s # escaped fetch field - (?:" # then: a dbl-quote - (\\.| # then bslashed anychar(s) or ... - [^"]+) # ... nonquote char(s) - "| # then closing quote; or ... - \( # ...an open paren - (\\.| # then bslashed anychar or ... - [^\)]*) # ... non-close-paren char - \)| # then closing paren; or ... - (\S+)) # unquoted string - (?:\s.*)? # possibly followed by space-stuff - \) # close paren - /xi; - $entry->{$w}=defined($1)?$1:defined($2)?$2:$3; - } - } - } -} - return wantarray ? %$hash : $hash; -}; - - - -*Mail::IMAPClient::login = sub { - my $self = shift; - return $self->authenticate($self->Authmechanism,$self->Authcallback) - if $self->{Authmechanism}; - - my $id = $self->User; - my $has_quotes = $id =~ /^".*"$/ ? 1 : 0; - my $string = "Login " . ( $has_quotes ? $id : qq("$id") ) . - " " . $self->Password . "\r\n"; - $self->_imap_command($string) - and $self->State(Authenticated); - # $self->folders and $self->separator unless $self->NoAutoList; - unless ( $self->IsAuthenticated) { - my($carp) = $self->LastError; - $carp =~ s/^[\S]+ ([^\x0d\x0a]*)\x0d?\x0a/$1/; - carp $carp unless defined wantarray; - return undef; - }; - return $self; -}; - - -*Mail::IMAPClient::get_header = sub { - my($self , $msg, $header ) = @_; - my $val; - - #eval { $val = $self->parse_headers([$msg],$header)->{$header}[0] }; - my $h = $self->parse_headers([$msg],$header); - #require Data::Dumper; - #print Data::Dumper->Dump([$h]); - #$val = $self->parse_headers([$msg],$header)->{$header}[0]; - - $val = $h->{$msg}{$header}[0]; - return defined($val)? $val : undef; -}; - - -*Mail::IMAPClient::parse_headers = sub { - my($self,$msgspec_all,@fields) = @_; - my(%fieldmap) = map { ( lc($_),$_ ) } @fields; - my $msg; my $string; my $field; - #print ref($msgspec_all), "\n"; - #if(ref($msgspec_all) eq 'HASH') { - # print ref($msgspec_all), "\n"; - #$msgspec_all = [$msgspec_all]; - #} - - unless(ref($msgspec_all) eq 'ARRAY') { - print "parse_headers want an ARRAY ref\n"; - #exit 1; - return undef; - } - - my $headers = {}; # hash from message ids to header hash - my $split = $self->Split() || scalar(@$msgspec_all); - while(my @msgs = splice(@$msgspec_all, 0, $split)) { - $debug and print "SPLIT: @msgs\n"; - my $msgspec = \@msgs; - - # Make $msg a comma separated list, of messages we want - $msg = $self->Range($msgspec); - - if ($fields[0] =~ /^[Aa][Ll]{2}$/ ) { - - $string = "$msg body" . - # use ".peek" if Peek parameter is a) defined and true, - # or b) undefined, but not if it's defined and untrue: - - ( defined($self->Peek) ? - ( $self->Peek ? ".peek" : "" ) : - ".peek" - ) . "[header]" ; - - }else { - $string = "$msg body" . - # use ".peek" if Peek parameter is a) defined and true, or - # b) undefined, but not if it's defined and untrue: - - ( defined($self->Peek) ? - ( $self->Peek ? ".peek" : "" ) : - ".peek" - ) . "[header.fields (" . join(" ",@fields) . ')]' ; - } - - my @raw=$self->fetch( $string ) or return undef; - - - my $h = 0; # reference to hash of current msgid, or 0 between msgs - - for my $header (map { split(/(?:\x0d\x0a)/,$_) } @raw) { - - no warnings; - if ( $header =~ /^\*\s+\d+\s+FETCH\s+\(.*BODY\[HEADER(?:\]|\.FIELDS)/i) { - if ($self->Uid) { - if ( my($msgid) = $header =~ /UID\s+(\d+)/ ) { - $h = {}; - $headers->{$msgid} = $h; - } - else { - $h = {}; - } - } - else { - if ( my($msgid) = $header =~ /^\*\s+(\d+)/ ) { - #start of new message header: - $h = {}; - $headers->{$msgid} = $h; - } - } - } - next if $header =~ /^\s+$/; - - # ( for vi - if ($header =~ /^\)/) { # end of this message - $h = 0; # set to be between messages - next; - } - # check for 'UID)' - # when parsing headers by UID. - if ($self->Uid and my($msgid) = $header =~ /^\s*UID\s+(\d+)\s*\)/) { - $headers->{$msgid} = $h; # store in results against this message - $h = 0; # set to be between messages - next; - } - - if ($h != 0) { # do we expect this to be a header? - my $hdr = $header; - chomp $hdr; - $hdr =~ s/\r$//; - #print "W[$hdr]", ref($hdr), "!\n"; - #next if ( ! defined($hdr)); - #print "X[$hdr]\n"; - - if (defined($hdr) and ($hdr =~ s/^(\S+):\s*//)) { - # if ($hdr =~ s/^(\S+):\s*//) { - #print "X1\n"; - $field = exists $fieldmap{lc($1)} ? $fieldmap{lc($1)} : $1 ; - push @{$h->{$field}} , $hdr ; - } elsif ($hdr =~ s/^.*FETCH\s\(.*BODY\[HEADER\.FIELDS.*\)\]\s(\S+):\s*//) { - #print "X2\n"; - $field = exists $fieldmap{lc($1)} ? $fieldmap{lc($1)} : $1 ; - push @{$h->{$field}} , $hdr ; - } elsif ( ref($h->{$field}) eq 'ARRAY') { - #print "X3\n"; - - $hdr =~ s/^\s+/ /; - $h->{$field}[-1] .= $hdr ; - } - } - } - use warnings; -# my $candump = 0; -# if ($self->Debug) { -# eval { -# require Data::Dumper; -# Data::Dumper->import; -# }; -# $candump++ unless $@; -# } - - } - # if we asked for one message, just return its hash, - # otherwise, return hash of numbers => header hash - # if (ref($msgspec) eq 'ARRAY') { - - return $headers; - -}; - - -*Mail::IMAPClient::authenticate = sub { - - my $self = shift; - my $scheme = shift; - my $response = shift; - - $scheme ||= $self->Authmechanism; - $response ||= $self->Authcallback; - my $clear = $self->Clear; - - $self->Clear($clear) - if $self->Count >= $clear and $clear > 0; - - my $count = $self->Count($self->Count+1); - - - my $string = "$count AUTHENTICATE $scheme"; - - $self->_record($count,[ $self->_next_index($self->Transaction), - "INPUT", "$string\x0d\x0a"] ); - - my $feedback = $self->_send_line("$string"); - - unless ($feedback) { - $self->LastError("Error sending '$string' to IMAP: $!\n"); - return undef; - } - - my ($code, $output); - - until ($code) { - $output = $self->_read_line or return undef; - - foreach my $o (@$output) { - $self->_record($count,$o); # $o is a ref - ($code) = $o->[DATA] =~ /^\+(.*)$/ ; - if ($o->[DATA] =~ /^\*\s+BYE/) { - $self->State(Unconnected); - return undef ; - } - if ($o->[DATA]=~ /^\d+\s+(NO|BAD)/i) { - return undef ; - } - } - } - - if ('CRAM-MD5' eq $scheme && ! $response) { - if ($Mail::IMAPClient::_CRAM_MD5_ERR) { - $self->LastError($Mail::IMAPClient::_CRAM_MD5_ERR); - carp $Mail::IMAPClient::_CRAM_MD5_ERR; - } - else { - $response = \&Mail::IMAPClient::_cram_md5; - } - } - - $feedback = $self->_send_line($response->($code, $self)); - - unless ($feedback) { - $self->LastError("Error sending append msg text to IMAP: $!\n"); - return undef; - } - - $code = ""; # clear code - until ($code) { - $output = $self->_read_line or return undef; - foreach my $o (@$output) { - $self->_record($count,$o); # $o is a ref - if ( ($code) = $o->[DATA] =~ /^\+ (.*)$/ ) { - $feedback = $self->_send_line($response->($code,$self)); - unless ($feedback) { - $self->LastError("Error sending append msg text to IMAP: $!\n"); - return undef; - } - $code = "" ; # Clear code; we're still not finished - } else { - $o->[DATA] =~ /^$count (OK|NO|BAD)/ and $code = $1; - if ($o->[DATA] =~ /^\*\s+BYE/) { - $self->State(Unconnected); - return undef ; - } - } - } - } - - $code =~ /^OK/ and $self->State(Authenticated) ; - return $code =~ /^OK/ ? $self : undef ; - -}; - - - -*Mail::IMAPClient::_cram_md5 = sub { - my ($code, $client) = @_; - my $hmac = Digest::HMAC_MD5::hmac_md5_hex(MIME::Base64::decode($code), - $client->Password()); - return MIME::Base64::encode($client->User() . " $hmac", ""); -}; - -*Mail::IMAPClient::message_string = sub { - my $self = shift; - my $msg = shift; - my $expected_size = $self->size($msg); - return undef unless(defined $expected_size); # unable to get size - my $cmd = $self->has_capability('IMAP4REV1') ? - "BODY" . ( $self->Peek ? '.PEEK[]' : '[]' ) : - "RFC822" . ( $self->Peek ? '.PEEK' : '' ) ; - - #print "Message_string Beg fetch:\n", memory_consumption(); - $self->fetch($msg,$cmd) or return undef; - #print "Message_string End fetch:\n", memory_consumption(); - - my $string = ""; - - - foreach my $result (@{$self->{"History"}{$self->Transaction}}) { - $string .= $result->[DATA] - if defined($result) and $self->_is_literal($result) ; - } - #print "Message_string End string:\n", memory_consumption(); - - # BUG? should probably return undef if length != expected - # No bug, somme servers are buggy. - - if (! $self->Ignoresizeerrors ) { - if ( length($string) != $expected_size ) { - warn "message_string: " . - "expected $expected_size bytes but received " . - length($string) . "\n"; - $self->LastError("message_string: expected ". - "$expected_size bytes but received " . - length($string)."\n"); - } - } - return $string; -}; - - - -{ -no warnings 'once'; - -*Mail::IMAPClient::Ssl = sub { - my $self = shift; - - if (@_) { $self->{SSL} = shift } - return $self->{SSL}; -}; - -*Mail::IMAPClient::exists = sub { - my ( $self, $folder ) = @_; - $self->status($folder) ? $self : undef; -}; - - - -*Mail::IMAPClient::Authuser = sub { - my $self = shift; - - if (@_) { $self->{AUTHUSER} = shift } - return $self->{AUTHUSER}; -}; - - -*Mail::IMAPClient::Ignoresizeerrors = sub { - my $self = shift; - - if (@_) { $self->{IGNORESIZEERRORS} = shift } - return $self->{IGNORESIZEERRORS}; -}; - -*Mail::IMAPClient::Reconnectretry = sub { - my $self = shift; - - if (@_) { $self->{RECONNECTRETRY} = shift } - return $self->{RECONNECTRETRY}; -}; - - -*Mail::IMAPClient::reconnect = sub { - my $self = shift; - - if ( $self->IsAuthenticated ) { - $self->_debug("reconnect called but already authenticated"); - return $self; - } - - my $einfo = $self->LastError || ""; - $self->_debug( "reconnecting to ", $self->Server, ", last error: $einfo" ); - - # reconnect and select appropriate folder - $self->connect or return undef; - - return ( defined $self->Folder ) ? $self->select( $self->Folder ) : $self; -}; - - -# wrapper for _imap_command_do to enable retrying on lost connections -*Mail::IMAPClient::_imap_command = sub { - my $self = shift; - - my $tries = 0; - my $retry = $self->Reconnectretry || 0; - my ( $rc, @err ); - - #print "@_ Beg _imap_command:\n", memory_consumption(); - - # LastError (if set) will be overwritten masking any earlier errors - while ( $tries++ <= $retry ) { - # do command on the first try or if Connected (reconnect ongoing) - if ( $tries == 1 or $self->IsConnected ) { - #print "call @_\n"; - $rc = $self->_imap_command_do(@_); - push( @err, $self->LastError ) if $self->LastError; - #print "call @_ done [", $rc || '', "] [$tries/$retry][" . $self->IsUnconnected . "]\n"; - } - - if ( !defined($rc) and $retry and $self->IsUnconnected - and $self->LastIMAPCommand !~ /LOGOUT/) { - print "\nWarning: disconnected. "; - if ( $self->reconnect ) { - print "Reconnect successful on try #$tries\n"; - $self->Reconnect_counter($self->Reconnect_counter() + 1); - } - else { - print "Reconnect failed on try #$tries\n"; - push( @err, $self->LastError ) if $self->LastError; - } - } - else { - last; - } - } - - unless ($rc) { - my ( %seen, @keep, @info ); - - foreach my $str (@err) { - my ( $sz, $len ) = ( 96, length($str) ); - $str =~ s/$CR?$LF$/\\n/omg; - if ( !$self->Debug and $len > $sz * 2 ) { - my $beg = substr( $str, 0, $sz ); - my $end = substr( $str, -$sz, $sz ); - $str = $beg . "..." . $end; - } - next if $seen{$str}++; - push( @keep, $str ); - } - foreach my $msg (@keep) { - push( @info, $msg . ( $seen{$msg} > 1 ? " ($seen{$msg}x)" : "" ) ); - } - $self->LastError( join( "; ", @info ) ); - } - #print "@_ End _imap_command:\n", memory_consumption(); - return $rc; -}; - - -*Mail::IMAPClient::_imap_command_do = sub { - - my $self = shift; - my $string = shift or return undef; - my $good = shift || 'GOOD'; - - my $qgood = quotemeta($good); - - my $clear = ""; - $clear = $self->Clear; - - $self->Clear($clear) - if $self->Count >= $clear and $clear > 0; - - my $count = $self->Count($self->Count+1); - - $string = "$count $string" ; - - #print "$string\n", memory_consumption(); - $self->_record($count,[ 0, "INPUT", "$string\x0d\x0a"] ); - #print "\n2 $count\n", memory_consumption(); - my $feedback = $self->_send_line("$string"); - - unless ($feedback) { - $self->LastError( "Error sending '$string' to IMAP: $!\n"); - $@ = "Error sending '$string' to IMAP: $!"; - carp "Error sending '$string' to IMAP: $!"; - return undef; - } - - my ($code, $output); - $output = ""; - - READ: until ( $code) { - # escape infinite loop if read_line never returns any data: - $output = $self->_read_line or return undef; - - for my $o (@$output) { - - $self->_record($count,$o); # $o is a ref - # $self->_debug("Received from readline: ${\($o->[DATA])}<>\n"); - next unless $self->_is_output($o); - if ( $good eq '+' ) { - $o->[DATA] =~ /^$count (OK|BAD|NO|$qgood)|^($qgood)/mi ; - $code = $1||$2 ; - } else { - ($code) = $o->[DATA] =~ /^$count (OK|BAD|NO|$qgood)/mi ; - } - if ($o->[DATA] =~ /^\*\s+BYE/im) { - $self->State(Unconnected); - return undef ; - } - } - } - #print "$string: returned $code\n", memory_consumption(); - # $self->_debug("Command $string: returned $code\n"); - return $code =~ /^OK|$qgood/im ? $self : undef ; - -}; - -# capability 2.2.9 is stupid: it caches and return first imap CAPABILITY call -# but call imap CAPABILITY each time. -# Copy/paste from 3.25 -*Mail::IMAPClient::capability = sub { - my $self = shift; - - if ( $self->{CAPABILITY} ) { - my @caps = keys %{ $self->{CAPABILITY} }; - return wantarray ? @caps : \@caps; - } - - $self->_imap_command('CAPABILITY') - or return undef; - - my @caps = map { split } grep s/^\*\s+CAPABILITY\s+//, $self->History; - foreach (@caps) { - $self->{CAPABILITY}{ uc $_ }++; - $self->{ uc $1 } = uc $2 if /(.*?)\=(.*)/; - } - - return wantarray ? @caps : \@caps; -}; - -*Mail::IMAPClient::_read_line = sub { - my $self = shift; - my $sh = $self->Socket; - my $literal_callback = shift; - my $output_callback = shift; - - unless ($self->IsConnected and $self->Socket) { - $self->LastError("NO Not connected.\n"); - carp "Not connected" if $^W; - return undef; - } - - my $iBuffer = ""; - my $oBuffer = []; - my $count = 0; - my $index = $self->_next_index($self->Transaction); - my $rvec = my $ready = my $errors = 0; - my $timeout = $self->Timeout; - - my $readlen = 1; - my $fast_io = $self->Fast_io; # Remember setting to reduce future method calls - - if ( $fast_io ) { - - # set fcntl if necessary: - exists $self->{_fcntl} or $self->Fast_io($fast_io); - $readlen = $self->{Buffer}||4096; - } - until ( - # there's stuff in output buffer: - scalar(@$oBuffer) and - - # the last thing there has cr-lf: - $oBuffer->[-1][DATA] =~ /\x0d\x0a$/ and - - # that thing is an output line: - $oBuffer->[-1][TYPE] eq "OUTPUT" and - - # and the input buffer has been MT'ed: - $iBuffer eq "" - - ) { - #print memory_consumption(); - my $transno = $self->Transaction; # used below in several places - if ($timeout) { - vec($rvec, fileno($self->Socket), 1) = 1; - my @ready = $self->{_select}->can_read($timeout) ; - unless ( @ready ) { - $self->LastError("Tag $transno: " . - "Timeout after $timeout seconds " . - "waiting for data from server\n"); - $self->_record($transno, - [ $self->_next_index($transno), - "ERROR", - "$transno * NO Timeout after ". - "$timeout seconds " . - "during read from " . - "server\x0d\x0a" - ] - ); - $self->LastError( - "Timeout after $timeout seconds " . - "during read from server\x0d\x0a" - ); - return undef; - } - } - - #local($^W) = undef; # Now quiet down warnings - - # read "$readlen" bytes (or less): - # need to check return code from $self->_sysread - # in case other end has shut down!!! - my $ret = $self->_sysread( $sh, \$iBuffer, $readlen, length($iBuffer)) ; - # $self->_debug("Read so far: $iBuffer<>\n"); - redo if(! defined($ret)) ; - if(($timeout and ! defined($ret))) { # Blocking read error... - my $msg = "Error while reading data from server: $!\x0d\x0a"; - $self->LastError('Error while reading data from server'); - $self->State(Unconnected); - print $msg; - $self->_record($transno, - [ $self->_next_index($transno), - "ERROR", "$transno * NO $msg " - ]); - $@ = "$msg"; - - return undef; - } - elsif(defined($ret) and $ret == 0) { # Caught EOF... - my $msg="Socket closed while reading data from server [$!]\x0d\x0a"; - print "$msg"; - $self->LastError('Socket closed while reading data from server'); - $self->State(Unconnected); - $self->_record($transno, - [ $self->_next_index($transno), - "ERROR", "$transno * NO $msg " - ]); - $@ = "$msg"; - return undef; - } - - # successfully wrote to other end, keep going... - $count += $ret; - LINES: while ( $iBuffer =~ s/^(.*?\x0d?\x0a)// ) { - my $current_line = $1; - #print memory_consumption(); - - # $self->_debug("BUFFER: pulled from buffer: ${current_line}\n" . - # "and left with buffer contents of: ${iBuffer}\n"); - - LITERAL: if ($current_line =~ s/\{(\d+)\}\x0d\x0a$//) { - # This part handles IMAP "Literals", - # which according to rfc2060 look something like this: - # [tag]|* BLAH BLAH {nnn}\r\n - # [nnn bytes of literally transmitted stuff] - # [part of line that follows literal data]\r\n - - # Set $len to be length of impending literal: - my $len = $1 ; - - $self->_debug("LITERAL: received literal in line ". - "$current_line of length $len; ". - "attempting to ". - "retrieve from the " . length($iBuffer) . - " bytes in: $iBuffer\n"); - - # Xfer up to $len bytes from front of $iBuffer to $litstring: - my $litstring = substr($iBuffer, 0, $len); - $iBuffer = substr($iBuffer, length($litstring), - length($iBuffer) - length($litstring) ) ; - - # Figure out what's left to read (i.e. what part of - # literal wasn't in buffer): - my $remainder_count = $len - length($litstring); - my $callback_value = ""; - - if ( defined($literal_callback) ) { - if ( $literal_callback =~ /GLOB/) { - print $literal_callback $litstring ; - $litstring = ""; - } elsif ($literal_callback =~ /CODE/ ) { - # Don't do a thing - - } else { - $self->LastError( - ref($literal_callback) . - " is an invalid callback type; " . - "must be a filehandle or coderef\n" - ); - } - - - } - if ($remainder_count > 0 and $timeout) { - # If we're doing timeouts then here we set up select - # and wait for data from the the IMAP socket. - vec($rvec, fileno($self->Socket), 1) = 1; - unless ( CORE::select( $ready = $rvec, - undef, - $errors = $rvec, - $timeout) - ) { - # Select failed; that means bad news. - # Better tell someone. - $self->LastError("Tag " . $transno . - ": Timeout waiting for literal data " . - "from server\n"); - carp "Tag " . $transno . - ": Timeout waiting for literal data " . - "from server\n" - if $self->Debug or $^W; - return undef; - } - } - - fcntl($sh, F_SETFL, $self->{_fcntl}) - if $fast_io and defined($self->{_fcntl}); - while ( $remainder_count > 0 ) { # As long as not done, - $self->_debug("Still need $remainder_count to " . - "complete literal string\n"); - my $ret = $self->_sysread( # bytes read - $sh, # IMAP handle - \$litstring, # place to read into - $remainder_count, # bytes left to read - length($litstring) # offset to read into - ) ; - $self->_debug("Received ret=$ret and buffer = " . - "\n$litstring\nwhile processing LITERAL\n"); - if ( $timeout and !defined($ret)) { # possible timeout - $self->_record($transno, [ - $self->_next_index($transno), - "ERROR", - "$transno * NO Error reading data " . - "from server: $!\n" - ] - ); - return undef; - } elsif ( $ret == 0 and eof($sh) ) { - $self->_record($transno, [ - $self->_next_index($transno), - "ERROR", - "$transno * ". - "BYE Server unexpectedly " . - "closed connection: $!\n" - ] - ); - $self->State(Unconnected); - return undef; - } - # decrement remaining bytes by amt read: - $remainder_count -= $ret; - - if ( length($litstring) > $len ) { - # copy the extra struff into the iBuffer: - $iBuffer = substr( - $litstring, - $len, - length($litstring) - $len - ); - $litstring = substr($litstring, 0, $len) ; - } - - if ( defined($literal_callback) ) { - if ( $literal_callback =~ /GLOB/ ) { - print $literal_callback $litstring; - $litstring = ""; - } - } - - } - $literal_callback->($litstring) - if defined($litstring) and - defined($literal_callback) and $literal_callback =~ /CODE/; - - $self->Fast_io($fast_io) if $fast_io; - - # Now let's make sure there are no IMAP server output lines - # (i.e. [tag|*] BAD|NO|OK Text) embedded in the literal string - # (There shouldn't be but I've seen it done!), but only if - # EnableServerResponseInLiteral is set to true - - my $embedded_output = 0; - my $lastline = ( split(/\x0d?\x0a/,$litstring))[-1] - if $litstring; - - if ( $self->EnableServerResponseInLiteral and - $lastline and - $lastline =~ /^(?:\*|(\d+))\s(BAD|NO|OK)/i - ) { - $litstring =~ s/\Q$lastline\E\x0d?\x0a//; - $embedded_output++; - - $self->_debug("Got server output mixed in " . - "with literal: $lastline\n" - ) if $self->Debug; - - } - # Finally, we need to stuff the literal onto the - # end of the oBuffer: - push @$oBuffer, [ $index++, "OUTPUT" , $current_line], - [ $index++, "LITERAL", $litstring ]; - push @$oBuffer, [ $index++, "OUTPUT", $lastline ] - if $embedded_output; - - } else { - push @$oBuffer, [ $index++, "OUTPUT" , $current_line ]; - } - - } - #$self->_debug("iBuffer is now: $iBuffer<>\n"); - } - # _debug $self, "Buffer is now $buffer\n"; - _debug $self, "Read: " . join("",map {$_->[DATA]} @$oBuffer) ."\n" - if $self->Debug; - return scalar(@$oBuffer) ? $oBuffer : undef ; -}; - - - -} - -# End of sub override_imapclient (yes, very bad indentation) -} - -# IMAPClient 2.2.9 3.xx ads - -package Mail::IMAPClient; - -sub Split { - my $self = shift; - - if (@_) { - $self->{SPLIT} = shift; - $self->{Maxcommandlength} = 10 * $self->{SPLIT}; - } - return $self->{SPLIT}; -} - -sub Tls { - my $self = shift; - - if (@_) { $self->{TLS} = shift } - return $self->{TLS}; -} - -sub Reconnect_counter { - my $self = shift; - if (@_) { $self->{Reconnect_counter} = shift } - return $self->{Reconnect_counter}; - -} - - -sub Banner { - my $self = shift; - - if (@_) { $self->{BANNER} = shift } - return $self->{BANNER}; -} - - -sub RawSocket2 { - my ( $self, $sock ) = @_; - defined $sock - or return $self->{Socket}; - - $self->{Socket} = $sock; - $self->{_select} = IO::Select->new($sock); - delete $self->{_fcntl}; - #$self->Fast_io( $self->Fast_io ); - $sock; -} - -sub capability_update { - my $self = shift; - - delete $self->{CAPABILITY}; - $self->capability; -} - -sub fetch_hash_2 { - # taken from above *Mail::IMAPClient::fetch_hash - # if last arg is a ref then the fetch is done only - # on the messages listed as the keys of this hash. - # Init an "empty" $hash_ref by value can be done this way: - # @$hash_ref{2, 3, 4, 55} = (undef); - - my $self = shift; - my $hash_ref = ref($_[-1]) ? pop @_ : {}; - my @words = @_; - for (@words) { - s/([\( ])FAST([\) ])/${1}FLAGS INTERNALDATE RFC822\.SIZE$2/i ; - s/([\( ])FULL([\) ])/${1}FLAGS INTERNALDATE RFC822\.SIZE ENVELOPE BODY$2/i ; - } - - my $msgs_ref_all; - if (scalar %$hash_ref) { - $msgs_ref_all = [ sort { $a <=> $b } keys (%$hash_ref) ]; - #print "ZZZZ 1 [@$msgs_ref_all]\n"; - }else{ - $msgs_ref_all = scalar($self->messages); - #print "ZZZZ 2 [@$msgs_ref_all]\n"; - } - - my $split = $self->Split() || scalar(@$msgs_ref_all); - while(my @msgs = splice(@$msgs_ref_all, 0, $split)) { - #print "SPLIT: @msgs\n"; - my $msgs_ref = \@msgs; - my $output = scalar($self->fetch($msgs_ref,"(" . join(" ",@_) . ")")) - ; # unless grep(/\b(?:FAST|FULL)\b/i,@words); - my $x; - for ($x = 0; $x <= $#$output ; $x++) { - my $entry = {}; - my $l = $output->[$x]; - if ($self->Uid) { - my($uid) = $l =~ /\((?:.* )?UID (\d+).*\)/i; - next unless $uid; - if ( defined $hash_ref->{$uid} ) { - $entry = $hash_ref->{$uid} ; - } - else { - $hash_ref->{$uid} ||= $entry; - } - } - else { - my($mid) = $l =~ /^\* (\d+) FETCH/i; - next unless $mid; - if ( defined $hash_ref->{$mid} ) { - $entry = $hash_ref->{$mid} ; - } - else { - $hash_ref->{$mid} ||= $entry; - } - } - - foreach my $w (@words) { - if ( $l =~ /\Q$w\E\s*$/i ) { - $entry->{$w} = $output->[$x+1]; - $entry->{$w} =~ s/(?:\x0a?\x0d)+$//g; - chomp $entry->{$w}; - } - else { - $l =~ /\( # open paren followed by ... - (?:.*\s)? # ...optional stuff and a space - \Q$w\E\s # escaped fetch field - (?:" # then: a dbl-quote - (\\.| # then bslashed anychar(s) or ... - [^"]+) # ... nonquote char(s) - "| # then closing quote; or ... - \( # ...an open paren - (\\.| # then bslashed anychar or ... - [^\)]*) # ... non-close-paren char - \)| # then closing paren; or ... - (\S+)) # unquoted string - (?:\s.*)? # possibly followed by space-stuff - \) # close paren - /xi; - $entry->{$w}=defined($1)?$1:defined($2)?$2:$3; - } - } - } -} - return wantarray ? %$hash_ref : $hash_ref; -} diff --git a/imapsync-1.404 b/imapsync-1.404 deleted file mode 100755 index f75d4b5..0000000 --- a/imapsync-1.404 +++ /dev/null @@ -1,4830 +0,0 @@ -#!/usr/bin/perl - -# structure -# pod documentation -# pragmas -# main program -# global variables initialisation -# default values -# folder loop -# subroutines -# IMAPClient 2.2.9 overrides -# IMAPClient 2.2.9 3.xx ads - -=pod - -=head1 NAME - -imapsync - IMAP synchronisation, sync, copy or migration -tool. Synchronise mailboxes between two imap servers. Good -at IMAP migration. More than 36 different IMAP server softwares -supported with success. - -$Revision: 1.404 $ - -=head1 SYNOPSIS - -To synchronise imap account "foo" on "imap.truc.org" - to imap account "bar" on "imap.trac.org" - with foo password "secret1" - and bar password "secret2": - - imapsync \ - --host1 imap.truc.org --user1 foo --password1 secret1 \ - --host2 imap.trac.org --user2 bar --password2 secret2 - -=head1 INSTALL - - imapsync works fine under any Unix OS with perl. - imapsync works fine under Windows (2000, XP) - with Strawberry Perl 5.10 or 5.12 - or as a standalone binary software imapsync.exe - -imapsync is already available directly on the following distributions -(at least): -FreeBSD, Debian, Ubuntu, Gentoo, Fedora, -NetBSD, Darwin, Mandriva and OpenBSD. - - Get imapsync at - http://www.linux-france.org/prj/imapsync/ - - You'll receive a link to a compressed tarball called imapsync-x.xx.tgz - where x.xx is the version number. Untar the tarball where - you want (on Unix): - - tar xzvf imapsync-x.xx.tgz - - Go into the directory imapsync-x.xx and read the INSTALL file. - The INSTALL file is also at - http://www.linux-france.org/prj/imapsync/INSTALL - - The freshmeat record is at http://freshmeat.net/projects/imapsync/ - -=head1 USAGE - - imapsync [options] - -To get a description of each option just run imapsync like this: - - imapsync --help - imapsync - -The option list: - - imapsync [--host1 server1] [--port1 ] - [--user1 ] [--passfile1 ] - [--host2 server2] [--port2 ] - [--user2 ] [--passfile2 ] - [--ssl1] [--ssl2] - [--tls1] [--tls2] - [--authmech1 ] [--authmech2 ] - [--proxyauth1] [--proxyauth2] - [--domain1] [--domain2] - [--authmd51] [--authmd52] - [--folder --folder ...] - [--folderrec --folderrec ...] - [--include ] [--exclude ] - [--prefix2 ] [--prefix1 ] - [--regextrans2 --regextrans2 ...] - [--sep1 ] - [--sep2 ] - [--justfolders] [--justfoldersizes] [--justconnect] [--justbanner] - [--syncinternaldates] - [--idatefromheader] - [--syncacls] - [--regexmess ] [--regexmess ] - [--maxsize ] - [--minsize ] - [--maxage ] - [--minage ] - [--skipheader ] - [--useheader ] [--useheader ] - [--nouid1] [--nouid1] - [--usecache] - [--skipsize] [--allowsizemismatch] - [--delete] [--delete2] - [--expunge] [--expunge1] [--expunge2] [--uidexpunge2] - [--delete2folders] [--delete2foldersonly] [--delete2foldersbutnot] - [--subscribed] [--subscribe] [--subscribe_all] - [--nofoldersizes] - [--dry] - [--debug] [--debugimap][--debugimap1][--debugimap2] - [--timeout ] [--fast] - [--split1] [--split2] - [--reconnectretry1 ] [--reconnectretry2 ] - [--noreleasecheck] - [--pidfile ] - [--tmpdir ] - [--version] [--help] - [--tests] [--tests_debug] - -=cut -# comment - -=pod - -=head1 DESCRIPTION - -The command imapsync is a tool allowing incremental and -recursive imap transfer from one mailbox to another. - -By default all folders are transferred, recursively. - -We sometimes need to transfer mailboxes from one imap server to -another. This is called migration. - -imapsync is a good tool because it reduces the amount -of data transferred by not transferring a given message if it -is already on both sides. Same headers -and the transfer is done only once. All flags are -preserved, unread will stay unread, read will stay read, -deleted will stay deleted. You can stop the transfer at any -time and restart it later, imapsync works well with bad -connections. imapsync is CPU hungry so nice and renice -commands can be a good help. imapsync can be memory hungry too, -especially with large messages. - -You can decide to delete the messages from the source mailbox -after a successful transfer (it is a good feature when migrating). -In that case, use the --delete option. Option --delete implies -also option --expunge so all messages marked deleted on host1 -will be really deleted. -(you can use --noexpunge to avoid this but I don't see any -real world scenario for the combinaison --delete --noexpunge). - -You can also just synchronize a mailbox A from another mailbox B -in case you just want to keep a "live" copy of B in A (--delete2 -may help) - -=head1 OPTIONS - -To get a description of each option just invoke: - -imapsync --help - -=head1 HISTORY - -I wrote imapsync because an enterprise (basystemes) paid me to install -a new imap server without losing huge old mailboxes located on a far -away remote imap server accessible by a low bandwidth link. The tool -imapcp (written in python) could not help me because I had to verify -every mailbox was well transferred and delete it after a good -transfer. imapsync started life as a copy_folder.pl patch. -The tool copy_folder.pl comes from the Mail-IMAPClient-2.1.3 perl -module tarball source (in the examples/ directory of the tarball). - -=head1 EXAMPLE - -While working on imapsync parameters please run imapsync in -dry mode (no modification induced) with the --dry -option. Nothing bad can be done this way. - -To synchronize the imap account "buddy" (with password "secret1") -on host "imap.src.fr" to the imap account "max" (with password "secret2") -on host "imap.dest.fr": - - imapsync --host1 imap.src.fr --user1 buddy --password1 secret1 \ - --host2 imap.dest.fr --user2 max --password2 secret2 - -Then you will have max's mailbox updated from buddy's -mailbox. - -=head1 SECURITY - -You can use --passfile1 instead of --password1 to give the -password since it is safer. With --password1 option any user -on your host can see the password by using the 'ps auxwwww' -command. Using a variable (like $PASSWORD1) is also -dangerous because of the 'ps auxwwwwe' command. So, saving -the password in a well protected file (600 or rw-------) is -the best solution. - -imasync is not totally protected against sniffers on the -network since passwords may be transferred in plain text -if CRAM-MD5 is not supported by your imap servers. Use ---ssl1 (or --tls1) and --ssl2 (or --tls2) to enable -encryption on host1 and host2. - -You may authenticate as one user (typically an admin user), -but be authorized as someone else, which means you don't -need to know every user's personal password. Specify ---authuser1 "adminuser" to enable this on host1. In this -case, --authmech1 PLAIN will be used by default since it -is the only way to go for now. So don't use --authmech1 SOMETHING -with --authuser1 "adminuser", it will not work. -Same behavior with the --authuser2 option. - -When working on Sun/iPlanet/Netscape IMAP servers you must use ---proxyauth1 to enable administrative user to masquerade as another user. -Can also be used on destination server with --proxyauth2 - -=head1 EXIT STATUS - -imapsync will exit with a 0 status (return code) if everything went good. -Otherwise, it exits with a non-zero status. - -So if you have an unreliable internet connection, you can use this loop -in a Bourne shell: - - while ! imapsync ...; do - echo imapsync not complete - done - -=head1 LICENSE - -imapsync is free, open source but not always gratis software cover by -the Do What The Fuck You Want To Public License (WTFPL). -See COPYING file included in the distribution or the web site -http://sam.zoy.org/wtfpl/COPYING - -=head1 MAILING-LIST - -The public mailing-list may be the best way to get support. - -To write on the mailing-list, the address is: - - -To subscribe, send any message (even empty) to: - -then just reply to the confirmation message. - -To unsubscribe, send a message to: - - -To contact the person in charge for the list: - - -The list archives may be available at: -http://www.linux-france.org/prj/imapsync_list/ -So consider that the list is public, anyone -can see your post. Use a pseudonym or do not -post to this list if you want to stay private. - -Thank you for your participation. - -=head1 AUTHOR - -Gilles LAMIRAL - -Feedback good or bad is always welcome. - -The newsgroup comp.mail.imap may be a good place to talk about -imapsync. I read it when imapsync is concerned. -A better place is the public imapsync mailing-list -(see below). - -Gilles LAMIRAL earns his living writing, installing, -configuring and teaching free, open and often gratis -softwares. Do not hesitate to pay him for that services. - -=head1 BUG REPORT GUIDELINES - -Help us to help you: follow the following guidelines. - -Report any bugs or feature requests to the public mailing-list -or to the author. - -Before reporting bugs, read the FAQ, the README and the -TODO files. http://www.linux-france.org/prj/imapsync/ - -Upgrade to last imapsync release, maybe the bug -is already fixed. - -Upgrade to last Mail-IMAPClient Perl module. -http://search.cpan.org/dist/Mail-IMAPClient/ -maybe the bug is already fixed. - -Make a good title with word "imapsync" in it (my spam filter won't filter it), -Don't write an email title with just "imapsync" or "problem", -a good title is made of keywords summary, not too long (one visible line). - -Don't write imapsync in uppercase in the email title, we'll -know you run Windows and you haven't read this README yet. - -Help us to help you: in your report, please include: - - - imapsync version. - - - output given with --debug --debugimap near the failure point. - Isolate a message or two in a folder 'BUG' and use - - imapsync ... --folder 'BUG' --debug --debugimap - - - imap server software on both side and their version number. - - - imapsync with all the options you use, the full command line - you use (except the passwords of course). - - - IMAPClient.pm version. - - - operating system running imapsync. - - - operating systems on both sides and the third side in case - you run imapsync on a foreign host from the both. - - - virtual software context (vmware, xen etc.) - -Most of those values can be found as a copy/paste at the begining of the output. - -One time in your life, read the paper -"How To Ask Questions The Smart Way" -http://www.catb.org/~esr/faqs/smart-questions.html -and then forget it. - -=head1 IMAP SERVERS - -Failure stories reported with the following 3 imap servers: - - - MailEnable 1.54 (Proprietary) http://www.mailenable.com/ - - DBMail 0.9, 2.0.7 (GPL). But DBMail 1.2.1 works. - Patient and confident testers are welcome. - - Imail 7.04 (maybe). - -Success stories reported with the following 40 imap servers -(software names are in alphabetic order): - - - 1und1 H mimap1 84498 [host1] - - a1.net imap.a1.net IMAP4 Ready WARSBL614 00029c23 [host1] - - Archiveopteryx 2.03, 2.04, 2.09, 2.10 [host2], 3.0.0 [host2] - (OSL 3.0) http://www.archiveopteryx.org/ - - BincImap 1.2.3 (GPL) (http://www.bincimap.org/) - - CommuniGatePro server (Redhat 8.0) (Solaris), CommuniGate Pro 5.2.17[host2] (CentOS 5.4) - - Courier IMAP 1.5.1, 2.2.0, 2.1.1, 2.2.1, 3.0.8, 3.0.3, 4.1.1 (GPL) - (http://www.courier-mta.org/) - - Critical Path (7.0.020) - - Cyrus IMAP 1.5, 1.6, 2.1, 2.1.15, 2.1.16, 2.1.18 - 2.2.1, 2.2.2-BETA, 2.2.10, 2.2.12, - v2.2.3-Invoca-RPM-2.2.3-8, - 2.3-alpha (OSI Approved), - v2.2.12-Invoca-RPM-2.2.12-3.RHEL4.1, - 2.2.13, - v2.3.1-Invoca-RPM-2.3.1-2.7.fc5, - v2.3.7, - (http://asg.web.cmu.edu/cyrus/) - - David Tobit V8 (proprietary Message system). - - DBMail 1.2.1, 2.0.4, 2.0.9, 2.2rc1 (GPL) (http://www.dbmail.org/). - 2.0.7 seems buggy. - - Deerfield VisNetic MailServer 5.8.6 [host1] - - dkimap4 [host1] - - Domino (Notes) 4.61[host1], 6.5[host1], 5.0.6, 5.0.7, 7.0.2, 6.0.2CF1, - 7.0.1[host1], 8.0.1[host1], 8.5.2[host2] - - Dovecot 0.99.10.4, 0.99.14, 0.99.14-8.fc4, 1.0-0.beta2.7, - 1.0.0 [dest/source] (LGPL) (http://www.dovecot.org/) - - Eudora WorldMail v2 - - GMX IMAP4 StreamProxy. - - Groupwise IMAP (Novell) 6.x and 7.0. Buggy so see the FAQ. - - hMailServer 5.3.3 [host2], 4.4.1 [host1] (see FAQ) - - iPlanet Messaging server 4.15, 5.1, 5.2 - - IMail 7.15 (Ipswitch/Win2003), 8.12 - - MDaemon 7.0.1, 8.0.2, 8.1, 9.5.4 (Windows server 2003 R2 platform) - - Mercury 4.1 (Windows server 2000 platform) - - Microsoft Exchange Server 5.5, 6.0.6249.0[host1], 6.0.6487.0[host1], - 6.5.7638.1 [host2], Exchange 2007 SP1 (with Update Rollup 2), - Exchange2007-EP-SP2, - Exchange 2010 RTM (Release to Manufacturing) [host2] - - Mirapoint - - Netscape Mail Server 3.6 (Wintel !) - - Netscape Messaging Server 4.15 Patch 7 - - OpenMail IMAP server B.07.00.k0 (Samsung Contact ?) - - OpenWave - - Oracle Beehive [host1] - - Qualcomm Worldmail (NT) - - Rockliffe Mailsite 5.3.11, 4.5.6 - - Samsung Contact IMAP server 8.5.0 - - Scalix v10.1, 10.0.1.3, 11.0.0.431 - - SmarterMail, Smarter Mail 5.0 Enterprise, Smarter Mail 5.5 [host1]. - - SunONE Messaging server 5.2, 6.0 (SUN JES - Java Enterprise System) - - Sun Java(tm) System Messaging Server 6.2-2.05, 6.2-7.05, 6.3 - - Surgemail 3.6f5-5 - - UW-imap servers (imap-2000b) rijkkramer IMAP4rev1 2000.287 - (RedHat uses UW like 2003.338rh), v12.264 Solaris 5.7 (OSI Approved) - (http://www.washington.edu/imap/) - - UW - QMail v2.1 - - Imap part of TCP/IP suite of VMS 7.3.2 - - Zimbra-IMAP 3.0.1 GA 160, 3.1.0 Build 279, 4.0.5, 4.5.2, 4.5.6, 5.5, 6.x - -Please report to the author any success or bad story with -imapsync and do not forget to mention the IMAP server -software names and version on both sides. This will help -future users. To help the author maintaining this section -report the two lines at the begining of the output if they -are useful to know the softwares. Example: - - Host1 software:* OK louloutte Cyrus IMAP4 v1.5.19 server ready - Host2 software:* OK Courier-IMAP ready - -You can use option --justconnect to get those lines. -Example: - - imapsync --host1 imap.troc.org --host2 imap.trac.org --justconnect - - -=head1 HUGE MIGRATION - -Pay special attention to options ---subscribed ---subscribe ---delete ---delete2 ---delete2folders ---expunge ---expunge1 ---expunge2 ---uidexpunge2 ---maxage ---minage ---maxsize ---useheader ---fast ---useuid ---usecache - -If you have many mailboxes to migrate think about a little -shell program. Write a file called file.csv (for example) -containing users and passwords. -The separator used in this example is ';' - -The file.csv file contains: - -user0001;password0001;user0002;password0002 -user0011;password0011;user0012;password0012 -... - -And the shell program is just: - - { while IFS=';' read u1 p1 u2 p2; do - imapsync --user1 "$u1" --password1 "$p1" --user2 "$u2" --password2 "$p2" ... - done ; } < file.csv - -Welcome in shell programming ! - -=head1 Hacking - -Feel free to hack imapsync as the WTFPL Licence permits it. - -=head1 Links - -Entries for imapsync: - http://www.imap.org/products/showall.php - - -=head1 SIMILAR SOFTWARES - - imap_tools : http://www.athensfbc.com/imap_tools - offlineimap : http://software.complete.org/offlineimap - mailsync : http://mailsync.sourceforge.net/ - imapxfer : http://www.washington.edu/imap/ - part of the imap-utils from UW. - mailutil : replace imapxfer in - part of the imap-utils from UW. - http://www.gsp.com/cgi-bin/man.cgi?topic=mailutil - imaprepl : http://www.bl0rg.net/software/ - http://freshmeat.net/projects/imap-repl/ - imap_migrate : http://freshmeat.net/projects/imapmigration/ - imapcopy : http://home.arcor.de/armin.diehl/imapcopy/imapcopy.html - migrationtool : http://sourceforge.net/projects/migrationtool/ - imapmigrate : http://sourceforge.net/projects/cyrus-utils/ - wonko_imapsync: http://wonko.com/article/554 - see also tools/wonko_ruby_imapsync - pop2imap : http://www.linux-france.org/prj/pop2imap/ - - -Feedback (good or bad) will often be welcome. - -$Id: imapsync,v 1.404 2011/02/21 03:35:39 gilles Exp $ - -=cut - - -# pragmas - -use warnings; -++$|; -use strict; -use Carp; -use Getopt::Long; -use Mail::IMAPClient; -use Digest::MD5 qw(md5_base64); -#use Term::ReadKey; -#use IO::Socket::SSL; -use MIME::Base64; -use English; -use File::Basename; -use POSIX qw(uname SIGALRM); -use Fcntl; -use File::Spec; -use File::Path qw(mkpath rmtree); -use IO::Socket qw(:crlf SOL_SOCKET SO_KEEPALIVE); -use Errno qw(EAGAIN EPIPE ECONNRESET); -use File::Glob qw( :glob ) ; -use IO::File; - -use Test::More 'no_plan'; - -eval { require 'usr/include/sysexits.ph' }; - -use constant { - Unconnected => 0, - Connected => 1, # connected; not logged in - Authenticated => 2, # logged in; no mailbox selected - Selected => 3, # mailbox selected -}; - - -# global variables - -my( - $rcs, $pidfile, - $debug, $debugimap, $debugimap1, $debugimap2, $nb_errors, - $host1, $host2, $port1, $port2, - $user1, $user2, $domain1, $domain2, - $password1, $password2, $passfile1, $passfile2, - @folder, @include, @exclude, @folderrec, - $prefix1, $prefix2, - @regextrans2, @regexmess, @regexflag, - $sep1, $sep2, - $syncinternaldates, - $idatefromheader, - $usedatemanip, - $syncacls, - $fastio1, $fastio2, - $maxsize, $minsize, $maxage, $minage, - $skipheader, @useheader, - $skipsize, $allowsizemismatch, $foldersizes, $buffersize, - $delete, $delete2, - $expunge, $expunge1, $expunge2, $uidexpunge2, $dry, - $justfoldersizes, - $authmd5, $authmd51, $authmd52, - $subscribed, $subscribe, $subscribe_all, - $version, $help, - $justconnect, $justfolders, $justbanner, - $fast, - $total_bytes_transferred, - $total_bytes_skipped, - $total_bytes_error, - $nb_msg_transferred, - $nb_msg_skipped, - $nb_msg_skipped_dry_mode, - $h1_nb_msg_duplicate, - $h2_nb_msg_duplicate, - $h1_nb_msg_noheader, - $h2_nb_msg_noheader, - $h1_total_bytes_duplicate, - $h2_total_bytes_duplicate, - $h1_nb_msg_deleted, - $h2_nb_msg_deleted, - $timeout, - $timestart, $timeend, $timediff, - $timesize, $timebefore, - $ssl1, $ssl2, - $tls1, $tls2, - $uid1, $uid2, - $authuser1, $authuser2, - $proxyauth1, $proxyauth2, - $authmech1, $authmech2, - $split1, $split2, - $reconnectretry1, $reconnectretry2, - $tests, $test_builder, $tests_debug, - $allow3xx, $justlogin, - $tmpdir, - $releasecheck, - $max_msg_size_in_bytes, - $modules_version, - $delete2folders, $delete2foldersonly, $delete2foldersbutnot, - $usecache, $debugcache, - $takebody, %h1_msgs_copy_by_uid, $useuid, $h2_uidguess, -); - -# main program - -# global variables initialisation - -$rcs = '$Id: imapsync,v 1.404 2011/02/21 03:35:39 gilles Exp $ '; - -$total_bytes_transferred = 0; -$total_bytes_skipped = 0; -$total_bytes_error = 0; -$nb_msg_transferred = 0; -$nb_msg_skipped = $nb_msg_skipped_dry_mode = 0; -$h1_nb_msg_deleted = $h2_nb_msg_deleted = 0; -$h1_nb_msg_duplicate = $h2_nb_msg_duplicate = 0; -$h1_nb_msg_noheader = $h2_nb_msg_noheader = 0; -$h1_total_bytes_duplicate = $h2_total_bytes_duplicate = 0; - -$nb_errors = 0; -$max_msg_size_in_bytes = 0; - -unless(defined(&_SYSEXITS_H)) { - # 64 on my linux box. - eval 'sub EX_USAGE () {64;}' unless defined(&EX_USAGE); -} - -# @ARGV will be eat by get_options() -my @argv_copy = @ARGV; - -get_options(); - -$modules_version = defined($modules_version) ? $modules_version : 1; - -# $SIG{ INT } = \&catch_continue ; - -$releasecheck = defined($releasecheck) ? $releasecheck : 1; -my $warn_release = ($releasecheck) ? check_last_release() : ''; - -$SIG{ INT } = \&catch_exit ; - -# default values - -$tmpdir ||= File::Spec->tmpdir(); -$pidfile ||= $tmpdir . '/imapsync.pid'; - -# allow Mail::IMAPClient 3.0.xx by default -$allow3xx = defined($allow3xx) ? $allow3xx : 1; - -$takebody = defined($takebody) ? $takebody : 1; - -if ( $fast ) { - $useuid = 1 ; - $foldersizes = 0 ; -} - -# Activate --usecache if --useuid is set and no --nousecache -$usecache = 1 if ( $useuid and ( ! defined( $usecache ) ) ) ; - - - -print banner_imapsync(@argv_copy); - -print "Temp directory is $tmpdir\n"; - -is_valid_directory($tmpdir); -write_pidfile($pidfile) if ($pidfile); - -$modules_version and print "Modules version list:\n", modules_VERSION(), "\n"; - -check_lib_version() or - die "imapsync needs perl lib Mail::IMAPClient release 2.2.9, or 3.25 or superior \n"; - -exit_clean(0) if ($justbanner); - -# By default, 1000 at a time, not more. -$split1 ||= 1000; -$split2 ||= 1000; - -$host1 || missing_option("--host1") ; -$port1 ||= (defined $ssl1 and !defined $tls1) ? 993 : 143; - -$host2 || missing_option("--host2") ; -$port2 ||= (defined $ssl2 && !defined $tls2) ? 993 : 143; - -$debugimap1 = $debugimap2 = 1 if ( $debugimap ) ; -$debug = 1 if ( $debugimap1 or $debugimap2 ) ; - -# By default, don't take size to compare -$skipsize = (defined $skipsize) ? $skipsize : 1; - -$uid1 = defined($uid1) ? $uid1 : 1; -$uid2 = defined($uid2) ? $uid2 : 1; - -# Allow size mismatch by default -$allowsizemismatch = defined($allowsizemismatch) ? $allowsizemismatch : 1; - -$delete2folders = 1 - if ( defined( $delete2foldersbutnot ) or defined( $delete2foldersonly ) ) ; - -if ($justconnect) { - justconnect(); - exit_clean(0); -} - -$user1 || missing_option("--user1"); -$user2 || missing_option("--user2"); - -$syncinternaldates = defined($syncinternaldates) ? $syncinternaldates : 1; - -# Turn on expunge if there is not explicit option --noexpunge and option -# --delete is given. -# Done because --delete --noexpunge is very dangerous on the second run: -# the Deleted flag is then synced to all previously transfered messages. -# So --delete implies --expunge is a better usability default behaviour. -if ($delete) { - if ( ! defined($expunge)) { - $expunge = 1; - } -} - -if($idatefromheader) { - print "Turned ON idatefromheader, ", - "will set the internal dates on host2 from the 'Date:' header line.\n"; - $syncinternaldates = 0; - -} -if ($syncinternaldates) { - print "Turned ON syncinternaldates, ", - "will set the internal dates (arrival dates) on host2 same as host1.\n"; -}else{ - print "Turned OFF syncinternaldates\n"; -} - -if(defined($authmd5) and ($authmd5)) { - $authmd51 = 1 ; - $authmd52 = 1 ; -} - -if(defined($authmd51) and ($authmd51)) { - $authmech1 ||= 'CRAM-MD5'; -} -else{ - $authmech1 ||= $authuser1 ? 'PLAIN' : 'LOGIN'; -} - -if(defined($authmd52) and ($authmd52)) { - $authmech2 ||= 'CRAM-MD5'; -} -else{ - $authmech2 ||= $authuser2 ? 'PLAIN' : 'LOGIN'; -} - -$authmech1 = uc($authmech1); -$authmech2 = uc($authmech2); - -if (defined $proxyauth1 && !$authuser1) { - missing_option("With --proxyauth1, --authuser1"); -} - -if (defined $proxyauth2 && !$authuser2) { - missing_option("With --proxyauth2, --authuser2"); -} - -$authuser1 ||= $user1; -$authuser2 ||= $user2; - -print "Will try to use $authmech1 authentication on host1\n"; -print "Will try to use $authmech2 authentication on host2\n"; - -$syncacls = (defined($syncacls)) ? $syncacls : 0; -$foldersizes = (defined($foldersizes)) ? $foldersizes : 1; - -$fastio1 = (defined($fastio1)) ? $fastio1 : 0; -$fastio2 = (defined($fastio2)) ? $fastio2 : 0; - -$reconnectretry1 = (defined($reconnectretry1)) ? $reconnectretry1 : 3; -$reconnectretry2 = (defined($reconnectretry2)) ? $reconnectretry2 : 3; - -@useheader = ("Message-Id") unless (@useheader); - -print "Host1: imap server [$host1] port [$port1] user [$user1]\n"; -print "Host2: imap server [$host2] port [$port2] user [$user2]\n"; - -$password1 || $passfile1 || do { - $password1 = ask_for_password($authuser1 || $user1, $host1); -}; - -$password1 = (defined($passfile1)) ? firstline ($passfile1) : $password1; - -$password2 || $passfile2 || do { - $password2 = ask_for_password($authuser2 || $user2, $host2); -}; - -$password2 = (defined($passfile2)) ? firstline ($passfile2) : $password2; - -my $imap1 = (); -my $imap2 = (); - -$timestart = time(); -$timebefore = $timestart; - -$debugimap1 and print "Host1 connection\n"; -$imap1 = login_imap($host1, $port1, $user1, $domain1, $password1, - $debugimap1, $timeout, $fastio1, $ssl1, $tls1, - $authmech1, $authuser1, $reconnectretry1, - $proxyauth1, $uid1); - -$debugimap2 and print "Host2 connection\n"; -$imap2 = login_imap($host2, $port2, $user2, $domain2, $password2, - $debugimap2, $timeout, $fastio2, $ssl2, $tls2, - $authmech2, $authuser2, $reconnectretry2, - $proxyauth2, $uid2); - -# history - -$debug and print "Host1 Buffer I/O: ", $imap1->Buffer(), "\n"; -$debug and print "Host2 Buffer I/O: ", $imap2->Buffer(), "\n"; - - - -die_clean() unless $imap1->IsAuthenticated(); -print "Host1: state Authenticated\n"; -die_clean() unless $imap2->IsAuthenticated(); -print "Host2: state Authenticated\n"; - -print "Host1 capability: ", join(" ", $imap1->capability_update()), "\n"; -print "Host2 capability: ", join(" ", $imap2->capability_update()), "\n"; - - -exit_clean(0) if ($justlogin); - -$split1 and $imap1->Split($split1); -$split2 and $imap2->Split($split2); - -# -# Folder stuff -# - -my ( -@h1_folders_all, %h1_folders_all, @h1_folders_wanted, %requested_folder, %subscribed_folder, -@h2_folders_all, %h2_folders_all, @h2_folders_from_1, %h2_folders_from_1, -); - - -# Make a hash of subscribed folders in source server. -map { $subscribed_folder{$_} = 1 } $imap1->subscribed(); - -# All folders on host1 and host2 -@h1_folders_all = sort $imap1->folders(); -@h2_folders_all = sort $imap2->folders(); - -map { $h1_folders_all{$_} = 1} @h1_folders_all; -map { $h2_folders_all{$_} = 1} @h2_folders_all; - -if (scalar(@folder) or $subscribed or scalar(@folderrec)) { - # folders given by option --folder - if (scalar(@folder)) { - add_to_requested_folders(@folder); - } - - # option --subscribed - if ($subscribed) { - add_to_requested_folders(keys (%subscribed_folder)); - } - - # option --folderrec - if (scalar(@folderrec)) { - foreach my $folderrec (@folderrec) { - add_to_requested_folders($imap1->folders($folderrec)); - } - } -} -else { - # no include, no folder/subscribed/folderrec options => all folders - if (not scalar(@include)) { - add_to_requested_folders(@h1_folders_all); - } -} - - -# consider (optional) includes and excludes -if (scalar(@include)) { - foreach my $include (@include) { - my @included_folders = grep /$include/, @h1_folders_all; - add_to_requested_folders(@included_folders); - print "Including folders matching pattern '$include': @included_folders\n"; - } -} - -if (scalar(@exclude)) { - foreach my $exclude (@exclude) { - my @requested_folder = sort(keys(%requested_folder)); - my @excluded_folders = grep /$exclude/, @requested_folder; - remove_from_requested_folders(@excluded_folders); - print "Excluding folders matching pattern '$exclude': @excluded_folders\n"; - } -} - -# Remove no selectable folders - -foreach my $folder (keys(%requested_folder)) { - if ( not $imap1->selectable($folder)) { - print "Warning: ignoring folder $folder because it is not selectable\n"; - remove_from_requested_folders($folder); - } -} - - -my @requested_folder = sort(keys(%requested_folder)); - -@h1_folders_wanted = @requested_folder; - -my($h1_sep,$h2_sep); -# what are the private folders separators for each server ? - -$debug and print "Getting separators\n"; -$h1_sep = get_separator($imap1, $sep1, "--sep1"); -$h2_sep = get_separator($imap2, $sep2, "--sep2"); - -#my $h1_namespace = $imap1->namespace(); -#my $h2_namespace = $imap2->namespace(); -#$debug and print "Host1 namespace:\n", Data::Dumper->Dump([$h1_namespace]); -#$debug and print "Host2 namespace:\n", Data::Dumper->Dump([$h2_namespace]); - -my($h1_prefix,$h2_prefix); -$h1_prefix = get_prefix($imap1, $prefix1, "--prefix1"); -$h2_prefix = get_prefix($imap2, $prefix2, "--prefix2"); - - -print "Host1 separator and prefix: [$h1_sep][$h1_prefix]\n"; -print "Host2 separator and prefix: [$h2_sep][$h2_prefix]\n"; - - -foreach my $h1_fold (@h1_folders_wanted) { - my $h2_fold; - $h2_fold = imap2_folder_name($h1_fold); - $h2_folders_from_1{$h2_fold}++; -} - -@h2_folders_from_1 = sort keys(%h2_folders_from_1); - -if ($foldersizes) { - foldersizes("Host1", $imap1, @h1_folders_wanted); - foldersizes("Host2", $imap2, @h2_folders_from_1); -} - - -exit_clean(0) if ($justfoldersizes); - -print - "++++ Listing folders\n", - "Host1 folders list:\n", map("[$_]\n",@h1_folders_all),"\n", - "Host2 folders list:\n", map("[$_]\n",@h2_folders_all),"\n"; - -print - "Host1 subscribed folders list: ", - map("[$_] ", sort keys(%subscribed_folder)), "\n" - if ($subscribed); - -my @h2_folders_not_in_1; -@h2_folders_not_in_1 = list_folders_in_2_not_in_1(); - -print "Folders in host2 not in host1:\n", - map("[$_]\n", @h2_folders_not_in_1),"\n"; - -delete_folders_in_2_not_in_1() if $delete2folders; - -# folder loop -print "++++ Looping on each folder\n"; - -FOLDER: foreach my $h1_fold (@h1_folders_wanted) { - - my $h2_fold = imap2_folder_name($h1_fold); - - printf("%-35s -> %-35s\n", "[$h1_fold]", "[$h2_fold]"); - - select_folder($imap1, $h1_fold, 'Host1') or next FOLDER; - - - if ( ! exists($h2_folders_all{$h2_fold})) { - create_folder($imap2, $h2_fold, 'Host2') or next FOLDER; - } - - acls_sync($h1_fold, $h2_fold); - - select_folder($imap2, $h2_fold, 'Host2') or next FOLDER; - my @select_results = $imap2->Results(); - - #print "%%% @select_results\n"; - my $permanentflags2 = permanentflags(@select_results); - - if ($expunge){ - print "Expunging host1 $h1_fold\n"; - unless($dry) { $imap1->expunge() }; - #print "Expunging host2 $h2_fold\n"; - #unless($dry) { $imap2->expunge() }; - } - - if (($subscribe and exists $subscribed_folder{$h1_fold}) or $subscribe_all) { - print "Subscribing to folder $h2_fold on destination server\n"; - unless($dry) { $imap2->subscribe($h2_fold) }; - } - - next FOLDER if ($justfolders); - - my @h1_msgs = select_msgs($imap1); - - $debug and print "LIST Host1: ", scalar(@h1_msgs), " messages [@h1_msgs]\n"; - # internal dates on host2 are after the ones on host1 - # normally... - my @h2_msgs = select_msgs($imap2); - - $debug and print "LIST Host2: ", scalar(@h2_msgs), " messages [@h2_msgs]\n"; - - my $cache_base = "$tmpdir/imapsync_cache/$host1/$user1/$host2/$user2"; - my $cache_dir = cache_folder( $cache_base, $h1_fold, $h2_fold ); - my ( $cache_1_2_ref, $cache_2_1_ref ) = ( {}, {} ); - - if ( $usecache ) { - print "cache directory: $cache_dir\n" ; - mkpath( "$cache_dir" ) ; - ( $cache_1_2_ref, $cache_2_1_ref ) = get_cache($cache_dir, \@h1_msgs, \@h2_msgs) if ($usecache) ; - print "CACHE h1 h2: ", scalar( keys %$cache_1_2_ref ), " files\n" ; - $debug and print '[', - map ( { "$_->$cache_1_2_ref->{$_} " } keys %$cache_1_2_ref ), " ]\n"; - #print "CACHE h2 h1: ", scalar( keys %$cache_2_1_ref ), " files\n" ; - #$debug and print '[', - # map ( { "$_->$cache_2_1_ref->{$_} " } keys %$cache_2_1_ref ), " ]\n"; - } - #sleep 4 ; - - my %h1_hash = (); - my %h2_hash = (); - - my ( %h1_msgs_all, %h2_msgs_all ) ; - @h1_msgs_all{ @h1_msgs } = (); - @h2_msgs_all{ @h2_msgs } = (); - - my @h1_msgs_in_cache = sort { $a <=> $b } keys %$cache_1_2_ref ; - my @h2_msgs_in_cache = keys %$cache_2_1_ref ; - - my ( %h1_msgs_no_cache, %h2_msgs_no_cache ) ; - %h1_msgs_no_cache = %h1_msgs_all ; - %h2_msgs_no_cache = %h2_msgs_all ; - delete @h1_msgs_no_cache{ @h1_msgs_in_cache } ; - delete @h2_msgs_no_cache{ @h2_msgs_in_cache } ; - - my @h1_msgs_no_cache = keys %h1_msgs_no_cache ; - my @h2_msgs_no_cache = keys %h2_msgs_no_cache ; - - - if ( $useuid ) { - @h1_msgs_copy_by_uid{ @h1_msgs_no_cache } = ( ) ; - @h1_msgs_no_cache = ( ) ; - @h2_msgs_no_cache = ( ) ; - } - - $debug and print "Host1 folder [$h1_fold] parsing headers\n"; - - my ($h1_heads_ref, $h1_fir_ref) = ({}, {}); - $h1_heads_ref = $imap1->parse_headers([@h1_msgs_no_cache], @useheader) if (@h1_msgs_no_cache); - $debug and print "Time headers: ", timenext(), " s\n"; - - @$h1_fir_ref{@h1_msgs} = (undef); - $h1_fir_ref = $imap1->fetch_hash_2("FLAGS", "INTERNALDATE", "RFC822.SIZE", $h1_fir_ref) - if (@h1_msgs); - $debug and print "Time fir: ", timenext(), " s\n"; - unless ($h1_fir_ref) { - warn - "Host1 folder $h1_fold: Could not fetch_hash_2 ", - scalar(@h1_msgs), " msgs: ", $imap1->LastError, "\n"; - $nb_errors++; - next FOLDER; - } - - my @h1_msgs_duplicate; - foreach my $m (@h1_msgs_no_cache) { - my $rc = parse_header_msg($imap1, $m, $h1_heads_ref, $h1_fir_ref, "F", \%h1_hash); - if (! defined($rc)) { - my $h1_size = $h1_fir_ref->{$m}->{"RFC822.SIZE"} || 0; - print "+ Skipping msg #$m:$h1_size on host1 folder $h1_fold (no header so we ignore this message)\n"; - $total_bytes_skipped += $h1_size; - $nb_msg_skipped += 1; - $h1_nb_msg_noheader +=1; - } elsif(0 == $rc) { - # duplicate - push(@h1_msgs_duplicate, $m); - # duplicate, same id same size? - my $h1_size = $h1_fir_ref->{$m}->{"RFC822.SIZE"} || 0; - $nb_msg_skipped += 1; - $h1_total_bytes_duplicate += $h1_size; - $h1_nb_msg_duplicate += 1; - } - } - $debug and print "Time parsing headers on host1: ", timenext(), " s\n"; - - $debug and print "Host2 folder [$h2_fold] parsing headers\n"; - - my ($h2_heads_ref, $h2_fir_ref) = ( {}, {} ); - $h2_heads_ref = $imap2->parse_headers([@h2_msgs_no_cache], @useheader) if (@h2_msgs_no_cache); - $debug and print "Time headers: ", timenext(), " s\n"; - - @$h2_fir_ref{@h2_msgs} = ( ); # fetch_hash_2 can select by uid with last arg as ref - $h2_fir_ref = $imap2->fetch_hash_2("FLAGS", "INTERNALDATE", "RFC822.SIZE", $h2_fir_ref) - if (@h2_msgs); - $debug and print "Time fir: ", timenext(), " s\n"; - - my @h2_msgs_duplicate; - foreach my $m (@h2_msgs_no_cache) { - my $rc = parse_header_msg($imap2, $m, $h2_heads_ref, $h2_fir_ref, "T", \%h2_hash); - my $h2_size = $h2_fir_ref->{$m}->{"RFC822.SIZE"} || 0; - if (! defined($rc)) { - print "+ Skipping msg #$m:$h2_size in host2 folder $h2_fold (no header so we ignore this message)\n"; - $h2_nb_msg_noheader += 1 ; - } elsif(0 == $rc) { - # duplicate - $h2_nb_msg_duplicate += 1; - $h2_total_bytes_duplicate += $h2_size; - push(@h2_msgs_duplicate, $m); - } - } - $debug and print "Time parsing headers on host2: ", timenext(), " s\n"; - - $debug and print "++++ Verifying [$h1_fold] -> [$h2_fold]\n"; - # messages in host1 that are not in host2 - - my @h1_hash_keys_sorted_by_uid - = sort {$h1_hash{$a}{'m'} <=> $h1_hash{$b}{'m'}} keys(%h1_hash); - - #print map { $h1_hash{$_}{'m'} . " "} @h1_hash_keys_sorted_by_uid; - - my @h2_hash_keys_sorted_by_uid - = sort {$h2_hash{$a}{'m'} <=> $h2_hash{$b}{'m'}} keys(%h2_hash); - - - if($delete2) { - my @h2_expunge; - foreach my $m_id (@h2_hash_keys_sorted_by_uid) { - #print "$m_id "; - unless (exists($h1_hash{$m_id})) { - my $h2_msg = $h2_hash{$m_id}{'m'}; - my $h2_flags = $h2_hash{$m_id}{'F'} || ""; - my $isdel = $h2_flags =~ /\B\\Deleted\b/ ? 1 : 0; - print "msg $h2_fold/$h2_msg deleted on host2 [$m_id]\n" - if ! $isdel; - push(@h2_expunge, $h2_msg) if $uidexpunge2; - unless ($dry or $isdel) { - $imap2->delete_message($h2_msg); - $h2_nb_msg_deleted += 1; - } - } - } - foreach my $h2_msg (@h2_msgs_duplicate) { - print "msg $h2_fold/$h2_msg deleted [duplicate] on host2\n"; - push(@h2_expunge, $h2_msg) if $uidexpunge2; - unless ($dry) { - $imap2->delete_message($h2_msg); - $h2_nb_msg_deleted += 1; - } - } - - my $cnt = scalar @h2_expunge; - if(@h2_expunge and !$imap2->can("uidexpunge")) { - warn "uidexpunge not supported (< IMAPClient 3.17)\n"; - } - elsif(@h2_expunge) { - print "uidexpunge $cnt message(s)\n"; - $imap2->uidexpunge(\@h2_expunge) if !$dry; - } - } - - my $h2_uidnext = $imap2->uidnext( $h2_fold ) ; - $h2_uidguess = $h2_uidnext ; - MESS: foreach my $m_id (@h1_hash_keys_sorted_by_uid) { - my $h1_size = $h1_hash{$m_id}{'s'}; - my $h1_msg = $h1_hash{$m_id}{'m'}; - my $h1_idate = $h1_hash{$m_id}{'D'}; - - if (defined $maxsize and $h1_size >= $maxsize) { - print "msg $h1_fold/$h1_msg skipping ($h1_size exceeds maxsize limit $maxsize bytes)\n"; - $total_bytes_skipped += $h1_size; - $nb_msg_skipped += 1; - next MESS; - } - if (defined $minsize and $h1_size <= $minsize) { - print "msg $h1_fold/$h1_msg skipping ($h1_size smaller than minsize $minsize bytes)\n"; - $total_bytes_skipped += $h1_size; - $nb_msg_skipped += 1; - next MESS; - } - - unless (exists($h2_hash{$m_id})) { - # copy - copy_message( $h1_msg, $h1_fold, $h2_fold, $h1_fir_ref, $permanentflags2, $cache_dir ) ; - next MESS; - } - else{ - # already on host2 - my $h2_msg = $h2_hash{$m_id}{'m'} ; - $debug and print "msg $h1_fold/$h1_msg equals $h2_fold/$h2_msg\n" ; - $total_bytes_skipped += $h1_size ; - $nb_msg_skipped += 1 ; - $debugcache and print "touch $cache_dir/${h1_msg}_$h2_msg\n" if ( $usecache ) ; - touch( "$cache_dir/${h1_msg}_$h2_msg" ) if ( $usecache ) ; - } - - #$debug and print "MESSAGE $m_id\n"; - my $h2_msg = $h2_hash{$m_id}{'m'}; - - sync_flags( $h1_msg, $h2_msg, $h2_fold, $permanentflags2, $h1_fir_ref, $h2_fir_ref ) ; - - # Good - my $h2_size = $h2_hash{$m_id}{'s'}; - $debug and print - "msg $h1_fold/$h1_msg sizes $h1_size <> $h2_size $h2_fold/$h2_msg\n"; - if( $delete ) { - print "msg $h1_fold/$h1_msg deleted on host1\n"; - unless( $dry ) { - $imap1->delete_message( $h1_msg ); - $h1_nb_msg_deleted += 1; - $imap1->expunge() if ( $expunge ); - } - } - - } - # END MESS: loop - MESS_IN_CACHE: foreach my $h1_msg ( @h1_msgs_in_cache ) { - my $h2_msg = $cache_1_2_ref->{ $h1_msg } ; - $debugcache and print "cache messages update $h1_msg->$h2_msg\n"; - sync_flags( $h1_msg, $h2_msg, $h2_fold, $permanentflags2, $h1_fir_ref, $h2_fir_ref ) ; - my $h1_size = $h1_fir_ref->{ $h1_msg }->{ 'RFC822.SIZE' } ; - $total_bytes_skipped += $h1_size; - $nb_msg_skipped += 1; - } - - MESS_BY_UID: foreach my $h1_msg ( sort { $a <=> $b } keys %h1_msgs_copy_by_uid ) { - # copy_message - #print "Copy by uid $h1_fold/$h1_msg\n" ; - copy_message( $h1_msg, $h1_fold, $h2_fold, $h1_fir_ref, $permanentflags2, $cache_dir ) ; - - } - - if ($expunge1){ - print "Expunging host1 folder $h1_fold\n"; - unless($dry) { $imap1->expunge() }; - } - if ($expunge2){ - print "Expunging host2 folder $h2_fold\n"; - unless($dry) { $imap2->expunge() }; - } - -$debug and print "Time: ", timenext(), " s\n"; -} - -sub sync_flags { - my ( $h1_msg, $h2_msg, $h2_fold, $permanentflags2, $h1_fir_ref, $h2_fir_ref ) = @_ ; - $debug and print "sync flags $h1_msg->$h2_msg\n"; - - # used cached flag values for efficiency - my $h1_flags = $h1_fir_ref->{ $h1_msg }->{ "FLAGS" } ; - my $h2_flags = $h2_fir_ref->{ $h2_msg }->{ "FLAGS" } ; - - # RFC 2060: This flag can not be altered by any client - $h1_flags =~ s@\\Recent\s?@@gi; - $h1_flags = flags_regex($h1_flags) if @regexflag; - $h1_flags = flags_filter($h1_flags, $permanentflags2) if ( $permanentflags2 ); - - # compare flags - set flags if there a difference - my @h1_flags = sort split(' ', $h1_flags ); - my @h2_flags = sort split(' ', $h2_flags ); - my $diff = compare_lists( \@h1_flags, \@h2_flags ); - - #$diff = 1 ; - $diff and $debug and print "msg $h2_fold/$h2_msg replacing h2 flags( $h2_flags ) with h1 flags( $h1_flags )\n"; - # This sets flags so flags can be removed with this - # When you remove a \Seen flag on host1 you want to it - # to be removed on host2. Just add flags is not what - # we need most of the time. - - if ( ! $dry and $diff and ! $imap2->store( $h2_msg, "FLAGS.SILENT (@h1_flags)" ) ) { - warn "- msg $h2_fold/$h2_msg could not add flags @h1_flags", - $imap2->LastError, "\n"; - #$nb_errors++; - } -} - -print "++++ End looping on each folder\n"; -#print memory_consumption(); - - -$imap1->logout(); -$imap2->logout(); - - -stats(); -exit_clean(1) if( $nb_errors ); -exit_clean(0); - -# END of main program - -# subroutines - -sub max { - return(undef) if (0 == scalar(@_)); - my @sorted = sort { $a <=> $b } @_; - return(pop(@sorted)); -} - -sub tests_max { - ok(0 == max(0), "max 0"); - ok(1 == max(1), "max 1"); - ok(-1 == max(-1), "max -1"); - ok(! defined(max()), "max no arg"); - ok(100 == max(1, 100), "max 1 100"); - ok(100 == max(100, 1), "max 100 1"); - ok(100 == max(100, 42, 1), "max 100 42 1"); - ok(100 == max(100, "42", 1), "max 100 42 1"); - ok(100 == max("100", "42", 1), "max 100 42 1"); - #ok(100 == max(100, "haha", 1), "max 100 42 1"); -} - -sub check_lib_version { - $debug and print "IMAPClient $Mail::IMAPClient::VERSION\n"; - if ($Mail::IMAPClient::VERSION eq '2.2.9') { - override_imapclient(); - return(1); - } - else{ - # 3.x.x is no longer buggy with imapsync. - if ($allow3xx) { - return(1); - }else{ - return(0); - } - } -} - -sub modules_VERSION { - - my @list_version; - - foreach my $module (qw( -Mail::IMAPClient -IO::Socket -IO::Socket::SSL -Digest::MD5 -Digest::HMAC_MD5 -Term::ReadKey -Authen::NTLM)) - { - my $v = "?"; - - if (eval "require $module") { - # module is here - $v = eval "\$${module}::VERSION"; - }else{ - # no module - $v = "?"; - } - #print ("$module ", $v, "\n"); - push (@list_version, sprintf("%-20s %s\n", $module, $v)); - } - return(@list_version); -} - -# Construct a command line copy with passwords replaced by MASKED. -sub command_line_nopassword { - my @argv_copy = @_; - my @argv_nopassword; - while (@argv_copy) { - my $arg = shift(@argv_copy); # option name or value - if ($arg =~ m/-password[12]/) { - shift(@argv_copy); # password value - push(@argv_nopassword, $arg, "MASKED"); # option name and fake value - }else{ - push(@argv_nopassword, $arg); # same option or value - } - } - return("@argv_nopassword"); -} - -sub tests_command_line_nopassword { - - ok('' eq command_line_nopassword(), 'command_line_nopassword void'); - ok('--blabla' eq command_line_nopassword('--blabla'), 'command_line_nopassword --blabla'); - #print command_line_nopassword((qw{ --password1 secret1 })), "\n"; - ok('--password1 MASKED' eq command_line_nopassword(qw{ --password1 secret1}), 'command_line_nopassword --password1'); - ok('--blabla --password1 MASKED --blibli' - eq command_line_nopassword(qw{ --blabla --password1 secret1 --blibli }), 'command_line_nopassword --password1 --blibli'); - - -} - -sub ask_for_password { - my ($user, $host) = @_; - print "What's the password for $user\@$host? "; - Term::ReadKey::ReadMode(2); - my $password = <>; - chomp $password; - printf "\n"; - Term::ReadKey::ReadMode(0); - return $password; -} - -sub catch_exit { - my $signame = shift ; - print "\nGot a SIG$signame!\n" ; - stats( ) ; - exit_clean( ) ; -} - -sub catch_continue { - my $signame = shift ; - print "\nGot a SIG$signame!\n" ; -} - -sub myconnect { - my $self = shift; - - $debug and print "Entering myconnect\n"; - %$self = (%$self, @_); - - my $sock = (($self->Ssl) ? IO::Socket::SSL->new : IO::Socket::INET->new); - my $dp = ($self->Ssl ? 'imaps(993)' : 'imap(143)'); - - $debug and print "Calling configure\n"; - my $ret = $sock->configure({ - PeerAddr => $self->Server , - PeerPort => $self->Port||$dp , - Proto => 'tcp' , - Timeout => $self->Timeout||0 , - Debug => $self->Debug , - }); - unless ( defined($ret) ) { - $self->LastError( "$@\n"); - $@ = "$@"; - carp "$@" - unless defined wantarray; - return undef; - } - $sock->autoflush(1); - - my $banner = $sock->getline(); - $debug and print "Read: $banner"; - - $self->Banner($banner); - $self->RawSocket2($sock); - $self->State(Connected); - - if ($self->Tls) { - starttls($self); - } - - $self->Ignoresizeerrors($allowsizemismatch); - - if ($self->User and $self->Password) { - $debug and print "Calling login\n"; - return $self->login ; - } - else { - return $self; - } -} - - - - -sub starttls { - my $self = shift; - my $socket = $self->RawSocket2(); - - $debug and print "Entering starttls\n"; - unless ($self->has_capability("STARTTLS")) { - die_clean( "No STARTTLS capability" ); - } - print $socket, "\n"; - print $socket "z00 STARTTLS\015\012"; - CORE::select( undef, undef, undef, 0.025 ); - my $txt = $socket->getline(); - $debug and print "Read tls: $txt"; - unless($txt =~ /^z00 OK/){ - die_clean( "Invalid response for STARTTLS: $txt\n" ); - } - $debug and print "Calling start_SSL\n"; - unless(IO::Socket::SSL->start_SSL($socket, - { - SSL_version => "TLSV1", - SSL_startHandshake => 1, - SSL_verify_depth => 1, - })) - { - die_clean( "Couldn't start TLS: ".IO::Socket::SSL::errstr()."\n"); - } - if (ref($socket) ne "IO::Socket::SSL") { - die_clean( "Socket has NOT been converted to SSL"); - }else{ - $debug and print "Socket successfuly converted to SSL\n"; - } - $debug and print "Ending starttls\n"; -} - - - -sub connect_imap { - my($host, $port, $debugimap, $ssl, $tls) = @_; - my $imap = Mail::IMAPClient->new(); - $imap->Ssl($ssl) if ($ssl); - $imap->Tls($tls) if ($tls); - $imap->Server($host); - $imap->Port($port); - $imap->Debug($debugimap); - #$imap->connect() - myconnect($imap) - or die_clean("Can not open imap connection on [$host]: $@\n"); -} - -sub justconnect { - my $imap1 = (); - my $imap2 = (); - - $imap1 = connect_imap($host1, $port1, $debugimap1, $ssl1, $tls1); - print "Host1 software: ", server_banner($imap1); - print "Host1 capability: ", join(" ", $imap1->capability()), "\n"; - $imap2 = connect_imap($host2, $port2, $debugimap2, $ssl2, $tls2); - print "Host2 software: ", server_banner($imap2); - print "Host2 capability: ", join(" ", $imap2->capability()), "\n"; - $imap1->logout(); - $imap2->logout(); - -} - - -sub login_imap { - my($host, $port, $user, $domain, $password, - $debugimap, $timeout, $fastio, - $ssl, $tls, $authmech, $authuser, $reconnectretry, - $proxyauth, $uid) = @_; - my ($imap); - - $imap = Mail::IMAPClient->new(); - - $imap->Ssl($ssl) if ($ssl); - $imap->Tls($tls) if ($tls); - $imap->Clear(1); - $imap->Server($host); - $imap->Port($port); - $imap->Fast_io($fastio); - $imap->Buffer($buffersize || 4096); - $imap->Uid($uid); - #$imap->Uid(0); - $imap->Peek(1); - $imap->Debug($debugimap); - $timeout and $imap->Timeout($timeout); - - $imap->Reconnectretry($reconnectretry) if ($reconnectretry); - - #$imap->connect() - myconnect($imap) - or die_clean("Can not open imap connection on [$host] with user [$user]: $@\n"); - - print "Banner: ", server_banner($imap); - - if ($imap->has_capability("AUTH=$authmech") - or $imap->has_capability($authmech) - ) { - printf("Host %s says it has CAPABILITY for AUTHENTICATE %s\n", - $imap->Server, $authmech); - } - else { - printf("Host %s says it has NO CAPABILITY for AUTHENTICATE %s\n", - $imap->Server, $authmech); - if ($authmech eq 'PLAIN') { - print "Frequently PLAIN is only supported with SSL, ", - "try --ssl1 or --ssl2 option\n"; - } - } - - if ($proxyauth) { - $imap->Authmechanism(""); - } else { - $imap->Authmechanism($authmech) unless ($authmech eq 'LOGIN'); - } - - $imap->Authcallback(\&plainauth) if $authmech eq "PLAIN"; - - - if ($proxyauth) { - $imap->User($authuser); - $imap->Domain($domain) if (defined($domain)); - $imap->Authuser($authuser); - $imap->Password($password); - } else { - $imap->User($user); - $imap->Domain($domain) if (defined($domain)); - $imap->Authuser($authuser); - $imap->Password($password); - } - - unless ($imap->login()) { - my $info = "Error login: [$host] with user [$user] auth"; - my $einfo = $imap->LastError || @{$imap->History}[-1]; - chomp($einfo); - my $error = "$info [$authmech]: $einfo\n"; - print $error; # note: duplicating error on stdout/stderr - die_clean($error) if ($authmech eq 'LOGIN' or $imap->IsUnconnected() or $authuser); - print "Trying LOGIN Auth mechanism on [$host] with user [$user]\n"; - $imap->Authmechanism(""); - $imap->login() or - die_clean("$info [LOGIN]: ", $imap->LastError, "\n"); - } - $proxyauth && $imap->proxyauth($user); - - print "Success login on [$host] with user [$user] auth [$authmech]\n"; - return($imap); -} - - -sub plainauth() { - my $code = shift; - my $imap = shift; - - my $string = sprintf("%s\x00%s\x00%s", $imap->User, - $imap->Authuser, $imap->Password); - return encode_base64("$string", ""); -} - - -sub server_banner { - my $imap = shift; - my $banner = $imap->Banner() || "No banner\n"; - return $banner; - } - - -sub banner_imapsync { - - my @argv_copy = @_; - my $banner_imapsync = join("", - '$RCSfile: imapsync,v $ ', - '$Revision: 1.404 $ ', - '$Date: 2011/02/21 03:35:39 $ ', - "\n",localhost_info(), "\n", - "Command line used:\n", - "$0 ", command_line_nopassword(@argv_copy), "\n", - ); -} - -sub is_valid_directory { - my $dir = shift; - return(1) if (-d $dir and -r _ and -w _); - # Trying to create it - mkpath($dir) or die "Error creating tmpdir $tmpdir : $!"; - die "Error with tmpdir $tmpdir : $!" if not (-d $dir and -r _ and -w _); - return(1); -} - - -sub write_pidfile { - my $pidfile = shift; - - print "PID file is $pidfile\n"; - if (-e $pidfile) { - warn "$pidfile already exists, overwriting it\n"; - } - open(PIDFILE, ">$pidfile") or do { - warn "Could not open $pidfile for writing"; - return undef; - }; - - print PIDFILE $PROCESS_ID; - close PIDFILE; - return($PROCESS_ID); -} - -sub exit_clean { - my $status = shift; - $status = defined( $status ) ? $status : 1 ; - unlink($pidfile); - exit($status); -} - -sub die_clean { - - unlink($pidfile); - die @_; -} - -sub missing_option { - my ($option) = @_; - die_clean("$option option must be used, run $0 --help for help\n"); -} - - -sub select_folder { - my ($imap, $folder, $hostside) = @_; - if ( ! $imap->select($folder)) { - warn - "$hostside folder $folder: Could not select: ", - $imap->LastError, "\n"; - $nb_errors++; - return(0); - }else{ - # ok select succeeded - return(1); - } -} - - -sub create_folder { - my ($imap, $folder, $hostside) = @_; - print "$hostside folder $folder does not exist\n"; - print "Creating folder [$folder]\n"; - if ( ! $dry){ - if ( ! $imap->create($folder)){ - warn "Couldn't create [$folder] on $hostside: ", - $imap->LastError,"\n"; - $nb_errors++; - return(0); - }else{ - #create succeeded - return(1); - } - }else{ - # dry mode, no folder so many imap will fail, assuming failure - return(0); - } -} - - - -sub tests_folder_routines { - ok( !is_requested_folder('folder_foo') ); - ok( add_to_requested_folders('folder_foo') ); - ok( is_requested_folder('folder_foo') ); - ok( !is_requested_folder('folder_NO_EXIST') ); - ok( !remove_from_requested_folders('folder_foo'), "removed folder_foo"); - ok( !is_requested_folder('folder_foo') ); - my @f; - ok( @f = add_to_requested_folders('folder_bar', 'folder_toto'), "add result: @f"); - ok( is_requested_folder('folder_bar') ); - ok( is_requested_folder('folder_toto') ); - ok( remove_from_requested_folders('folder_toto') ); - ok( !is_requested_folder('folder_toto') ); -} - - -sub is_requested_folder { - my ( $folder ) = @_; - - defined( $requested_folder{ $folder } ); -} - - -sub add_to_requested_folders { - my @wanted_folders = @_; - - foreach my $folder ( @wanted_folders ) { - ++$requested_folder{ $folder }; - } - return( keys( %requested_folder ) ); -} - -sub remove_from_requested_folders { - my @wanted_folders = @_; - - foreach my $folder (@wanted_folders) { - delete $requested_folder{$folder}; - } - return( keys(%requested_folder) ); -} - -sub compare_lists { - my ($list_1_ref, $list_2_ref) = @_; - - return(-1) if ((not defined($list_1_ref)) and defined($list_2_ref)); - return(0) if ((not defined($list_1_ref)) and not defined($list_2_ref)); # end if no list - return(1) if (not defined($list_2_ref)); # end if only one list - - if (not ref($list_1_ref)) {$list_1_ref = [$list_1_ref]}; - if (not ref($list_2_ref)) {$list_2_ref = [$list_2_ref]}; - - - my $last_used_indice = -1; - #print "\$#$list_1_ref:", $#$list_1_ref, "\n"; - #print "\$#$list_2_ref:", $#$list_2_ref, "\n"; - ELEMENT: - foreach my $indice ( 0 .. $#$list_1_ref ) { - $last_used_indice = $indice; - - # End of list_2 - return 1 if ($indice > $#$list_2_ref); - - my $element_list_1 = $list_1_ref->[$indice]; - my $element_list_2 = $list_2_ref->[$indice]; - my $balance = $element_list_1 cmp $element_list_2 ; - next ELEMENT if ($balance == 0) ; - return $balance; - } - # each element equal until last indice of list_1 - return -1 if ($last_used_indice < $#$list_2_ref); - - # same size, each element equal - return 0 -} - -sub tests_compare_lists { - - - my $empty_list_ref = []; - - ok( 0 == compare_lists() , 'compare_lists, no args'); - ok( 0 == compare_lists(undef) , 'compare_lists, undef = nothing'); - ok( 0 == compare_lists(undef, undef) , 'compare_lists, undef = undef'); - ok(-1 == compare_lists(undef , []) , 'compare_lists, undef < []'); - ok(-1 == compare_lists(undef , [1]) , 'compare_lists, undef < [1]'); - ok(-1 == compare_lists(undef , [0]) , 'compare_lists, undef < [0]'); - ok(+1 == compare_lists([]) , 'compare_lists, [] > nothing'); - ok(+1 == compare_lists([], undef) , 'compare_lists, [] > undef'); - ok( 0 == compare_lists([] , []) , 'compare_lists, [] = []'); - - ok(-1 == compare_lists([] , [1]) , 'compare_lists, [] < [1]'); - ok(+1 == compare_lists([1] , []) , 'compare_lists, [1] > []'); - - - ok( 0 == compare_lists([1], 1 ) , "compare_lists, [1] = 1 ") ; - ok( 0 == compare_lists( 1 , [1]) , "compare_lists, 1 = [1]") ; - ok( 0 == compare_lists( 1 , 1 ) , "compare_lists, 1 = 1 ") ; - ok(-1 == compare_lists( 0 , 1 ) , "compare_lists, 0 < 1 ") ; - ok(-1 == compare_lists(-1 , 0 ) , "compare_lists, -1 < 0 ") ; - ok(-1 == compare_lists( 1 , 2 ) , "compare_lists, 1 < 2 ") ; - ok(+1 == compare_lists( 2 , 1 ) , "compare_lists, 2 > 1 ") ; - - - ok( 0 == compare_lists([1,2], [1,2]) , "compare_lists, [1,2] = [1,2]") ; - ok(-1 == compare_lists([1], [1,2]) , "compare_lists, [1] < [1,2]") ; - ok(+1 == compare_lists([2], [1,2]) , "compare_lists, [2] > [1,2]") ; - ok(-1 == compare_lists([1], [1,1]) , "compare_lists, [1] < [1,1]") ; - ok(+1 == compare_lists([1, 1], [1]) , "compare_lists, [1, 1] > [1]") ; - ok( 0 == compare_lists([1 .. 20_000] , [1 .. 20_000]) - , "compare_lists, [1..20_000] = [1..20_000]") ; - ok(-1 == compare_lists([1], [3]) , 'compare_lists, [1] < [3]') ; - ok( 0 == compare_lists([2], [2]) , 'compare_lists, [0] = [2]') ; - ok(+1 == compare_lists([3], [1]) , 'compare_lists, [3] > [1]') ; - - ok(-1 == compare_lists(["a"], ["b"]) , 'compare_lists, ["a"] < ["b"]') ; - ok( 0 == compare_lists(["a"], ["a"]) , 'compare_lists, ["a"] = ["a"]') ; - ok( 0 == compare_lists(["ab"], ["ab"]) , 'compare_lists, ["ab"] = ["ab"]') ; - ok(+1 == compare_lists(["b"], ["a"]) , 'compare_lists, ["b"] > ["a"]') ; - ok(-1 == compare_lists(["a"], ["aa"]) , 'compare_lists, ["a"] < ["aa"]') ; - ok(-1 == compare_lists(["a"], ["a", "a"]), 'compare_lists, ["a"] < ["a", "a"]') ; - ok( 0 == compare_lists([split(" ", "a b")], ["a", "b"]), 'compare_lists, split') ; - ok( 0 == compare_lists([sort split(" ", "b a")], ["a", "b"]), 'compare_lists, sort split') ; -} - - - -sub get_prefix { - my($imap, $prefix_in, $prefix_opt) = @_; - my($prefix_out); - - $debug and print "Getting prefix namespace\n"; - if (defined($prefix_in)) { - print "Using [$prefix_in] given by $prefix_opt\n"; - $prefix_out = $prefix_in; - return($prefix_out); - } - $debug and print "Calling namespace capability\n"; - if ($imap->has_capability("namespace")) { - my $r_namespace = $imap->namespace(); - $prefix_out = $r_namespace->[0][0][0]; - return($prefix_out); - } - else{ - print - "No NAMESPACE capability in imap server ", - $imap->Server(),"\n", - help_to_guess_prefix($imap, $prefix_opt); - exit_clean(1); - } -} - - -sub get_separator { - my($imap, $sep_in, $sep_opt) = @_; - my($sep_out); - - - if ($sep_in) { - print "Using [$sep_in] given by $sep_opt\n"; - $sep_out = $sep_in; - return($sep_out); - } - $debug and print "Calling namespace capability\n"; - if ($imap->has_capability("namespace")) { - $sep_out = $imap->separator(); - return($sep_out) if defined $sep_out; - print - "NAMESPACE request failed for ", - $imap->Server(), ": ", $imap->LastError, "\n"; - exit_clean(1); - } - else{ - print - "No NAMESPACE capability in imap server ", - $imap->Server(),"\n", - help_to_guess_sep($imap, $sep_opt); - exit_clean(1); - } -} - -sub help_to_guess_sep { - my($imap, $sep_opt) = @_; - - my $help = "Give the separator character with the $sep_opt option,\n" - . "the folowing listing of folders may help you to find it:\n" - . folders_list_to_help($imap) - . "Most of the time it is character . or /\n" - . "so try $sep_opt . or $sep_opt /\n"; - - return($help); -} - -sub help_to_guess_prefix { - my($imap, $prefix_opt) = @_; - - my $help = "Give the prefix namespace with the $prefix_opt option,\n" - . "the folowing listing of folders may help you to find it:\n" - . folders_list_to_help($imap) - . "Most of the time it is INBOX. or an empty string\n" - . "so try $prefix_opt INBOX. or $prefix_opt ''\n"; - - return($help); -} - - -sub folders_list_to_help { - my($imap) = @_; - - my @folders = $imap->folders; - my $listing = join('', map { "[$_]\n" } @folders); - return $listing; - -} - -sub separator_invert { - # The separator we hope we'll never encounter: 00000000 - my $o_sep="\000"; - - my($h1_fold, $h1_sep, $h2_sep) = @_; - - my $h2_fold = $h1_fold; - $h2_fold =~ s@\Q$h2_sep@$o_sep@g; - $h2_fold =~ s@\Q$h1_sep@$h2_sep@g; - $h2_fold =~ s@\Q$o_sep@$h1_sep@g; - return($h2_fold); -} - - -sub tests_imap2_folder_name { - -$h1_prefix = $h2_prefix = ''; -$h1_sep = '/'; -$h2_sep = '.'; - -$debug and print -"prefix1: [$h1_prefix] -prefix2: [$h2_prefix] -sep1:[$h1_sep] -sep2:[$h2_sep] -"; - -ok('' eq imap2_folder_name(''), 'imap2_folder_name: empty string'); -ok('blabla' eq imap2_folder_name('blabla'), 'imap2_folder_name: blabla'); -ok('spam.spam' eq imap2_folder_name('spam/spam'), 'imap2_folder_name: spam/spam'); -ok('spam/spam' eq imap2_folder_name('spam.spam'), 'imap2_folder_name: spam.spam'); -ok('spam.spam/spam' eq imap2_folder_name('spam/spam.spam'), 'imap2_folder_name: spam/spam.spam'); -@regextrans2 = ('s,/,X,g'); -ok('' eq imap2_folder_name(''), 'imap2_folder_name: empty string [s,/,X,g]'); -ok('blabla' eq imap2_folder_name('blabla'), 'imap2_folder_name: blabla [s,/,X,g]'); -ok('spam.spam' eq imap2_folder_name('spam/spam'), 'imap2_folder_name: spam/spam [s,/,X,g]'); -ok('spamXspam' eq imap2_folder_name('spam.spam'), 'imap2_folder_name: spam.spam [s,/,X,g]'); -ok('spam.spamXspam' eq imap2_folder_name('spam/spam.spam'), 'imap2_folder_name: spam/spam.spam [s,/,X,g]'); - -@regextrans2 = ('s, ,_,g'); -ok('blabla' eq imap2_folder_name('blabla'), 'imap2_folder_name: blabla [s, ,_,g]'); -ok('bla_bla' eq imap2_folder_name('bla bla'), 'imap2_folder_name: blabla [s, ,_,g]'); - -@regextrans2 = ('s,(.*),\U$1,'); -ok('BLABLA' eq imap2_folder_name('blabla'), 'imap2_folder_name: blabla [s,\U(.*)\E,$1,]'); - - -} - -sub imap2_folder_name { - my ($h2_fold); - my ($x_fold) = @_; - # first we remove the prefix - $x_fold =~ s/^\Q$h1_prefix\E//; - $debug and print "removed host1 prefix: [$x_fold]\n"; - $h2_fold = separator_invert($x_fold,$h1_sep, $h2_sep); - $debug and print "inverted separators: [$h2_fold]\n"; - # Adding the prefix supplied by namespace or the --prefix2 option - $h2_fold = $h2_prefix . $h2_fold - unless(($h2_prefix eq "INBOX" . $h2_sep) and ($h2_fold =~ m/^INBOX$/i)); - $debug and print "added host2 prefix: [$h2_fold]\n"; - - # Transforming the folder name by the --regextrans2 option(s) - foreach my $regextrans2 (@regextrans2) { - my $h2_fold_before = $h2_fold; - eval("\$h2_fold =~ $regextrans2"); - $debug and print "[$h2_fold_before] -> [$h2_fold] using re [$regextrans2]\n"; - die_clean("error: eval regextrans2 '$regextrans2': $@\n") if $@; - } - return($h2_fold); -} - - -sub foldersizes { - - my ($side, $imap, @folders) = @_; - my $tot = 0; - my $tmess = 0; - my $biggest = 0 ; - - print "++++ Calculating sizes\n"; - foreach my $folder (@folders) { - my $stot = 0; - my $smess = 0; - printf("$side folder %-35s", "[$folder]"); - unless($imap->exists($folder)) { - print("does not exist yet\n"); - next; - } - unless ($imap->examine($folder)) { - warn - "$side Folder $folder: Could not examine: ", - $imap->LastError, "\n"; - $nb_errors++; - next; - } - - my $hash_ref = {}; - my @msgs = select_msgs($imap); - $smess = scalar(@msgs); - my $smax = 0 ; - @$hash_ref{@msgs} = (undef); - unless ($smess == 0) { - $imap->fetch_hash_2("RFC822.SIZE",$hash_ref) or die_clean("$@"); - #print map {$hash_ref->{$_}->{"RFC822.SIZE"}, " "} keys %$hash_ref; - map {$stot += $hash_ref->{$_}->{"RFC822.SIZE"}} keys %$hash_ref ; - $smax = max( map {$hash_ref->{$_}->{"RFC822.SIZE"}} keys %$hash_ref ); - $biggest = max( $biggest, $smax ); - } - - printf(" Size: %9s", $stot); - printf(" Messages: %5s", $smess); - printf(" Biggest: %9s\n", $smax); - $tot += $stot; - $tmess += $smess; - } - printf ("Nb messages: %11s\n", $tmess ) ; - printf ("Total size: %11s bytes\n", $tot ) ; - printf ("Biggest message: %11s bytes\n", $biggest ) ; - printf ("Time: %11s secondes\n", timenext( ) ) ; -} - -sub timenext { - my ($timenow, $timerel); - # $timebefore is global, beurk ! - $timenow = time; - $timerel = $timenow - $timebefore; - $timebefore = $timenow; - return($timerel); -} - - -sub tests_flags_regex { - - my $string; - ok('' eq flags_regex(''), "flags_regex, null string ''"); - ok('\Seen NonJunk $Spam' eq flags_regex('\Seen NonJunk $Spam'), 'flags_regex, nothing to do'); - ok('\Seen NonJunk $Spam' eq flags_regex('\Seen NonJunk $Spam'), 'flags_regex,'); - @regexflag = ('s/NonJunk//g'); - ok('\Seen $Spam' eq flags_regex('\Seen NonJunk $Spam'), "flags_regex, remove NonJunk: 's/NonJunk//g'"); - @regexflag = ('s/\$Spam//g'); - ok('\Seen NonJunk ' eq flags_regex('\Seen NonJunk $Spam'), 'flags_regex, remove $Spam: '."'s/\$Spam//g'"); - - @regexflag = ('s/\\\\Seen//g'); - - ok(' NonJunk $Spam' eq flags_regex('\Seen NonJunk $Spam'), 'flags_regex, remove \Seen: '. "'s/\\\\\\\\Seen//g'"); - - @regexflag = ('s/(\s|^)[^\\\\]\w+//g'); - ok('\Seen \Middle \End' eq flags_regex('\Seen NonJunk \Middle $Spam \End'), 'flags_regex, only \word [' . flags_regex('\Seen NonJunk \Middle $Spam \End'.']')); - ok(' \Seen \Middle \End1' eq flags_regex('Begin \Seen NonJunk \Middle $Spam \End1 End'), 'flags_regex, only \word [' . flags_regex('Begin \Seen NonJunk \Middle $Spam \End1 End'.']')); - - @regexflag = ('s/.*?(Keep1|Keep2|Keep3)/$1 /g'); - ok('Keep1 Keep2 ReB' eq flags_regex('ReA Keep1 REM Keep2 ReB'), "Keep only regex"); - #ok('Keep1 Keep2' eq flags_regex('Keep1 Keep2 Remove1'), "Keep only regex"); - ok('Keep1 Keep2 ' eq flags_regex('REM REM Keep1 Keep2'), "Keep only regex"); - ok('Keep1 Keep2 ' eq flags_regex('Keep1 REM REM Keep2'), "Keep only regex"); - ok('Keep1 Keep2 ' eq flags_regex('REM Keep1 REM REM Keep2'), "Keep only regex"); - ok('Keep1 Keep2 ' eq flags_regex('Keep1 Keep2'), "Keep only regex"); - ok('Keep1 ' eq flags_regex('REM Keep1'), "Keep only regex"); - - @regexflag = ('s/(Keep1|Keep2|Keep3) (?!(Keep1|Keep2|Keep3)).*/$1 /g'); - ok('Keep1 Keep2 ' eq flags_regex('Keep1 Keep2 ReB'), "Keep only regex"); - ok('Keep1 Keep2 ' eq flags_regex('Keep1 Keep2 REM REM REM'), "Keep only regex"); - ok('Keep2 ' eq flags_regex('Keep2 REM REM REM'), "Keep only regex"); - #ok('' eq flags_regex('REM REM'), "Keep only regex"); - - @regexflag = ('s/.*?(Keep1|Keep2|Keep3)/$1 /g', - 's/(Keep1|Keep2|Keep3) (?!(Keep1|Keep2|Keep3)).*/$1 /g'); - ok('Keep1 Keep2 ' eq flags_regex('REM Keep1 REM Keep2 REM'), "Keep only regex"); - ok('Keep1 Keep2 ' eq flags_regex('Keep1 REM Keep2 REM'), "Keep only regex"); - ok('Keep1 Keep2 ' eq flags_regex('REM Keep1 Keep2 REM'), "Keep only regex"); - ok('Keep1 Keep2 ' eq flags_regex('REM Keep1 REM Keep2'), "Keep only regex"); - ok('Keep1 Keep2 Keep3 ' eq flags_regex('REM Keep1 REM Keep2 REM REM Keep3 REM'), "Keep only regex"); - ok('Keep1 ' eq flags_regex('REM REM Keep1 REM REM REM '), "Keep only regex"); - ok('Keep1 Keep3 ' eq flags_regex('RE1 Keep1 RE2 Keep3 RE3 RE4 RE5 '), "Keep only regex"); - - @regexflag = ('s/(.*)/$1 jrdH8u/'); - ok('REM REM REM REM REM jrdH8u' eq flags_regex('REM REM REM REM REM'), "Keep only regex 's/(.*)/\$1 jrdH8u/'"); - @regexflag = ('s/jrdH8u *//'); - ok('REM REM REM REM REM ' eq flags_regex('REM REM REM REM REM jrdH8u'), "Keep only regex s/jrdH8u *//"); - - @regexflag = ( - 's/(.*)/$1 jrdH8u/', - 's/.*?(Keep1|Keep2|Keep3|jrdH8u)/$1 /g', - 's/(Keep1|Keep2|Keep3|jrdH8u) (?!(Keep1|Keep2|Keep3|jrdH8u)).*/$1 /g', - 's/jrdH8u *//' - ); - - ok('Keep1 Keep2 ' eq flags_regex('REM Keep1 REM Keep2 REM'), "Keep only regex 'REM Keep1 REM Keep2 REM'"); - ok('Keep1 Keep2 ' eq flags_regex('Keep1 REM Keep2 REM'), "Keep only regex"); - ok('Keep1 Keep2 ' eq flags_regex('REM Keep1 Keep2 REM'), "Keep only regex"); - ok('Keep1 Keep2 ' eq flags_regex('REM Keep1 REM Keep2'), "Keep only regex"); - ok('Keep1 Keep2 Keep3 ' eq flags_regex('REM Keep1 REM Keep2 REM REM Keep3 REM'), "Keep only regex"); - ok('Keep1 ' eq flags_regex('REM REM Keep1 REM REM REM '), "Keep only regex"); - ok('Keep1 Keep3 ' eq flags_regex('RE1 Keep1 RE2 Keep3 RE3 RE4 RE5 '), "Keep only regex"); - ok('' eq flags_regex('REM REM REM REM REM'), "Keep only regex"); - - @regexflag = ( - 's/(.*)/$1 jrdH8u/', - 's/.*?(\\\\Seen|\\\\Answered|\\\\Flagged|\\\\Deleted|\\\\Draft|jrdH8u)/$1 /g', - 's/(\\\\Seen|\\\\Answered|\\\\Flagged|\\\\Deleted|\\\\Draft|jrdH8u) (?!(\\\\Seen|\\\\Answered|\\\\Flagged|\\\\Deleted|\\\\Draft|jrdH8u)).*/$1 /g', - 's/jrdH8u *//' - ); - - ok('\\Deleted \\Answered ' - eq flags_regex('Blabla $Junk \\Deleted machin \\Answered truc'), "Keep only regex: Exchange case"); - ok('' eq flags_regex(''), "Keep only regex: Exchange case, null string"); - ok('' - eq flags_regex('Blabla $Junk machin truc'), "Keep only regex: Exchange case, no accepted flags "); - ok('\\Deleted \\Answered \\Draft \\Flagged ' - eq flags_regex('\\Deleted \\Answered \\Draft \\Flagged '), "Keep only regex: Exchange case"); - - - @regexflag = ( - 's/.*?(?:(\\\\(?:Answered|Flagged|Deleted|Seen|Draft)\s?)|$)/defined($1)?$1:q()/eg' - ); - - ok('\\Deleted \\Answered ' - eq flags_regex('Blabla \$Junk \\Deleted machin \\Answered truc'), - "Keep only regex: Exchange case (Phil)"); - - ok('' eq flags_regex(''), "Keep only regex: Exchange case, null string (Phil)"); - - ok('' - eq flags_regex('Blabla $Junk machin truc'), - "Keep only regex: Exchange case, no accepted flags (Phil)"); - - ok('\\Deleted \\Answered \\Draft \\Flagged ' - eq flags_regex('\\Deleted \\Answered \\Draft \\Flagged '), - "Keep only regex: Exchange case (Phil)"); - - -} - -sub flags_regex { - my ($h1_flags) = @_; - foreach my $regexflag (@regexflag) { - my $h1_flags_orig = $h1_flags; - $debug and print "eval \$h1_flags =~ $regexflag\n"; - eval("\$h1_flags =~ $regexflag"); - die_clean("error: eval regexflag '$regexflag': $@\n") if $@; - $debug and print "regexflag $regexflag [$h1_flags_orig] -> [$h1_flags]\n"; - } - return($h1_flags); -} - -sub acls_sync { - my($h1_fold, $h2_fold) = @_; - if ($syncacls) { - my $h1_hash = $imap1->getacl($h1_fold) - or warn "Could not getacl for $h1_fold: $@\n"; - my $h2_hash = $imap2->getacl($h2_fold) - or warn "Could not getacl for $h2_fold: $@\n"; - my %users = map({ ($_, 1) } (keys(%$h1_hash), keys(%$h2_hash))); - foreach my $user (sort(keys(%users))) { - my $acl = $h1_hash->{$user} || "none"; - print "acl $user: [$acl]\n"; - next if ($h1_hash->{$user} && $h2_hash->{$user} && - $h1_hash->{$user} eq $h2_hash->{$user}); - unless ($dry) { - print "setting acl $h2_fold $user $acl\n"; - $imap2->setacl($h2_fold, $user, $acl) - or warn "Could not set acl: $@\n"; - } - } - } -} - - -sub tests_permanentflags { - - my $string; - ok('' eq permanentflags(' * OK [PERMANENTFLAGS (\* \Draft \Answered)] Limited'), - 'permanentflags \*'); - ok('\Draft \Answered' eq permanentflags(' * OK [PERMANENTFLAGS (\Draft \Answered)] Limited'), - 'permanentflags \Draft \Answered'); - ok('\Draft \Answered' - eq permanentflags('Blabla', - ' * OK [PERMANENTFLAGS (\Draft \Answered)] Limited', - 'Blabla'), - 'permanentflags \Draft \Answered' - ); - ok('' eq permanentflags('Blabla'), 'permanentflags nothing'); -} - -sub permanentflags { - my @lines = @_; - - foreach my $line (@lines) { - if ($line =~ m{\[PERMANENTFLAGS \(([^)]+?)\)\]}) { - #print "%%%$1%%%\n"; - my $permanentflags = $1; - if ($permanentflags =~ m{\\\*}) { - $permanentflags = ''; - } - return($permanentflags); - }; - } -} - -sub tests_flags_filter { - - ok( '\Seen' eq flags_filter('\Seen', '\Draft \Seen \Answered'), 'flags_filter ' ); - ok( '' eq flags_filter('\Seen', '\Draft \Answered'), 'flags_filter ' ); - ok( '\Seen' eq flags_filter('\Seen', '\Seen'), 'flags_filter ' ); - ok( '\Seen' eq flags_filter('\Seen', ' \Seen '), 'flags_filter ' ); - ok( '\Seen \Draft' - eq flags_filter('\Seen \Draft', '\Draft \Seen \Answered'), 'flags_filter ' ); - ok( '\Seen \Draft' - eq flags_filter('\Seen \Draft', ' \Draft \Seen \Answered '), 'flags_filter ' ); - -} - -sub flags_filter { - my($flags, $allowed_flags) = @_; - - my @flags = split(/\s+/, $flags); - my %allowed_flags = map { $_ => 1 } split(' ', $allowed_flags ); - my @flags_out = map { exists $allowed_flags{$_} ? $_ : () } @flags; - - my $flags_out = join(' ', @flags_out); - #print "%%%$flags_out%%%\n"; - return($flags_out); -} - - - -sub select_msgs { - my ($imap) = @_; - my (@msgs,@max,@min,@union,@inter); - - unless (defined($maxage) or defined($minage)) { - #@msgs = $imap->search("ALL"); - @msgs = $imap->messages(); - return(@msgs); - } - if (defined($maxage)) { - @max = $imap->sentsince(time - 86400 * $maxage); - } - if (defined($minage)) { - @min = $imap->sentbefore(time - 86400 * $minage); - } - SWITCH: { - unless(defined($minage)) {@msgs = @max; last SWITCH}; - unless(defined($maxage)) {@msgs = @min; last SWITCH}; - my (%union, %inter); - foreach my $m (@min, @max) {$union{$m}++ && $inter{$m}++} - @inter = keys(%inter); - @union = keys(%union); - # normal case - if ($minage <= $maxage) {@msgs = @inter; last SWITCH}; - # just exclude messages between - if ($minage > $maxage) {@msgs = @union; last SWITCH}; - - } - return(@msgs); -} - - -sub lastuid { - my $imap = shift ; - my $folder = shift ; - my $lastuid_guess = shift ; - my $lastuid ; - - # rfc3501: The only reliable way to identify recent messages is to - # look at message flags to see which have the \Recent flag - # set, or to do a SEARCH RECENT. - # SEARCH RECENT doesn't work this way on courrier. - - my @recent_messages ; - # SEARCH RECENT for each transfer can be expensive with a big folder - # Call commented for now - #@recent_messages = $imap->recent( ) ; - #print "Recent: @recent_messages\n"; - - my $max_recent ; - $max_recent = max( @recent_messages ) ; - - if ( defined( $max_recent ) and ($lastuid_guess <= $max_recent ) ) { - $lastuid = $max_recent ; - }else{ - $lastuid = $lastuid_guess - } - return( $lastuid ) ; -} - -sub copy_message { - # copy - - my ( $h1_msg, $h1_fold, $h2_fold, $h1_fir_ref, $permanentflags2, $cache_dir ) = @_ ; - $debug and print "msg $h1_fold/$h1_msg copying to $h2_fold\n"; - - my $h1_size = $h1_fir_ref->{$h1_msg}->{"RFC822.SIZE"}; - my $h1_flags = $h1_fir_ref->{$h1_msg}->{"FLAGS"}; - my $h1_idate = $h1_fir_ref->{$h1_msg}->{"INTERNALDATE"}; - - my $string; - $string = $imap1->message_string($h1_msg); - unless (defined($string)) { - warn - "- msg $h1_fold/$h1_msg could not be fetched: ", - $imap1->LastError, "\n"; - $nb_errors++; - $total_bytes_error += $h1_size; - return( ) ; - } - - if (@regexmess) { - $string = regexmess($string); - } - - $debug and print - "=" x80, "\n", - "F message content begin next line\n", - $string, - "F message content ended on previous line\n", "=" x 80, "\n"; - my $h1_date = ""; - if ($syncinternaldates) { - $h1_date = $h1_idate; - $debug and print "internal date from host1: [$h1_date]\n"; - $h1_date = good_date($h1_date); - $debug and print "internal date from host1: [$h1_date] (fixed)\n"; - } - - if ($idatefromheader) { - - $h1_date = $imap1->get_header($h1_msg,"Date"); - $debug and print "header date from host1: [$h1_date]\n"; - $h1_date = good_date($h1_date); - $debug and print "header date from host1: [$h1_date] (fixed)\n"; - } - - # RFC 2060: This flag can not be altered by any client - $h1_flags =~ s@\\Recent\s?@@gi; - $h1_flags = flags_regex($h1_flags) if @regexflag; - - $h1_flags = flags_filter($h1_flags, $permanentflags2) if ($permanentflags2); - - my $new_id; - $debug and print "msg $h1_fold/$h1_msg date [$h1_date] flags [$h1_flags] size [$h1_size]\n"; - $h1_date = undef if ($h1_date eq ""); - - unless ($dry) { - $max_msg_size_in_bytes = max($h1_size, $max_msg_size_in_bytes); - $new_id = $imap2->append_string($h2_fold, $string, $h1_flags, $h1_date); - unless($new_id){ - no warnings 'uninitialized'; - warn "- msg $h1_fold/$h1_msg couldn't append (Subject:[". - $imap1->subject($h1_msg)."]) to folder $h2_fold: ", - $imap2->LastError, "\n"; - $nb_errors++; - $total_bytes_error += $h1_size; - return( ) ; - } - else{ - # good - # $new_id is an id if the IMAP server has the - # UIDPLUS capability else just a ref - - - - - - - if ( $new_id !~ m{^\d+$} ) { - $new_id = lastuid( $imap2, $h2_fold, $h2_uidguess ) ; - } - printf( "msg %s/%-10s copied to %s/%-10s\n", $h1_fold, $h1_msg, $h2_fold, $new_id ); - $h2_uidguess++; - $total_bytes_transferred += $h1_size; - $nb_msg_transferred += 1; - $debugcache and print "touch $cache_dir/${h1_msg}_$new_id\n" if ( $usecache ) ; - touch( "$cache_dir/${h1_msg}_$new_id" ) if ( $usecache and $new_id =~ m{^\d+$} ); - if ( $delete ) { - print "msg $h1_fold/$h1_msg deleted on host1\n"; - unless($dry) { - $imap1->delete_message($h1_msg); - $h1_nb_msg_deleted += 1; - $imap1->expunge() if ($expunge); - } - } - } - } - else{ - $nb_msg_skipped_dry_mode += 1; - } - return( ); -} - - -sub cache_map { - my ( $cache_files_ref, $h1_msgs_ref, $h2_msgs_ref ) = @_; - my ( %map1_2, %map2_1, %done2 ) ; - - my $h1_msgs_hash_ref = { } ; - my $h2_msgs_hash_ref = { } ; - - @$h1_msgs_hash_ref{ @$h1_msgs_ref } = ( ) ; - @$h2_msgs_hash_ref{ @$h2_msgs_ref } = ( ) ; - - foreach my $file ( sort @$cache_files_ref ) { - $debugcache and print "C12: $file\n" ; - ( $uid1, $uid2 ) = match_a_cache_file( $file ) ; - - if ( exists( $h1_msgs_hash_ref->{ $uid1 } ) - and exists( $h2_msgs_hash_ref->{ $uid2 } ) ) { - # keep only the greatest uid2 - # 130_2301 and - # 130_231 => keep only 130 -> 2301 - - # keep only the greatest uid1 - # 1601_260 and - # 161_260 => keep only 1601 -> 260 - my $max_uid2 = max( $uid2, $map1_2{ $uid1 } || -1 ) ; - if ( exists( $done2{ $max_uid2 } ) ) { - if ( $done2{ $max_uid2 } < $uid1 ) { - $map1_2{ $uid1 } = $max_uid2 ; - delete( $map1_2{ $done2{ $max_uid2 } } ) ; - $done2{ $max_uid2 } = $uid1 ; - } - }else{ - $map1_2{ $uid1 } = $max_uid2 ; - $done2{ $max_uid2 } = $uid1 ; - } - }; - - } - %map2_1 = reverse( %map1_2 ) ; - return( \%map1_2, \%map2_1) ; -} - -sub tests_cache_map { - #$debugcache = 1 ; - my @cache_files = qw ( - 100_200 - 101_201 - 120_220 - 142_242 - 143_243 - 177_277 - 177_278 - 177_279 - 155_255 - 180_280 - 181_280 - 182_280 - 130_231 - 130_2301 - 161_260 - 1601_260 - ) ; - - my $msgs_1 = [120, 142, 143, 144, 161, 1601, 177, 182, 130 ]; - my $msgs_2 = [ 242, 243, 260, 299, 377, 279, 255, 280, 231, 2301 ]; - - my( $c12, $c21 ) ; - ok( ( $c12, $c21 ) = cache_map( \@cache_files, $msgs_1, $msgs_2 ), 'cache_map: 02' ); - my $a1 = [ sort { $a <=> $b } keys %$c12 ] ; - my $a2 = [ sort { $a <=> $b } keys %$c21 ] ; - ok( 0 == compare_lists( [ 130, 142, 143, 177, 182, 1601 ], $a1 ), 'cache_map: 03' ); - ok( 0 == compare_lists( [ 242, 243, 260, 279, 280, 2301 ], $a2 ), 'cache_map: 04' ); - ok( ! $c12->{161}, 'cache_map: ! 161 -> 260' ); - ok( 260 == $c12->{1601}, 'cache_map: 1601 -> 260' ); - ok( 2301 == $c12->{130}, 'cache_map: 130 -> 2301' ); - #print $c12->{1601}, "\n"; - -} - - -sub get_cache { - $debugcache and print "Entering get_cache\n"; - my ($cache_dir, $h1_msgs_ref, $h2_msgs_ref) = @_; - - -d $cache_dir or return( undef ); # exit if cache directory doesn't exist - $debugcache and print "cache_dir: $cache_dir\n"; - - $cache_dir =~ s{\\}{\\\\}g; - my @cache_files = bsd_glob( "$cache_dir/*" ) ; - #$debugcache and print "cache_files: [@cache_files]\n"; - - my( $cache_1_2_ref, $cache_2_1_ref ) - = cache_map( \@cache_files, $h1_msgs_ref, $h2_msgs_ref ) ; - - clean_cache( \@cache_files, $cache_1_2_ref ) - if ( ! ( defined( $maxsize ) - or defined( $minsize ) - or defined( $maxage ) - or defined( $minage ) ) ); - - #print "\n", map { "c12 $_ -> $cache_1_2_ref->{ $_ }\n" } keys %$cache_1_2_ref ; - #print "\n", map { "c21 $_ -> $cache_2_1_ref->{ $_ }\n" } keys %$cache_2_1_ref ; - - $debugcache and print "Exiting get_cache\n"; - return ( $cache_1_2_ref, $cache_2_1_ref ) ; -} - -sub tests_get_cache { - - ok( ! get_cache('/cache_no_exist'), 'get_cache: /cache_no_exist' ); - ok( ( ! -d 'tmp/cache/F1/F2' or rmtree( 'tmp/cache/F1/F2' )), 'get_cache: rmtree tmp/cache/F1/F2' ) ; - ok( mkpath( 'tmp/cache/F1/F2' ), 'get_cache: mkpath tmp/cache/F1/F2' ) ; - - my @test_files_cache = ( qw( - tmp/cache/F1/F2/100_200 - tmp/cache/F1/F2/101_201 - tmp/cache/F1/F2/120_220 - tmp/cache/F1/F2/142_242 - tmp/cache/F1/F2/143_243 - tmp/cache/F1/F2/177_277 - tmp/cache/F1/F2/177_377 - tmp/cache/F1/F2/177_777 - tmp/cache/F1/F2/155_255 - ) ) ; - ok( touch(@test_files_cache), 'get_cache: touch tmp/cache/F1/F2/...' ) ; - - - # on cache: 100_200 101_201 142_242 143_243 177_277 177_377 177_777 155_255 - # on live: - my $msgs_1 = [120, 142, 143, 144, 177 ]; - my $msgs_2 = [ 242, 243, 299, 377, 777, 255 ]; - - my( $c12, $c21 ) ; - ok( ( $c12, $c21 ) = get_cache('tmp/cache/F1/F2', $msgs_1, $msgs_2), 'get_cache: 02' ); - my $a1 = [ sort { $a <=> $b } keys %$c12 ] ; - my $a2 = [ sort { $a <=> $b } keys %$c21 ] ; - ok( 0 == compare_lists( [ 142, 143, 177 ], $a1 ), 'get_cache: 03' ); - ok( 0 == compare_lists( [ 242, 243, 777 ], $a2 ), 'get_cache: 04' ); - ok( -f 'tmp/cache/F1/F2/142_242', 'get_cache: file kept 142_242'); - ok( -f 'tmp/cache/F1/F2/142_242', 'get_cache: file kept 143_243'); - ok( ! -f 'tmp/cache/F1/F2/100_200', 'get_cache: file removed 100_200'); - ok( ! -f 'tmp/cache/F1/F2/101_201', 'get_cache: file removed 101_201'); - - # test clean_cache not executed - $maxage = 2 ; - ok( touch(@test_files_cache), 'get_cache: touch tmp/cache/F1/F2/...' ) ; - ok( ( $c12, $c21 ) = get_cache('tmp/cache/F1/F2', $msgs_1, $msgs_2), 'get_cache: 02' ); - ok( -f 'tmp/cache/F1/F2/142_242', 'get_cache: file kept 142_242'); - ok( -f 'tmp/cache/F1/F2/142_242', 'get_cache: file kept 143_243'); - ok( -f 'tmp/cache/F1/F2/100_200', 'get_cache: file NOT removed 100_200'); - ok( -f 'tmp/cache/F1/F2/101_201', 'get_cache: file NOT removed 101_201'); - - - # strange files - #$debugcache = 1 ; - $maxage = undef ; - ok( ( ! -d 'tmp/cache/rr\uee' or rmtree( 'tmp/cache/rr\uee' )), 'get_cache: rmtree tmp/cache/rr\uee' ) ; - ok( mkpath( 'tmp/cache/rr\uee' ), 'get_cache: mkpath tmp/cache/rr\uee' ) ; - - @test_files_cache = ( qw( - tmp/cache/rr\uee/100_200 - tmp/cache/rr\uee/101_201 - tmp/cache/rr\uee/120_220 - tmp/cache/rr\uee/142_242 - tmp/cache/rr\uee/143_243 - tmp/cache/rr\uee/177_277 - tmp/cache/rr\uee/177_377 - tmp/cache/rr\uee/177_777 - tmp/cache/rr\uee/155_255 - ) ) ; - ok( touch(@test_files_cache), 'get_cache: touch strange tmp/cache/...' ) ; - - # on cache: 100_200 101_201 142_242 143_243 177_277 177_377 177_777 155_255 - # on live: - $msgs_1 = [120, 142, 143, 144, 177 ]; - $msgs_2 = [ 242, 243, 299, 377, 777, 255 ]; - - ok( ( $c12, $c21 ) = get_cache('tmp/cache/rr\uee', $msgs_1, $msgs_2), 'get_cache: strange path 02' ); - $a1 = [ sort { $a <=> $b } keys %$c12 ] ; - $a2 = [ sort { $a <=> $b } keys %$c21 ] ; - ok( 0 == compare_lists( [ 142, 143, 177 ], $a1 ), 'get_cache: strange path 03' ); - ok( 0 == compare_lists( [ 242, 243, 777 ], $a2 ), 'get_cache: strange path 04' ); - ok( -f 'tmp/cache/rr\uee/142_242', 'get_cache: strange path file kept 142_242'); - ok( -f 'tmp/cache/rr\uee/142_242', 'get_cache: strange path file kept 143_243'); - ok( ! -f 'tmp/cache/rr\uee/100_200', 'get_cache: strange path file removed 100_200'); - ok( ! -f 'tmp/cache/rr\uee/101_201', 'get_cache: strange path file removed 101_201'); - - -} - -sub match_a_cache_file { - my $file = shift ; - my ( $uid1, $uid2 ) ; - - return( ( undef, undef ) ) if ( ! $file ) ; - if ( $file =~ m{(?:^|/)(\d+)_(\d+)$} ) { - $uid1 = $1 ; - $uid2 = $2 ; - } - return( $uid1, $uid2 ) ; -} - -sub tests_match_a_cache_file { - my ( $uid1, $uid2 ) ; - ok( ( $uid1, $uid2 ) = match_a_cache_file( ), 'match_a_cache_file: no arg' ) ; - ok( ! defined( $uid1 ), 'match_a_cache_file: no arg 1' ) ; - ok( ! defined( $uid2 ), 'match_a_cache_file: no arg 2' ) ; - - ok( ( $uid1, $uid2 ) = match_a_cache_file( '' ), 'match_a_cache_file: empty arg' ) ; - ok( ! defined( $uid1 ), 'match_a_cache_file: empty arg 1' ) ; - ok( ! defined( $uid2 ), 'match_a_cache_file: empty arg 2' ) ; - - ok( ( $uid1, $uid2 ) = match_a_cache_file( '000_000' ), 'match_a_cache_file: 000_000' ) ; - ok( '000' eq $uid1, 'match_a_cache_file: 000_000 1' ) ; - ok( '000' eq $uid2, 'match_a_cache_file: 000_000 2' ) ; - - ok( ( $uid1, $uid2 ) = match_a_cache_file( '123_456' ), 'match_a_cache_file: 123_456' ) ; - ok( '123' eq $uid1, 'match_a_cache_file: 123_456 1' ) ; - ok( '456' eq $uid2, 'match_a_cache_file: 123_456 2' ) ; - - ok( ( $uid1, $uid2 ) = match_a_cache_file( '/tmp/truc/123_456' ), 'match_a_cache_file: /tmp/truc/123_456' ) ; - ok( '123' eq $uid1, 'match_a_cache_file: /tmp/truc/123_456 1' ) ; - ok( '456' eq $uid2, 'match_a_cache_file: /tmp/truc/123_456 2' ) ; - - ok( ( $uid1, $uid2 ) = match_a_cache_file( '/lala123_456' ), 'match_a_cache_file: NO /lala123_456' ) ; - ok( ! $uid1, 'match_a_cache_file: /lala123_456 1' ) ; - ok( ! $uid2, 'match_a_cache_file: /lala123_456 2' ) ; - - ok( ( $uid1, $uid2 ) = match_a_cache_file( 'la123_456' ), 'match_a_cache_file: NO la123_456' ) ; - ok( ! $uid1, 'match_a_cache_file: la123_456 1' ) ; - ok( ! $uid2, 'match_a_cache_file: la123_456 2' ) ; - - -} - -sub clean_cache { - my $cache_files_ref = shift ; - my $cache_1_2_ref = shift ; - - $debugcache and print "Entering clean_cache\n"; - - $debugcache and print map { "$_ -> " . $cache_1_2_ref->{ $_ } . "\n" } keys %$cache_1_2_ref ; - foreach my $file ( @$cache_files_ref ) { - $debugcache and print "$file\n" ; - my ( $uid1, $uid2 ) = match_a_cache_file( $file ) ; - $debugcache and print "u1: $uid1 u2: $uid2 c12: ", $cache_1_2_ref->{ $uid1 } || '', "\n" ; - if ( ( ! defined( $uid1 ) ) - or ( ! defined( $uid2 ) ) - or ( ! exists( $cache_1_2_ref->{ $uid1 } ) ) - or ( ! ( $uid2 == $cache_1_2_ref->{ $uid1 } ) ) ) { - $debugcache and print "remove $file\n" ; - unlink( $file ) or warn "$!" ; - } - } - - $debugcache and print "Exiting clean_cache\n"; - return( 1 ) ; -} - -sub tests_clean_cache { - - ok( ( ! -d 'tmp/cache/G1/G2' or rmtree( 'tmp/cache/G1/G2' )), 'clean_cache: rmtree tmp/cache/G1/G2' ) ; - ok( mkpath( 'tmp/cache/G1/G2' ), 'clean_cache: mkpath tmp/cache/G1/G2' ) ; - - my @test_files_cache = ( qw( - tmp/cache/G1/G2/100_200 - tmp/cache/G1/G2/101_201 - tmp/cache/G1/G2/120_220 - tmp/cache/G1/G2/142_242 - tmp/cache/G1/G2/143_243 - tmp/cache/G1/G2/177_277 - tmp/cache/G1/G2/177_377 - tmp/cache/G1/G2/177_777 - tmp/cache/G1/G2/155_255 - ) ) ; - ok( touch(@test_files_cache), 'clean_cache: touch tmp/cache/G1/G2/...' ) ; - - ok( -f 'tmp/cache/G1/G2/100_200', 'clean_cache: 100_200 before' ); - ok( -f 'tmp/cache/G1/G2/142_242', 'clean_cache: 142_242 before' ); - ok( -f 'tmp/cache/G1/G2/177_277', 'clean_cache: 177_277 before' ); - ok( -f 'tmp/cache/G1/G2/177_377', 'clean_cache: 177_377 before' ); - ok( -f 'tmp/cache/G1/G2/177_777', 'clean_cache: 177_777 before' ); - ok( -f 'tmp/cache/G1/G2/155_255', 'clean_cache: 155_255 before' ); - - my $cache = { - 142 => 242, - 177 => 777, - } ; - - ok( clean_cache( \@test_files_cache, $cache ), 'clean_cache: ' ) ; - - ok( ! -f 'tmp/cache/G1/G2/100_200', 'clean_cache: 100_200 after' ); - ok( -f 'tmp/cache/G1/G2/142_242', 'clean_cache: 142_242 after' ); - ok( ! -f 'tmp/cache/G1/G2/177_277', 'clean_cache: 177_277 after' ); - ok( ! -f 'tmp/cache/G1/G2/177_377', 'clean_cache: 177_377 after' ); - ok( -f 'tmp/cache/G1/G2/177_777', 'clean_cache: 177_777 after' ); - ok( ! -f 'tmp/cache/G1/G2/155_255', 'clean_cache: 155_255 after' ); -} - - -sub tests_touch { - - ok( (-d 'tmp/tests/' or mkpath( 'tmp/tests/' )), 'tests_touch: mkpath tmp/tests/' ) ; - ok( 1 == touch( 'tmp/tests/lala'), 'tests_touch: tmp/tests/lala') ; - ok( 1 == touch( 'tmp/tests/\y'), 'tests_touch: tmp/tests/\y') ; - ok( 0 == touch( '/aaa'), 'tests_touch: not /aaa') ; - ok( 2 == touch( 'tmp/tests/lili', 'tmp/tests/lolo'), 'tests_touch: 2 files') ; - ok( 1 == touch( 'tmp/tests/\y', '/aaa'), 'tests_touch: 2 files, 1 fails' ) ; - -} - -sub touch { - my @files = @_ ; - my @result; - - foreach my $file ( @files ) { - my $fh = new IO::File ; - if ($fh->open(">> $file")) { - $fh->close ; - push(@result, $file) ; - } - } - return(@result); -} - -sub cache_folder { - my( $cache_dir, $h1_fold, $h2_fold ) = @_ ; - - #print "sep1 $h1_sep sep2 $h2_sep\n"; - my $sep1 = $h1_sep || '/'; - my $sep2 = $h2_sep || '/'; - - my $h1_fold_slash = convert_sep_to_slash( $h1_fold, $sep1 ); - my $h2_fold_slash = convert_sep_to_slash( $h2_fold, $sep2 ); - - return( "$cache_dir/$h1_fold_slash/$h2_fold_slash" ) ; -} - -sub convert_sep_to_slash { - my ($folder, $sep) = @_; - - $folder =~ s{\Q$sep\E}{/}g; - return($folder); -} - -sub tests_convert_sep_to_slash { - - ok('' eq convert_sep_to_slash('', '/'), 'convert_sep_to_slash: no folder'); - ok('INBOX' eq convert_sep_to_slash('INBOX', '/'), 'convert_sep_to_slash: INBOX'); - ok('INBOX/foo' eq convert_sep_to_slash('INBOX/foo', '/'), 'convert_sep_to_slash: INBOX/foo'); - ok('INBOX/foo' eq convert_sep_to_slash('INBOX_foo', '_'), 'convert_sep_to_slash: INBOX_foo'); - ok('INBOX/foo/zob' eq convert_sep_to_slash('INBOX_foo_zob', '_'), 'convert_sep_to_slash: INBOX_foo_zob'); - ok('INBOX/foo' eq convert_sep_to_slash('INBOX.foo', '.'), 'convert_sep_to_slash: INBOX.foo'); - ok('INBOX/foo/hi' eq convert_sep_to_slash('INBOX.foo.hi', '.'), 'convert_sep_to_slash: INBOX.foo.hi'); -} - - -sub tests_regexmess { - - ok("blabla" eq regexmess("blabla"), "regexmess, no regexmess, nothing to do"); - - @regexmess = ('s/p/Z/g'); - ok("ZoZoZo" eq regexmess("popopo"), "regexmess, s/p/Z/g"); - - @regexmess = 's{c}{C}gxms'; - ok("H1: abC\nH2: Cde\n\nBody abC" - eq regexmess("H1: abc\nH2: cde\n\nBody abc"), - "regexmess, c->C"); - - @regexmess = 's{\AFrom\ }{From:}gxms'; - ok( '' - eq regexmess(''), - 'From mbox 1 add colon blank'); - - ok( 'From:' - eq regexmess('From '), - 'From mbox 2 add colo'); - - ok( "\n" . 'From ' - eq regexmess("\n" . 'From '), - 'From mbox 3 add colo'); - - ok( "From: zzz\n" . 'From ' - eq regexmess("From zzz\n" . 'From '), - 'From mbox 4 add colo'); - - @regexmess = 's{\AFrom\ [^\n]*(\n)?}{}gxms'; - ok( '' - eq regexmess(''), - 'From mbox 1 remove, blank'); - - ok( '' - eq regexmess('From '), - 'From mbox 2 remove'); - - ok( "\n" . 'From ' - eq regexmess("\n" . 'From '), - 'From mbox 3 remove'); - - #print "[", regexmess("From zzz\n" . 'From '), "]"; - ok( "" . 'From ' - eq regexmess("From zzz\n" . 'From '), - 'From mbox 4 remove'); - - - ok( -'Date: Sat, 10 Jul 2010 05:34:45 -0700 -From: - -Hello, -Bye.' - eq regexmess( -'From zzz -Date: Sat, 10 Jul 2010 05:34:45 -0700 -From: - -Hello, -Bye.' - ), - 'From mbox 5 remove'); -} - -sub regexmess { - my ($string) = @_; - foreach my $regexmess (@regexmess) { - $debug and print "eval \$string =~ $regexmess\n"; - eval("\$string =~ $regexmess"); - die_clean("error: eval regexmess '$regexmess': $@\n") if $@; - } - return($string); -} - -sub stats { - $timeend = time(); - $timediff = $timeend - $timestart; - - my $memory_consumption = memory_consumption(); - my $memory_ratio = ($max_msg_size_in_bytes) ? - sprintf('%.1f', $memory_consumption / $max_msg_size_in_bytes) : "NA"; - - my $host1_reconnect_count = $imap1->Reconnect_counter() || 0; - my $host2_reconnect_count = $imap2->Reconnect_counter() || 0; - - print "++++ Statistics\n"; - print "Transfer time : $timediff sec\n"; - print "Messages transferred : $nb_msg_transferred "; - print "(could be $nb_msg_skipped_dry_mode without dry mode)" if ($dry); - print "\n"; - print "Messages skipped : $nb_msg_skipped\n"; - print "Messages found duplicate on host1 : $h1_nb_msg_duplicate\n"; - print "Messages found duplicate on host2 : $h2_nb_msg_duplicate\n"; - print "Messages void (noheader) on host1 : $h1_nb_msg_noheader\n"; - print "Messages void (noheader) on host2 : $h2_nb_msg_noheader\n"; - print "Messages deleted on host1 : $h1_nb_msg_deleted\n"; - print "Messages deleted on host2 : $h2_nb_msg_deleted\n"; - print "Total bytes transferred : $total_bytes_transferred\n"; - print "Total bytes duplicate host1 : $h1_total_bytes_duplicate\n"; - print "Total bytes duplicate host2 : $h2_total_bytes_duplicate\n"; - print "Total bytes skipped : $total_bytes_skipped\n"; - print "Total bytes error : $total_bytes_error\n"; - $timediff ||= 1; # No division per 0 - printf ("Message rate : %.1f messages/s\n", $nb_msg_transferred / $timediff); - printf ("Average bandwidth rate : %.1f KiB/s\n", $total_bytes_transferred / 1024 / $timediff); - print "Reconnections to host1 : $host1_reconnect_count\n"; - print "Reconnections to host2 : $host2_reconnect_count\n"; - printf ("Memory consumption : %.1f MB\n", $memory_consumption / 1024 / 1024); - print "Biggest message : $max_msg_size_in_bytes bytes\n"; - print "Memory/biggest message ratio : $memory_ratio\n"; - print "Detected $nb_errors errors\n\n"; - - print $warn_release, "\n"; - print thank_author(); -} - -sub thank_author { - - return("Homepage: http://www.linux-france.org/prj/imapsync/\n"); - - my $basename = imapsync_basename(); - $debug and print "[$basename]\n"; - return("Homepage: http://www.linux-france.org/prj/imapsync/\n") - if ( $basename =~ /\.exe$|\.bin$/ ); - - return(join("", "Happy with this free, open and gratis DWTFPL software?\n", - "Encourage the author (Gilles LAMIRAL) by giving him a book\n", - "or just money via paypal:\n", - "http://www.linux-france.org/prj/imapsync/\n")); -} - -sub get_options { - my $numopt = scalar(@ARGV); - my $argv = join("¤", @ARGV); - - $test_builder = Test::More->builder; - $test_builder->no_ending(1); - - if($argv =~ m/-delete¤2/) { - print "May be you mean --delete2 instead of --delete 2\n"; - exit 1; - } - my $opt_ret = GetOptions( - "debug!" => \$debug, - "debugimap!" => \$debugimap, - "debugimap1!" => \$debugimap1, - "debugimap2!" => \$debugimap2, - "host1=s" => \$host1, - "host2=s" => \$host2, - "port1=i" => \$port1, - "port2=i" => \$port2, - "user1=s" => \$user1, - "user2=s" => \$user2, - "domain1=s" => \$domain1, - "domain2=s" => \$domain2, - "password1=s" => \$password1, - "password2=s" => \$password2, - "passfile1=s" => \$passfile1, - "passfile2=s" => \$passfile2, - "authmd5!" => \$authmd5, - "authmd51!" => \$authmd51, - "authmd52!" => \$authmd52, - "sep1=s" => \$sep1, - "sep2=s" => \$sep2, - "folder=s" => \@folder, - "folderrec=s" => \@folderrec, - "include=s" => \@include, - "exclude=s" => \@exclude, - "prefix1=s" => \$prefix1, - "prefix2=s" => \$prefix2, - "regextrans2=s" => \@regextrans2, - "regexmess=s" => \@regexmess, - "regexflag=s" => \@regexflag, - "delete!" => \$delete, - "delete2!" => \$delete2, - "delete2folders!" => \$delete2folders, - "delete2foldersonly=s" => \$delete2foldersonly, - "delete2foldersbutnot=s" => \$delete2foldersbutnot, - "syncinternaldates!" => \$syncinternaldates, - "idatefromheader!" => \$idatefromheader, - "syncacls!" => \$syncacls, - "maxsize=i" => \$maxsize, - "minsize=i" => \$minsize, - "maxage=i" => \$maxage, - "minage=i" => \$minage, - "foldersizes!" => \$foldersizes, - "dry!" => \$dry, - "expunge!" => \$expunge, - "expunge1!" => \$expunge1, - "expunge2!" => \$expunge2, - "uidexpunge2!" => \$uidexpunge2, - "subscribed!" => \$subscribed, - "subscribe!" => \$subscribe, - "subscribe_all!" => \$subscribe_all, - "justbanner!" => \$justbanner, - "justconnect!"=> \$justconnect, - "justfolders!"=> \$justfolders, - "justfoldersizes!" => \$justfoldersizes, - "fast!" => \$fast, - "version" => \$version, - "help" => \$help, - "timeout=i" => \$timeout, - "skipheader=s" => \$skipheader, - "useheader=s" => \@useheader, - "skipsize!" => \$skipsize, - "allowsizemismatch!" => \$allowsizemismatch, - "fastio1!" => \$fastio1, - "fastio2!" => \$fastio2, - "ssl1!" => \$ssl1, - "ssl2!" => \$ssl2, - "tls1!" => \$tls1, - "tls2!" => \$tls2, - "uid1!" => \$uid1, - "uid2!" => \$uid2, - "authmech1=s" => \$authmech1, - "authmech2=s" => \$authmech2, - "authuser1=s" => \$authuser1, - "authuser2=s" => \$authuser2, - "proxyauth1" => \$proxyauth1, - "proxyauth2" => \$proxyauth1, - "split1=i" => \$split1, - "split2=i" => \$split2, - "buffersize=i" => \$buffersize, - "reconnectretry1=i" => \$reconnectretry1, - "reconnectretry2=i" => \$reconnectretry2, - "tests" => \$tests, - "tests_debug" => \$tests_debug, - "allow3xx!" => \$allow3xx, - "justlogin!" => \$justlogin, - "tmpdir=s" => \$tmpdir, - "pidfile=s" => \$pidfile, - "releasecheck!" => \$releasecheck, - "modules_version!" => \$modules_version, - "usecache!" => \$usecache, - "debugcache!" => \$debugcache, - "useuid!" => \$useuid, - ); - - $debug and print "get options: [$opt_ret]\n"; - - # just the version - print imapsync_version(), "\n" and exit if ($version) ; - - if ($tests) { - $test_builder->no_ending(0); - tests(); - exit; - } - if ($tests_debug) { - $test_builder->no_ending(0); - tests_debug(); - exit; - } - - $help = 1 if ! $numopt; - load_modules(); - - # exit with --help option or no option at all - usage() and exit if ($help or ! $numopt) ; - - # don't go on if options are not all known. - exit(EX_USAGE()) unless ($opt_ret) ; - -} - - -sub load_modules { - - require IO::Socket::SSL if ($ssl1 or $ssl2 or $tls1 or $tls2); - - require Term::ReadKey if ( - ((not($password1 or $passfile1)) - or (not($password2 or $passfile2))) - and (not $help)); - - #require Data::Dumper if ($debug); -} - - - -sub parse_header_msg { - my ($imap, $m_uid, $s_heads, $s_fir, $s, $s_hash) = @_; - - my $head = $s_heads->{$m_uid}; - my $headnum = scalar(keys(%$head)); - $debug and print "Head NUM:", $headnum, "\n"; - unless($headnum) { print "Warning: no header used or found for message $m_uid\n"; } - my $headstr; - - foreach my $h (sort keys(%$head)){ - foreach my $val (sort @{$head->{$h}}) { - # no 8-bit data in headers ! - $val =~ s/[\x80-\xff]/X/g; - - # remove the first blanks (dbmail bug ?) - $val =~ s/^\s*(.+)$/$1/; - - # and uppercase header line - # (dbmail and dovecot) - - my $H = uc("$h: $val"); - # show stuff in debug mode - $debug and print "${s}H $H", "\n"; - - if ($skipheader and $H =~ m/$skipheader/i) { - $debug and print "Skipping header $H\n"; - next; - } - $headstr .= "$H"; - } - } - - if ( ( ! $headstr) and ( $takebody ) ){ - print "no header so taking body first 2Ko\n"; - $imap->fetch($m_uid, "BODY.PEEK[TEXT]<0.2048>"); - $headstr = $imap->_transaction_literals; - - if ( 4048 <= length( $headstr ) ) { - # the imap server might reply the whole message - # this is bad for memory on huge mailboxes - $takebody = 0 ; - $headstr = '' ; - $h1_msgs_copy_by_uid{ $m_uid } = 1 ; - } - } - return() if ( ! $headstr ); - - my $size = $s_fir->{$m_uid}->{"RFC822.SIZE"}; - my $flags = $s_fir->{$m_uid}->{"FLAGS"}; - my $idate = $s_fir->{$m_uid}->{"INTERNALDATE"}; - $size = length($headstr) unless ($size); - my $m_md5 = md5_base64($headstr); - $debug and print "$s msg $m_uid:$m_md5:$size\n"; - my $key; - if ($skipsize) { - $key = "$m_md5"; - } - else { - $key = "$m_md5:$size"; - } - # 0 return code is used to identify duplicate message hash - return 0 if exists $s_hash->{"$key"}; - $s_hash->{"$key"}{'5'} = $m_md5; - $s_hash->{"$key"}{'s'} = $size; - $s_hash->{"$key"}{'D'} = $idate; - $s_hash->{"$key"}{'F'} = $flags; - $s_hash->{"$key"}{'m'} = $m_uid; -} - - -sub firstline { - # extract the first line of a file (without \n) - - my($file) = @_; - my $line = ""; - - open FILE, $file or die_clean("error [$file]: $! "); - chomp($line = ); - close FILE; - $line = ($line) ? $line: "error !EMPTY! [$file]"; - return $line; -} - - -sub file_to_string { - my($file) = @_; - my @string; - open FILE, $file or die_clean("error [$file]: $! "); - @string = ; - close FILE; - return join("", @string); -} - - -sub string_to_file { - my($string, $file) = @_; - sysopen(FILE, $file,O_WRONLY|O_TRUNC|O_CREAT, 0600) or die_clean("$! $file"); - print FILE $string; - close FILE; -} - -sub tests_is_a_release_number { - ok(is_a_release_number(1.351), 'is_a_release_number 1.351'); - ok(is_a_release_number(42.4242), 'is_a_release_number 42.4242'); - ok(is_a_release_number(imapsync_version()), 'is_a_release_number imapsync_version()'); - ok(! is_a_release_number('blabla' ), '! is_a_release_number blabla'); - -} - -sub is_a_release_number { - my $number = shift; - - $number =~ m{\d\.\d+}; -} - -sub check_last_release { - - my $public_release = not_long('imapsync_version_lfo'); - #print "check_last_release: [$public_release]\n" ; - return('unknown') if ($public_release eq 'unknown'); - return('timeout') if ($public_release eq 'timeout'); - return('unknown') if (! is_a_release_number($public_release)); - - my $imapsync_here = imapsync_version(); - - if ($public_release > $imapsync_here) { - return("New imapsync release $public_release available"); - }else{ - return("This current imapsync is up to date"); - } -} - -sub imapsync_version { - my $rcs = '$Id: imapsync,v 1.404 2011/02/21 03:35:39 gilles Exp $ '; - $rcs =~ m/,v (\d+\.\d+)/; - my $VERSION = ($1) ? $1: "UNKNOWN"; - return($VERSION); -} - -sub tests_imapsync_basename { - - ok('imapsync' eq imapsync_basename(), 'imapsync_basename: imapsync'); - ok('blabla' ne imapsync_basename(), '! imapsync_basename: blabla'); -} - -sub imapsync_basename { - - return basename($0); - -} - -sub imapsync_version_lfo { - - my $local_version = imapsync_version(); - my $imapsync_basename = imapsync_basename(); - my $agent_info = "$OSNAME system, perl " - . sprintf("%vd", $PERL_VERSION) - . ", Mail::IMAPClient $Mail::IMAPClient::VERSION" - . " $imapsync_basename"; - my $sock = new IO::Socket::INET ( - PeerAddr => 'imapsync.lamiral.info', - PeerPort => '80', - Proto => 'tcp'); - return('unknown') if not $sock; - print $sock - "GET /prj/imapsync/VERSION HTTP/1.0\n", - "User-Agent: imapsync/$local_version ($agent_info)\n", - "Host: www.linux-france.org\n\n"; - my @line = <$sock>; - close($sock); - my $last_release = $line[-1]; - chomp($last_release); - return($last_release); -} - -sub not_long { - #print "Entering not_long\n"; - my ($func) = @_; - my $val; - - # Doesn't work with gethostbyname (see perlipc) - #local $SIG{ALRM} = sub { die "alarm\n" }; - - if ('MSWin32' eq $OSNAME) { - local $SIG{ALRM} = sub { die "alarm\n" }; - }else{ - - POSIX::sigaction(SIGALRM, - POSIX::SigAction->new(sub { die "alarm" })) - or warn "Error setting SIGALRM handler: $!\n"; - } - - eval { - - alarm(3); - #print $func, "\n"; - { - no strict "refs"; - #print "Calling $func\n"; - $val = &$func(); - #print "End of $func\n"; - } - alarm(0); - }; - if ($@) { - #print "$@"; - if ($@ =~ /alarm/) { - # timed out - return('timeout'); - }else{ - alarm(0); - return('unknown'); # propagate unexpected errors - } - }else { - # didn't - return($val); - } -} - -sub localhost_info { - - my($infos) = join("", - "Here is a [$OSNAME] system (", - join(" ", - uname(), - ), - ")\n", - "With perl ", - sprintf("%vd", $PERL_VERSION), - " Mail::IMAPClient $Mail::IMAPClient::VERSION", - ); - return($infos); - -} - -sub usage { - my $localhost_info = localhost_info(); - my $thank = thank_author(); - my $warn_release =''; - $warn_release = check_last_release() if (not defined($releasecheck)); - print < : "from" imap server. Mandatory. ---port1 : port to connect on host1. Default is 143. ---user1 : user to login on host1. Mandatory. ---domain1 : domain on host1 (NTLM authentication). ---authuser1 : user to auth with on host1 (admin user). - Avoid using --authmech1 SOMETHING with --authuser1. ---proxyauth1 : Use proxyauth on host1. Requires --authuser1. - Required by Sun/iPlanet/Netscape IMAP servers to - be able to use an administrative user ---password1 : password for the user1. Dangerous, use --passfile1 ---passfile1 : password file for the user1. Contains the password. ---host2 : "destination" imap server. Mandatory. ---port2 : port to connect on host2. Default is 143. ---user2 : user to login on host2. Mandatory. ---domain2 : domain on host2 (NTLM authentication). ---authuser2 : user to auth with on host2 (admin user). ---proxyauth2 : Use proxyauth on host2. Requires --authuser2. - Required by Sun/iPlanet/Netscape IMAP servers to - be able to use an administrative user ---password2 : password for the user2. Dangerous, use --passfile2 ---passfile2 : password file for the user2. Contains the password. ---authmd51 : Use MD5 authentification for host1. ---authmd52 : Use MD5 authentification for host2. ---authmech1 : auth mechanism to use with host1: - PLAIN, LOGIN, CRAM-MD5 etc. Use UPPERCASE. ---authmech2 : auth mechanism to use with host2. See --authmech1 ---ssl1 : use an SSL connection on host1. ---ssl2 : use an SSL connection on host2. ---tls1 : use an TLS connection on host1. ---tls2 : use an TLS connection on host2. ---folder : sync this folder. ---folder : and this one, etc. ---folderrec : sync this folder recursively. ---folderrec : and this one, etc. ---include : sync folders matching this regular expression ---include : or this one, etc. - in case both --include --exclude options are - use, include is done before. ---exclude : skips folders matching this regular expression - Several folders to avoid: - --exclude 'fold1|fold2|f3' skips fold1, fold2 and f3. ---exclude : or this one, etc. ---tmpdir : where to store temporary files and subdirectories. - Will be created if it doesn't exist. - Default is system specific and should be ok. ---pidfile : the file where imapsync pid is written. ---prefix1 : remove prefix to all destination folders - (usually INBOX. for cyrus imap servers) - you can use --prefix1 if your source imap server - does not have NAMESPACE capability. ---prefix2 : add prefix to all destination folders - (usually INBOX. for cyrus imap servers) - use --prefix2 if your target imap server does not - have NAMESPACE capability. ---regextrans2 : Apply the whole regex to each destination folders. ---regextrans2 : and this one. etc. - When you play with the --regextrans2 option, first - add also the safe options --dry --justfolders - Then, when happy, remove --dry, remove --justfolders ---regexmess : Apply the whole regex to each message before transfer. - Example: 's/\\000/ /g' # to replace null by space. ---regexmess : and this one. ---regexmess : and this one, etc. ---regexflag : Apply the whole regex to each flags list. - Example: 's/\"Junk"//g' # to remove "Junk" flag. ---regexflag : and this one, etc. ---sep1 : separator in case namespace is not supported. ---sep2 : idem. ---delete : delete messages on host1 server after - a successful transfer. Useful in case you - want to migrate from one server to another one. - With imapsync, --delete tags messages as deleted and they - are really deleted unless --noexpunge is used. ---delete2 : delete messages in host2 that are not in - host1 server. ---delete2folders : delete folders in host2 that are not in - host1 server. For safety, please try it like this (safe): - --delete2folders --dry --justfolders --nofoldersizes ---delete2foldersonly : delete only folders matching regex. ---delete2foldersbutnot : do not delete folders matching regex. ---noexpunge : Do not expunge messages on host1. - Expunge really deletes messages marked deleted. - Expunge is made at the beginning, on host1 only. - Newly transferred messages are also expunged if - option --delete is given. - No expunge is done on host2 account (unless --expunge2) ---expunge1 : expunge messages on host1 after the transfer of messages. ---expunge2 : expunge messages on host2 after the transfer of messages. ---uidexpunge2 : uidexpunge messages on the host2 account - that are not on the host1 account, requires --delete2 ---syncinternaldates : sets the internal dates on host2 same as host1. - Turned on by default. Internal date is the date - a message arrived on a host (mtime). ---idatefromheader : sets the internal dates on host2 same as the - "Date:" headers. ---maxsize : skip messages larger (or equal) than bytes ---minsize : skip messages smaller (or equal) than bytes ---maxage : skip messages older than days. - final stats (skipped) don't count older messages - see also --minage ---minage : skip messages newer than days. - final stats (skipped) don't count newer messages - You can do (+ are the messages selected): - past|----maxage+++++++++++++++>now - past|+++++++++++++++minage---->now - past|----maxage+++++minage---->now (intersection) - past|++++minage-----maxage++++>now (union) ---skipheader : Don't take into account header keyword - matching ex: --skipheader 'X.*' ---useheader : Use this header to compare messages on both sides. - Ex: Message-ID or Subject or Date. ---useheader and this one, etc. ---skipsize : Don't take message size into account to compare - messages on both sides. On by default. - Use --no-skipsize for using size comparaison. ---allowsizemismatch : allow RFC822.SIZE != fetched msg size - consider also --skipsize to avoid duplicate messages - when running syncs more than one time per mailbox ---dry : do nothing, just print what would be done. ---subscribed : transfers subscribed folders. ---subscribe : subscribe to the folders transferred on the - host2 that are subscribed on host1. ---subscribe_all : subscribe to the folders transferred on the - host2 even if they are not subscribed on host1. ---nofoldersizes : Do not calculate the size of each folder in bytes - and message counts. Default is to calculate them. ---justfoldersizes : exit after printed the folder sizes. ---syncacls : synchronises acls (Access Control Lists). ---nosyncacls : does not synchronise acls. This is the default. ---usecache : Use cache to speedup. ---nousecache : Do not use cache. ---useuid : Use uid instead of header as a criterium to sync. - --usecache is then implied unless --nousecache ---debug : debug mode. ---debugimap1 : imap debug mode for host1. imap debug is very verbose. ---debugimap2 : imap debug mode for host2. ---debugimap : imap debug mode for host1 and host2. ---version : print software version. ---noreleasecheck : do not check for new imapsync release (a http request). ---justconnect : just connect to both servers and print useful - information. Need only --host1 and --host2 options. ---justlogin : just login to both host1 and host2 with users - credentials, then exit. ---justfolders : just do things about folders (ignore messages). ---fast : be faster, equivalent to --useuid --nofoldersizes ---reconnectretry1 : reconnect to host1 if connection is lost up to - times per imap command (default is 3) ---reconnectretry2 : same as --reconnectretry1 but for host2 ---split1 : split the requests in several parts on host1. - is the number of messages handled per request. - default is like --split1 1000. ---split2 : same thing on host2. ---timeout : imap connect timeout. ---help : print this help. - -Example: to synchronise imap account "foo" on "imap.truc.org" - to imap account "bar" on "imap.trac.org" - with foo password "secret1" - and bar password "secret2" - -$0 \\ - --host1 imap.truc.org --user1 foo --password1 secret1 \\ - --host2 imap.trac.org --user2 bar --password2 secret2 - -$localhost_info -$rcs -$warn_release - -$thank -EOF -} - - -sub good_date { - # two incoming formats: - # header Tue, 24 Aug 2010 16:00:00 +0200 - # internal 24-Aug-2010 16:00:00 +0200 - - # outgoing format: internal date format - # 24-Aug-2010 16:00:00 +0200 - - my ($d) = @_; - return ('') if not defined($d); - - if ( $d =~ m{(\d?)(\d-...-\d{4})( \d{2}:\d{2}:\d{2})( (?:\+|-)\d{4})?}o ) { - #print "internal: [$1][$2][$3][$4]\n"; - my ($day_1, $date_rest, $hour, $zone) = ($1,$2,$3,$4); - $day_1 = '0' if ($day_1 eq ''); - $zone = '' if not defined($zone); - $d = $day_1 . $date_rest . $hour . $zone; - - - }elsif ($d =~ m{(?:.{3}, )(\d?)(\d) (...) (\d{4})( \d{2}:\d{2}:\d{2})( (?:\+|-)\d{4})?}o ) { - #print "header: [$1][$2][$3][$4][$5][$6]\n"; - my ($day_1, $day_rest, $month, $year, $hour, $zone) = ($1,$2,$3,$4,$5,$6); - $day_1 = '0' if ($day_1 eq ''); - $zone = '' if not defined($zone); - $d = $day_1 . "$day_rest-$month-$year" . $hour . $zone; - - }else{ - # unknown/unmatch => return same string - return($d); - } - - $d = qq("$d"); - return($d); -} - -sub memory_consumption { - # memory consumed by imapsync until now in bytes - return((memory_consumption_of_pids())[0]); -} - -sub memory_consumption_of_pids { - - my @PID = (@_) ? @_ : ($PROCESS_ID); - - #print "PIDs: @PID\n"; - my @val; - if ('MSWin32' eq $OSNAME) { - @val = memory_consumption_of_pids_win32(@PID); - }else{ - # Unix - my @ps = qx{ ps -o vsz @PID }; - shift @ps; # First line is column name "VSZ" - chomp @ps; - # convert to - @val = map { $_ * 1024 } @ps; - return(@val); - } -} - -sub memory_consumption_of_pids_win32 { - # Windows - my @PID = @_; - my %PID; - # hash of pids as key values - map { $PID{$_}++ } @PID; - - # Does not work but should reading the tasklist documentation - #@ps = qx{ tasklist /FI "PID eq @PID" }; - - my @ps = qx{ tasklist /NH /FO CSV }; - #print "-" x 80, "\n", @ps, "-" x 80, "\n"; - my @val; - foreach my $line (@ps) { - my($name, $pid, $mem) = (split(',', $line))[0,1,4]; - next if (! $pid); - #print "[$name][$pid][$mem]"; - if ($PID{remove_qq($pid)}) { - #print "MATCH !\n"; - chomp($mem); - $mem = remove_qq($mem); - $mem = remove_Ko($mem); - $mem = remove_not_num($mem); - #print "[$mem]\n"; - push(@val, $mem * 1024); - } - } - return(@val); -} - -sub remove_not_num { - - my $string = shift; - $string =~ tr/0-9//cd; - #print "tr [$string]\n"; - return($string); -} - -sub tests_remove_not_num { - - ok('123' eq remove_not_num(123), 'remove_not_num( 123 )'); - ok('123' eq remove_not_num('123'), "remove_not_num( '123' )"); - ok('123' eq remove_not_num('12 3'), "remove_not_num( '12 3' )"); - ok('123' eq remove_not_num('a 12 3 Ko'), "remove_not_num( 'a 12 3 Ko' )"); -} - -sub remove_Ko { - my $string = shift; - if ($string =~ /^(.*) Ko$/) { - return($1); - }else{ - return($string); - } -} - -sub remove_qq { - my $string = shift; - if ($string =~ /^"(.*)"$/) { - return($1); - }else{ - return($string); - } -} - -sub memory_consumption_ratio { - - my ($base) = @_; - $base ||= 1; - my $consu = memory_consumption(); - return($consu / $base); -} - -sub tests_memory_consumption { - - ok(print join("\n", memory_consumption_of_pids()), "\n"); - ok(print join("\n", memory_consumption_of_pids('1')), "\n"); - ok(print join("\n", memory_consumption_of_pids('1', $$)), "\n"); - - ok(print memory_consumption_ratio(), "\n"); - ok(print memory_consumption_ratio(1), "\n"); - ok(print memory_consumption_ratio(10), "\n"); - - ok(print memory_consumption(), "\n"); -} - -sub tests_good_date { - - ok('' eq good_date(), 'good_date no arg'); - ok('"24-Aug-2010 16:00:00 +0200"' eq good_date('24-Aug-2010 16:00:00 +0200'), 'good_date internal 2digit zone'); - ok('"24-Aug-2010 16:00:00"' eq good_date('24-Aug-2010 16:00:00'), 'good_date internal 2digit no zone'); - ok('"01-Sep-2010 16:00:00 +0200"' eq good_date( '1-Sep-2010 16:00:00 +0200'), 'good_date internal SP 1digit'); - ok('"24-Aug-2010 16:00:00 +0200"' eq good_date('Tue, 24 Aug 2010 16:00:00 +0200'), 'good_date header 2digit zone'); - ok('"01-Sep-2010 16:00:00"' eq good_date('Wed, 1 Sep 2010 16:00:00'), 'good_date header SP 1digit zone'); - ok('"01-Sep-2010 16:00:00 +0200"' eq good_date('Wed, 1 Sep 2010 16:00:00 +0200'), 'good_date header SP 1digit zone'); - ok('"01-Sep-2010 16:00:00 +0200"' eq good_date('Wed, 1 Sep 2010 16:00:00 +0200 (CEST)'), 'good_date header SP 1digit zone'); - -} - - -sub tests_list_keys_in_2_not_in_1 { - - my @list; - ok( ! list_keys_in_2_not_in_1( {}, {}), 'list_keys_in_2_not_in_1: {} {}'); - ok( 0 == compare_lists( [], [ list_keys_in_2_not_in_1( {}, {} ) ] ), 'list_keys_in_2_not_in_1: {} {}'); - ok( 0 == compare_lists( ['a','b'], [ list_keys_in_2_not_in_1( {}, {'a' => 1, 'b' => 1}) ]), 'list_keys_in_2_not_in_1: {} {a, b}'); - ok( 0 == compare_lists( ['b'], [ list_keys_in_2_not_in_1( {'a' => 1}, {'a' => 1, 'b' => 1}) ]), 'list_keys_in_2_not_in_1: {a} {a, b}'); - ok( 0 == compare_lists( [], [ list_keys_in_2_not_in_1( {'a' => 1, 'b' => 1}, {'a' => 1, 'b' => 1}) ]), 'list_keys_in_2_not_in_1: {a, b} {a, b}'); - ok( 0 == compare_lists( [], [ list_keys_in_2_not_in_1( {'a' => 1, 'b' => 1, 'c' => 1}, {'a' => 1, 'b' => 1}) ]), 'list_keys_in_2_not_in_1: {a, b, c} {a, b}'); - ok( 0 == compare_lists( ['b'], [ list_keys_in_2_not_in_1( {'a' => 1, 'c' => 1}, {'a' => 1, 'b' => 1}) ]), 'list_keys_in_2_not_in_1: {a, b, c} {a, b}'); - -} - -sub list_keys_in_2_not_in_1 { - - my $folders1_ref = shift; - my $folders2_ref = shift; - my @list; - - foreach my $folder ( sort keys %$folders2_ref ) { - next if exists($folders1_ref->{$folder}); - push(@list, $folder); - } - return(@list); -} - - -sub list_folders_in_2_not_in_1 { - - my (@h2_folders_not_in_1, %h2_folders_not_in_1); - @h2_folders_not_in_1 = list_keys_in_2_not_in_1( \%h1_folders_all, \%h2_folders_all); - map { $h2_folders_not_in_1{$_} = 1} @h2_folders_not_in_1; - @h2_folders_not_in_1 = list_keys_in_2_not_in_1( \%h2_folders_from_1, \%h2_folders_not_in_1); - - return( reverse @h2_folders_not_in_1 ); -} - -sub delete_folders_in_2_not_in_1 { - - my $dry_message = ''; - $dry_message = "\t(not really since --dry mode)" if $dry; - foreach my $folder (@h2_folders_not_in_1) { - if ( defined($delete2foldersonly) and eval("\$folder !~ $delete2foldersonly" ) ) { - print "Not deleting $folder because of --delete2foldersonly $delete2foldersonly\n"; - next; - } - if ( defined($delete2foldersbutnot) and eval("\$folder =~ $delete2foldersbutnot" ) ) { - print "Not deleting $folder because of --delete2foldersbutnot $delete2foldersbutnot\n"; - next; - } - my $res = $dry; # always success in dry mode! - $res = $imap2->delete($folder) if ( ! $dry ) ; - if ($res) { - print "Delete $folder", "$dry_message", "\n"; - }else{ - print "Delete $folder failure", "\n"; - } - } -} - -sub tests_debug { - - SKIP: { - skip "No test in normal run" if ( not $tests_debug ); - tests_clean_cache( ) ; - tests_match_a_cache_file( ) ; - tests_touch( ) ; - tests_cache_map( ) ; - tests_get_cache( ) ; - } -} - -sub tests { - - SKIP: { - skip "No test in normal run" if (not $tests); - tests_folder_routines(); - tests_compare_lists(); - tests_regexmess(); - tests_flags_regex(); - tests_permanentflags(); - tests_flags_filter(); - tests_imap2_folder_name(); - tests_command_line_nopassword(); - tests_good_date(); - tests_max(); - tests_remove_not_num(); - tests_memory_consumption(); - tests_is_a_release_number(); - tests_imapsync_basename(); - tests_list_keys_in_2_not_in_1(); - tests_convert_sep_to_slash( ) ; - tests_cache_map( ) ; - tests_get_cache( ) ; - tests_clean_cache( ) ; - tests_match_a_cache_file( ) ; - tests_touch( ) ; - } -} - -# IMAPClient 2.2.9 overrides - -sub override_imapclient { -no warnings 'redefine'; -no strict 'subs'; - -use constant Unconnected => 0; -use constant Connected => 1; # connected; not logged in -use constant Authenticated => 2; # logged in; no mailbox selected -use constant Selected => 3; # mailbox selected -use constant INDEX => 0; # Array index for output line number -use constant TYPE => 1; # Array index for line type - # (either OUTPUT, INPUT, or LITERAL) -use constant DATA => 2; # Array index for output line data -use constant NonFolderArg => 1; # Value to pass to Massage to - # indicate non-folder argument - - -*Mail::IMAPClient::_transaction_literals = sub { - my $self = shift; - my $string = ""; - - foreach my $result (@{$self->{"History"}{$self->Transaction}}) { - $string .= $result->[DATA] - if defined($result) and $self->_is_literal($result) ; - } - return $string; -}; - -# Got from 3.25 -*Mail::IMAPClient::append_string = sub { - my $self = shift; - my $folder = $self->Massage(shift); - my ( $text, $flags, $date ) = @_; - defined $text or $text = ''; - - if ( defined $flags ) { - $flags =~ s/^\s+//g; - $flags =~ s/\s+$//g; - $flags = "($flags)" if $flags !~ /^\(.*\)$/; - } - - if ( defined $date ) { - $date =~ s/^\s+//g; - $date =~ s/\s+$//g; - $date = qq("$date") if $date !~ /^"/; - } - - $text =~ s/\r?\n/$CRLF/og; - - my $command = - "APPEND $folder " - . ( $flags ? "$flags " : "" ) - . ( $date ? "$date " : "" ) . "{" - . length($text) - . "}$CRLF"; - - $command .= $text . $CRLF; - $self->_imap_command( $command ) or return undef; - - my $data = join '', $self->Results; - #print "ZZZ|$data|ZZZ\n"; - # look for something like return size or self if no size found: - # OK [APPENDUID ] APPEND completed - # 18 OK [APPENDUID 1286144680 1539] APPEND Ok. - my $ret = $data =~ m#^\d+ OK \[APPEND.*\s+(\d+)\].*\Z#m ? $1 : $self; - - return $ret; -}; - - - -*Mail::IMAPClient::fetch_hash = sub { - # taken from original lib, - # just added split code. - my $self = shift; - my $hash = ref($_[-1]) ? pop @_ : {}; - my @words = @_; - for (@words) { - s/([\( ])FAST([\) ])/${1}FLAGS INTERNALDATE RFC822\.SIZE$2/i ; - s/([\( ])FULL([\) ])/${1}FLAGS INTERNALDATE RFC822\.SIZE ENVELOPE BODY$2/i ; - } - my $msgs_ref_all = scalar($self->messages); - my $split = $self->Split() || scalar(@$msgs_ref_all); - while(my @msgs = splice(@$msgs_ref_all, 0, $split)) { - #print "SPLIT: @msgs\n"; - my $msgs_ref = \@msgs; - my $output = scalar($self->fetch($msgs_ref,"(" . join(" ",@_) . ")")) - ; # unless grep(/\b(?:FAST|FULL)\b/i,@words); - my $x; - for ($x = 0; $x <= $#$output ; $x++) { - my $entry = {}; - my $l = $output->[$x]; - if ($self->Uid) { - my($uid) = $l =~ /\((?:.* )?UID (\d+).*\)/i; - next unless $uid; - if ( exists $hash->{$uid} ) { - $entry = $hash->{$uid} ; - } - else { - $hash->{$uid} ||= $entry; - } - } - else { - my($mid) = $l =~ /^\* (\d+) FETCH/i; - next unless $mid; - if ( exists $hash->{$mid} ) { - $entry = $hash->{$mid} ; - } - else { - $hash->{$mid} ||= $entry; - } - } - - foreach my $w (@words) { - if ( $l =~ /\Q$w\E\s*$/i ) { - $entry->{$w} = $output->[$x+1]; - $entry->{$w} =~ s/(?:\x0a?\x0d)+$//g; - chomp $entry->{$w}; - } - else { - $l =~ /\( # open paren followed by ... - (?:.*\s)? # ...optional stuff and a space - \Q$w\E\s # escaped fetch field - (?:" # then: a dbl-quote - (\\.| # then bslashed anychar(s) or ... - [^"]+) # ... nonquote char(s) - "| # then closing quote; or ... - \( # ...an open paren - (\\.| # then bslashed anychar or ... - [^\)]*) # ... non-close-paren char - \)| # then closing paren; or ... - (\S+)) # unquoted string - (?:\s.*)? # possibly followed by space-stuff - \) # close paren - /xi; - $entry->{$w}=defined($1)?$1:defined($2)?$2:$3; - } - } - } -} - return wantarray ? %$hash : $hash; -}; - - - -*Mail::IMAPClient::login = sub { - my $self = shift; - return $self->authenticate($self->Authmechanism,$self->Authcallback) - if $self->{Authmechanism}; - - my $id = $self->User; - my $has_quotes = $id =~ /^".*"$/ ? 1 : 0; - my $string = "Login " . ( $has_quotes ? $id : qq("$id") ) . - " " . $self->Password . "\r\n"; - $self->_imap_command($string) - and $self->State(Authenticated); - # $self->folders and $self->separator unless $self->NoAutoList; - unless ( $self->IsAuthenticated) { - my($carp) = $self->LastError; - $carp =~ s/^[\S]+ ([^\x0d\x0a]*)\x0d?\x0a/$1/; - carp $carp unless defined wantarray; - return undef; - }; - return $self; -}; - - -*Mail::IMAPClient::get_header = sub { - my($self , $msg, $header ) = @_; - my $val; - - #eval { $val = $self->parse_headers([$msg],$header)->{$header}[0] }; - my $h = $self->parse_headers([$msg],$header); - #require Data::Dumper; - #print Data::Dumper->Dump([$h]); - #$val = $self->parse_headers([$msg],$header)->{$header}[0]; - - $val = $h->{$msg}{$header}[0]; - return defined($val)? $val : undef; -}; - - -*Mail::IMAPClient::parse_headers = sub { - my($self,$msgspec_all,@fields) = @_; - my(%fieldmap) = map { ( lc($_),$_ ) } @fields; - my $msg; my $string; my $field; - #print ref($msgspec_all), "\n"; - #if(ref($msgspec_all) eq 'HASH') { - # print ref($msgspec_all), "\n"; - #$msgspec_all = [$msgspec_all]; - #} - - unless(ref($msgspec_all) eq 'ARRAY') { - print "parse_headers want an ARRAY ref\n"; - #exit 1; - return undef; - } - - my $headers = {}; # hash from message ids to header hash - my $split = $self->Split() || scalar(@$msgspec_all); - while(my @msgs = splice(@$msgspec_all, 0, $split)) { - $debug and print "SPLIT: @msgs\n"; - my $msgspec = \@msgs; - - # Make $msg a comma separated list, of messages we want - $msg = $self->Range($msgspec); - - if ($fields[0] =~ /^[Aa][Ll]{2}$/ ) { - - $string = "$msg body" . - # use ".peek" if Peek parameter is a) defined and true, - # or b) undefined, but not if it's defined and untrue: - - ( defined($self->Peek) ? - ( $self->Peek ? ".peek" : "" ) : - ".peek" - ) . "[header]" ; - - }else { - $string = "$msg body" . - # use ".peek" if Peek parameter is a) defined and true, or - # b) undefined, but not if it's defined and untrue: - - ( defined($self->Peek) ? - ( $self->Peek ? ".peek" : "" ) : - ".peek" - ) . "[header.fields (" . join(" ",@fields) . ')]' ; - } - - my @raw=$self->fetch( $string ) or return undef; - - - my $h = 0; # reference to hash of current msgid, or 0 between msgs - - for my $header (map { split(/(?:\x0d\x0a)/,$_) } @raw) { - - no warnings; - if ( $header =~ /^\*\s+\d+\s+FETCH\s+\(.*BODY\[HEADER(?:\]|\.FIELDS)/i) { - if ($self->Uid) { - if ( my($msgid) = $header =~ /UID\s+(\d+)/ ) { - $h = {}; - $headers->{$msgid} = $h; - } - else { - $h = {}; - } - } - else { - if ( my($msgid) = $header =~ /^\*\s+(\d+)/ ) { - #start of new message header: - $h = {}; - $headers->{$msgid} = $h; - } - } - } - next if $header =~ /^\s+$/; - - # ( for vi - if ($header =~ /^\)/) { # end of this message - $h = 0; # set to be between messages - next; - } - # check for 'UID)' - # when parsing headers by UID. - if ($self->Uid and my($msgid) = $header =~ /^\s*UID\s+(\d+)\s*\)/) { - $headers->{$msgid} = $h; # store in results against this message - $h = 0; # set to be between messages - next; - } - - if ($h != 0) { # do we expect this to be a header? - my $hdr = $header; - chomp $hdr; - $hdr =~ s/\r$//; - #print "W[$hdr]", ref($hdr), "!\n"; - #next if ( ! defined($hdr)); - #print "X[$hdr]\n"; - - if (defined($hdr) and ($hdr =~ s/^(\S+):\s*//)) { - # if ($hdr =~ s/^(\S+):\s*//) { - #print "X1\n"; - $field = exists $fieldmap{lc($1)} ? $fieldmap{lc($1)} : $1 ; - push @{$h->{$field}} , $hdr ; - } elsif ($hdr =~ s/^.*FETCH\s\(.*BODY\[HEADER\.FIELDS.*\)\]\s(\S+):\s*//) { - #print "X2\n"; - $field = exists $fieldmap{lc($1)} ? $fieldmap{lc($1)} : $1 ; - push @{$h->{$field}} , $hdr ; - } elsif ( ref($h->{$field}) eq 'ARRAY') { - #print "X3\n"; - - $hdr =~ s/^\s+/ /; - $h->{$field}[-1] .= $hdr ; - } - } - } - use warnings; -# my $candump = 0; -# if ($self->Debug) { -# eval { -# require Data::Dumper; -# Data::Dumper->import; -# }; -# $candump++ unless $@; -# } - - } - # if we asked for one message, just return its hash, - # otherwise, return hash of numbers => header hash - # if (ref($msgspec) eq 'ARRAY') { - - return $headers; - -}; - - -*Mail::IMAPClient::authenticate = sub { - - my $self = shift; - my $scheme = shift; - my $response = shift; - - $scheme ||= $self->Authmechanism; - $response ||= $self->Authcallback; - my $clear = $self->Clear; - - $self->Clear($clear) - if $self->Count >= $clear and $clear > 0; - - my $count = $self->Count($self->Count+1); - - - my $string = "$count AUTHENTICATE $scheme"; - - $self->_record($count,[ $self->_next_index($self->Transaction), - "INPUT", "$string\x0d\x0a"] ); - - my $feedback = $self->_send_line("$string"); - - unless ($feedback) { - $self->LastError("Error sending '$string' to IMAP: $!\n"); - return undef; - } - - my ($code, $output); - - until ($code) { - $output = $self->_read_line or return undef; - - foreach my $o (@$output) { - $self->_record($count,$o); # $o is a ref - ($code) = $o->[DATA] =~ /^\+(.*)$/ ; - if ($o->[DATA] =~ /^\*\s+BYE/) { - $self->State(Unconnected); - return undef ; - } - if ($o->[DATA]=~ /^\d+\s+(NO|BAD)/i) { - return undef ; - } - } - } - - if ('CRAM-MD5' eq $scheme && ! $response) { - if ($Mail::IMAPClient::_CRAM_MD5_ERR) { - $self->LastError($Mail::IMAPClient::_CRAM_MD5_ERR); - carp $Mail::IMAPClient::_CRAM_MD5_ERR; - } - else { - $response = \&Mail::IMAPClient::_cram_md5; - } - } - - $feedback = $self->_send_line($response->($code, $self)); - - unless ($feedback) { - $self->LastError("Error sending append msg text to IMAP: $!\n"); - return undef; - } - - $code = ""; # clear code - until ($code) { - $output = $self->_read_line or return undef; - foreach my $o (@$output) { - $self->_record($count,$o); # $o is a ref - if ( ($code) = $o->[DATA] =~ /^\+ (.*)$/ ) { - $feedback = $self->_send_line($response->($code,$self)); - unless ($feedback) { - $self->LastError("Error sending append msg text to IMAP: $!\n"); - return undef; - } - $code = "" ; # Clear code; we're still not finished - } else { - $o->[DATA] =~ /^$count (OK|NO|BAD)/ and $code = $1; - if ($o->[DATA] =~ /^\*\s+BYE/) { - $self->State(Unconnected); - return undef ; - } - } - } - } - - $code =~ /^OK/ and $self->State(Authenticated) ; - return $code =~ /^OK/ ? $self : undef ; - -}; - - - -*Mail::IMAPClient::_cram_md5 = sub { - my ($code, $client) = @_; - my $hmac = Digest::HMAC_MD5::hmac_md5_hex(MIME::Base64::decode($code), - $client->Password()); - return MIME::Base64::encode($client->User() . " $hmac", ""); -}; - -*Mail::IMAPClient::message_string = sub { - my $self = shift; - my $msg = shift; - my $expected_size = $self->size($msg); - return undef unless(defined $expected_size); # unable to get size - my $cmd = $self->has_capability('IMAP4REV1') ? - "BODY" . ( $self->Peek ? '.PEEK[]' : '[]' ) : - "RFC822" . ( $self->Peek ? '.PEEK' : '' ) ; - - #print "Message_string Beg fetch:\n", memory_consumption(); - $self->fetch($msg,$cmd) or return undef; - #print "Message_string End fetch:\n", memory_consumption(); - - my $string = ""; - - - foreach my $result (@{$self->{"History"}{$self->Transaction}}) { - $string .= $result->[DATA] - if defined($result) and $self->_is_literal($result) ; - } - #print "Message_string End string:\n", memory_consumption(); - - # BUG? should probably return undef if length != expected - # No bug, somme servers are buggy. - - if (! $self->Ignoresizeerrors ) { - if ( length($string) != $expected_size ) { - warn "message_string: " . - "expected $expected_size bytes but received " . - length($string) . "\n"; - $self->LastError("message_string: expected ". - "$expected_size bytes but received " . - length($string)."\n"); - } - } - return $string; -}; - - - -{ -no warnings 'once'; - -*Mail::IMAPClient::Ssl = sub { - my $self = shift; - - if (@_) { $self->{SSL} = shift } - return $self->{SSL}; -}; - -*Mail::IMAPClient::exists = sub { - my ( $self, $folder ) = @_; - $self->status($folder) ? $self : undef; -}; - - - -*Mail::IMAPClient::Authuser = sub { - my $self = shift; - - if (@_) { $self->{AUTHUSER} = shift } - return $self->{AUTHUSER}; -}; - - -*Mail::IMAPClient::Ignoresizeerrors = sub { - my $self = shift; - - if (@_) { $self->{IGNORESIZEERRORS} = shift } - return $self->{IGNORESIZEERRORS}; -}; - -*Mail::IMAPClient::Reconnectretry = sub { - my $self = shift; - - if (@_) { $self->{RECONNECTRETRY} = shift } - return $self->{RECONNECTRETRY}; -}; - - -*Mail::IMAPClient::reconnect = sub { - my $self = shift; - - if ( $self->IsAuthenticated ) { - $self->_debug("reconnect called but already authenticated"); - return $self; - } - - my $einfo = $self->LastError || ""; - $self->_debug( "reconnecting to ", $self->Server, ", last error: $einfo" ); - - # reconnect and select appropriate folder - $self->connect or return undef; - - return ( defined $self->Folder ) ? $self->select( $self->Folder ) : $self; -}; - - -# wrapper for _imap_command_do to enable retrying on lost connections -*Mail::IMAPClient::_imap_command = sub { - my $self = shift; - - my $tries = 0; - my $retry = $self->Reconnectretry || 0; - my ( $rc, @err ); - - #print "@_ Beg _imap_command:\n", memory_consumption(); - - # LastError (if set) will be overwritten masking any earlier errors - while ( $tries++ <= $retry ) { - # do command on the first try or if Connected (reconnect ongoing) - if ( $tries == 1 or $self->IsConnected ) { - #print "call @_\n"; - $rc = $self->_imap_command_do(@_); - push( @err, $self->LastError ) if $self->LastError; - #print "call @_ done [", $rc || '', "] [$tries/$retry][" . $self->IsUnconnected . "]\n"; - } - - if ( !defined($rc) - and $retry and $self->IsUnconnected - and ( $self->LastIMAPCommand !~ /LOGOUT/ ) - - ) { - print "\nWarning: disconnected. "; - if ( $self->reconnect ) { - print "Reconnect successful on try #$tries\n"; - $self->Reconnect_counter($self->Reconnect_counter() + 1); - } - else { - print "Reconnect failed on try #$tries\n"; - push( @err, $self->LastError ) if $self->LastError; - } - } - else { - last; - } - } - - unless ($rc) { - my ( %seen, @keep, @info ); - - foreach my $str (@err) { - my ( $sz, $len ) = ( 96, length($str) ); - $str =~ s/$CR?$LF$/\\n/omg; - if ( !$self->Debug and $len > $sz * 2 ) { - my $beg = substr( $str, 0, $sz ); - my $end = substr( $str, -$sz, $sz ); - $str = $beg . "..." . $end; - } - next if $seen{$str}++; - push( @keep, $str ); - } - foreach my $msg (@keep) { - push( @info, $msg . ( $seen{$msg} > 1 ? " ($seen{$msg}x)" : "" ) ); - } - $self->LastError( join( "; ", @info ) ); - } - #print "@_ End _imap_command:\n", memory_consumption(); - return $rc; -}; - - -*Mail::IMAPClient::_imap_command_do = sub { - - my $self = shift; - my $string = shift or return undef; - my $good = shift || 'GOOD'; - - my $qgood = quotemeta($good); - - my $clear = ""; - $clear = $self->Clear; - - $self->Clear($clear) - if $self->Count >= $clear and $clear > 0; - - my $count = $self->Count($self->Count+1); - - $string = "$count $string" ; - - #print "$string\n", memory_consumption(); - $self->_record($count,[ 0, "INPUT", "$string\x0d\x0a"] ); - #print "\n2 $count\n", memory_consumption(); - my $feedback = $self->_send_line("$string"); - - unless ($feedback) { - $self->LastError( "Error sending '$string' to IMAP: $!\n"); - $@ = "Error sending '$string' to IMAP: $!"; - carp "Error sending '$string' to IMAP: $!"; - return undef; - } - - my ($code, $output); - $output = ""; - - READ: until ( $code) { - # escape infinite loop if read_line never returns any data: - $output = $self->_read_line or return undef; - - for my $o (@$output) { - - $self->_record($count,$o); # $o is a ref - # $self->_debug("Received from readline: ${\($o->[DATA])}<>\n"); - next unless $self->_is_output($o); - if ( $good eq '+' ) { - $o->[DATA] =~ /^$count (OK|BAD|NO|$qgood)|^($qgood)/mi ; - $code = $1||$2 ; - } else { - ($code) = $o->[DATA] =~ /^$count (OK|BAD|NO|$qgood)/mi ; - } - if ($o->[DATA] =~ /^\*\s+BYE/im) { - $self->State(Unconnected); - return undef ; - } - } - } - #print "$string: returned $code\n", memory_consumption(); - # $self->_debug("Command $string: returned $code\n"); - return $code =~ /^OK|$qgood/im ? $self : undef ; - -}; - -# capability 2.2.9 is stupid: it caches and return first imap CAPABILITY call -# but call imap CAPABILITY each time. -# Copy/paste from 3.25 -*Mail::IMAPClient::capability = sub { - my $self = shift; - - if ( $self->{CAPABILITY} ) { - my @caps = keys %{ $self->{CAPABILITY} }; - return wantarray ? @caps : \@caps; - } - - $self->_imap_command('CAPABILITY') - or return undef; - - my @caps = map { split } grep s/^\*\s+CAPABILITY\s+//, $self->History; - foreach (@caps) { - $self->{CAPABILITY}{ uc $_ }++; - $self->{ uc $1 } = uc $2 if /(.*?)\=(.*)/; - } - - return wantarray ? @caps : \@caps; -}; - -*Mail::IMAPClient::_read_line = sub { - my $self = shift; - my $sh = $self->Socket; - my $literal_callback = shift; - my $output_callback = shift; - - unless ($self->IsConnected and $self->Socket) { - $self->LastError("NO Not connected.\n"); - carp "Not connected" if $^W; - return undef; - } - - my $iBuffer = ""; - my $oBuffer = []; - my $count = 0; - my $index = $self->_next_index($self->Transaction); - my $rvec = my $ready = my $errors = 0; - my $timeout = $self->Timeout; - - my $readlen = 1; - my $fast_io = $self->Fast_io; # Remember setting to reduce future method calls - - if ( $fast_io ) { - - # set fcntl if necessary: - exists $self->{_fcntl} or $self->Fast_io($fast_io); - $readlen = $self->{Buffer}||4096; - } - until ( - # there's stuff in output buffer: - scalar(@$oBuffer) and - - # the last thing there has cr-lf: - $oBuffer->[-1][DATA] =~ /\x0d\x0a$/ and - - # that thing is an output line: - $oBuffer->[-1][TYPE] eq "OUTPUT" and - - # and the input buffer has been MT'ed: - $iBuffer eq "" - - ) { - #print memory_consumption(); - my $transno = $self->Transaction; # used below in several places - if ($timeout) { - vec($rvec, fileno($self->Socket), 1) = 1; - my @ready = $self->{_select}->can_read($timeout) ; - unless ( @ready ) { - $self->LastError("Tag $transno: " . - "Timeout after $timeout seconds " . - "waiting for data from server\n"); - $self->_record($transno, - [ $self->_next_index($transno), - "ERROR", - "$transno * NO Timeout after ". - "$timeout seconds " . - "during read from " . - "server\x0d\x0a" - ] - ); - $self->LastError( - "Timeout after $timeout seconds " . - "during read from server\x0d\x0a" - ); - return undef; - } - } - - #local($^W) = undef; # Now quiet down warnings - - # read "$readlen" bytes (or less): - # need to check return code from $self->_sysread - # in case other end has shut down!!! - my $ret = $self->_sysread( $sh, \$iBuffer, $readlen, length($iBuffer)) ; - # $self->_debug("Read so far: $iBuffer<>\n"); - redo if(! defined($ret)) ; - if(($timeout and ! defined($ret))) { # Blocking read error... - my $msg = "Error while reading data from server: $!\x0d\x0a"; - $self->LastError('Error while reading data from server'); - $self->State(Unconnected); - print $msg; - $self->_record($transno, - [ $self->_next_index($transno), - "ERROR", "$transno * NO $msg " - ]); - $@ = "$msg"; - - return undef; - } - elsif(defined($ret) and $ret == 0) { # Caught EOF... - my $msg="Socket closed while reading data from server [$!]\x0d\x0a"; - print "$msg"; - $self->LastError('Socket closed while reading data from server'); - $self->State(Unconnected); - $self->_record($transno, - [ $self->_next_index($transno), - "ERROR", "$transno * NO $msg " - ]); - $@ = "$msg"; - return undef; - } - - # successfully wrote to other end, keep going... - $count += $ret; - LINES: while ( $iBuffer =~ s/^(.*?\x0d?\x0a)// ) { - my $current_line = $1; - #print memory_consumption(); - - # $self->_debug("BUFFER: pulled from buffer: ${current_line}\n" . - # "and left with buffer contents of: ${iBuffer}\n"); - - LITERAL: if ($current_line =~ s/\{(\d+)\}\x0d\x0a$//) { - # This part handles IMAP "Literals", - # which according to rfc2060 look something like this: - # [tag]|* BLAH BLAH {nnn}\r\n - # [nnn bytes of literally transmitted stuff] - # [part of line that follows literal data]\r\n - - # Set $len to be length of impending literal: - my $len = $1 ; - - $self->_debug("LITERAL: received literal in line ". - "$current_line of length $len; ". - "attempting to ". - "retrieve from the " . length($iBuffer) . - " bytes in: $iBuffer\n"); - - # Xfer up to $len bytes from front of $iBuffer to $litstring: - my $litstring = substr($iBuffer, 0, $len); - $iBuffer = substr($iBuffer, length($litstring), - length($iBuffer) - length($litstring) ) ; - - # Figure out what's left to read (i.e. what part of - # literal wasn't in buffer): - my $remainder_count = $len - length($litstring); - my $callback_value = ""; - - if ( defined($literal_callback) ) { - if ( $literal_callback =~ /GLOB/) { - print $literal_callback $litstring ; - $litstring = ""; - } elsif ($literal_callback =~ /CODE/ ) { - # Don't do a thing - - } else { - $self->LastError( - ref($literal_callback) . - " is an invalid callback type; " . - "must be a filehandle or coderef\n" - ); - } - - - } - if ($remainder_count > 0 and $timeout) { - # If we're doing timeouts then here we set up select - # and wait for data from the the IMAP socket. - vec($rvec, fileno($self->Socket), 1) = 1; - unless ( CORE::select( $ready = $rvec, - undef, - $errors = $rvec, - $timeout) - ) { - # Select failed; that means bad news. - # Better tell someone. - $self->LastError("Tag " . $transno . - ": Timeout waiting for literal data " . - "from server\n"); - carp "Tag " . $transno . - ": Timeout waiting for literal data " . - "from server\n" - if $self->Debug or $^W; - return undef; - } - } - - fcntl($sh, F_SETFL, $self->{_fcntl}) - if $fast_io and defined($self->{_fcntl}); - while ( $remainder_count > 0 ) { # As long as not done, - $self->_debug("Still need $remainder_count to " . - "complete literal string\n"); - my $ret = $self->_sysread( # bytes read - $sh, # IMAP handle - \$litstring, # place to read into - $remainder_count, # bytes left to read - length($litstring) # offset to read into - ) ; - $self->_debug("Received ret=$ret and buffer = " . - "\n$litstring\nwhile processing LITERAL\n"); - if ( $timeout and !defined($ret)) { # possible timeout - $self->_record($transno, [ - $self->_next_index($transno), - "ERROR", - "$transno * NO Error reading data " . - "from server: $!\n" - ] - ); - return undef; - } elsif ( $ret == 0 and eof($sh) ) { - $self->_record($transno, [ - $self->_next_index($transno), - "ERROR", - "$transno * ". - "BYE Server unexpectedly " . - "closed connection: $!\n" - ] - ); - $self->State(Unconnected); - return undef; - } - # decrement remaining bytes by amt read: - $remainder_count -= $ret; - - if ( length($litstring) > $len ) { - # copy the extra struff into the iBuffer: - $iBuffer = substr( - $litstring, - $len, - length($litstring) - $len - ); - $litstring = substr($litstring, 0, $len) ; - } - - if ( defined($literal_callback) ) { - if ( $literal_callback =~ /GLOB/ ) { - print $literal_callback $litstring; - $litstring = ""; - } - } - - } - $literal_callback->($litstring) - if defined($litstring) and - defined($literal_callback) and $literal_callback =~ /CODE/; - - $self->Fast_io($fast_io) if $fast_io; - - # Now let's make sure there are no IMAP server output lines - # (i.e. [tag|*] BAD|NO|OK Text) embedded in the literal string - # (There shouldn't be but I've seen it done!), but only if - # EnableServerResponseInLiteral is set to true - - my $embedded_output = 0; - my $lastline = ( split(/\x0d?\x0a/,$litstring))[-1] - if $litstring; - - if ( $self->EnableServerResponseInLiteral and - $lastline and - $lastline =~ /^(?:\*|(\d+))\s(BAD|NO|OK)/i - ) { - $litstring =~ s/\Q$lastline\E\x0d?\x0a//; - $embedded_output++; - - $self->_debug("Got server output mixed in " . - "with literal: $lastline\n" - ) if $self->Debug; - - } - # Finally, we need to stuff the literal onto the - # end of the oBuffer: - push @$oBuffer, [ $index++, "OUTPUT" , $current_line], - [ $index++, "LITERAL", $litstring ]; - push @$oBuffer, [ $index++, "OUTPUT", $lastline ] - if $embedded_output; - - } else { - push @$oBuffer, [ $index++, "OUTPUT" , $current_line ]; - } - - } - #$self->_debug("iBuffer is now: $iBuffer<>\n"); - } - # _debug $self, "Buffer is now $buffer\n"; - _debug $self, "Read: " . join("",map {$_->[DATA]} @$oBuffer) ."\n" - if $self->Debug; - return scalar(@$oBuffer) ? $oBuffer : undef ; -}; - - - -} - -# End of sub override_imapclient (yes, very bad indentation) -} - -# IMAPClient 2.2.9 3.xx ads - -package Mail::IMAPClient; - -sub Split { - my $self = shift; - - if (@_) { - $self->{SPLIT} = shift; - $self->{Maxcommandlength} = 10 * $self->{SPLIT}; - } - return $self->{SPLIT}; -} - -sub Tls { - my $self = shift; - - if (@_) { $self->{TLS} = shift } - return $self->{TLS}; -} - -sub Reconnect_counter { - my $self = shift; - $self->{Reconnect_counter} = 0 if ( not defined( $self->{Reconnect_counter} ) ) ; - if (@_) { $self->{Reconnect_counter} = shift } - return $self->{Reconnect_counter}; - -} - - -sub Banner { - my $self = shift; - - if (@_) { $self->{BANNER} = shift } - return $self->{BANNER}; -} - - -sub RawSocket2 { - my ( $self, $sock ) = @_; - defined $sock - or return $self->{Socket}; - - $self->{Socket} = $sock; - $self->{_select} = IO::Select->new($sock); - delete $self->{_fcntl}; - #$self->Fast_io( $self->Fast_io ); - $sock; -} - -sub capability_update { - my $self = shift; - - delete $self->{CAPABILITY}; - $self->capability; -} - -sub fetch_hash_2 { - # taken from above *Mail::IMAPClient::fetch_hash - # if last arg is a ref then the fetch is done only - # on the messages listed as the keys of this hash. - # Init an "empty" $hash_ref by value can be done this way: - # @$hash_ref{2, 3, 4, 55} = (undef); - - my $self = shift; - my $hash_ref = ref($_[-1]) ? pop @_ : {}; - my @words = @_; - for (@words) { - s/([\( ])FAST([\) ])/${1}FLAGS INTERNALDATE RFC822\.SIZE$2/i ; - s/([\( ])FULL([\) ])/${1}FLAGS INTERNALDATE RFC822\.SIZE ENVELOPE BODY$2/i ; - } - - my $msgs_ref_all; - if (scalar %$hash_ref) { - $msgs_ref_all = [ sort { $a <=> $b } keys (%$hash_ref) ]; - #print "ZZZZ 1 [@$msgs_ref_all]\n"; - }else{ - $msgs_ref_all = scalar($self->messages); - #print "ZZZZ 2 [@$msgs_ref_all]\n"; - } - - my $split = $self->Split() || scalar(@$msgs_ref_all); - while(my @msgs = splice(@$msgs_ref_all, 0, $split)) { - #print "SPLIT: @msgs\n"; - my $msgs_ref = \@msgs; - my $output = scalar($self->fetch($msgs_ref,"(" . join(" ",@_) . ")")) - ; # unless grep(/\b(?:FAST|FULL)\b/i,@words); - my $x; - for ($x = 0; $x <= $#$output ; $x++) { - my $entry = {}; - my $l = $output->[$x]; - if ($self->Uid) { - my($uid) = $l =~ /\((?:.* )?UID (\d+).*\)/i; - next unless $uid; - if ( defined $hash_ref->{$uid} ) { - $entry = $hash_ref->{$uid} ; - } - else { - $hash_ref->{$uid} ||= $entry; - } - } - else { - my($mid) = $l =~ /^\* (\d+) FETCH/i; - next unless $mid; - if ( defined $hash_ref->{$mid} ) { - $entry = $hash_ref->{$mid} ; - } - else { - $hash_ref->{$mid} ||= $entry; - } - } - - foreach my $w (@words) { - if ( $l =~ /\Q$w\E\s*$/i ) { - $entry->{$w} = $output->[$x+1]; - $entry->{$w} =~ s/(?:\x0a?\x0d)+$//g; - chomp $entry->{$w}; - } - else { - $l =~ /\( # open paren followed by ... - (?:.*\s)? # ...optional stuff and a space - \Q$w\E\s # escaped fetch field - (?:" # then: a dbl-quote - (\\.| # then bslashed anychar(s) or ... - [^"]+) # ... nonquote char(s) - "| # then closing quote; or ... - \( # ...an open paren - (\\.| # then bslashed anychar or ... - [^\)]*) # ... non-close-paren char - \)| # then closing paren; or ... - (\S+)) # unquoted string - (?:\s.*)? # possibly followed by space-stuff - \) # close paren - /xi; - $entry->{$w}=defined($1)?$1:defined($2)?$2:$3; - } - } - } -} - return wantarray ? %$hash_ref : $hash_ref; -} diff --git a/imapsync.exe b/imapsync.exe deleted file mode 100755 index f5b8ec32be71154fb06e2f4c77272b8a1a5e44d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5820177 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∋m80Ta9?shv4}=fB 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
    A;Dl3Tnk*=n%-mZkZKq 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%0ASOel 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 z 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