This commit is contained in:
Nick Bebout 2015-05-28 12:04:57 -05:00
parent 4a536871fe
commit e2bfc931f4
206 changed files with 7348 additions and 7982 deletions

145
ChangeLog
View file

@ -1,17 +1,154 @@
RCS file: RCS/imapsync,v
Working file: imapsync
head: 1.607
head: 1.637
branch:
locks: strict
gilles: 1.607
gilles: 1.637
access list:
symbolic names:
keyword substitution: kv
total revisions: 607; selected revisions: 607
total revisions: 637; selected revisions: 637
description:
----------------------------
revision 1.607 locked by: gilles;
revision 1.637 locked by: gilles;
date: 2015/04/01 01:36:37; author: gilles; state: Exp; lines: +9 -9
Bugfix. Win32 regression with long_path_2_prefix test. Was too long.
----------------------------
revision 1.636
date: 2015/03/31 14:54:41; author: gilles; state: Exp; lines: +107 -65
Added errors dump. By default. Use --noerrorsdump to avoid it.
Added --errorsmax switch. Default is like --errorsmax 50. Exit after 50 errors encountered.
----------------------------
revision 1.635
date: 2015/03/30 07:36:08; author: gilles; state: Exp; lines: +19 -15
Changed basic example to a working one with test1.lamiral.info
----------------------------
revision 1.634
date: 2015/03/25 02:10:56; author: gilles; state: Exp; lines: +10 -7
Bugfix. Remove tmp files upon failure as well.
----------------------------
revision 1.633
date: 2015/03/25 01:14:36; author: gilles; state: Exp; lines: +96 -73
IO::Socket::SSL not mandatory. (Sometimes hard to install).
Bugfix. SKIP sections for Unix or Windows tests. Removed no_plan. 561 non-regression tests.
----------------------------
revision 1.632
date: 2015/03/23 23:29:16; author: gilles; state: Exp; lines: +16 -6
Added tests_live_result() call at the end of --livetests
----------------------------
revision 1.631
date: 2015/03/23 00:04:04; author: gilles; state: Exp; lines: +52 -41
README part review.
----------------------------
revision 1.630
date: 2015/03/20 03:07:59; author: gilles; state: Exp; lines: +93 -52
Bugfix. Made --tests succeed on Windows. At least at home.
----------------------------
revision 1.629
date: 2015/03/19 03:43:24; author: gilles; state: Exp; lines: +10 -16
Usability. Better output of folders excluded by --exclude and folders included by --include
----------------------------
revision 1.628
date: 2015/03/19 03:03:28; author: gilles; state: Exp; lines: +80 -38
Bugfix. tests_imapsync_basename only check substring imapsync in the command name used.
Feature. Added --maxlinelengthcmd that will be called upon when a line over --maxlinelength is detected. --maxlinelengthcmd 'reformime -r7' on Linux.
----------------------------
revision 1.627
date: 2015/03/16 15:55:57; author: gilles; state: Exp; lines: +34 -21
Added --testslive
----------------------------
revision 1.626
date: 2015/03/15 02:52:43; author: gilles; state: Exp; lines: +20 -20
Update tests_skipmess()
----------------------------
revision 1.625
date: 2015/03/14 00:32:41; author: gilles; state: Exp; lines: +31 -15
Bugfix. New disarmreadreceipts was buggy in IMAP. Fixed. \r in the beginning.
----------------------------
revision 1.624
date: 2015/03/13 02:05:12; author: gilles; state: Exp; lines: +41 -18
Searching for "deep recursion" with skipmess on "Partial" messages. Not found.
----------------------------
revision 1.623
date: 2015/03/12 16:33:59; author: gilles; state: Exp; lines: +21 -6
Made check folders exist on host1 independent of checkselectable.
----------------------------
revision 1.622
date: 2015/03/12 16:28:38; author: gilles; state: Exp; lines: +24 -11
Bugfix. --folderfirst and --folderlast generated an error when their value folder does not exist. Existence is checked.
----------------------------
revision 1.621
date: 2015/03/12 10:40:11; author: gilles; state: Exp; lines: +86 -21
Bugfix --disarmreadreceipts last fix was a bad one. In IMAP \n is \r\n.
Added error handling for --pipemess
Adapted tests for "Content-Type: Message/Partial" --slipmess
----------------------------
revision 1.620
date: 2015/03/10 04:07:33; author: gilles; state: Exp; lines: +141 -10
Bugfix. --disarmreadreceipts used to change Disposition-Notification-To in the body when not available in the header. Now never changed in the body in all cases.
----------------------------
revision 1.619
date: 2015/03/10 03:13:30; author: gilles; state: Exp; lines: +301 -22
Use \x00 as a separator to detect --delete 2, instead of ¤.
Added tests for --skipmess, especially for header "Content-Type: Message/Partial"
Bug detected --disarmreadreceipts isn't correct. Added tests and fix in tests.
Added tests in tests_regexmess(). Disposition-Notification-To: better handled.
----------------------------
revision 1.618
date: 2015/03/07 04:38:59; author: gilles; state: Exp; lines: +261 -205
Added --pipemess in order to pass all message to an external filter tool like "reformime -r7".
----------------------------
revision 1.617
date: 2015/03/04 01:09:50; author: gilles; state: Exp; lines: +18 -19
Link to http://www.imap.org/ changed to archive.org.
----------------------------
revision 1.616
date: 2015/03/02 23:14:42; author: gilles; state: Exp; lines: +86 -10
Added xoauth2 support. Thanks to Joaquin Lopez.
----------------------------
revision 1.615
date: 2015/03/01 23:26:10; author: gilles; state: Exp; lines: +76 -46
Fixed tests with "header_line_normalize: remove last blanks".
Remove the last blanks ( Gmail bug ) to identify message with headers.
Term::ReadKey and IO::Socket::SSL now in use statements instead of require (so they became mandatory).
Change list of use pragmas order to facilitate reading.
----------------------------
revision 1.614
date: 2015/02/22 22:43:16; author: gilles; state: Exp; lines: +90 -46
Added inline help.
About --nofoldersizes, foldernames listings, --passfile1 --passfile2.
Change usage order.
----------------------------
revision 1.613
date: 2015/02/22 01:08:51; author: gilles; state: Exp; lines: +23 -10
Fixed issue with 1282658400 and logfile() by and system upgrade. Looks like Ubuntu 10.4 was buggy.
----------------------------
revision 1.612
date: 2015/02/03 23:20:51; author: gilles; state: Exp; lines: +17 -13
Fixed tests_logfile() when TZ is not mine.
Works for epoch 0 but found a difference for 1282658400
----------------------------
revision 1.611
date: 2015/02/02 16:14:43; author: gilles; state: Exp; lines: +18 -18
Started inline help; talk about options everywhere it means and help to lean imapsync.
Change default useheader. Now it is really like --useheader "Message-Id" --useheader "Received"
HMailServer replies two lines with --useheader "Message-Id" --useheader "Message-ID" in older releases.
----------------------------
revision 1.610
date: 2015/01/20 12:07:30; author: gilles; state: Exp; lines: +21 -15
Bugfix in imap_utf7_decode() + must not be escaped.
----------------------------
revision 1.609
date: 2014/11/28 17:06:53; author: gilles; state: Exp; lines: +14 -8
Bugfix. --skipmess was not skipping.
----------------------------
revision 1.608
date: 2014/11/28 16:47:29; author: gilles; state: Exp; lines: +95 -12
Added --skipmess to skip messages matching a regex.
Example --skipmess 'm/[\x80-ff]/'
----------------------------
revision 1.607
date: 2014/11/14 16:25:06; author: gilles; state: Exp; lines: +46 -40
Added several checks if IsUnconnected. Goal avoid imap commands while disconnected.
----------------------------

781
FAQ
View file

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: FAQ,v 1.190 2014/11/14 17:08:02 gilles Exp gilles $
# $Id: FAQ,v 1.205 2015/03/26 08:13:29 gilles Exp gilles $
+------------------+
| FAQ for imapsync |
@ -78,13 +78,13 @@ R. Read the README and FAQ files in the tarball also available at
Q. Can you give some configuration examples?
R. The FAQ file contains many examples for several scenarios
http://www.linux-france.org/prj/imapsync/FAQ
http://imapsync.lamiral.info/FAQ
=======================================================================
Q. How can I have commercial support?
R. Buy support from imapsync author and expert: Gilles LAMIRAL
http://imapsync.lamiral.info/#buy_support
http://imapsync.lamiral.info/#buy_all
=======================================================================
Q. How can I have gratis support?
@ -140,37 +140,6 @@ c) Etc. Search the web. There's also specific tools and paid services.
There's no silver bullet to migrate Calendars and Contacts,
if you find one, tell me!
=======================================================================
Q. I need to migrate hundred accounts, how can I do?
R. If you have many mailboxes to migrate think about a little
shell program. Write a file called file.txt (for example)
containing users and passwords.
The separator used in this example is ";"
The file.txt file contains:
user001_1;password001_1;user001_2;password001_2
user002_1;password002_1;user002_2;password002_2
user003_1;password003_1;user003_2;password003_2
user004_1;password004_1;user004_2;password004_2
user005_1;password005_1;user005_2;password005_2
...
On Unix the shell program can be:
{ while IFS=';' read u1 p1 u2 p2; do
imapsync --host1 imap.side1.org --user1 "$u1" --password1 "$p1" \
--host2 imap.side2.org --user2 "$u2" --password2 "$p2" ...
done ; } < file.txt
On Windows the batch program can be:
FOR /F "tokens=1,2,3,4 delims=; eol=#" %%G IN (file.txt) DO imapsync ^
--host1 imap.side1.org --user1 %%G --password1 %%H ^
--host2 imap.side2.org --user2 %%I --password2 %%J ...
The ... can be replaced by nothing or any supplementary imapsync option.
=======================================================================
Q. Where I can find old imapsync releases?
@ -227,30 +196,35 @@ R. By using --useuid imapsync avoid getting messages headers and build
imapsync ... --useuid
On Unix:
imapsync ... --useuid --tmpdir /var/tmp/
R. Add also --nofoldersizes since the default behavior is to compute
folder sizes. Folder sizes are useless for the transfer, just
useful to see what has to be done on each folder and guess when
the transfer will end (ETA).
R. Add also --noexpungeaftereach if you use --delete.
But be warn that an interrupted transfer can loose messages
on host2 in a second run if you use a (silly) combination like
imapsync ... --delete --noexpunge --noexpungeaftereach --expunge2
R. Add also --nocheckmessageexists
--nocheckmessageexists is on by default since release 1.520.
Since transfer can be long on a huge mailbox imapsync checks
a message exist before copying it, but it takes time and
cpu on the host1 server.
--nocheckmessageexists is on by default since release 1.520
R. Add also --noexpungeaftereach if you use --delete but be warn
that an interrupted transfer can loose messages on host2 in a
second run if you use a combination like
imapsync ... --delete --noexpunge --noexpungeaftereach --expunge2
Notes about --useuid
Case where building the cache first is necessary (to avoid multiples transfers)
If you run again imapsync with --useuid on a transfer already done without --useuid
then, to avoid messages be copied again, first run imapsync with --usecache
but without --useuid, example scenario:
If you run again imapsync with --useuid on a transfer already done without
--useuid then, to avoid messages be copied again, first run imapsync
with --usecache but without --useuid, example scenario:
A] Running with the default options, I began without --useuid
@ -275,17 +249,18 @@ B] I began with --useuid from the first time
imapsync ... --useuid
Inodes number issue
Inodes number issue.
The cache is simple, it uses the file-system natively,
it's just an empty file per message transfered.
When mailboxes are huge the cache can exhaust the number of inodes
allowed in the filesystem, that's a limitation like size but less
often encountered.
allowed in the filesystem, that's a limitation like limitation
size but it's less often encountered.
On Unix, to predict whether your tmpdir filesystem used by imapsync
will support the whole cache, just run the command "df -i /var/tmp",
if /var/tmp is the --tmpdir argument.
On windows, search and drop me a note about how to count the number
of files allowed in the filesystem.
It seems FAT32 supports 268 435 445 clusters.
@ -426,7 +401,7 @@ So have a try with imapsync on the same host1.
Q. Folders are not created on host2. What happens?
R. Do you use IMAP or POP3 with your client software?
It looks like you use POP3 instead of IMAP, POP3 has only INBOX.
It looks like you use POP3 instead of IMAP, POP3 sees only INBOX.
=======================================================================
@ -445,47 +420,65 @@ A better tool with this scenario is offlineimap,
designed for this issue, and faster than imapsync.
=======================================================================
Q. We have found that the sent time and date have been changed to the
time at which the file was synchronized.
Q. We have found that the time and date displayed have been changed to
the time at which the file was synchronized.
R. This is the case with:
- Eudora
R. This is the case by default with some email readers like:
- Outlook 2003
but not with
- Ipad
but not with:
- Mutt
- Thunderbird
and no longer with
- Zimbra
- Gmail
Eurora shows by default the time the imap server received the email. I
think it is quite a wrong behavior since the messages can have
traveled some time before the reception.
A thing to keep in mind, imapsync does not touch any byte of messages
unless told to do so by option --regexmess.
Messages on both parts should be identical.
I explain the whole picture about dates of messages.
There are several different dates for any message.
First, there is the "Date:" header. Most of the time, this date is set
by the MUA. MUA means Mail User Agent; it is Outlook, Mutt
or Thunderbird. The Date header is usually the date the message was written
or sent the first time. It is never changed by any transfer or copy.
If an email reader uses the Date header for displaying the date of a
message then no problem should arise.
There is also the internal date. In IMAP the internal date is handled
and normally it corresponds to the arrival date in the mailbox. The
IMAP protocol allows the internal date to be set by a email client.
Imapsync synchronizes internal dates by default, internal dates on host2
should then be the same as the internal dates on host1.
If an email reader uses the internal date for displaying the date of a
message then the sync date problem only occurs when the host2 server software
ignores the internal date given by imapsync during the APPEND imap
command. It happens with some imap servers.
There are also the Received header lines. Each time a message travels
a SMTP server, this one adds a Received header line. Sometimes
some email clients use the last "Received" header date as the date of the
message. And some IMAP servers softwares add a Received line after
and imap transfer. If those both conditions are met then the date
displayed become the transfer date even if imapsync
has done its best to keep all the dates synchronized. Bad luck.
The sent time and date are given by the "Date:" header and it is set
most of the time by the MUA (Mail User Agent, Mutt, Eudora,
Thunderbird etc.).
imapsync does not touch any byte of messages unless told to do so
by an option. Messages on both parts should be identical
(some IMAP servers add or even change header lines).
Solutions:
a) Use the --syncinternaldates option and keep using Eudora.
But --syncinternaldates is now turn on by default so if you
encounter the issue then the solution is harder, depending
on email client softwares and IMAP server softwares.
a) Use a better email client or configure it in order it sorts messages
by sent date, the Date header.
b) use --idatefromheader to set the internal dates on host2 same as the
"Date:" headers. It won't work if a) doesn't work.
b) Use a imap server that respects the imap RFC and accepts
the internal date set by imapsync.
c) In Maildir boxes, after the sync (too late...), use the script
learn/adjust_time.pl to change the internal dates from the "Date:" header.
(this a Unix fix using touch command)
c) Try to understand why the reader shows another date.
For Exchange look at the next FAQ item.
d) Use a better email client or configure it in order it sorts messages
by sent date.
=======================================================================
@ -580,36 +573,6 @@ The file imapsync.pid contains the PID of the imapsync process.
This file is removed at the end of a normal run.
You can safely ignore the warning if you don't use imapsync.pid file.
=======================================================================
Q. Couldn't create folder [trash] from [INBOX.trash]:
588 NO Mailbox already exists.
R. Some servers take care about character case in folder names,
some servers do not, like Exchange. Since non-respecting case
can merge two different folders into one then imapsync respects case.
For example, if a host1 server has a folder name called "trash"
and the host2 server already has a folder "Trash" or "TRASH"
then imapsync will try to create the folder "trash" on host2,
because trash and Trash are different strings. But if host2
does not respect character case it will consider folder "trash"
already exists and will say it, that's the error message
reported by imapsync: "Mailbox already exists", message coming
from the server.
The folder creation fails but messages are well transfered in
so take a look at this warning, understand why it happens
and it should be fine most of the time.
To avoid this warning use --regextrans2 to map the folder names
imapsync ... --regextrans2 "s/^trash$/Trash/"
If there are two folders Trash and trash on host1 then both
will be merge into only one Trash folder on host2.
In case option --delete2 is used the regextans2 above becomes
mandatory, otherwise imapsync will sync messages from the
first Trash and then delete them when syncing trash.
=======================================================================
Q. Couldn't create [INBOX.Ops/foo/bar]: NO Invalid mailbox name:
@ -669,7 +632,7 @@ to all folders on host2.
Q. Is there a way we can specify a date range to sync emails?
If yes, can you please share an example?
Yes, with the --search option.
R. Yes, with the --search option.
imapsync ... --search "SENTSINCE 1-Jan-2010 SENTBEFORE 31-Dec-2010"
@ -686,6 +649,40 @@ Yes, with the --search option.
Nov
Dec
=======================================================================
Q. Is there a way we can specify an age to sync emails?
If yes, can you please share some examples?
R. Yes, with the --maxage or the --minage option.
E.1 Sync only messages less than 2 days old:
imapsync ... --maxage 2
E.2 Sync only messages more than 2 days old:
imapsync ... --minage 2
E.3 Sync only messages more than 30 days old and less than 365 days old:
imapsync ... --minage 30 --maxage 365
E.4 Sync only messages less than 30 days old or more than 365 days old:
imapsync ... --maxage 30 --minage 365
Full explanation:
--maxage <int> : Skip messages older than <int> days.
final stats (skipped) don't count older messages
see also --minage
--minage <int> : Skip messages newer than <int> 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)
=======================================================================
Q. Does imapsync retain the \Answered and $Forwarded flags?
@ -1056,18 +1053,6 @@ b OK 73 good day (Success)
The client part to type is "a LOGIN ..." and "b LOGOUT" without
the double-quotes.
=======================================================================
Q. On windows ssl use to work with imapsync.exe 1.536 or previous then
an upgrade to next release makes it fail.
R. The I0::Socket::SSL can have SSL_version set by default to
"SSLv23:!SSLv2" but the auto-negociation can fail with
some ssl servers. Use --ssl1_SSL_version or
--ssl2_SSL_version to change SSL_version.
Try:
imapsync ... --ssl1 --ssl1_SSL_version "SSLv3"
=======================================================================
Q: How to have an imaps server?
@ -1083,7 +1068,7 @@ c) or use stunnel on inetd
imaps stream tcp nowait cyrus /usr/sbin/stunnel -s cyrus -p /etc/ssl/certs/imapd.pem -r localhost:imap2
=======================================================================
Q: Multiple copies when I run imapsync twice ore more.
Q: Multiple copies, duplicates, when I run imapsync twice ore more.
R1. You can use option --useuid, imapsync then won't use header lines to
compare messages in folders. Keep in ming it uses a local cache.
@ -1091,11 +1076,11 @@ compare messages in folders. Keep in ming it uses a local cache.
imapsync ... --useuid
R2. Multiple copies of the emails on the destination server. Some IMAP
servers (Domino for example) add some headers for each message
transfered. The message is transfered again and again each time you
servers (Domino for example) change some headers for each message
transferred. All messages are transferred again and again each time you
run imapsync. This is bad of course. The explanation is that imapsync
considers the message is not the same since headers have changed (one
line added) and size too (the header part).
considers messages are not the same on each side, default headers used
to identify the messages have changed.
You can look at the headers found by imapsync by using the --debug
option (and search for the message on both part), Header lines from
@ -1104,28 +1089,36 @@ destination server begin with a "TH:" prefix. Since --debug is very
verbose I suggest to isolate a email in a specific folder in case you
want to forward me the output.
The way to avoid this problem is by using options --skipheader and
--skipsize, like this (avoid headers beginning whith the string "X-"):
A way to avoid this problem is by using option --useheader with
a different set than the default ones used by imapsync.
imapsync ... --skipheader "^X-" --skipsize
The default set is like:
To skip several headers you can use --skipheader one time
imapsync ... --useheader "Message-ID" --useheader "Received"
imapsync ... --skipheader "^X-|^Status|^Bcc"
The big problem is that what can be used instead of Message-ID
and Received lines? Sometimes standalone Message-ID works:
If you think you have too many header to avoid just use
imapsync ... --useheader "Message-ID"
imapsync ... --useheader "Message-ID" --skipsize
Another good way to the solution is to isolate two or three messages
in a BUG folder and send the --debug output to the author
gilles.lamiral@laposte.net
imapsync ... --debug --folder BUG
I will take a close look at the log and modify imapsync to fix
this faulty duplicate behaviour.
Remark. (Trick found by Tomasz Kaczmarski)
Option --useheader "Message-ID" asks the server to send only header
lines begining with "Message-ID". Some (buggy) servers send the whole
lines beginning with "Message-ID". Some (buggy) servers send the whole
header (all lines) instead of the "Message-ID" line. In that case, a
trick to keep the --useheader filtering behavior is to use
trick to keep the --useheader filtering behaviour is to use
--skipheader with a negative lookahead pattern :
imapsync ... --skipheader "^(?!Message-ID)" --skipsize
imapsync ... --skipheader "^(?!Message-ID)"
Read it as "skip every header except Message-ID".
@ -1186,6 +1179,21 @@ A good way to see what will be done is to first use:
imapsync ... --exclude "^INBOX$" --justfolders --nofoldersizes --dry
======================================================================
Q. Can Imapsync filter Spam during the sync?
R. No, imapsync doesn't detect Spam by itself and currently it can't
delegate this job during its IMAP syncs. But I've seen blogs and
Spamassassin documentation explaining solutions to apply Spamassassin
to a imap mailbox. So you can apply one of these solutions on the host1
source mailbox before the imapsync run or on the destination host2
mailbox after the imapsync transfer.
http://www.stearns.org/doc/spamassassin-setup.current.html#isbg
http://euer.krebsco.de/using-spamassassin-on-a-remote-imap-host.html
https://github.com/ook/isbg
======================================================================
Q. I want to exclude folders matching SPAM no matter the case,
aka how to be case insensitive
@ -1212,124 +1220,6 @@ R2. Use --include "^MyFolder"
Then the folder "MyFolder" and all its subfolders will be handled
and only them.
======================================================================
Q. Migrating to Exchange 201O, messages get date of the transfer,
this is bad for sorting and listing.
R1. Be sure to have at least Exchange 2010 SP2 Rollup 5
http://www.tribalchicken.com.au/15-technical/29-imapsync-exchange2010
R2. See also the Outlook side (thanks to Martin Hochreiter for this solution)
http://www.howto-outlook.com/faq/archivenotworking.htm
by changing Archive to sent/receive date
It's often shorter to change one server than thousands clients
so R1 might be easier to do.
======================================================================
Q. How to migrate from or to Exchange 2003 with an admin/authuser
account?
R. Thomas Edgar wrote the following
In case you can glean something from this snippet which allowed us
to migrate from Exchange 2003 t0 Cyrus Imap 2.4 (you would reverse
the flow to go the other way):
imapsync --dry --host1 ExchangeServer.mycompany.com \
--user1 Some.User@mycompany.com --authuser1 ExchangeAdminAccount \
--proxyauth1 --password1 '$pass_with_dollars$' \
--host2 cyrusimapbackend.mycompany.com \
--user2 SameOrDiffererentUser@mycompany.com \
--authuser2 CyrusAdminAccount --password2 CyrusAdminPassword
We also needed to:
- Ensure the Exchange Admin Acct had IMAP4 enabled in it's
profile (it initially didn't!)
- Ensure the Some.User Exchange Acct had IMAP4 enabled
in it's profile (it initially didn't!)
- Add the CyrusAdminAccount to admins line in /etc/imapd.conf
- Give CyrusAdminAccount lrswipkxtecda to the Cyrus Imap account
being migrated to (- or in your case, from)
In case you are not aware:
- It will prompt for a password if you don't supply it
- the domain part of the fully-qualified email could be
omitted in our case
- Use --debugimap when testing initial connectivity, if necessary
======================================================================
Q. How to migrate from or to Exchange 2007/2010 with an
admin/authuser account?
R. The tricks comes from Michele Marcionelli and Benjamin Priestman:
This doesn't work:
imapsync ... --user2 user2 --authuser2 admin2 --password2 adminpassword2 ...
This might works:
imapsync ... --user2 "domain\admin2\user2" --password2 adminpassword2 ...
or
imapsync ... --user2 "admin2@domain\user2" --password2 adminpassword2 ...
where "domain" is set be the user's UPN in Active Directory
or the NETBIOS or DNS name of the domain.
The exact format might vary depending on local configuration and you
should experiment with the different formats.
PLAIN authentication is the only way to go with --authuser1 for now.
So don't use --authmech1 SOMETHING with --authuser1 admin_user,
it will not work.
Same behavior with the --authuser2 option.
A little note from Michael Scherer.
The previous workaround in the FAQ seems to be obsolete.
I can confirm that
imapsync ... --host2 exchange_server --authmech2 PLAIN \
--authuser2 admin@domain --user2 user_alias
is working without any glitches, running Exchange 2010 SP2 here.
Explanation, Exchange knows a) about a username
and b) about a mailNickname which can be different to the username.
As it seems you need to use the mailNickname (e.g. alias) defined
for user2, not the username itself.
http://blogs.technet.com/b/exchange/archive/2004/03/31/105275.aspx
A little note from John Becker.
After you pointed out that I had issues with authorization, I realized that
as an admin user I don't have all the rights on the mailboxes.
So I added myself to the user mailbox with full rights.
I also changed the login type on the Exchange CAS to type 1, plain text.
The command that I used for imapsync is:
imapsync ... ^
--host2 exchange-server ^
--user2 "windows-domain\admin-user\aaaa" ^
--password2 admin-password ...
======================================================================
Q. How to migrate from or to Office 365 with an admin/authuser account?
Note from Yago Torres Fernandez:
(a working command using admin/authuser on host2 Office 365)
imapsync ... --authuser2 user_admin@domain.com --user2 user_to_be_migrated@domain.com ^
--password2 XXXX --ssl2 --ssl2_SSL_version SSLv3 --exclude "Shared Folders" ^
--regextrans2 "s#Trash$#Papelera#" --regextrans2 "s#^Deleted Items$#Papelera#"
but previous in Office365 you must do something like that, using powershell:
Add-MailboxPermission -identity user_to_be_migrated@domain.com -user user_admin@domain.com -accessrights fullaccess -inheritancetype all
PLAIN authentication is the only way to go with --authuser1 for now.
So don't use --authmech1 SOMETHING with --authuser1 admin_user,
it will not work.
Same behavior with the --authuser2 option.
======================================================================
Q. How to migrate from uw-imap with an admin/authuser account?
@ -1648,363 +1538,6 @@ format issues. And now it works fine. (Thanks to Hansjoerg.Maurer)
Server specific issues and solutions
=======================================================================
=======================================================================
Q. From XXX to Exchange 2010/2013 or Office365
R. Here is a command line resume that solves most encountered issues when
migrating to Exchange or Office365. To understand or change the
details you have to read next Q/R sections.
For Office365 you also have to add --ssl2 --ssl2_SSL_version SSLv3
if Office365 is host2 (or --ssl1 if Office365 is host1)
imapsync ... --ssl2 --ssl2_SSL_version SSLv3
or
imapsync ... --ssl1 --ssl1_SSL_version SSLv3
On Windows:
imapsync ... ^
--maxsize 10000000 ^
--maxlinelength 9900 ^
--regexflag "s/\\Flagged//g" ^
--disarmreadreceipts
On Unix:
imapsync ... \
--maxsize 10000000 \
--maxlinelength 9900 \
--regexflag "s/\\Flagged//g" \
--disarmreadreceipts
=======================================================================
Q. From XXX to Exchange 2013 or Office365 read receipts are all
resent again after a sync. Even for old messages. How can I fix that?
R. imapsync can remove the header containing this read receipt request.
On Unix or Windows use:
imapsync ... --disarmreadreceipts
Since read receipts should be sent for unseen messages that will go
to a seen state after the migration, you could be strict and apply
the regex only to seen messages.
Selecting seen message can be done with:
imapsync ... --search1 "SEEN" --disarmreadreceipts
Of course a second run has to be run without the --regexmess for
unseen messages:
imapsync ... --search1 "UNSEEN"
If fact --disarmreadreceipts is just an option equivalent to:
--regexmess 's{\A(.*?(?! ^$))^Disposition-Notification-To:(.*?)$}{$1X-Disposition-Notification-To:$2}igxms'
That regex prefixes the header Disposition-Notification-To with an X-
so that it becomes inactive.
Thanks to David Karnowski for pointing and solving this issue.
=======================================================================
Q. From XXX to Exchange 2010/2013 or Office365 I get this error message
sometimes: "BAD Command Argument Error 11"
R. This error message comes from Exchange IMAP server when it
encounters any problem. Most of the time it is one of the following:
* Some messages are bigger than the size limit. 10 MB by default
on Exchange. It can be upped by configuration for Exchange.
If you can't configure this limit then use option
--maxsize 10000000 for 10 MB, change it if needed) to tell
imapsync to skip those messages.
This value is 25 MB by default for Office365 --maxsize 25000000
imapsync ... --maxsize 10000000 # 10 MB for Exchange
imapsync ... --maxsize 25000000 # 25 MB for Office365
* Quota reached. The whole account is full.
It can be upped by configuration.
* Some messages have some lines too long. Use option --maxlinelength
to skip messages whose max line length is over a number of bytes.
--maxlinelength 1000 is a RFC2822 must but most server support
higher values. Exchange supports 9900:
imapsync ... --maxlinelength 9900
Have also in mind that Exchange closes the connection after 10 errors
encountered so you might also see "BYE Connection closed" errors from
Exchange, which means Exchange leaves the session and say goodbye,
come back later. Rerun a sync then.
=======================================================================
Q. From XXX to Exchange 2010 or 2013 or Office365 the flag Flagged does
not seem to be well synced.
R. Use the following trick. Run imapsync twice, one with --regexflag
and one without, like this:
1) imapsync ... --regexflag "s/\\Flagged//g"
2) imapsync ...
You can add --debugflags if you want to see what imapsync gets and
does in details with flags.
The magic of this trick is on ignoring the \Flagged flag on the first
sync and setting it on the second sync, with STORE instead of APPEND.
This Exchange bug seems that Exchange gets and sets well the Flagged
flag with APPEND in IMAP but then it forgets it with other protocols;
With STORE it sets and gets the "\Flagged" flag everywhere.
Thanks to Dave Murray and Simon Savva for reporting and solving
this issue.
=======================================================================
Q. Synchronizing from XXX to Gmail
R. There are some details to get the special [Gmail] sub-folders
right. Here's an example of migrating an old "Sent" folder to
Gmail's structure:
imapsync --host1 mail.oldhost.com \
--user1 my_email@oldhost.com \
--password1 password \
--host2 imap.gmail.com \
--user2 my_email@gmail.com \
--password2 password \
--ssl2 \
--exitwhenover 500000000 \
--maxsize 25000000 \
--expunge1 \
--addheader \
--exclude "\[Gmail\]$" \
--regextrans2 "s/[ ]+/_/g" \
--regextrans2 "s/[\^]/_/g" \
--regextrans2 "s/['\"\\\\]/_/g" \
--regextrans2 "s,^Sent$,[Gmail]/Sent Mail,"
Explanations:
--ssl2 is mandatory since Gmail only supports imap ssl connections.
--exitwhenover 500000000 option is here to avoid locking when
transfers exceed maximum limit.
See http://support.google.com/a/bin/answer.py?hl=en&answer=1071518
--exitwhenover is not mandatory in the sense you may be able to
use an upper value than 500 MB without disconnections; I don't
know the hard value, it seems to vary, so just have some tries
and report me what you discover in case you detect something.
--maxsize 25000000 is mandatory since Gmail limits messages size
up to 25 MB. This value increases over time, it was 10 MB some
years ago so you can try higher values. The Gmail page about
this limit is https://support.google.com/mail/answer/6584
--expunge1 is optional. It deletes messages marked \Deleted on host1.
Imapsync syncs messages with all their flags, Gmail takes the messages
marked \Deleted but deletes or moves them just after.
Option --expunge1 really removes messages marked \Deleted on host1
so they are not synced at all.
The --addheader option is there because "Sent" folder messages
sometimes lack the "Message-Id:" and "Received:" headers needed
by imapsync to identify messages (only when --useuid is not used).
So option --addheader adds a "Message-Id" header consisting of
the imap UID of the message on the host1 folder, like
"Message-Id: 12345@imapsync".
--exclude "\[Gmail\]$" is there to avoid a small examine/select error:
"Could not examine: 43 NO [NONEXISTENT] Unknown Mailbox: [Gmail]
(now in authenticated state) (Failure)".
--regextrans2 "s/[ ]+/_/g" is there to convert blank characters not
accepted by gmail to character _ underscore. In fact only leading
and trailing blank characters are problems with gmail, and
also successive blanks ending with the IMAP error
"NO [CANNOT] Folder contains excess whitespace (Failure)"
If you want to change only leading and trailing blank characters
then use instead:
--regextrans2 "s,(/|^) +,\$1,g" --regextrans2 "s, +(/|$),\$1,g"
On Windows, in the previous example containing \$1 you have to
replace the two \$1 by $1 (remove the \ before $1).
--regextrans2 "s/[\^]/_/g" is mandatory. It converts, since
not accepted by gmail, character ^ to character _ underscore.
--regextrans2 "s/['\"\\\\]/_/g" is optional. It converts
characters ' or " or \ to character _ underscore.
--regextrans2 "s,^Sent$,[Gmail]/Sent Mail," is to transform the
folder name "Sent" and adapt it to Gmail "Sent Mail" folder.
If you're using a different language in Gmail you might adapt
this example with the folder name translated, an example in French:
imapsync ...
--regextrans2 "s,^Messages envoy&AOk-s$,[Gmail]/Messages envoy&AOk-s," \
You can add --folder "INBOX.Sent" in the example in case
you want to sync only the "Sent" folder.
You can select folders exported to imap within the gmail preferences,
unselect some "System labels", depending on your needs.
The "All Mail" archive pseudo-folder should be updated automatically.
=======================================================================
Q. Some of the folders are getting created with [IMAP] prefix on Google
side. How to stop creating folder with this prefix?
Any switch we can use? e.g. [IMAP]/Archive
R. No switch in imapsync since [IMAP]/ prefix is done by Gmail,
it might be configurable with Gmail parameters.
=======================================================================
Q. Synchronizing from Gmail to XXX
R. Gmail needs SSL
./imapsync \
--host1 imap.gmail.com \
--user1 gilles.lamiral@gmail.com \
--password1 gmailsecret \
--host2 localhost
--user2 tata \
--password2 tatasecret \
--ssl1 \
--exitwhenover 2500000000 \
--useheader="X-Gmail-Received" \
--useheader "Message-Id" \
--skipcrossduplicates \
--folderfirst "Work" \
--folderfirst "Friends" \
--folderlast "CanWait" \
--folderlast "[Gmail]/All Mail"
Explanations:
--ssl1 is mandatory since Gmail only supports imap ssl connections.
--exitwhenover 2500000000 option is here to avoid locking when
transfers exceed maximum limit.
See http://support.google.com/a/bin/answer.py?hl=en&answer=1071518
--exitwhenover is not mandatory in the sense you may be able to
use an upper value than 2.5 GB without disconnections; I don't
know the hard value, it seems to vary, so just have some tries
and report me what you discover in case you detect something.
--useheader="X-Gmail-Received" --useheader "Message-Id" are not
mandatory. I use them because I found (several years ago, it may
have changed) that Gmail always adds a different header
"X-Gmail-Received:" to all messages it gets. So the identification
by imapsync can not fail using this header. "Message-Id" is there
for safety about this Gmail rule.
If your destination imap server doesn't like "[Gmail]" name, just add
option:
--regextrans2 's/\[Gmail\]/Gmail/'
You can select folders exported to imap within the gmail preferences,
for example you may unselect all "System labels".
--exitwhenover option is here to avoid locking when transfers
exceed maximum limit.
See http://support.google.com/a/bin/answer.py?hl=en&answer=1071518
--skipcrossduplicates is optional but it can save Gigabytes of hard
disk memory. Within imap protocol, Gmail presents Gmail labels as
folders, so a message labeled "Work" "ProjectX" "Urgent" ends up
in three different imap folders "Work" "ProjectX" and "Urgent"
after an imap sync. --skipcrossduplicates prevent this behavior.
An issue with --skipcrossduplicates is that the first label synced
by imapsync goes to its corresponding folder and other labels are
ignored. This way, at least you can choose what labels have the
priority by using the --folderfirst option. For example
--folderfirst "Work" will sync messages labeled "Work" before
messages labeled "CanWait" or "Urgent". By default imapsync
syncs folders (Gmail labels) using the classical alphanumeric order.
--folderlast "CanWait" will sync only messages that have the
label CanWait and only it.
--folderlast "[Gmail]/All Mail", in conjunction with option
--skipcrossduplicates, will only put in "[Gmail]/All Mail"
the messages that are not labeled at all.
=======================================================================
Q. Does imapsync have the capability to do 2 stage authentication for google.
No, imapsync doesn't support 2 stage authentication.
Reading https://support.google.com/mail/answer/1173270?hl=en
it looks like it can't because imapsync uses imap protocol.
So you have to follow the Google recommendation and generate an
application-specific password or normal authentication or XOAUTH.
=======================================================================
Q. How to use XOAUTH to globally authenticate gmail users?
The XOAUTH code and this FAQ item come from Eduardo Bortoluzzi
Thanks Eduardo!
R. The goal of OAUTH is to migrate all users from/to Google Apps
Premier Edition without knowing their passwords.
The global password is available at the Google Apps control panel,
at Advanced Tools -> Manage OAuth domain key.
./imapsync \
--host1 imap.gmail.com --ssl1 \
--user1 foo@lab3.dedal.br \
--password1 secret1 \
--authmech1 XOAUTH \
--host2 imap.gmail.com --ssl2 \
--user2 bar@lab3.dedal.br \
--password2 secret2 \
--authmech2 XOAUTH
Google Apps is a paid service, but you can try it for 30 days without any cost.
Some notes about configuring the Google Apps XOAUTH:
On "Advanced Tools > Manage OAuth domain key > Two-legged OAuth access control"
the "Allow access to all APIs" must be checked
(https://support.google.com/a/bin/answer.py?answer=162105)
OR
On "Advanced Tools > Manage third party OAuth client access",
the configured costumer key must have the scope
"https://mail.google.com/" configured
(https://support.google.com/a/bin/answer.py?answer=162106).
=======================================================================
Q. migrate email from gmail to google apps
R. Take a look at:
http://www.linux-france.org/prj/imapsync_list/msg00639.html
http://biasecurities.com/blog/2009/migrate-email-from-gmail-to-google-apps/
http://www.thamtech.com/blog/2008/03/29/gmail-to-google-apps-email-migration/
=======================================================================
Q. From Zimbra to XXX
@ -2224,15 +1757,6 @@ R. Mailboxes must exist before running imapsync.
You have to extract users logins and passwords in a csv file.
See the "HUGE MIGRATION" section in the README file.
======================================================================
Q. From Cyrus to Notes
Default behavior might works.
======================================================================
Q. From cyrus to dbmail
Default behavior might works.
======================================================================
Q: From MailEnable 1.75
@ -2260,31 +1784,6 @@ Q. To Communigate Pro - Solaris version
R. See and run patches/imapsync_1.267_jari
======================================================================
Q. From any to Exchange2007
Several problems:
- Big messages: increase the "send- and receive-connector"
in exchange2007 to 40 MB.
R. 2 solutions
R1. With imapsync (only partial success)
--skipsize --skipheader 'Received' \
--regexmess 's{\A(.*?(?!^$))^Date:(.*?)$}{$1Date:$2\nReceived: From; $2}gxms'
Any user having time to spend to debug Exchange2007 with imapsync
is welcome.
R2. Other solution
Two users succeeded by using "MS Transporter Suite" (which is closed
expensive non-free software).
======================================================================
Q. From Microsoft Exchange 2000 IMAP4rev1 server version 6.0.6487.0.
R. imapsync ... \
--prefix1 INBOX.
======================================================================
Q. From Softalk Workgroup Mail 7.6.4

62
FAQ.d/FAQ.Domino.txt Normal file
View file

@ -0,0 +1,62 @@
#!/bin/cat
$Id: FAQ.Domino.txt,v 1.2 2015/03/26 04:24:17 gilles Exp gilles $
======================================================================
Domino specific issues and solutions
======================================================================
======================================================================
Q. From Domino Notes to xxx
On Windows use:
imapsync.exe ... --sep2 "\\" --prefix2 ""
On Unix use:
imapsync ... --sep2 '\\' --prefix2 ''
======================================================================
Q. From xxx to Domino Notes
For Domino anywhere with imapsync.exe on Windows use:
imapsync.exe ... ^
--sep2 "\\" --prefix2 "" ^
--regextrans2 "s,^INBOX\\(.*),$1,"
Explanation: Domino doesn't accept INBOX subfolders.
If you want to sync the complete host1 mailbox in a subfolder called OLDBOX use:
imapsync.exe ... ^
--sep2 "\\" --prefix2 "" ^
--regextrans2 "s,(.*),OLDBOX\\$1," --justfolders --dry
If the output is correct for you then remove --dry and have a run.
Verify the folder hierarchy is good on host2 then remove --justfolders to
sync the messages.
For Domino with imapsync and Domino on Linux:
(Thanks to Zafer)
R. We've migrated about 5000 users from cyrus to lotus domino 853!
Mails are being copied into the new created lotus domino mailbox
retaining the existing folder structure from the old mail database.
This means that sent mails can be found in the sent folder and
mails from the old inbox are copied into the new inbox
We also marked migrated mails with the header Migratedbyus
For Domino 853FP6 on Linux, we used this command on Unix:
imapsync \
--host1 hhh1 --user1 uuu1 --password1 ppp1 \
--host2 hhh2 --user2 uuu2 --password2 ppp2 \
--exclude "^INBOX/Trash" --exclude 'Junk|Drafts' \
--regextrans2 's#^INBOX/Sent$#^Sent#' \
--prefix2 "" --sep2 "\/" \
--regexmess 's{\A(.*?(?! ^$))^Date:(.*?)$}{$1Migratedbyus:$2\nx-MailDate:$2}gxms'
======================================================================

19
FAQ.d/FAQ.Dovecot.txt Normal file
View file

@ -0,0 +1,19 @@
#!/bin/cat
$Id: FAQ.Dovecot.txt,v 1.1 2015/03/23 00:16:43 gilles Exp gilles $
=======================================================================
Dovecot specific issues and solutions
=======================================================================
======================================================================
Q. How to migrate to Dovecot with an admin/MasterUser account?
R. Dovecot uses the same syntax as uw-imap
imapsync ... --user2="loginuser*admin_user" --password2 "admin_user_password"
To setup a Dovecot MasterUser see
http://wiki2.dovecot.org/Authentication/MasterUsers
======================================================================

312
FAQ.d/FAQ.Exchange.txt Normal file
View file

@ -0,0 +1,312 @@
#!/bin/cat
$Id: FAQ.Exchange.txt,v 1.2 2015/03/16 15:11:32 gilles Exp gilles $
=======================================================================
Exchange 20xx and Office365 specific issues and solutions
=======================================================================
=======================================================================
Q. From XXX to Exchange 2010/2013 or Office365
R. Here is a command line resume that solves most encountered issues when
migrating to Exchange or Office365. To understand or change the
details you have to read next Q/R sections.
On Windows:
imapsync ... ^
--maxsize 10000000 ^
--maxlinelength 9900 ^
--regexflag "s/\\Flagged//g" ^
--disarmreadreceipts
On Unix:
imapsync ... \
--maxsize 10000000 \
--maxlinelength 9900 \
--regexflag "s/\\Flagged//g" \
--disarmreadreceipts
=======================================================================
Q. From XXX to Exchange 2013 or Office365 read receipts are all
resent again after a sync. Even for old messages. How can I fix that?
R. imapsync can remove the header containing this read receipt request.
On Unix or Windows use:
imapsync ... --disarmreadreceipts
Since read receipts should be sent for unseen messages that will go
to a seen state after the migration, you could be strict and apply
the regex only to seen messages.
Selecting seen message can be done with:
imapsync ... --search1 "SEEN" --disarmreadreceipts
Of course a second run has to be run without the --disarmreadreceipts
for unseen messages:
imapsync ... --search1 "UNSEEN"
If fact --disarmreadreceipts is just an option equivalent to:
--regexmess 's{\A(.*?(?! ^$))^Disposition-Notification-To:(.*?)$}{$1X-Disposition-Notification-To:$2}igxms'
That regex changes the header Disposition-Notification-To. It prefixes
it with an X- so that it becomes inactive.
Disposition-Notification-To: blabla
becomes
X-Disposition-Notification-To: blabla
Thanks to David Karnowski for pointing and solving this issue.
=======================================================================
Q. From XXX to Exchange 2010/2013 or Office365 I get this error message
sometimes: "BAD Command Argument Error 11"
R. This error message comes from Exchange IMAP server when it
encounters any problem. Most of the time it is one of the following:
* Some messages are bigger than the size limit. 10 MB by default
on Exchange. It can be upped by configuration for Exchange.
If you can't configure this limit then use option
--maxsize 10000000 for 10 MB, change it if needed) to tell
imapsync to skip those messages.
This value is 25 MB by default for Office365 --maxsize 25000000
imapsync ... --maxsize 10000000 # 10 MB for Exchange
imapsync ... --maxsize 25000000 # 25 MB for Office365
* Quota reached. The whole account is full.
It can be upped by configuration.
* Some messages have some lines too long. Use option --maxlinelength
to skip messages whose max line length is over a number of bytes.
--maxlinelength 1000 is a RFC2822 must but most server support
higher values. Exchange supports 9900:
imapsync ... --maxlinelength 9900
Have also in mind that Exchange closes the connection after 10 errors
encountered so you might also see "BYE Connection closed" errors from
Exchange, which means Exchange leaves the session and say goodbye,
come back later. Rerun a sync then.
=======================================================================
Q. From XXX to Exchange 2010 or 2013 or Office365 the flag Flagged does
not seem to be well synced.
R. Use the following trick. Run imapsync twice, one with --regexflag
and one without, like this:
1) imapsync ... --regexflag "s/\\Flagged//g"
2) imapsync ...
You can add --debugflags if you want to see what imapsync gets and
does in details with flags.
The magic of this trick is on ignoring the \Flagged flag on the first
sync and setting it on the second sync, with STORE instead of APPEND.
This Exchange bug seems that Exchange gets and sets well the Flagged
flag with APPEND in IMAP but then it forgets it with other protocols;
With STORE it sets and gets the "\Flagged" flag everywhere.
Thanks to Dave Murray and Simon Savva for reporting and solving
this issue.
======================================================================
Q. How to migrate from or to Exchange 2007/2010 with an
admin/authuser account?
R. The tricks comes from Michele Marcionelli and Benjamin Priestman:
This doesn't work:
imapsync ... --user2 user2 --authuser2 admin2 --password2 adminpassword2 ...
This might works:
imapsync ... --user2 "domain\admin2\user2" --password2 adminpassword2 ...
or
imapsync ... --user2 "admin2@domain\user2" --password2 adminpassword2 ...
where "domain" is set be the user's UPN in Active Directory
or the NETBIOS or DNS name of the domain.
The exact format might vary depending on local configuration and you
should experiment with the different formats.
PLAIN authentication is the only way to go with --authuser1 for now.
So don't use --authmech1 SOMETHING with --authuser1 admin_user,
it will not work.
Same behavior with the --authuser2 option.
A little note from Michael Scherer.
The previous workaround in the FAQ seems to be obsolete.
I can confirm that
imapsync ... --host2 exchange_server \
--authuser2 admin@domain --user2 user_alias
is working without any glitches, running Exchange 2010 SP2 here.
Explanation, Exchange knows a) about a username
and b) about a mailNickname which can be different to the username.
As it seems you need to use the mailNickname (e.g. alias) defined
for user2, not the username itself.
http://blogs.technet.com/b/exchange/archive/2004/03/31/105275.aspx
A little note from John Becker.
After you pointed out that I had issues with authorization, I realized that
as an admin user I don't have all the rights on the mailboxes.
So I added myself to the user mailbox with full rights.
I also changed the login type on the Exchange CAS to type 1, plain text.
The command that I used for imapsync is:
imapsync ... ^
--host2 exchange-server ^
--user2 "windows-domain\admin-user\aaaa" ^
--password2 admin-password ...
======================================================================
Q. How to migrate from or to Office 365 with an admin/authuser account?
Note from Yago Torres Fernandez:
(a working command using admin/authuser on host2 Office 365)
imapsync ... --authuser2 user_admin@domain.com --user2 user_to_be_migrated@domain.com ^
--password2 XXXX --ssl2 --exclude "Shared Folders" ^
--regextrans2 "s#Trash$#Papelera#" --regextrans2 "s#^Deleted Items$#Papelera#"
but previous in Office365 you must do something like that, using powershell:
Add-MailboxPermission -identity user_to_be_migrated@domain.com -user user_admin@domain.com -accessrights fullaccess -inheritancetype all
PLAIN authentication is the only way to go with --authuser1 for now.
So don't use --authmech1 SOMETHING with --authuser1 admin_user,
it will not work.
Same behavior with the --authuser2 option.
======================================================================
Q. How to migrate from or to Exchange 2003 with an admin/authuser
account?
R. Thomas Edgar wrote the following
In case you can glean something from this snippet which allowed us
to migrate from Exchange 2003 t0 Cyrus Imap 2.4 (you would reverse
the flow to go the other way):
imapsync --dry --host1 ExchangeServer.mycompany.com \
--user1 Some.User@mycompany.com --authuser1 ExchangeAdminAccount \
--proxyauth1 --password1 '$pass_with_dollars$' \
--host2 cyrusimapbackend.mycompany.com \
--user2 SameOrDiffererentUser@mycompany.com \
--authuser2 CyrusAdminAccount --password2 CyrusAdminPassword
We also needed to:
- Ensure the Exchange Admin Acct had IMAP4 enabled in it's
profile (it initially didn't!)
- Ensure the Some.User Exchange Acct had IMAP4 enabled
in it's profile (it initially didn't!)
- Add the CyrusAdminAccount to admins line in /etc/imapd.conf
- Give CyrusAdminAccount lrswipkxtecda to the Cyrus Imap account
being migrated to (- or in your case, from)
In case you are not aware:
- It will prompt for a password if you don't supply it
- the domain part of the fully-qualified email could be
omitted in our case
- Use --debugimap when testing initial connectivity, if necessary
=======================================================================
Q. Couldn't create folder [trash] from [INBOX.trash]:
588 NO Mailbox already exists.
R. Some servers take care about character case in folder names,
some servers do not, like Exchange. Since non-respecting case
can merge two different folders into one then imapsync respects case.
For example, if a host1 server has a folder name called "trash"
and the host2 server already has a folder "Trash" or "TRASH"
then imapsync will try to create the folder "trash" on host2,
because trash and Trash are different strings. But if host2
does not respect character case it will consider folder "trash"
already exists and will say it, that's the error message
reported by imapsync: "Mailbox already exists", message coming
from the server.
The folder creation fails but messages are well transferred in
so take a look at this warning, understand why it happens
and it should be fine most of the time.
To avoid this warning use --regextrans2 to map the folder names
imapsync ... --regextrans2 "s/^trash$/Trash/"
If there are two folders Trash and trash on host1 then both
will be merge into only one Trash folder on host2.
In case option --delete2 is used the regextans2 above becomes
mandatory, otherwise imapsync will sync messages from the
first Trash and then delete them when syncing trash.
======================================================================
Q. Migrating to Exchange 201O, messages get date of the transfer,
this is bad for sorting and listing.
R1. Be sure to have at least Exchange 2010 SP2 Rollup 5
http://www.tribalchicken.com.au/15-technical/29-imapsync-exchange2010
R2. See also the Outlook side (thanks to Martin Hochreiter for this solution)
http://www.howto-outlook.com/faq/archivenotworking.htm
by changing Archive to sent/receive date
It's often shorter to change one server than thousands clients
so R1 might be easier to do.
======================================================================
Q. From any to Exchange2007
Several problems:
- Big messages: increase the "send- and receive-connector"
in exchange2007 to 40 MB.
R. 2 solutions
R1. With imapsync (only partial success)
--skipheader 'Received' \
--regexmess 's{\A(.*?(?!^$))^Date:(.*?)$}{$1Date:$2\nReceived: From; $2}gxms'
Any user having time to spend to debug Exchange2007 with imapsync
is welcome.
R2. Other solution
Two users succeeded by using "MS Transporter Suite" (which is closed
expensive non-free software).
======================================================================
Q. From Microsoft Exchange 2000 IMAP4rev1 server version 6.0.6487.0.
R. imapsync ... \
--prefix1 INBOX.
=======================================================================

261
FAQ.d/FAQ.Gmail.txt Executable file
View file

@ -0,0 +1,261 @@
#!/bin/cat
$Id: FAQ.Gmail.txt,v 1.1 2015/03/26 08:12:20 gilles Exp gilles $
======================================================================
Imapsync with Gmail
======================================================================
=======================================================================
Q. Synchronizing from XXX to Gmail
R. There are some details to get the special [Gmail] sub-folders
right. Here's an example of migrating an old "Sent" folder to
Gmail's structure:
imapsync --host1 mail.oldhost.com \
--user1 my_email@oldhost.com \
--password1 password \
--host2 imap.gmail.com \
--user2 my_email@gmail.com \
--password2 password \
--ssl2 \
--exitwhenover 500000000 \
--maxsize 25000000 \
--expunge1 \
--addheader \
--exclude "\[Gmail\]$" \
--regextrans2 "s/[ ]+/_/g" \
--regextrans2 "s/[\^]/_/g" \
--regextrans2 "s/['\"\\\\]/_/g" \
--regextrans2 "s,^Sent$,[Gmail]/Sent Mail,"
Explanations:
--ssl2 is mandatory since Gmail only supports imap ssl connections.
--exitwhenover 500000000 option is here to avoid locking when
transfers exceed maximum limit.
See http://support.google.com/a/bin/answer.py?hl=en&answer=1071518
--exitwhenover is not mandatory in the sense you may be able to
use an upper value than 500 MB without disconnections; I don't
know the hard value, it seems to vary, so just have some tries
and report me what you discover in case you detect something.
--maxsize 25000000 is mandatory since Gmail limits messages size
up to 25 MB. This value increases over time, it was 10 MB some
years ago so you can try higher values. The Gmail page about
this limit is https://support.google.com/mail/answer/6584
--expunge1 is optional. It deletes messages marked \Deleted on host1.
Imapsync syncs messages with all their flags, Gmail takes the messages
marked \Deleted but deletes or moves them just after.
Option --expunge1 really removes messages marked \Deleted on host1
so they are not synced at all.
The --addheader option is there because "Sent" folder messages
sometimes lack the "Message-Id:" and "Received:" headers needed
by imapsync to identify messages (only when --useuid is not used).
So option --addheader adds a "Message-Id" header consisting of
the imap UID of the message on the host1 folder, like
"Message-Id: 12345@imapsync".
--exclude "\[Gmail\]$" is there to avoid a small examine/select error:
"Could not examine: 43 NO [NONEXISTENT] Unknown Mailbox: [Gmail]
(now in authenticated state) (Failure)".
--regextrans2 "s/[ ]+/_/g" is there to convert blank characters not
accepted by gmail to character _ underscore. In fact only leading
and trailing blank characters are problems with gmail, and
also successive blanks ending with the IMAP error
"NO [CANNOT] Folder contains excess whitespace (Failure)"
If you want to change only leading and trailing blank characters
then use instead:
--regextrans2 "s,(/|^) +,\$1,g" --regextrans2 "s, +(/|$),\$1,g"
On Windows, in the previous example containing \$1 you have to
replace the two \$1 by $1 (remove the \ before $1).
--regextrans2 "s/[\^]/_/g" is mandatory. It converts, since
not accepted by gmail, character ^ to character _ underscore.
--regextrans2 "s/['\"\\\\]/_/g" is optional. It converts
characters ' or " or \ to character _ underscore.
--regextrans2 "s,^Sent$,[Gmail]/Sent Mail," is to transform the
folder name "Sent" and adapt it to Gmail "Sent Mail" folder.
If you're using a different language in Gmail you might adapt
this example with the folder name translated, an example in French:
imapsync ...
--regextrans2 "s,^Messages envoy&AOk-s$,[Gmail]/Messages envoy&AOk-s," \
You can add --folder "INBOX.Sent" in the example in case
you want to sync only the "Sent" folder.
You can select folders exported to imap within the gmail preferences,
unselect some "System labels", depending on your needs.
The "All Mail" archive pseudo-folder should be updated automatically.
=======================================================================
Q. Some of the folders are getting created with [IMAP] prefix on Google
side. How to stop creating folder with this prefix?
Any switch we can use? e.g. [IMAP]/Archive
R. No switch in imapsync since [IMAP]/ prefix is done by Gmail,
it might be configurable with Gmail parameters.
=======================================================================
Q. Synchronizing from Gmail to XXX
R. Gmail needs SSL
./imapsync \
--host1 imap.gmail.com \
--user1 gilles.lamiral@gmail.com \
--password1 gmailsecret \
--host2 localhost
--user2 tata \
--password2 tatasecret \
--ssl1 \
--exitwhenover 2500000000 \
--useheader="X-Gmail-Received" \
--useheader "Message-Id" \
--skipcrossduplicates \
--folderfirst "Work" \
--folderfirst "Friends" \
--folderlast "CanWait" \
--folderlast "[Gmail]/All Mail"
Explanations:
--ssl1 is mandatory since Gmail only supports imap ssl connections.
--exitwhenover 2500000000 option is here to avoid locking when
transfers exceed maximum limit.
See http://support.google.com/a/bin/answer.py?hl=en&answer=1071518
--exitwhenover is not mandatory in the sense you may be able to
use an upper value than 2.5 GB without disconnections; I don't
know the hard value, it seems to vary, so just have some tries
and report me what you discover in case you detect something.
--useheader="X-Gmail-Received" --useheader "Message-Id" are not
mandatory. I use them because I found (several years ago, it may
have changed) that Gmail always adds a different header
"X-Gmail-Received:" to all messages it gets. So the identification
by imapsync can not fail using this header. "Message-Id" is there
for safety about this Gmail rule.
If your destination imap server doesn't like "[Gmail]" name, just add
option:
--regextrans2 's/\[Gmail\]/Gmail/'
You can select folders exported to imap within the gmail preferences,
for example you may unselect all "System labels".
--exitwhenover option is here to avoid locking when transfers
exceed maximum limit.
See http://support.google.com/a/bin/answer.py?hl=en&answer=1071518
--skipcrossduplicates is optional but it can save Gigabytes of hard
disk memory. Within imap protocol, Gmail presents Gmail labels as
folders, so a message labeled "Work" "ProjectX" "Urgent" ends up
in three different imap folders "Work" "ProjectX" and "Urgent"
after an imap sync. --skipcrossduplicates prevent this behavior.
An issue with --skipcrossduplicates is that the first label synced
by imapsync goes to its corresponding folder and other labels are
ignored. This way, at least you can choose what labels have the
priority by using the --folderfirst option. For example
--folderfirst "Work" will sync messages labeled "Work" before
messages labeled "CanWait" or "Urgent". By default imapsync
syncs folders (Gmail labels) using the classical alphanumeric order.
--folderlast "CanWait" will sync only messages that have the
label CanWait and only it.
--folderlast "[Gmail]/All Mail", in conjunction with option
--skipcrossduplicates, will only put in "[Gmail]/All Mail"
the messages that are not labeled at all.
=======================================================================
Q. Gmail does not really delete messages in folder [Gmail]/All Mail
What happens? What can I do?
R. It's true and explained in Gmail documentation at
https://support.google.com/mail/answer/78755?hl=en
To really remove messages in folder "[Gmail]/All Mail", they have to
be moved to the "Trash" folder and be deleted from "Trash".
=======================================================================
Q. Does imapsync have the capability to do 2 stage authentication for google.
R. No, imapsync doesn't support 2 stage authentication.
Reading https://support.google.com/mail/answer/1173270?hl=en
it looks like it can't because imapsync uses imap protocol.
So you have to follow the Google recommendation and generate an
application-specific password or normal authentication or XOAUTH.
=======================================================================
Q. Is XOAUTH2 authentication available with imapsync?
R. Yes but only on Unix systems and not really well documented. See
* http://www.linux-france.org/prj/imapsync_list/msg02129.html
* https://github.com/imapsync/imapsync/pull/25/files
=======================================================================
Q. How to use XOAUTH to globally authenticate gmail users?
The XOAUTH code and this FAQ item come from Eduardo Bortoluzzi
Thanks Eduardo!
R. The goal of OAUTH is to migrate all users from/to Google Apps
Premier Edition without knowing their passwords.
The global password is available at the Google Apps control panel,
at Advanced Tools -> Manage OAuth domain key.
./imapsync \
--host1 imap.gmail.com --ssl1 \
--user1 foo@lab3.dedal.br \
--password1 secret1 \
--authmech1 XOAUTH \
--host2 imap.gmail.com --ssl2 \
--user2 bar@lab3.dedal.br \
--password2 secret2 \
--authmech2 XOAUTH
Google Apps is a paid service, but you can try it for 30 days without any cost.
Some notes about configuring the Google Apps XOAUTH:
On "Advanced Tools > Manage OAuth domain key > Two-legged OAuth access control"
the "Allow access to all APIs" must be checked
(https://support.google.com/a/bin/answer.py?answer=162105)
OR
On "Advanced Tools > Manage third party OAuth client access",
the configured costumer key must have the scope
"https://mail.google.com/" configured
(https://support.google.com/a/bin/answer.py?answer=162106).
=======================================================================
Q. migrate email from gmail to google apps
R. Take a look at:
http://www.linux-france.org/prj/imapsync_list/msg00639.html
http://biasecurities.com/blog/2009/migrate-email-from-gmail-to-google-apps/
http://www.thamtech.com/blog/2008/03/29/gmail-to-google-apps-email-migration/

98
FAQ.d/FAQ.Massive.txt Executable file
View file

@ -0,0 +1,98 @@
#!/bin/cat
$Id: FAQ.Massive.txt,v 1.1 2015/03/26 05:06:27 gilles Exp gilles $
======================================================================
Imapsync for massive migrations
======================================================================
Questions answered here are:
Q. I need to migrate hundred accounts, how can I do?
Q. I have to migrate 500k users using 400 TB of disk space.
How do I proceed?
=======================================================================
Q. I need to migrate hundred accounts, how can I do?
R. If you have many mailboxes to migrate think about a little
shell program. Write a file called file.txt (for example)
containing users and passwords.
The separator used in this example is ";"
The file.txt file contains:
user001_1;password001_1;user001_2;password001_2
user002_1;password002_1;user002_2;password002_2
user003_1;password003_1;user003_2;password003_2
user004_1;password004_1;user004_2;password004_2
user005_1;password005_1;user005_2;password005_2
...
On Unix the shell program can be:
{ while IFS=';' read u1 p1 u2 p2; do
imapsync --host1 imap.side1.org --user1 "$u1" --password1 "$p1" \
--host2 imap.side2.org --user2 "$u2" --password2 "$p2" ...
done ; } < file.txt
Here is a complete Unix example nearly ready to use:
http://imapsync.lamiral.info/examples/sync_loop_unix.sh
On Windows the batch program can be:
FOR /F "tokens=1,2,3,4 delims=; eol=#" %%G IN (file.txt) DO imapsync ^
--host1 imap.side1.org --user1 %%G --password1 %%H ^
--host2 imap.side2.org --user2 %%I --password2 %%J ...
The ... can be replaced by nothing or any supplementary imapsync option.
Here is a complete Windows example nearly ready to use:
http://imapsync.lamiral.info/examples/sync_loop_windows.bat
=======================================================================
Q. I have to migrate 500k users using 400 TB of disk space.
How do I proceed?
R. Solution to this issue is two words: parallelism and measurements.
Since all 500k mailboxes are independent against each other,
they can be processed independently.
500k on 400TB is 800 MB per account on average.
No one knows in advance what is the first bottleneck. The first
bottleneck has to be determined, by measurements, not by guesses.
Once this first bottleneck is known and overcome then the next
bottleneck has to be determined and overcome too, if needed. Repeat
the process of looking for the next bottleneck and its resolution
until you estimate the transfer rates, money costs and final dates are
good enough to proceed the whole 500k/400TB migration.
Possible bottlenecks:
- IMAP servers have artificial limits. For example Gmail and Office365
have throttle limits.
- Bandwidth, on any side, especially on small Internet connexions. But
usually bandwidth is not a bottleneck.
- Memory, on any side. Monitor your system doesn't swap on disk.
- CPU, on any side. When measuring that CPU is always 100% during a
transfer then it's useless to add imapsync processus on that host.
- I/O on disks. A classical one always forgotten. Unlike CPU and RAM
Input/Output performances don't improve very much as time goes on.
- Number of hosts available to run imapsync processes.
- Imapsync itself.
- Errors management.
- MX domains, DNS.
- Money.
- Time.
- Bad luck.
- ...

328
INSTALL
View file

@ -1,6 +1,6 @@
# $Id: INSTALL,v 1.40 2014/11/14 17:07:21 gilles Exp gilles $
# $Id: INSTALL,v 1.47 2015/03/16 16:36:10 gilles Exp gilles $
#
# INSTALL file for imapsync
# This is the main INSTALL file for imapsync.
# imapsync : IMAP sync and migrate tool.
INTRODUCTION
@ -9,189 +9,165 @@ INTRODUCTION
imapsync works fine under any operating system with Perl and Perl modules (listed below).
imapsync.exe works fine standalone under Windows XP, Vista, Seven, 20XX, either 32 or 64bit.
WINDOWS
=======
====================================
== Installing imapsync on WINDOWS ==
====================================
Read the file README_Windows.txt
Also available at
http://imapsync.lamiral.info/README_Windows.txt
UNIX
====
This section doesn't concern Windows imapsync.exe users.
=================================
== Installing imapsync on Unix ==
=================================
There are specific INSTALL files in the imapsync directory INSTALL.d/
also available at http://imapsync.lamiral.info/INSTALL.d/
- Mac OS X
- FreeBSD
- CentOS
- CPanel
- Debian
- Ubuntu
- Mandriva
If you are not on one of these systems then read the section
below called "Installing imapsync on other Unixes".
=====================================
== Installing imapsync on Mac OS X ==
=====================================
Not easy.
Read the file INSTALL.d/INSTALL.Darwin.txt
Also available at
http://imapsync.lamiral.info/INSTALL.d/INSTALL.Darwin.txt
=====================================
== Installing imapsync on FreeBSD ==
=====================================
Easy.
Read the file INSTALL.d/INSTALL.FreeBSD.txt
Also available at
http://imapsync.lamiral.info/INSTALL.d/INSTALL.FreeBSD.txt
===================================
== Installing imapsync on CentOS ==
===================================
Easy.
Read the file INSTALL.d/INSTALL.Centos.txt
Also available at
http://imapsync.lamiral.info/INSTALL.d/INSTALL.Centos.txt
===================================
== Installing imapsync on CPanel ==
===================================
Easy.
Read the file INSTALL.d/INSTALL.CPanel.txt
Also available at
http://imapsync.lamiral.info/INSTALL.d/INSTALL.CPanel.txt
==========================================
== Installing imapsync on Debian 6 or 7 ==
==========================================
Not easy.
See the file INSTALL.d/INSTALL.Debian.txt
Also available at
http://imapsync.lamiral.info/INSTALL.d/INSTALL.Debian.txt
============================================
== Installing imapsync on Ubuntu 12 or 14 ==
============================================
Not easy.
See the file INSTALL.d/INSTALL.Ubuntu.txt
Also available at
http://imapsync.lamiral.info/INSTALL.d/INSTALL.Ubuntu.txt
=====================================
== Installing imapsync on Mandriva ==
=====================================
See the file INSTALL.d/INSTALL.Mandriva.txt
Also available at
http://imapsync.lamiral.info/INSTALL.d/INSTALL.Mandriva.txt
=========================================
== Installing imapsync on other Unixes ==
=========================================
Purchase imapsync at
http://imapsync.lamiral.info/
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):
You'll have access to a compressed tarball called imapsync-x.xxx.tgz
where x.xxx is the version number. Untar the tarball where
you want:
tar xzvf imapsync-x.xx.tgz
tar xzvf imapsync-x.xxx.tgz
Go into the directory imapsync-x.xx and read the INSTALL file.
You're already reading the INSTALL file.
Go into the directory imapsync-x.xxx
cd imapsync-x.xxx
You can easily detect any missing Perl modules via the
script prerequisites_imapsync located in the INSTALL.d directory:
sh INSTALL.d/prerequisites_imapsync
or
cd INSTALL.d/
sh prerequisites_imapsync
You don't need to be root to run the previous command. You have
to be root if you want the Perl modules to be available for the
whole system, for all users.
You may be in one of following cases:
- you are not root.
- you are in a environment where modifying system Perl
modules can break other things or where you're not allowed to
change the whole system.
In the previous cases, you have to reinit cpan in order to use
your local account:
perl -MCPAN -e shell
# then inside the cpan shell type "o conf init"
cpan> o conf init
cpan> exit
# finally source your modified local bashrc
. $HOME/.bashrc
Run again prerequisites_imapsync
sh INSTALL.d/prerequisites_imapsync
Run the "cpan -i" command with the missing Perl modules as arguments.
For example it can be:
cpan -i Authen::NTLM Data::Uniqid File::Copy::Recursive IO::Tee Mail::IMAPClient Unicode::String
Once you've run the "cpan -i" command, you can rerun "sh prerequisites_imapsync"
to verify everything is ok:
sh prerequisites_imapsync
When everything is ok the script execution ends with this sentence
"All needed modules are already installed"
Now imapsync should work on your system.
You need :
- Perl
try : perl -v
Get Perl here:
http://www.perl.org/
- Some perl modules. To verify in one command that you have
all needed modules, just run:
perl -c imapsync
The good answer is "imapsync syntax OK".
Any other output will list the missing modules in the
Perl paths (it then talks about @INC variable).
Here is some individual module help:
- To check if your system has Perl Mail::IMAPClient module
try :
perl -mMail::IMAPClient -e ''
It should print nothing, nothing printed means Mail::IMAPClient
is already installed on your system.
If the module Mail::IMAPClient is not on the system,
you can use a copy included in the imapsync tarball
or get the latest Mail::IMAPClient module here:
http://search.cpan.org/dist/Mail-IMAPClient/
I use always the latest Mail-IMAPClient-3.xx
To know the version you have on your system try :
perl -mMail::IMAPClient -e 'print $Mail::IMAPClient::VERSION, "\n"'
New Mail-IMAPClient-3.xx works very well with imapsync,
Use at least Mail-IMAPClient-3.25 (previous releases may bug).
Do not hesitate to use latest Mail-IMAPClient-3.xx
(3.xx >= 3.35 at the time of this writing)
Look at the shell script named "i3" in the tarball, it can be used to
run imapsync with included Mail-IMAPClient-3.35/ wherever you
unpacked the imapsync tarball.
Test all Perl modules dependency in one command:
perl -mMail::IMAPClient -mDigest::MD5 -mTerm::ReadKey -mIO::Socket::SSL \
-mDigest::HMAC_MD5 -mAuthen::NTLM -e -mTime::HiRes \
-mData::Uniqid -mURI::Escape -mFile::Copy::Recursive -mIO::Tee \
-mUnicode::String ""
You can install easily those Perl modules in latest release via the
following commands (with root permissions)
perl -MCPAN -e "install Mail::IMAPClient"
perl -MCPAN -e "install Term::ReadKey"
perl -MCPAN -e "install IO::Socket::SSL"
perl -MCPAN -e "install Digest::HMAC_MD5"
perl -MCPAN -e "install URI::Escape"
perl -MCPAN -e "install File::Copy::Recursive"
perl -MCPAN -e "install IO::Tee"
perl -MCPAN -e "install Unicode::String"
perl -MCPAN -e "install Data::Uniqid"
perl -MCPAN -e "install Authen::NTLM"
You can also install them easily by using the standard install
command on your system if the packages have been made on it.
Doing so you may not have the latest release but most of the time
it doesn't care.
Modules
Authen::NTLM
Data::Uniqid
may be not available in the distribution way since I haven't find them
on Ubuntu nor on Mandriva but Centos supports them.
On Debian/Ubuntu:
aptitude install libmail-imapclient-perl # Mail::IMAPClient
aptitude install libterm-readkey-perl # Term::ReadKey
aptitude install libio-socket-ssl-perl # IO::Socket::SSL
aptitude install libdigest-hmac-perl # Digest::HMAC_MD5 Digest::HMAC_SHA1
aptitude install liburi-perl # URI::Escape
aptitude install libfile-copy-recursive-perl # File::Copy::Recursive
aptitude install libio-tee-perl # IO::Tee
aptitude install libunicode-string-perl # Unicode::String
On Ubuntu 14 (thanks to http://www.jverdeyen.be/ubuntu/imapsync-on-ubuntu/):
sudo apt-get install makepasswd rcs perl-doc libio-tee-perl git
sudo apt-get install libmail-imapclient-perl libdigest-md5-file-perl
sudo apt-get install libterm-readkey-perl libfile-copy-recursive-perl
sudo apt-get install libunicode-string-perl
On Mandriva:
urpmi perl-Mail-IMAPClient # Mail::IMAPClient
urpmi perl-Term-ReadKey # Term::ReadKey
urpmi perl-IO-Socket-SSL # IO::Socket::SSL
urpmi perl-Digest-HMAC # Digest::HMAC_MD5 Digest::HMAC_SHA1
urpmi perl-URI # URI::Escape
urpmi perl-File-Copy-Recursive # File::Copy::Recursive
urpmi perl-IO-Tee # IO::Tee
urpmi perl-Unicode-String # Unicode::String
On CentOS (thanks to Ralf Hauber)
Install RPM Repository: Fedora Epel
See http://pkgs.org/centos-6-rhel-6/epel-i386/perl-Data-Uniqid-0.12-2.el6.noarch.rpm.html
wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -Uvh epel-release*rpm
yum install perl-Mail-IMAPClient # Mail::IMAPClient
yum install "perl(Term::ReadKey)" # Term::ReadKey
yum install "perl(Authen::NTLM)" # Authen::NTLM
yum install perl-Data-Uniqid # Data::Uniqid
yum install perl-File-Copy-Recursive # File::Copy::Recursive
yum install perl-IO-Tee # IO::Tee
yum install perl-Unicode-String # Unicode::String
INSTALLING on Unix
------------------
To see what will be done, just run (you need the make command):
make -n install
To install imapsync in /usr/bin/ and man page in /usr/share/man/man1/, just run (as root):
make install
or copy the file imapsync where you want it to be.
For example:
cp imapsync /usr/bin/
TESTING on Unix
---------------
Tests will break as they are home specific.
You need a running imap server on localhost with several accounts
toto with a password located in the file $HOME/var/pass/secret.toto
titi with a password located in the file $HOME/var/pass/secret.titi
tata with a password located in the file $HOME/var/pass/secret.tata
Of course, you can change the file tests.sh and run tests with:
sh -x tests.sh
Specific tests can be run by using them as argument to tests.sh:
sh -x tests.sh ll_ssl_justconnect ll_bad_host ...
The tests.sh script break on first failure ("set -e" directive).
Since I added more tests you also need a remote imap server see the
file tests.sh and help yourself. No time to make a universal test
file.

View file

@ -0,0 +1,24 @@
=================================
= Installing imapsync on CPanel =
=================================
============
== CPanel ==
============
This procedure has been tested on cPanel 11.36 (64 bits).
It should be the same for any Cpanel distribution based on Centos.
First install access to the Epel repository via yum:
yum install epel-release
Then install imapsync and its dependencies:
yum install imapsync
After installing imapsync, it should be able to work on your system.
A good test that shows also the basic example:
imapsync

51
INSTALL.d/INSTALL.Centos Normal file
View file

@ -0,0 +1,51 @@
=================================
= Installing imapsync on CentOS =
=================================
There is one section for Centos 7 and one for Centos 6.
==============
== Centos 7 ==
==============
First install access to the Epel repository via yum:
yum install epel-release
Then install imapsync and its dependencies:
yum install imapsync
After installing imapsync, it should be able to work on your system.
A good test that shows also the basic example:
imapsync
==============
== Centos 6 ==
==============
This section has not been tested with latest imapsync releases (2014 and after)
so it can fail. In case it happens, just write me at gilles.lamiral@laposte.net
and we will fix it together.
First, install access to the Epel repository
wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -Uvh epel-release-6-8.noarch.rpm
Then install all other packages via yum:
yum install \
perl-Mail-IMAPClient \
"perl(Term::ReadKey)" \
"perl(Authen::NTLM)" \
perl-Data-Uniqid \
perl-File-Copy-Recursive \
perl-IO-Tee \
perl-Unicode-String

View file

@ -0,0 +1,92 @@
# $Id: INSTALL.Darwin.txt,v 1.6 2015/03/16 16:29:27 gilles Exp gilles $
============================================
= Installing imapsync on Darwin / Mac OS X =
============================================
First let's configure the cpan command in order it modify only a
very local installation, local to a user, the user you're logged in.
Open a terminal: /Applications/Utilities/Terminal double-click on Terminal.
In order to do a local install, we have to take a fresh start.
In this terminal, type the following (or better copy-paste this line and press RETURN):
rm -f .cpan/CPAN/MyConfig.pm
cpan
cpan should ask for an automatic configuration, say yes.
Example of output:
------------------------------------------------------------------------------
Would you like to configure as much as possible automatically? [yes]
...
What approach do you want? (Choose 'local::lib', 'sudo' or 'manual')
[local::lib]
------------------------------------------------------------------------------
At the end of the run, cpan might propose to add some lines in your .bashrc file.
Say yes. The output on the screen is something like the following:
------------------------------------------------------------------------------
...
local::lib is installed. You must now add the following environment variables
to your shell configuration files (or registry, if you are on Windows) and
then restart your command line shell and CPAN before installing modules:
PERL_MB_OPT="--install_base \"/Users/gilles/perl5\""; export PERL_MB_OPT;
PERL_MM_OPT="INSTALL_BASE=/Users/gilles/perl5"; export PERL_MM_OPT;
Would you like me to append that to /home/Users/.bashrc now? [yes]
commit: wrote '/Users/gilles/.cpan/CPAN/MyConfig.pm'
...
------------------------------------------------------------------------------
You have to source (the command to source is "." ) your .bashrc and run the "cpan -i" command:
. .bashrc
The next time you use cpan command, it will install Perl modules locally,
where you have permission to create files and directories, something like
the path /Users/gilles/perl5/ (where gilles is replaced by your login name).
Next, let's get a script that will check your Perl installation.
Open a terminal: /Applications/Utilities/Terminal double-click on Terminal.
In this terminal, type the following (or better copy-paste this line and press RETURN):
curl -L http://imapsync.lamiral.info/INSTALL.d/prerequisites_imapsync > prerequisites_imapsync
Now you should have a script named "prerequisites_imapsync" in the current directory.
Let's execute it with a shell, type:
sh prerequisites_imapsync
When "sh prerequisites_imapsync" command is ended it will propose you
to execute a "cpan -i ..." command to install the missing Perl modules.
The "..." in "cpan -i ..." have to be replaced by the list proposed
in the last output line of a "sh prerequisites_imapsync" run.
For example it can be:
cpan -i Authen::NTLM Data::Uniqid File::Copy::Recursive IO::Tee Mail::IMAPClient Unicode::String
Once you've run the "cpan -i" command, you can rerun "sh prerequisites_imapsync"
to verify everything is ok:
sh prerequisites_imapsync
When everything is ok the script execution ends with this sentence
"All needed modules are already installed"
Now imapsync should work on your system.
==========================================
== Installing imapsync Mac OS X Leopard ==
==========================================
Mac OS X Leopard has perl 5.8.8 and an old openssl version.

View file

@ -0,0 +1,121 @@
========================================
= Installing imapsync on Debian 6 or 7 =
========================================
There is one section for Debian 7 and one for Debian 6.
== Debian 7 wheezy or higher ==
Here are the two commands to install imapsync dependencies.
The first command installs standard packages:
apt-get install \
libauthen-ntlm-perl \
libcrypt-ssleay-perl \
libdigest-hmac-perl \
libfile-copy-recursive-perl \
libio-compress-perl \
libio-socket-inet6-perl \
libio-socket-ssl-perl \
libio-tee-perl \
libmail-imapclient-perl \
libmodule-scandeps-perl \
libnet-ssleay-perl \
libpar-packer-perl \
libterm-readkey-perl \
libtest-pod-perl \
libtest-simple-perl \
libunicode-string-perl \
liburi-perl
The second command installs "manually" the Perl module Data::Uniqid
because Debian hasn't made it available via a package yet:
cpan Data::Uniqid
After installing the dependencies, imapsync should be working.
A good dependencies test that shows also the basic example:
./imapsync
Now the install command:
cp imapsync /usr/bin/
That's finished for the installation part.
You can use imapsync.
== Debian 6 Squeeze ==
apt-get install \
libcrypt-ssleay-perl \
libdigest-hmac-perl \
libfile-copy-recursive-perl \
libio-compress-perl \
libio-socket-inet6-perl \
libio-socket-ssl-perl \
libio-tee-perl \
libmail-imapclient-perl \
libmodule-scandeps-perl \
libnet-ssleay-perl \
libpar-packer-perl \
libterm-readkey-perl \
libtest-pod-perl \
libtest-simple-perl \
libunicode-string-perl \
liburi-perl
perl -MCPAN -e "install Data::Uniqid"
perl -MCPAN -e "install Authen::NTLM"
Now a good dependencies test that shows also the basic example:
./imapsync
Now the install command:
cp imapsync /usr/bin/
That's finished for the installation part.
You can use imapsync.
== Appendix ==
Here are some explanations about what is really needed in case
you want to avoid installing some packages.
=== Mandatory packages ===
Digest::HMAC_MD5 libdigest-hmac-perl
Digest::HMAC_SHA1 libdigest-hmac-perl
File::Copy::Recursive libfile-copy-recursive-perl
IO::Socket::INET6 libio-socket-inet6-perl
IO::Socket::SSL libio-socket-ssl-perl
IO::Tee libio-tee-perl
Mail::IMAPClient libmail-imapclient-perl
Unicode::String libunicode-string-perl
=== Optional packages ===
Authen::NTLM libauthen-ntlm-perl # NTLM authentication
URI::Escape liburi-perl # XOAUTH authentication
Data::Uniqid # XOAUTH authentication
Since Perl module Data::Uniqid is not packaged in Ubuntu you have to install
it "manually" from CPAN.
=== Developper packages ===
Module::ScanDeps libmodule-scandeps-perl
PAR::Packer libpar-packer-perl
Test::Pod libtest-pod-perl
You may need to have also those packages:
sudo apt-get install makepasswd rcs perl-doc git

View file

@ -0,0 +1,17 @@
==================================
= Installing imapsync on FreeBSD =
==================================
$Id: INSTALL.FreeBSD.txt,v 1.3 2015/03/16 16:32:06 gilles Exp gilles $
Thanks to Kurt Jaeger pi@FreeBSD.org a imapsync package is available in FreeBSD
http://portsmon.freebsd.org/portoverview.py?category=mail&portname=imapsync
So, to install imapsync you just have to type one command in a terminal:
sudo pkg install imapsync
or if you're already root on the console:
pkg install imapsync
Tested 7 March 2015 on FreeBSD 10.1-RELEASE

View file

@ -0,0 +1,17 @@
=====================================
== Installing imapsync on Mandriva ==
=====================================
Install the Perl modules dependencies with urpmi:
urpmi perl-Mail-IMAPClient # Mail::IMAPClient
urpmi perl-Term-ReadKey # Term::ReadKey
urpmi perl-IO-Socket-SSL # IO::Socket::SSL
urpmi perl-Digest-HMAC # Digest::HMAC_MD5 Digest::HMAC_SHA1
urpmi perl-URI # URI::Escape
urpmi perl-File-Copy-Recursive # File::Copy::Recursive
urpmi perl-IO-Tee # IO::Tee
urpmi perl-Unicode-String # Unicode::String

View file

@ -0,0 +1,40 @@
=================================
= Installing imapsync on Ubuntu =
=================================
== Ubuntu 12.04 or higher ==
Here are the two commands to install imapsync dependencies:
sudo apt-get install \
libauthen-ntlm-perl \
libcrypt-ssleay-perl \
libdigest-hmac-perl \
libfile-copy-recursive-perl \
libio-compress-perl \
libio-socket-inet6-perl \
libio-socket-ssl-perl \
libio-tee-perl \
libmail-imapclient-perl \
libmodule-scandeps-perl \
libnet-ssleay-perl \
libpar-packer-perl \
libterm-readkey-perl \
libtest-pod-perl \
libtest-simple-perl \
libunicode-string-perl \
liburi-perl
sudo cpan Data::Uniqid
Now a good dependencies test that shows also the basic example:
./imapsync
Now the install command:
sudo cp imapsync /usr/bin/
That's finished for the installation part.
You can use imapsync.

146
INSTALL.d/prerequisites_imapsync Executable file
View file

@ -0,0 +1,146 @@
#!/bin/sh
# $Id: prerequisites_imapsync,v 1.10 2015/03/14 23:46:59 gilles Exp gilles $
MODULES_MANDATORY='
Digest::HMAC_MD5
Authen::NTLM
Compress::Zlib
Data::Dumper
Data::Uniqid
Digest::HMAC
Digest::MD5
File::Copy::Recursive
IO::Socket::INET
IO::Socket::INET6
IO::Socket::SSL
IO::Tee
Mail::IMAPClient
Parse::RecDescent
Term::ReadKey
Test::More
Test::Pod
Unicode::String
URI::Escape
'
MODULES_DEVEL='
Module::ScanDeps
PAR::Packer
'
test_perl() {
# First we need perl
if perl -v > /dev/null 2>&1 ; then
perl_version=`perl -e 'printf "%vd\n", $^V;'`
echo Ok: Found Perl $perl_version
return 0
else
echo Failure: Perl is not here. You have to install Perl first.
return 1
fi
}
test_module() {
test -n $1 || return
M_tested=$1
shift
if perl -m"$M_tested" -e '' >/dev/null 2>&1 ; then
echo "Ok: Found Perl module $M_tested"
else
echo "Failure: Not found Perl module $M_tested $@"
LIST_TO_INSTALL="$LIST_TO_INSTALL $M_tested"
fi
}
test_mandatory_modules() {
for M in $MODULES_MANDATORY
do
test_module $M
done
}
search_modules_any() {
test -n "$*" || {
echo "All needed modules are already installed"
return
}
apt-get -h > /dev/null 2>&1 && {
search_modules_apt "$@"
return
}
yum -h > /dev/null 2>&1 && {
search_modules_yum "$@"
return
}
# no yum, no apt-get
{
search_modules_cpan "$@"
return
}
}
search_modules_cpan() {
cat <<EOD
Here is a cpan command to install missing Perl modules:
cpan -i $@
EOD
}
search_modules_yum() {
echo
echo Searching rpm packages names
for M in "$@" ; do
echo "==== Searching rpm package name for $M"
F=`echo $M|tr -s ":" "/"`.pm
#echo yum -q whatprovides "*/$F"
echo
yum -q whatprovides "*/$F"
echo
done
}
search_modules_apt() {
echo
echo Searching deb packages names
for M in "$@" ; do
echo "==== Searching deb package name for $M"
F=`echo $M|tr -s ":" "/"`.pm
#echo apt-file search /$F
echo
apt-file search /$F
echo
done
}
list_to_install() {
test -n "$LIST_TO_INSTALL" || return
echo
echo 'What you have to do before using imapsync:'
for M in $LIST_TO_INSTALL ; do
echo "Install Perl module $M"
done
}
test_unix() {
echo '$SHELL says ' $SHELL
echo '$0 gives ' $0
echo -n "ps -ef gives " ; ps -ef | grep $$ | grep -v grep| grep -v 'ps -ef'
sw_vers > /dev/null 2>&1 && sw_vers # Darwin
lsb_release -dirc > /dev/null 2>&1 && lsb_release -dirc # Linux
uname -a
}
test_unix
#exit
test_perl || exit
test_mandatory_modules
list_to_install
#search_modules_cpan $MODULES_MANDATORY
search_modules_any $LIST_TO_INSTALL

175
Makefile
View file

@ -1,5 +1,5 @@
# $Id: Makefile,v 1.155 2014/11/14 23:54:52 gilles Exp gilles $
# $Id: Makefile,v 1.179 2015/04/01 03:00:13 gilles Exp gilles $
.PHONY: help usage all
@ -7,19 +7,20 @@ help: usage
usage:
@echo " imapsync $(VERSION), You can do :"
@echo "make testp # it shows needed Perl modules from your distro or CPAN"
@echo "make install # as root"
@echo "make install_dependencies # it installs needed Perl modules from CPAN"
@echo ""
@echo "All other goals are for the upstream developper"
@echo "make testf # run tests"
@echo "make testv # run tests verbosely"
@echo "make test_quick # few tests verbosely"
@echo "make W/test.bat # run --test and W/test.bat on win32"
@echo "make W/test.bat # run --tests and W/test.bat on win32"
@echo "make W/test_tests.bat # run --tests on win32"
@echo "make W/test2.bat # run W/test2.bat on win32"
@echo "make W/test3.bat # run W/test3.bat on win32"
@echo "make W/test_exe_2.bat # run W/test_exe_2.bat on win32"
@echo "make prereq_win32 # run examples/install_modules.bat on win32"
@echo "make prereq_win32 # run W/install_modules.bat on win32"
@echo "make all "
@echo "make upload_tests # upload tests.sh"
@echo "make upload_index"
@ -29,6 +30,9 @@ usage:
@echo "make imapsync_elf_x86.bin"
@echo "make publish"
@echo "make perlcritic"
@echo "make prereq # Generates W/prereq.*"
@echo "make checklink # Check links"
@echo "make checklinkext # Check links of S/*.shtml"
PREFIX ?= /usr
@ -48,10 +52,11 @@ hello:
echo "$(IMAPClient)"
all: ChangeLog README VERSION imapsync_elf_x86.bin imapsync.exe
all: ChangeLog README VERSION OPTIONS W/imapsync.1 prereq perlcritic imapsync_elf_x86.bin imapsync.exe VERSION_EXE
testp :
perl -c imapsync || { echo; echo "Read the INSTALL file to solve Perl module dependencies!"; exit 1; }
sh INSTALL.d/prerequisites_imapsync
@perl -c imapsync || { echo; echo "Read the INSTALL file to solve Perl module dependencies!"; exit 1; }
ChangeLog: imapsync
rlog imapsync > ChangeLog
@ -59,17 +64,26 @@ ChangeLog: imapsync
README: imapsync
perldoc -t imapsync > README
OPTIONS: imapsync
perl -I./$(IMAPClient) ./imapsync --help > ./OPTIONS
VERSION: imapsync
perl -I./$(IMAPClient) ./imapsync --version > ./VERSION
touch -r ./imapsync ./VERSION
VERSION_EXE: imapsync
ssh Admin@c 'C:/msys/1.0/home/Admin/imapsync/imapsync.exe --version' > ./VERSION_EXE
dos2unix ./VERSION_EXE
touch -r ./imapsync ./VERSION_EXE
GOOD_PRACTICES.html: W/GOOD_PRACTICES.t2t
txt2tags -i W/GOOD_PRACTICES.t2t -t html --toc -o GOOD_PRACTICES.html
TUTORIAL.html: W/TUTORIAL.t2t
txt2tags -i W/TUTORIAL.t2t -t html --toc -o TUTORIAL.html
doc: README ChangeLog TUTORIAL.html GOOD_PRACTICES.html
doc: README OPTIONS ChangeLog TUTORIAL.html GOOD_PRACTICES.html
.PHONY: clean clean_tilde clean_test doc clean_log
@ -92,19 +106,19 @@ man: imapsync.1
clean_man:
rm -f imapsync.1
imapsync.1: imapsync
pod2man imapsync > imapsync.1
W/imapsync.1: imapsync
pod2man < /dev/null
pod2man imapsync > W/imapsync.1
install: testp imapsync.1
install: testp W/imapsync.1
mkdir -p $(DESTDIR)$(PREFIX)/bin
install imapsync $(DESTDIR)$(PREFIX)/bin/imapsync
chmod 755 $(DESTDIR)$(PREFIX)/bin/imapsync
mkdir -p $(DESTDIR)$(PREFIX)/share/man/man1
install imapsync.1 $(DESTDIR)$(PREFIX)/share/man/man1/imapsync.1
install W/imapsync.1 $(DESTDIR)$(PREFIX)/share/man/man1/imapsync.1
chmod 644 $(DESTDIR)$(PREFIX)/share/man/man1/imapsync.1
install_dependencies:
sh examples/install_modules_linux.sh
.PHONY: cidone ci
@ -113,14 +127,22 @@ ci: cidone
cidone:
rcsdiff RCS/*
cd W && rcsdiff RCS/*
cd S && rcsdiff RCS/*
cd examples && rcsdiff RCS/*
###############
# Local goals
###############
.PHONY: prereq test tests testp testf test3xx testv3 perlcritic
prereq: W/prereq.scandeps
W/prereq.scandeps: INSTALL.d/prerequisites_imapsync imapsync
scandeps -c -x imapsync | tee W/prereq.scandeps
./INSTALL.d/prerequisites_imapsync | tee W/prereq.`lsb_release -i -s || echo Unknown`
.PHONY: test tests testp testf test3xx testv3 perlcritic
perlcritic: W/perlcritic_3.out W/perlcritic_2.out
@ -156,12 +178,13 @@ testf: clean_test test
.PHONY: lfo upload_lfo dosify_bat public imapsync_cidone
dosify_bat:
unix2dos W/*.bat examples/*.bat build_exe.bat
unix2dos W/*.bat examples/*.bat
copy_win32:
scp imapsync Admin@c:'C:/msys/1.0/home/Admin/imapsync/'
tests_win32: dosify_bat
W/test.bat:
unix2dos W/test.bat
scp imapsync W/test.bat Admin@c:'C:/msys/1.0/home/Admin/imapsync/'
# ssh Admin@c 'perl C:/msys/1.0/home/Admin/imapsync/imapsync --tests_debug'
ssh Admin@c 'perl C:/msys/1.0/home/Admin/imapsync/imapsync --tests'
@ -169,73 +192,80 @@ tests_win32: dosify_bat
# ssh Admin@c 'tasklist /FI "PID eq 0"'
# ssh Admin@c 'tasklist /NH /FO CSV'
W/test_tests.bat:
unix2dos W/test_tests.bat
scp imapsync W/test_tests.bat Admin@c:'C:/msys/1.0/home/Admin/imapsync/'
ssh Admin@c 'C:/msys/1.0/home/Admin/imapsync/test_tests.bat'
.PHONY: W/*.bat
W/test2.bat:
unix2dos W/*.bat
unix2dos W/test2.bat
scp imapsync examples/file.txt W/test2.bat Admin@c:'C:/msys/1.0/home/Admin/imapsync/'
ssh Admin@c 'C:/msys/1.0/home/Admin/imapsync/test2.bat'
W/test3.bat:
unix2dos W/*.bat
unix2dos W/test3.bat
scp imapsync W/test3.bat Admin@c:'C:/msys/1.0/home/Admin/imapsync/'
ssh Admin@c 'C:/msys/1.0/home/Admin/imapsync/test3.bat'
W/test_exe_2.bat:
unix2dos W/*.bat
unix2dos W/test_exe_2.bat
scp imapsync W/test_exe_2.bat Admin@c:'C:/msys/1.0/home/Admin/imapsync/'
ssh Admin@c 'C:/msys/1.0/home/Admin/imapsync/test_exe_2.bat'
W/test3_gmail.bat:
unix2dos W/*.bat
unix2dos W/test3_gmail.bat
scp imapsync W/test3_gmail.bat /g/var/pass/secret.gilles_gmail Admin@c:'C:/msys/1.0/home/Admin/imapsync/'
ssh Admin@c 'C:/msys/1.0/home/Admin/imapsync/test3_gmail.bat'
test_imapsync_exe:
unix2dos W/*.bat
unix2dos W/test_exe.bat
scp W/test_exe.bat Admin@c:'C:/msys/1.0/home/Admin/imapsync/'
time ssh Admin@c 'C:/msys/1.0/home/Admin/imapsync/test_exe.bat'
prereq_win32:
unix2dos W/*.bat examples/*.bat build_exe.bat
scp examples/install_modules.bat Admin@c:'C:/msys/1.0/home/Admin/imapsync/examples/'
ssh Admin@c 'C:/msys/1.0/home/Admin/imapsync/examples/install_modules.bat'
unix2dos W/*.bat examples/*.bat
scp W/install_modules.bat Admin@c:'C:/msys/1.0/home/Admin/imapsync/examples/'
imapsync.exe: imapsync
rcsdiff imapsync
ssh Admin@c 'perl -V'
(date "+%s"| tr "\n" " "; echo -n "BEGIN " $(VERSION) ": "; date) >> W/.BUILD_EXE_TIME
unix2dos W/*.bat examples/*.bat build_exe.bat
scp examples/install_modules.bat Admin@c:'C:/msys/1.0/home/Admin/imapsync/examples/'
ssh Admin@c 'C:/msys/1.0/home/Admin/imapsync/examples/install_modules.bat'
scp imapsync build_exe.bat W/test_exe.bat Admin@c:'C:/msys/1.0/home/Admin/imapsync/'
unix2dos W/*.bat examples/*.bat
scp W/install_modules.bat Admin@c:'C:/msys/1.0/home/Admin/imapsync/'
# ssh Admin@c 'C:/msys/1.0/home/Admin/imapsync/install_modules.bat'
scp imapsync W/build_exe.bat W/test_exe.bat Admin@c:'C:/msys/1.0/home/Admin/imapsync/'
ssh Admin@c 'C:/msys/1.0/home/Admin/imapsync/build_exe.bat'
ssh Admin@c 'C:/msys/1.0/home/Admin/imapsync/test_exe.bat'
scp Admin@c:'C:/msys/1.0/home/Admin/imapsync/imapsync.exe' .
ssh Admin@c 'C:/msys/1.0/home/Admin/imapsync/imapsync.exe --version' > ./VERSION_EXE
dos2unix ./VERSION_EXE
(date "+%s"| tr "\n" " "; echo -n "END " $(VERSION) ": "; date) >> W/.BUILD_EXE_TIME
exe: imapsync build_exe.bat dosify_bat
exe: imapsync W/build_exe.bat dosify_bat
(date "+%s"| tr "\n" " "; echo -n "BEGIN " $(VERSION) ": "; date) >> W/.BUILD_EXE_TIME
scp imapsync build_exe.bat Admin@c:'C:/msys/1.0/home/Admin/imapsync/'
scp imapsync W/build_exe.bat Admin@c:'C:/msys/1.0/home/Admin/imapsync/'
ssh Admin@c 'C:/msys/1.0/home/Admin/imapsync/build_exe.bat'
ssh Admin@c 'C:/msys/1.0/home/Admin/imapsync/imapsync.exe --modules_version'
scp Admin@c:'C:/msys/1.0/home/Admin/imapsync/imapsync.exe' .
(date "+%s"| tr "\n" " "; echo -n "END " $(VERSION) ": "; date) >> W/.BUILD_EXE_TIME
zip: dosify_bat
rm -rfv ../prepa_zip/imapsync_$(VERSION_EXE)/
mkdir -p ../prepa_zip/imapsync_$(VERSION_EXE)/
mkdir -p ../prepa_zip/imapsync_$(VERSION_EXE)/FAQ.d/ ../prepa_zip/imapsync_$(VERSION_EXE)/Cook/
cp -av examples/imapsync_example.bat examples/sync_loop_windows.bat examples/file.txt ../prepa_zip/imapsync_$(VERSION_EXE)/
cp -av W/build_exe.bat W/install_modules.bat W/test_cook_exe.bat W/test_cook_src.bat imapsync ../prepa_zip/imapsync_$(VERSION_EXE)/Cook/
for f in FAQ README ; do cp -av $$f ../prepa_zip/imapsync_$(VERSION_EXE)/$$f.txt ; done
cp -av FAQ.d/*.txt ../prepa_zip/imapsync_$(VERSION_EXE)/FAQ.d/
cp -av imapsync.exe README_Windows.txt ../prepa_zip/imapsync_$(VERSION_EXE)/
unix2dos ../prepa_zip/imapsync_$(VERSION_EXE)/*.txt
cd ../prepa_zip/ && rm -f ./imapsync_$(VERSION_EXE).zip && zip -r ./imapsync_$(VERSION_EXE).zip ./imapsync_$(VERSION_EXE)/
scp ../prepa_zip/imapsync_$(VERSION_EXE).zip Admin@c:'C:/msys/1.0/home/Admin/'
cp ../prepa_zip/imapsync_$(VERSION_EXE).zip /ee/imapsync/
cp ../prepa_zip/imapsync_$(VERSION_EXE).zip /fe/imapsync/
# C:\Users\mansour\Desktop\imapsync
@ -252,12 +282,9 @@ imapsync_elf_x86.bin: imapsync
} || :
{ test 'petite' = "`hostname`" && \
pp -o imapsync_elf_x86.bin -I $(IMAPClient_3xx) \
-I W/NTLM-1.09/blib/lib \
-M Mail::IMAPClient -M IO::Socket -M IO::Socket::SSL \
-M Digest::MD5 -M Digest::HMAC_MD5 -M Term::ReadKey \
-M Authen::NTLM \
-M Tie::Hash::NamedCapture \
-a '/usr/lib/perl/5.10.1/auto/POSIX/SigAction;auto/POSIX/SigAction' \
imapsync ; \
} || :
{ test 'ks200821.kimsufi.com' = "`hostname`" && \
@ -265,14 +292,12 @@ imapsync_elf_x86.bin: imapsync
-M Mail::IMAPClient -M IO::Socket -M IO::Socket::SSL \
-M Digest::MD5 -M Digest::HMAC_MD5 -M Term::ReadKey \
-M Authen::NTLM \
-M Tie::Hash::NamedCapture \
-a '/usr/lib/perl/5.10.1/auto/POSIX/SigAction;auto/POSIX/SigAction' \
imapsync ; \
} || :
./imapsync_elf_x86.bin
lfo: cidone upload_lfo
lfo: upload_lfo
tarball: .tarball
@ -355,35 +380,31 @@ upload_tests: tests.sh
gilles@ks.lamiral.info:public_html/imapsync/
#upload_ks: ci tarball
upload_ks: ci tarball
rsync -lptvHzP $(PUBLIC_FILES) \
root@ks.lamiral.info:/var/www/imapsync/
rsync -lptvHzP $(PUBLIC_FILES_W) \
root@ks.lamiral.info:/var/www/imapsync/W/
rsync -lptvHzPr $(PUBLIC_FILES_IMAGES) \
root@ks.lamiral.info:/var/www/imapsync/W/images/
rsync -lptvHzP ./W/ks.htaccess \
root@ks.lamiral.info:/var/www/imapsync/.htaccess
rsync -lptvHzPr ./dist/ \
root@ks.lamiral.info:/var/www/imapsync/dist/
rsync -lptvHzPr ./examples/ \
root@ks.lamiral.info:/var/www/imapsync/examples/
rsync -aHv $(PUBLIC) ../imapsync_website/
rsync -aHv $(PUBLIC_W) ../imapsync_website/W/
rsync -aHv --delete ./W/images/ ../imapsync_website/W/images/
rsync -aHv --delete ./W/ks.htaccess ../imapsync_website/.htaccess
rsync -aHv --delete ./dist/ ../imapsync_website/dist/
rsync -aHv --delete ./examples/ ../imapsync_website/examples/
rsync -aHv --delete ./INSTALL.d/ ../imapsync_website/INSTALL.d/
rsync -aHvz --delete ../imapsync_website/ root@ks.lamiral.info:/var/www/imapsync/
publish: dist upload_ks ksa
echo Now ou can do make ml
PUBLIC_FILES = ./ChangeLog ./NOLIMIT ./LICENSE ./CREDITS ./FAQ \
PUBLIC = ./ChangeLog ./NOLIMIT ./LICENSE ./CREDITS ./FAQ \
./index.shtml ./INSTALL ./README_Windows.txt \
./VERSION ./VERSION_EXE \
./README ./TODO ./TUTORIAL.html ./GOOD_PRACTICES.html
./VERSION ./VERSION_EXE ./imapsync \
./README ./OPTIONS ./TODO ./TUTORIAL.html ./GOOD_PRACTICES.html
PUBLIC_FILES_W = ./W/style.css \
PUBLIC_W = ./W/style.css ./W/tw-hash.html \
./W/TIME \
./W/paypal.shtml ./W/paypal_return.shtml ./W/paypal_return_support.shtml
./W/paypal.shtml ./W/paypal_return.shtml
PUBLIC_FILES_IMAGES = ./W/images/
ml: dist_dir
m4 -P W/ml_announce.in | mutt -H-
mailq
@ -392,7 +413,7 @@ ml: dist_dir
upload_lfo:
#rm -rf /home/gilles/public_html/www.linux-france.org/html/prj/imapsync/
#rm -rf /home/gilles/public_html/www.linux-france.org/ftp/prj/imapsync/
#rsync -avHz $(PUBLIC_FILES) \
#rsync -avHz $(PUBLIC) \
#/home/gilles/public_html/www.linux-france.org/html/prj/imapsync/
rsync -lptvHzP ./W/memo glamiral@linux-france.org:imapsync_stats/memo
rsync -lptvHzP ./W/lfo.htaccess \
@ -401,15 +422,31 @@ upload_lfo:
valid_index: .valid.index.shtml
checklink: index.shtml
checklink -b -q http://lamiral.info/~gilles/imapsync/
.valid.index.shtml: index.shtml
tidy -q index.shtml> /dev/null
validate --verbose index.shtml
checklinkext: S/news.shtml S/external.shtml S/imapservers.shtml S/template.shtml
checklink -b -q \
http://lamiral.info/~gilles/imapsync/S/template.shtml \
http://lamiral.info/~gilles/imapsync/S/news.shtml \
http://lamiral.info/~gilles/imapsync/S/external.shtml \
http://lamiral.info/~gilles/imapsync/S/imapservers.shtml
.valid.index.shtml: index.shtml S/*.shtml
tidy -q index.shtml S/*.shtml > /dev/null
validate --verbose index.shtml S/*.shtml
touch .valid.index.shtml
upload_index: .valid.index.shtml FAQ LICENSE CREDITS TUTORIAL.html GOOD_PRACTICES.html W/*.bat examples/*.bat examples/*.sh
rcsdiff index.shtml FAQ LICENSE CREDITS W/*.bat examples/*.bat index.shtml
rsync -avH index.shtml FAQ NOLIMIT LICENSE CREDITS TUTORIAL.html GOOD_PRACTICES.html root@ks.lamiral.info:/var/www/imapsync/
rsync -avH W/*.bat ./W/style.css W/fb-like.html ./W/fb-root.js W/tw-hash.html root@ks.lamiral.info:/var/www/imapsync/W/
rsync -avH examples/*.bat examples/*.sh root@ks.lamiral.info:/var/www/imapsync/examples/
.PHONY: upload_index
upload_index: .valid.index.shtml
rcsdiff index.shtml S/*.shtml FAQ FAQ.d/*.txt INSTALL LICENSE CREDITS TODO W/*.bat examples/*.bat index.shtml INSTALL.d/prerequisites_imapsync imapsync
rsync -avH index.shtml FAQ INSTALL OPTIONS NOLIMIT LICENSE CREDITS TODO TUTORIAL.html GOOD_PRACTICES.html imapsync ../imapsync_website/
rsync -avH $(PUBLIC_W) ../imapsync_website/W/
rsync -avH S/ ../imapsync_website/S/
rsync -avH W/images/ ../imapsync_website/W/images/
rsync -aHv --delete ./examples/ ../imapsync_website/examples/
rsync -aHv --delete ./INSTALL.d/ ../imapsync_website/INSTALL.d/
rsync -aHv --delete ./FAQ.d/ ../imapsync_website/FAQ.d/
rsync -aHvz --delete ../imapsync_website/ root@ks.lamiral.info:/var/www/imapsync/

247
OPTIONS Normal file
View file

@ -0,0 +1,247 @@
usage: ./imapsync [options]
Several options are mandatory.
--dry : Makes imapsync doing nothing, just print what would
be done without --dry.
--host1 <string> : Source or "from" imap server. Mandatory.
--port1 <int> : Port to connect on host1. Default is 143, 993 if --ssl1
--user1 <string> : User to login on host1. Mandatory.
--showpasswords : Shows passwords on output instead of "MASKED".
Useful to restart a complete run by just reading the log.
--password1 <string> : Password for the user1.
--host2 <string> : "destination" imap server. Mandatory.
--port2 <int> : Port to connect on host2. Default is 143, 993 if --ssl2
--user2 <string> : User to login on host2. Mandatory.
--password2 <string> : Password for the user2.
--passfile1 <string> : Password file for the user1. It must contain the
password on the first line. This option avoids to show
the password on the command line like --password1 does.
--passfile2 <string> : Password file for the user2. Contains the password.
--ssl1 : Use a SSL connection on host1.
--ssl2 : Use a SSL connection on host2.
--tls1 : Use a TLS connection on host1.
--tls2 : Use a TLS connection on host2.
--timeout <int> : Connections timeout in seconds. Default is 120.
0 means no timeout.
--authmech1 <string> : Auth mechanism to use with host1:
PLAIN, LOGIN, CRAM-MD5 etc. Use UPPERCASE.
--authmech2 <string> : Auth mechanism to use with host2. See --authmech1
--authuser1 <string> : User to auth with on host1 (admin user).
Avoid using --authmech1 SOMETHING with --authuser1.
--authuser2 <string> : User to auth with on host2 (admin user).
--proxyauth1 : Use proxyauth on host1. Requires --authuser1.
Required by Sun/iPlanet/Netscape IMAP servers to
be able to use an administrative user.
--proxyauth2 : Use proxyauth on host2. Requires --authuser2.
--authmd51 : Use MD5 authentification for host1.
--authmd52 : Use MD5 authentification for host2.
--domain1 <string> : Domain on host1 (NTLM authentication).
--domain2 <string> : Domain on host2 (NTLM authentication).
--folder <string> : Sync this folder.
--folder <string> : and this one, etc.
--folderrec <string> : Sync this folder recursively.
--folderrec <string> : and this one, etc.
--folderfirst <string> : Sync this folder first. --folderfirst "Work"
--folderfirst <string> : then this one, etc.
--folderlast <string> : Sync this folder last. --folderlast "[Gmail]/All Mail"
--folderlast <string> : then this one, etc.
--nomixfolders : Do not merge folders when host1 is case sensitive
while host2 is not (like Exchange). Only the first
similar folder is synced (ex: Sent SENT sent -> Sent).
--skipemptyfolders : Empty host1 folders are not created on host2.
--include <regex> : Sync folders matching this regular expression
--include <regex> : or this one, etc.
in case both --include --exclude options are
use, include is done before.
--exclude <regex> : Skips folders matching this regular expression
Several folders to avoid:
--exclude 'fold1|fold2|f3' skips fold1, fold2 and f3.
--exclude <regex> : or this one, etc.
--regextrans2 <regex> : Apply the whole regex to each destination folders.
--regextrans2 <regex> : 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.
Have in mind that --regextrans2 is applied after prefix
and separator inversion.
--tmpdir <string> : Where to store temporary files and subdirectories.
Will be created if it doesn't exist.
Default is system specific, Unix is /tmp but
it's often small and deleted at reboot.
--tmpdir /var/tmp should be better.
--pidfile <string> : The file where imapsync pid is written.
--pidfilelocking : Abort if pidfile already exists. Usefull to avoid
concurrent transfers on the same mailbox.
--nolog : Turn off logging on file
--logfile <string> : Change the default logfile pathname and filename.
--prefix1 <string> : Remove prefix to all destination folders
(usually INBOX. or INBOX/ or an empty string "")
you have to use --prefix1 if host1 imap server
does not have NAMESPACE capability, all other
cases are bad.
--prefix2 <string> : Add prefix to all host2 folders. See --prefix1
--sep1 <string> : Host1 separator in case NAMESPACE is not supported.
--sep2 <string> : Host2 separator in case NAMESPACE is not supported.
--skipmess <regex> : Skips messages maching the regex.
Example: 'm/[\x80-ff]/' # to avoid 8bits messages.
--skipmess is applied before --regexmess
--skipmess <regex> : or this one, etc.
--disarmreadreceipts : Disarms read receipts (host2 Exchange issue)
--regexmess <regex> : Apply the whole regex to each message before transfer.
Example: 's/\000/ /g' # to replace null by space.
--regexmess <regex> : and this one, etc.
--regexflag <regex> : Apply the whole regex to each flags list.
Example: 's/"Junk"//g' # to remove "Junk" flag.
--regexflag <regex> : and this one, etc.
--delete : Deletes messages on host1 server after a successful
transfer. Option --delete has the following behavior:
it marks messages as deleted with the IMAP flag
\Deleted, then messages are really deleted with an
EXPUNGE IMAP command.
--delete2 : Delete messages in host2 that are not in
host1 server. Useful for backup or pre-sync.
--delete2duplicates : Delete messages in host2 that are duplicates.
Works only without --useuid since duplicates are
detected with an header part of each message.
--delete2folders : Delete folders in host2 that are not in host1 server.
For safety, first try it like this (it is safe):
--delete2folders --dry --justfolders --nofoldersizes
--delete2foldersonly <regex>: Deleted only folders matching regex.
Example: --delete2foldersonly "/^Junk$|^INBOX.Junk$/"
--delete2foldersbutnot <regex>: Do not delete folders matching regex.
Example: --delete2foldersbutnot "/Tasks$|Contacts$|Foo$/"
--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 messages transfer.
--expunge2 : Expunge messages on host2 after messages transfer.
--uidexpunge2 : uidexpunge messages on the host2 account
that are not on the host1 account, requires --delete2
--nomixfolders : Avoid merging folders that are considered different on
host1 but the same on destination host2 because of
case sensitivities and insensitivities.
--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 <int> : Skip messages larger (or equal) than <int> bytes
--minsize <int> : Skip messages smaller (or equal) than <int> bytes
--maxage <int> : Skip messages older than <int> days.
final stats (skipped) don't count older messages
see also --minage
--minage <int> : Skip messages newer than <int> 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)
--search <string> : Selects only messages returned by this IMAP SEARCH
command. Applied on both sides.
--search1 <string> : Same as --search for selecting host1 messages only.
--search2 <string> : Same as --search for selecting host2 messages only.
--search CRIT equals --search1 CRIT --search2 CRIT
--exitwhenover <int> : Stop syncing when total bytes transferred reached.
Gmail per day allows 2500000000 down 500000000 upload.
--maxlinelength <int> : skip messages with a line length longer than <int> bytes.
RFC 2822 says it must be no more than 1000 bytes.
--useheader <string> : Use this header to compare messages on both sides.
Ex: Message-ID or Subject or Date.
--useheader <string> and this one, etc.
--subscribed : Transfers subscribed folders.
--subscribe : Subscribe to the folders transferred on the
host2 that are subscribed on host1. On by default.
--subscribeall : 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.
--nofoldersizesatend : Do not calculate the size of each folder in bytes
and message counts at the end. Default is on.
--justfoldersizes : Exit after having printed the folder sizes.
--syncacls : Synchronises acls (Access Control Lists).
--nosyncacls : Does not synchronize acls. This is the default.
Acls in IMAP are not standardized, be careful.
--usecache : Use cache to speedup.
--nousecache : Do not use cache. Caveat: --useuid --nousecache creates
duplicates on multiple runs.
--useuid : Use uid instead of header as a criterium to recognize
messages. Option --usecache is then implied unless
--nousecache is used.
--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.
--tests : Run non-regression tests.
--testslive : Run a live test with test1.lamiral.info imap server.
Useful to check the basics. Needs internet connexion.
--version : Print software version.
--noreleasecheck : Do not check for new imapsync release (a http request).
--releasecheck : 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 : Do only things about folders (ignore messages).
--help : print this help.
Example: to synchronize imap account "test1" on "test1.lamiral.info"
to imap account "test2" on "test2.lamiral.info"
with test1 password "secret1"
and test2 password "secret2"
./imapsync \
--host1 test1.lamiral.info --user1 test1 --password1 secret1 \
--host2 test2.lamiral.info --user2 test2 --password2 secret2
Here is a [linux] system (Linux petite 3.2.0-77-generic #114-Ubuntu SMP Tue Mar 10 17:25:28 UTC 2015 i686)
With perl 5.14.2 Mail::IMAPClient 3.35
$Id: imapsync,v 1.637 2015/04/01 01:36:37 gilles Exp gilles $
This current imapsync is up to date
Homepage: http://imapsync.lamiral.info/

85
README
View file

@ -4,7 +4,7 @@ NAME
More than 52 different IMAP server softwares supported with success, few
failures.
$Revision: 1.607 $
$Revision: 1.637 $
SYNOPSIS
To synchronize imap account "foo" on "imap.truc.org" to imap account
@ -23,7 +23,7 @@ INSTALL
imapsync can be available directly on the following distributions:
FreeBSD, Debian, Ubuntu, Gentoo, Fedora, NetBSD, Darwin, Mandriva and
OpenBSD.
OpenBSD. See http://oswatershed.org/pkg/imapsync
Purchase latest imapsync at
http://imapsync.lamiral.info/
@ -35,10 +35,12 @@ INSTALL
tar xzvf imapsync-x.xx.tgz
Go into the directory imapsync-x.xx and read the INSTALL file.
The INSTALL file is also at
The INSTALL file can be found at
http://imapsync.lamiral.info/INSTALL
It is now split in several files for each system
http://imapsync.lamiral.info/INSTALL.d/
The freecode (was freshmeat) record is at
The frozen freecode (was freshmeat) record is at
http://freecode.com/projects/imapsync
USAGE
@ -47,8 +49,14 @@ USAGE
To get a description of each option just run imapsync like this:
imapsync --help
or simply
imapsync
This description of all options is available at
http://imapsync.lamiral.info/OPTIONS
The option list:
imapsync [--host1 server1] [--port1 <num>]
@ -73,6 +81,7 @@ USAGE
[--idatefromheader]
[--syncacls]
[--regexmess <regex>] [--regexmess <regex>]
[--skipmess <regex>] [--skipmess <regex>]
[--maxsize <int>]
[--minsize <int>]
[--maxage <int>]
@ -80,34 +89,31 @@ USAGE
[--search <string>]
[--search1 <string>]
[--search2 <string>]
[--skipheader <regex>]
[--useheader <string>] [--useheader <string>]
[--nouid1] [--nouid2]
[--usecache]
[--skipsize] [--allowsizemismatch]
[--delete] [--delete2]
[--noskipsize]
[--delete]
[--delete2] [--delete2duplicates]
[--expunge] [--expunge1] [--expunge2] [--uidexpunge2]
[--delete2folders] [--delete2foldersonly] [--delete2foldersbutnot]
[--subscribed] [--subscribe] [--subscribe_all]
[--subscribed] [--subscribe] [--subscribeall]
[--nofoldersizes] [--nofoldersizesatend]
[--dry]
[--debug] [--debugimap][--debugimap1][--debugimap2]
[--debug] [--debugimap][--debugimap1][--debugimap2] [--debugcontent]
[--timeout <int>]
[--split1] [--split2]
[--reconnectretry1 <int>] [--reconnectretry2 <int>]
[--noreleasecheck]
[--releasecheck]
[--pidfile <filepath>]
[--pidfile <filepath>] [--pidfilelocking]
[--tmpdir <dirpath>]
[--nolog]
[--log]
[--logfile <filepath>]
[--version] [--help]
[--tests] [--tests_debug]
[--tests] [--testsdebug] [--testslive]
DESCRIPTION
The command imapsync is a tool allowing incremental and recursive imap
transfer from one mailbox to another.
Imapsync command is a tool allowing incremental and recursive imap
transfers from one mailbox to another.
By default all folders are transferred, recursively, all possible flags
(\Seen \Answered \Flagged etc.) are synced too.
@ -115,12 +121,13 @@ DESCRIPTION
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 reduces the amount of data transferred by not transferring a
given message if it resides already on both sides. Same specific headers
and the transfer is done only once; taken into account are by default
Message-Id and Received header lines. 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 and interruptions.
You can decide to delete the messages from the source mailbox after a
successful transfer, it can be a good feature when migrating live
@ -128,22 +135,26 @@ DESCRIPTION
--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 good real world scenario
for the combinaison --delete --noexpunge).
for the combination --delete --noexpunge).
You can also just synchronize a mailbox B from another mailbox A in case
you just want to keep a "live" copy of A in B. In that case --delete2
can be used, it deletes messages in host2 folder B that are not in host1
folder A.
A different scenario is synchronizing a mailbox B from another mailbox A
in case you just want to keep a "live" copy of A in B. In that case
--delete2 has to be used, it deletes messages in host2 folder B that are
not in host1 folder A. If you also need to destroy host2 folders that
are not in host1 then use --delete2folders (see also
--delete2foldersonly and --delete2foldersbutnot).
imapsync is not adequate for maintaining two active imap accounts in
synchronization where the user plays independently on both sides. Use
Imapsync is not adequate for maintaining two active imap accounts in
synchronization when the user plays independently on both sides. Use
offlineimap (written by John Goerzen) or mbsync (written by Michael R.
Elkins) for 2 ways synchronizations.
OPTIONS
To get a description of each option just invoke:
imapsync --help
imapsync
or read http://imapsync.lamiral.info/OPTIONS
HISTORY
I wrote imapsync because an enterprise (basystemes) paid me to install a
@ -151,9 +162,9 @@ HISTORY
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).
imapsync started its 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).
EXAMPLE
While working on imapsync parameters please run imapsync in dry mode (no
@ -266,7 +277,7 @@ BUG REPORT GUIDELINES
http://search.cpan.org/dist/Mail-IMAPClient/ maybe the bug is already
fixed there.
Make a good title with word "imapsync" in it (my spam filter won't
Make a good title with word "imapsync" in it (my spam filters won't
filter it), Try to write an email title with more words than just
"imapsync" or "problem", a good title is made of keywords summary, but
not too long (one visible line).
@ -466,7 +477,9 @@ Hacking
Feel free to hack imapsync as the NOLIMIT license permits it.
Links
Entries for imapsync: http://www.imap.org/products/showall.php
Entries for imapsync:
https://web.archive.org/web/20070202005121/http://www.imap.org/products/
showall.php
SIMILAR SOFTWARES
imap_tools : http://www.athensfbc.com/imap_tools
@ -487,5 +500,5 @@ SIMILAR SOFTWARES
Feedback (good or bad) will often be welcome.
$Id: imapsync,v 1.607 2014/11/14 16:25:06 gilles Exp gilles $
$Id: imapsync,v 1.637 2015/04/01 01:36:37 gilles Exp gilles $

View file

@ -1,4 +1,4 @@
# $Id: README_Windows.txt,v 1.4 2014/05/29 23:41:41 gilles Exp gilles $
# $Id: README_Windows.txt,v 1.5 2015/03/26 04:27:39 gilles Exp gilles $
#
# README_Windows.txt file for imapsync
# imapsync : IMAP sync and migrate tool.
@ -10,7 +10,7 @@ Two ways to install and use imapsync on Windows systems: A) or B).
Standard users should only take the A) way.
Developpers, users that want to build their own imapsync.exe
Developers, users that want to build their own imapsync.exe
or modify it, have to consider the B) way.
A) Simplest way
@ -25,27 +25,30 @@ where 1.xxx is the imapsync release number.
A.2) Extract the zip file in a folder where you'll work with imapsync
You can work on the Desktop since the zip file extraction creates
a uniq folder named imapsync_1.xxx (where 1.xxx is the imapsync
a unique folder named imapsync_1.xxx (where 1.xxx is the imapsync
release number).
A.3) Check the folder
In the folder extracted imapsync_1.xxx you see 6 files:
In the folder extracted imapsync_1.xxx you see 6 files and 2 directories:
* README_Windows.txt is the current file you are reading
* imapsync_example.bat is a batch file example you will copy and edit
* sync_loop_windows.bat is a batch file example for syncing many accounts
* FAQ.txt contains many useful tips,
FAQ is a must read when something goes wrong.
* FAQ.txt contains many useful tips, too many so I started
* FAQ.d/* to split them in FAQ.d/ folder.
FAQs are a must read when something goes wrong.
* README.txt imapsync general documentation.
* imapsync.exe is the imapsync binary. You don't have to run it directly.
* Cook/ is the directory to build imapsync.exe from its source.
You can copy or rename imapsync_example.bat as you wish as long as
its extension remains ".bat". On Windows systems .bat extension
means "I'm a batch script". Same thing for sync_loop_windows.bat.
The batch scripts have to stay with imapsync.exe because
of the way they call it, they use ".\imapsync.exe", so
let them be in the same directory.
let them be in the same directory (or change the path if you
understand what you're doing).
For the rest of this documentation I assume you copied
imapsync_example.bat to a file named imapsync_stuff.bat
@ -58,15 +61,15 @@ in the list presented in the small window menu.
Notepad is a good editor to modify it,
Office Word is not good for that job.
File FAQ.txt contains many tips and special options sometimes
Files FAQ.txt and FAQ.d/* contain many tips and special options sometimes
needed by specific imap server softwares like Exchange or Gmail.
A.5) Run the batch file
To run imapsync with your values just double-clic on
the batch file imapsync_example.bat
the batch file imapsync_stuff.bat
You do not need to have administrator priviledge to run imapsync.
You do not need to have administrator privilege to run imapsync.
A.6) Loop on A.5) A.6)
@ -77,27 +80,25 @@ A.7) Look the sync running. You can abort it at any time with a ctrl-c.
A.8) When the sync is finished you can find the whole log of the output
in the folder named "LOG_imapsync", the logfile name is based
on the launching date and hour and the user2 parameter, one logfile per run.
on the launching date, hour, minute, second and the user2 parameter,
one logfile per run.
The logfile name is printed at the end of the imapsync run.
If you do not want logging in a file use option --nolog
B) Hard way. It is the hard way because it installs all software
dependencies. This is the way for modifying imapsync if needed.
dependencies. This is the way for modifying imapsync.exe if needed.
- Get imapsync-x.xx.tgz
- Install Perl if it isn't already installed.
B.1) Install Perl if it isn't already installed.
Strawberry Perl is a very good candidate
http://strawberryperl.com/
I use 5.16 (March 2015) but later releases should work (5.18 and 5.20 do)
- Use the command CPAN to install modules listed in the PREREQUISITES section.
There is also a batch file that does this install for you
It is called install_modules.bat available at
http://imapsync.lamiral.info/examples/install_modules.bat
B.2) Go into the Cook/ directory
B.3) Double-clic build_exe.bat
c) How to build imapsync.exe?
It should create a binary imapsync.exe in the current Cook/ directory.
- Do the hard stuff in B)
- Run build_exe.bat (found in the tarball)
B.4) Move imapsync.exe in the upper directory and follow instructions
from A.3) to A.8)

1
S/VERSION Symbolic link
View file

@ -0,0 +1 @@
../VERSION

107
S/external.shtml Executable file
View file

@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" id="TOP">
<head>
<title>Imapsync similar softwares and external services</title>
<meta name="generator" content="Bluefish 1.0.7"/>
<meta name="author" content="Gilles LAMIRAL"/>
<meta name="date" content="2015-01-30T17:30:18+0100"/>
<meta name="copyright" content="None"/>
<meta name="keywords" content="imap, transfer, migration"/>
<meta name="description" content="imap migration tool"/>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8"/>
<meta http-equiv="content-style-type" content="text/css"/>
<meta http-equiv="expires" content="0"/>
<link rel="icon" type="image/png" href="../W/images/logo_imapsync_s.png" />
<link href="../W/style.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<h1>Similar softwares <a id="similar" href="../#TOP"><small>(back to menu)</small></a>
</h1>
<ul>
<li> <b>imapsync</b>: <a href="https://github.com/imapsync/imapsync">https://github.com/imapsync/imapsync</a> (imapsync copy, sometimes delayed)</li>
<li> imap_tools: <a href="http://www.athensfbc.com/imap_tools/">http://www.athensfbc.com/imap_tools/</a></li>
<li> davmail: <a href="http://davmail.sourceforge.net/">http://davmail.sourceforge.net/</a></li>
<li> imaputils: <a href="http://code.google.com/p/imaputils/">http://code.google.com/p/imaputils/</a> (imap_tools fork)</li>
<li> <b>offlineimap</b>: <a href="http://offlineimap.org/">http://offlineimap.org/</a></li>
<li> <b>mbsync</b>: <a href="http://isync.sourceforge.net/">http://isync.sourceforge.net/</a></li>
<li> mailsync: <a href="http://mailsync.sourceforge.net/">http://mailsync.sourceforge.net/</a></li>
<li> mailutil: <a href="http://www.washington.edu/imap/">http://www.washington.edu/imap/</a>
part of the UW IMAP tookit.</li>
<li> imaprepl: <a href="https://bl0rg.net/software/">https://bl0rg.net/software/</a>
<a href="http://freecode.com/projects/imap-repl/">http://freecode.com/projects/imap-repl/</a></li>
<li> imapcopy (Pascal): <a href="http://home.arcor.de/armin.diehl/imapcopy/imapcopy.html">http://home.arcor.de/armin.diehl/imapcopy/imapcopy.html</a></li>
<li> imapcopy (Java): <a href="https://code.google.com/p/imapcopy/">https://code.google.com/p/imapcopy/</a></li>
<li> migrationtool: <a href="http://sourceforge.net/projects/migrationtool/">http://sourceforge.net/projects/migrationtool/</a></li>
<li> imapmigrate: <a href="http://sourceforge.net/projects/cyrus-utils/">http://sourceforge.net/projects/cyrus-utils/</a></li>
<li> larch: <a href="https://github.com/rgrove/larch">https://github.com/rgrove/larch</a> (derived from wonko_imapsync, good at Gmail)</li>
<li> wonko_imapsync: <a href="http://web.archive.org/web/20130807173030/http://wonko.com/post/ruby_script_to_sync_email_from_any_imap_server_to_gmail">http://wonko.com/article/554</a> (superseded by larch)</li>
<li> pop2imap: <a href="http://www.linux-france.org/prj/pop2imap/">http://www.linux-france.org/prj/pop2imap/</a></li>
<li> exchange-away: <a href="http://exchange-away.sourceforge.net/">http://exchange-away.sourceforge.net/</a></li>
<li> SyncBackPro <a href="http://www.2brightsparks.com/syncback/sbpro.html">http://www.2brightsparks.com/syncback/sbpro.html</a></li>
</ul>
<h1>External online IMAP migration services <a id="ONLINE_OTHERS" href="../#TOP"><small>(back to menu)</small></a>
</h1>
<p>I have no share in these free or paid services.
I don't think they use Imapsync.
Prices are given par mailbox and may be outdated (December 2011).</p>
<ul>
<li> French Ovh imapcopy <b>0 EUR</b>: <a href="https://ssl0.ovh.net/fr/imapcopy/">https://ssl0.ovh.net/fr/imapcopy/</a></li>
<li> Turkish imapcopy.net <b>0 TRY</b>: <a href="http://imapcopy.net/">http://imapcopy.net/</a></li>
<li> Movemymail free for the first and 5 USD thereafter: <a href="https://movemymail.net">https://movemymail.net</a> .</li>
<li> Migrationwiz 10 USD: <a href="https://www.bittitan.com/products/#migrationwiz"></a>https://www.bittitan.com/products/#migrationwiz</li>
<li> Rackspace migration 5 USD: <a href="http://www.rackspace.com/email-hosting/migrations">http://www.rackspace.com/email-hosting/migrations</a></li>
<li> Audriga Gmbh 9.99 EUR: <a href="https://www.email-umzug.de/en.html">https://www.email-umzug.de/</a></li>
<li> Yippiemove 15 USD: <a href="http://www.yippiemove.com">http://www.yippiemove.com/</a></li>
<li> Dell ondemand-migration-for-email (price unknown): <a href="http://software.dell.com/products/ondemand-migration-for-email/">http://software.dell.com/products/ondemand-migration-for-email/</a></li>
</ul>
<hr/>
<div>
<a href="http://validator.w3.org/check?uri=referer">
<img
src="../W/images/valid-xhtml10"
alt="Valid XHTML 1.0 Strict" height="31" width="88" />
</a>
<a href="http://jigsaw.w3.org/css-validator/check/referer">
<img style="border:0;width:88px;height:31px"
src="../W/images/vcss-blue"
alt="CSS Valide !" />
</a>
<a href="http://www.anybrowser.org/campaign/">
<img style="border:0;width:88px;height:31px"
src="../W/images/ab_jlh.png"
alt="Viewable With Any Browser" />
</a>
</div>
<hr/>
<p>
<!--#config timefmt="%D" -->
<!--#config timefmt="%A %B %d, %Y" -->
<b>This document last modified on <!--#echo var="LAST_MODIFIED" --></b>
($Id: external.shtml,v 1.4 2015/04/01 00:00:50 gilles Exp gilles $)<br/>
<a href="#TOP">Top of the page</a>
</p>
</body>
</html>

186
S/imapservers.shtml Executable file
View file

@ -0,0 +1,186 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" id="TOP">
<head>
<title>Imapsync list of imap server softwares supported (and the failures one)</title>
<meta name="generator" content="Bluefish 1.0.7"/>
<meta name="author" content="Gilles LAMIRAL"/>
<meta name="date" content="2015-01-30T17:30:18+0100"/>
<meta name="copyright" content="None"/>
<meta name="keywords" content="imap, transfer, migration"/>
<meta name="description" content="imap migration tool"/>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8"/>
<meta http-equiv="content-style-type" content="text/css"/>
<meta http-equiv="expires" content="0"/>
<link rel="icon" type="image/png" href="../W/images/logo_imapsync_s.png" />
<link href="../W/style.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<h1>Imapsync list of imap server softwares supported (and the failures one) <a id="imap_server_success" href="../#TOP"><small>(back to menu)</small></a>
</h1>
<p>Let's start with the long reported <b>success stories</b> list: <b>
62 different imap server softwares supported!</b><br/>
[host1] means "source server" and [host2] means "destination server":
</p>
<ul>
<li>1und1 H mimap1 84498 [host1], H mibap4 95231 [host1](<a href="http://www.1und1.de/">http://www.1und1.de/</a>)</li>
<li>a1.net imap.a1.net IMAP4 Ready [host1] </li>
<li><b>Apple Server</b> 10.6 Snow Leopard [host1] </li>
<li>Archiveopteryx 2.03, 2.04, 2.09, 2.10 [host2], 3.0.0 [host2]
(OSL 3.0) (<a href="http://www.archiveopteryx.org/">http://www.archiveopteryx.org/</a>)</li>
<li>Atmail 6.x [host1] <a href="https://www.atmail.com/">https://www.atmail.com/</a></li>
<li>Axigen Mail Server Version 8.0.0 (<a href="https://www.axigen.com/">https://www.axigen.com/</a>)</li>
<li>BincImap 1.2.3 (GPL) (<a href="http://www.bincimap.org/">http://www.bincimap.org/</a>)</li>
<li>CommuniGatePro server (Redhat 8.0) (Solaris), CommuniGate Pro 5.2.17[host2] (CentOS 5.4)
(<a href="http://www.communigate.com/">http://www.communigate.com/</a>) </li>
<li>Courier IMAP 1.5.1, 2.2.0, 2.1.1, 2.2.1, 3.0.8, 3.0.3, 4.1.1 (GPL)
(<a href="http://www.courier-mta.org/imap/">http://www.courier-mta.org/imap/</a>) </li>
<li>Critical Path (7.0.020) </li>
<li>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.3, 2.2.6, 2.2.10, 2.2.12, 2.2.13,
2.3-alpha (OSI Approved), 2.3.1, 2.3.7, 2.3.16
(<a href="http://cyrusimap.web.cmu.edu/">http://cyrusimap.web.cmu.edu/</a>)
</li>
<li>David Tobit V8. (<a href="http://de.tobit.com/">http://de.tobit.com/</a>) </li>
<li>DBMail 1.2.1, 2.0.4, 2.0.9, 2.2rc1 (GPL).
2.0.7 seems buggy. (<a href="http://www.dbmail.org/">http://www.dbmail.org/</a>) </li>
<li>DBOX 2.41 System [host1] (<a href="http://www.dbox.handshake.de/">http://www.dbox.handshake.de/</a>).</li>
<li>Deerfield VisNetic MailServer 5.8.6 [host1]
(<a href="http://www.deerfield.net/products/visnetic-mailserver/">http://www.deerfield.net/products/visnetic-mailserver/</a>) </li>
<li>dkimap4 [host1] </li>
<li>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]
(<a href="http://www-03.ibm.com/software/products/en/ibmnotes">http://www-03.ibm.com/software/products/en/ibmnotes</a>) </li>
<li><b>Dovecot</b> 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/) (<a href="http://www.dovecot.org/">http://www.dovecot.org/</a>) </li>
<li>Eudora WorldMail v2 (<a href="http://www.eudora.com/worldmail/">http://www.eudora.com/worldmail/</a>) </li>
<li>FirtClass 12 [host1] hard so read the FAQ! (<a href="http://www.firstclass.com/">http://www.firstclass.com/</a>)</li>
<li>FTGate [host1][host2] (<a href="http://www.ftgate.com/">http://www.ftgate.com/</a>)</li>
<li>Fusemail imap.fusemail.net:143 (<a href="https://www.fusemail.com/">https://www.fusemail.com/</a>).</li>
<li><b>Gimap</b> (<b>Gmail</b> imap) [host1] [host2] (<a href="http://mail.google.com/">http://mail.google.com/</a>) </li>
<li>GMX IMAP4 StreamProxy. (<a href="http://www.gmx.com/">http://www.gmx.com/</a>) </li>
<li>Godaddy IMAP (since Godaddy runs Courier) (<a href="https://www.godaddy.com/">https://www.godaddy.com/</a>) </li>
<li>Groupwise IMAP (Novell) 6.x and 7.0. Buggy so see the FAQ.
(<a href="http://www.novell.com/products/groupwise/">http://www.novell.com/products/groupwise/</a>) </li>
<li>hMailServer 5.40-B1950 [host12], 5.3.3 [host2], 4.4.1 [host1], HMAILSERVER 5.3.2-B1769 on windows 2003 [hsot2]
(<a href="https://www.hmailserver.com/">https://www.hmailserver.com/</a>) </li>
<li><b>Hotmail</b> hotmail.com is outlook.com and live.com now.</li>
<li>IceWarp Server 10.4.5 [host1] (<a href="https://www.icewarp.com/">https://www.icewarp.com/</a>)</li>
<li>iPlanet Messaging server 4.15, 5.1, 5.2
(<a href="http://en.wikipedia.org/wiki/Oracle_Communications_Messaging_Server">http://en.wikipedia.org/wiki/Oracle_Communications_Messaging_Server</a>) </li>
<li>IMail 7.15 (Ipswitch/Win2003), 8.12, 11.03 [host1] (<a href="http://www.imailserver.com/">http://www.imailserver.com/</a>) </li>
<li>Kerio 7.2.0P1 [host1] (<a href="http://www.kerio.com/">http://www.kerio.com/</a>) </li>
<li>Mail2World IMAP4 Server 2.5 [host1] (<a href="http://www.mail2world.com/">http://www.mail2world.com/</a>)</li>
<li><b>MailEnable</b> 4.23 [host1][host2], 4.26 [host1][host2], 5 [host1]
(<a href="http://www.mailenable.com/">http://www.mailenable.com/</a>) </li>
<li>MDaemon 7.0.1, 8.0.2, 8.1, 9.5.4 (Windows server 2003 R2 platform), 9.6.5 [host1],
12 [host2], 12.0.3 [host1], 12.5.5 [host1], 13.5 [host2], 14.5 [host2]
(<a href="http://www.altn.com/">http://www.altn.com/</a>) </li>
<li>Mercury 4.1 (Windows server 2000 platform) (<a href="http://www.pmail.com/">http://www.pmail.com/</a>) </li>
<li><b>Microsoft Exchange Server</b> 5.5, 6.0.6249.0[host1], 6.0.6487.0[host1],
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],
Exchange 2010 SP1 RU2 [host2]
(<a href="http://www.microsoft.com/exchange/">http://www.microsoft.com/exchange/</a>)
</li>
<li>Mirapoint server 4.1.9-GA [host1] (<a href="http://www.mirapoint.com/">http://www.mirapoint.com/</a>) </li>
<li>Netscape Mail Server 3.6 (Wintel) </li>
<li>Netscape Messaging Server 4.15 Patch 7 </li>
<li><b>Office 365</b> [host1] [host2] (<a href="http://office365.com">http://office365.com</a>) </li>
<li>OpenMail IMAP server B.07.00.k0 </li>
<li>OpenWave (<a href="http://www.openwave.com/">http://www.openwave.com/</a>) </li>
<li>Oracle Beehive [host1]
(<a href="http://www.oracle.com/technetwork/middleware/beehive/overview/index.html">http://www.oracle.com/technetwork/middleware/beehive/overview/</a>) </li>
<li><b><a href="http://outlook.com/">Outlook.com</a></b> can be IMAP accessed via host imap-mail.outlook.com over ssl (use --ssl1 or --ssl2).</li>
<li>Parallels Plesk Panel 9.x [host2] 11.x [host2] (<a href="http://www.parallels.com/">http://www.parallels.com/</a>)</li>
<li>Qualcomm Worldmail (NT) (<a href="http://www.eudora.com/worldmail/">http://www.eudora.com/worldmail/</a>) </li>
<li>Rockliffe Mailsite 5.3.11, 4.5.6 (<a href="http://www.mailsite.com/">http://www.mailsite.com/</a>) </li>
<li>RackSpace hoster secure.emailsrvr.com:993 <a href="http://www.rackspace.com/">http://www.rackspace.com/</a>)</li>
<li>QQMail IMAP4Server [host1] [host2] (See FAQ) <a href="https://en.mail.qq.com/">https://en.mail.qq.com/</a> </li>
<li>Samsung Contact IMAP server 8.5.0 </li>
<li>Scalix v10.1, 10.0.1.3, 11.0.0.431, 11.4.6 (<a href="http://www.scalix.com/">http://www.scalix.com/</a>) </li>
<li>Sendmail Mail Store IMAP4rev1 (5.5.6/mstore-5-5-build-1874 [host1].</li>
<li>SmarterMail, Smarter Mail 5.0 Enterprise, Smarter Mail 5.5 [host1], SmarterMail Professional 10.2 [host1],
Smarter Mail 11.7 [host1][host2].
(<a href="http://www.smartertools.com/">http://www.smartertools.com/</a>) </li>
<li>Softalk Workgroup Mail 7.6.4 [host1] (<a href="http://www.softalkltd.com/products/download_wm_v7.asp">http://www.softalkltd.com/products/download_wm_v7.asp</a>).</li>
<li>SunONE Messaging server 5.2, 6.0 (SUN JES - Java Enterprise System) (<a href="http://www.oracle.com/">http://www.oracle.com/</a>) </li>
<li>Sun Java(tm) System Messaging Server 6.2-2.05, 6.2-7.05, 6.3 (<a href="http://www.oracle.com/">http://www.oracle.com/</a>) </li>
<li>Surgemail 3.6f5-5, 6.3d-72 [host2] (<a href="http://netwinsite.com/surgemail/">http://netwinsite.com/surgemail/</a>) </li>
<li>UW-imap servers (imap-2000b) rijkkramer IMAP4rev1 2000.287
(RedHat uses UW like 2003.338rh), v12.264 Solaris 5.7 (OSI Approved)
(<a href="http://www.washington.edu/imap/">http://www.washington.edu/imap/</a>) </li>
<li>VMS, Imap part of TCP/IP suite of VMS 7.3.2 (<a href="http://h71000.www7.hp.com/openvms/">http://h71000.www7.hp.com/openvms/</a>) </li>
<li><b>Yahoo</b> [host1] (<a href="http://www.yahoo.com/">http://www.yahoo.com/</a>) </li>
<li>Zarafa 6,40,0,20653 [host1] (<a href="http://www.zarafa.com/">http://www.zarafa.com/</a>)</li>
<li>Zarafa ZCP 7.1.4 IMAP Gateway [host2]</li>
<li><b>Zimbra-IMAP</b> 3.0.1 GA 160, 3.1.0 Build 279, 4.0.5, 4.5.2, 4.5.6,
Zimbra 5.0.24_GA_3356.RHEL4 [host1], 5.5, 6.x
(<a href="http://www.zimbra.com/">http://www.zimbra.com/</a>) </li>
</ul>
<p>Let's finish with reported <b>failure stories</b> over the past.<br/>
Maybe <b>new imapsync releases can run successfully with them</b>.<br/>
Don't hesitate to have a try, It's been a long time since last failure occured,
I will help you and make efforts to switch them to the success list,
that's my job.
</p>
<ul>
<li>DBMail 0.9, 2.0.7 (GPL). But most other DBMail releases are supported (see below).</li>
<li>Imail 7.04 (maybe).</li>
<li>MailEnable 1.54 (Proprietary) but MailEnable 4.23 is supported. </li>
<li>(2011) <b>MDaemon 12.0.3</b> as <b>host2</b>
but MDaemon is <b>supported as host1</b>.
MDaemon is simply buggy with the APPEND IMAP command with any IMAP email client.
</li>
</ul>
<hr/>
<div>
<a href="http://validator.w3.org/check?uri=referer">
<img
src="../W/images/valid-xhtml10"
alt="Valid XHTML 1.0 Strict" height="31" width="88" />
</a>
<a href="http://jigsaw.w3.org/css-validator/check/referer">
<img style="border:0;width:88px;height:31px"
src="../W/images/vcss-blue"
alt="CSS Valide !" />
</a>
<a href="http://www.anybrowser.org/campaign/">
<img style="border:0;width:88px;height:31px"
src="../W/images/ab_jlh.png"
alt="Viewable With Any Browser" />
</a>
</div>
<hr/>
<p>
<!--#config timefmt="%D" -->
<!--#config timefmt="%A %B %d, %Y" -->
<b>This document last modified on <!--#echo var="LAST_MODIFIED" --></b>
($Id: imapservers.shtml,v 1.1 2015/03/29 17:24:01 gilles Exp gilles $)<br/>
<a href="#TOP">Top of the page</a>
</p>
</body>
</html>

305
S/news.shtml Executable file
View file

@ -0,0 +1,305 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" id="TOP">
<head>
<title>Imapsync News</title>
<meta name="generator" content="Bluefish 2.2.2" />
<meta name="author" content="Gilles LAMIRAL" />
<meta name="date" content="2015-03-29T15:09:06+0200" />
<meta name="copyright" content="None"/>
<meta name="keywords" content="imap, transfer, migration"/>
<meta name="description" content="imap migration tool"/>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8"/>
<meta http-equiv="content-style-type" content="text/css"/>
<meta http-equiv="expires" content="0"/>
<link rel="icon" type="image/png" href="../W/images/logo_imapsync_s.png" />
<link href="../W/style.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<h1>News about imapsync <!--#exec cmd="cat ../VERSION" --> and previous releases <a id="latest" href="../#TOP"><small>(back to menu)</small></a>
</h1>
<p>imapsync <!--#exec cmd="cat ../VERSION" --> was written on <!--#flastmod file="VERSION" -->
</p>
<div id="osw_imapsync"></div>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js" type="text/javascript"></script>
<script src="http://static.oswatershed.org/js/package_badge.js" type="text/javascript"></script>
<script type="text/javascript">$(document).ready(function(){ package_badge("imapsync", "#osw_imapsync"); });</script>
<p>See <b><a href="../ChangeLog">ChangeLog</a></b> to read what has been done in details since 2001.</p>
<p>New features or bugfixes since previous releases:</p>
<!--
<ul>
<li><b>1.636</b></li>
<li><b>Enhancement</b>: </li>
<li><b>Enhancement</b>: </li>
<li><b>Enhancement</b>: </li>
<li><b>Usability</b>: </li>
<li><b>Usability</b>: </li>
<li><b>Usability</b>: </li>
<li><b>Usability</b>: </li>
<li><b>Bug fix</b>: </li>
<li><b>Bug fix</b>: </li>
<li><b>Bug fix</b>: </li>
<li><b>Refactoring</b>: </li>
<li><b>Refactoring</b>: </li>
</ul>
-->
<ul>
<li><b>1.636</b></li>
<li><b>Enhancement</b>: Added errors dump listing at the end, before last folder sizes or the statistics. Turned on by default. Use --noerrorsdump to avoid it.</li>
<li><b>Enhancement</b>: Added --maxlinelengthcmd that will be called upon when a line over --maxlinelength is detected. </li>
<li><b>Enhancement</b>: Exchange maxlinelength issue fixed with --maxlinelengthcmd 'reformime -r7' on Linux. Install maildrop package to get reformime command</li>
<li><b>Enhancement</b>: Added --testslive. "imapsync --testslive" performs a live test on real accounts (I own).</li>
<li><b>Enhancement</b>: Added --pipemess in order to pass all message to an external filter tool like "reformime -r7".</li>
<li><b>Enhancement</b>: Added xoauth2 support, available on Unix with underlying openssl. Thanks to Joaquin Lopez.</li>
<li><b>Enhancement</b>: Added --skipmess to skip messages matching a regex.
Example --skipmess 'm/[\x80-ff]/' to slip messages with non-7bit characters ( ie a byte somewhere begins with 1 )</li>
<li><b>Usability</b>: Better output of folders excluded by --exclude and folders included by --include</li>
<li><b>Usability</b>: Added inline help in many places. What you can do with switches to change imapsync behaviour, contextually. Learn imapsync the easy way.</li>
<li><b>Bug fix</b>: imapsync --tests should work under any circumstance now, any Unix, Windows, exe or bin or script. 561 non-regression tests</li>
<li><b>Bug fix</b>: --folderfirst and --folderlast generated an error when their value folder does not exist. Existence is checked.</li>
<li><b>Bug fix</b>: --disarmreadreceipts used to change Disposition-Notification-To in the body when not available in the header. Now never changes the body in all cases.</li>
<li><b>Bug fix</b>: Change default useheader values. Now it is really like --useheader "Message-Id" --useheader "Received".
HMailServer replies two lines with --useheader "Message-Id" --useheader "Message-ID" in older releases.
</li>
<li><b>Bug fix</b>: in imap_utf7_decode() + must not be escaped. Was a bug with Cyrillic characters</li>
<li><b>Refactoring</b>: Started to split the <a href="../FAQ">FAQ</a> file in several parts in <a href="../FAQ.d/">FAQ.d/*</a></li>
<li><b>Refactoring</b>: Split the <a href="../INSTALL">INSTALL</a> file in several parts in <a href="../INSTALL.d/">INSTALL.d/*</a></li>
</ul>
<ul>
<li><b>1.607</b> Folders shown also in utf8.</li>
<li><b>Caveat to upgrade on Unix!</b>: New <b>Unicode::String</b> Perl module dependency, for utf8 output. See the <a href="../INSTALL">INSTALL</a> file.</li>
<li><b>Enhancement</b>: Added --skipemptyfolders to skip syncing empty host1 folders. They are not created on host2.</li>
<li><b>Enhancement</b>: Windows exe now uses IO::SSL 2.002 instead of 1.98 (is it really an enhancement?).</li>
<li><b>Usability</b>: Remove /x from regexes applied with --include and --exclude. Blanks no longer have to be explicit with \ or [ ].</li>
<li><b>Usability</b>: Added utf8 output for folder names, protocol native utf7imap special characters are not user friendly readable</li>
<li><b>Usability</b>: Moved foldersizes output after folders lists output.</li>
<li><b>Usability</b>: Added total size transferred after each message copied.</li>
<li><b>Usability</b>: After ETA, added number of total to be synced, as a denominator dddd after each message copied, like nnn/dddd
where nnn is the number of messages copied. Before there was only nnn without /dddd.</li>
<li><b>Bug fix</b>: Cache fix on Windows. File paths with brackets [] are special, they have to be escaped with glob.
For example, [Gmail] must be written [[]Gmail[]].</li>
<li><b>Bug fix</b>: Added several checks if IsUnconnected. Goal avoid imap commands while disconnected.
Reconnexion would be better anyway.</li>
</ul>
<ul>
<li><b>1.597</b> Small things</li>
<li><b>Enhancement</b>: Added --nomixfolders to avoid merging folders that are considered different on host1 but the same on destination host2
because of case sensitivities and insensitivities.</li>
<li><b>Bug fix</b>: Fixed "imapsync doesn't see created folders in the listing of folder sizes at the end". (second time this bug shows up)</li>
</ul>
<ul>
<li><b>1.592</b> Logging by default! (an internal feature now)</li>
<li><b>Caveat to upgrade</b>: New <b>IO::Tee</b> Perl module dependency, for logging. See the <a href="../INSTALL">INSTALL</a> file.</li>
<li><b>Windows upgrade</b>: Win32 binary is now distributed in a zip file with two batches scripts ready to use it.</li>
<li><b>Enhancement</b>: Added logging by default in subdirectory <b>./LOG_imapsync/</b></li>
<li><b>Enhancement</b>: <b>Added option --log turned on by default</b>. Use --nolog to disable logging.</li>
<li><b>Enhancement</b>: Added option --logfile. Default is like ./LOG_imapsync/YYYY_MM_DD_HH_MM_SS_user2.txt
where YYYY_MM_DD_HH_MM_SS is the launching date and time like 2014_05_20_23_45_10</li>
<li><b>Enhancement</b>: Added option <b>--disarmreadreceipts</b> to fix resending read receipts on host2. A must with Exchange as host2.</li>
<li><b>Enhancement</b>: Added FTGate support (no EXAMINE imap command used anymore).</li>
<li><b>Usability</b>: Updated the code to easily switch on --noreleasecheck by default but allowing --releasecheck (some users want this feature).</li>
<li><b>Usability</b>: Warn syncing messges will not be simulated when --dry mode is on and folder on host2 does not exist yet.</li>
<li><b>Bug fix</b>: Make TLS works with last IO::Socket::SSL default value (Added SSL_verify_mode => 'SSL_VERIFY_NONE') in --tls mode.</li>
<li><b>Bug fix</b>: Fixed bug when creating folders on host2 with --sep2=\\ (Lotus Notes).</li>
<li><b>Bug fix</b>: Try to get folder size when a folder on host2 has the same name but with a different case
like OLD_MAIL -> old_mail. This avoids "does not exist" output.</li>
</ul>
<ul>
<li><b>1.584</b></li>
<li><b>Enhancement</b>: Added --minmaxlinelength to select messages with long lines only.
It helps to diagnostic Echange error on messages with lines longer than 9000 characters</li>
<li><b>Enhancement</b>: Added --debugmaxlinelength</li>
<li><b>Bug fix</b>: --ssl1 --tls2 was buggy because of default SSL_VERIFY_PEER.
"Can not go to tls encryption on [localhost]:Unable to start TLS: Cannot determine peer hostname for verification..."</li>
<li><b>Bug fix</b>: Check if going to tls is ok, exit otherwise with explicit error message.
Thanks to Dennis Schridde for reporting this ugly bug that deserves this <a href="http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-2014">CVE-2014-2014</a>.</li>
<li><b>Debug</b>: Print separator given by NAMESPACE even when --sep1 oe --sep2 is used.</li>
<li><b>Debug</b>: Prints prefix given by NAMESPACE even when --prefix1 or --prefix2 is used.
It is a preparation for advising not to use --prefix unless suggested.</li>
</ul>
<p><b>Good changes</b> made before, listed because <b>they can help</b>:
</p>
<ul>
<li><b>Enhancement</b>: Added <b>--skipcrossduplicates</b> to avoid copying messages that are already copied in another folder, good <b>from Gmail to X</b>.</li>
<li><b>Enhancement</b>: Added --debugcrossduplicates to print which messages (UIDs) are skipped with --skipcrossduplicates (and in what other folders they are).</li>
<li><b>Enhancement</b>: Added --folderfirst string: sync this folder first. --folderfirst "Work" --folderfirst "Friends"</li>
<li><b>Enhancement</b>: Added --folderlast string: sync this folder last. --folderlast "[Gmail]/All Mail" etc.</li>
<li><b>Enhancement</b>: Added <b>--maxmessagespersecond</b> to limit messages tranfer rate and fix <b>Office365 throttle limitation</b> (use --maxmessagespersecond 4).</li>
<li><b>Enhancement</b>: Added --maxbytespersecond to limit byte transfer rate.</li>
<li><b>Enhancement</b>: Added --debugmemory option that prints memory consumption after each message is copied.</li>
<li><b>Enhancement</b>: Added --authmech EXTERNAL.</li>
<li><b>Enhancement</b>: Adapted behavior for allowing --maxdate --mindate with --noabletosearch.
Use internat date instead of Date: header.</li>
<li><b>Enhancement</b>: QQMail IMAP4Server success (with --noabletosearch option) </li>
<li><b>Usability</b>: Apply same treatment to --delete2duplicates as --delete2.
If --uidexpunge2 can be done, do it, else do --expunge2 (unless --nouidexpunge2 or --noexpunge2).</li>
<li><b>Usability</b>: Added --timeout in the --help output. Default timeout is 120 seconds now
(was nothing by imapsync, 600 with underlying modules).</li>
<li><b>Enhancement/Bug fix</b>: Added --ssl1_SSL_version and --ssl2_SSL_version to force the SSL_version
in case the default auto-negociation does not work. Example: <b>--ssl1 --ssl1_SSL_version SSLv3</b></li>
<li><b>Enhancement</b>: Added option --messageidnodomain to fix Mailenable bug changing the domain part of Message-Id header, and avoid duplicates</li>
<li><b>Enhancement</b>: Added option --syncflagsaftercopy to fix Mailenable bug not getting the flags with the APPEND</li>
<li><b>Enhancement</b>: Added option <b>--maxlinelength</b> to skip messages whose max line length is over a number of bytes.
Exchange 2013 and Office365 need <b>--maxlinelength 1000</b> (which is a RFC2822 must) to avoid disconnections.</li>
<li><b>Usability</b>: Added --fixInboxINBOX, turned on by default, to map automatically Inbox INBOX folder names.</li>
<li><b>Usability</b>: IMAP server removing consecutive spaces on the header part doesn't generate duplicates (MailEnable does that)</li>
<li><b>Usability</b>: SSL_verify_mode 0 to avoid warning about Man-In-The-Middle.</li>
<li><b>Enhancement</b>: Added XOAUTH authentication. Thanks to Eduardo Bortoluzzi Junior.</li>
<li><b>Enhancement</b>: Added <b>--search1</b> and <b>--search2</b> to allow different searches on each host.</li>
<li><b>Usability</b>: Added --delete1 as an alias for --delete</li>
<li><b>Speed</b>: Option <b>--nocheckmessageexists is activated by default</b> since --checkmessageexists often slow down transfers too much.</li>
<li><b>Usability</b>: Option --foldersizesatend is on if --foldersizes is on. Off if --nofoldersizesatend</li>
<li><b>Usability</b>: Added <b>host2 minus host1 statistic</b>: number of messages and bytes.
One difference at the start and one at the end.
Useful to <b>detect quickly a difference between host2 and host1</b>.
Need both --foldersizes and --foldersizesatend options (which are on by default).</li>
<li><b>Usability</b>: Added <b>--foldersizesatend</b>.
It gets the folders sizes at the end of the whole transfer.
Turned on by default (use --nofoldersizesatend to turn it off).</li>
<li><b>Enhancement</b>: Added option <b>--delete2duplicates</b>;
it deletes messages in host2 that are duplicates.
--delete2duplicates is on when --delete2 is set unless --nodelete2duplicates is set too.
</li>
<li><b>Enhancement</b>: Added option <b>--pidfilelocking</b>;
it aborts imapsync, when just launched,
in case another imapsync may be running.
Turned off by default</li>
<li><b>Usability</b>: Added option <b>--showpasswords</b>.
it shows passwords on output instead of "MASKED".
Turned off by default.
Useful to restart a run by reading the log
or to see what happen with special characters.
</li>
<li><b>Bug fix</b>: Added option <b>--fixslash2</b>
to avoid the '<b>Invalid mailbox name</b>' error.
It acts when --sep1 is character / and --sep2 is not character /
and host1 folder name contains --sep2 characters.
Turned on by default (--nofixslash2 to unable it).</li>
<li><b>Enhancement</b>: Added option <b>--noabletosearch</b>
to allow the listing of messages without the imap "SEARCH ALL" command.
It's useful for playing with poor imap servers like <b>Softalk 7.6.4</b>
(8.6 is fine with SEARCH ALL).</li>
<li><b>Enhancement</b>: Added <b>--noexpungeaftereach</b>
to speedup --delete --expunge from Gmail.</li>
<li><b>Enhancement</b>: Added option <b>--nocheckmessageexists</b> to <b>speed up</b> with <b>Tobit imap server</b> as host1.</li>
<li><b>Enhancement</b>: Added option --exitwhenover option <b>to avoid locking</b>
when transfers exceed maximum limit.
See for example <a href="https://support.google.com/a/answer/1071518?hl=en">this Gmail constraint</a>
<ul>
<li>imapsync ... --exitwhenover 2500000000 # 2.5GB if <b>host1 is Gmail</b></li>
<li>imapsync ... --exitwhenover 500000000 # 500MB if <b>host2 is Gmail</b></li>
</ul>
</li>
<li><b>Usability</b>: Default headers used to identify a message are like --useheader "Message-Id" --useheader "Received"
(<b>Exchange compatibility</b> bu default).</li>
<li><b>Enhancement</b>: Added option --addheader to fix the issue
"ignored (no header so we ignore this message)" (on <b>Sent</b> folder usually).
Thanks to Ameir Abdeldayem</li>
<li><b>Enhancement</b>: Added --nofilterflags to check any STORE flags
by ignoring PERMANENTFLAGS (Exchange tests)</li>
</ul>
<hr/>
<div>
<a href="http://validator.w3.org/check?uri=referer">
<img
src="../W/images/valid-xhtml10"
alt="Valid XHTML 1.0 Strict" height="31" width="88" />
</a>
<a href="http://jigsaw.w3.org/css-validator/check/referer">
<img style="border:0;width:88px;height:31px"
src="../W/images/vcss-blue"
alt="CSS Valide !" />
</a>
<a href="http://www.anybrowser.org/campaign/">
<img style="border:0;width:88px;height:31px"
src="../W/images/ab_jlh.png"
alt="Viewable With Any Browser" />
</a>
</div>
<hr/>
<p>
<!--#config timefmt="%D" -->
<!--#config timefmt="%A %B %d, %Y" -->
<b>This document last modified on <!--#echo var="LAST_MODIFIED" --></b>
($Id: news.shtml,v 1.2 2015/03/31 23:59:58 gilles Exp gilles $)<br/>
<a href="#TOP">Top of the page</a>
</p>
</body>
</html>

68
S/template.shtml Executable file
View file

@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" id="TOP">
<head>
<title>Imapsync template file</title>
<meta name="generator" content="Bluefish 2.2.2" />
<meta name="author" content="Gilles LAMIRAL" />
<meta name="date" content="2015-03-29T15:09:06+0200" />
<meta name="copyright" content="None"/>
<meta name="keywords" content="imap, transfer, migration"/>
<meta name="description" content="imap migration tool"/>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8"/>
<meta http-equiv="content-style-type" content="text/css"/>
<meta http-equiv="expires" content="0"/>
<link rel="icon" type="image/png" href="../W/images/logo_imapsync_s.png" />
<link href="../W/style.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<h1>Tittle 1 <a id="title1" href="../#TOP"><small>(back to menu)</small></a>
</h1>
<p>Blabla 1</p>
<h1>Tittle 2 <a id="title2" href="../#TOP"><small>(back to menu)</small></a>
</h1>
<p>Blabla 2</p>
<hr/>
<div>
<a href="http://validator.w3.org/check?uri=referer">
<img
src="../W/images/valid-xhtml10"
alt="Valid XHTML 1.0 Strict" height="31" width="88" />
</a>
<a href="http://jigsaw.w3.org/css-validator/check/referer">
<img style="border:0;width:88px;height:31px"
src="../W/images/vcss-blue"
alt="CSS Valide !" />
</a>
<a href="http://www.anybrowser.org/campaign/">
<img style="border:0;width:88px;height:31px"
src="../W/images/ab_jlh.png"
alt="Viewable With Any Browser" />
</a>
</div>
<hr/>
<p>
<!--#config timefmt="%D" -->
<!--#config timefmt="%A %B %d, %Y" -->
<b>This document last modified on <!--#echo var="LAST_MODIFIED" --></b>
($Id: template.shtml,v 1.2 2015/03/29 17:24:47 gilles Exp gilles $)<br/>
<a href="#TOP">Top of the page</a>
</p>
</body>
</html>

101
TODO
View file

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: TODO,v 1.127 2014/11/14 17:06:17 gilles Exp gilles $
# $Id: TODO,v 1.135 2015/03/31 14:56:25 gilles Exp gilles $
TODO file for imapsync
----------------------
@ -9,37 +9,50 @@ Start a wiki for imapsync.
Write a tutorial.
Add a best practice migration tips document.
Add uidexpunge with --delete if possible (like with --delete2).
Add the possibility to specify a unity with --maxsize and --minsize
Example --maxsize 10MB --minsize 10KB
B
KB
MB
GB
TB
2015_03_24
Add --sslargs with usage like:
imapsync ... --sslargs 'SSL_version=' --sslargs 'SSL_use_cert=1' \
--sslargs 'SSL_verify_mode=SSL_VERIFY_PEER'
See perldoc IO::Socket::SSL for all possibilities.
2015_03_06
Dealing with Content-Type Message/Partial
Extract the components of the partial messages and construct them
with reformime as one message which can then be transferred. (Larry Moore)
See also uudeview http://www.fpx.de/fp/Software/UUDeview/
(Larry said uudeview is weird on Partial issue, too old maybe)
Apply --disarmreadreceipts only to UNSEEN messages.
Add an exit value when exiting because of --exitwhenover
The goal is to know easily why to restart later.
Write a Mail::imapsync package and use it.
Evaluate
One day, when I have really nothing better to do, evaluate:
http://www.rackspace.com/apps/email_hosting/migrations
http://www.yippiemove.com/
http://www.migrationwiz.com/
http://www.microsoft.com/download/en/details.aspx?id=1329 "Microsoft Transporter Suite"
Separate the online site in a subfolder site/ or www/ and make the upper directory simple.
Add an option to remove empty folders on host1, except INBOX.
Is it possible to run imapsync in a way that empty folders on host1
aren't created at all on host2?
Apply --disarmreadreceipts only to UNSEEN messages.
Convert folder names to utf-8 and print them next to the uft-7 ones.
Look at imapsync/W/learn/
./imap_utf7 data_utf7
Add an exit value when exiting because of --exitwhenover
The goal is to know easily why to restart later.
Add --mark-as-deleted1 --mark-as-deleted2 as
aliases for --noexpunge1 --delete1 and --noexpunge2 --delete2
Move --help documentation into the man page so that description is easier to find.
Feature request for ImapSync.
Can you setup an option to make it stop if the destination mailbox reports that it is over quota?
Print the list of messages not copied and why (duplicates or void header)
Fix bug found by Pavel Stano on 01/06/2012 (june) imapsync never stop login
@ -80,7 +93,7 @@ with
Add a well described problem for each problem detected
and counted in error counter statistics.
Add sync imap keywords. Sync gmail labels to imap keyword
Add sync imap keywords. Sync Gmail labels to imap keyword
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=503159
http://www.linux-france.org/prj/imapsync_list/msg00022.html
http://mail.google.com/support/bin/answer.py?hl=en&answer=77657
@ -118,11 +131,6 @@ Fix bug "not possible to use space in the imap password"
Add kerberos authentification
Add stdin/stdout filter before transfer:
"Now i asked me, how to modify your perl program to work with
that - in example, to write each mail to stdout, pipe that to the
convertion program, and read the result from stdin - and this all before
the mail will transfer to the target imap-server"
Fix bug with folder names starting with an asterisk: *Archiv
Sending: 220 SELECT *Archiv/Support/foobar
@ -154,6 +162,47 @@ Add cyrus link about INBOX. namespace
http://asg.web.cmu.edu/cyrus/download/imapd/altnamespace.html
===========================================================================
Now the TODO done! (or not)
===========================================================================
WON'T DO. Not enough examples.
Can you setup an option to make it stop if the destination mailbox reports
that it is over quota?
DONE. Add stdin/stdout filter before transfer:
"Now i asked me, how to modify your perl program to work with
that - in example, to write each mail to stdout, pipe that to the
conversion program, and read the result from stdin - and this all before
the mail will transfer to the target imap-server"
http://www.courier-mta.org/maildrop/reformime.html
Look at IPC::Open2, assuming a good and safe pipe,
or write more code handling all the bad stranger behaviours possible.
Option name: --pipemess "command arg1 arg2 ..."
DONE. Transform messages with too long linelength.
Office365 and Exchange abort connexion
when they encounter a message with more than 10000 characters on a single line.
Could be done with the previous --pipemess with reformime.
Thanks to Larry Moore for suggesting reformime tool!
Usage: --maxlinelength 9900 maxlinelengthcmd 'reformime -r7'
DONE. Add DavMail in Similar Softwares section. http://davmail.sourceforge.net/
DONE. Convert folder names to utf-8 and print them next to the uft-7 ones.
Look at imapsync/W/learn/
./imap_utf7 data_utf7
DONE. Separate the online site in a folder site/ or www/ and make the upper directory simple.
DONE. --skipemptyfolders
Is it possible to run imapsync in a way that empty folders on host1
aren't created at all on host2? Yes with --skipemptyfolders
NO. Add an option to remove empty folders on host1, except INBOX.
Use --skipemptyfolders instead
DONE. Subject is output when APPEND fails. Done since a long time.
Suggestion: it's very difficult to track down messages which are behaving
@ -209,7 +258,7 @@ separator inversion produces an invalid character.
From uw to cyrus, for example :
FoldA/FoldB.ext -> FoldA.FoldB/ext
DONE. Not donse since useless now (--useuid)
DONE. Not done since useless now (--useuid)
Add a --skipheaderinfolder option
DONE. Not fixed since only reported once a long time ago.

View file

@ -1 +1 @@
1.607
1.637

View file

@ -1 +1 @@
1.607
1.637

View file

@ -302,3 +302,15 @@
1415819173 END 1.605 : mercredi 12 novembre 2014, 20:06:13 (UTC+0100)
1415985918 BEGIN 1.607 : vendredi 14 novembre 2014, 18:25:18 (UTC+0100)
1415986823 END 1.607 : vendredi 14 novembre 2014, 18:40:23 (UTC+0100)
1426391624 BEGIN 1.626 : dimanche 15 mars 2015, 04:53:44 (UTC+0100)
1426637725 BEGIN 1.627 : mercredi 18 mars 2015, 01:15:26 (UTC+0100)
1426734624 BEGIN 1.628 : jeudi 19 mars 2015, 04:10:24 (UTC+0100)
1426736361 END 1.628 : jeudi 19 mars 2015, 04:39:21 (UTC+0100)
1426820957 BEGIN 1.630 : vendredi 20 mars 2015, 04:09:18 (UTC+0100)
1426823109 END 1.630 : vendredi 20 mars 2015, 04:45:09 (UTC+0100)
1427249505 BEGIN 1.634 : mercredi 25 mars 2015, 03:11:45 (UTC+0100)
1427250851 END 1.634 : mercredi 25 mars 2015, 03:34:11 (UTC+0100)
1427814853 BEGIN 1.636 : mardi 31 mars 2015, 17:14:13 (UTC+0200)
1427815136 END 1.636 : mardi 31 mars 2015, 17:18:56 (UTC+0200)
1427853312 BEGIN 1.637 : mercredi 1 avril 2015, 03:55:12 (UTC+0200)
1427854440 END 1.637 : mercredi 1 avril 2015, 04:14:00 (UTC+0200)

View file

@ -1,127 +0,0 @@
The "Artistic License"
Preamble
The intent of this document is to state the conditions under which a
Package may be copied, such that the Copyright Holder maintains some
semblance of artistic control over the development of the package,
while giving the users of the package the right to use and distribute
the Package in a more-or-less customary fashion, plus the right to make
reasonable modifications.
Definitions:
"Package" refers to the collection of files distributed by the
Copyright Holder, and derivatives of that collection of files
created through textual modification.
"Standard Version" refers to such a Package if it has not been
modified, or has been modified in accordance with the wishes
of the Copyright Holder as specified below.
"Copyright Holder" is whoever is named in the copyright or
copyrights for the package.
"You" is you, if you're thinking about copying or distributing
this Package.
"Reasonable copying fee" is whatever you can justify on the
basis of media cost, duplication charges, time of people involved,
and so on. (You will not be required to justify it to the
Copyright Holder, but only to the computing community at large
as a market that must bear the fee.)
"Freely Available" means that no fee is charged for the item
itself, though there may be fees involved in handling the item.
It also means that recipients of the item may redistribute it
under the same conditions they received it.
1. You may make and give away verbatim copies of the source form of the
Standard Version of this Package without restriction, provided that you
duplicate all of the original copyright notices and associated disclaimers.
2. You may apply bug fixes, portability fixes and other modifications
derived from the Public Domain or from the Copyright Holder. A Package
modified in such a way shall still be considered the Standard Version.
3. You may otherwise modify your copy of this Package in any way, provided
that you insert a prominent notice in each changed file stating how and
when you changed that file, and provided that you do at least ONE of the
following:
a) place your modifications in the Public Domain or otherwise make them
Freely Available, such as by posting said modifications to Usenet or
an equivalent medium, or placing the modifications on a major archive
site such as uunet.uu.net, or by allowing the Copyright Holder to include
your modifications in the Standard Version of the Package.
b) use the modified Package only within your corporation or organization.
c) rename any non-standard executables so the names do not conflict
with standard executables, which must also be provided, and provide
a separate manual page for each non-standard executable that clearly
documents how it differs from the Standard Version.
d) make other distribution arrangements with the Copyright Holder.
4. You may distribute the programs of this Package in object code or
executable form, provided that you do at least ONE of the following:
a) distribute a Standard Version of the executables and library files,
together with instructions (in the manual page or equivalent) on where
to get the Standard Version.
b) accompany the distribution with the machine-readable source of
the Package with your modifications.
c) give non-standard executables non-standard names, and clearly
document the differences in manual pages (or equivalent), together
with instructions on where to get the Standard Version.
d) make other distribution arrangements with the Copyright Holder.
5. You may charge a reasonable copying fee for any distribution of this
Package. You may charge any fee you choose for support of this
Package. You may not charge a fee for this Package itself. However,
you may distribute this Package in aggregate with other (possibly
commercial) programs as part of a larger (possibly commercial) software
distribution provided that you do not advertise this Package as a
product of your own. You may embed this Package's interpreter within
an executable of yours (by linking); this shall be construed as a mere
form of aggregation, provided that the complete Standard Version of the
interpreter is so embedded.
6. The scripts and library files supplied as input to or produced as
output from the programs of this Package do not automatically fall
under the copyright of this Package, but belong to whoever generated
them, and may be sold commercially, and may be aggregated with this
Package. If such scripts or library files are aggregated with this
Package via the so-called "undump" or "unexec" methods of producing a
binary executable image, then distribution of such an image shall
neither be construed as a distribution of this Package nor shall it
fall under the restrictions of Paragraphs 3 and 4, provided that you do
not represent such an executable image as a Standard Version of this
Package.
7. C subroutines (or comparably compiled subroutines in other
languages) supplied by you and linked into this Package in order to
emulate subroutines and variables of the language defined by this
Package shall not be considered part of this Package, but are the
equivalent of input as in Paragraph 6, provided these subroutines do
not change the language in any way that would cause it to fail the
regression tests for the language.
8. Aggregation of this Package with a commercial distribution is always
permitted provided that the use of this Package is embedded; that is,
when no overt attempt is made to make this Package's interfaces visible
to the end user of the commercial distribution. Such use shall not be
construed as a distribution of this Package.
9. The name of the Copyright Holder may not be used to endorse or promote
products derived from this software without specific prior written permission.
10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
The End

View file

@ -1,250 +0,0 @@
GNU GENERAL PUBLIC LICENSE
Version 1, February 1989
Copyright (C) 1989 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The license agreements of most software companies try to keep users
at the mercy of those companies. By contrast, our General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. The
General Public License applies to the Free Software Foundation's
software and to any other program whose authors commit to using it.
You can use it for your programs, too.
When we speak of free software, we are referring to freedom, not
price. Specifically, the General Public License is designed to make
sure that you have the freedom to give away or sell copies of free
software, that you receive source code or can get it if you want it,
that you can change the software or use pieces of it in new free
programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of a such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must tell them their rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any program or other work which
contains a notice placed by the copyright holder saying it may be
distributed under the terms of this General Public License. The
"Program", below, refers to any such program or work, and a "work based
on the Program" means either the Program or any work containing the
Program or a portion of it, either verbatim or with modifications. Each
licensee is addressed as "you".
1. You may copy and distribute verbatim copies of the Program's source
code as you receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice and
disclaimer of warranty; keep intact all the notices that refer to this
General Public License and to the absence of any warranty; and give any
other recipients of the Program a copy of this General Public License
along with the Program. You may charge a fee for the physical act of
transferring a copy.
2. You may modify your copy or copies of the Program or any portion of
it, and copy and distribute such modifications under the terms of Paragraph
1 above, provided that you also do the following:
a) cause the modified files to carry prominent notices stating that
you changed the files and the date of any change; and
b) cause the whole of any work that you distribute or publish, that
in whole or in part contains the Program or any part thereof, either
with or without modifications, to be licensed at no charge to all
third parties under the terms of this General Public License (except
that you may choose to grant warranty protection to some or all
third parties, at your option).
c) If the modified program normally reads commands interactively when
run, you must cause it, when started running for such interactive use
in the simplest and most usual way, to print or display an
announcement including an appropriate copyright notice and a notice
that there is no warranty (or else, saying that you provide a
warranty) and that users may redistribute the program under these
conditions, and telling the user how to view a copy of this General
Public License.
d) You may charge a fee for the physical act of transferring a
copy, and you may at your option offer warranty protection in
exchange for a fee.
Mere aggregation of another independent work with the Program (or its
derivative) on a volume of a storage or distribution medium does not bring
the other work under the scope of these terms.
3. You may copy and distribute the Program (or a portion or derivative of
it, under Paragraph 2) in object code or executable form under the terms of
Paragraphs 1 and 2 above provided that you also do one of the following:
a) accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of
Paragraphs 1 and 2 above; or,
b) accompany it with a written offer, valid for at least three
years, to give any third party free (except for a nominal charge
for the cost of distribution) a complete machine-readable copy of the
corresponding source code, to be distributed under the terms of
Paragraphs 1 and 2 above; or,
c) accompany it with the information you received as to where the
corresponding source code may be obtained. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form alone.)
Source code for a work means the preferred form of the work for making
modifications to it. For an executable file, complete source code means
all the source code for all modules it contains; but, as a special
exception, it need not include source code for modules which are standard
libraries that accompany the operating system on which the executable
file runs, or for standard header files or definitions files that
accompany that operating system.
4. You may not copy, modify, sublicense, distribute or transfer the
Program except as expressly provided under this General Public License.
Any attempt otherwise to copy, modify, sublicense, distribute or transfer
the Program is void, and will automatically terminate your rights to use
the Program under this License. However, parties who have received
copies, or rights to use copies, from you under this General Public
License will not have their licenses terminated so long as such parties
remain in full compliance.
5. By copying, distributing or modifying the Program (or any work based
on the Program) you indicate your acceptance of this license to do so,
and all its terms and conditions.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the original
licensor to copy, distribute or modify the Program subject to these
terms and conditions. You may not impose any further restrictions on the
recipients' exercise of the rights granted herein.
7. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of the license which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
the license, you may choose any version ever published by the Free Software
Foundation.
8. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to humanity, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.
To do so, attach the following notices to the program. It is safest to
attach them to the start of each source file to most effectively convey
the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) 19yy <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 1, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) 19xx name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the
appropriate parts of the General Public License. Of course, the
commands you use may be called something other than `show w' and `show
c'; they could even be mouse-clicks or menu items--whatever suits your
program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
program `Gnomovision' (a program to direct compilers to make passes
at assemblers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
That's all there is to it!

View file

@ -1,35 +0,0 @@
Revision history for Perl NTLM authentication suite
1.09 8 Sep 2011
- fix CPAN ticket # 70703
1.08 6 Apr 2011
- fix CPAN ticket # 39925
1.07 - not released
1.06 24 Mar 2011
- relicense as GPL+ or Artistic
1.05 19 Jun 2008
- implement OO interface - thanks to Dmitry Karasik <dmitry@karasik.eu.org>
- fix minor bug in last release - thanks to Dmitry Karasik <dmitry@karasik.eu.org>
1.04 29 May 2008
- implement NTLMv2 - thanks to Andrew Hobson <ahobson@infloop.com>
1.03 Thur Aug 09 09:13:00 2007
- fixes bug from 2001 - http://rt.cpan.org/Public/Bug/Display.html?id=9521
- fixes minor doco bug also reported in same place.
1.02 Mon Oct 29 19:01:00 2001
- fixed package names due to a source code mixup!
- added a test suite
1.01 Sun Oct 28 11:01:00 2001
- added ntlm_domain() to set initial domain
- added ntlm_reset() to reset state machine for multiple use
- added fuller documentation
1.00 Sat Oct 27 13:31:53 2001
- original version;

View file

@ -1,294 +0,0 @@
#!/usr/local/bin/perl
#
# This is an implementation of part of the DES specification. According
# to the code this is ported from, this code does NOT enable 2-way
# encryption and is, hence, not a cypher and does not appear to come
# under any export restrictions on such.
#
package Authen::NTLM::DES;
use vars qw($VERSION @ISA @EXPORT);
require Exporter;
$VERSION = "1.02";
@ISA = qw(Exporter);
@EXPORT = qw(E_P16 E_P24);
my ($loop, $loop2);
$loop = 0;
$loop2 = 0;
my $perm1 = [57, 49, 41, 33, 25, 17, 9,
1, 58, 50, 42, 34, 26, 18,
10, 2, 59, 51, 43, 35, 27,
19, 11, 3, 60, 52, 44, 36,
63, 55, 47, 39, 31, 23, 15,
7, 62, 54, 46, 38, 30, 22,
14, 6, 61, 53, 45, 37, 29,
21, 13, 5, 28, 20, 12, 4];
my $perm2 = [14, 17, 11, 24, 1, 5,
3, 28, 15, 6, 21, 10,
23, 19, 12, 4, 26, 8,
16, 7, 27, 20, 13, 2,
41, 52, 31, 37, 47, 55,
30, 40, 51, 45, 33, 48,
44, 49, 39, 56, 34, 53,
46, 42, 50, 36, 29, 32];
my $perm3 = [58, 50, 42, 34, 26, 18, 10, 2,
60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14, 6,
64, 56, 48, 40, 32, 24, 16, 8,
57, 49, 41, 33, 25, 17, 9, 1,
59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5,
63, 55, 47, 39, 31, 23, 15, 7];
my $perm4 = [32, 1, 2, 3, 4, 5,
4, 5, 6, 7, 8, 9,
8, 9, 10, 11, 12, 13,
12, 13, 14, 15, 16, 17,
16, 17, 18, 19, 20, 21,
20, 21, 22, 23, 24, 25,
24, 25, 26, 27, 28, 29,
28, 29, 30, 31, 32, 1];
my $perm5 = [16, 7, 20, 21, 29, 12, 28, 17,
1, 15, 23, 26, 5, 18, 31, 10,
2, 8, 24, 14, 32, 27, 3, 9,
19, 13, 30, 6, 22, 11, 4, 25];
my $perm6 = [40, 8, 48, 16, 56, 24, 64, 32,
39, 7, 47, 15, 55, 23, 63, 31,
38, 6, 46, 14, 54, 22, 62, 30,
37, 5, 45, 13, 53, 21, 61, 29,
36, 4, 44, 12, 52, 20, 60, 28,
35, 3, 43, 11, 51, 19, 59, 27,
34, 2, 42, 10, 50, 18, 58, 26,
33, 1, 41, 9, 49, 17, 57, 25];
my $sc = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1];
my $sbox = [
[
[14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7],
[0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8],
[4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0],
[15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13]
],
[
[15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10],
[3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5],
[0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15],
[13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9]
],
[
[10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8],
[13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1],
[13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7],
[1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12]
],
[
[7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15],
[13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9],
[10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4],
[3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14]
],
[
[2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9],
[14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6],
[4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14],
[11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3]
],
[
[12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11],
[10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8],
[9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6],
[4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13]
],
[
[4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1],
[13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6],
[1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2],
[6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12]
],
[
[13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7],
[1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2],
[7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8],
[2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11]
]
];
sub E_P16
{
my ($p14) = @_;
my $sp8 = [0x4b, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25];
my $p7 = substr($p14, 0, 7);
my $p16 = smbhash($sp8, $p7);
$p7 = substr($p14, 7, 7);
$p16 .= smbhash($sp8, $p7);
return $p16;
}
sub E_P24
{
my ($p21, $c8_str) = @_;
my @c8 = map {ord($_)} split(//, $c8_str);
my $p24 = smbhash(\@c8, substr($p21, 0, 7));
$p24 .= smbhash(\@c8, substr($p21, 7, 7));
$p24 .= smbhash(\@c8, substr($p21, 14, 7));
}
sub permute
{
my ($out, $in, $p, $n) = @_;
my $i;
foreach $i (0..($n-1))
{
$out->[$i] = $in->[$p->[$i]-1];
}
}
sub lshift
{
my ($d, $count, $n) = @_;
my (@out, $i);
foreach $i (0..($n-1))
{
$out[$i] = $d->[($i+$count)%$n];
}
foreach $i (0..($n-1))
{
$d->[$i] = $out[$i];
}
}
sub xor
{
my ($out, $in1, $in2, $n) = @_;
my $i;
foreach $i (0..($n-1))
{
$out->[$i] = $in1->[$i]^$in2->[$i];
}
}
sub dohash
{
my ($out, $in, $key) = @_;
my ($i, $j, $k, @pk1, @c, @d, @cd,
@ki, @pd1, @l, @r, @rl);
&permute(\@pk1, $key, $perm1, 56);
foreach $i (0..27)
{
$c[$i] = $pk1[$i];
$d[$i] = $pk1[$i+28];
}
foreach $i (0..15)
{
my @array;
&lshift(\@c, $sc->[$i], 28);
&lshift(\@d, $sc->[$i], 28);
@cd = (@c, @d);
&permute(\@array, \@cd, $perm2, 48);
$ki[$i] = \@array;
}
&permute(\@pd1, $in, $perm3, 64);
foreach $j (0..31)
{
$l[$j] = $pd1[$j];
$r[$j] = $pd1[$j+32];
}
foreach $i (0..15)
{
local (@er, @erk, @b, @cb, @pcb, @r2);
permute(\@er, \@r, $perm4, 48);
&xor(\@erk, \@er, $ki[$i], 48);
foreach $j (0..7)
{
foreach $k (0..5)
{
$b[$j][$k] = $erk[$j*6+$k];
}
}
foreach $j (0..7)
{
local ($m, $n);
$m = ($b[$j][0]<<1) | $b[$j][5];
$n = ($b[$j][1]<<3) | ($b[$j][2]<<2) | ($b[$j][3]<<1) | $b[$j][4];
foreach $k (0..3)
{
$b[$j][$k] = ($sbox->[$j][$m][$n] & (1<<(3-$k)))? 1: 0;
}
}
foreach $j (0..7)
{
foreach $k (0..3)
{
$cb[$j*4+$k] = $b[$j][$k];
}
}
&permute(\@pcb, \@cb, $perm5, 32);
&xor(\@r2, \@l, \@pcb, 32);
foreach $j (0..31)
{
$l[$j] = $r[$j];
$r[$j] = $r2[$j];
}
}
@rl = (@r, @l);
&permute($out, \@rl, $perm6, 64);
}
sub str_to_key
{
my ($str) = @_;
my $i;
my @key;
my $out;
my @str = map {ord($_)} split(//, $str);
$key[0] = $str[0]>>1;
$key[1] = (($str[0]&0x01)<<6) | ($str[1]>>2);
$key[2] = (($str[1]&0x03)<<5) | ($str[2]>>3);
$key[3] = (($str[2]&0x07)<<4) | ($str[3]>>4);
$key[4] = (($str[3]&0x0f)<<3) | ($str[4]>>5);
$key[5] = (($str[4]&0x1f)<<2) | ($str[5]>>6);
$key[6] = (($str[5]&0x3f)<<1) | ($str[6]>>7);
$key[7] = $str[6]&0x7f;
foreach $i (0..7)
{
$key[$i] = 0xff&($key[$i]<<1);
}
return \@key;
}
sub smbhash
{
my ($in, $key) = @_;
my $key2 = &str_to_key($key);
my ($i, $div, $mod, @in, @outb, @inb, @keyb, @out);
foreach $i (0..63)
{
$div = int($i/8); $mod = $i%8;
$inb[$i] = ($in->[$div] & (1<<(7-($mod))))? 1: 0;
$keyb[$i] = ($key2->[$div] & (1<<(7-($mod))))? 1: 0;
$outb[$i] = 0;
}
&dohash(\@outb, \@inb, \@keyb);
foreach $i (0..7)
{
$out[$i] = 0;
}
foreach $i (0..63)
{
$out[int($i/8)] |= (1<<(7-($i%8))) if ($outb[$i]);
}
my $out = pack("C8", @out);
return $out;
}
1;

View file

@ -1,599 +0,0 @@
# This Makefile is for the Authen::NTLM::DES extension to perl.
#
# It was generated automatically by MakeMaker version
# 6.55_02 (Revision: 65502) from the contents of
# Makefile.PL. Don't edit this file, edit Makefile.PL instead.
#
# ANY CHANGES MADE HERE WILL BE LOST!
#
# MakeMaker ARGV: ()
#
# MakeMaker Parameters:
# AUTHOR => q[David (Buzz) Bussenschutt <davidbuzz@gmail.com>, Mark Bush <Mark.Bush@bushnet.demon.co.uk>]
# BUILD_REQUIRES => { }
# NAME => q[Authen::NTLM::DES]
# PREREQ_PM => { }
# VERSION_FROM => q[DES.pm]
# --- MakeMaker post_initialize section:
# --- MakeMaker const_config section:
# These definitions are from config.sh (via /usr/lib/perl/5.10/Config.pm).
# They may have been overridden via Makefile.PL or on the command line.
AR = ar
CC = cc
CCCDLFLAGS = -fPIC
CCDLFLAGS = -Wl,-E
DLEXT = so
DLSRC = dl_dlopen.xs
EXE_EXT =
FULL_AR = /usr/bin/ar
LD = cc
LDDLFLAGS = -shared -O2 -g -L/usr/local/lib -fstack-protector
LDFLAGS = -fstack-protector -L/usr/local/lib
LIBC = /lib/libc-2.11.1.so
LIB_EXT = .a
OBJ_EXT = .o
OSNAME = linux
OSVERS = 2.6.24-28-server
RANLIB = :
SITELIBEXP = /usr/local/share/perl/5.10.1
SITEARCHEXP = /usr/local/lib/perl/5.10.1
SO = so
VENDORARCHEXP = /usr/lib/perl5
VENDORLIBEXP = /usr/share/perl5
# --- MakeMaker constants section:
AR_STATIC_ARGS = cr
DIRFILESEP = /
DFSEP = $(DIRFILESEP)
NAME = Authen::NTLM::DES
NAME_SYM = Authen_NTLM_DES
VERSION = 1.02
VERSION_MACRO = VERSION
VERSION_SYM = 1_02
DEFINE_VERSION = -D$(VERSION_MACRO)=\"$(VERSION)\"
XS_VERSION = 1.02
XS_VERSION_MACRO = XS_VERSION
XS_DEFINE_VERSION = -D$(XS_VERSION_MACRO)=\"$(XS_VERSION)\"
INST_ARCHLIB = ../blib/arch
INST_SCRIPT = ../blib/script
INST_BIN = ../blib/bin
INST_LIB = ../blib/lib
INST_MAN1DIR = ../blib/man1
INST_MAN3DIR = ../blib/man3
MAN1EXT = 1p
MAN3EXT = 3pm
INSTALLDIRS = site
DESTDIR =
PREFIX = /usr
PERLPREFIX = $(PREFIX)
SITEPREFIX = $(PREFIX)/local
VENDORPREFIX = $(PREFIX)
INSTALLPRIVLIB = $(PERLPREFIX)/share/perl/5.10
DESTINSTALLPRIVLIB = $(DESTDIR)$(INSTALLPRIVLIB)
INSTALLSITELIB = $(SITEPREFIX)/share/perl/5.10.1
DESTINSTALLSITELIB = $(DESTDIR)$(INSTALLSITELIB)
INSTALLVENDORLIB = $(VENDORPREFIX)/share/perl5
DESTINSTALLVENDORLIB = $(DESTDIR)$(INSTALLVENDORLIB)
INSTALLARCHLIB = $(PERLPREFIX)/lib/perl/5.10
DESTINSTALLARCHLIB = $(DESTDIR)$(INSTALLARCHLIB)
INSTALLSITEARCH = $(SITEPREFIX)/lib/perl/5.10.1
DESTINSTALLSITEARCH = $(DESTDIR)$(INSTALLSITEARCH)
INSTALLVENDORARCH = $(VENDORPREFIX)/lib/perl5
DESTINSTALLVENDORARCH = $(DESTDIR)$(INSTALLVENDORARCH)
INSTALLBIN = $(PERLPREFIX)/bin
DESTINSTALLBIN = $(DESTDIR)$(INSTALLBIN)
INSTALLSITEBIN = $(SITEPREFIX)/bin
DESTINSTALLSITEBIN = $(DESTDIR)$(INSTALLSITEBIN)
INSTALLVENDORBIN = $(VENDORPREFIX)/bin
DESTINSTALLVENDORBIN = $(DESTDIR)$(INSTALLVENDORBIN)
INSTALLSCRIPT = $(PERLPREFIX)/bin
DESTINSTALLSCRIPT = $(DESTDIR)$(INSTALLSCRIPT)
INSTALLSITESCRIPT = $(SITEPREFIX)/bin
DESTINSTALLSITESCRIPT = $(DESTDIR)$(INSTALLSITESCRIPT)
INSTALLVENDORSCRIPT = $(VENDORPREFIX)/bin
DESTINSTALLVENDORSCRIPT = $(DESTDIR)$(INSTALLVENDORSCRIPT)
INSTALLMAN1DIR = $(PERLPREFIX)/share/man/man1
DESTINSTALLMAN1DIR = $(DESTDIR)$(INSTALLMAN1DIR)
INSTALLSITEMAN1DIR = $(SITEPREFIX)/man/man1
DESTINSTALLSITEMAN1DIR = $(DESTDIR)$(INSTALLSITEMAN1DIR)
INSTALLVENDORMAN1DIR = $(VENDORPREFIX)/share/man/man1
DESTINSTALLVENDORMAN1DIR = $(DESTDIR)$(INSTALLVENDORMAN1DIR)
INSTALLMAN3DIR = $(PERLPREFIX)/share/man/man3
DESTINSTALLMAN3DIR = $(DESTDIR)$(INSTALLMAN3DIR)
INSTALLSITEMAN3DIR = $(SITEPREFIX)/man/man3
DESTINSTALLSITEMAN3DIR = $(DESTDIR)$(INSTALLSITEMAN3DIR)
INSTALLVENDORMAN3DIR = $(VENDORPREFIX)/share/man/man3
DESTINSTALLVENDORMAN3DIR = $(DESTDIR)$(INSTALLVENDORMAN3DIR)
PERL_LIB = /usr/share/perl/5.10
PERL_ARCHLIB = /usr/lib/perl/5.10
LIBPERL_A = libperl.a
FIRST_MAKEFILE = Makefile
MAKEFILE_OLD = Makefile.old
MAKE_APERL_FILE = Makefile.aperl
PERLMAINCC = $(CC)
PERL_INC = /usr/lib/perl/5.10/CORE
PERL = /usr/bin/perl
FULLPERL = /usr/bin/perl
ABSPERL = $(PERL)
PERLRUN = $(PERL)
FULLPERLRUN = $(FULLPERL)
ABSPERLRUN = $(ABSPERL)
PERLRUNINST = $(PERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"
FULLPERLRUNINST = $(FULLPERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"
ABSPERLRUNINST = $(ABSPERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"
PERL_CORE = 0
PERM_DIR = 755
PERM_RW = 644
PERM_RWX = 755
MAKEMAKER = /usr/share/perl/5.10/ExtUtils/MakeMaker.pm
MM_VERSION = 6.55_02
MM_REVISION = 65502
# FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
# DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
MAKE = make
FULLEXT = Authen/NTLM/DES
BASEEXT = DES
PARENT_NAME = Authen::NTLM
DLBASE = $(BASEEXT)
VERSION_FROM = DES.pm
OBJECT =
LDFROM = $(OBJECT)
LINKTYPE = dynamic
BOOTDEP =
# Handy lists of source code files:
XS_FILES =
C_FILES =
O_FILES =
H_FILES =
MAN1PODS =
MAN3PODS =
# Where is the Config information that we are using/depend on
CONFIGDEP = $(PERL_ARCHLIB)$(DFSEP)Config.pm $(PERL_INC)$(DFSEP)config.h
# Where to build things
INST_LIBDIR = $(INST_LIB)/Authen/NTLM
INST_ARCHLIBDIR = $(INST_ARCHLIB)/Authen/NTLM
INST_AUTODIR = $(INST_LIB)/auto/$(FULLEXT)
INST_ARCHAUTODIR = $(INST_ARCHLIB)/auto/$(FULLEXT)
INST_STATIC =
INST_DYNAMIC =
INST_BOOT =
# Extra linker info
EXPORT_LIST =
PERL_ARCHIVE =
PERL_ARCHIVE_AFTER =
TO_INST_PM = DES.pm
PM_TO_BLIB = DES.pm \
$(INST_LIB)/Authen/NTLM/DES.pm
# --- MakeMaker platform_constants section:
MM_Unix_VERSION = 6.55_02
PERL_MALLOC_DEF = -DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc -Dfree=Perl_mfree -Drealloc=Perl_realloc -Dcalloc=Perl_calloc
# --- MakeMaker tool_autosplit section:
# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
AUTOSPLITFILE = $(ABSPERLRUN) -e 'use AutoSplit; autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1)' --
# --- MakeMaker tool_xsubpp section:
# --- MakeMaker tools_other section:
SHELL = /bin/sh
CHMOD = chmod
CP = cp
MV = mv
NOOP = $(TRUE)
NOECHO = @
RM_F = rm -f
RM_RF = rm -rf
TEST_F = test -f
TOUCH = touch
UMASK_NULL = umask 0
DEV_NULL = > /dev/null 2>&1
MKPATH = $(ABSPERLRUN) -MExtUtils::Command -e 'mkpath' --
EQUALIZE_TIMESTAMP = $(ABSPERLRUN) -MExtUtils::Command -e 'eqtime' --
FALSE = false
TRUE = true
ECHO = echo
ECHO_N = echo -n
UNINST = 0
VERBINST = 0
MOD_INSTALL = $(ABSPERLRUN) -MExtUtils::Install -e 'install([ from_to => {@ARGV}, verbose => '\''$(VERBINST)'\'', uninstall_shadows => '\''$(UNINST)'\'', dir_mode => '\''$(PERM_DIR)'\'' ]);' --
DOC_INSTALL = $(ABSPERLRUN) -MExtUtils::Command::MM -e 'perllocal_install' --
UNINSTALL = $(ABSPERLRUN) -MExtUtils::Command::MM -e 'uninstall' --
WARN_IF_OLD_PACKLIST = $(ABSPERLRUN) -MExtUtils::Command::MM -e 'warn_if_old_packlist' --
MACROSTART =
MACROEND =
USEMAKEFILE = -f
FIXIN = $(ABSPERLRUN) -MExtUtils::MY -e 'MY->fixin(shift)' --
# --- MakeMaker makemakerdflt section:
makemakerdflt : all
$(NOECHO) $(NOOP)
# --- MakeMaker dist section skipped.
# --- MakeMaker macro section:
# --- MakeMaker depend section:
# --- MakeMaker cflags section:
# --- MakeMaker const_loadlibs section:
# --- MakeMaker const_cccmd section:
# --- MakeMaker post_constants section:
# --- MakeMaker pasthru section:
PASTHRU = LIBPERL_A="$(LIBPERL_A)"\
LINKTYPE="$(LINKTYPE)"\
PREFIX="$(PREFIX)"
# --- MakeMaker special_targets section:
.SUFFIXES : .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT)
.PHONY: all config static dynamic test linkext manifest blibdirs clean realclean disttest distdir
# --- MakeMaker c_o section:
# --- MakeMaker xs_c section:
# --- MakeMaker xs_o section:
# --- MakeMaker top_targets section:
all :: pure_all manifypods
$(NOECHO) $(NOOP)
pure_all :: config pm_to_blib subdirs linkext
$(NOECHO) $(NOOP)
subdirs :: $(MYEXTLIB)
$(NOECHO) $(NOOP)
config :: $(FIRST_MAKEFILE) blibdirs
$(NOECHO) $(NOOP)
help :
perldoc ExtUtils::MakeMaker
# --- MakeMaker blibdirs section:
blibdirs : $(INST_LIBDIR)$(DFSEP).exists $(INST_ARCHLIB)$(DFSEP).exists $(INST_AUTODIR)$(DFSEP).exists $(INST_ARCHAUTODIR)$(DFSEP).exists $(INST_BIN)$(DFSEP).exists $(INST_SCRIPT)$(DFSEP).exists $(INST_MAN1DIR)$(DFSEP).exists $(INST_MAN3DIR)$(DFSEP).exists
$(NOECHO) $(NOOP)
# Backwards compat with 6.18 through 6.25
blibdirs.ts : blibdirs
$(NOECHO) $(NOOP)
$(INST_LIBDIR)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_LIBDIR)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_LIBDIR)
$(NOECHO) $(TOUCH) $(INST_LIBDIR)$(DFSEP).exists
$(INST_ARCHLIB)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_ARCHLIB)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_ARCHLIB)
$(NOECHO) $(TOUCH) $(INST_ARCHLIB)$(DFSEP).exists
$(INST_AUTODIR)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_AUTODIR)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_AUTODIR)
$(NOECHO) $(TOUCH) $(INST_AUTODIR)$(DFSEP).exists
$(INST_ARCHAUTODIR)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_ARCHAUTODIR)
$(NOECHO) $(TOUCH) $(INST_ARCHAUTODIR)$(DFSEP).exists
$(INST_BIN)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_BIN)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_BIN)
$(NOECHO) $(TOUCH) $(INST_BIN)$(DFSEP).exists
$(INST_SCRIPT)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_SCRIPT)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_SCRIPT)
$(NOECHO) $(TOUCH) $(INST_SCRIPT)$(DFSEP).exists
$(INST_MAN1DIR)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_MAN1DIR)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_MAN1DIR)
$(NOECHO) $(TOUCH) $(INST_MAN1DIR)$(DFSEP).exists
$(INST_MAN3DIR)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_MAN3DIR)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_MAN3DIR)
$(NOECHO) $(TOUCH) $(INST_MAN3DIR)$(DFSEP).exists
# --- MakeMaker linkext section:
linkext :: $(LINKTYPE)
$(NOECHO) $(NOOP)
# --- MakeMaker dlsyms section:
# --- MakeMaker dynamic section:
dynamic :: $(FIRST_MAKEFILE) $(INST_DYNAMIC) $(INST_BOOT)
$(NOECHO) $(NOOP)
# --- MakeMaker dynamic_bs section:
BOOTSTRAP =
# --- MakeMaker dynamic_lib section:
# --- MakeMaker static section:
## $(INST_PM) has been moved to the all: target.
## It remains here for awhile to allow for old usage: "make static"
static :: $(FIRST_MAKEFILE) $(INST_STATIC)
$(NOECHO) $(NOOP)
# --- MakeMaker static_lib section:
# --- MakeMaker manifypods section:
POD2MAN_EXE = $(PERLRUN) "-MExtUtils::Command::MM" -e pod2man "--"
POD2MAN = $(POD2MAN_EXE)
manifypods : pure_all
$(NOECHO) $(NOOP)
# --- MakeMaker processPL section:
# --- MakeMaker installbin section:
# --- MakeMaker subdirs section:
# none
# --- MakeMaker clean_subdirs section:
clean_subdirs :
$(NOECHO) $(NOOP)
# --- MakeMaker clean section:
# Delete temporary files but do not touch installed files. We don't delete
# the Makefile here so a later make realclean still has a makefile to use.
clean :: clean_subdirs
- $(RM_F) \
*$(LIB_EXT) core \
core.[0-9] $(INST_ARCHAUTODIR)/extralibs.all \
core.[0-9][0-9] $(BASEEXT).bso \
pm_to_blib.ts core.[0-9][0-9][0-9][0-9] \
$(BASEEXT).x $(BOOTSTRAP) \
perl$(EXE_EXT) tmon.out \
*$(OBJ_EXT) pm_to_blib \
$(INST_ARCHAUTODIR)/extralibs.ld blibdirs.ts \
core.[0-9][0-9][0-9][0-9][0-9] *perl.core \
core.*perl.*.? $(MAKE_APERL_FILE) \
perl $(BASEEXT).def \
core.[0-9][0-9][0-9] mon.out \
lib$(BASEEXT).def perlmain.c \
perl.exe so_locations \
$(BASEEXT).exp
- $(RM_RF) \
blib
- $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) $(DEV_NULL)
# --- MakeMaker realclean_subdirs section:
realclean_subdirs :
$(NOECHO) $(NOOP)
# --- MakeMaker realclean section:
# Delete temporary files (via clean) and also delete dist files
realclean purge :: clean realclean_subdirs
- $(RM_F) \
$(MAKEFILE_OLD) $(FIRST_MAKEFILE)
- $(RM_RF) \
$(DISTVNAME)
# --- MakeMaker metafile section:
metafile : create_distdir
$(NOECHO) $(ECHO) Generating META.yml
$(NOECHO) $(ECHO) '--- #YAML:1.0' > META_new.yml
$(NOECHO) $(ECHO) 'name: Authen-NTLM-DES' >> META_new.yml
$(NOECHO) $(ECHO) 'version: 1.02' >> META_new.yml
$(NOECHO) $(ECHO) 'abstract: ~' >> META_new.yml
$(NOECHO) $(ECHO) 'author:' >> META_new.yml
$(NOECHO) $(ECHO) ' - David (Buzz) Bussenschutt <davidbuzz@gmail.com>, Mark Bush <Mark.Bush@bushnet.demon.co.uk>' >> META_new.yml
$(NOECHO) $(ECHO) 'license: unknown' >> META_new.yml
$(NOECHO) $(ECHO) 'distribution_type: module' >> META_new.yml
$(NOECHO) $(ECHO) 'configure_requires:' >> META_new.yml
$(NOECHO) $(ECHO) ' ExtUtils::MakeMaker: 0' >> META_new.yml
$(NOECHO) $(ECHO) 'build_requires:' >> META_new.yml
$(NOECHO) $(ECHO) ' ExtUtils::MakeMaker: 0' >> META_new.yml
$(NOECHO) $(ECHO) 'requires: {}' >> META_new.yml
$(NOECHO) $(ECHO) 'no_index:' >> META_new.yml
$(NOECHO) $(ECHO) ' directory:' >> META_new.yml
$(NOECHO) $(ECHO) ' - t' >> META_new.yml
$(NOECHO) $(ECHO) ' - inc' >> META_new.yml
$(NOECHO) $(ECHO) 'generated_by: ExtUtils::MakeMaker version 6.55_02' >> META_new.yml
$(NOECHO) $(ECHO) 'meta-spec:' >> META_new.yml
$(NOECHO) $(ECHO) ' url: http://module-build.sourceforge.net/META-spec-v1.4.html' >> META_new.yml
$(NOECHO) $(ECHO) ' version: 1.4' >> META_new.yml
-$(NOECHO) $(MV) META_new.yml $(DISTVNAME)/META.yml
# --- MakeMaker signature section:
signature :
cpansign -s
# --- MakeMaker dist_basics section skipped.
# --- MakeMaker dist_core section skipped.
# --- MakeMaker distdir section skipped.
# --- MakeMaker dist_test section skipped.
# --- MakeMaker dist_ci section skipped.
# --- MakeMaker distmeta section:
distmeta : create_distdir metafile
$(NOECHO) cd $(DISTVNAME) && $(ABSPERLRUN) -MExtUtils::Manifest=maniadd -e 'eval { maniadd({q{META.yml} => q{Module meta-data (added by MakeMaker)}}) } ' \
-e ' or print "Could not add META.yml to MANIFEST: $${'\''@'\''}\n"' --
# --- MakeMaker distsignature section:
distsignature : create_distdir
$(NOECHO) cd $(DISTVNAME) && $(ABSPERLRUN) -MExtUtils::Manifest=maniadd -e 'eval { maniadd({q{SIGNATURE} => q{Public-key signature (added by MakeMaker)}}) } ' \
-e ' or print "Could not add SIGNATURE to MANIFEST: $${'\''@'\''}\n"' --
$(NOECHO) cd $(DISTVNAME) && $(TOUCH) SIGNATURE
cd $(DISTVNAME) && cpansign -s
# --- MakeMaker install section skipped.
# --- MakeMaker force section:
# Phony target to force checking subdirectories.
FORCE :
$(NOECHO) $(NOOP)
# --- MakeMaker perldepend section:
# --- MakeMaker makefile section:
# We take a very conservative approach here, but it's worth it.
# We move Makefile to Makefile.old here to avoid gnu make looping.
$(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP)
$(NOECHO) $(ECHO) "Makefile out-of-date with respect to $?"
$(NOECHO) $(ECHO) "Cleaning current config before rebuilding Makefile..."
-$(NOECHO) $(RM_F) $(MAKEFILE_OLD)
-$(NOECHO) $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD)
- $(MAKE) $(USEMAKEFILE) $(MAKEFILE_OLD) clean $(DEV_NULL)
$(PERLRUN) Makefile.PL
$(NOECHO) $(ECHO) "==> Your Makefile has been rebuilt. <=="
$(NOECHO) $(ECHO) "==> Please rerun the $(MAKE) command. <=="
$(FALSE)
# --- MakeMaker staticmake section:
# --- MakeMaker makeaperl section ---
MAP_TARGET = ../perl
FULLPERL = /usr/bin/perl
# --- MakeMaker test section:
TEST_VERBOSE=0
TEST_TYPE=test_$(LINKTYPE)
TEST_FILE = test.pl
TEST_FILES =
TESTDB_SW = -d
testdb :: testdb_$(LINKTYPE)
test :: $(TEST_TYPE) subdirs-test
subdirs-test ::
$(NOECHO) $(NOOP)
$(NOECHO) $(ECHO) 'No tests defined for $(NAME) extension.'
test_dynamic :: pure_all
testdb_dynamic :: pure_all
PERL_DL_NONLAZY=1 $(FULLPERLRUN) $(TESTDB_SW) "-I$(INST_LIB)" "-I$(INST_ARCHLIB)" $(TEST_FILE)
test_ : test_dynamic
test_static :: test_dynamic
testdb_static :: testdb_dynamic
# --- MakeMaker ppd section:
# Creates a PPD (Perl Package Description) for a binary distribution.
ppd :
$(NOECHO) $(ECHO) '<SOFTPKG NAME="$(DISTNAME)" VERSION="1.02">' > $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' <ABSTRACT></ABSTRACT>' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' <AUTHOR>David (Buzz) Bussenschutt &lt;davidbuzz@gmail.com&gt;, Mark Bush &lt;Mark.Bush@bushnet.demon.co.uk&gt;</AUTHOR>' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' <IMPLEMENTATION>' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' <ARCHITECTURE NAME="i486-linux-gnu-thread-multi-5.10" />' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' <CODEBASE HREF="" />' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' </IMPLEMENTATION>' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) '</SOFTPKG>' >> $(DISTNAME).ppd
# --- MakeMaker pm_to_blib section:
pm_to_blib : $(FIRST_MAKEFILE) $(TO_INST_PM)
$(NOECHO) $(ABSPERLRUN) -MExtUtils::Install -e 'pm_to_blib({@ARGV}, '\''$(INST_LIB)/auto'\'', q[$(PM_FILTER)], '\''$(PERM_DIR)'\'')' -- \
DES.pm $(INST_LIB)/Authen/NTLM/DES.pm
$(NOECHO) $(TOUCH) pm_to_blib
# --- MakeMaker selfdocument section:
# --- MakeMaker postamble section:
# End.

View file

@ -1,12 +0,0 @@
#!/usr/bin/perl
use ExtUtils::MakeMaker;
#
WriteMakefile(
'NAME' => 'Authen::NTLM::DES',
'VERSION_FROM' => 'DES.pm',
($] >= 5.005 ? ## Add these new keywords supported since 5.005
('AUTHOR' => 'David (Buzz) Bussenschutt <davidbuzz@gmail.com>, Mark Bush <Mark.Bush@bushnet.demon.co.uk>') : ()),
);

View file

@ -1,15 +0,0 @@
Changes
Makefile.PL
MANIFEST
README
NTLM.pm
DES/DES.pm
DES/Makefile.PL
MD4/MD4.pm
MD4/Makefile.PL
t/01_load.t
t/02_ntlm.t
t/03_oo.t
t/04_v2.t
t/99_pod.t
META.yml Module meta-data (added by MakeMaker)

View file

@ -1,197 +0,0 @@
#!/usr/local/bin/perl
#
# This is a partial implentation of the MD4 checksum code.
#
# NOTE
#
# The function &add() in this module is required as we need to be
# able to add 32bit integers ignoring overflow. The C code this is
# based on does this because it uses the underlying hardware to
# perform the required addition however we need to be more careful
# as Perl will overflow an int and produce a result of 0xffffffff
# which is not very useful. The &add() function splits its arguments
# into two shorts and adds these carrying overflow from the low short
# to the high short and ignoring carry from the high short. Not
# exactly efficient, but it works and is fast enough for the purposes
# of this implementation
#
package Authen::NTLM::MD4;
use vars qw($VERSION @ISA @EXPORT);
require Exporter;
$VERSION = "1.02";
@ISA = qw(Exporter);
@EXPORT = qw(mdfour);
my ($A, $B, $C, $D);
my (@X, $M);
sub mdfour
{
my ($in) = @_;
my ($i, $pos);
my $len = length($in);
my $b = $len * 8;
$in .= "\0"x128;
$A = 0x67452301;
$B = 0xefcdab89;
$C = 0x98badcfe;
$D = 0x10325476;
$pos = 0;
while ($len > 64)
{
&copy64(substr($in, $pos, 64));
&mdfour64;
$pos += 64;
$len -= 64;
}
my $buf = substr($in, $pos, $len);
$buf .= sprintf "%c", 0x80;
if ($len <= 55)
{
$buf .= "\0"x(55-$len);
$buf .= pack("V", $b);
$buf .= "\0"x4;
&copy64($buf);
&mdfour64;
}
else
{
$buf .= "\0"x(120-$len);
$buf .= pack("V", $b);
$buf .= "\0"x4;
&copy64(substr($buf, 0, 64));
&mdfour64;
&copy64(substr($buf, 64, 64));
&mdfour64;
}
my $out = pack("VVVV", $A, $B, $C, $D);
return $out;
}
sub F
{
my ($X, $Y, $Z) = @_;
my $res = ($X&$Y) | ((~$X)&$Z);
return $res;
}
sub G
{
my ($X, $Y, $Z) = @_;
return ($X&$Y) | ($X&$Z) | ($Y&$Z);
}
sub H
{
my ($X, $Y, $Z) = @_;
return $X^$Y^$Z;
}
sub lshift
{
my ($x, $s) = @_;
$x &= 0xffffffff;
return (($x<<$s)&0xffffffff) | ($x>>(32-$s));
}
sub ROUND1
{
my ($a, $b, $c, $d, $k, $s) = @_;
my $e = &add($a, &F($b, $c, $d), $X[$k]);
return &lshift($e, $s);
}
sub ROUND2
{
my ($a, $b, $c, $d, $k, $s) = @_;
my $e = &add($a, &G($b, $c, $d), $X[$k], 0x5a827999);
return &lshift($e, $s);
}
sub ROUND3
{
my ($a, $b, $c, $d, $k, $s) = @_;
my $e = &add($a, &H($b, $c, $d), $X[$k], 0x6ed9eba1);
return &lshift($e, $s);
}
sub mdfour64
{
my ($i, $AA, $BB, $CC, $DD);
@X = unpack("N16", $M);
$AA = $A;
$BB = $B;
$CC = $C;
$DD = $D;
$A = &ROUND1($A,$B,$C,$D, 0, 3); $D = &ROUND1($D,$A,$B,$C, 1, 7);
$C = &ROUND1($C,$D,$A,$B, 2,11); $B = &ROUND1($B,$C,$D,$A, 3,19);
$A = &ROUND1($A,$B,$C,$D, 4, 3); $D = &ROUND1($D,$A,$B,$C, 5, 7);
$C = &ROUND1($C,$D,$A,$B, 6,11); $B = &ROUND1($B,$C,$D,$A, 7,19);
$A = &ROUND1($A,$B,$C,$D, 8, 3); $D = &ROUND1($D,$A,$B,$C, 9, 7);
$C = &ROUND1($C,$D,$A,$B,10,11); $B = &ROUND1($B,$C,$D,$A,11,19);
$A = &ROUND1($A,$B,$C,$D,12, 3); $D = &ROUND1($D,$A,$B,$C,13, 7);
$C = &ROUND1($C,$D,$A,$B,14,11); $B = &ROUND1($B,$C,$D,$A,15,19);
$A = &ROUND2($A,$B,$C,$D, 0, 3); $D = &ROUND2($D,$A,$B,$C, 4, 5);
$C = &ROUND2($C,$D,$A,$B, 8, 9); $B = &ROUND2($B,$C,$D,$A,12,13);
$A = &ROUND2($A,$B,$C,$D, 1, 3); $D = &ROUND2($D,$A,$B,$C, 5, 5);
$C = &ROUND2($C,$D,$A,$B, 9, 9); $B = &ROUND2($B,$C,$D,$A,13,13);
$A = &ROUND2($A,$B,$C,$D, 2, 3); $D = &ROUND2($D,$A,$B,$C, 6, 5);
$C = &ROUND2($C,$D,$A,$B,10, 9); $B = &ROUND2($B,$C,$D,$A,14,13);
$A = &ROUND2($A,$B,$C,$D, 3, 3); $D = &ROUND2($D,$A,$B,$C, 7, 5);
$C = &ROUND2($C,$D,$A,$B,11, 9); $B = &ROUND2($B,$C,$D,$A,15,13);
$A = &ROUND3($A,$B,$C,$D, 0, 3); $D = &ROUND3($D,$A,$B,$C, 8, 9);
$C = &ROUND3($C,$D,$A,$B, 4,11); $B = &ROUND3($B,$C,$D,$A,12,15);
$A = &ROUND3($A,$B,$C,$D, 2, 3); $D = &ROUND3($D,$A,$B,$C,10, 9);
$C = &ROUND3($C,$D,$A,$B, 6,11); $B = &ROUND3($B,$C,$D,$A,14,15);
$A = &ROUND3($A,$B,$C,$D, 1, 3); $D = &ROUND3($D,$A,$B,$C, 9, 9);
$C = &ROUND3($C,$D,$A,$B, 5,11); $B = &ROUND3($B,$C,$D,$A,13,15);
$A = &ROUND3($A,$B,$C,$D, 3, 3); $D = &ROUND3($D,$A,$B,$C,11, 9);
$C = &ROUND3($C,$D,$A,$B, 7,11); $B = &ROUND3($B,$C,$D,$A,15,15);
$A = &add($A, $AA); $B = &add($B, $BB);
$C = &add($C, $CC); $D = &add($D, $DD);
$A &= 0xffffffff; $B &= 0xffffffff;
$C &= 0xffffffff; $D &= 0xffffffff;
map {$_ = 0} @X;
}
sub copy64
{
my ($in) = @_;
$M = pack("V16", unpack("N16", $in));
}
# see note at top of this file about this function
sub add
{
my (@nums) = @_;
my ($r_low, $r_high, $n_low, $l_high);
my $num;
$r_low = $r_high = 0;
foreach $num (@nums)
{
$n_low = $num & 0xffff;
$n_high = ($num&0xffff0000)>>16;
$r_low += $n_low;
($r_low&0xf0000) && $r_high++;
$r_low &= 0xffff;
$r_high += $n_high;
$r_high &= 0xffff;
}
return ($r_high<<16)|$r_low;
}
1;

View file

@ -1,599 +0,0 @@
# This Makefile is for the Authen::NTLM::MD4 extension to perl.
#
# It was generated automatically by MakeMaker version
# 6.55_02 (Revision: 65502) from the contents of
# Makefile.PL. Don't edit this file, edit Makefile.PL instead.
#
# ANY CHANGES MADE HERE WILL BE LOST!
#
# MakeMaker ARGV: ()
#
# MakeMaker Parameters:
# AUTHOR => q[David (Buzz) Bussenschutt <davidbuzz@gmail.com>, Mark Bush <Mark.Bush@bushnet.demon.co.uk>]
# BUILD_REQUIRES => { }
# NAME => q[Authen::NTLM::MD4]
# PREREQ_PM => { }
# VERSION_FROM => q[MD4.pm]
# --- MakeMaker post_initialize section:
# --- MakeMaker const_config section:
# These definitions are from config.sh (via /usr/lib/perl/5.10/Config.pm).
# They may have been overridden via Makefile.PL or on the command line.
AR = ar
CC = cc
CCCDLFLAGS = -fPIC
CCDLFLAGS = -Wl,-E
DLEXT = so
DLSRC = dl_dlopen.xs
EXE_EXT =
FULL_AR = /usr/bin/ar
LD = cc
LDDLFLAGS = -shared -O2 -g -L/usr/local/lib -fstack-protector
LDFLAGS = -fstack-protector -L/usr/local/lib
LIBC = /lib/libc-2.11.1.so
LIB_EXT = .a
OBJ_EXT = .o
OSNAME = linux
OSVERS = 2.6.24-28-server
RANLIB = :
SITELIBEXP = /usr/local/share/perl/5.10.1
SITEARCHEXP = /usr/local/lib/perl/5.10.1
SO = so
VENDORARCHEXP = /usr/lib/perl5
VENDORLIBEXP = /usr/share/perl5
# --- MakeMaker constants section:
AR_STATIC_ARGS = cr
DIRFILESEP = /
DFSEP = $(DIRFILESEP)
NAME = Authen::NTLM::MD4
NAME_SYM = Authen_NTLM_MD4
VERSION = 1.02
VERSION_MACRO = VERSION
VERSION_SYM = 1_02
DEFINE_VERSION = -D$(VERSION_MACRO)=\"$(VERSION)\"
XS_VERSION = 1.02
XS_VERSION_MACRO = XS_VERSION
XS_DEFINE_VERSION = -D$(XS_VERSION_MACRO)=\"$(XS_VERSION)\"
INST_ARCHLIB = ../blib/arch
INST_SCRIPT = ../blib/script
INST_BIN = ../blib/bin
INST_LIB = ../blib/lib
INST_MAN1DIR = ../blib/man1
INST_MAN3DIR = ../blib/man3
MAN1EXT = 1p
MAN3EXT = 3pm
INSTALLDIRS = site
DESTDIR =
PREFIX = /usr
PERLPREFIX = $(PREFIX)
SITEPREFIX = $(PREFIX)/local
VENDORPREFIX = $(PREFIX)
INSTALLPRIVLIB = $(PERLPREFIX)/share/perl/5.10
DESTINSTALLPRIVLIB = $(DESTDIR)$(INSTALLPRIVLIB)
INSTALLSITELIB = $(SITEPREFIX)/share/perl/5.10.1
DESTINSTALLSITELIB = $(DESTDIR)$(INSTALLSITELIB)
INSTALLVENDORLIB = $(VENDORPREFIX)/share/perl5
DESTINSTALLVENDORLIB = $(DESTDIR)$(INSTALLVENDORLIB)
INSTALLARCHLIB = $(PERLPREFIX)/lib/perl/5.10
DESTINSTALLARCHLIB = $(DESTDIR)$(INSTALLARCHLIB)
INSTALLSITEARCH = $(SITEPREFIX)/lib/perl/5.10.1
DESTINSTALLSITEARCH = $(DESTDIR)$(INSTALLSITEARCH)
INSTALLVENDORARCH = $(VENDORPREFIX)/lib/perl5
DESTINSTALLVENDORARCH = $(DESTDIR)$(INSTALLVENDORARCH)
INSTALLBIN = $(PERLPREFIX)/bin
DESTINSTALLBIN = $(DESTDIR)$(INSTALLBIN)
INSTALLSITEBIN = $(SITEPREFIX)/bin
DESTINSTALLSITEBIN = $(DESTDIR)$(INSTALLSITEBIN)
INSTALLVENDORBIN = $(VENDORPREFIX)/bin
DESTINSTALLVENDORBIN = $(DESTDIR)$(INSTALLVENDORBIN)
INSTALLSCRIPT = $(PERLPREFIX)/bin
DESTINSTALLSCRIPT = $(DESTDIR)$(INSTALLSCRIPT)
INSTALLSITESCRIPT = $(SITEPREFIX)/bin
DESTINSTALLSITESCRIPT = $(DESTDIR)$(INSTALLSITESCRIPT)
INSTALLVENDORSCRIPT = $(VENDORPREFIX)/bin
DESTINSTALLVENDORSCRIPT = $(DESTDIR)$(INSTALLVENDORSCRIPT)
INSTALLMAN1DIR = $(PERLPREFIX)/share/man/man1
DESTINSTALLMAN1DIR = $(DESTDIR)$(INSTALLMAN1DIR)
INSTALLSITEMAN1DIR = $(SITEPREFIX)/man/man1
DESTINSTALLSITEMAN1DIR = $(DESTDIR)$(INSTALLSITEMAN1DIR)
INSTALLVENDORMAN1DIR = $(VENDORPREFIX)/share/man/man1
DESTINSTALLVENDORMAN1DIR = $(DESTDIR)$(INSTALLVENDORMAN1DIR)
INSTALLMAN3DIR = $(PERLPREFIX)/share/man/man3
DESTINSTALLMAN3DIR = $(DESTDIR)$(INSTALLMAN3DIR)
INSTALLSITEMAN3DIR = $(SITEPREFIX)/man/man3
DESTINSTALLSITEMAN3DIR = $(DESTDIR)$(INSTALLSITEMAN3DIR)
INSTALLVENDORMAN3DIR = $(VENDORPREFIX)/share/man/man3
DESTINSTALLVENDORMAN3DIR = $(DESTDIR)$(INSTALLVENDORMAN3DIR)
PERL_LIB = /usr/share/perl/5.10
PERL_ARCHLIB = /usr/lib/perl/5.10
LIBPERL_A = libperl.a
FIRST_MAKEFILE = Makefile
MAKEFILE_OLD = Makefile.old
MAKE_APERL_FILE = Makefile.aperl
PERLMAINCC = $(CC)
PERL_INC = /usr/lib/perl/5.10/CORE
PERL = /usr/bin/perl
FULLPERL = /usr/bin/perl
ABSPERL = $(PERL)
PERLRUN = $(PERL)
FULLPERLRUN = $(FULLPERL)
ABSPERLRUN = $(ABSPERL)
PERLRUNINST = $(PERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"
FULLPERLRUNINST = $(FULLPERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"
ABSPERLRUNINST = $(ABSPERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"
PERL_CORE = 0
PERM_DIR = 755
PERM_RW = 644
PERM_RWX = 755
MAKEMAKER = /usr/share/perl/5.10/ExtUtils/MakeMaker.pm
MM_VERSION = 6.55_02
MM_REVISION = 65502
# FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
# DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
MAKE = make
FULLEXT = Authen/NTLM/MD4
BASEEXT = MD4
PARENT_NAME = Authen::NTLM
DLBASE = $(BASEEXT)
VERSION_FROM = MD4.pm
OBJECT =
LDFROM = $(OBJECT)
LINKTYPE = dynamic
BOOTDEP =
# Handy lists of source code files:
XS_FILES =
C_FILES =
O_FILES =
H_FILES =
MAN1PODS =
MAN3PODS =
# Where is the Config information that we are using/depend on
CONFIGDEP = $(PERL_ARCHLIB)$(DFSEP)Config.pm $(PERL_INC)$(DFSEP)config.h
# Where to build things
INST_LIBDIR = $(INST_LIB)/Authen/NTLM
INST_ARCHLIBDIR = $(INST_ARCHLIB)/Authen/NTLM
INST_AUTODIR = $(INST_LIB)/auto/$(FULLEXT)
INST_ARCHAUTODIR = $(INST_ARCHLIB)/auto/$(FULLEXT)
INST_STATIC =
INST_DYNAMIC =
INST_BOOT =
# Extra linker info
EXPORT_LIST =
PERL_ARCHIVE =
PERL_ARCHIVE_AFTER =
TO_INST_PM = MD4.pm
PM_TO_BLIB = MD4.pm \
$(INST_LIB)/Authen/NTLM/MD4.pm
# --- MakeMaker platform_constants section:
MM_Unix_VERSION = 6.55_02
PERL_MALLOC_DEF = -DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc -Dfree=Perl_mfree -Drealloc=Perl_realloc -Dcalloc=Perl_calloc
# --- MakeMaker tool_autosplit section:
# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
AUTOSPLITFILE = $(ABSPERLRUN) -e 'use AutoSplit; autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1)' --
# --- MakeMaker tool_xsubpp section:
# --- MakeMaker tools_other section:
SHELL = /bin/sh
CHMOD = chmod
CP = cp
MV = mv
NOOP = $(TRUE)
NOECHO = @
RM_F = rm -f
RM_RF = rm -rf
TEST_F = test -f
TOUCH = touch
UMASK_NULL = umask 0
DEV_NULL = > /dev/null 2>&1
MKPATH = $(ABSPERLRUN) -MExtUtils::Command -e 'mkpath' --
EQUALIZE_TIMESTAMP = $(ABSPERLRUN) -MExtUtils::Command -e 'eqtime' --
FALSE = false
TRUE = true
ECHO = echo
ECHO_N = echo -n
UNINST = 0
VERBINST = 0
MOD_INSTALL = $(ABSPERLRUN) -MExtUtils::Install -e 'install([ from_to => {@ARGV}, verbose => '\''$(VERBINST)'\'', uninstall_shadows => '\''$(UNINST)'\'', dir_mode => '\''$(PERM_DIR)'\'' ]);' --
DOC_INSTALL = $(ABSPERLRUN) -MExtUtils::Command::MM -e 'perllocal_install' --
UNINSTALL = $(ABSPERLRUN) -MExtUtils::Command::MM -e 'uninstall' --
WARN_IF_OLD_PACKLIST = $(ABSPERLRUN) -MExtUtils::Command::MM -e 'warn_if_old_packlist' --
MACROSTART =
MACROEND =
USEMAKEFILE = -f
FIXIN = $(ABSPERLRUN) -MExtUtils::MY -e 'MY->fixin(shift)' --
# --- MakeMaker makemakerdflt section:
makemakerdflt : all
$(NOECHO) $(NOOP)
# --- MakeMaker dist section skipped.
# --- MakeMaker macro section:
# --- MakeMaker depend section:
# --- MakeMaker cflags section:
# --- MakeMaker const_loadlibs section:
# --- MakeMaker const_cccmd section:
# --- MakeMaker post_constants section:
# --- MakeMaker pasthru section:
PASTHRU = LIBPERL_A="$(LIBPERL_A)"\
LINKTYPE="$(LINKTYPE)"\
PREFIX="$(PREFIX)"
# --- MakeMaker special_targets section:
.SUFFIXES : .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT)
.PHONY: all config static dynamic test linkext manifest blibdirs clean realclean disttest distdir
# --- MakeMaker c_o section:
# --- MakeMaker xs_c section:
# --- MakeMaker xs_o section:
# --- MakeMaker top_targets section:
all :: pure_all manifypods
$(NOECHO) $(NOOP)
pure_all :: config pm_to_blib subdirs linkext
$(NOECHO) $(NOOP)
subdirs :: $(MYEXTLIB)
$(NOECHO) $(NOOP)
config :: $(FIRST_MAKEFILE) blibdirs
$(NOECHO) $(NOOP)
help :
perldoc ExtUtils::MakeMaker
# --- MakeMaker blibdirs section:
blibdirs : $(INST_LIBDIR)$(DFSEP).exists $(INST_ARCHLIB)$(DFSEP).exists $(INST_AUTODIR)$(DFSEP).exists $(INST_ARCHAUTODIR)$(DFSEP).exists $(INST_BIN)$(DFSEP).exists $(INST_SCRIPT)$(DFSEP).exists $(INST_MAN1DIR)$(DFSEP).exists $(INST_MAN3DIR)$(DFSEP).exists
$(NOECHO) $(NOOP)
# Backwards compat with 6.18 through 6.25
blibdirs.ts : blibdirs
$(NOECHO) $(NOOP)
$(INST_LIBDIR)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_LIBDIR)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_LIBDIR)
$(NOECHO) $(TOUCH) $(INST_LIBDIR)$(DFSEP).exists
$(INST_ARCHLIB)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_ARCHLIB)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_ARCHLIB)
$(NOECHO) $(TOUCH) $(INST_ARCHLIB)$(DFSEP).exists
$(INST_AUTODIR)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_AUTODIR)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_AUTODIR)
$(NOECHO) $(TOUCH) $(INST_AUTODIR)$(DFSEP).exists
$(INST_ARCHAUTODIR)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_ARCHAUTODIR)
$(NOECHO) $(TOUCH) $(INST_ARCHAUTODIR)$(DFSEP).exists
$(INST_BIN)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_BIN)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_BIN)
$(NOECHO) $(TOUCH) $(INST_BIN)$(DFSEP).exists
$(INST_SCRIPT)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_SCRIPT)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_SCRIPT)
$(NOECHO) $(TOUCH) $(INST_SCRIPT)$(DFSEP).exists
$(INST_MAN1DIR)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_MAN1DIR)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_MAN1DIR)
$(NOECHO) $(TOUCH) $(INST_MAN1DIR)$(DFSEP).exists
$(INST_MAN3DIR)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_MAN3DIR)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_MAN3DIR)
$(NOECHO) $(TOUCH) $(INST_MAN3DIR)$(DFSEP).exists
# --- MakeMaker linkext section:
linkext :: $(LINKTYPE)
$(NOECHO) $(NOOP)
# --- MakeMaker dlsyms section:
# --- MakeMaker dynamic section:
dynamic :: $(FIRST_MAKEFILE) $(INST_DYNAMIC) $(INST_BOOT)
$(NOECHO) $(NOOP)
# --- MakeMaker dynamic_bs section:
BOOTSTRAP =
# --- MakeMaker dynamic_lib section:
# --- MakeMaker static section:
## $(INST_PM) has been moved to the all: target.
## It remains here for awhile to allow for old usage: "make static"
static :: $(FIRST_MAKEFILE) $(INST_STATIC)
$(NOECHO) $(NOOP)
# --- MakeMaker static_lib section:
# --- MakeMaker manifypods section:
POD2MAN_EXE = $(PERLRUN) "-MExtUtils::Command::MM" -e pod2man "--"
POD2MAN = $(POD2MAN_EXE)
manifypods : pure_all
$(NOECHO) $(NOOP)
# --- MakeMaker processPL section:
# --- MakeMaker installbin section:
# --- MakeMaker subdirs section:
# none
# --- MakeMaker clean_subdirs section:
clean_subdirs :
$(NOECHO) $(NOOP)
# --- MakeMaker clean section:
# Delete temporary files but do not touch installed files. We don't delete
# the Makefile here so a later make realclean still has a makefile to use.
clean :: clean_subdirs
- $(RM_F) \
*$(LIB_EXT) core \
core.[0-9] $(INST_ARCHAUTODIR)/extralibs.all \
core.[0-9][0-9] $(BASEEXT).bso \
pm_to_blib.ts core.[0-9][0-9][0-9][0-9] \
$(BASEEXT).x $(BOOTSTRAP) \
perl$(EXE_EXT) tmon.out \
*$(OBJ_EXT) pm_to_blib \
$(INST_ARCHAUTODIR)/extralibs.ld blibdirs.ts \
core.[0-9][0-9][0-9][0-9][0-9] *perl.core \
core.*perl.*.? $(MAKE_APERL_FILE) \
$(BASEEXT).def perl \
core.[0-9][0-9][0-9] mon.out \
lib$(BASEEXT).def perl.exe \
perlmain.c so_locations \
$(BASEEXT).exp
- $(RM_RF) \
blib
- $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) $(DEV_NULL)
# --- MakeMaker realclean_subdirs section:
realclean_subdirs :
$(NOECHO) $(NOOP)
# --- MakeMaker realclean section:
# Delete temporary files (via clean) and also delete dist files
realclean purge :: clean realclean_subdirs
- $(RM_F) \
$(MAKEFILE_OLD) $(FIRST_MAKEFILE)
- $(RM_RF) \
$(DISTVNAME)
# --- MakeMaker metafile section:
metafile : create_distdir
$(NOECHO) $(ECHO) Generating META.yml
$(NOECHO) $(ECHO) '--- #YAML:1.0' > META_new.yml
$(NOECHO) $(ECHO) 'name: Authen-NTLM-MD4' >> META_new.yml
$(NOECHO) $(ECHO) 'version: 1.02' >> META_new.yml
$(NOECHO) $(ECHO) 'abstract: ~' >> META_new.yml
$(NOECHO) $(ECHO) 'author:' >> META_new.yml
$(NOECHO) $(ECHO) ' - David (Buzz) Bussenschutt <davidbuzz@gmail.com>, Mark Bush <Mark.Bush@bushnet.demon.co.uk>' >> META_new.yml
$(NOECHO) $(ECHO) 'license: unknown' >> META_new.yml
$(NOECHO) $(ECHO) 'distribution_type: module' >> META_new.yml
$(NOECHO) $(ECHO) 'configure_requires:' >> META_new.yml
$(NOECHO) $(ECHO) ' ExtUtils::MakeMaker: 0' >> META_new.yml
$(NOECHO) $(ECHO) 'build_requires:' >> META_new.yml
$(NOECHO) $(ECHO) ' ExtUtils::MakeMaker: 0' >> META_new.yml
$(NOECHO) $(ECHO) 'requires: {}' >> META_new.yml
$(NOECHO) $(ECHO) 'no_index:' >> META_new.yml
$(NOECHO) $(ECHO) ' directory:' >> META_new.yml
$(NOECHO) $(ECHO) ' - t' >> META_new.yml
$(NOECHO) $(ECHO) ' - inc' >> META_new.yml
$(NOECHO) $(ECHO) 'generated_by: ExtUtils::MakeMaker version 6.55_02' >> META_new.yml
$(NOECHO) $(ECHO) 'meta-spec:' >> META_new.yml
$(NOECHO) $(ECHO) ' url: http://module-build.sourceforge.net/META-spec-v1.4.html' >> META_new.yml
$(NOECHO) $(ECHO) ' version: 1.4' >> META_new.yml
-$(NOECHO) $(MV) META_new.yml $(DISTVNAME)/META.yml
# --- MakeMaker signature section:
signature :
cpansign -s
# --- MakeMaker dist_basics section skipped.
# --- MakeMaker dist_core section skipped.
# --- MakeMaker distdir section skipped.
# --- MakeMaker dist_test section skipped.
# --- MakeMaker dist_ci section skipped.
# --- MakeMaker distmeta section:
distmeta : create_distdir metafile
$(NOECHO) cd $(DISTVNAME) && $(ABSPERLRUN) -MExtUtils::Manifest=maniadd -e 'eval { maniadd({q{META.yml} => q{Module meta-data (added by MakeMaker)}}) } ' \
-e ' or print "Could not add META.yml to MANIFEST: $${'\''@'\''}\n"' --
# --- MakeMaker distsignature section:
distsignature : create_distdir
$(NOECHO) cd $(DISTVNAME) && $(ABSPERLRUN) -MExtUtils::Manifest=maniadd -e 'eval { maniadd({q{SIGNATURE} => q{Public-key signature (added by MakeMaker)}}) } ' \
-e ' or print "Could not add SIGNATURE to MANIFEST: $${'\''@'\''}\n"' --
$(NOECHO) cd $(DISTVNAME) && $(TOUCH) SIGNATURE
cd $(DISTVNAME) && cpansign -s
# --- MakeMaker install section skipped.
# --- MakeMaker force section:
# Phony target to force checking subdirectories.
FORCE :
$(NOECHO) $(NOOP)
# --- MakeMaker perldepend section:
# --- MakeMaker makefile section:
# We take a very conservative approach here, but it's worth it.
# We move Makefile to Makefile.old here to avoid gnu make looping.
$(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP)
$(NOECHO) $(ECHO) "Makefile out-of-date with respect to $?"
$(NOECHO) $(ECHO) "Cleaning current config before rebuilding Makefile..."
-$(NOECHO) $(RM_F) $(MAKEFILE_OLD)
-$(NOECHO) $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD)
- $(MAKE) $(USEMAKEFILE) $(MAKEFILE_OLD) clean $(DEV_NULL)
$(PERLRUN) Makefile.PL
$(NOECHO) $(ECHO) "==> Your Makefile has been rebuilt. <=="
$(NOECHO) $(ECHO) "==> Please rerun the $(MAKE) command. <=="
$(FALSE)
# --- MakeMaker staticmake section:
# --- MakeMaker makeaperl section ---
MAP_TARGET = ../perl
FULLPERL = /usr/bin/perl
# --- MakeMaker test section:
TEST_VERBOSE=0
TEST_TYPE=test_$(LINKTYPE)
TEST_FILE = test.pl
TEST_FILES =
TESTDB_SW = -d
testdb :: testdb_$(LINKTYPE)
test :: $(TEST_TYPE) subdirs-test
subdirs-test ::
$(NOECHO) $(NOOP)
$(NOECHO) $(ECHO) 'No tests defined for $(NAME) extension.'
test_dynamic :: pure_all
testdb_dynamic :: pure_all
PERL_DL_NONLAZY=1 $(FULLPERLRUN) $(TESTDB_SW) "-I$(INST_LIB)" "-I$(INST_ARCHLIB)" $(TEST_FILE)
test_ : test_dynamic
test_static :: test_dynamic
testdb_static :: testdb_dynamic
# --- MakeMaker ppd section:
# Creates a PPD (Perl Package Description) for a binary distribution.
ppd :
$(NOECHO) $(ECHO) '<SOFTPKG NAME="$(DISTNAME)" VERSION="1.02">' > $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' <ABSTRACT></ABSTRACT>' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' <AUTHOR>David (Buzz) Bussenschutt &lt;davidbuzz@gmail.com&gt;, Mark Bush &lt;Mark.Bush@bushnet.demon.co.uk&gt;</AUTHOR>' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' <IMPLEMENTATION>' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' <ARCHITECTURE NAME="i486-linux-gnu-thread-multi-5.10" />' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' <CODEBASE HREF="" />' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' </IMPLEMENTATION>' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) '</SOFTPKG>' >> $(DISTNAME).ppd
# --- MakeMaker pm_to_blib section:
pm_to_blib : $(FIRST_MAKEFILE) $(TO_INST_PM)
$(NOECHO) $(ABSPERLRUN) -MExtUtils::Install -e 'pm_to_blib({@ARGV}, '\''$(INST_LIB)/auto'\'', q[$(PM_FILTER)], '\''$(PERM_DIR)'\'')' -- \
MD4.pm $(INST_LIB)/Authen/NTLM/MD4.pm
$(NOECHO) $(TOUCH) pm_to_blib
# --- MakeMaker selfdocument section:
# --- MakeMaker postamble section:
# End.

View file

@ -1,12 +0,0 @@
#!/usr/bin/perl
use ExtUtils::MakeMaker;
#
WriteMakefile(
'NAME' => 'Authen::NTLM::MD4',
'VERSION_FROM' => 'MD4.pm',
($] >= 5.005 ? ## Add these new keywords supported since 5.005
('AUTHOR' => 'David (Buzz) Bussenschutt <davidbuzz@gmail.com>, Mark Bush <Mark.Bush@bushnet.demon.co.uk>') : ()),
);

View file

@ -1,15 +0,0 @@
--- #YAML:1.0
name: Authen-NTLM
version: 1.09
abstract: ~
license: perl
author:
- David (Buzz) Bussenschutt <davidbuzz@gmail.com>, Mark Bush <Mark.Bush@bushnet.demon.co.uk>, Nick Bebout <nbebout@cpan.org>
generated_by: ExtUtils::MakeMaker version 6.42
distribution_type: module
requires:
Digest::HMAC_MD5: 0
MIME::Base64: 0
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.3.html
version: 1.3

View file

@ -1,810 +0,0 @@
# This Makefile is for the Authen::NTLM extension to perl.
#
# It was generated automatically by MakeMaker version
# 6.55_02 (Revision: 65502) from the contents of
# Makefile.PL. Don't edit this file, edit Makefile.PL instead.
#
# ANY CHANGES MADE HERE WILL BE LOST!
#
# MakeMaker ARGV: ()
#
# MakeMaker Parameters:
# AUTHOR => q[David (Buzz) Bussenschutt <davidbuzz@gmail.com>, Mark Bush <Mark.Bush@bushnet.demon.co.uk>]
# BUILD_REQUIRES => { }
# DIR => [q[DES], q[MD4]]
# NAME => q[Authen::NTLM]
# PREREQ_PM => { Digest::HMAC_MD5=>q[0], MIME::Base64=>q[0] }
# VERSION_FROM => q[NTLM.pm]
# --- MakeMaker post_initialize section:
# --- MakeMaker const_config section:
# These definitions are from config.sh (via /usr/lib/perl/5.10/Config.pm).
# They may have been overridden via Makefile.PL or on the command line.
AR = ar
CC = cc
CCCDLFLAGS = -fPIC
CCDLFLAGS = -Wl,-E
DLEXT = so
DLSRC = dl_dlopen.xs
EXE_EXT =
FULL_AR = /usr/bin/ar
LD = cc
LDDLFLAGS = -shared -O2 -g -L/usr/local/lib -fstack-protector
LDFLAGS = -fstack-protector -L/usr/local/lib
LIBC = /lib/libc-2.11.1.so
LIB_EXT = .a
OBJ_EXT = .o
OSNAME = linux
OSVERS = 2.6.24-28-server
RANLIB = :
SITELIBEXP = /usr/local/share/perl/5.10.1
SITEARCHEXP = /usr/local/lib/perl/5.10.1
SO = so
VENDORARCHEXP = /usr/lib/perl5
VENDORLIBEXP = /usr/share/perl5
# --- MakeMaker constants section:
AR_STATIC_ARGS = cr
DIRFILESEP = /
DFSEP = $(DIRFILESEP)
NAME = Authen::NTLM
NAME_SYM = Authen_NTLM
VERSION = 1.09
VERSION_MACRO = VERSION
VERSION_SYM = 1_09
DEFINE_VERSION = -D$(VERSION_MACRO)=\"$(VERSION)\"
XS_VERSION = 1.09
XS_VERSION_MACRO = XS_VERSION
XS_DEFINE_VERSION = -D$(XS_VERSION_MACRO)=\"$(XS_VERSION)\"
INST_ARCHLIB = blib/arch
INST_SCRIPT = blib/script
INST_BIN = blib/bin
INST_LIB = blib/lib
INST_MAN1DIR = blib/man1
INST_MAN3DIR = blib/man3
MAN1EXT = 1p
MAN3EXT = 3pm
INSTALLDIRS = site
DESTDIR =
PREFIX = /usr
PERLPREFIX = $(PREFIX)
SITEPREFIX = $(PREFIX)/local
VENDORPREFIX = $(PREFIX)
INSTALLPRIVLIB = $(PERLPREFIX)/share/perl/5.10
DESTINSTALLPRIVLIB = $(DESTDIR)$(INSTALLPRIVLIB)
INSTALLSITELIB = $(SITEPREFIX)/share/perl/5.10.1
DESTINSTALLSITELIB = $(DESTDIR)$(INSTALLSITELIB)
INSTALLVENDORLIB = $(VENDORPREFIX)/share/perl5
DESTINSTALLVENDORLIB = $(DESTDIR)$(INSTALLVENDORLIB)
INSTALLARCHLIB = $(PERLPREFIX)/lib/perl/5.10
DESTINSTALLARCHLIB = $(DESTDIR)$(INSTALLARCHLIB)
INSTALLSITEARCH = $(SITEPREFIX)/lib/perl/5.10.1
DESTINSTALLSITEARCH = $(DESTDIR)$(INSTALLSITEARCH)
INSTALLVENDORARCH = $(VENDORPREFIX)/lib/perl5
DESTINSTALLVENDORARCH = $(DESTDIR)$(INSTALLVENDORARCH)
INSTALLBIN = $(PERLPREFIX)/bin
DESTINSTALLBIN = $(DESTDIR)$(INSTALLBIN)
INSTALLSITEBIN = $(SITEPREFIX)/bin
DESTINSTALLSITEBIN = $(DESTDIR)$(INSTALLSITEBIN)
INSTALLVENDORBIN = $(VENDORPREFIX)/bin
DESTINSTALLVENDORBIN = $(DESTDIR)$(INSTALLVENDORBIN)
INSTALLSCRIPT = $(PERLPREFIX)/bin
DESTINSTALLSCRIPT = $(DESTDIR)$(INSTALLSCRIPT)
INSTALLSITESCRIPT = $(SITEPREFIX)/bin
DESTINSTALLSITESCRIPT = $(DESTDIR)$(INSTALLSITESCRIPT)
INSTALLVENDORSCRIPT = $(VENDORPREFIX)/bin
DESTINSTALLVENDORSCRIPT = $(DESTDIR)$(INSTALLVENDORSCRIPT)
INSTALLMAN1DIR = $(PERLPREFIX)/share/man/man1
DESTINSTALLMAN1DIR = $(DESTDIR)$(INSTALLMAN1DIR)
INSTALLSITEMAN1DIR = $(SITEPREFIX)/man/man1
DESTINSTALLSITEMAN1DIR = $(DESTDIR)$(INSTALLSITEMAN1DIR)
INSTALLVENDORMAN1DIR = $(VENDORPREFIX)/share/man/man1
DESTINSTALLVENDORMAN1DIR = $(DESTDIR)$(INSTALLVENDORMAN1DIR)
INSTALLMAN3DIR = $(PERLPREFIX)/share/man/man3
DESTINSTALLMAN3DIR = $(DESTDIR)$(INSTALLMAN3DIR)
INSTALLSITEMAN3DIR = $(SITEPREFIX)/man/man3
DESTINSTALLSITEMAN3DIR = $(DESTDIR)$(INSTALLSITEMAN3DIR)
INSTALLVENDORMAN3DIR = $(VENDORPREFIX)/share/man/man3
DESTINSTALLVENDORMAN3DIR = $(DESTDIR)$(INSTALLVENDORMAN3DIR)
PERL_LIB = /usr/share/perl/5.10
PERL_ARCHLIB = /usr/lib/perl/5.10
LIBPERL_A = libperl.a
FIRST_MAKEFILE = Makefile
MAKEFILE_OLD = Makefile.old
MAKE_APERL_FILE = Makefile.aperl
PERLMAINCC = $(CC)
PERL_INC = /usr/lib/perl/5.10/CORE
PERL = /usr/bin/perl
FULLPERL = /usr/bin/perl
ABSPERL = $(PERL)
PERLRUN = $(PERL)
FULLPERLRUN = $(FULLPERL)
ABSPERLRUN = $(ABSPERL)
PERLRUNINST = $(PERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"
FULLPERLRUNINST = $(FULLPERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"
ABSPERLRUNINST = $(ABSPERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"
PERL_CORE = 0
PERM_DIR = 755
PERM_RW = 644
PERM_RWX = 755
MAKEMAKER = /usr/share/perl/5.10/ExtUtils/MakeMaker.pm
MM_VERSION = 6.55_02
MM_REVISION = 65502
# FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
# DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
MAKE = make
FULLEXT = Authen/NTLM
BASEEXT = NTLM
PARENT_NAME = Authen
DLBASE = $(BASEEXT)
VERSION_FROM = NTLM.pm
OBJECT =
LDFROM = $(OBJECT)
LINKTYPE = dynamic
BOOTDEP =
# Handy lists of source code files:
XS_FILES =
C_FILES =
O_FILES =
H_FILES =
MAN1PODS =
MAN3PODS = NTLM.pm
# Where is the Config information that we are using/depend on
CONFIGDEP = $(PERL_ARCHLIB)$(DFSEP)Config.pm $(PERL_INC)$(DFSEP)config.h
# Where to build things
INST_LIBDIR = $(INST_LIB)/Authen
INST_ARCHLIBDIR = $(INST_ARCHLIB)/Authen
INST_AUTODIR = $(INST_LIB)/auto/$(FULLEXT)
INST_ARCHAUTODIR = $(INST_ARCHLIB)/auto/$(FULLEXT)
INST_STATIC =
INST_DYNAMIC =
INST_BOOT =
# Extra linker info
EXPORT_LIST =
PERL_ARCHIVE =
PERL_ARCHIVE_AFTER =
TO_INST_PM = NTLM.pm
PM_TO_BLIB = NTLM.pm \
$(INST_LIB)/Authen/NTLM.pm
# --- MakeMaker platform_constants section:
MM_Unix_VERSION = 6.55_02
PERL_MALLOC_DEF = -DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc -Dfree=Perl_mfree -Drealloc=Perl_realloc -Dcalloc=Perl_calloc
# --- MakeMaker tool_autosplit section:
# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
AUTOSPLITFILE = $(ABSPERLRUN) -e 'use AutoSplit; autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1)' --
# --- MakeMaker tool_xsubpp section:
# --- MakeMaker tools_other section:
SHELL = /bin/sh
CHMOD = chmod
CP = cp
MV = mv
NOOP = $(TRUE)
NOECHO = @
RM_F = rm -f
RM_RF = rm -rf
TEST_F = test -f
TOUCH = touch
UMASK_NULL = umask 0
DEV_NULL = > /dev/null 2>&1
MKPATH = $(ABSPERLRUN) -MExtUtils::Command -e 'mkpath' --
EQUALIZE_TIMESTAMP = $(ABSPERLRUN) -MExtUtils::Command -e 'eqtime' --
FALSE = false
TRUE = true
ECHO = echo
ECHO_N = echo -n
UNINST = 0
VERBINST = 0
MOD_INSTALL = $(ABSPERLRUN) -MExtUtils::Install -e 'install([ from_to => {@ARGV}, verbose => '\''$(VERBINST)'\'', uninstall_shadows => '\''$(UNINST)'\'', dir_mode => '\''$(PERM_DIR)'\'' ]);' --
DOC_INSTALL = $(ABSPERLRUN) -MExtUtils::Command::MM -e 'perllocal_install' --
UNINSTALL = $(ABSPERLRUN) -MExtUtils::Command::MM -e 'uninstall' --
WARN_IF_OLD_PACKLIST = $(ABSPERLRUN) -MExtUtils::Command::MM -e 'warn_if_old_packlist' --
MACROSTART =
MACROEND =
USEMAKEFILE = -f
FIXIN = $(ABSPERLRUN) -MExtUtils::MY -e 'MY->fixin(shift)' --
# --- MakeMaker makemakerdflt section:
makemakerdflt : all
$(NOECHO) $(NOOP)
# --- MakeMaker dist section:
TAR = tar
TARFLAGS = cvf
ZIP = zip
ZIPFLAGS = -r
COMPRESS = gzip --best
SUFFIX = .gz
SHAR = shar
PREOP = $(NOECHO) $(NOOP)
POSTOP = $(NOECHO) $(NOOP)
TO_UNIX = $(NOECHO) $(NOOP)
CI = ci -u
RCS_LABEL = rcs -Nv$(VERSION_SYM): -q
DIST_CP = best
DIST_DEFAULT = tardist
DISTNAME = Authen-NTLM
DISTVNAME = Authen-NTLM-1.09
# --- MakeMaker macro section:
# --- MakeMaker depend section:
# --- MakeMaker cflags section:
# --- MakeMaker const_loadlibs section:
# --- MakeMaker const_cccmd section:
# --- MakeMaker post_constants section:
# --- MakeMaker pasthru section:
PASTHRU = LIBPERL_A="$(LIBPERL_A)"\
LINKTYPE="$(LINKTYPE)"\
PREFIX="$(PREFIX)"
# --- MakeMaker special_targets section:
.SUFFIXES : .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT)
.PHONY: all config static dynamic test linkext manifest blibdirs clean realclean disttest distdir
# --- MakeMaker c_o section:
# --- MakeMaker xs_c section:
# --- MakeMaker xs_o section:
# --- MakeMaker top_targets section:
all :: pure_all manifypods
$(NOECHO) $(NOOP)
pure_all :: config pm_to_blib subdirs linkext
$(NOECHO) $(NOOP)
subdirs :: $(MYEXTLIB)
$(NOECHO) $(NOOP)
config :: $(FIRST_MAKEFILE) blibdirs
$(NOECHO) $(NOOP)
help :
perldoc ExtUtils::MakeMaker
# --- MakeMaker blibdirs section:
blibdirs : $(INST_LIBDIR)$(DFSEP).exists $(INST_ARCHLIB)$(DFSEP).exists $(INST_AUTODIR)$(DFSEP).exists $(INST_ARCHAUTODIR)$(DFSEP).exists $(INST_BIN)$(DFSEP).exists $(INST_SCRIPT)$(DFSEP).exists $(INST_MAN1DIR)$(DFSEP).exists $(INST_MAN3DIR)$(DFSEP).exists
$(NOECHO) $(NOOP)
# Backwards compat with 6.18 through 6.25
blibdirs.ts : blibdirs
$(NOECHO) $(NOOP)
$(INST_LIBDIR)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_LIBDIR)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_LIBDIR)
$(NOECHO) $(TOUCH) $(INST_LIBDIR)$(DFSEP).exists
$(INST_ARCHLIB)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_ARCHLIB)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_ARCHLIB)
$(NOECHO) $(TOUCH) $(INST_ARCHLIB)$(DFSEP).exists
$(INST_AUTODIR)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_AUTODIR)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_AUTODIR)
$(NOECHO) $(TOUCH) $(INST_AUTODIR)$(DFSEP).exists
$(INST_ARCHAUTODIR)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_ARCHAUTODIR)
$(NOECHO) $(TOUCH) $(INST_ARCHAUTODIR)$(DFSEP).exists
$(INST_BIN)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_BIN)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_BIN)
$(NOECHO) $(TOUCH) $(INST_BIN)$(DFSEP).exists
$(INST_SCRIPT)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_SCRIPT)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_SCRIPT)
$(NOECHO) $(TOUCH) $(INST_SCRIPT)$(DFSEP).exists
$(INST_MAN1DIR)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_MAN1DIR)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_MAN1DIR)
$(NOECHO) $(TOUCH) $(INST_MAN1DIR)$(DFSEP).exists
$(INST_MAN3DIR)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_MAN3DIR)
$(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_MAN3DIR)
$(NOECHO) $(TOUCH) $(INST_MAN3DIR)$(DFSEP).exists
# --- MakeMaker linkext section:
linkext :: $(LINKTYPE)
$(NOECHO) $(NOOP)
# --- MakeMaker dlsyms section:
# --- MakeMaker dynamic section:
dynamic :: $(FIRST_MAKEFILE) $(INST_DYNAMIC) $(INST_BOOT)
$(NOECHO) $(NOOP)
# --- MakeMaker dynamic_bs section:
BOOTSTRAP =
# --- MakeMaker dynamic_lib section:
# --- MakeMaker static section:
## $(INST_PM) has been moved to the all: target.
## It remains here for awhile to allow for old usage: "make static"
static :: $(FIRST_MAKEFILE) $(INST_STATIC)
$(NOECHO) $(NOOP)
# --- MakeMaker static_lib section:
# --- MakeMaker manifypods section:
POD2MAN_EXE = $(PERLRUN) "-MExtUtils::Command::MM" -e pod2man "--"
POD2MAN = $(POD2MAN_EXE)
manifypods : pure_all \
NTLM.pm
$(NOECHO) $(POD2MAN) --section=$(MAN3EXT) --perm_rw=$(PERM_RW) \
NTLM.pm $(INST_MAN3DIR)/Authen::NTLM.$(MAN3EXT)
# --- MakeMaker processPL section:
# --- MakeMaker installbin section:
# --- MakeMaker subdirs section:
# The default clean, realclean and test targets in this Makefile
# have automatically been given entries for each subdir.
subdirs ::
$(NOECHO) cd DES && $(MAKE) $(USEMAKEFILE) $(FIRST_MAKEFILE) all $(PASTHRU)
subdirs ::
$(NOECHO) cd MD4 && $(MAKE) $(USEMAKEFILE) $(FIRST_MAKEFILE) all $(PASTHRU)
# --- MakeMaker clean_subdirs section:
clean_subdirs :
$(ABSPERLRUN) -e 'chdir '\''DES'\''; system '\''$(MAKE) clean'\'' if -f '\''$(FIRST_MAKEFILE)'\'';' --
$(ABSPERLRUN) -e 'chdir '\''MD4'\''; system '\''$(MAKE) clean'\'' if -f '\''$(FIRST_MAKEFILE)'\'';' --
# --- MakeMaker clean section:
# Delete temporary files but do not touch installed files. We don't delete
# the Makefile here so a later make realclean still has a makefile to use.
clean :: clean_subdirs
- $(RM_F) \
*$(LIB_EXT) core \
core.[0-9] $(INST_ARCHAUTODIR)/extralibs.all \
core.[0-9][0-9] $(BASEEXT).bso \
pm_to_blib.ts core.[0-9][0-9][0-9][0-9] \
$(BASEEXT).x $(BOOTSTRAP) \
perl$(EXE_EXT) tmon.out \
*$(OBJ_EXT) pm_to_blib \
$(INST_ARCHAUTODIR)/extralibs.ld blibdirs.ts \
core.[0-9][0-9][0-9][0-9][0-9] *perl.core \
core.*perl.*.? $(MAKE_APERL_FILE) \
$(BASEEXT).def perl \
core.[0-9][0-9][0-9] mon.out \
lib$(BASEEXT).def perl.exe \
perlmain.c so_locations \
$(BASEEXT).exp
- $(RM_RF) \
blib
- $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) $(DEV_NULL)
# --- MakeMaker realclean_subdirs section:
realclean_subdirs :
- $(ABSPERLRUN) -e 'chdir '\''DES'\''; system '\''$(MAKE) $(USEMAKEFILE) $(MAKEFILE_OLD) realclean'\'' if -f '\''$(MAKEFILE_OLD)'\'';' --
- $(ABSPERLRUN) -e 'chdir '\''DES'\''; system '\''$(MAKE) $(USEMAKEFILE) $(FIRST_MAKEFILE) realclean'\'' if -f '\''$(FIRST_MAKEFILE)'\'';' --
- $(ABSPERLRUN) -e 'chdir '\''MD4'\''; system '\''$(MAKE) $(USEMAKEFILE) $(MAKEFILE_OLD) realclean'\'' if -f '\''$(MAKEFILE_OLD)'\'';' --
- $(ABSPERLRUN) -e 'chdir '\''MD4'\''; system '\''$(MAKE) $(USEMAKEFILE) $(FIRST_MAKEFILE) realclean'\'' if -f '\''$(FIRST_MAKEFILE)'\'';' --
# --- MakeMaker realclean section:
# Delete temporary files (via clean) and also delete dist files
realclean purge :: clean realclean_subdirs
- $(RM_F) \
$(MAKEFILE_OLD) $(FIRST_MAKEFILE)
- $(RM_RF) \
$(DISTVNAME)
# --- MakeMaker metafile section:
metafile : create_distdir
$(NOECHO) $(ECHO) Generating META.yml
$(NOECHO) $(ECHO) '--- #YAML:1.0' > META_new.yml
$(NOECHO) $(ECHO) 'name: Authen-NTLM' >> META_new.yml
$(NOECHO) $(ECHO) 'version: 1.09' >> META_new.yml
$(NOECHO) $(ECHO) 'abstract: ~' >> META_new.yml
$(NOECHO) $(ECHO) 'author:' >> META_new.yml
$(NOECHO) $(ECHO) ' - David (Buzz) Bussenschutt <davidbuzz@gmail.com>, Mark Bush <Mark.Bush@bushnet.demon.co.uk>' >> META_new.yml
$(NOECHO) $(ECHO) 'license: unknown' >> META_new.yml
$(NOECHO) $(ECHO) 'distribution_type: module' >> META_new.yml
$(NOECHO) $(ECHO) 'configure_requires:' >> META_new.yml
$(NOECHO) $(ECHO) ' ExtUtils::MakeMaker: 0' >> META_new.yml
$(NOECHO) $(ECHO) 'build_requires:' >> META_new.yml
$(NOECHO) $(ECHO) ' ExtUtils::MakeMaker: 0' >> META_new.yml
$(NOECHO) $(ECHO) 'requires:' >> META_new.yml
$(NOECHO) $(ECHO) ' Digest::HMAC_MD5: 0' >> META_new.yml
$(NOECHO) $(ECHO) ' MIME::Base64: 0' >> META_new.yml
$(NOECHO) $(ECHO) 'no_index:' >> META_new.yml
$(NOECHO) $(ECHO) ' directory:' >> META_new.yml
$(NOECHO) $(ECHO) ' - t' >> META_new.yml
$(NOECHO) $(ECHO) ' - inc' >> META_new.yml
$(NOECHO) $(ECHO) 'generated_by: ExtUtils::MakeMaker version 6.55_02' >> META_new.yml
$(NOECHO) $(ECHO) 'meta-spec:' >> META_new.yml
$(NOECHO) $(ECHO) ' url: http://module-build.sourceforge.net/META-spec-v1.4.html' >> META_new.yml
$(NOECHO) $(ECHO) ' version: 1.4' >> META_new.yml
-$(NOECHO) $(MV) META_new.yml $(DISTVNAME)/META.yml
# --- MakeMaker signature section:
signature :
cpansign -s
# --- MakeMaker dist_basics section:
distclean :: realclean distcheck
$(NOECHO) $(NOOP)
distcheck :
$(PERLRUN) "-MExtUtils::Manifest=fullcheck" -e fullcheck
skipcheck :
$(PERLRUN) "-MExtUtils::Manifest=skipcheck" -e skipcheck
manifest :
$(PERLRUN) "-MExtUtils::Manifest=mkmanifest" -e mkmanifest
veryclean : realclean
$(RM_F) *~ */*~ *.orig */*.orig *.bak */*.bak *.old */*.old
# --- MakeMaker dist_core section:
dist : $(DIST_DEFAULT) $(FIRST_MAKEFILE)
$(NOECHO) $(ABSPERLRUN) -l -e 'print '\''Warning: Makefile possibly out of date with $(VERSION_FROM)'\''' \
-e ' if -e '\''$(VERSION_FROM)'\'' and -M '\''$(VERSION_FROM)'\'' < -M '\''$(FIRST_MAKEFILE)'\'';' --
tardist : $(DISTVNAME).tar$(SUFFIX)
$(NOECHO) $(NOOP)
uutardist : $(DISTVNAME).tar$(SUFFIX)
uuencode $(DISTVNAME).tar$(SUFFIX) $(DISTVNAME).tar$(SUFFIX) > $(DISTVNAME).tar$(SUFFIX)_uu
$(DISTVNAME).tar$(SUFFIX) : distdir
$(PREOP)
$(TO_UNIX)
$(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
$(RM_RF) $(DISTVNAME)
$(COMPRESS) $(DISTVNAME).tar
$(POSTOP)
zipdist : $(DISTVNAME).zip
$(NOECHO) $(NOOP)
$(DISTVNAME).zip : distdir
$(PREOP)
$(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
$(RM_RF) $(DISTVNAME)
$(POSTOP)
shdist : distdir
$(PREOP)
$(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
$(RM_RF) $(DISTVNAME)
$(POSTOP)
# --- MakeMaker distdir section:
create_distdir :
$(RM_RF) $(DISTVNAME)
$(PERLRUN) "-MExtUtils::Manifest=manicopy,maniread" \
-e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');"
distdir : create_distdir distmeta
$(NOECHO) $(NOOP)
# --- MakeMaker dist_test section:
disttest : distdir
cd $(DISTVNAME) && $(ABSPERLRUN) Makefile.PL
cd $(DISTVNAME) && $(MAKE) $(PASTHRU)
cd $(DISTVNAME) && $(MAKE) test $(PASTHRU)
# --- MakeMaker dist_ci section:
ci :
$(PERLRUN) "-MExtUtils::Manifest=maniread" \
-e "@all = keys %{ maniread() };" \
-e "print(qq{Executing $(CI) @all\n}); system(qq{$(CI) @all});" \
-e "print(qq{Executing $(RCS_LABEL) ...\n}); system(qq{$(RCS_LABEL) @all});"
# --- MakeMaker distmeta section:
distmeta : create_distdir metafile
$(NOECHO) cd $(DISTVNAME) && $(ABSPERLRUN) -MExtUtils::Manifest=maniadd -e 'eval { maniadd({q{META.yml} => q{Module meta-data (added by MakeMaker)}}) } ' \
-e ' or print "Could not add META.yml to MANIFEST: $${'\''@'\''}\n"' --
# --- MakeMaker distsignature section:
distsignature : create_distdir
$(NOECHO) cd $(DISTVNAME) && $(ABSPERLRUN) -MExtUtils::Manifest=maniadd -e 'eval { maniadd({q{SIGNATURE} => q{Public-key signature (added by MakeMaker)}}) } ' \
-e ' or print "Could not add SIGNATURE to MANIFEST: $${'\''@'\''}\n"' --
$(NOECHO) cd $(DISTVNAME) && $(TOUCH) SIGNATURE
cd $(DISTVNAME) && cpansign -s
# --- MakeMaker install section:
install :: pure_install doc_install
$(NOECHO) $(NOOP)
install_perl :: pure_perl_install doc_perl_install
$(NOECHO) $(NOOP)
install_site :: pure_site_install doc_site_install
$(NOECHO) $(NOOP)
install_vendor :: pure_vendor_install doc_vendor_install
$(NOECHO) $(NOOP)
pure_install :: pure_$(INSTALLDIRS)_install
$(NOECHO) $(NOOP)
doc_install :: doc_$(INSTALLDIRS)_install
$(NOECHO) $(NOOP)
pure__install : pure_site_install
$(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
doc__install : doc_site_install
$(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
pure_perl_install :: all
$(NOECHO) umask 022; $(MOD_INSTALL) \
$(INST_LIB) $(DESTINSTALLPRIVLIB) \
$(INST_ARCHLIB) $(DESTINSTALLARCHLIB) \
$(INST_BIN) $(DESTINSTALLBIN) \
$(INST_SCRIPT) $(DESTINSTALLSCRIPT) \
$(INST_MAN1DIR) $(DESTINSTALLMAN1DIR) \
$(INST_MAN3DIR) $(DESTINSTALLMAN3DIR)
$(NOECHO) $(WARN_IF_OLD_PACKLIST) \
$(SITEARCHEXP)/auto/$(FULLEXT)
pure_site_install :: all
$(NOECHO) umask 02; $(MOD_INSTALL) \
read $(SITEARCHEXP)/auto/$(FULLEXT)/.packlist \
write $(DESTINSTALLSITEARCH)/auto/$(FULLEXT)/.packlist \
$(INST_LIB) $(DESTINSTALLSITELIB) \
$(INST_ARCHLIB) $(DESTINSTALLSITEARCH) \
$(INST_BIN) $(DESTINSTALLSITEBIN) \
$(INST_SCRIPT) $(DESTINSTALLSITESCRIPT) \
$(INST_MAN1DIR) $(DESTINSTALLSITEMAN1DIR) \
$(INST_MAN3DIR) $(DESTINSTALLSITEMAN3DIR)
$(NOECHO) $(WARN_IF_OLD_PACKLIST) \
$(PERL_ARCHLIB)/auto/$(FULLEXT)
pure_vendor_install :: all
$(NOECHO) umask 022; $(MOD_INSTALL) \
$(INST_LIB) $(DESTINSTALLVENDORLIB) \
$(INST_ARCHLIB) $(DESTINSTALLVENDORARCH) \
$(INST_BIN) $(DESTINSTALLVENDORBIN) \
$(INST_SCRIPT) $(DESTINSTALLVENDORSCRIPT) \
$(INST_MAN1DIR) $(DESTINSTALLVENDORMAN1DIR) \
$(INST_MAN3DIR) $(DESTINSTALLVENDORMAN3DIR)
doc_perl_install :: all
doc_site_install :: all
$(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLSITEARCH)/perllocal.pod
-$(NOECHO) umask 02; $(MKPATH) $(DESTINSTALLSITEARCH)
-$(NOECHO) umask 02; $(DOC_INSTALL) \
"Module" "$(NAME)" \
"installed into" "$(INSTALLSITELIB)" \
LINKTYPE "$(LINKTYPE)" \
VERSION "$(VERSION)" \
EXE_FILES "$(EXE_FILES)" \
>> $(DESTINSTALLSITEARCH)/perllocal.pod
doc_vendor_install :: all
uninstall :: uninstall_from_$(INSTALLDIRS)dirs
$(NOECHO) $(NOOP)
uninstall_from_perldirs ::
uninstall_from_sitedirs ::
$(NOECHO) $(UNINSTALL) $(SITEARCHEXP)/auto/$(FULLEXT)/.packlist
uninstall_from_vendordirs ::
# --- MakeMaker force section:
# Phony target to force checking subdirectories.
FORCE :
$(NOECHO) $(NOOP)
# --- MakeMaker perldepend section:
# --- MakeMaker makefile section:
# We take a very conservative approach here, but it's worth it.
# We move Makefile to Makefile.old here to avoid gnu make looping.
$(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP)
$(NOECHO) $(ECHO) "Makefile out-of-date with respect to $?"
$(NOECHO) $(ECHO) "Cleaning current config before rebuilding Makefile..."
-$(NOECHO) $(RM_F) $(MAKEFILE_OLD)
-$(NOECHO) $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD)
- $(MAKE) $(USEMAKEFILE) $(MAKEFILE_OLD) clean $(DEV_NULL)
$(PERLRUN) Makefile.PL
$(NOECHO) $(ECHO) "==> Your Makefile has been rebuilt. <=="
$(NOECHO) $(ECHO) "==> Please rerun the $(MAKE) command. <=="
$(FALSE)
# --- MakeMaker staticmake section:
# --- MakeMaker makeaperl section ---
MAP_TARGET = perl
FULLPERL = /usr/bin/perl
$(MAP_TARGET) :: static $(MAKE_APERL_FILE)
$(MAKE) $(USEMAKEFILE) $(MAKE_APERL_FILE) $@
$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE) pm_to_blib
$(NOECHO) $(ECHO) Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
$(NOECHO) $(PERLRUNINST) \
Makefile.PL DIR=DES:MD4 \
MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=
# --- MakeMaker test section:
TEST_VERBOSE=0
TEST_TYPE=test_$(LINKTYPE)
TEST_FILE = test.pl
TEST_FILES = t/*.t
TESTDB_SW = -d
testdb :: testdb_$(LINKTYPE)
test :: $(TEST_TYPE) subdirs-test
subdirs-test ::
$(NOECHO) $(NOOP)
subdirs-test ::
$(NOECHO) cd DES && $(MAKE) test $(PASTHRU)
subdirs-test ::
$(NOECHO) cd MD4 && $(MAKE) test $(PASTHRU)
test_dynamic :: pure_all
PERL_DL_NONLAZY=1 $(FULLPERLRUN) "-MExtUtils::Command::MM" "-e" "test_harness($(TEST_VERBOSE), '$(INST_LIB)', '$(INST_ARCHLIB)')" $(TEST_FILES)
testdb_dynamic :: pure_all
PERL_DL_NONLAZY=1 $(FULLPERLRUN) $(TESTDB_SW) "-I$(INST_LIB)" "-I$(INST_ARCHLIB)" $(TEST_FILE)
test_ : test_dynamic
test_static :: test_dynamic
testdb_static :: testdb_dynamic
# --- MakeMaker ppd section:
# Creates a PPD (Perl Package Description) for a binary distribution.
ppd :
$(NOECHO) $(ECHO) '<SOFTPKG NAME="$(DISTNAME)" VERSION="1.09">' > $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' <ABSTRACT></ABSTRACT>' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' <AUTHOR>David (Buzz) Bussenschutt &lt;davidbuzz@gmail.com&gt;, Mark Bush &lt;Mark.Bush@bushnet.demon.co.uk&gt;</AUTHOR>' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' <IMPLEMENTATION>' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' <REQUIRE NAME="Digest::HMAC_MD5" />' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' <REQUIRE NAME="MIME::Base64" />' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' <ARCHITECTURE NAME="i486-linux-gnu-thread-multi-5.10" />' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' <CODEBASE HREF="" />' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' </IMPLEMENTATION>' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) '</SOFTPKG>' >> $(DISTNAME).ppd
# --- MakeMaker pm_to_blib section:
pm_to_blib : $(FIRST_MAKEFILE) $(TO_INST_PM)
$(NOECHO) $(ABSPERLRUN) -MExtUtils::Install -e 'pm_to_blib({@ARGV}, '\''$(INST_LIB)/auto'\'', q[$(PM_FILTER)], '\''$(PERM_DIR)'\'')' -- \
NTLM.pm $(INST_LIB)/Authen/NTLM.pm
$(NOECHO) $(TOUCH) pm_to_blib
# --- MakeMaker selfdocument section:
# --- MakeMaker postamble section:
# End.

View file

@ -1,14 +0,0 @@
#!/usr/bin/perl
use ExtUtils::MakeMaker;
#
WriteMakefile(
'NAME' => 'Authen::NTLM',
'DIR' => ['DES', 'MD4'],
'VERSION_FROM' => 'NTLM.pm',
'PREREQ_PM' => { 'MIME::Base64' => 0, 'Digest::HMAC_MD5' => 0 },
($] >= 5.005 ? ## Add these new keywords supported since 5.005
('AUTHOR' => 'David (Buzz) Bussenschutt <davidbuzz@gmail.com>, Mark Bush <Mark.Bush@bushnet.demon.co.uk>') : ()),
);

View file

@ -1,511 +0,0 @@
#!/usr/local/bin/perl
package Authen::NTLM;
use strict;
use Authen::NTLM::DES;
use Authen::NTLM::MD4;
use MIME::Base64;
use Digest::HMAC_MD5;
use vars qw($VERSION @ISA @EXPORT);
require Exporter;
=head1 NAME
Authen::NTLM - An NTLM authentication module
=head1 SYNOPSIS
use Mail::IMAPClient;
use Authen::NTLM;
my $imap = Mail::IMAPClient->new(Server=>'imaphost');
ntlm_user($username);
ntlm_password($password);
$imap->authenticate("NTLM", Authen::NTLM::ntlm);
:
$imap->logout;
ntlm_reset;
:
or
ntlmv2(1);
ntlm_user($username);
ntlm_host($host);
ntlm_password($password);
:
or
my $ntlm = Authen::NTLM-> new(
host => $host,
user => $username,
domain => $domain,
password => $password,
version => 1,
);
$ntlm-> challenge;
:
$ntlm-> challenge($challenge);
=head1 DESCRIPTION
This module provides methods to use NTLM authentication. It can
be used as an authenticate method with the Mail::IMAPClient module
to perform the challenge/response mechanism for NTLM connections
or it can be used on its own for NTLM authentication with other
protocols (eg. HTTP).
The implementation is a direct port of the code from F<fetchmail>
which, itself, has based its NTLM implementation on F<samba>. As
such, this code is not especially efficient, however it will still
take a fraction of a second to negotiate a login on a PII which is
likely to be good enough for most situations.
=head2 FUNCTIONS
=over 4
=item ntlm_domain()
Set the domain to use in the NTLM authentication messages.
Returns the new domain. Without an argument, this function
returns the current domain entry.
=item ntlm_user()
Set the username to use in the NTLM authentication messages.
Returns the new username. Without an argument, this function
returns the current username entry.
=item ntlm_password()
Set the password to use in the NTLM authentication messages.
Returns the new password. Without an argument, this function
returns the current password entry.
=item ntlm_reset()
Resets the NTLM challenge/response state machine so that the next
call to C<ntlm()> will produce an initial connect message.
=item ntlm()
Generate a reply to a challenge. The NTLM protocol involves an
initial empty challenge from the server requiring a message
response containing the username and domain (which may be empty).
The first call to C<ntlm()> generates this first message ignoring
any arguments.
The second time it is called, it is assumed that the argument is
the challenge string sent from the server. This will contain 8
bytes of data which are used in the DES functions to generate the
response authentication strings. The result of the call is the
final authentication string.
If C<ntlm_reset()> is called, then the next call to C<ntlm()> will
start the process again allowing multiple authentications within
an application.
=item ntlmv2()
Use NTLM v2 authentication.
=back
=head2 OBJECT API
=over
=item new %options
Creates an object that accepts the following options: C<user>, C<host>,
C<domain>, C<password>, C<version>.
=item challenge [$challenge]
If C<$challenge> is not supplied, first-stage challenge string is generated.
Otherwise, the third-stage challenge is generated, where C<$challenge> is
assumed to be extracted from the second stage of NTLM exchange. The result of
the call is the final authentication string.
=back
=head1 AUTHOR
David (Buzz) Bussenschutt <davidbuzz@gmail.com> - current maintainer
Dmitry Karasik <dmitry@karasik.eu.org> - nice ntlmv2 patch, OO extensions.
Andrew Hobson <ahobson@infloop.com> - initial ntlmv2 code
Mark Bush <Mark.Bush@bushnet.demon.co.uk> - perl port
Eric S. Raymond - author of fetchmail
Andrew Tridgell and Jeremy Allison for SMB/Netbios code
=head1 SEE ALSO
L<perl>, L<Mail::IMAPClient>, L<LWP::Authen::Ntlm>
=head1 HISTORY
1.09 - fix CPAN ticket # 70703
1.08 - fix CPAN ticket # 39925
1.07 - not publicly released
1.06 - relicense as GPL+ or Artistic
1.05 - add OO interface by Dmitry Karasik
1.04 - implementation of NTLMv2 by Andrew Hobson/Dmitry Karasik
1.03 - fixes long-standing 1 line bug L<http://rt.cpan.org/Public/Bug/Display.html?id=9521> - released by David Bussenschutt 9th Aug 2007
1.02 - released by Mark Bush 29th Oct 2001
=cut
$VERSION = "1.09";
@ISA = qw(Exporter);
@EXPORT = qw(ntlm ntlm_domain ntlm_user ntlm_password ntlm_reset ntlm_host ntlmv2);
my $domain = "";
my $user = "";
my $password = "";
my $str_hdr = "vvV";
my $hdr_len = 8;
my $ident = "NTLMSSP";
my $msg1_f = 0x0000b207;
my $msg1 = "Z8VV";
my $msg1_hlen = 16 + ($hdr_len*2);
my $msg2 = "Z8Va${hdr_len}Va8a8a${hdr_len}";
my $msg2_hlen = 12 + $hdr_len + 20 + $hdr_len;
my $msg3 = "Z8V";
my $msg3_tl = "V";
my $msg3_hlen = 12 + ($hdr_len*6) + 4;
my $state = 0;
my $host = "";
my $ntlm_v2 = 0;
my $ntlm_v2_msg3_flags = 0x88205;
# Domain Name supplied on negotiate
use constant NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED => 0x00001000;
# Workstation Name supplied on negotiate
use constant NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED => 0x00002000;
# Try to use NTLMv2
use constant NTLMSSP_NEGOTIATE_NTLM2 => 0x00080000;
# Object API
sub new
{
my ( $class, %opt) = @_;
for (qw(domain user password host)) {
$opt{$_} = "" unless defined $opt{$_};
}
$opt{version} ||= 1;
return bless { %opt }, $class;
}
sub challenge
{
my ( $self, $challenge) = @_;
$state = defined $challenge;
($user,$domain,$password,$host) = @{$self}{qw(user domain password host)};
$ntlm_v2 = ($self-> {version} eq '2') ? 1 : 0;
return ntlm($challenge);
}
eval "sub $_ { \$#_ ? \$_[0]->{$_} = \$_[1] : \$_[0]->{$_} }"
for qw(user domain password host version);
# Function API
sub ntlm_domain
{
if (@_)
{
$domain = shift;
}
return $domain;
}
sub ntlm_user
{
if (@_)
{
$user = shift;
}
return $user;
}
sub ntlm_password
{
if (@_)
{
$password = shift;
}
return $password;
}
sub ntlm_reset
{
$state = 0;
}
sub ntlmv2
{
if (@_) {
$ntlm_v2 = shift;
}
return $ntlm_v2;
}
sub ntlm_host {
if (@_) {
$host = shift;
}
return $host;
}
sub ntlm
{
my ($challenge) = @_;
my ($flags, $user_hdr, $domain_hdr,
$u_off, $d_off, $c_info, $lmResp, $ntResp, $lm_hdr,
$nt_hdr, $wks_hdr, $session_hdr, $lm_off, $nt_off,
$wks_off, $s_off, $u_user, $msg1_host, $host_hdr, $u_host);
my $response;
if ($state)
{
$challenge =~ s/^\s*//;
$challenge = decode_base64($challenge);
$c_info = &decode_challenge($challenge);
$u_user = &unicode($user);
if (!$ntlm_v2) {
$domain = substr($challenge, $c_info->{domain}{offset}, $c_info->{domain}{len});
$lmResp = &lmEncrypt($c_info->{data});
$ntResp = &ntEncrypt($c_info->{data});
$flags = pack($msg3_tl, $c_info->{flags});
}
elsif ($ntlm_v2 eq '1') {
$lmResp = &lmv2Encrypt($c_info->{data});
$ntResp = &ntv2Encrypt($c_info->{data}, $c_info->{target_data});
$flags = pack($msg3_tl, $ntlm_v2_msg3_flags);
}
else {
$domain = &unicode($domain);#substr($challenge, $c_info->{domain}{offset}, $c_info->{domain}{len});
$lmResp = &lmEncrypt($c_info->{data});
$ntResp = &ntEncrypt($c_info->{data});
$flags = pack($msg3_tl, $c_info->{flags});
}
$u_host = &unicode(($host ? $host : $user));
$response = pack($msg3, $ident, 3);
$lm_off = $msg3_hlen;
$nt_off = $lm_off + length($lmResp);
$d_off = $nt_off + length($ntResp);
$u_off = $d_off + length($domain);
$wks_off = $u_off + length($u_user);
$s_off = $wks_off + length($u_host);
$lm_hdr = &hdr($lmResp, $msg3_hlen, $lm_off);
$nt_hdr = &hdr($ntResp, $msg3_hlen, $nt_off);
$domain_hdr = &hdr($domain, $msg3_hlen, $d_off);
$user_hdr = &hdr($u_user, $msg3_hlen, $u_off);
$wks_hdr = &hdr($u_host, $msg3_hlen, $wks_off);
$session_hdr = &hdr("", $msg3_hlen, $s_off);
$response .= $lm_hdr . $nt_hdr . $domain_hdr . $user_hdr .
$wks_hdr . $session_hdr . $flags .
$lmResp . $ntResp . $domain . $u_user . $u_host;
}
else # first response;
{
my $f = $msg1_f;
if (!length $domain) {
$f &= ~NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED;
}
$msg1_host = $user;
if ($ntlm_v2 and $ntlm_v2 eq '1') {
$f &= ~NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED;
$f |= NTLMSSP_NEGOTIATE_NTLM2;
$msg1_host = "";
}
$response = pack($msg1, $ident, 1, $f);
$u_off = $msg1_hlen;
$d_off = $u_off + length($msg1_host);
$host_hdr = &hdr($msg1_host, $msg1_hlen, $u_off);
$domain_hdr = &hdr($domain, $msg1_hlen, $d_off);
$response .= $host_hdr . $domain_hdr . $msg1_host . $domain;
$state = 1;
}
return encode_base64($response, "");
}
sub hdr
{
my ($string, $h_len, $offset) = @_;
my ($res, $len);
$len = length($string);
if ($string)
{
$res = pack($str_hdr, $len, $len, $offset);
}
else
{
$res = pack($str_hdr, 0, 0, $offset - $h_len);
}
return $res;
}
sub decode_challenge
{
my ($challenge) = @_;
my $res;
my (@res, @hdr);
my $original = $challenge;
$res->{buffer} = $msg2_hlen < length $challenge
? substr($challenge, $msg2_hlen) : '';
$challenge = substr($challenge, 0, $msg2_hlen);
@res = unpack($msg2, $challenge);
$res->{ident} = $res[0];
$res->{type} = $res[1];
@hdr = unpack($str_hdr, $res[2]);
$res->{domain}{len} = $hdr[0];
$res->{domain}{maxlen} = $hdr[1];
$res->{domain}{offset} = $hdr[2];
$res->{flags} = $res[3];
$res->{data} = $res[4];
$res->{reserved} = $res[5];
$res->{empty_hdr} = $res[6];
@hdr = unpack($str_hdr, $res[6]);
$res->{target}{len} = $hdr[0];
$res->{target}{maxlen} = $hdr[1];
$res->{target}{offset} = $hdr[2];
$res->{target_data} = substr($original, $hdr[2], $hdr[1]);
return $res;
}
sub unicode
{
my ($string) = @_;
my ($reply, $c, $z) = ('');
$z = sprintf "%c", 0;
foreach $c (split //, $string)
{
$reply .= $c . $z;
}
return $reply;
}
sub NTunicode
{
my ($string) = @_;
my ($reply, $c);
foreach $c (map {ord($_)} split(//, $string))
{
$reply .= pack("v", $c);
}
return $reply;
}
sub lmEncrypt
{
my ($data) = @_;
my $p14 = substr($password, 0, 14);
$p14 =~ tr/a-z/A-Z/;
$p14 .= "\0"x(14-length($p14));
my $p21 = E_P16($p14);
$p21 .= "\0"x(21-length($p21));
my $p24 = E_P24($p21, $data);
return $p24;
}
sub ntEncrypt
{
my ($data) = @_;
my $p21 = &E_md4hash;
$p21 .= "\0"x(21-length($p21));
my $p24 = E_P24($p21, $data);
return $p24;
}
sub E_md4hash
{
my $wpwd = &NTunicode($password);
my $p16 = mdfour($wpwd);
return $p16;
}
sub lmv2Encrypt {
my ($data) = @_;
my $u_pass = &unicode($password);
my $ntlm_hash = mdfour($u_pass);
my $u_user = &unicode("\U$user\E");
my $u_domain = &unicode("$domain");
my $concat = $u_user . $u_domain;
my $hmac = Digest::HMAC_MD5->new($ntlm_hash);
$hmac->add($concat);
my $ntlm_v2_hash = $hmac->digest;
# Firefox seems to use this as its random challenge
my $random_challenge = "\0" x 8;
my $concat2 = $data . $random_challenge;
$hmac = Digest::HMAC_MD5->new($ntlm_v2_hash);
$hmac->add(substr($data, 0, 8) . $random_challenge);
my $r = $hmac->digest . $random_challenge;
return $r;
}
sub ntv2Encrypt {
my ($data, $target) = @_;
my $u_pass = &unicode($password);
my $ntlm_hash = mdfour($u_pass);
my $u_user = &unicode("\U$user\E");
my $u_domain = &unicode("$domain");
my $concat = $u_user . $u_domain;
my $hmac = Digest::HMAC_MD5->new($ntlm_hash);
$hmac->add($concat);
my $ntlm_v2_hash = $hmac->digest;
my $zero_long = "\000" x 4;
my $sig = pack("H8", "01010000");
my $time = pack("VV", (time + 11644473600) + 10000000);
my $rand = "\0" x 8;
my $blob = $sig . $zero_long . $time . $rand . $zero_long .
$target . $zero_long;
$concat = $data . $blob;
$hmac = Digest::HMAC_MD5->new($ntlm_v2_hash);
$hmac->add($concat);
my $d = $hmac->digest;
my $r = $d . $blob;
return $r;
}
1;

View file

@ -1,104 +0,0 @@
NTLM Authentication Scheme
==========================
This module implements the NTLM authentication mechanism. It can be
used to perform NTLM style authentication for any desired protocol.
The module works well with the Mail::IMAPClient module in the
"authenticate" method, however I had to make a change to that method
for it to work. The following line (2511 in version 2.1.4):
($code) = $o->[DATA] =~ /^\+ (.*)$/ ;
needed to be changed to:
($code) = $o->[DATA] =~ /^\+(.*)$/ ;
as the initial NTLM challenge is empty.
This module also works well with LWP::Authen::Ntlm , allowing LWP::UserAgent
and/or WWW::Mechanise to automate/browse/fetch/etc remote Microsoft Windows
servers running NTLM authentication.
Example use is like this(note the fact that NTLM.pm is NOT explicitly used!):
use WWW::Mechanize;
$mech = WWW::Mechanize->new(keep_alive=>1);
$mech->no_proxy('my.server');
$mech->credentials('my.server:80', '', "my_domain\\my_user", my_pass);
$response = $mech->get( $url );
INSTALLATION
To install this application:
perl Makefile.PL
make
make test
make install
DEPENDENCIES
This module requires the MIME::Base64 module, and Digest::HMAC_MD5
COPYRIGHT AND LICENSE
This program is free software; you can redistribute it and/or modify
it under the terms of either:
a) the GNU General Public License as published by the Free
Software Foundation; either version 1, or (at your option) any
later version, or
b) the "Artistic License" which comes with this Kit.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See either
the GNU General Public License or the Artistic License for more details.
You should have received a copy of the Artistic License with this
Kit, in the file named "COPYING-Artistic". If not, I'll be glad to provide one.
You should also have received a copy of the GNU General Public License version 1
along with this program in the file named "COPYING-GPL". If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA or visit their web page on the internet at
http://www.gnu.org/copyleft/gpl.html.
For those of you that choose to use the GNU General Public License,
my interpretation of the GNU General Public License is that no Perl
script falls under the terms of the GPL unless you explicitly put
said script under the terms of the GPL yourself. Furthermore, any
object code linked with perl does not automatically fall under the
terms of the GPL, provided such object code only adds definitions
of subroutines and variables, and does not otherwise impair the
resulting interpreter from executing any standard Perl script. I
consider linking in C subroutines in this manner to be the moral
equivalent of defining subroutines in the Perl language itself. You
may sell such an object file as proprietary provided that you provide
or offer to provide the Perl source, as specified by the GNU General
Public License. (This is merely an alternate way of specifying input
to the program.) You may also sell a binary produced by the dumping of
a running Perl script that belongs to you, provided that you provide or
offer to provide the Perl source as specified by the GPL. (The
fact that a Perl interpreter and your code are in the same binary file
is, in this case, a form of mere aggregation.) This is my interpretation
of the GPL. If you still have concerns or difficulties understanding
my intent, feel free to contact me. Of course, the Artistic License
spells all this out for your protection, so you may prefer to use that.
License clarified by Nick Bebout per email from David Bussenschutt.
<nb@fedoraproject.org>
Parts of this code Copyright (C) 2007 David (Buzz) Bussenschutt.
<davidbuzz@gmail.com>
Perl port of this code is Copyright (C) 2001 Mark Bush.
<Mark.Bush@bushnet.demon.co.uk>
The code is originally based on fetchmail code which is Copyright (C) 1997 Eric
S. Raymond.
Fetchmail uses SMB/Netbios code from samba which is Copyright (C)
Andrew Tridgell 1992-1998 with modifications from Jeremy Allison.

View file

@ -1,511 +0,0 @@
#!/usr/local/bin/perl
package Authen::NTLM;
use strict;
use Authen::NTLM::DES;
use Authen::NTLM::MD4;
use MIME::Base64;
use Digest::HMAC_MD5;
use vars qw($VERSION @ISA @EXPORT);
require Exporter;
=head1 NAME
Authen::NTLM - An NTLM authentication module
=head1 SYNOPSIS
use Mail::IMAPClient;
use Authen::NTLM;
my $imap = Mail::IMAPClient->new(Server=>'imaphost');
ntlm_user($username);
ntlm_password($password);
$imap->authenticate("NTLM", Authen::NTLM::ntlm);
:
$imap->logout;
ntlm_reset;
:
or
ntlmv2(1);
ntlm_user($username);
ntlm_host($host);
ntlm_password($password);
:
or
my $ntlm = Authen::NTLM-> new(
host => $host,
user => $username,
domain => $domain,
password => $password,
version => 1,
);
$ntlm-> challenge;
:
$ntlm-> challenge($challenge);
=head1 DESCRIPTION
This module provides methods to use NTLM authentication. It can
be used as an authenticate method with the Mail::IMAPClient module
to perform the challenge/response mechanism for NTLM connections
or it can be used on its own for NTLM authentication with other
protocols (eg. HTTP).
The implementation is a direct port of the code from F<fetchmail>
which, itself, has based its NTLM implementation on F<samba>. As
such, this code is not especially efficient, however it will still
take a fraction of a second to negotiate a login on a PII which is
likely to be good enough for most situations.
=head2 FUNCTIONS
=over 4
=item ntlm_domain()
Set the domain to use in the NTLM authentication messages.
Returns the new domain. Without an argument, this function
returns the current domain entry.
=item ntlm_user()
Set the username to use in the NTLM authentication messages.
Returns the new username. Without an argument, this function
returns the current username entry.
=item ntlm_password()
Set the password to use in the NTLM authentication messages.
Returns the new password. Without an argument, this function
returns the current password entry.
=item ntlm_reset()
Resets the NTLM challenge/response state machine so that the next
call to C<ntlm()> will produce an initial connect message.
=item ntlm()
Generate a reply to a challenge. The NTLM protocol involves an
initial empty challenge from the server requiring a message
response containing the username and domain (which may be empty).
The first call to C<ntlm()> generates this first message ignoring
any arguments.
The second time it is called, it is assumed that the argument is
the challenge string sent from the server. This will contain 8
bytes of data which are used in the DES functions to generate the
response authentication strings. The result of the call is the
final authentication string.
If C<ntlm_reset()> is called, then the next call to C<ntlm()> will
start the process again allowing multiple authentications within
an application.
=item ntlmv2()
Use NTLM v2 authentication.
=back
=head2 OBJECT API
=over
=item new %options
Creates an object that accepts the following options: C<user>, C<host>,
C<domain>, C<password>, C<version>.
=item challenge [$challenge]
If C<$challenge> is not supplied, first-stage challenge string is generated.
Otherwise, the third-stage challenge is generated, where C<$challenge> is
assumed to be extracted from the second stage of NTLM exchange. The result of
the call is the final authentication string.
=back
=head1 AUTHOR
David (Buzz) Bussenschutt <davidbuzz@gmail.com> - current maintainer
Dmitry Karasik <dmitry@karasik.eu.org> - nice ntlmv2 patch, OO extensions.
Andrew Hobson <ahobson@infloop.com> - initial ntlmv2 code
Mark Bush <Mark.Bush@bushnet.demon.co.uk> - perl port
Eric S. Raymond - author of fetchmail
Andrew Tridgell and Jeremy Allison for SMB/Netbios code
=head1 SEE ALSO
L<perl>, L<Mail::IMAPClient>, L<LWP::Authen::Ntlm>
=head1 HISTORY
1.09 - fix CPAN ticket # 70703
1.08 - fix CPAN ticket # 39925
1.07 - not publicly released
1.06 - relicense as GPL+ or Artistic
1.05 - add OO interface by Dmitry Karasik
1.04 - implementation of NTLMv2 by Andrew Hobson/Dmitry Karasik
1.03 - fixes long-standing 1 line bug L<http://rt.cpan.org/Public/Bug/Display.html?id=9521> - released by David Bussenschutt 9th Aug 2007
1.02 - released by Mark Bush 29th Oct 2001
=cut
$VERSION = "1.09";
@ISA = qw(Exporter);
@EXPORT = qw(ntlm ntlm_domain ntlm_user ntlm_password ntlm_reset ntlm_host ntlmv2);
my $domain = "";
my $user = "";
my $password = "";
my $str_hdr = "vvV";
my $hdr_len = 8;
my $ident = "NTLMSSP";
my $msg1_f = 0x0000b207;
my $msg1 = "Z8VV";
my $msg1_hlen = 16 + ($hdr_len*2);
my $msg2 = "Z8Va${hdr_len}Va8a8a${hdr_len}";
my $msg2_hlen = 12 + $hdr_len + 20 + $hdr_len;
my $msg3 = "Z8V";
my $msg3_tl = "V";
my $msg3_hlen = 12 + ($hdr_len*6) + 4;
my $state = 0;
my $host = "";
my $ntlm_v2 = 0;
my $ntlm_v2_msg3_flags = 0x88205;
# Domain Name supplied on negotiate
use constant NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED => 0x00001000;
# Workstation Name supplied on negotiate
use constant NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED => 0x00002000;
# Try to use NTLMv2
use constant NTLMSSP_NEGOTIATE_NTLM2 => 0x00080000;
# Object API
sub new
{
my ( $class, %opt) = @_;
for (qw(domain user password host)) {
$opt{$_} = "" unless defined $opt{$_};
}
$opt{version} ||= 1;
return bless { %opt }, $class;
}
sub challenge
{
my ( $self, $challenge) = @_;
$state = defined $challenge;
($user,$domain,$password,$host) = @{$self}{qw(user domain password host)};
$ntlm_v2 = ($self-> {version} eq '2') ? 1 : 0;
return ntlm($challenge);
}
eval "sub $_ { \$#_ ? \$_[0]->{$_} = \$_[1] : \$_[0]->{$_} }"
for qw(user domain password host version);
# Function API
sub ntlm_domain
{
if (@_)
{
$domain = shift;
}
return $domain;
}
sub ntlm_user
{
if (@_)
{
$user = shift;
}
return $user;
}
sub ntlm_password
{
if (@_)
{
$password = shift;
}
return $password;
}
sub ntlm_reset
{
$state = 0;
}
sub ntlmv2
{
if (@_) {
$ntlm_v2 = shift;
}
return $ntlm_v2;
}
sub ntlm_host {
if (@_) {
$host = shift;
}
return $host;
}
sub ntlm
{
my ($challenge) = @_;
my ($flags, $user_hdr, $domain_hdr,
$u_off, $d_off, $c_info, $lmResp, $ntResp, $lm_hdr,
$nt_hdr, $wks_hdr, $session_hdr, $lm_off, $nt_off,
$wks_off, $s_off, $u_user, $msg1_host, $host_hdr, $u_host);
my $response;
if ($state)
{
$challenge =~ s/^\s*//;
$challenge = decode_base64($challenge);
$c_info = &decode_challenge($challenge);
$u_user = &unicode($user);
if (!$ntlm_v2) {
$domain = substr($challenge, $c_info->{domain}{offset}, $c_info->{domain}{len});
$lmResp = &lmEncrypt($c_info->{data});
$ntResp = &ntEncrypt($c_info->{data});
$flags = pack($msg3_tl, $c_info->{flags});
}
elsif ($ntlm_v2 eq '1') {
$lmResp = &lmv2Encrypt($c_info->{data});
$ntResp = &ntv2Encrypt($c_info->{data}, $c_info->{target_data});
$flags = pack($msg3_tl, $ntlm_v2_msg3_flags);
}
else {
$domain = &unicode($domain);#substr($challenge, $c_info->{domain}{offset}, $c_info->{domain}{len});
$lmResp = &lmEncrypt($c_info->{data});
$ntResp = &ntEncrypt($c_info->{data});
$flags = pack($msg3_tl, $c_info->{flags});
}
$u_host = &unicode(($host ? $host : $user));
$response = pack($msg3, $ident, 3);
$lm_off = $msg3_hlen;
$nt_off = $lm_off + length($lmResp);
$d_off = $nt_off + length($ntResp);
$u_off = $d_off + length($domain);
$wks_off = $u_off + length($u_user);
$s_off = $wks_off + length($u_host);
$lm_hdr = &hdr($lmResp, $msg3_hlen, $lm_off);
$nt_hdr = &hdr($ntResp, $msg3_hlen, $nt_off);
$domain_hdr = &hdr($domain, $msg3_hlen, $d_off);
$user_hdr = &hdr($u_user, $msg3_hlen, $u_off);
$wks_hdr = &hdr($u_host, $msg3_hlen, $wks_off);
$session_hdr = &hdr("", $msg3_hlen, $s_off);
$response .= $lm_hdr . $nt_hdr . $domain_hdr . $user_hdr .
$wks_hdr . $session_hdr . $flags .
$lmResp . $ntResp . $domain . $u_user . $u_host;
}
else # first response;
{
my $f = $msg1_f;
if (!length $domain) {
$f &= ~NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED;
}
$msg1_host = $user;
if ($ntlm_v2 and $ntlm_v2 eq '1') {
$f &= ~NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED;
$f |= NTLMSSP_NEGOTIATE_NTLM2;
$msg1_host = "";
}
$response = pack($msg1, $ident, 1, $f);
$u_off = $msg1_hlen;
$d_off = $u_off + length($msg1_host);
$host_hdr = &hdr($msg1_host, $msg1_hlen, $u_off);
$domain_hdr = &hdr($domain, $msg1_hlen, $d_off);
$response .= $host_hdr . $domain_hdr . $msg1_host . $domain;
$state = 1;
}
return encode_base64($response, "");
}
sub hdr
{
my ($string, $h_len, $offset) = @_;
my ($res, $len);
$len = length($string);
if ($string)
{
$res = pack($str_hdr, $len, $len, $offset);
}
else
{
$res = pack($str_hdr, 0, 0, $offset - $h_len);
}
return $res;
}
sub decode_challenge
{
my ($challenge) = @_;
my $res;
my (@res, @hdr);
my $original = $challenge;
$res->{buffer} = $msg2_hlen < length $challenge
? substr($challenge, $msg2_hlen) : '';
$challenge = substr($challenge, 0, $msg2_hlen);
@res = unpack($msg2, $challenge);
$res->{ident} = $res[0];
$res->{type} = $res[1];
@hdr = unpack($str_hdr, $res[2]);
$res->{domain}{len} = $hdr[0];
$res->{domain}{maxlen} = $hdr[1];
$res->{domain}{offset} = $hdr[2];
$res->{flags} = $res[3];
$res->{data} = $res[4];
$res->{reserved} = $res[5];
$res->{empty_hdr} = $res[6];
@hdr = unpack($str_hdr, $res[6]);
$res->{target}{len} = $hdr[0];
$res->{target}{maxlen} = $hdr[1];
$res->{target}{offset} = $hdr[2];
$res->{target_data} = substr($original, $hdr[2], $hdr[1]);
return $res;
}
sub unicode
{
my ($string) = @_;
my ($reply, $c, $z) = ('');
$z = sprintf "%c", 0;
foreach $c (split //, $string)
{
$reply .= $c . $z;
}
return $reply;
}
sub NTunicode
{
my ($string) = @_;
my ($reply, $c);
foreach $c (map {ord($_)} split(//, $string))
{
$reply .= pack("v", $c);
}
return $reply;
}
sub lmEncrypt
{
my ($data) = @_;
my $p14 = substr($password, 0, 14);
$p14 =~ tr/a-z/A-Z/;
$p14 .= "\0"x(14-length($p14));
my $p21 = E_P16($p14);
$p21 .= "\0"x(21-length($p21));
my $p24 = E_P24($p21, $data);
return $p24;
}
sub ntEncrypt
{
my ($data) = @_;
my $p21 = &E_md4hash;
$p21 .= "\0"x(21-length($p21));
my $p24 = E_P24($p21, $data);
return $p24;
}
sub E_md4hash
{
my $wpwd = &NTunicode($password);
my $p16 = mdfour($wpwd);
return $p16;
}
sub lmv2Encrypt {
my ($data) = @_;
my $u_pass = &unicode($password);
my $ntlm_hash = mdfour($u_pass);
my $u_user = &unicode("\U$user\E");
my $u_domain = &unicode("$domain");
my $concat = $u_user . $u_domain;
my $hmac = Digest::HMAC_MD5->new($ntlm_hash);
$hmac->add($concat);
my $ntlm_v2_hash = $hmac->digest;
# Firefox seems to use this as its random challenge
my $random_challenge = "\0" x 8;
my $concat2 = $data . $random_challenge;
$hmac = Digest::HMAC_MD5->new($ntlm_v2_hash);
$hmac->add(substr($data, 0, 8) . $random_challenge);
my $r = $hmac->digest . $random_challenge;
return $r;
}
sub ntv2Encrypt {
my ($data, $target) = @_;
my $u_pass = &unicode($password);
my $ntlm_hash = mdfour($u_pass);
my $u_user = &unicode("\U$user\E");
my $u_domain = &unicode("$domain");
my $concat = $u_user . $u_domain;
my $hmac = Digest::HMAC_MD5->new($ntlm_hash);
$hmac->add($concat);
my $ntlm_v2_hash = $hmac->digest;
my $zero_long = "\000" x 4;
my $sig = pack("H8", "01010000");
my $time = pack("VV", (time + 11644473600) + 10000000);
my $rand = "\0" x 8;
my $blob = $sig . $zero_long . $time . $rand . $zero_long .
$target . $zero_long;
$concat = $data . $blob;
$hmac = Digest::HMAC_MD5->new($ntlm_v2_hash);
$hmac->add($concat);
my $d = $hmac->digest;
my $r = $d . $blob;
return $r;
}
1;

View file

@ -1,294 +0,0 @@
#!/usr/local/bin/perl
#
# This is an implementation of part of the DES specification. According
# to the code this is ported from, this code does NOT enable 2-way
# encryption and is, hence, not a cypher and does not appear to come
# under any export restrictions on such.
#
package Authen::NTLM::DES;
use vars qw($VERSION @ISA @EXPORT);
require Exporter;
$VERSION = "1.02";
@ISA = qw(Exporter);
@EXPORT = qw(E_P16 E_P24);
my ($loop, $loop2);
$loop = 0;
$loop2 = 0;
my $perm1 = [57, 49, 41, 33, 25, 17, 9,
1, 58, 50, 42, 34, 26, 18,
10, 2, 59, 51, 43, 35, 27,
19, 11, 3, 60, 52, 44, 36,
63, 55, 47, 39, 31, 23, 15,
7, 62, 54, 46, 38, 30, 22,
14, 6, 61, 53, 45, 37, 29,
21, 13, 5, 28, 20, 12, 4];
my $perm2 = [14, 17, 11, 24, 1, 5,
3, 28, 15, 6, 21, 10,
23, 19, 12, 4, 26, 8,
16, 7, 27, 20, 13, 2,
41, 52, 31, 37, 47, 55,
30, 40, 51, 45, 33, 48,
44, 49, 39, 56, 34, 53,
46, 42, 50, 36, 29, 32];
my $perm3 = [58, 50, 42, 34, 26, 18, 10, 2,
60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14, 6,
64, 56, 48, 40, 32, 24, 16, 8,
57, 49, 41, 33, 25, 17, 9, 1,
59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5,
63, 55, 47, 39, 31, 23, 15, 7];
my $perm4 = [32, 1, 2, 3, 4, 5,
4, 5, 6, 7, 8, 9,
8, 9, 10, 11, 12, 13,
12, 13, 14, 15, 16, 17,
16, 17, 18, 19, 20, 21,
20, 21, 22, 23, 24, 25,
24, 25, 26, 27, 28, 29,
28, 29, 30, 31, 32, 1];
my $perm5 = [16, 7, 20, 21, 29, 12, 28, 17,
1, 15, 23, 26, 5, 18, 31, 10,
2, 8, 24, 14, 32, 27, 3, 9,
19, 13, 30, 6, 22, 11, 4, 25];
my $perm6 = [40, 8, 48, 16, 56, 24, 64, 32,
39, 7, 47, 15, 55, 23, 63, 31,
38, 6, 46, 14, 54, 22, 62, 30,
37, 5, 45, 13, 53, 21, 61, 29,
36, 4, 44, 12, 52, 20, 60, 28,
35, 3, 43, 11, 51, 19, 59, 27,
34, 2, 42, 10, 50, 18, 58, 26,
33, 1, 41, 9, 49, 17, 57, 25];
my $sc = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1];
my $sbox = [
[
[14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7],
[0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8],
[4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0],
[15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13]
],
[
[15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10],
[3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5],
[0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15],
[13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9]
],
[
[10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8],
[13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1],
[13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7],
[1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12]
],
[
[7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15],
[13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9],
[10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4],
[3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14]
],
[
[2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9],
[14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6],
[4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14],
[11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3]
],
[
[12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11],
[10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8],
[9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6],
[4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13]
],
[
[4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1],
[13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6],
[1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2],
[6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12]
],
[
[13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7],
[1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2],
[7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8],
[2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11]
]
];
sub E_P16
{
my ($p14) = @_;
my $sp8 = [0x4b, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25];
my $p7 = substr($p14, 0, 7);
my $p16 = smbhash($sp8, $p7);
$p7 = substr($p14, 7, 7);
$p16 .= smbhash($sp8, $p7);
return $p16;
}
sub E_P24
{
my ($p21, $c8_str) = @_;
my @c8 = map {ord($_)} split(//, $c8_str);
my $p24 = smbhash(\@c8, substr($p21, 0, 7));
$p24 .= smbhash(\@c8, substr($p21, 7, 7));
$p24 .= smbhash(\@c8, substr($p21, 14, 7));
}
sub permute
{
my ($out, $in, $p, $n) = @_;
my $i;
foreach $i (0..($n-1))
{
$out->[$i] = $in->[$p->[$i]-1];
}
}
sub lshift
{
my ($d, $count, $n) = @_;
my (@out, $i);
foreach $i (0..($n-1))
{
$out[$i] = $d->[($i+$count)%$n];
}
foreach $i (0..($n-1))
{
$d->[$i] = $out[$i];
}
}
sub xor
{
my ($out, $in1, $in2, $n) = @_;
my $i;
foreach $i (0..($n-1))
{
$out->[$i] = $in1->[$i]^$in2->[$i];
}
}
sub dohash
{
my ($out, $in, $key) = @_;
my ($i, $j, $k, @pk1, @c, @d, @cd,
@ki, @pd1, @l, @r, @rl);
&permute(\@pk1, $key, $perm1, 56);
foreach $i (0..27)
{
$c[$i] = $pk1[$i];
$d[$i] = $pk1[$i+28];
}
foreach $i (0..15)
{
my @array;
&lshift(\@c, $sc->[$i], 28);
&lshift(\@d, $sc->[$i], 28);
@cd = (@c, @d);
&permute(\@array, \@cd, $perm2, 48);
$ki[$i] = \@array;
}
&permute(\@pd1, $in, $perm3, 64);
foreach $j (0..31)
{
$l[$j] = $pd1[$j];
$r[$j] = $pd1[$j+32];
}
foreach $i (0..15)
{
local (@er, @erk, @b, @cb, @pcb, @r2);
permute(\@er, \@r, $perm4, 48);
&xor(\@erk, \@er, $ki[$i], 48);
foreach $j (0..7)
{
foreach $k (0..5)
{
$b[$j][$k] = $erk[$j*6+$k];
}
}
foreach $j (0..7)
{
local ($m, $n);
$m = ($b[$j][0]<<1) | $b[$j][5];
$n = ($b[$j][1]<<3) | ($b[$j][2]<<2) | ($b[$j][3]<<1) | $b[$j][4];
foreach $k (0..3)
{
$b[$j][$k] = ($sbox->[$j][$m][$n] & (1<<(3-$k)))? 1: 0;
}
}
foreach $j (0..7)
{
foreach $k (0..3)
{
$cb[$j*4+$k] = $b[$j][$k];
}
}
&permute(\@pcb, \@cb, $perm5, 32);
&xor(\@r2, \@l, \@pcb, 32);
foreach $j (0..31)
{
$l[$j] = $r[$j];
$r[$j] = $r2[$j];
}
}
@rl = (@r, @l);
&permute($out, \@rl, $perm6, 64);
}
sub str_to_key
{
my ($str) = @_;
my $i;
my @key;
my $out;
my @str = map {ord($_)} split(//, $str);
$key[0] = $str[0]>>1;
$key[1] = (($str[0]&0x01)<<6) | ($str[1]>>2);
$key[2] = (($str[1]&0x03)<<5) | ($str[2]>>3);
$key[3] = (($str[2]&0x07)<<4) | ($str[3]>>4);
$key[4] = (($str[3]&0x0f)<<3) | ($str[4]>>5);
$key[5] = (($str[4]&0x1f)<<2) | ($str[5]>>6);
$key[6] = (($str[5]&0x3f)<<1) | ($str[6]>>7);
$key[7] = $str[6]&0x7f;
foreach $i (0..7)
{
$key[$i] = 0xff&($key[$i]<<1);
}
return \@key;
}
sub smbhash
{
my ($in, $key) = @_;
my $key2 = &str_to_key($key);
my ($i, $div, $mod, @in, @outb, @inb, @keyb, @out);
foreach $i (0..63)
{
$div = int($i/8); $mod = $i%8;
$inb[$i] = ($in->[$div] & (1<<(7-($mod))))? 1: 0;
$keyb[$i] = ($key2->[$div] & (1<<(7-($mod))))? 1: 0;
$outb[$i] = 0;
}
&dohash(\@outb, \@inb, \@keyb);
foreach $i (0..7)
{
$out[$i] = 0;
}
foreach $i (0..63)
{
$out[int($i/8)] |= (1<<(7-($i%8))) if ($outb[$i]);
}
my $out = pack("C8", @out);
return $out;
}
1;

View file

@ -1,197 +0,0 @@
#!/usr/local/bin/perl
#
# This is a partial implentation of the MD4 checksum code.
#
# NOTE
#
# The function &add() in this module is required as we need to be
# able to add 32bit integers ignoring overflow. The C code this is
# based on does this because it uses the underlying hardware to
# perform the required addition however we need to be more careful
# as Perl will overflow an int and produce a result of 0xffffffff
# which is not very useful. The &add() function splits its arguments
# into two shorts and adds these carrying overflow from the low short
# to the high short and ignoring carry from the high short. Not
# exactly efficient, but it works and is fast enough for the purposes
# of this implementation
#
package Authen::NTLM::MD4;
use vars qw($VERSION @ISA @EXPORT);
require Exporter;
$VERSION = "1.02";
@ISA = qw(Exporter);
@EXPORT = qw(mdfour);
my ($A, $B, $C, $D);
my (@X, $M);
sub mdfour
{
my ($in) = @_;
my ($i, $pos);
my $len = length($in);
my $b = $len * 8;
$in .= "\0"x128;
$A = 0x67452301;
$B = 0xefcdab89;
$C = 0x98badcfe;
$D = 0x10325476;
$pos = 0;
while ($len > 64)
{
&copy64(substr($in, $pos, 64));
&mdfour64;
$pos += 64;
$len -= 64;
}
my $buf = substr($in, $pos, $len);
$buf .= sprintf "%c", 0x80;
if ($len <= 55)
{
$buf .= "\0"x(55-$len);
$buf .= pack("V", $b);
$buf .= "\0"x4;
&copy64($buf);
&mdfour64;
}
else
{
$buf .= "\0"x(120-$len);
$buf .= pack("V", $b);
$buf .= "\0"x4;
&copy64(substr($buf, 0, 64));
&mdfour64;
&copy64(substr($buf, 64, 64));
&mdfour64;
}
my $out = pack("VVVV", $A, $B, $C, $D);
return $out;
}
sub F
{
my ($X, $Y, $Z) = @_;
my $res = ($X&$Y) | ((~$X)&$Z);
return $res;
}
sub G
{
my ($X, $Y, $Z) = @_;
return ($X&$Y) | ($X&$Z) | ($Y&$Z);
}
sub H
{
my ($X, $Y, $Z) = @_;
return $X^$Y^$Z;
}
sub lshift
{
my ($x, $s) = @_;
$x &= 0xffffffff;
return (($x<<$s)&0xffffffff) | ($x>>(32-$s));
}
sub ROUND1
{
my ($a, $b, $c, $d, $k, $s) = @_;
my $e = &add($a, &F($b, $c, $d), $X[$k]);
return &lshift($e, $s);
}
sub ROUND2
{
my ($a, $b, $c, $d, $k, $s) = @_;
my $e = &add($a, &G($b, $c, $d), $X[$k], 0x5a827999);
return &lshift($e, $s);
}
sub ROUND3
{
my ($a, $b, $c, $d, $k, $s) = @_;
my $e = &add($a, &H($b, $c, $d), $X[$k], 0x6ed9eba1);
return &lshift($e, $s);
}
sub mdfour64
{
my ($i, $AA, $BB, $CC, $DD);
@X = unpack("N16", $M);
$AA = $A;
$BB = $B;
$CC = $C;
$DD = $D;
$A = &ROUND1($A,$B,$C,$D, 0, 3); $D = &ROUND1($D,$A,$B,$C, 1, 7);
$C = &ROUND1($C,$D,$A,$B, 2,11); $B = &ROUND1($B,$C,$D,$A, 3,19);
$A = &ROUND1($A,$B,$C,$D, 4, 3); $D = &ROUND1($D,$A,$B,$C, 5, 7);
$C = &ROUND1($C,$D,$A,$B, 6,11); $B = &ROUND1($B,$C,$D,$A, 7,19);
$A = &ROUND1($A,$B,$C,$D, 8, 3); $D = &ROUND1($D,$A,$B,$C, 9, 7);
$C = &ROUND1($C,$D,$A,$B,10,11); $B = &ROUND1($B,$C,$D,$A,11,19);
$A = &ROUND1($A,$B,$C,$D,12, 3); $D = &ROUND1($D,$A,$B,$C,13, 7);
$C = &ROUND1($C,$D,$A,$B,14,11); $B = &ROUND1($B,$C,$D,$A,15,19);
$A = &ROUND2($A,$B,$C,$D, 0, 3); $D = &ROUND2($D,$A,$B,$C, 4, 5);
$C = &ROUND2($C,$D,$A,$B, 8, 9); $B = &ROUND2($B,$C,$D,$A,12,13);
$A = &ROUND2($A,$B,$C,$D, 1, 3); $D = &ROUND2($D,$A,$B,$C, 5, 5);
$C = &ROUND2($C,$D,$A,$B, 9, 9); $B = &ROUND2($B,$C,$D,$A,13,13);
$A = &ROUND2($A,$B,$C,$D, 2, 3); $D = &ROUND2($D,$A,$B,$C, 6, 5);
$C = &ROUND2($C,$D,$A,$B,10, 9); $B = &ROUND2($B,$C,$D,$A,14,13);
$A = &ROUND2($A,$B,$C,$D, 3, 3); $D = &ROUND2($D,$A,$B,$C, 7, 5);
$C = &ROUND2($C,$D,$A,$B,11, 9); $B = &ROUND2($B,$C,$D,$A,15,13);
$A = &ROUND3($A,$B,$C,$D, 0, 3); $D = &ROUND3($D,$A,$B,$C, 8, 9);
$C = &ROUND3($C,$D,$A,$B, 4,11); $B = &ROUND3($B,$C,$D,$A,12,15);
$A = &ROUND3($A,$B,$C,$D, 2, 3); $D = &ROUND3($D,$A,$B,$C,10, 9);
$C = &ROUND3($C,$D,$A,$B, 6,11); $B = &ROUND3($B,$C,$D,$A,14,15);
$A = &ROUND3($A,$B,$C,$D, 1, 3); $D = &ROUND3($D,$A,$B,$C, 9, 9);
$C = &ROUND3($C,$D,$A,$B, 5,11); $B = &ROUND3($B,$C,$D,$A,13,15);
$A = &ROUND3($A,$B,$C,$D, 3, 3); $D = &ROUND3($D,$A,$B,$C,11, 9);
$C = &ROUND3($C,$D,$A,$B, 7,11); $B = &ROUND3($B,$C,$D,$A,15,15);
$A = &add($A, $AA); $B = &add($B, $BB);
$C = &add($C, $CC); $D = &add($D, $DD);
$A &= 0xffffffff; $B &= 0xffffffff;
$C &= 0xffffffff; $D &= 0xffffffff;
map {$_ = 0} @X;
}
sub copy64
{
my ($in) = @_;
$M = pack("V16", unpack("N16", $in));
}
# see note at top of this file about this function
sub add
{
my (@nums) = @_;
my ($r_low, $r_high, $n_low, $l_high);
my $num;
$r_low = $r_high = 0;
foreach $num (@nums)
{
$n_low = $num & 0xffff;
$n_high = ($num&0xffff0000)>>16;
$r_low += $n_low;
($r_low&0xf0000) && $r_high++;
$r_low &= 0xffff;
$r_high += $n_high;
$r_high &= 0xffff;
}
return ($r_high<<16)|$r_low;
}
1;

View file

@ -1,278 +0,0 @@
.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07)
.\"
.\" Standard preamble:
.\" ========================================================================
.de Sp \" Vertical space (when we can't use .PP)
.if t .sp .5v
.if n .sp
..
.de Vb \" Begin verbatim text
.ft CW
.nf
.ne \\$1
..
.de Ve \" End verbatim text
.ft R
.fi
..
.\" Set up some character translations and predefined strings. \*(-- will
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
.\" double quote, and \*(R" will give a right double quote. \*(C+ will
.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
.\" nothing in troff, for use with C<>.
.tr \(*W-
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
.ie n \{\
. ds -- \(*W-
. ds PI pi
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
. ds L" ""
. ds R" ""
. ds C` ""
. ds C' ""
'br\}
.el\{\
. ds -- \|\(em\|
. ds PI \(*p
. ds L" ``
. ds R" ''
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.\"
.\" If the F register is turned on, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD. Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.ie \nF \{\
. de IX
. tm Index:\\$1\t\\n%\t"\\$2"
..
. nr % 0
. rr F
.\}
.el \{\
. de IX
..
.\}
.\"
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
.\" Fear. Run. Save yourself. No user-serviceable parts.
. \" fudge factors for nroff and troff
.if n \{\
. ds #H 0
. ds #V .8m
. ds #F .3m
. ds #[ \f1
. ds #] \fP
.\}
.if t \{\
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
. ds #V .6m
. ds #F 0
. ds #[ \&
. ds #] \&
.\}
. \" simple accents for nroff and troff
.if n \{\
. ds ' \&
. ds ` \&
. ds ^ \&
. ds , \&
. ds ~ ~
. ds /
.\}
.if t \{\
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
.\}
. \" troff and (daisy-wheel) nroff accents
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
.ds ae a\h'-(\w'a'u*4/10)'e
.ds Ae A\h'-(\w'A'u*4/10)'E
. \" corrections for vroff
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
. \" for low resolution devices (crt and lpr)
.if \n(.H>23 .if \n(.V>19 \
\{\
. ds : e
. ds 8 ss
. ds o a
. ds d- d\h'-1'\(ga
. ds D- D\h'-1'\(hy
. ds th \o'bp'
. ds Th \o'LP'
. ds ae ae
. ds Ae AE
.\}
.rm #[ #] #H #V #F C
.\" ========================================================================
.\"
.IX Title "NTLM 3pm"
.TH NTLM 3pm "2011-09-09" "perl v5.10.1" "User Contributed Perl Documentation"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.nh
.SH "NAME"
Authen::NTLM \- An NTLM authentication module
.SH "SYNOPSIS"
.IX Header "SYNOPSIS"
.Vb 10
\& use Mail::IMAPClient;
\& use Authen::NTLM;
\& my $imap = Mail::IMAPClient\->new(Server=>\*(Aqimaphost\*(Aq);
\& ntlm_user($username);
\& ntlm_password($password);
\& $imap\->authenticate("NTLM", Authen::NTLM::ntlm);
\& :
\& $imap\->logout;
\& ntlm_reset;
\& :
.Ve
.PP
or
.PP
.Vb 5
\& ntlmv2(1);
\& ntlm_user($username);
\& ntlm_host($host);
\& ntlm_password($password);
\& :
.Ve
.PP
or
.PP
.Vb 10
\& my $ntlm = Authen::NTLM\-> new(
\& host => $host,
\& user => $username,
\& domain => $domain,
\& password => $password,
\& version => 1,
\& );
\& $ntlm\-> challenge;
\& :
\& $ntlm\-> challenge($challenge);
.Ve
.SH "DESCRIPTION"
.IX Header "DESCRIPTION"
.Vb 5
\& This module provides methods to use NTLM authentication. It can
\& be used as an authenticate method with the Mail::IMAPClient module
\& to perform the challenge/response mechanism for NTLM connections
\& or it can be used on its own for NTLM authentication with other
\& protocols (eg. HTTP).
\&
\& The implementation is a direct port of the code from F<fetchmail>
\& which, itself, has based its NTLM implementation on F<samba>. As
\& such, this code is not especially efficient, however it will still
\& take a fraction of a second to negotiate a login on a PII which is
\& likely to be good enough for most situations.
.Ve
.SS "\s-1FUNCTIONS\s0"
.IX Subsection "FUNCTIONS"
.IP "\fIntlm_domain()\fR" 4
.IX Item "ntlm_domain()"
.Vb 3
\& Set the domain to use in the NTLM authentication messages.
\& Returns the new domain. Without an argument, this function
\& returns the current domain entry.
.Ve
.IP "\fIntlm_user()\fR" 4
.IX Item "ntlm_user()"
.Vb 3
\& Set the username to use in the NTLM authentication messages.
\& Returns the new username. Without an argument, this function
\& returns the current username entry.
.Ve
.IP "\fIntlm_password()\fR" 4
.IX Item "ntlm_password()"
.Vb 3
\& Set the password to use in the NTLM authentication messages.
\& Returns the new password. Without an argument, this function
\& returns the current password entry.
.Ve
.IP "\fIntlm_reset()\fR" 4
.IX Item "ntlm_reset()"
.Vb 2
\& Resets the NTLM challenge/response state machine so that the next
\& call to C<ntlm()> will produce an initial connect message.
.Ve
.IP "\fIntlm()\fR" 4
.IX Item "ntlm()"
.Vb 5
\& Generate a reply to a challenge. The NTLM protocol involves an
\& initial empty challenge from the server requiring a message
\& response containing the username and domain (which may be empty).
\& The first call to C<ntlm()> generates this first message ignoring
\& any arguments.
\&
\& The second time it is called, it is assumed that the argument is
\& the challenge string sent from the server. This will contain 8
\& bytes of data which are used in the DES functions to generate the
\& response authentication strings. The result of the call is the
\& final authentication string.
\&
\& If C<ntlm_reset()> is called, then the next call to C<ntlm()> will
\& start the process again allowing multiple authentications within
\& an application.
.Ve
.IP "\fIntlmv2()\fR" 4
.IX Item "ntlmv2()"
.Vb 1
\& Use NTLM v2 authentication.
.Ve
.SS "\s-1OBJECT\s0 \s-1API\s0"
.IX Subsection "OBJECT API"
.ie n .IP "new %options" 4
.el .IP "new \f(CW%options\fR" 4
.IX Item "new %options"
Creates an object that accepts the following options: \f(CW\*(C`user\*(C'\fR, \f(CW\*(C`host\*(C'\fR,
\&\f(CW\*(C`domain\*(C'\fR, \f(CW\*(C`password\*(C'\fR, \f(CW\*(C`version\*(C'\fR.
.IP "challenge [$challenge]" 4
.IX Item "challenge [$challenge]"
If \f(CW$challenge\fR is not supplied, first-stage challenge string is generated.
Otherwise, the third-stage challenge is generated, where \f(CW$challenge\fR is
assumed to be extracted from the second stage of \s-1NTLM\s0 exchange. The result of
the call is the final authentication string.
.SH "AUTHOR"
.IX Header "AUTHOR"
.Vb 6
\& David (Buzz) Bussenschutt <davidbuzz@gmail.com> \- current maintainer
\& Dmitry Karasik <dmitry@karasik.eu.org> \- nice ntlmv2 patch, OO extensions.
\& Andrew Hobson <ahobson@infloop.com> \- initial ntlmv2 code
\& Mark Bush <Mark.Bush@bushnet.demon.co.uk> \- perl port
\& Eric S. Raymond \- author of fetchmail
\& Andrew Tridgell and Jeremy Allison for SMB/Netbios code
.Ve
.SH "SEE ALSO"
.IX Header "SEE ALSO"
perl, Mail::IMAPClient, LWP::Authen::Ntlm
.SH "HISTORY"
.IX Header "HISTORY"
.Vb 8
\& 1.09 \- fix CPAN ticket # 70703
\& 1.08 \- fix CPAN ticket # 39925
\& 1.07 \- not publicly released
\& 1.06 \- relicense as GPL+ or Artistic
\& 1.05 \- add OO interface by Dmitry Karasik
\& 1.04 \- implementation of NTLMv2 by Andrew Hobson/Dmitry Karasik
\& 1.03 \- fixes long\-standing 1 line bug L<http://rt.cpan.org/Public/Bug/Display.html?id=9521> \- released by David Bussenschutt 9th Aug 2007
\& 1.02 \- released by Mark Bush 29th Oct 2001
.Ve

View file

View file

@ -1,9 +0,0 @@
#! /usr/bin/perl
use strict;
use warnings;
use Test::More tests => 1;
use_ok('Authen::NTLM');

View file

@ -1,48 +0,0 @@
#! /usr/bin/perl
use strict;
use warnings;
use Test::More tests => 12;
use Authen::NTLM;
use MIME::Base64;
my $user = "test";
my $domain = "test";
my $passwd = "test";
my $msg1 = "TlRMTVNTUAABAAAAB7IAAAQABAAgAAAABAAEACQAAAB0ZXN0dGVzdA==";
my $challenge = "TlRMTVNTUAACAAAABAAEADAAAAAFggEAQUJDREVGR0gAAAAAAAAAAAAAAAAAAAAAdGVzdA==";
my $msg2 = "TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAQABABwAAAACAAIAHQAAAAIAAgAfAAAAAAAAABEAAAABYIBAJ7/TlMo4HLg0gOk6iKq4bv2vk35ozHEKKoqG8nTkQ5S82zyqpJzxPDJHUMynnKsBHRlc3R0AGUAcwB0AHQAZQBzAHQA";
# 2: username
ok(ntlm_user($user) eq $user, 'ntlm_user');
# 3: domain
ok(ntlm_domain($domain) eq $domain, 'ntlm_domain');
# 4: password
ok(ntlm_password($passwd) eq $passwd, 'ntlm_password');
# 5: initial message
my $reply1 = ntlm();
ok($reply1 eq $msg1, 'reply 1');
# 6-12: decode challenge - not normally user accessed
my $c = &Authen::NTLM::decode_challenge(decode_base64($challenge));
ok($c->{ident} eq "NTLMSSP", 'header');
ok($c->{type} == 2, 'type');
ok($c->{flags} == 0x00018205, 'flags');
ok($c->{data} eq "ABCDEFGH", 'data');
ok($c->{domain}{len} == 4, 'domain length');
ok($c->{domain}{offset} == 48, 'domain offset');
ok($c->{buffer} eq "test", 'contents');
# 13: challenge response
my $reply2 = ntlm($challenge);
ok($reply2 eq $msg2, 'reply 2');

View file

@ -1,54 +0,0 @@
#! /usr/bin/perl
use strict;
use warnings;
use Test::More tests => 12;
use Authen::NTLM;
use MIME::Base64;
my $user = "test";
my $domain = "test";
my $passwd = "test";
my $msg1 = "TlRMTVNTUAABAAAAB7IAAAQABAAgAAAABAAEACQAAAB0ZXN0dGVzdA==";
my $challenge = "TlRMTVNTUAACAAAABAAEADAAAAAFggEAQUJDREVGR0gAAAAAAAAAAAAAAAAAAAAAdGVzdA==";
my $msg2 = "TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAQABABwAAAACAAIAHQAAAAIAAgAfAAAAAAAAABEAAAABYIBAJ7/TlMo4HLg0gOk6iKq4bv2vk35ozHEKKoqG8nTkQ5S82zyqpJzxPDJHUMynnKsBHRlc3R0AGUAcwB0AHQAZQBzAHQA";
my $a = Authen::NTLM-> new(
user => $user,
domain => $domain,
password => $passwd,
);
# 2: username
ok($a->user eq $user, 'ntlm_user');
# 3: domain
ok($a->domain eq $domain, 'ntlm_domain');
# 4: password
ok($a->password eq $passwd, 'ntlm_password');
# 5: initial message
my $reply1 = $a-> challenge;
ok($reply1 eq $msg1, 'reply 1');
# 6-12: decode challenge - not normally user accessed
my $c = &Authen::NTLM::decode_challenge(decode_base64($challenge));
ok($c->{ident} eq "NTLMSSP", 'header');
ok($c->{type} == 2, 'type');
ok($c->{flags} == 0x00018205, 'flags');
ok($c->{data} eq "ABCDEFGH", 'data');
ok($c->{domain}{len} == 4, 'domain length');
ok($c->{domain}{offset} == 48, 'domain offset');
ok($c->{buffer} eq "test", 'contents');
# 13: challenge response
my $reply2 = $a-> challenge($challenge);
ok($reply2 eq $msg2, 'reply 2');

View file

@ -1,44 +0,0 @@
#! /usr/bin/perl
BEGIN { *CORE::GLOBAL::time = sub { CORE::time } };
use strict;
use warnings;
use Test::More tests => 9;
use Authen::NTLM;
use MIME::Base64;
my $user = "test";
my $domain = "test";
my $passwd = "test";
my $msg1 = "TlRMTVNTUAABAAAAB5IIAAAAAAAAAAAABAAEACAAAAB0ZXN0";
my $challenge = "TlRMTVNTUAACAAAABAAEADgAAAAFgokCQUJDREVGR0gAAAAAAAAAAAQABAA8AAAAdGVzdHRlc3R0ZXN0";
my $msg2 = "TlRMTVNTUAADAAAAGAAYAEAAAAAwADAAWAAAAAQABACIAAAACAAIAIwAAAAIAAgAlAAAAAAAAABcAAAABYIIAMAnJRnMkjvahFEZwXRLN9QAAAAAAAAAABmT0B8dzYsVm1/IAPnR5PIBAQAAAAAAAIBgMzwAAAAAAAAAAAAAAAAAAAAAAAAAAHRlc3R0AGUAcwB0AHQAZQBzAHQA";
my $a = Authen::NTLM-> new(
user => $user,
domain => $domain,
password => $passwd,
version => 2,
);
my $reply1 = $a-> challenge;
ok($reply1 eq $msg1, 'reply 1');
# decode challenge - not normally user accessed
my $c = &Authen::NTLM::decode_challenge(decode_base64($challenge));
ok($c->{ident} eq "NTLMSSP", 'header');
ok($c->{type} == 2, 'type');
ok($c->{flags} == 0x02898205, 'flags');
ok($c->{data} eq "ABCDEFGH", 'data');
ok($c->{domain}{len} == 4, 'domain length');
ok($c->{domain}{offset} == 56, 'domain offset');
ok($c->{buffer} eq "testtesttest", 'contents');
# 13: v2 challenge-response uses time()
{
no warnings qw(redefine);
local *CORE::GLOBAL::time = sub { 1_000_000_000 };
my $reply2 = $a-> challenge($challenge);
ok($reply2 eq $msg2, 'reply 2');
}

View file

@ -1,9 +0,0 @@
#! /usr/bin/perl
use strict;
use warnings;
use Test::More;
eval 'use Test::Pod 1.00';
plan skip_all => 'Test::Pod 1.00 required for testing POD' if $@;
all_pod_files_ok(all_pod_files('blib'));

23
W/TESTING Normal file
View file

@ -0,0 +1,23 @@
TESTING on Unix
---------------
Tests will break as they are home specific.
You need a running imap server on localhost with several accounts
toto with a password located in the file $HOME/var/pass/secret.toto
titi with a password located in the file $HOME/var/pass/secret.titi
tata with a password located in the file $HOME/var/pass/secret.tata
Of course, you can change the file tests.sh and run tests with:
sh -x tests.sh
Specific tests can be run by using them as argument to tests.sh:
sh -x tests.sh ll_ssl_justconnect ll_bad_host ...
The tests.sh script break on first failure ("set -e" directive).
Since I added more tests you also need a remote imap server see the
file tests.sh and help yourself. No time to make a universal test
file.

1
W/TIME
View file

@ -1,3 +1,4 @@
Added make git
90 Added XOATH FAQ item, thanks to Eduardo, email feedback, amazon gift.
120 Fixed Scott issue, took long time (all messages list) even with --useuid --delete --nousecache --maxage 1
240 Fixed long names in invoices. + january invoices.

61
W/build_exe.bat Normal file
View file

@ -0,0 +1,61 @@
REM $Id: build_exe.bat,v 1.27 2015/03/27 23:35:13 gilles Exp gilles $
@ECHO OFF
ECHO Building imapsync.exe
@REM Allow to be called from anywhere;
@REM the following command cd to dirname of the current batch pathname
cd /D %~dp0
CALL .\install_modules.bat
perl ^
-mAuthen::NTLM ^
-mData::Dumper ^
-mData::Uniqid ^
-mDigest::HMAC_MD5 ^
-mDigest::HMAC_SHA1 ^
-mDigest::MD5 ^
-mFile::Copy::Recursive ^
-mFile::Spec ^
-mIO::Socket ^
-mIO::Socket::INET ^
-mIO::Socket::IP ^
-mIO::Socket::SSL ^
-mIO::Tee ^
-mMail::IMAPClient ^
-mTerm::ReadKey ^
-mTime::Local ^
-mUnicode::String ^
-mURI::Escape ^
-e ''
cd
@ECHO ON
@REM --link libssl32_.dll
pp -o imapsync.exe ^
--link libeay32_.dll ^
--link zlib1_.dll ^
--link ssleay32_.dll ^
-M Mail::IMAPClient ^
-M IO::Socket ^
-M IO::Socket::IP ^
-M IO::Socket::SSL ^
-M IO::Socket::INET ^
-M Digest::MD5 ^
-M Digest::HMAC_MD5 ^
-M Digest::HMAC_SHA1 ^
-M Term::ReadKey ^
-M File::Spec ^
-M Authen::NTLM ^
-M Time::Local ^
-M URI::Escape ^
-M Data::Uniqid ^
-M File::Copy::Recursive ^
-M IO::Tee ^
-M Unicode::String ^
.\imapsync
echo Done building imapsync.exe

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

695
W/imapsync.1 Normal file
View file

@ -0,0 +1,695 @@
.\" Automatically generated by Pod::Man 2.25 (Pod::Simple 3.16)
.\"
.\" Standard preamble:
.\" ========================================================================
.de Sp \" Vertical space (when we can't use .PP)
.if t .sp .5v
.if n .sp
..
.de Vb \" Begin verbatim text
.ft CW
.nf
.ne \\$1
..
.de Ve \" End verbatim text
.ft R
.fi
..
.\" Set up some character translations and predefined strings. \*(-- will
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
.\" double quote, and \*(R" will give a right double quote. \*(C+ will
.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
.\" nothing in troff, for use with C<>.
.tr \(*W-
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
.ie n \{\
. ds -- \(*W-
. ds PI pi
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
. ds L" ""
. ds R" ""
. ds C` ""
. ds C' ""
'br\}
.el\{\
. ds -- \|\(em\|
. ds PI \(*p
. ds L" ``
. ds R" ''
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.\"
.\" If the F register is turned on, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD. Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.ie \nF \{\
. de IX
. tm Index:\\$1\t\\n%\t"\\$2"
..
. nr % 0
. rr F
.\}
.el \{\
. de IX
..
.\}
.\"
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
.\" Fear. Run. Save yourself. No user-serviceable parts.
. \" fudge factors for nroff and troff
.if n \{\
. ds #H 0
. ds #V .8m
. ds #F .3m
. ds #[ \f1
. ds #] \fP
.\}
.if t \{\
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
. ds #V .6m
. ds #F 0
. ds #[ \&
. ds #] \&
.\}
. \" simple accents for nroff and troff
.if n \{\
. ds ' \&
. ds ` \&
. ds ^ \&
. ds , \&
. ds ~ ~
. ds /
.\}
.if t \{\
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
.\}
. \" troff and (daisy-wheel) nroff accents
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
.ds ae a\h'-(\w'a'u*4/10)'e
.ds Ae A\h'-(\w'A'u*4/10)'E
. \" corrections for vroff
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
. \" for low resolution devices (crt and lpr)
.if \n(.H>23 .if \n(.V>19 \
\{\
. ds : e
. ds 8 ss
. ds o a
. ds d- d\h'-1'\(ga
. ds D- D\h'-1'\(hy
. ds th \o'bp'
. ds Th \o'LP'
. ds ae ae
. ds Ae AE
.\}
.rm #[ #] #H #V #F C
.\" ========================================================================
.\"
.IX Title "IMAPSYNC 1"
.TH IMAPSYNC 1 "2015-04-01" "perl v5.14.2" "User Contributed Perl Documentation"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.nh
.SH "NAME"
imapsync \- IMAP synchronisation, sync, copy or migration tool.
Synchronises mailboxes between two imap servers.
Good at IMAP migration. More than 52 different IMAP server softwares
supported with success, few failures.
.PP
$Revision: 1.637 $
.SH "SYNOPSIS"
.IX Header "SYNOPSIS"
To synchronize imap account \*(L"foo\*(R" on \*(L"imap.truc.org\*(R"
to imap account \*(L"bar\*(R" on \*(L"imap.trac.org\*(R"
with foo password \*(L"secret1\*(R"
and bar password \*(L"secret2\*(R":
.PP
.Vb 3
\& imapsync \e
\& \-\-host1 imap.truc.org \-\-user1 foo \-\-password1 secret1 \e
\& \-\-host2 imap.trac.org \-\-user2 bar \-\-password2 secret2
.Ve
.SH "INSTALL"
.IX Header "INSTALL"
.Vb 4
\& imapsync works fine under any Unix OS with perl.
\& imapsync works fine under Windows (2000, XP, Vista, Seven)
\& with Strawberry Perl (5.10, 5.12 or higher)
\& or as a standalone binary software imapsync.exe
.Ve
.PP
imapsync can be available directly on the following distributions:
FreeBSD, Debian, Ubuntu, Gentoo, Fedora,
NetBSD, Darwin, Mandriva and OpenBSD.
See http://oswatershed.org/pkg/imapsync
.PP
.Vb 2
\& Purchase latest imapsync at
\& http://imapsync.lamiral.info/
\&
\& You\*(Aqll 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 can be found at
\& http://imapsync.lamiral.info/INSTALL
\& It is now split in several files for each system
\& http://imapsync.lamiral.info/INSTALL.d/
\&
\& The frozen freecode (was freshmeat) record is at
\& http://freecode.com/projects/imapsync
.Ve
.SH "USAGE"
.IX Header "USAGE"
.Vb 1
\& imapsync [options]
.Ve
.PP
To get a description of each option just run imapsync like this:
.PP
.Vb 1
\& imapsync \-\-help
.Ve
.PP
or simply
.PP
.Vb 1
\& imapsync
.Ve
.PP
This description of all options is available at
http://imapsync.lamiral.info/OPTIONS
.PP
The option list:
.PP
.Vb 10
\& imapsync [\-\-host1 server1] [\-\-port1 <num>]
\& [\-\-user1 <string>] [\-\-passfile1 <string>]
\& [\-\-host2 server2] [\-\-port2 <num>]
\& [\-\-user2 <string>] [\-\-passfile2 <string>]
\& [\-\-ssl1] [\-\-ssl2]
\& [\-\-tls1] [\-\-tls2]
\& [\-\-authmech1 <string>] [\-\-authmech2 <string>]
\& [\-\-proxyauth1] [\-\-proxyauth2]
\& [\-\-domain1] [\-\-domain2]
\& [\-\-authmd51] [\-\-authmd52]
\& [\-\-folder <string> \-\-folder <string> ...]
\& [\-\-folderrec <string> \-\-folderrec <string> ...]
\& [\-\-include <regex>] [\-\-exclude <regex>]
\& [\-\-prefix2 <string>] [\-\-prefix1 <string>]
\& [\-\-regextrans2 <regex> \-\-regextrans2 <regex> ...]
\& [\-\-sep1 <char>]
\& [\-\-sep2 <char>]
\& [\-\-justfolders] [\-\-justfoldersizes] [\-\-justconnect] [\-\-justbanner]
\& [\-\-syncinternaldates]
\& [\-\-idatefromheader]
\& [\-\-syncacls]
\& [\-\-regexmess <regex>] [\-\-regexmess <regex>]
\& [\-\-skipmess <regex>] [\-\-skipmess <regex>]
\& [\-\-maxsize <int>]
\& [\-\-minsize <int>]
\& [\-\-maxage <int>]
\& [\-\-minage <int>]
\& [\-\-search <string>]
\& [\-\-search1 <string>]
\& [\-\-search2 <string>]
\& [\-\-useheader <string>] [\-\-useheader <string>]
\& [\-\-nouid1] [\-\-nouid2]
\& [\-\-usecache]
\& [\-\-noskipsize]
\& [\-\-delete]
\& [\-\-delete2] [\-\-delete2duplicates]
\& [\-\-expunge] [\-\-expunge1] [\-\-expunge2] [\-\-uidexpunge2]
\& [\-\-delete2folders] [\-\-delete2foldersonly] [\-\-delete2foldersbutnot]
\& [\-\-subscribed] [\-\-subscribe] [\-\-subscribeall]
\& [\-\-nofoldersizes] [\-\-nofoldersizesatend]
\& [\-\-dry]
\& [\-\-debug] [\-\-debugimap][\-\-debugimap1][\-\-debugimap2] [\-\-debugcontent]
\& [\-\-timeout <int>]
\& [\-\-noreleasecheck]
\& [\-\-releasecheck]
\& [\-\-pidfile <filepath>] [\-\-pidfilelocking]
\& [\-\-tmpdir <dirpath>]
\& [\-\-nolog]
\& [\-\-logfile <filepath>]
\& [\-\-version] [\-\-help]
\& [\-\-tests] [\-\-testsdebug] [\-\-testslive]
.Ve
.SH "DESCRIPTION"
.IX Header "DESCRIPTION"
Imapsync command is a tool allowing incremental and
recursive imap transfers from one mailbox to another.
.PP
By default all folders are transferred, recursively, all
possible flags (\eSeen \eAnswered \eFlagged etc.) are synced too.
.PP
We sometimes need to transfer mailboxes from one imap server to
another. This is called migration.
.PP
Imapsync reduces the amount
of data transferred by not transferring a given message
if it resides already on both sides. Same specific headers
and the transfer is done only once; taken into account are by default
Message-Id and Received header lines.
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 and interruptions.
.PP
You can decide to delete the messages from the source mailbox
after a successful transfer, it can be a good feature when migrating
live mailboxes since messages will be only on one side.
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
good real world scenario for the combination \-\-delete \-\-noexpunge).
.PP
A different scenario is synchronizing a mailbox B from another mailbox A
in case you just want to keep a \*(L"live\*(R" copy of A in B.
In that case \-\-delete2 has to be used, it deletes messages in host2
folder B that are not in host1 folder A. If you also need to destroy
host2 folders that are not in host1 then use \-\-delete2folders (see also
\&\-\-delete2foldersonly and \-\-delete2foldersbutnot).
.PP
Imapsync is not adequate for maintaining two active imap accounts
in synchronization when the user plays independently on both sides.
Use offlineimap (written by John Goerzen) or mbsync (written by
Michael R. Elkins) for 2 ways synchronizations.
.SH "OPTIONS"
.IX Header "OPTIONS"
To get a description of each option just invoke:
.PP
.Vb 1
\& imapsync
.Ve
.PP
or read http://imapsync.lamiral.info/OPTIONS
.SH "HISTORY"
.IX Header "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 its 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).
.SH "EXAMPLE"
.IX Header "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.
.PP
To synchronize the imap account \*(L"buddy\*(R" (with password \*(L"secret1\*(R")
on host \*(L"imap.src.fr\*(R" to the imap account \*(L"max\*(R" (with password \*(L"secret2\*(R")
on host \*(L"imap.dest.fr\*(R":
.PP
.Vb 2
\& imapsync \-\-host1 imap.src.fr \-\-user1 buddy \-\-password1 secret1 \e
\& \-\-host2 imap.dest.fr \-\-user2 max \-\-password2 secret2
.Ve
.PP
Then you will have max's mailbox updated from buddy's
mailbox.
.SH "SECURITY"
.IX Header "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 \f(CW$PASSWORD1\fR) 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.
.PP
imasync is not totally protected against sniffers on the
network since passwords may be transferred in plain text
if \s-1CRAM\-MD5\s0 is not supported by your imap servers. Use
\&\-\-ssl1 (or \-\-tls1) and \-\-ssl2 (or \-\-tls2) to enable
encryption on host1 and host2.
.PP
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 \*(L"adminuser\*(R" to enable this on host1. In this
case, \-\-authmech1 \s-1PLAIN\s0 will be used by default since it
is the only way to go for now. So don't use \-\-authmech1 \s-1SOMETHING\s0
with \-\-authuser1 \*(L"adminuser\*(R", it will not work.
Same behavior with the \-\-authuser2 option.
Authenticate with an admin account must be supported by your
imap server to work with imapsync.
.PP
When working on Sun/iPlanet/Netscape \s-1IMAP\s0 servers you must use
\&\-\-proxyauth1 to enable administrative user to masquerade as another user.
Can also be used on destination server with \-\-proxyauth2
.PP
You can authenticate with \s-1OAUTH\s0 when transfering from Google Apps.
The consumer key will be the domain part of the \-\-user, and the
\&\-\-password will be used as the consumer secret. It does not work
with Google Apps free edition.
.SH "EXIT STATUS"
.IX Header "EXIT STATUS"
imapsync will exit with a 0 status (return code) if everything went good.
Otherwise, it exits with a non-zero status.
.PP
So if you have an unreliable internet connection, you can use this loop
in a Bourne shell:
.PP
.Vb 3
\& while ! imapsync ...; do
\& echo imapsync not complete
\& done
.Ve
.SH "LICENSE"
.IX Header "LICENSE"
imapsync is free, open, public but not always gratis software
cover by the \s-1NOLIMIT\s0 Public License.
See the \s-1LICENSE\s0 file included in the distribution or just read this
simple sentence as it is the licence text:
No limit to do anything with this work and this license.
.SH "MAILING-LIST"
.IX Header "MAILING-LIST"
The public mailing-list may be the best way to get free support.
.PP
To write on the mailing-list, the address is:
<imapsync@linux\-france.org>
.PP
To subscribe, send any message (even empty) to:
<imapsync\-subscribe@listes.linux\-france.org>
then just reply to the confirmation message.
.PP
To unsubscribe, send a message to:
<imapsync\-unsubscribe@listes.linux\-france.org>
.PP
To contact the person in charge for the list:
<imapsync\-request@listes.linux\-france.org>
.PP
The list archives are 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.
.PP
Thank you for your participation.
.SH "AUTHOR"
.IX Header "AUTHOR"
Gilles \s-1LAMIRAL\s0 <gilles.lamiral@laposte.net>
.PP
Feedback good or bad is very often welcome.
.PP
Gilles \s-1LAMIRAL\s0 earns his living by writing, installing,
configuring and teaching free, open and often gratis
softwares. It used to be \*(L"always gratis\*(R" but now it is
\&\*(L"often\*(R" because imapsync is sold by its author, a good
way to stay maintening and supporting free open public
softwares (see the license) over decades.
.SH "BUG REPORT GUIDELINES"
.IX Header "BUG REPORT GUIDELINES"
Help me to help you: follow the following guidelines.
.PP
Report any bugs or feature requests to the public mailing-list
or to the author.
.PP
Before reporting bugs, read the \s-1FAQ\s0, the \s-1README\s0 and the
\&\s-1TODO\s0 files. http://imapsync.lamiral.info/
.PP
Upgrade to last imapsync release, maybe the bug
is already fixed.
.PP
Upgrade to last Mail-IMAPClient Perl module.
http://search.cpan.org/dist/Mail\-IMAPClient/
maybe the bug is already fixed there.
.PP
Make a good title with word \*(L"imapsync\*(R" in it (my spam filters won't filter it),
Try to write an email title with more words than just \*(L"imapsync\*(R" or \*(L"problem\*(R",
a good title is made of keywords summary, but not too long (one visible line).
.PP
Help us to help you: in your report, please include:
.PP
.Vb 1
\& \- imapsync version.
\&
\& \- output near the first failures, a few lines before is good to get the context
\& of the issue. First failures messages are often more significant than
\& the last ones.
\&
\& \- if the issue is always related to the same messages, include the output
\& with \-\-debug \-\-debugimap, near the failure point. For example,
\& Isolate a buggy message or two in a folder \*(AqBUG\*(Aq and use
\&
\& imapsync ... \-\-folder \*(AqBUG\*(Aq \-\-debug \-\-debugimap
\&
\& \- imap server softwares on both sides 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.
\&
\& \- the run context. Do you run imapsync.exe, a unix binary
\& or the perl script imapsync.
\&
\& \- operating system running imapsync.
\&
\& \- virtual software context (vmware, xen etc.)
\&
\& \- operating systems on both sides and the third side in case
\& you run imapsync on a foreign host from the both.
.Ve
.PP
Most of those values can be found as a copy/paste at the begining of the output,
so a carbon copy of the output is a very easy and very good debug report for me.
.PP
One time in your life, read the paper
\&\*(L"How To Ask Questions The Smart Way\*(R"
http://www.catb.org/~esr/faqs/smart\-questions.html
and then forget it.
.SH "IMAP SERVERS"
.IX Header "IMAP SERVERS"
Failure stories reported in the past with the following 6 imap servers.
Maybe last imapsync release can run successfully with them.
Don't hesitate to have a try, It's been a long time since last failure occured,
I will help you and make efforts to switch them to the success list,
that's my job.
.PP
.Vb 9
\& \- MailEnable 1.54 (Proprietary) but MailEnable 4.23 is supported.
\& \- DBMail 0.9, 2.0.7 (GPL). But DBMail 1.2.1 is supported.
\& Patient and confident testers are welcome.
\& \- Imail 7.04 (maybe).
\& \- (2011) MDaemon 12.0.3 as host2 but MDaemon is supported as host1.
\& MDaemon is simply buggy with the APPEND IMAP command with
\& any IMAP email client.
\& \- Hotmail since hotmail.com does not provide IMAP access
\& \- Outlook.com since outlook.com does not provide IMAP access
.Ve
.PP
Success stories reported with the following 62 imap servers
(software names are in alphabetic order):
.PP
.Vb 10
\& \- 1und1 H mimap1 84498 [host1] H mibap4 95231 [host1]
\& \- a1.net imap.a1.net IMAP4 Ready [host1]
\& \- Apple Server 10.6 Snow Leopard [host1]
\& \- Archiveopteryx 2.03, 2.04, 2.09, 2.10 [host2], 3.0.0 [host2]
\& (OSL 3.0) http://www.archiveopteryx.org/
\& \- Atmail 6.x [host1]
\& \- Axigen Mail Server Version 8.0.0
\& \- 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.3, 2.2.6, 2.2.10, 2.2.12, 2.2.13,
\& 2.3\-alpha (OSI Approved), 2.3.1, 2.3.7, 2.3.16
\& (http://asg.web.cmu.edu/cyrus/)
\& \- David Tobit V8 (proprietary Message system).
\& \- Deerfield VisNetic MailServer 5.8.6 [host1] (http://www.deerfield.net/products/visnetic\-mailserver/)
\& \- DBMail 1.2.1, 2.0.4, 2.0.9, 2.2rc1 (GPL) (http://www.dbmail.org/).
\& 2.0.7 seems buggy.
\& \- DBOX 2.41 System [host1] (http://www.dbox.handshake.de/).
\& \- 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], 8.5.3 [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
\& \- FirtClass 9 [host1] Read the FAQ! (http://www.firstclass.com/)
\& \- FTGate (http://www.ftgate.com/)
\& \- Fusemail imap.fusemail.net:143 (https://www.fusemail.com/).
\& \- Gimap (Gmail imap)
\& \- GMX IMAP4 StreamProxy.
\& \- Groupwise IMAP (Novell) 6.x and 7.0. Buggy so see the FAQ.
\& \- hMailServer 5.40\-B1950 [host12], 5.3.3 [host2], 4.4.1 [host1] (see FAQ)
\& \- IceWarp Server 10.4.5 [host1] (http://www.icewarp.com/)
\& \- iPlanet Messaging server 4.15, 5.1, 5.2
\& \- IMail 7.15 (Ipswitch/Win2003), 8.12, 11.03 [host1]
\& \- Kerio 7.2.0 Patch 1 [host12], Kerio 8 [host1]
\& \- Mail2World IMAP4 Server 2.5 [host1] (http://www.mail2world.com/)
\& \- MailEnable 4.23 [host1] [host2], 4.26 [host1][host2], 5 [host1]
\& \- MDaemon 7.0.1, 8.0.2, 8.1, 9.5.4 (Windows server 2003 R2 platform),
\& 9.6.5 [host1], 12 [host2], 12.0.3 [host1], 12.5.5 [host1],
\& 13.5 [host2], 14.5 [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], 6.5 [host1], Exchange 2007 SP1 (with Update Rollup 2),
\& Exchange2007\-EP\-SP2,
\& Exchange 2010 RTM (Release to Manufacturing) [host2],
\& Exchange 2010 SP1 RU2[host2],
\& \- Mirapoint, 4.1.9\-GA [host1]
\& \- Netscape Mail Server 3.6 (Wintel !)
\& \- Netscape Messaging Server 4.15 Patch 7
\& \- Office 365 [host1] [host2]
\& \- OpenMail IMAP server B.07.00.k0 (Samsung Contact ?)
\& \- OpenWave
\& \- Oracle Beehive [host1]
\& \- Parallels Plesk Panel 9.x [host2] 11.x [host2] (http://www.parallels.com/)
\& \- Qualcomm Worldmail (NT)
\& \- QQMail IMAP4Server [host1] [host2] https://en.mail.qq.com/
\& \- RackSpace hoster secure.emailsrvr.com:993 http://www.rackspace.com/
\& \- 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, 11.4.6
\& \- Sendmail Mail Store IMAP4rev1 (5.5.6/mstore\-5\-5\-build\-1874 [host1].
\& \- SmarterMail, Smarter Mail 5.0 Enterprise, Smarter Mail 5.5 [host1],
\& SmarterMail Professional 10.2 [host1], Smarter Mail 11.7 [host1][host2].
\& \- Softalk Workgroup Mail 7.6.4 [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, 6.3d\-72 [host2]
\& \- 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
\& \- VMS, Imap part of TCP/IP suite of VMS 7.3.2
\& \- Yahoo [host1]
\& \- Zarafa 6,40,0,20653 [host1] (http://www.zarafa.com/)
\& \- Zarafa ZCP 7.1.4 IMAP Gateway [host2]
\& \- Zimbra\-IMAP 3.0.1 GA 160, 3.1.0 Build 279, 4.0.5, 4.5.2, 4.5.6,
\& Zimbra 5.0.24_GA_3356.RHEL4 [host1], 5.5, 6.x
.Ve
.PP
Please report to the author any success or bad story with
imapsync and do not forget to mention the \s-1IMAP\s0 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:
.PP
.Vb 2
\& Host1 software:* OK louloutte Cyrus IMAP4 v1.5.19 server ready
\& Host2 software:* OK Courier\-IMAP ready
.Ve
.PP
You can use option \-\-justconnect to get those lines.
Example:
.PP
.Vb 1
\& imapsync \-\-host1 imap.troc.org \-\-host2 imap.trac.org \-\-justconnect
.Ve
.SH "HUGE MIGRATION"
.IX Header "HUGE MIGRATION"
Pay special attention to options
\&\-\-subscribed
\&\-\-subscribe
\&\-\-delete
\&\-\-delete2
\&\-\-delete2folders
\&\-\-maxage
\&\-\-minage
\&\-\-maxsize
\&\-\-useuid
\&\-\-usecache
.PP
If you have many mailboxes to migrate think about a little
shell program. Write a file called file.txt (for example)
containing users and passwords.
The separator used in this example is ';'
.PP
The file.txt file contains:
.PP
user001_1;password001_1;user001_2;password001_2
user002_1;password002_1;user002_2;password002_2
user003_1;password003_1;user003_2;password003_2
user004_1;password004_1;user004_2;password004_2
user005_1;password005_1;user005_2;password005_2
\&...
.PP
On Unix the shell program can be:
.PP
.Vb 4
\& { while IFS=\*(Aq;\*(Aq read u1 p1 u2 p2; do
\& imapsync \-\-host1 imap.side1.org \-\-user1 "$u1" \-\-password1 "$p1" \e
\& \-\-host2 imap.side2.org \-\-user2 "$u2" \-\-password2 "$p2" ...
\& done ; } < file.txt
.Ve
.PP
On Windows the batch program can be:
.PP
.Vb 3
\& FOR /F "tokens=1,2,3,4 delims=; eol=#" %%G IN (file.txt) DO imapsync ^
\& \-\-host1 imap.side1.org \-\-user1 %%G \-\-password1 %%H ^
\& \-\-host2 imap.side2.org \-\-user2 %%I \-\-password2 %%J ...
.Ve
.PP
The ... have to be replaced by nothing or any imapsync option.
Welcome in shell programming !
.PP
You will find already written scripts at
http://imapsync.lamiral.info/examples/
.SH "Hacking"
.IX Header "Hacking"
Feel free to hack imapsync as the \s-1NOLIMIT\s0 license permits it.
.SH "Links"
.IX Header "Links"
Entries for imapsync:
https://web.archive.org/web/20070202005121/http://www.imap.org/products/showall.php
.SH "SIMILAR SOFTWARES"
.IX Header "SIMILAR SOFTWARES"
.Vb 10
\& imap_tools : http://www.athensfbc.com/imap_tools
\& offlineimap : https://github.com/nicolas33/offlineimap
\& mbsync : http://isync.sourceforge.net/
\& mailsync : http://mailsync.sourceforge.net/
\& mailutil : http://www.washington.edu/imap/
\& part of the UW IMAP tookit.
\& imaprepl : http://www.bl0rg.net/software/
\& http://freecode.com/projects/imap\-repl/
\& 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 file W/tools/wonko_ruby_imapsync
\& exchange\-away : http://exchange\-away.sourceforge.net/
\& pop2imap : http://www.linux\-france.org/prj/pop2imap/
.Ve
.PP
Feedback (good or bad) will often be welcome.
.PP
\&\f(CW$Id:\fR imapsync,v 1.637 2015/04/01 01:36:37 gilles Exp gilles $

View file

@ -1,5 +1,5 @@
REM $Id: install_modules.bat,v 1.13 2014/11/14 17:10:17 gilles Exp gilles $
REM $Id: install_modules.bat,v 1.15 2015/03/03 11:23:12 gilles Exp gilles $
@ECHO OFF
@ -12,24 +12,27 @@ IF ERRORLEVEL 1 ECHO Perl needed. Install Strawberry Perl. Get it at http://stra
REM perl is there
FOR %%M in ( Mail::IMAPClient ^
Unicode::String ^
FOR %%M in ( ^
Authen::NTLM ^
Crypt::SSLeay ^
Data::Uniqid ^
Digest::HMAC_MD5 ^
Digest::HMAC_SHA1 ^
Digest::MD5 ^
File::Copy::Recursive ^
Getopt::ArgvFile ^
Module::ScanDeps ^
PAR::Packer ^
Test::Pod ^
IO::Socket::IP ^
IO::Socket::INET ^
IO::Socket::INET6 ^
Net::SSLeay ^
Crypt::SSLeay ^
Net::SSL IO::Socket::SSL ^
Digest::MD5 ^
Digest::HMAC_MD5 ^
Data::Uniqid URI::Escape ^
Authen::NTLM ^
IO::Socket::SSL ^
IO::Tee ^
Mail::IMAPClient ^
Module::ScanDeps ^
Net::SSL ^
Net::SSLeay ^
PAR::Packer ^
Test::Pod ^
Unicode::String ^
URI::Escape ^
) DO ECHO Updating %%M ^
& perl -MCPAN -e "install %%M"

21
W/learn/ipc_open2 Executable file
View file

@ -0,0 +1,21 @@
#!/usr/bin/perl -w
use strict ;
use IO::Handle ;
use IPC::Open2 ;
my( $chld_out, $chld_in ) = ( IO::Handle->new, IO::Handle->new ) ;
my $pid = open2( $chld_out, $chld_in, 'cat -n' ) ;
print $chld_in "LALALA\n" x 50000 ;
print $chld_in "LALALA\n" ;
print $chld_in "LALALA\n" ;
$chld_in->close ;
my @out = <$chld_out> ;
waitpid( $pid, 0 );
my $child_exit_status = $? >> 8;
print @out ;

17
W/learn/pipemess Executable file
View file

@ -0,0 +1,17 @@
#!/usr/bin/perl -w
# $Id: $
use strict ;
open( READCMD, "cat -n /etc/passwd |" ) ;
my @out = <READCMD> ;
close( READCMD ) ;
print @out ;
exit ;

143
W/memo
View file

@ -1,6 +1,6 @@
#!/bin/sh
# $Id: memo,v 1.45 2013/11/11 19:32:19 gilles Exp gilles $
# $Id: memo,v 1.51 2015/01/19 01:26:51 gilles Exp gilles $
count_nice() {
@ -102,11 +102,44 @@ statistics_VERSION_getstats() {
echo "statistics_VERSION_monthly_ip 02 2012 # long"
statistics_VERSION_monthly_ip() {
statistics_VERSION_getstats
month=${1:-`date '+%m'`}
year=${2:-`date '+%Y'`}
ls linux-france.org.??-${month}-${year}.imapsync_VERSION || return 1
cut -d ' ' -f 1,12,13,18,19 linux-france.org.??-${month}-${year}.imapsync_VERSION |sort -n |uniq -c|sort -n > stats_imapsync_${year}_${month}.ip
}
echo "verify_month_year 02 2015"
verify_month_year() {
month=${1:-`date '+%m'`}
year=${2:-`date '+%Y'`}
(
cd $HOME/imapsync_stats
fmy="stats_imapsync_${year}_${month}.ip"
test -f "$fmy" || { echo "No $fmy" ; statistics_VERSION_monthly_ip ${month} ${year} ; }
test -f "$fmy" || { echo "No $fmy" ; return 1 ; }
fmy_YYYYmm=`date -r "$fmy" +%Y%m`
diff_month=`expr $fmy_YYYYmm - ${year}${month}`
echo -n $diff_month
test "$diff_month" -ge 1 && echo " is enough" && return 0
echo " is not enough"
statistics_VERSION_monthly_ip $month $year
)
}
echo "verify_year 2015"
verify_year() {
year=${1:-`date '+%Y'`}
now_yearmonth=`date '+%Y%m'`
for month in `count_nice 01 12`; do
test "$now_yearmonth" -ge "$year$month" && \
verify_month_year $month $year
done
statistics_VERSION_yearly_ip $year
statistics_VERSION_synthesis
}
echo "statistics_VERSION_monthly_ip_wc 02 2012 # short"
statistics_VERSION_monthly_ip_wc() {
month=${1:-`date '+%m'`}
@ -177,7 +210,6 @@ statistics_VERSION_yearly_runs() {
)
}
echo "statistics_VERSION_synthesis 2012 # short"
statistics_VERSION_synthesis() {
year=${1:-`date '+%Y'`}
@ -225,14 +257,46 @@ statistics_VERSION_getstats() {
echo "statistics_VERSION_monthly_ip 02 2012 # long"
statistics_VERSION_monthly_ip() {
statistics_VERSION_getstats
month=${1:-`date '+%m'`}
year=${2:-`date '+%Y'`}
(
cd $HOME/imapsync_stats
ls access.log_${year}${month}??.imapsync_VERSION || return 1
cut -d ' ' -f 1,12,13,18,19 access.log_${year}${month}??.imapsync_VERSION |sort -n |uniq -c|sort -n > stats_imapsync_${year}_${month}.ip
)
}
echo "verify_month_year 02 2015"
verify_month_year() {
month=${1:-`date '+%m'`}
year=${2:-`date '+%Y'`}
(
cd $HOME/imapsync_stats
fmy="stats_imapsync_${year}_${month}.ip"
test -f "$fmy" || { echo "No $fmy" ; statistics_VERSION_monthly_ip ${month} ${year} ; }
test -f "$fmy" || { echo "No $fmy" ; return 1 ; }
fmy_YYYYmm=`date -r "$fmy" +%Y%m`
diff_month=`expr $fmy_YYYYmm - ${year}${month}`
echo -n $diff_month
test "$diff_month" -ge 1 && echo " is enough" && return 0
echo " is not enough"
statistics_VERSION_monthly $month $year
)
}
echo "verify_year 2015"
verify_year() {
year=${1:-`date '+%Y'`}
now_yearmonth=`date '+%Y%m'`
for month in `count_nice 01 12`; do
test "$now_yearmonth" -ge "$year$month" && \
verify_month_year $month $year
done
statistics_VERSION_yearly_ip $year
statistics_VERSION_synthesis
}
echo "statistics_VERSION_monthly_os 08 2012 # short"
statistics_VERSION_monthly_os() {
month=${1:-`date '+%m'`}
@ -245,8 +309,8 @@ statistics_VERSION_monthly_os() {
FreeBSD=`grep -i freebsd stats_imapsync_${year}_${month}.ip | wc -l`
Solaris=`grep -i solaris stats_imapsync_${year}_${month}.ip | wc -l`
OpenBSD=`grep -i openbsd stats_imapsync_${year}_${month}.ip | wc -l`
Other=`egrep -i -v 'linux|MSWin32|darwin|freebsd|solaris|openbsd' stats_imapsync_${year}.ip |wc -l`
Nb_All=`cat stats_imapsync_${year}.ip | wc -l`
Other=`egrep -i -v 'linux|MSWin32|darwin|freebsd|solaris|openbsd' stats_imapsync_${year}_${month}.ip |wc -l`
Nb_All=`cat stats_imapsync_${year}_${month}.ip | wc -l`
for OS in Linux Win32 Darwin FreeBSD Solaris OpenBSD Other; do
#echo $OS `eval "echo \\$$OS"` / $Nb_All
Nb_OS=`eval "echo \\$$OS"`
@ -334,35 +398,72 @@ statistics_VERSION_yearly_runs() {
}
statistics_releases_monthly() {
month=${1:-`date '+%m'`}
year=${2:-`date '+%Y'`}
(
cd $HOME/imapsync_stats
test -f stats_imapsync_${year}_${month}.ip \
&& grep -o -P imapsync/'1\.\d{3}' stats_imapsync_${year}_${month}.ip \
| grep -o -P '1\.\d{3}' | sort -n | uniq -c | sort -n
)
}
echo "statistics_VERSION_synthesis 2012 # short"
statistics_VERSION_synthesis() {
statistics_releases_yearly() {
year=${1:-`date '+%Y'`}
(
cd $HOME/imapsync_stats
echo Nb users each month
wc -l stats_imapsync_${year}_??.ip
echo Nb runs each month
tail -n 1 stats_imapsync_${year}_??.runs
echo % Operating systems
statistics_VERSION_yearly_os $year
echo Biggest users
tail -n 5 stats_imapsync_${year}.ip
echo Nb users each year
wc -l stats_imapsync_????.ip
echo "Nb runs each year : "
for yyyy in `count_nice 2011 ${year}`; do
echo -n "$yyyy: "
statistics_VERSION_yearly_runs $yyyy
done
test -f stats_imapsync_${year}.ip && grep -o -P imapsync/'1\.\d{3}' stats_imapsync_${year}.ip | grep -o -P '1\.\d{3}' | sort -n | uniq -c | sort -n
)
}
# Disable releasecheck started on 1.584 on github Mar 5, 2014
# https://github.com/imapsync/imapsync/commits/master/imapsync
statistics_releases_all_times() {
year=${1:-`date '+%Y'`}
(
cd $HOME/imapsync_stats
grep -o -P imapsync/'1\.\d{3}' stats_imapsync_20??.ip | grep -o -P '1\.\d{3}' | sort -n | uniq -c | sort -n
)
}
echo "statistics_VERSION_synthesis 2012 # short"
statistics_VERSION_synthesis() {
year=${1:-`date '+%Y'`}
year_now=`date '+%Y'`
(
cd $HOME/imapsync_stats
echo && echo "==== Nb users each month in ${year} "
wc -l stats_imapsync_${year}_??.ip
echo && echo "==== Nb runs each month in ${year} "
for f in stats_imapsync_${year}_??.runs; do
test -f $f && echo -n "$f : " && tail -n 1 $f
done
echo && echo "==== % Operating systems in ${year} "
statistics_VERSION_yearly_os $year
echo && echo "==== Biggest users in ${year} "
tail -n 9 stats_imapsync_${year}.ip
echo && echo "==== Most releases used in ${year} "
statistics_releases_yearly ${year} | tail -9
echo && echo "==== Nb users each year "
wc -l stats_imapsync_????.ip
echo && echo "==== Nb runs each year : "
for yyyy in `count_nice 2011 ${year_now}`; do
echo -n "$yyyy: "
statistics_VERSION_yearly_runs $yyyy
done
)
}
}
test X"`hostname`" = Xks2 && statistics_VERSION_ks
test X"`hostname`" = Xtuxinette && statistics_VERSION_lfo
niouzes_compil() {
(

View file

@ -0,0 +1,145 @@
--- imapsync-master/imapsync 2014-08-08 01:10:54.000000000 -0600
+++ imapsync-gw/imapsync 2014-11-12 20:21:33.727746150 -0700
@@ -601,6 +601,7 @@
$host1, $host2, $port1, $port2,
$user1, $user2, $domain1, $domain2,
$password1, $password2, $passfile1, $passfile2,
+ $gwtapp1, $gwtappkey1, $gwtapp2, $gwtappkey2,
@folder, @include, @exclude, @folderrec,
@folderfirst, @folderlast,
$prefix1, $prefix2,
@@ -1038,13 +1039,13 @@
$debugimap1 and print "Host1 connection\n";
$imap1 = login_imap($host1, $port1, $user1, $domain1, $password1,
- $debugimap1, $timeout, $fastio1, $ssl1, $tls1,
+ $debugimap1, $timeout, $fastio1, $gwtapp1, $gwtappkey1, $ssl1, $tls1,
$authmech1, $authuser1, $reconnectretry1,
$proxyauth1, $uid1, $split1, 'Host1', $ssl1_SSL_version );
$debugimap2 and print "Host2 connection\n";
$imap2 = login_imap($host2, $port2, $user2, $domain2, $password2,
- $debugimap2, $timeout, $fastio2, $ssl2, $tls2,
+ $debugimap2, $timeout, $fastio2, $gwtapp2, $gwtappkey2, $ssl2, $tls2,
$authmech2, $authuser2, $reconnectretry2,
$proxyauth2, $uid2, $split2, 'Host2', $ssl2_SSL_version );
@@ -2062,7 +2063,7 @@
$imap1 = relogin_imap(
$imap1,
$host1, $port1, $user1, $domain1, $password1,
- $debugimap1, $timeout, $fastio1, $ssl1, $tls1,
+ $debugimap1, $timeout, $fastio1, $gwtapp1, $gwtappkey1, $ssl1, $tls1,
$authmech1, $authuser1, $reconnectretry1,
$proxyauth1, $uid1, $split1) ;
@@ -2074,7 +2075,7 @@
$imap2 = relogin_imap(
$imap2,
$host2, $port2, $user2, $domain2, $password2,
- $debugimap2, $timeout, $fastio2, $ssl2, $tls2,
+ $debugimap2, $timeout, $fastio2, $gwtapp2, $gwtappkey2, $ssl2, $tls2,
$authmech2, $authuser2, $reconnectretry2,
$proxyauth2, $uid2, $split2) ;
@@ -2085,7 +2086,7 @@
sub relogin_imap {
my($imap,
$host, $port, $user, $domain, $password,
- $mydebugimap, $mytimeout, $fastio,
+ $mydebugimap, $mytimeout, $fastio, $gwtapp, $gwtappkey,
$ssl, $tls, $authmech, $authuser, $reconnectretry,
$proxyauth, $uid, $split) = @_;
@@ -2093,7 +2094,7 @@
$imap->logout( ) ;
$imap = login_imap(
$host, $port, $user, $domain, $password,
- $mydebugimap, $mytimeout, $fastio,
+ $mydebugimap, $mytimeout, $fastio, $gwtapp, $gwtappkey,
$ssl, $tls, $authmech, $authuser, $reconnectretry,
$proxyauth, $uid, $split
) ;
@@ -2101,17 +2102,17 @@
return( $imap ) ;
}
-
sub login_imap {
my @allargs = @_ ;
my($host, $port, $user, $domain, $password,
- $mydebugimap, $mytimeout, $fastio,
+ $mydebugimap, $mytimeout, $fastio, $gwtapp, $gwtappkey,
$ssl, $tls, $authmech, $authuser, $reconnectretry,
$proxyauth, $uid, $split, $Side, $SSL_version ) = @allargs ;
my $side = lc( $Side ) ;
my $imap = init_imap( @allargs ) ;
+ my $gwtapp_encoded = "";
$imap->connect()
or die_clean("Failure: can not open imap connection on $side [$host] with user [$user]: $@\n");
@@ -2120,6 +2121,7 @@
$imap->Banner( $banner ) ;
print "$Side: ", server_banner($imap);
+
if ( $authmech eq 'PREAUTH' ) {
if ( $imap->IsAuthenticated( ) ) {
$imap->Socket ;
@@ -2135,6 +2137,13 @@
or die_clean("Can not go to tls encryption on [$host]:", $imap->LastError, "\n" ) ;
}
+ if ( defined($gwtapp) && !($gwtapp eq '') && defined($gwtappkey) && !($gwtappkey eq '')) {
+ $gwtapp_encoded = encode_base64(qq/$gwtapp\x00$gwtappkey/,"");
+ $imap->tag_and_run("AUTHENTICATE XGWTRUSTEDAPP\nXGWTRUSTEDAPP $gwtapp_encoded\n")
+ or die_clean("Failed to log in with GroupWise Trust App.");
+ @allargs[4] = "";
+ }
+
authenticate_imap( $imap, @allargs ) ;
print "$Side: success login on [$host] with user [$user] auth [$authmech]\n" ;
@@ -2146,7 +2155,7 @@
my($imap,
$host, $port, $user, $domain, $password,
- $mydebugimap, $mytimeout, $fastio,
+ $mydebugimap, $mytimeout, $fastio, $gwtapp, $gwtappkey,
$ssl, $tls, $authmech, $authuser, $reconnectretry,
$proxyauth, $uid, $split, $Side ) = @_ ;
@@ -2247,7 +2256,7 @@
sub init_imap {
my($host, $port, $user, $domain, $password,
- $mydebugimap, $mytimeout, $fastio,
+ $mydebugimap, $mytimeout, $fastio, $gwtapp, $gwtappkey,
$ssl, $tls, $authmech, $authuser, $reconnectretry,
$proxyauth, $uid, $split, $Side, $SSL_version ) = @_ ;
@@ -5860,7 +5869,10 @@
--dry : Makes imapsync doing nothing, just print what would
be done without --dry.
-
+--gwtapp1 <string> : GroupWise Trusted App Name for Source
+--gwtappkey1 <string> : GroupWise Trusted App Key for Source
+--gwtapp2 <string> : GroupWise Trusted App Key for Destination
+--gwtappkey2 <string> : GroupWise Trusted App Key for Destination
--host1 <string> : Source or "from" imap server. Mandatory.
--port1 <int> : Port to connect on host1. Default is 143.
--user1 <string> : User to login on host1. Mandatory.
@@ -6251,6 +6263,10 @@
"debugcrossduplicates!" => \$debugcrossduplicates,
"log!" => \$log,
"logfile=s" => \$logfile,
+ "gwtapp1=s" => \$gwtapp1,
+ "gwtappkey1=s" => \$gwtappkey1,
+ "gwtapp2=s" => \$gwtapp2,
+ "gwtappkey2=s" => \$gwtappkey2,
);
$debug and print "get options: [$opt_ret]\n";

View file

@ -0,0 +1 @@
/home/gilles/public_html/entrepreneur-howto/50_compta/page_tva_mois.ps

View file

@ -1,6 +1,6 @@
#!/bin/sh
# $Id: paypal_build_invoices,v 1.78 2014/10/22 11:26:06 gilles Exp gilles $
# $Id: paypal_build_invoices,v 1.88 2015/03/26 01:56:35 gilles Exp gilles $
# usage: sh paypal_build_invoices /g/var/paypal_invoices/????
@ -57,6 +57,15 @@ cp /home/gilles/public_html/AGIL/factures/000/facture_imapsync-000.tex /g/var/pa
#/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 3538 /g/paypal/paypal_2014_09_complet.csv
#/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 3614 /g/paypal/virements_2014_10.csv
#/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 3618 /g/paypal/paypal_2014_10_complet.csv
#/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 3691 /g/paypal/paypal_2014_11_complet.csv
#/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 3750 /g/paypal/paypal_2014_12_complet.csv
#/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 3809 /g/paypal/paypal_2015_01_complet.csv
#/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 3877 /g/paypal/paypal_2015_02_complet.csv
#/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 3957 /g/paypal/virements_2015_03.csv
/g/public_html/imapsync/W/paypal_reply/paypal_bilan --write_invoices --first_in 3959 /g/paypal/paypal_2015_03_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 147 /g/paypal/paypal_2010_11_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 214 /g/paypal/paypal_2010_12_complet.csv
@ -108,9 +117,14 @@ cp /home/gilles/public_html/AGIL/factures/000/facture_imapsync-000.tex /g/var/pa
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 3538 /g/paypal/paypal_2014_09_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 3614 /g/paypal/virements_2014_10.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 3618 /g/paypal/paypal_2014_10_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 3691 /g/paypal/paypal_2014_11_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 3750 /g/paypal/paypal_2014_12_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 3809 /g/paypal/paypal_2015_01_complet.csv
set -x
/g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 3691 /g/paypal/paypal_2014_11_complet.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 3877 /g/paypal/paypal_2015_02_complet.csv
#: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 3957 /g/paypal/virements_2015_03.csv
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan --first_in 3959 /g/paypal/paypal_2015_03_complet.csv
set +x
# La totale
@ -119,7 +133,8 @@ set +x
--first_in 147 --avoid_numbers '292 293 643 644 731 732 1093
1330 1331 1332 1333 1334 1652 1653 2131 2132
2295 2296 2297 2298 2625 2626 2970 2971 2972
3093 3296 3411 3412 3450 3451 3614 3615 3616 3617' \
3093 3296 3411 3412 3450 3451 3614 3615 3616 3617
3807 3808 3957 3958' \
/g/paypal/paypal_201?_??_complet.csv
#set -v
@ -127,7 +142,8 @@ set +x
--first_in 147 --avoid_numbers '292 293 643 644 731 732 1093
1330 1331 1332 1333 1334 1652 1653 2131 2132
2295 2296 2297 2298 2625 2626 2970 2971 2972
3093 3296 3411 3412 3450 3451 3614 3615 3616 3617' \
3093 3296 3411 3412 3450 3451 3614 3615 3616 3617
3807 3808 3957 3958' \
/g/paypal/paypal_201?_??_complet.csv
#set +v
@ -153,6 +169,12 @@ set +x
/g/paypal/paypal_2013_??_complet.csv
#set +v
#echo 2014 : 704 ( from 3094 to 3806 ) EUR 36900.00
#set -v
: /g/public_html/imapsync/W/paypal_reply/paypal_bilan \
--first_in 3093 --avoid_numbers '3093 3296 3411 3412 3450 3451 3614 3615 3616 3617' \
/g/paypal/paypal_2014_??_complet.csv
#set +v
echo 'sh paypal_build_invoices /g/var/paypal_invoices/3???'

View file

@ -38,7 +38,7 @@ paypal_init_petite_dev() {
passfile=/g/var/pass/secret.gilles_mbox
host=p
tmpdir=/g/var/paypal_reply_dev
folder='INBOX.03_imapsync.imapsync_paypal_dev'
folder='INBOX.03_imapsync_less.imapsync_paypal_dev'
}

View file

@ -1,13 +1,13 @@
#!/bin/sh
# $Id: paypal_run_laposte,v 1.7 2013/02/08 14:57:43 gilles Exp gilles $
# $Id: paypal_run_laposte,v 1.8 2015/03/09 17:48:48 gilles Exp gilles $
set -e
#set -x
# Add path to commands at home
PATH=$PATH:/g/public_html/imapsync/W/paypal_reply
PERL5LIB=/g/public_html/imapsync/W/Mail-IMAPClient-3.32/lib
PERL5LIB=/g/public_html/imapsync/W/Mail-IMAPClient-3.35/lib
export PERL5LIB
test -f /g/public_html/imapsync/W/paypal_reply/paypal_functions \

View file

@ -8,7 +8,7 @@ set -e
# Add path to commands at home
PATH=$PATH:/g/public_html/imapsync/W/paypal_reply
PERL5LIB=/g/public_html/imapsync/W/Mail-IMAPClient-3.32/lib
PERL5LIB=/g/public_html/imapsync/W/Mail-IMAPClient-3.35/lib
export PERL5LIB
test -f /g/public_html/imapsync/W/paypal_reply/paypal_functions \

View file

@ -1,6 +1,6 @@
#!/bin/sh
# $Id: paypal_send_invoices,v 1.12 2014/05/27 11:16:15 gilles Exp gilles $
# $Id: paypal_send_invoices,v 1.14 2015/02/04 11:36:26 gilles Exp gilles $
# usages:
# sh paypal_send_invoices /g/var/paypal_invoices/147
@ -38,12 +38,14 @@ send_invoice() {
echo '====== END of message ======'
test -f "SENT_TO_$email" || acroread facture_imapsync-${invoice}.pdf&
echo "Send this invoice ${invoice} to $email?"
read r < /dev/tty
#read r < /dev/tty
r=y
mailq
echo SAID "[$r]"
test X"$r" = Xy && {
echo | mutt -H facture_message.txt -a facture_imapsync-${invoice}.pdf facture_imapsync-${invoice}.pdf.asc --
touch SENT_TO_$email
sleep 3
}
}

View file

@ -5,7 +5,7 @@
<title>imapsync download</title>
<meta name="generator" content="Bluefish 1.0.7"/>
<meta name="author" content="Gilles LAMIRAL"/>
<meta name="date" content="2014-10-22T13:13:21+0200"/>
<meta name="date" content="2014-11-21T12:07:54+0100"/>
<meta name="copyright" content=""/>
<meta name="keywords" content=""/>
<meta name="description" content=""/>
@ -47,7 +47,7 @@ and the latest <b>imapsync source code</b> release <!--#exec cmd="cat ../VERSION
<a href="../dist/<!--#exec cmd="cat ../dist/path_last.txt" -->/"><b>download page</b></a>.
</p>
<p>You will receive an invoice soon, in a couple of weeks at worth.
<p>You will receive an invoice soon, in a couple of weeks at the worst.
Ask for it if you need it before.</p>
<p>Next imapsync releases will be available for lifetime without extra payment.<br/>
@ -91,9 +91,10 @@ gilles.lamiral@laposte.net</p>
<!--#config timefmt="%D" -->
<!--#config timefmt="%A %B %d, %Y" -->
<b>This document last modified on <!--#echo var="LAST_MODIFIED" --></b><br/>
($Id: paypal_return.shtml,v 1.16 2014/10/22 11:13:36 gilles Exp gilles $)
($Id: paypal_return.shtml,v 1.18 2015/02/16 21:15:26 gilles Exp gilles $)
</p>
<!-- Google Code for Achat imapsync Conversion Page -->
<script type="text/javascript">
/* <![CDATA[ */
@ -102,17 +103,16 @@ var google_conversion_language = "en";
var google_conversion_format = "2";
var google_conversion_color = "ffffff";
var google_conversion_label = "hVVWCKzApQIQvOe62QM";
var google_conversion_value = 0;
if (30) {
google_conversion_value = 30;
}
var google_conversion_value = 1.00;
var google_conversion_currency = "EUR";
var google_remarketing_only = false;
/* ]]> */
</script>
<script type="text/javascript" src="http://www.googleadservices.com/pagead/conversion.js">
<script type="text/javascript" src="//www.googleadservices.com/pagead/conversion.js">
</script>
<noscript>
<div style="display:inline;">
<img height="1" width="1" style="border-style:none;" alt="" src="http://www.googleadservices.com/pagead/conversion/992916412/?value=30&amp;label=hVVWCKzApQIQvOe62QM&amp;guid=ON&amp;script=0"/>
<img height="1" width="1" style="border-style:none;" alt="" src="//www.googleadservices.com/pagead/conversion/992916412/?value=1.00&amp;currency_code=EUR&amp;label=hVVWCKzApQIQvOe62QM&amp;guid=ON&amp;script=0"/>
</div>
</noscript>

File diff suppressed because it is too large Load diff

View file

@ -1,58 +1,86 @@
Main code has high complexity score (361) at line 1, column 1. Consider refactoring. (Severity: 3)
Regular expression without "/x" flag at line 1143, column 33. See page 236 of PBP. (Severity: 3)
Expression form of "map" at line 1145, column 51. See page 169 of PBP. (Severity: 4)
Regular expression without "/x" flag at line 1153, column 33. See page 236 of PBP. (Severity: 3)
Expression form of "map" at line 1155, column 51. See page 169 of PBP. (Severity: 4)
Code structure is deeply nested at line 1598, column 41. Consider refactoring. (Severity: 3)
Subroutine "foldersizesatend" does not end with "return" at line 1758, column 1. See page 197 of PBP. (Severity: 4)
Too many arguments at line 1784, column 1. See page 182 of PBP. (Severity: 3)
Too many arguments at line 1802, column 1. See page 182 of PBP. (Severity: 3)
Too many arguments at line 1812, column 1. See page 182 of PBP. (Severity: 3)
Too many arguments at line 2049, column 1. See page 182 of PBP. (Severity: 3)
Too many arguments at line 2110, column 1. See page 182 of PBP. (Severity: 3)
Too many arguments at line 2170, column 1. See page 182 of PBP. (Severity: 3)
Too many arguments at line 2273, column 1. See page 182 of PBP. (Severity: 3)
Subroutine "is_valid_directory" does not end with "return" at line 2409, column 1. See page 197 of PBP. (Severity: 4)
"die" used instead of "croak" at line 2450, column 2. See page 283 of PBP. (Severity: 3)
Always unpack @_ first at line 2544, column 1. See page 178 of PBP. (Severity: 4)
Regular expression without "/x" flag at line 2551, column 15. See page 236 of PBP. (Severity: 3)
Regular expression without "/x" flag at line 2552, column 15. See page 236 of PBP. (Severity: 3)
Regular expression without "/x" flag at line 2553, column 15. See page 236 of PBP. (Severity: 3)
Regular expression without "/x" flag at line 2554, column 15. See page 236 of PBP. (Severity: 3)
Regular expression without "/x" flag at line 2581, column 31. See page 236 of PBP. (Severity: 3)
Reused variable name in lexical scope: $imap2 at line 2638, column 9. Invent unique variable names. (Severity: 3)
Regular expression without "/x" flag at line 2657, column 25. See page 236 of PBP. (Severity: 3)
Regular expression without "/x" flag at line 2660, column 20. See page 236 of PBP. (Severity: 3)
Mixed high and low-precedence booleans at line 2661, column 13. See page 70 of PBP. (Severity: 4)
Expression form of "eval" at line 3098, column 13. See page 161 of PBP. (Severity: 5)
Expression form of "eval" at line 3322, column 13. See page 161 of PBP. (Severity: 5)
Subroutine "select_msgs" does not end with "return" at line 3463, column 1. See page 197 of PBP. (Severity: 4)
Subroutine "tests_msgs_from_maxmin" does not end with "return" at line 3602, column 1. See page 197 of PBP. (Severity: 4)
Subroutine "copy_message" with high complexity score (30) at line 3679, column 1. Consider refactoring. (Severity: 3)
Too many arguments at line 3679, column 1. See page 182 of PBP. (Severity: 3)
Too many arguments at line 3770, column 1. See page 182 of PBP. (Severity: 3)
Subroutine "tests_subject" does not end with "return" at line 3864, column 1. See page 197 of PBP. (Severity: 4)
Too many arguments at line 3927, column 1. See page 182 of PBP. (Severity: 3)
Subroutine "sleep_if_needed" does not end with "return" at line 3986, column 1. See page 197 of PBP. (Severity: 4)
Reused variable name in lexical scope: $total_bytes_transferred at line 3987, column 2. Invent unique variable names. (Severity: 3)
Reused variable name in lexical scope: $nb_msg_transferred at line 3987, column 2. Invent unique variable names. (Severity: 3)
Reused variable name in lexical scope: $nb_msg_transferred at line 3999, column 9. Invent unique variable names. (Severity: 3)
Reused variable name in lexical scope: $maxmessagespersecond at line 3999, column 9. Invent unique variable names. (Severity: 3)
Reused variable name in lexical scope: $total_bytes_transferred at line 4020, column 9. Invent unique variable names. (Severity: 3)
Reused variable name in lexical scope: $maxbytespersecond at line 4020, column 9. Invent unique variable names. (Severity: 3)
Mismatched operator at line 4508, column 75. Numeric/string operators and operands should match. (Severity: 3)
Hard tabs used at line 4592, column 10. See page 20 of PBP. (Severity: 3)
Expression form of "eval" at line 4866, column 13. See page 161 of PBP. (Severity: 5)
Too many arguments at line 5022, column 1. See page 182 of PBP. (Severity: 3)
Backtick operator used at line 5335, column 12. Use IPC::Open3 instead. (Severity: 3)
Backtick operator used at line 5355, column 11. Use IPC::Open3 instead. (Severity: 3)
Expression form of "eval" at line 5656, column 43. See page 161 of PBP. (Severity: 5)
Expression form of "eval" at line 5660, column 45. See page 161 of PBP. (Severity: 5)
"$i" is declared but not used at line 5924, column 9. Unused variables clutter code and make it harder to read. (Severity: 3)
Reused variable name in lexical scope: $logfile at line 5976, column 2. Invent unique variable names. (Severity: 3)
Subroutine "teelaunch" does not end with "return" at line 5983, column 1. See page 197 of PBP. (Severity: 4)
Reused variable name in lexical scope: $logfile at line 5984, column 2. Invent unique variable names. (Severity: 3)
Close filehandles as soon as possible after opening them at line 5987, column 2. See page 209 of PBP. (Severity: 4)
"die" used instead of "croak" at line 5988, column 7. See page 283 of PBP. (Severity: 3)
Magic variable "*STDERR" should be assigned as "local" at line 5990, column 10. See pages 81,82 of PBP. (Severity: 4)
One-argument "select" used at line 5991, column 2. See page 224 of PBP. (Severity: 4)
Main code has high complexity score (381) at line 1, column 1. Consider refactoring. (Severity: 3)
Literal line breaks in a string at line 1028, column 1. See pages 60,61 of PBP. (Severity: 3)
Literal line breaks in a string at line 1040, column 1. See pages 60,61 of PBP. (Severity: 3)
Regular expression without "/x" flag at line 1212, column 33. See page 236 of PBP. (Severity: 3)
Regular expression without "/x" flag at line 1221, column 33. See page 236 of PBP. (Severity: 3)
Regular expression without "/x" flag at line 1238, column 18. See page 236 of PBP. (Severity: 3)
Literal line breaks in a string at line 1312, column 1. See pages 60,61 of PBP. (Severity: 3)
Literal line breaks in a string at line 1345, column 1. See pages 60,61 of PBP. (Severity: 3)
Code structure is deeply nested at line 1711, column 41. Consider refactoring. (Severity: 3)
Literal line breaks in a string at line 1859, column 1. See pages 60,61 of PBP. (Severity: 3)
Subroutine "errors_incr" does not end with "return" at line 1881, column 1. See page 197 of PBP. (Severity: 4)
Subroutine "tests_live_result" does not end with "return" at line 1906, column 1. See page 197 of PBP. (Severity: 4)
Reused variable name in lexical scope: $nb_errors at line 1907, column 2. Invent unique variable names. (Severity: 3)
Subroutine "foldersizesatend" does not end with "return" at line 1915, column 1. See page 197 of PBP. (Severity: 4)
Too many arguments at line 1941, column 1. See page 182 of PBP. (Severity: 3)
Too many arguments at line 1959, column 1. See page 182 of PBP. (Severity: 3)
Too many arguments at line 1969, column 1. See page 182 of PBP. (Severity: 3)
Too many arguments at line 2216, column 1. See page 182 of PBP. (Severity: 3)
Too many arguments at line 2277, column 1. See page 182 of PBP. (Severity: 3)
Subroutine "authenticate_imap" with high complexity score (21) at line 2338, column 1. Consider refactoring. (Severity: 3)
Too many arguments at line 2338, column 1. See page 182 of PBP. (Severity: 3)
Too many arguments at line 2442, column 1. See page 182 of PBP. (Severity: 3)
Regular expression without "/x" flag at line 2515, column 51. See page 236 of PBP. (Severity: 3)
Backtick operator used at line 2523, column 12. Use IPC::Open3 instead. (Severity: 3)
Subroutine "is_valid_directory" does not end with "return" at line 2653, column 1. See page 197 of PBP. (Severity: 4)
Close filehandles as soon as possible after opening them at line 2673, column 2. See page 209 of PBP. (Severity: 4)
Subroutine "remove_tmp_files" does not end with "return" at line 2684, column 1. See page 197 of PBP. (Severity: 4)
"die" used instead of "croak" at line 2698, column 2. See page 283 of PBP. (Severity: 3)
Always unpack @_ first at line 2799, column 1. See page 178 of PBP. (Severity: 4)
Regular expression without "/x" flag at line 2806, column 15. See page 236 of PBP. (Severity: 3)
Regular expression without "/x" flag at line 2807, column 15. See page 236 of PBP. (Severity: 3)
Regular expression without "/x" flag at line 2808, column 15. See page 236 of PBP. (Severity: 3)
Regular expression without "/x" flag at line 2834, column 31. See page 236 of PBP. (Severity: 3)
Reused variable name in lexical scope: $imap2 at line 2894, column 9. Invent unique variable names. (Severity: 3)
Regular expression without "/x" flag at line 2913, column 25. See page 236 of PBP. (Severity: 3)
Regular expression without "/x" flag at line 2916, column 20. See page 236 of PBP. (Severity: 3)
Mixed high and low-precedence booleans at line 2917, column 13. See page 70 of PBP. (Severity: 4)
Expression form of "eval" at line 3356, column 13. See page 161 of PBP. (Severity: 5)
Expression form of "eval" at line 3581, column 13. See page 161 of PBP. (Severity: 5)
Subroutine "select_msgs" does not end with "return" at line 3722, column 1. See page 197 of PBP. (Severity: 4)
Subroutine "tests_msgs_from_maxmin" does not end with "return" at line 3861, column 1. See page 197 of PBP. (Severity: 4)
Subroutine "copy_message" with high complexity score (25) at line 3938, column 1. Consider refactoring. (Severity: 3)
Too many arguments at line 3938, column 1. See page 182 of PBP. (Severity: 3)
Too many arguments at line 4016, column 1. See page 182 of PBP. (Severity: 3)
Too many arguments at line 4050, column 1. See page 182 of PBP. (Severity: 3)
Subroutine "tests_subject" does not end with "return" at line 4177, column 1. See page 197 of PBP. (Severity: 4)
Too many arguments at line 4240, column 1. See page 182 of PBP. (Severity: 3)
Subroutine "sleep_if_needed" does not end with "return" at line 4299, column 1. See page 197 of PBP. (Severity: 4)
Reused variable name in lexical scope: $total_bytes_transferred at line 4300, column 2. Invent unique variable names. (Severity: 3)
Reused variable name in lexical scope: $nb_msg_transferred at line 4300, column 2. Invent unique variable names. (Severity: 3)
Reused variable name in lexical scope: $nb_msg_transferred at line 4312, column 9. Invent unique variable names. (Severity: 3)
Reused variable name in lexical scope: $maxmessagespersecond at line 4312, column 9. Invent unique variable names. (Severity: 3)
Reused variable name in lexical scope: $total_bytes_transferred at line 4333, column 9. Invent unique variable names. (Severity: 3)
Reused variable name in lexical scope: $maxbytespersecond at line 4333, column 9. Invent unique variable names. (Severity: 3)
Hard tabs used at line 4918, column 10. See page 20 of PBP. (Severity: 3)
Expression form of "eval" at line 5522, column 13. See page 161 of PBP. (Severity: 5)
Regular expression without "/x" flag at line 5757, column 22. See page 236 of PBP. (Severity: 3)
Expression form of "eval" at line 5762, column 13. See page 161 of PBP. (Severity: 5)
Too many arguments at line 5926, column 1. See page 182 of PBP. (Severity: 3)
Always unpack @_ first at line 6088, column 1. See page 178 of PBP. (Severity: 4)
Backtick operator used at line 6095, column 4. Use IPC::Open3 instead. (Severity: 3)
Subroutine "tests_pipemess" does not end with "return" at line 6112, column 1. See page 197 of PBP. (Severity: 4)
Backtick operator used at line 6301, column 12. Use IPC::Open3 instead. (Severity: 3)
Backtick operator used at line 6321, column 11. Use IPC::Open3 instead. (Severity: 3)
Split long regexps into smaller qr// chunks at line 6459, column 12. See page 261 of PBP. (Severity: 3)
Split long regexps into smaller qr// chunks at line 6485, column 12. See page 261 of PBP. (Severity: 3)
Split long regexps into smaller qr// chunks at line 6514, column 12. See page 261 of PBP. (Severity: 3)
Split long regexps into smaller qr// chunks at line 6526, column 12. See page 261 of PBP. (Severity: 3)
Expression form of "eval" at line 6632, column 43. See page 161 of PBP. (Severity: 5)
Expression form of "eval" at line 6636, column 45. See page 161 of PBP. (Severity: 5)
Split long regexps into smaller qr// chunks at line 6841, column 20. See page 261 of PBP. (Severity: 3)
"$i" is declared but not used at line 6900, column 9. Unused variables clutter code and make it harder to read. (Severity: 3)
Magic variable "$ENV" should be assigned as "local" at line 6947, column 12. See pages 81,82 of PBP. (Severity: 4)
Magic variable "$ENV" should be assigned as "local" at line 6955, column 12. See pages 81,82 of PBP. (Severity: 4)
Test without a label at line 6962, column 2. Add a label argument to all Test::More functions. (Severity: 3)
Test without a label at line 6963, column 2. Add a label argument to all Test::More functions. (Severity: 3)
Reused variable name in lexical scope: $logfile at line 6968, column 2. Invent unique variable names. (Severity: 3)
Subroutine "teelaunch" does not end with "return" at line 6975, column 1. See page 197 of PBP. (Severity: 4)
Reused variable name in lexical scope: $logfile at line 6976, column 2. Invent unique variable names. (Severity: 3)
Close filehandles as soon as possible after opening them at line 6979, column 2. See page 209 of PBP. (Severity: 4)
"die" used instead of "croak" at line 6980, column 7. See page 283 of PBP. (Severity: 3)
Magic variable "*STDERR" should be assigned as "local" at line 6982, column 10. See pages 81,82 of PBP. (Severity: 4)
One-argument "select" used at line 6983, column 2. See page 224 of PBP. (Severity: 4)
Subroutine "testslive" does not end with "return" at line 7462, column 1. See page 197 of PBP. (Severity: 4)
Return value of eval not tested at line 7484, column 17. You can't depend upon the value of $@/$EVAL_ERROR to tell whether an eval failed. (Severity: 3)
Return value of eval not tested at line 7523, column 17. You can't depend upon the value of $@/$EVAL_ERROR to tell whether an eval failed. (Severity: 3)

29
W/prereq.Ubuntu Normal file
View file

@ -0,0 +1,29 @@
$SHELL says /bin/bash
$0 gives ./INSTALL.d/prerequisites_imapsync
ps -ef gives gilles 14968 14967 0 04:58 pts/13 00:00:00 /bin/sh ./INSTALL.d/prerequisites_imapsync
Distributor ID: Ubuntu
Description: Ubuntu 12.04.5 LTS
Release: 12.04
Codename: precise
Linux petite 3.2.0-77-generic #114-Ubuntu SMP Tue Mar 10 17:25:28 UTC 2015 i686 i686 i386 GNU/Linux
Ok: Found Perl 5.14.2
Ok: Found Perl module Digest::HMAC_MD5
Ok: Found Perl module Authen::NTLM
Ok: Found Perl module Compress::Zlib
Ok: Found Perl module Data::Dumper
Ok: Found Perl module Data::Uniqid
Ok: Found Perl module Digest::HMAC
Ok: Found Perl module Digest::MD5
Ok: Found Perl module File::Copy::Recursive
Ok: Found Perl module IO::Socket::INET
Ok: Found Perl module IO::Socket::INET6
Ok: Found Perl module IO::Socket::SSL
Ok: Found Perl module IO::Tee
Ok: Found Perl module Mail::IMAPClient
Ok: Found Perl module Parse::RecDescent
Ok: Found Perl module Term::ReadKey
Ok: Found Perl module Test::More
Ok: Found Perl module Test::Pod
Ok: Found Perl module Unicode::String
Ok: Found Perl module URI::Escape
All needed modules are already installed

426
W/prereq.scandeps Normal file
View file

@ -0,0 +1,426 @@
usage: imapsync [options]
Several options are mandatory.
--dry : Makes imapsync doing nothing, just print what would
be done without --dry.
--host1 <string> : Source or "from" imap server. Mandatory.
--port1 <int> : Port to connect on host1. Default is 143, 993 if --ssl1
--user1 <string> : User to login on host1. Mandatory.
--showpasswords : Shows passwords on output instead of "MASKED".
Useful to restart a complete run by just reading the log.
--password1 <string> : Password for the user1.
--host2 <string> : "destination" imap server. Mandatory.
--port2 <int> : Port to connect on host2. Default is 143, 993 if --ssl2
--user2 <string> : User to login on host2. Mandatory.
--password2 <string> : Password for the user2.
--passfile1 <string> : Password file for the user1. It must contain the
password on the first line. This option avoids to show
the password on the command line like --password1 does.
--passfile2 <string> : Password file for the user2. Contains the password.
--ssl1 : Use a SSL connection on host1.
--ssl2 : Use a SSL connection on host2.
--tls1 : Use a TLS connection on host1.
--tls2 : Use a TLS connection on host2.
--timeout <int> : Connections timeout in seconds. Default is 120.
0 means no timeout.
--authmech1 <string> : Auth mechanism to use with host1:
PLAIN, LOGIN, CRAM-MD5 etc. Use UPPERCASE.
--authmech2 <string> : Auth mechanism to use with host2. See --authmech1
--authuser1 <string> : User to auth with on host1 (admin user).
Avoid using --authmech1 SOMETHING with --authuser1.
--authuser2 <string> : User to auth with on host2 (admin user).
--proxyauth1 : Use proxyauth on host1. Requires --authuser1.
Required by Sun/iPlanet/Netscape IMAP servers to
be able to use an administrative user.
--proxyauth2 : Use proxyauth on host2. Requires --authuser2.
--authmd51 : Use MD5 authentification for host1.
--authmd52 : Use MD5 authentification for host2.
--domain1 <string> : Domain on host1 (NTLM authentication).
--domain2 <string> : Domain on host2 (NTLM authentication).
--folder <string> : Sync this folder.
--folder <string> : and this one, etc.
--folderrec <string> : Sync this folder recursively.
--folderrec <string> : and this one, etc.
--folderfirst <string> : Sync this folder first. --folderfirst "Work"
--folderfirst <string> : then this one, etc.
--folderlast <string> : Sync this folder last. --folderlast "[Gmail]/All Mail"
--folderlast <string> : then this one, etc.
--nomixfolders : Do not merge folders when host1 is case sensitive
while host2 is not (like Exchange). Only the first
similar folder is synced (ex: Sent SENT sent -> Sent).
--skipemptyfolders : Empty host1 folders are not created on host2.
--include <regex> : Sync folders matching this regular expression
--include <regex> : or this one, etc.
in case both --include --exclude options are
use, include is done before.
--exclude <regex> : Skips folders matching this regular expression
Several folders to avoid:
--exclude 'fold1|fold2|f3' skips fold1, fold2 and f3.
--exclude <regex> : or this one, etc.
--regextrans2 <regex> : Apply the whole regex to each destination folders.
--regextrans2 <regex> : 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.
Have in mind that --regextrans2 is applied after prefix
and separator inversion.
--tmpdir <string> : Where to store temporary files and subdirectories.
Will be created if it doesn't exist.
Default is system specific, Unix is /tmp but
it's often small and deleted at reboot.
--tmpdir /var/tmp should be better.
--pidfile <string> : The file where imapsync pid is written.
--pidfilelocking : Abort if pidfile already exists. Usefull to avoid
concurrent transfers on the same mailbox.
--nolog : Turn off logging on file
--logfile <string> : Change the default logfile pathname and filename.
--prefix1 <string> : Remove prefix to all destination folders
(usually INBOX. or INBOX/ or an empty string "")
you have to use --prefix1 if host1 imap server
does not have NAMESPACE capability, all other
cases are bad.
--prefix2 <string> : Add prefix to all host2 folders. See --prefix1
--sep1 <string> : Host1 separator in case NAMESPACE is not supported.
--sep2 <string> : Host2 separator in case NAMESPACE is not supported.
--skipmess <regex> : Skips messages maching the regex.
Example: 'm/[\x80-ff]/' # to avoid 8bits messages.
--skipmess is applied before --regexmess
--skipmess <regex> : or this one, etc.
--disarmreadreceipts : Disarms read receipts (host2 Exchange issue)
--regexmess <regex> : Apply the whole regex to each message before transfer.
Example: 's/\000/ /g' # to replace null by space.
--regexmess <regex> : and this one, etc.
--regexflag <regex> : Apply the whole regex to each flags list.
Example: 's/"Junk"//g' # to remove "Junk" flag.
--regexflag <regex> : and this one, etc.
--delete : Deletes messages on host1 server after a successful
transfer. Option --delete has the following behavior:
it marks messages as deleted with the IMAP flag
\Deleted, then messages are really deleted with an
EXPUNGE IMAP command.
--delete2 : Delete messages in host2 that are not in
host1 server. Useful for backup or pre-sync.
--delete2duplicates : Delete messages in host2 that are duplicates.
Works only without --useuid since duplicates are
detected with an header part of each message.
--delete2folders : Delete folders in host2 that are not in host1 server.
For safety, first try it like this (it is safe):
--delete2folders --dry --justfolders --nofoldersizes
--delete2foldersonly <regex>: Deleted only folders matching regex.
Example: --delete2foldersonly "/^Junk$|^INBOX.Junk$/"
--delete2foldersbutnot <regex>: Do not delete folders matching regex.
Example: --delete2foldersbutnot "/Tasks$|Contacts$|Foo$/"
--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 messages transfer.
--expunge2 : Expunge messages on host2 after messages transfer.
--uidexpunge2 : uidexpunge messages on the host2 account
that are not on the host1 account, requires --delete2
--nomixfolders : Avoid merging folders that are considered different on
host1 but the same on destination host2 because of
case sensitivities and insensitivities.
--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 <int> : Skip messages larger (or equal) than <int> bytes
--minsize <int> : Skip messages smaller (or equal) than <int> bytes
--maxage <int> : Skip messages older than <int> days.
final stats (skipped) don't count older messages
see also --minage
--minage <int> : Skip messages newer than <int> 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)
--search <string> : Selects only messages returned by this IMAP SEARCH
command. Applied on both sides.
--search1 <string> : Same as --search for selecting host1 messages only.
--search2 <string> : Same as --search for selecting host2 messages only.
--search CRIT equals --search1 CRIT --search2 CRIT
--exitwhenover <int> : Stop syncing when total bytes transferred reached.
Gmail per day allows 2500000000 down 500000000 upload.
--maxlinelength <int> : skip messages with a line length longer than <int> bytes.
RFC 2822 says it must be no more than 1000 bytes.
--useheader <string> : Use this header to compare messages on both sides.
Ex: Message-ID or Subject or Date.
--useheader <string> and this one, etc.
--subscribed : Transfers subscribed folders.
--subscribe : Subscribe to the folders transferred on the
host2 that are subscribed on host1. On by default.
--subscribeall : 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.
--nofoldersizesatend : Do not calculate the size of each folder in bytes
and message counts at the end. Default is on.
--justfoldersizes : Exit after having printed the folder sizes.
--syncacls : Synchronises acls (Access Control Lists).
--nosyncacls : Does not synchronize acls. This is the default.
Acls in IMAP are not standardized, be careful.
--usecache : Use cache to speedup.
--nousecache : Do not use cache. Caveat: --useuid --nousecache creates
duplicates on multiple runs.
--useuid : Use uid instead of header as a criterium to recognize
messages. Option --usecache is then implied unless
--nousecache is used.
--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.
--tests : Run non-regression tests.
--testslive : Run a live test with test1.lamiral.info imap server.
Useful to check the basics. Needs internet connexion.
--version : Print software version.
--noreleasecheck : Do not check for new imapsync release (a http request).
--releasecheck : 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 : Do only things about folders (ignore messages).
--help : print this help.
Example: to synchronize imap account "test1" on "test1.lamiral.info"
to imap account "test2" on "test2.lamiral.info"
with test1 password "secret1"
and test2 password "secret2"
imapsync \
--host1 test1.lamiral.info --user1 test1 --password1 secret1 \
--host2 test2.lamiral.info --user2 test2 --password2 secret2
Here is a [linux] system (Linux petite 3.2.0-77-generic #114-Ubuntu SMP Tue Mar 10 17:25:28 UTC 2015 i686)
With perl 5.14.2 Mail::IMAPClient 3.30
$Id: imapsync,v 1.637 2015/04/01 01:36:37 gilles Exp gilles $
This current imapsync is up to date
Homepage: http://imapsync.lamiral.info/
'Tie::Hash::NamedCapture' => '0.08',
'Authen::NTLM::DES' => '1.02',
'Authen::NTLM::MD4' => '1.02',
'IO::Compress::Gzip' => '2.048',
'IO::Uncompress::Gunzip' => '2.048',
'IO::Compress::Gzip::Constants' => '2.048',
'IO::Compress::Base::Common' => '2.048',
'Compress::Raw::Zlib' => '2.048',
'Convert::ASN1::IO' => 'undef',
'Convert::ASN1::_decode' => 'undef',
'Convert::ASN1::_encode' => 'undef',
'Convert::ASN1::parser' => 'undef',
'Crypt::SSLeay::X509' => 'undef',
'Crypt::SSLeay::CTX' => 'undef',
'Digest::HMAC' => '1.03',
'Cwd' => '3.33',
'HTML::Parser' => '3.69',
'HTTP::Cookies::Netscape' => '6.00',
'Time::Zone' => '2.24',
'IO::Compress::Bzip2' => '2.048',
'IO::Compress::Deflate' => '2.048',
'IO::Uncompress::Bunzip2' => '2.048',
'IO::Uncompress::Inflate' => '2.048',
'IO::Uncompress::RawInflate' => '2.048',
'HTTP::Message' => '6.01',
'Compress::Raw::Bzip2' => '2.048',
'File::GlobMapper' => '1.000',
'IO::Compress::Base' => '2.048',
'IO::Compress::Adapter::Bzip2' => '2.048',
'IO::Compress::RawDeflate' => '2.048',
'IO::Compress::Adapter::Deflate' => '2.048',
'IO::Compress::Zlib::Extra' => '2.048',
'Socket6' => '0.23',
'IO::Socket::INET6' => '2.69',
'Net::SSLeay' => '1.42',
'IO::Uncompress::Adapter::Bunzip2' => '2.048',
'IO::Uncompress::Base' => '2.048',
'IO::Compress::Zlib::Constants' => '2.048',
'IO::Uncompress::Adapter::Inflate' => '2.048',
'common::sense' => '3.4',
'Authen::NTLM' => '1.09',
'CPAN::Config' => 'undef',
'URI::data' => 'undef',
'URI::_idna' => 'undef',
'URI::mailto' => 'undef',
'URI::_query' => 'undef',
'URI::QueryParam' => 'undef',
'URI::Split' => 'undef',
'URI::_foreign' => 'undef',
'URI::_segment' => 'undef',
'URI::file::FAT' => 'undef',
'URI::file::Mac' => 'undef',
'URI::file::OS2' => 'undef',
'URI::file::QNX' => 'undef',
'URI::ftp' => 'undef',
'URI::gopher' => 'undef',
'URI::https' => 'undef',
'URI::ldapi' => 'undef',
'URI::ldaps' => 'undef',
'URI::mms' => 'undef',
'URI::nntp' => 'undef',
'URI::pop' => 'undef',
'URI::rlogin' => 'undef',
'URI::rsync' => 'undef',
'URI::rtspu' => 'undef',
'URI::sips' => 'undef',
'URI::snews' => 'undef',
'URI::ssh' => 'undef',
'URI::telnet' => 'undef',
'URI::tn3270' => 'undef',
'URI::file::Win32' => 'undef',
'URI::file::Unix' => 'undef',
'URI::file::Base' => 'undef',
'URI::_punycode' => '0.04',
'URI::IRI' => 'undef',
'URI::_ldap' => '1.12',
'URI::ldap' => '1.12',
'URI::news' => 'undef',
'URI::rtsp' => 'undef',
'URI::Heuristic' => '4.20',
'URI::_userpass' => 'undef',
'URI::sip' => '0.11',
'URI::_login' => 'undef',
'URI::_generic' => 'undef',
'URI' => '1.59',
'URI::_server' => 'undef',
'File::Listing' => '6.03',
'HTTP::Status' => '6.00',
'LWP::MediaTypes' => '6.01',
'HTTP::Negotiate' => '6.00',
'Net::HTTP' => '6.02',
'Net::HTTPS' => '6.02',
'LWP::Debug' => 'undef',
'Net::LDAP' => '0.43',
'Net::LDAP::LDIF' => '0.18',
'Mail::Internet' => '2.08',
'HTML::HeadParser' => '3.69',
'HTTP::Config' => '6.00',
'HTTP::Request::Common' => '6.00',
'LWP::ConnCache' => '6.02',
'HTTP::Headers' => '6.00',
'HTTP::Cookies' => '6.00',
'Encode::Locale' => '1.02',
'HTTP::Headers::Util' => '6.00',
'LWP::MemberMixin' => 'undef',
'LWP' => '6.03',
'HTTP::Date' => '6.00',
'HTTP::Request' => '6.00',
'LWP::Protocol' => '6.00',
'HTTP::Response' => '6.01',
'Compress::Zlib' => '2.048',
'Mail::IMAPClient::MessageSet' => 'undef',
'Digest::HMAC_MD5' => '1.01',
'Mail::Address' => '2.08',
'Mail::Header' => '2.08',
'Mail::Mailer' => '2.08',
'Mail::Util' => '2.08',
'Net::HTTP::Methods' => '6.00',
'Net::SSL' => '2.84',
'Net::LDAP::Bind' => '1.03',
'Net::LDAP::Extension' => '1.02',
'Net::LDAP::RootDSE' => '0.01',
'Net::LDAP::Schema' => '0.9905',
'Net::LDAP::Search' => '0.13',
'Convert::ASN1::Debug' => 'undef',
'Convert::ASN1' => '0.22',
'Net::LDAP::Entry' => '0.24',
'Net::LDAP::ASN' => '0.08',
'Net::LDAP::Constant' => '0.08',
'Net::LDAP::Filter' => '0.15',
'Net::LDAP::Message' => '1.11',
'Net::LDAP::Util' => '0.11',
'Net::LDAP::Control' => '0.09',
'Net::LDAP::Intermediate' => '0.02',
'Crypt::SSLeay::Conn' => 'undef',
'Crypt::SSLeay::Err' => 'undef',
'Crypt::SSLeay::MainContext' => 'undef',
'Crypt::SSLeay' => '0.57',
'Test::Builder::IO::Scalar' => '2.110',
'threads::shared' => '1.40',
'Test::Builder' => '0.98',
'Test::Builder::Module' => '0.98',
'URI::WithBase' => '2.20',
'URI::file' => '4.21',
'Unicode::CharName' => '1.07',
'Data::Uniqid' => '0.12',
'Digest::HMAC_SHA1' => '1.03',
'File::Copy::Recursive' => '0.38',
'IO::Tee' => '0.64',
'JSON::XS::Boolean' => 'undef',
'Term::ReadKey' => '2.30',
'Test::More' => '0.98',
'Unicode::String' => '2.09',
'File::Spec::Unix' => '3.33',
'File::Spec' => '3.33',
'JSON::XS' => '2.32',
'LWP::UserAgent' => '6.03',
'HTML::Entities' => '3.69',
'LWP::Authen::Digest' => 'undef',
'LWP::Authen::Ntlm' => '6.00',
'LWP::Protocol::GHTTP' => 'undef',
'LWP::Protocol::cpan' => 'undef',
'LWP::Protocol::data' => 'undef',
'LWP::Protocol::file' => 'undef',
'LWP::Protocol::ftp' => 'undef',
'LWP::Protocol::gopher' => 'undef',
'LWP::Protocol::https' => '6.02',
'LWP::Protocol::ldaps' => 'undef',
'LWP::Protocol::loopback' => 'undef',
'LWP::Protocol::mailto' => 'undef',
'LWP::Protocol::nntp' => 'undef',
'LWP::Protocol::nogo' => 'undef',
'LWP::Authen::Basic' => 'undef',
'URI::http' => 'undef',
'URI::URL' => '5.04',
'LWP::Protocol::http' => 'undef',
'LWP::Protocol::ldap' => '1.11',
'IO::Socket::SSL' => '1.53',
'URI::Escape' => '3.31',

View file

@ -25,6 +25,11 @@ body {
width: 100%;
}
#right-tronche {
float: right;
width: 60%;
}
div.center {
text-align: center;
}
@ -48,4 +53,4 @@ img {
font-size: smaller;
}
/* $Id: style.css,v 1.5 2014/07/31 03:33:43 gilles Exp gilles $ */
/* $Id: style.css,v 1.6 2015/03/03 11:24:45 gilles Exp gilles $ */

View file

@ -1,5 +1,5 @@
REM $Id: test.bat,v 1.11 2014/05/22 10:15:45 gilles Exp gilles $
REM $Id: test.bat,v 1.12 2015/03/15 04:04:11 gilles Exp gilles $
cd /D %~dp0
@ -9,6 +9,7 @@ perl -mMail::IMAPClient -mDigest::MD5 -mTerm::ReadKey -mIO::Socket::SSL ^
-mData::Uniqid -mURI::Escape -mIO::Tee ""
perl ./imapsync
@REM perl ./imapsync --tests
@ECHO ==== All 8 combinaisons between ssl1/tls1 ssl2/tls2 justconnect/justlogin

View file

@ -1,15 +1,24 @@
@REM $Id: test3.bat,v 1.16 2014/11/14 17:09:50 gilles Exp gilles $
@REM $Id: test3.bat,v 1.19 2015/03/15 03:02:58 gilles Exp gilles $
cd /D %~dp0
@REM \$1 must be $1 on Windows
@REM .\imapsync.exe --host1 ex-cashub1.caltech.edu --justconnect --host2 ex-cashub1.caltech.edu --ssl1 --ssl2 --ssl1_SSL_version SSLv3 --ssl2_SSL_version SSLv3
perl .\imapsync --tests_debug
@REM perl .\imapsync --tests_debug
@REM @EXIT
perl .\imapsync --host1 p --user1 tata --passfile1 secret.tata --host2 p --user2 titi --passfile2 secret.titi ^
--foldersizes --usecache --folder "INBOX.[bracket]" --debugcache
@REM perl .\imapsync --host1 p --user1 tata --passfile1 secret.tata --host2 p --user2 titi --passfile2 secret.titi ^
@REM --nofoldersizes --regextrans2 "s,INBOX\\yop\\(.*),OLDBOX\\$1," --prefix1 "" --sep1 "." --sep2 "\\" --prefix2 "" --justfolders --dry --debug
.\imapsync.exe ^
--host1 p --user1 tata ^
--passfile1 secret.tata ^
--host2 imap-mail.outlook.com --ssl2 --user2 gilles.lamiral@outlook.com ^
--passfile2 secret.outlook.com ^
--folder INBOX --usecache --regextrans2 "s/INBOX/tata/"
@EXIT

11
W/test_cook_exe.bat Executable file
View file

@ -0,0 +1,11 @@
REM $Id: test_exe.bat,v 1.11 2014/05/22 10:13:34 gilles Exp gilles $
cd /D %~dp0
@REM EXIT
.\imapsync.exe
.\imapsync.exe --tests
.\imapsync.exe --testslive
@PAUSE

11
W/test_cook_src.bat Executable file
View file

@ -0,0 +1,11 @@
REM $Id: test_exe.bat,v 1.11 2014/05/22 10:13:34 gilles Exp gilles $
cd /D %~dp0
@REM EXIT
perl .\imapsync
perl .\imapsync --tests
perl .\imapsync --testslive
@PAUSE

View file

@ -1,6 +1,6 @@
@REM
@REM $Id: test_exe_2.bat,v 1.5 2014/11/14 17:09:34 gilles Exp gilles $
@REM $Id: test_exe_2.bat,v 1.6 2015/03/20 03:11:22 gilles Exp gilles $
@REM cd C:\msys\1.0\home\Admin\imapsync
cd /D %~dp0
@ -8,8 +8,11 @@ cd /D %~dp0
@REM imapsync.exe --host1 p --user1 toto --passfile1 secret.toto --host2 p --user2 titi --passfile2 secret.titi
@REM .\imapsync.exe --host1 p --user1 tata --passfile1 secret.tata --host2 p --user2 titi --passfile2 secret.titi
.\imapsync.exe --host1 p --user1 tata --passfile1 secret.tata --host2 p --user2 titi --passfile2 secret.titi ^
--foldersizes --usecache --folder "INBOX.[bracket]" --debugcache
@REM .\imapsync.exe --host1 p --user1 tata --passfile1 secret.tata --host2 p --user2 titi --passfile2 secret.titi ^
@REM --foldersizes --usecache --folder "INBOX.[bracket]" --debugcache
@REM .\imapsync.exe --host1 p --user1 tata --passfile1 secret.tata --host2 p --user2 titi --passfile2 secret.titi ^
@REM --dry --nofoldersizes --regextrans2 "s,(.*),\L$1," --justfolders
@REM .\imapsync.exe --testslive
perl .\imapsync --tests

10
W/test_tests.bat Executable file
View file

@ -0,0 +1,10 @@
@REM
@REM $Id: test_exe_2.bat,v 1.6 2015/03/20 03:11:22 gilles Exp gilles $
@REM cd C:\msys\1.0\home\Admin\imapsync
cd /D %~dp0
perl .\imapsync --tests
@REM @PAUSE

View file

@ -1 +0,0 @@
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL

View file

@ -1 +0,0 @@
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL

Some files were not shown because too many files have changed in this diff Show more