Subversion Repositories general

Rev

Rev 1082 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1082 Rev 1209
Line 91... Line 91...
91
		# print out response
91
		# print out response
92
		print CLIENT "$protocol_header $protocol_ver_maj.$protocol_ver_min"
92
		print CLIENT "$protocol_header $protocol_ver_maj.$protocol_ver_min"
93
			. "\n$request{'code'} $request{'response'}\n\n";
93
			. "\n$request{'code'} $request{'response'}\n\n";
94
		close CLIENT;
94
		close CLIENT;
95
		$request{'stop_timestamp'} = [gettimeofday];
95
		$request{'stop_timestamp'} = [gettimeofday];
96
		log_debug("Duration: " . tv_interval($request{'start_timestamp'}, 
96
		log_debug("Duration: " . tv_interval($request{'start_timestamp'},
97
			$request{'stop_timestamp'}) . " sec");
97
			$request{'stop_timestamp'}) . " sec");
98
	}
98
	}
99
 
99
 
100
	# close the port
100
	# close the port
101
	close SERVER;
101
	close SERVER;
Line 123... Line 123...
123
	}
123
	}
124
	$cur++;
124
	$cur++;
125
 
125
 
126
	# check end lines
126
	# check end lines
127
	if($#lines < $cur+1 || $lines[$#lines-1] ne "" || $lines[$#lines] ne "") {
127
	if($#lines < $cur+1 || $lines[$#lines-1] ne "" || $lines[$#lines] ne "") {
128
		set_request_code($request, $code_no_end_lines, 
128
		set_request_code($request, $code_no_end_lines,
129
			"Request doesn't end with \\n\\n");
129
			"Request doesn't end with \\n\\n");
130
		return;
130
		return;
131
	}
131
	}
132
 
132
 
133
	# check password
133
	# check password
