mirror of
https://github.com/imapsync/imapsync.git
synced 2025-06-08 21:54:31 +02:00
249 lines
6.3 KiB
Perl
Executable file
249 lines
6.3 KiB
Perl
Executable file
#!/usr/bin/perl
|
|
|
|
# $Id: dns_srv_imap,v 1.5 2016/08/15 01:24:20 gilles Exp gilles $
|
|
|
|
use strict;
|
|
use warnings;
|
|
use English;
|
|
use Test::More;
|
|
use Net::DNS;
|
|
|
|
# _imaps._tcp.gmail.com. 86183 IN SRV 5 0 993 imap.gmail.com.
|
|
lookup_srv_string('_imaps._tcp.gmail.com');
|
|
|
|
#lookup_srv( '_imap._tcp.gmail.com' ) ;
|
|
#lookup_srv( '_imaps._tcp.lamiral.info' ) ;
|
|
#lookup_srv( '_imap._tcp.lamiral.info' ) ;
|
|
|
|
foreach my $email (@ARGV) {
|
|
my $domain = domain_name_of($email);
|
|
print "Domain for email $email: $domain\n";
|
|
my ( $host, $port ) = host_port_from_lookup_srv( '_imaps._tcp.' . $domain );
|
|
$host ||= q{};
|
|
$port ||= q{};
|
|
print "IMAPS server name and port for $email: $host $port\n";
|
|
|
|
( $host, $port ) = host_port_from_lookup_srv( '_imap._tcp.' . $domain );
|
|
$host ||= q{};
|
|
$port ||= q{};
|
|
print "IMAP server name and port for $email: $host $port\n";
|
|
|
|
}
|
|
|
|
tests_server_name_from_srv_string();
|
|
tests_server_port_from_srv_string();
|
|
tests_domain_name_of();
|
|
tests_host_port_ssl_from_user();
|
|
done_testing();
|
|
|
|
my $debug = 1;
|
|
|
|
sub host_port_ssl_from_user {
|
|
my $user = shift @ARG;
|
|
|
|
if ( !$user ) {
|
|
return;
|
|
}
|
|
|
|
my $domain = domain_name_of($user);
|
|
if ( !$domain ) {
|
|
return;
|
|
}
|
|
|
|
my ( $host, $port ) = host_port_from_lookup_srv(qq{_imaps._tcp.$domain});
|
|
my $ssl = 1;
|
|
if ( $host and $port ) {
|
|
return ( $host, $port, $ssl );
|
|
}
|
|
|
|
# fallback to imap in clear
|
|
$ssl = 0;
|
|
( $host, $port ) = host_port_from_lookup_srv(qq{_imap._tcp.$domain});
|
|
|
|
if ( $host and $port ) {
|
|
return ( $host, $port, $ssl );
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
sub tests_host_port_ssl_from_user {
|
|
is( undef, host_port_ssl_from_user(),
|
|
'host_port_ssl_from_user: no args => undef' );
|
|
is_deeply(
|
|
[qw( imap.gmail.com. 993 1 )],
|
|
[ host_port_ssl_from_user('gilles.lamiral@gmail.com') ],
|
|
'host_port_ssl_from_user: gilles.lamiral@gmail.com => imap.gmail.com. 993 1 (ssl)'
|
|
);
|
|
|
|
}
|
|
|
|
sub host_port_from_lookup_srv {
|
|
my $request = shift @ARG;
|
|
|
|
my $lookup = lookup_srv_string($request);
|
|
if ( !$lookup ) {
|
|
return;
|
|
}
|
|
|
|
my $host = server_name_from_srv_string($lookup);
|
|
my $port = server_port_from_srv_string($lookup);
|
|
|
|
if ( $host and $port ) {
|
|
return ( $host, $port );
|
|
}
|
|
else {
|
|
return;
|
|
}
|
|
}
|
|
|
|
sub domain_name_of_email {
|
|
my $email = shift;
|
|
|
|
return (undef) if ( not $email );
|
|
|
|
my $domain;
|
|
|
|
if ( $email =~ /^.*@([^@]+)$/ ) {
|
|
$domain = $1;
|
|
$debug and print "domain: $domain\n";
|
|
return ($domain);
|
|
}
|
|
return;
|
|
}
|
|
|
|
sub domain_name_of {
|
|
my $email = shift;
|
|
|
|
return (undef) if ( not $email );
|
|
|
|
my $domain = domain_name_of_email($email);
|
|
|
|
if ( !$domain ) {
|
|
$domain = $email;
|
|
}
|
|
|
|
return ($domain);
|
|
}
|
|
|
|
sub tests_domain_name_of {
|
|
ok( not( domain_name_of('') ), 'domain_name_of: void => undef' );
|
|
ok( not( domain_name_of() ), 'domain_name_of: undef => undef' );
|
|
ok( 'foo' eq domain_name_of('foo'), 'domain_name_of: foo => foo' );
|
|
|
|
#ok( 'foo' eq domain_name_of( 'foo ' ), 'domain_name_of: foo => foo' ) ;
|
|
#ok( 'foo' eq domain_name_of( 'foo ' ), 'domain_name_of: foo => foo' ) ;
|
|
ok(
|
|
'example.com' eq domain_name_of('foo@example.com'),
|
|
'domain_name_of: foo@example.com => example.com'
|
|
);
|
|
ok(
|
|
'example.com' eq domain_name_of('@foo@example.com'),
|
|
'domain_name_of: @foo@example.com => example.com'
|
|
);
|
|
ok(
|
|
'example.com' eq domain_name_of('bar@foo@example.com'),
|
|
'domain_name_of: bar@foo@example.com => example.com'
|
|
);
|
|
}
|
|
|
|
sub lookup_srv_string {
|
|
my $name = shift;
|
|
|
|
my $resolver = new Net::DNS::Resolver();
|
|
my $reply = $resolver->query( $name, 'SRV' );
|
|
|
|
my $string;
|
|
if ($reply) {
|
|
|
|
#($reply->answer)[0]->print;
|
|
foreach my $rr ( $reply->answer ) {
|
|
$debug and print 'name: ' . $rr->name . "\n";
|
|
$debug and print 'class: ' . $rr->class . "\n";
|
|
$debug and print 'type: ' . $rr->type . "\n";
|
|
$debug and print 'ttl: ' . $rr->ttl . "\n";
|
|
$debug and print 'string: ' . $rr->string . "\n";
|
|
next if ( 'SRV' ne $rr->type );
|
|
next if ( not( $rr->string ) );
|
|
$string = $rr->string;
|
|
return ($string);
|
|
}
|
|
}
|
|
else {
|
|
print "Query failed SRV for domain $name: ", $resolver->errorstring,
|
|
"\n";
|
|
return (undef);
|
|
}
|
|
return ($string);
|
|
}
|
|
|
|
sub server_name_from_srv_string {
|
|
my $srv_string = shift;
|
|
|
|
return (undef) if ( not $srv_string );
|
|
my $server_name = ( split( /\s+/, $srv_string ) )[7];
|
|
return (undef) if ( '.' eq $server_name );
|
|
return ($server_name);
|
|
}
|
|
|
|
sub tests_server_name_from_srv_string {
|
|
ok(
|
|
not( server_name_from_srv_string('') ),
|
|
'server_name_from_srv_string: void'
|
|
);
|
|
ok(
|
|
not( server_name_from_srv_string() ),
|
|
'server_name_from_srv_string: undef'
|
|
);
|
|
ok(
|
|
'imap.gmail.com.' eq server_name_from_srv_string(
|
|
'_imaps._tcp.gmail.com. 82466 IN SRV 5 0 993 imap.gmail.com.'
|
|
),
|
|
'server_name_from_srv_string: _imaps._tcp.gmail.com. => imap.gmail.com.'
|
|
);
|
|
ok(
|
|
not(
|
|
server_name_from_srv_string(
|
|
'_imap._tcp.gmail.com. 81999 IN SRV 0 0 0 .')
|
|
),
|
|
'server_name_from_srv_string: _imap._tcp.gmail.com. => undef'
|
|
);
|
|
|
|
return ();
|
|
}
|
|
|
|
sub server_port_from_srv_string {
|
|
my $srv_string = shift;
|
|
|
|
return (undef) if ( not $srv_string );
|
|
my $server_port = ( split( /\s+/, $srv_string ) )[6];
|
|
return (undef) if ( 0 == $server_port );
|
|
return ($server_port);
|
|
}
|
|
|
|
sub tests_server_port_from_srv_string {
|
|
ok(
|
|
not( server_port_from_srv_string('') ),
|
|
'server_port_from_srv_string: void'
|
|
);
|
|
ok(
|
|
not( server_port_from_srv_string() ),
|
|
'server_port_from_srv_string: undef'
|
|
);
|
|
ok(
|
|
'993' eq server_port_from_srv_string(
|
|
'_imaps._tcp.gmail.com. 82466 IN SRV 5 0 993 imap.gmail.com.'
|
|
),
|
|
'server_port_from_srv_string: _imaps._tcp.gmail.com. => 993'
|
|
);
|
|
ok(
|
|
not(
|
|
server_port_from_srv_string(
|
|
'_imap._tcp.gmail.com. 81999 IN SRV 0 0 0 .')
|
|
),
|
|
'server_port_from_srv_string: _imap._tcp.gmail.com. => undef'
|
|
);
|
|
|
|
return ();
|
|
}
|