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 { |