134
	if($password) {
134
	if($password) {
135
		if($#lines < $cur || !($lines[$cur] =~ /^$password_header/)) {
135
		if($#lines < $cur || !($lines[$cur] =~ /^$password_header/)) {
136
			set_request_code($request, $code_no_password, 
136
			set_request_code($request, $code_no_password,
137
				"Password not specified");
137
				"Password not specified");
138
			return;
138
			return;
139
		}
139
		}
140
 
140
 
141
		unless($lines[$cur] =~ /^$password_header$password$/) {
141
		unless($lines[$cur] =~ /^$password_header$password$/) {
Line 174... Line 174...
174
}
174
}
175
 
175
 
176
sub handle_user_create
176
sub handle_user_create
177
{
177
{
178
	my $request = shift @_;
178
	my $request = shift @_;
179
	
179
 
180
	set_request_code($request, $code_ignored, "Not interesting in users");
180
	set_request_code($request, $code_ignored, "Not interesting in users");
181
}
181
}
182
 
182
 
183
sub handle_user_modify
183
sub handle_user_modify
184
{
184
{
185
	my $request = shift @_;
185
	my $request = shift @_;
186
	
186
 
187
	set_request_code($request, $code_ignored, "Not interesting in users");
187
	set_request_code($request, $code_ignored, "Not interesting in users");
188
}
188
}
189
 
189
 
190
sub handle_user_delete
190
sub handle_user_delete
191
{
191
{
192
	my $request = shift @_;
192
	my $request = shift @_;
193
	
193
 
194
	set_request_code($request, $code_ignored, "Not interesting in users");
194
	set_request_code($request, $code_ignored, "Not interesting in users");
195
}
195
}
196
 
196
 
197
sub handle_domain_create
197
sub handle_domain_create
198
{
198
{
199
	my $request = shift @_;
199
	my $request = shift @_;
200
	my %params  = parse_command_params($request, shift @_, ("name"));
200
	my %params  = parse_command_params($request, shift @_, ("name"));
201
	return unless(%params);
201
	return unless(%params);
202
 
202
 
203
	my $res_action = save_to_db($request, "transport", 
203
	my $res_action = save_to_db($request, "transport",
204
		{ domain => $params{"name"} },
204
		{ domain => $params{"name"} },
205
		{ domain => $params{"name"}, comment => $params{"comment"},
205
		{ domain => $params{"name"}, comment => $params{"comment"},
206
		  transport => 'virtual:' } );
206
		  transport => 'virtual:' } );
207
 
207
 
208
	if($res_action eq 'update') {
208
	if($res_action eq 'update') {
Line 219... Line 219...
219
{
219
{
220
	my $request = shift @_;
220
	my $request = shift @_;
221
	my %params  = parse_command_params($request, shift @_, ("oldName", "name"));
221
	my %params  = parse_command_params($request, shift @_, ("oldName", "name"));
222
	return unless(%params);
222
	return unless(%params);
223
 
223
 
224
	my $res_action = save_to_db($request, "transport", 
224
	my $res_action = save_to_db($request, "transport",
225
		{ domain => $params{"oldName"} },
225
		{ domain => $params{"oldName"} },
226
		{ domain => $params{"name"}, comment => $params{"comment"},
226
		{ domain => $params{"name"}, comment => $params{"comment"},
227
		  transport => 'virtual:' } );
227
		  transport => 'virtual:' } );
228
 
228
 
229
	if($res_action eq 'update') {
229
	if($res_action eq 'update') {
Line 240... Line 240...
240
{
240
{
241
	my $request = shift @_;
241
	my $request = shift @_;
242
	my %params  = parse_command_params($request, shift @_, ("name"));
242
	my %params  = parse_command_params($request, shift @_, ("name"));
243
	return unless(%params);
243
	return unless(%params);
244
 
244
 
245
	my $res_action = delete_from_db($request, "transport", 
245
	my $res_action = delete_from_db($request, "transport",
246
		{ domain => $params{"name"} } );
246
		{ domain => $params{"name"} } );
247
 
247
 
248
	if($res_action eq 'delete') {
248
	if($res_action eq 'delete') {
249
		return unless(restart_mail_system());
249
		return unless(restart_mail_system());
250
		set_request_code($request, $code_ok, "Domain deleted");
250
		set_request_code($request, $code_ok, "Domain deleted");
Line 271... Line 271...
271
	my $request = shift @_;
271
	my $request = shift @_;
272
	my %params  = parse_command_params($request, shift @_,
272
	my %params  = parse_command_params($request, shift @_,
273
		("login", "password", "domain"));
273
		("login", "password", "domain"));
274
	return unless(%params);
274
	return unless(%params);
275
 
275
 
276
	my $res_action = save_to_db($request, "users", 
276
	my $res_action = save_to_db($request, "users",
277
		{ login => "$params{'login'}\@$params{'domain'}" },
277
		{ login => "$params{'login'}\@$params{'domain'}" },
278
		{ login => "$params{'login'}\@$params{'domain'}",
278
		{ login => "$params{'login'}\@$params{'domain'}",
279
		  password => $params{"password"},
279
		  password => $params{"password"},
280
		  maildir => "$params{'domain'}/$params{'login'}/",
280
		  maildir => "$params{'domain'}/$params{'login'}/",
281
		  expired => ($params{"enabled"} eq "true" ? 0 : 1),
281
		  expired => ($params{"enabled"} eq "true" ? 0 : 1),
Line 297... Line 297...
297
		("oldLogin", "oldDomain", "login", "domain"));
297
		("oldLogin", "oldDomain", "login", "domain"));
298
	return unless(%params);
298
	return unless(%params);
299
 
299
 
300
	# FIXME move the old maildir
300
	# FIXME move the old maildir
301
 
301
 
302
	my $res_action = save_to_db($request, "users", 
302
	my $res_action = save_to_db($request, "users",
303
		{ login => "$params{'oldLogin'}\@$params{'oldDomain'}" },
303
		{ login => "$params{'oldLogin'}\@$params{'oldDomain'}" },
304
		{ login => "$params{'login'}\@$params{'domain'}",
304
		{ login => "$params{'login'}\@$params{'domain'}",
305
		  password => $params{"password"},
305
		  password => $params{"password"},
306
		  maildir => "$params{'domain'}/$params{'login'}/",
306
		  maildir => "$params{'domain'}/$params{'login'}/",
307
		  expired => ($params{"enabled"} eq "true" ? "0" : "1"),
307
		  expired => ($params{"enabled"} eq "true" ? "0" : "1"),
Line 322... Line 322...
322
	my %params  = parse_command_params($request, shift @_, ("login", "domain"));
322
	my %params  = parse_command_params($request, shift @_, ("login", "domain"));
323
	return unless(%params);
323
	return unless(%params);
324
 
324
 
325
	# FIXME remove the maildir
325
	# FIXME remove the maildir
326
 
326
 
327
	my $res_action = delete_from_db($request, "users", 
327
	my $res_action = delete_from_db($request, "users",
328
		{ login => "$params{'login'}\@$params{'domain'}" } );
328
		{ login => "$params{'login'}\@$params{'domain'}" } );
329
 
329
 
330
	if($res_action eq 'delete') {
330
	if($res_action eq 'delete') {
331
		set_request_code($request, $code_ok, "Mailbox deleted");
331
		set_request_code($request, $code_ok, "Mailbox deleted");
332
	}
332
	}
Line 340... Line 340...
340
	my $request = shift @_;
340
	my $request = shift @_;
341
	my %params  = parse_command_params($request, shift @_, ("address", "domain"));
341
	my %params  = parse_command_params($request, shift @_, ("address", "domain"));
342
	return unless(%params);
342
	return unless(%params);
343
	my @rcpts = parse_command_array($request, @_);
343
	my @rcpts = parse_command_array($request, @_);
344
 
344
 
345
	my $del_action = delete_from_db($request, "aliases", 
345
	my $del_action = delete_from_db($request, "aliases",
346
		{ alias => "$params{'address'}\@$params{'domain'}" } );
346
		{ alias => "$params{'address'}\@$params{'domain'}" } );
347
	return if($del_action eq "error");
347
	return if($del_action eq "error");
348
	
348
 
349
	foreach my $rcpt (@rcpts) {
349
	foreach my $rcpt (@rcpts) {
350
		log_debug("save $rcpt");
350
		log_debug("save $rcpt");
351
		my $res_action = save_to_db($request, "aliases", 
351
		my $res_action = save_to_db($request, "aliases",
352
			undef,
352
			undef,
353
			{ alias => "$params{'address'}\@$params{'domain'}",
353
			{ alias => "$params{'address'}\@$params{'domain'}",
354
			  rcpt => $rcpt, comment => $params{"comment"} } );
354
			  rcpt => $rcpt, comment => $params{"comment"} } );
355
		return if($res_action eq "error");
355
		return if($res_action eq "error");
356
	}
356
	}
Line 368... Line 368...
368
	my $request = shift @_;
368
	my $request = shift @_;
369
	my %params  = parse_command_params($request, shift @_, ("address", "domain"));
369
	my %params  = parse_command_params($request, shift @_, ("address", "domain"));
370
	return unless(%params);
370
	return unless(%params);
371
	my @rcpts = parse_command_array($request, @_);
371
	my @rcpts = parse_command_array($request, @_);
372
 
372
 
373
	my $del_action = delete_from_db($request, "aliases", 
373
	my $del_action = delete_from_db($request, "aliases",
374
		{ alias => "$params{'address'}\@$params{'domain'}" } );
374
		{ alias => "$params{'address'}\@$params{'domain'}" } );
375
	return if($del_action eq "error");
375
	return if($del_action eq "error");
376
	
376
 
377
	foreach my $rcpt (@rcpts) {
377
	foreach my $rcpt (@rcpts) {
378
		log_debug("save $rcpt");
378
		log_debug("save $rcpt");
379
		my $res_action = save_to_db($request, "aliases", 
379
		my $res_action = save_to_db($request, "aliases",
380
			undef,
380
			undef,
381
			{ alias => "$params{'address'}\@$params{'domain'}",
381
			{ alias => "$params{'address'}\@$params{'domain'}",
382
			  rcpt => $rcpt, comment => $params{"comment"} } );
382
			  rcpt => $rcpt, comment => $params{"comment"} } );
383
		return if($res_action eq "error");
383
		return if($res_action eq "error");
384
	}
384
	}
-
 
385
	# FIXME add the loopback destination? handle "a@domain.com => a@domain.com"
-
 
386
	# as "a@domain.com => _something_@domain.com + _something_@domain.com => _something_@domain.com" ?
385
 
387
 
386
	if($del_action eq 'delete') {
388
	if($del_action eq 'delete') {
387
		set_request_code($request, $code_ok, "Mail alias modified");
389
		set_request_code($request, $code_ok, "Mail alias modified");
388
	}
390
	}
389
	elsif($del_action eq 'not found') {
391
	elsif($del_action eq 'not found') {
Line 395... Line 397...
395
{
397
{
396
	my $request = shift @_;
398
	my $request = shift @_;
397
	my %params  = parse_command_params($request, shift @_, ("address", "domain"));
399
	my %params  = parse_command_params($request, shift @_, ("address", "domain"));
398
	return unless(%params);
400
	return unless(%params);
399
 
401
 
400
	my $res_action = delete_from_db($request, "aliases", 
402
	my $res_action = delete_from_db($request, "aliases",
401
		{ alias => "$params{'address'}\@$params{'domain'}" } );
403
		{ alias => "$params{'address'}\@$params{'domain'}" } );
402
 
404
 
403
	if($res_action eq 'delete') {
405
	if($res_action eq 'delete') {
404
		set_request_code($request, $code_ok, "Mail alias deleted");
406
		set_request_code($request, $code_ok, "Mail alias deleted");
405
	}
407
	}
Line 415... Line 417...
415
	$value =~ s/\\r/\r/g;
417
	$value =~ s/\\r/\r/g;
416
	$value =~ s/\\n/\n/g;
418
	$value =~ s/\\n/\n/g;
417
	$value =~ s/\\t/\t/g;
419
	$value =~ s/\\t/\t/g;
418
	$value =~ s/\\0/\000/g;
420
	$value =~ s/\\0/\000/g;
419
	$value =~ s/\\\\/\\/g;
421
	$value =~ s/\\\\/\\/g;
420
	
422
 
421
	return $value;
423
	return $value;
422
}
424
}
423
 
425
 
424
sub parse_command_array
426
sub parse_command_array
425
{
427
{
Line 439... Line 441...
439
{
441
{
440
	my $request  = shift @_;
442
	my $request  = shift @_;
441
	my @params   = split /\t/, shift @_, -1;
443
	my @params   = split /\t/, shift @_, -1;
442
	my %required = map { $_ => 1 } @_; # convert array to hash
444
	my %required = map { $_ => 1 } @_; # convert array to hash
443
	my %values   = ();
445
	my %values   = ();
444
 
446
 
445
	@params = @params[2..$#params]; # remove handler and action
447
	@params = @params[2..$#params]; # remove handler and action
446
	map {
448
	map {
447
		my ($key, $value) = split /=/, $_;
449
		my ($key, $value) = split /=/, $_;
448
		$values{$key} = decode_param($value);
450
		$values{$key} = decode_param($value);
449
		delete($required{$key});
451
		delete($required{$key});
Line 469... Line 471...
469
 
471
 
470
sub db_connect
472
sub db_connect
471
{
473
{
472
	my $request = shift @_;
474
	my $request = shift @_;
473
	my $dbh     = undef;
475
	my $dbh     = undef;
474
	
476
 
475
	eval { $dbh = DBI->connect($db_url, $db_user, $db_password); };
477
	eval { $dbh = DBI->connect($db_url, $db_user, $db_password); };
476
	if($@) {
478
	if($@) {
477
		set_request_code($request, $code_db_connect_error, $@);
479
		set_request_code($request, $code_db_connect_error, $@);
478
		$dbh = undef;
480
		$dbh = undef;
479
	}
481
	}
Line 513... Line 515...
513
 
515
 
514
	my $res_action  = 'none';
516
	my $res_action  = 'none';
515
	my $dbh         = db_connect($request);
517
	my $dbh         = db_connect($request);
516
 
518
 
517
	return 'error' unless($dbh);
519
	return 'error' unless($dbh);
518
		
520
 
519
	eval {
521
	eval {
520
		my $sql = "";
522
		my $sql = "";
521
		while(my ($key, $value) = each(%$key_columns)) {
523
		while(my ($key, $value) = each(%$key_columns)) {
522
			next unless(defined $value);
524
			next unless(defined $value);
523
			$sql .= " and " if($sql);
525
			$sql .= " and " if($sql);
Line 529... Line 531...
529
		my $count = 0;
531
		my $count = 0;
530
		while(my ($key, $value) = each(%$key_columns)) {
532
		while(my ($key, $value) = each(%$key_columns)) {
531
			next unless(defined $value);
533
			next unless(defined $value);
532
			$sth->bind_param(++$count, $value);
534
			$sth->bind_param(++$count, $value);
533
		}
535
		}
534
		
536
 
535
		my $res = $sth->execute;
537
		my $res = $sth->execute;
536
 
538
 
537
		if($res < 1) {
539
		if($res < 1) {
538
			$res_action = 'not found';
540
			$res_action = 'not found';
539
		}
541
		}
Line 560... Line 562...
560
	my $error_set  = 0;
562
	my $error_set  = 0;
561
	my $res_action = 'none';
563
	my $res_action = 'none';
562
	my $dbh        = db_connect($request);
564
	my $dbh        = db_connect($request);
563
 
565
 
564
	return 'error' unless($dbh);
566
	return 'error' unless($dbh);
565
		
567
 
566
	eval {
568
	eval {
567
		my $res = 0;
569
		my $res = 0;
568
 
570
 
569
		if($key_columns) {
571
		if($key_columns) {
570
			my $update_sql = "";
572
			my $update_sql = "";
Line 589... Line 591...
589
			}
591
			}
590
			while(my ($key, $value) = each(%$key_columns)) {
592
			while(my ($key, $value) = each(%$key_columns)) {
591
				next unless(defined $value);
593
				next unless(defined $value);
592
				$update_sth->bind_param(++$count, $value);
594
				$update_sth->bind_param(++$count, $value);
593
			}
595
			}
594
			
596
 
595
			$res        = $update_sth->execute;
597
			$res        = $update_sth->execute;
596
			$res_action = 'update';
598
			$res_action = 'update';
597
		}
599
		}
598
 
600
 
599
		if($res < 1) {
601
		if($res < 1) {
Line 630... Line 632...
630
			}
632
			}
631
			while(my ($key, $value) = each(%$value_columns)) {
633
			while(my ($key, $value) = each(%$value_columns)) {
632
				next unless(defined $value);
634
				next unless(defined $value);
633
				$insert_sth->bind_param(++$count, $value);
635
				$insert_sth->bind_param(++$count, $value);
634
			}
636
			}
635
			
637
 
636
			$res        = $insert_sth->execute;
638
			$res        = $insert_sth->execute;
637
			$res_action = 'insert';
639
			$res_action = 'insert';
638
		}
640
		}
639
	};
641
	};
-
 
642
    # FIXME handle exceptions?
640
 
643
 
641
	if(db_close($request, $dbh, $@)) {
644
	if(db_close($request, $dbh, $@)) {
642
		return $res_action;
645
		return $res_action;
643
	}
646
	}
644
	else {
647
	else {