mirror of
https://github.com/imapsync/imapsync.git
synced 2025-06-06 12:47:13 +02:00
1.201
This commit is contained in:
parent
9cb7c657c7
commit
ab2854d584
8 changed files with 108 additions and 15 deletions
|
@ -1,15 +1,20 @@
|
||||||
|
|
||||||
RCS file: RCS/imapsync,v
|
RCS file: RCS/imapsync,v
|
||||||
Working file: imapsync
|
Working file: imapsync
|
||||||
head: 1.200
|
head: 1.201
|
||||||
branch:
|
branch:
|
||||||
locks: strict
|
locks: strict
|
||||||
access list:
|
access list:
|
||||||
symbolic names:
|
symbolic names:
|
||||||
keyword substitution: kv
|
keyword substitution: kv
|
||||||
total revisions: 200; selected revisions: 200
|
total revisions: 201; selected revisions: 201
|
||||||
description:
|
description:
|
||||||
----------------------------
|
----------------------------
|
||||||
|
revision 1.201
|
||||||
|
date: 2007/01/03 23:49:10; author: gilles; state: Exp; lines: +30 -6
|
||||||
|
Use login2() instead of login() (literal form is not always
|
||||||
|
supported.
|
||||||
|
----------------------------
|
||||||
revision 1.200
|
revision 1.200
|
||||||
date: 2007/01/02 08:27:04; author: gilles; state: Exp; lines: +48 -15
|
date: 2007/01/02 08:27:04; author: gilles; state: Exp; lines: +48 -15
|
||||||
use message_to_file()instead of message_string()
|
use message_to_file()instead of message_string()
|
||||||
|
|
4
README
4
README
|
@ -3,7 +3,7 @@ NAME
|
||||||
Synchronise mailboxes between two imap servers. Good at IMAP migration.
|
Synchronise mailboxes between two imap servers. Good at IMAP migration.
|
||||||
More than 25 different IMAP server softwares supported with success.
|
More than 25 different IMAP server softwares supported with success.
|
||||||
|
|
||||||
$Revision: 1.200 $
|
$Revision: 1.201 $
|
||||||
|
|
||||||
INSTALL
|
INSTALL
|
||||||
imapsync works fine under any Unix OS.
|
imapsync works fine under any Unix OS.
|
||||||
|
@ -301,5 +301,5 @@ AUTHOR
|
||||||
teaching free open and gratis softwares. Don't hesitate to pay him for
|
teaching free open and gratis softwares. Don't hesitate to pay him for
|
||||||
that services.
|
that services.
|
||||||
|
|
||||||
$Id: imapsync,v 1.200 2007/01/02 08:27:04 gilles Exp $
|
$Id: imapsync,v 1.201 2007/01/03 23:49:10 gilles Exp $
|
||||||
|
|
||||||
|
|
8
TODO
8
TODO
|
@ -1,7 +1,10 @@
|
||||||
TODO file for imapsync
|
TODO file for imapsync
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
Try a 50Mo message transfer (slow ?)
|
Add an option to tell imapsync that the domain
|
||||||
|
is changing and have it replace the domain in all user names that are
|
||||||
|
related to ACLs.
|
||||||
|
See patches/imapsync-acls-users
|
||||||
|
|
||||||
Add a best practice migration tips document,
|
Add a best practice migration tips document,
|
||||||
good options with such imap server.
|
good options with such imap server.
|
||||||
|
@ -41,6 +44,9 @@ http://asg.web.cmu.edu/cyrus/download/imapd/altnamespace.html
|
||||||
|
|
||||||
Explain expunge behavior.
|
Explain expunge behavior.
|
||||||
|
|
||||||
|
DONE. Try a 50Mo message transfer (slow ?)
|
||||||
|
fast !
|
||||||
|
|
||||||
DONE. Add my amazon wishlist link.
|
DONE. Add my amazon wishlist link.
|
||||||
|
|
||||||
DONE. Remove file rfc2342.txt "IMAP4 Namespace"
|
DONE. Remove file rfc2342.txt "IMAP4 Namespace"
|
||||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
||||||
1.200
|
1.201
|
||||||
|
|
|
@ -12,6 +12,7 @@ RELEASE_FOCUS="Minor bugfixes"
|
||||||
|
|
||||||
#TEXT_BODY="Syntax cleanup"
|
#TEXT_BODY="Syntax cleanup"
|
||||||
#TEXT_BODY="Updated documentation"
|
#TEXT_BODY="Updated documentation"
|
||||||
TEXT_BODY="Bug fix: be case insensitive with header keywords."
|
#TEXT_BODY="Bug fix: be case insensitive with header keywords."
|
||||||
|
TEXT_BODY="Bug fix: corrected memory problem with big messages."
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
Project: imapsync
|
Project: imapsync
|
||||||
Version: 1.190
|
Version: 1.200
|
||||||
Release-Focus: Minor bugfixes
|
Release-Focus: Minor bugfixes
|
||||||
Hide: Y
|
Hide: Y
|
||||||
Home-Page-URL: http://www.linux-france.org/prj/imapsync/
|
Home-Page-URL: http://www.linux-france.org/prj/imapsync/
|
||||||
Gzipped-Tar-URL: http://www.linux-france.org/prj/imapsync/dist/
|
Gzipped-Tar-URL: http://www.linux-france.org/prj/imapsync/dist/
|
||||||
|
|
||||||
Bug fix: be case insensitive with header keywords.
|
Bug fix: corrected memory problem with big messages.
|
||||||
|
|
||||||
|
|
36
imapsync
36
imapsync
|
@ -7,7 +7,7 @@ tool. Synchronise mailboxes between two imap servers. Good
|
||||||
at IMAP migration. More than 25 different IMAP server softwares
|
at IMAP migration. More than 25 different IMAP server softwares
|
||||||
supported with success.
|
supported with success.
|
||||||
|
|
||||||
$Revision: 1.200 $
|
$Revision: 1.201 $
|
||||||
|
|
||||||
=head1 INSTALL
|
=head1 INSTALL
|
||||||
|
|
||||||
|
@ -353,7 +353,7 @@ Gilles LAMIRAL earn his living writing, installing,
|
||||||
configuring and teaching free open and gratis
|
configuring and teaching free open and gratis
|
||||||
softwares. Don't hesitate to pay him for that services.
|
softwares. Don't hesitate to pay him for that services.
|
||||||
|
|
||||||
$Id: imapsync,v 1.200 2007/01/02 08:27:04 gilles Exp $
|
$Id: imapsync,v 1.201 2007/01/03 23:49:10 gilles Exp $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
@ -410,7 +410,7 @@ my(
|
||||||
use vars qw ($opt_G); # missing code for this will be option.
|
use vars qw ($opt_G); # missing code for this will be option.
|
||||||
|
|
||||||
|
|
||||||
$rcs = ' $Id: imapsync,v 1.200 2007/01/02 08:27:04 gilles Exp $ ';
|
$rcs = ' $Id: imapsync,v 1.201 2007/01/03 23:49:10 gilles Exp $ ';
|
||||||
$rcs =~ m/,v (\d+\.\d+)/;
|
$rcs =~ m/,v (\d+\.\d+)/;
|
||||||
$VERSION = ($1) ? $1 : "UNKNOWN";
|
$VERSION = ($1) ? $1 : "UNKNOWN";
|
||||||
|
|
||||||
|
@ -447,8 +447,8 @@ $error=0;
|
||||||
|
|
||||||
my $banner = join("",
|
my $banner = join("",
|
||||||
'$RCSfile: imapsync,v $ ',
|
'$RCSfile: imapsync,v $ ',
|
||||||
'$Revision: 1.200 $ ',
|
'$Revision: 1.201 $ ',
|
||||||
'$Date: 2007/01/02 08:27:04 $ ',
|
'$Date: 2007/01/03 23:49:10 $ ',
|
||||||
"\n",
|
"\n",
|
||||||
"Mail::IMAPClient version used here is ",
|
"Mail::IMAPClient version used here is ",
|
||||||
$VERSION_IMAPClient,"\n"
|
$VERSION_IMAPClient,"\n"
|
||||||
|
@ -642,7 +642,7 @@ sub login_imap {
|
||||||
$imap->User($user);
|
$imap->User($user);
|
||||||
$imap->Authuser($authuser);
|
$imap->Authuser($authuser);
|
||||||
$imap->Password($password);
|
$imap->Password($password);
|
||||||
$imap->login() or die "Error login : [$host] with user [$user] : $@";
|
$imap->login2() or die "Error login : [$host] with user [$user] : $@";
|
||||||
return($imap);
|
return($imap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1669,6 +1669,30 @@ sub fetch_hash2 {
|
||||||
|
|
||||||
|
|
||||||
# From IMAPClient.pm
|
# From IMAPClient.pm
|
||||||
|
|
||||||
|
sub login2 {
|
||||||
|
my $self = shift;
|
||||||
|
return $self->authenticate($self->Authmechanism,$self->Authcallback)
|
||||||
|
if $self->{Authmechanism};
|
||||||
|
|
||||||
|
my $id = $self->User;
|
||||||
|
my $has_quotes = $id =~ /^".*"$/ ? 1 : 0;
|
||||||
|
my $string = "Login " . ( $has_quotes ? $id : qq("$id") ) .
|
||||||
|
" " . $self->Password . "\r\n";
|
||||||
|
$self->_imap_command($string)
|
||||||
|
and $self->State(Authenticated);
|
||||||
|
# $self->folders and $self->separator unless $self->NoAutoList;
|
||||||
|
unless ( $self->IsAuthenticated) {
|
||||||
|
my($carp) = $self->LastError;
|
||||||
|
$carp =~ s/^[\S]+ ([^\x0d\x0a]*)\x0d?\x0a/$1/;
|
||||||
|
carp $carp unless defined wantarray;
|
||||||
|
return undef;
|
||||||
|
}
|
||||||
|
return $self;
|
||||||
|
}
|
||||||
|
|
||||||
|
# From IMAPClient.pm
|
||||||
|
|
||||||
sub parse_headers2 {
|
sub parse_headers2 {
|
||||||
my($self,$msgspec_all,@fields) = @_;
|
my($self,$msgspec_all,@fields) = @_;
|
||||||
my(%fieldmap) = map { ( lc($_),$_ ) } @fields;
|
my(%fieldmap) = map { ( lc($_),$_ ) } @fields;
|
||||||
|
|
57
patches/imapsync-acls-users
Normal file
57
patches/imapsync-acls-users
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
Hi Gilles,
|
||||||
|
|
||||||
|
I have used your imapsync program many times over the past few months
|
||||||
|
and it has been a great help in our mail server migration, so first of
|
||||||
|
all: Thank you! :-)
|
||||||
|
|
||||||
|
However, with the latest task, I ran into a problem: I'm migrating mail
|
||||||
|
from a Kolab 2.0.4 server to a Kolab 2.1beta2 server (both use Cyrus as
|
||||||
|
imapd). The problem is: We're also changing domains at the same time,
|
||||||
|
i.e. any user "NAME@OLD.DOMAIN" on the old server becomes
|
||||||
|
"NAME@NEW.DOMAIN" on the new server. When transferring mail, this
|
||||||
|
doesn't have any bad influence, but it does lead to problems when trying
|
||||||
|
to sync ACLs as well. Right now, imapsync will take the ACLs, compare
|
||||||
|
the folder on the old and the new server and will then happily set the
|
||||||
|
ACL for "NAME@NEW.DOMAIN" on the new server to "none" (because it
|
||||||
|
doesn't exist on the old server) and then try to set the ACLs for
|
||||||
|
"NAME@OLD.DOMAIN" on the new server - which a) fails (it just removed
|
||||||
|
the access for NAME@NEW.DOMAIN - hence, the user cannot access his own
|
||||||
|
mailbox anymore) and b) is not desirable anyway (only "NAME@NEW.DOMAIN"
|
||||||
|
should have permissions).
|
||||||
|
|
||||||
|
So, basically, what I need is an option to tell imapsync that the domain
|
||||||
|
is changing and have it replace the domain in all user names that are
|
||||||
|
related to ACLs. Right now, I've solved this by crudely patching the
|
||||||
|
"acls_sync" subroutine:
|
||||||
|
|
||||||
|
sub acls_sync {
|
||||||
|
my($f_fold, $t_fold) = @_;
|
||||||
|
[...]
|
||||||
|
foreach my $user (sort(keys(%users))) {
|
||||||
|
my $acl = $f_hash->{$user} || "none";
|
||||||
|
if ($user eq $user2)
|
||||||
|
{
|
||||||
|
# the user we use to log in as on the target
|
||||||
|
# server gets "all" permissions always
|
||||||
|
$acl = "lrswipcda";
|
||||||
|
}
|
||||||
|
my $new_user = $user;
|
||||||
|
$new_user =~ s/OLD.DOMAIN/NEW.DOMAIN/g;
|
||||||
|
|
||||||
|
print "acl $user -> $new_user : [$acl]\n";
|
||||||
|
next if ($f_hash->{$user} && $t_hash->{$new_user} &&
|
||||||
|
$f_hash->{$user} eq $t_hash->{$new_user});
|
||||||
|
unless ($dry) {
|
||||||
|
print "setting acl $t_fold $new_user $acl\n";
|
||||||
|
$to->setacl($t_fold, $new_user, $acl)
|
||||||
|
or warn "Could not set acl: $@\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[...]
|
||||||
|
|
||||||
|
but this is really just a hack to suit my current needs. Maybe you could
|
||||||
|
consider adding something more refined than this hack in a future release? :-)
|
||||||
|
|
||||||
|
Best regards,
|
||||||
|
|
||||||
|
Thomas
|
Loading…
Add table
Add a link
Reference in a new issue