#!/usr/local/bin/perl # Show a form for selecting the source for a map require './postfix-lib.pl'; &ReadParse(); &error_setup($text{'chooser_err'}); @oldmaps = &get_maps_types_files($in{'map'}); # Build a list of maps from inputs for($i=0; defined($t = $in{"type_".$i}); $i++) { next if (!$t); if ($t eq "hash") { # Simple file $in{"hash_$i"} =~ /^[\/\.]\S+$/ || &error(&text('chooser_ehash', $i+1)); push(@maps, "hash:".$in{"hash_$i"}); } elsif ($t eq "regexp") { # Regular expressions file $in{"regexp_$i"} =~ /^[\/\.]\S+$/ || &error(&text('chooser_eregexp', $i+1)); push(@maps, "regexp:".$in{"regexp_$i"}); } elsif ($t eq "pcre") { # Perl-style regular expressions file $in{"pcre_$i"} =~ /^[\/\.]\S+$/ || &error(&text('chooser_epcre', $i+1)); push(@maps, "pcre:".$in{"pcre_$i"}); } elsif ($t eq "mysqlsrc") { # Common MySQL source push(@maps, "mysql:".$in{"mysqlsrc_$i"}); } elsif ($t eq "mysql") { # MySQL database if ($oldmaps[$i]->[0] eq "mysql" && $oldmaps[$i]->[1] =~ /^[\/\.]/) { # Same file as before $file = $oldmaps[$i]->[1]; } else { # Pick a filename based on the field $file = &guess_config_dir()."/".$in{'mapname'}. ($i ? ".$i" : "").".mysql.conf"; } # Validate and save MySQL settings, starting with host if ($in{"mhosts_${i}_def"}) { &save_backend_config($file, "hosts", undef); } else { $in{"mhosts_$i"} =~ /\S/ || &error(&text('chooser_emhosts', $i+1)); &save_backend_config($file, "hosts", $in{"mhosts_$i"}); } # Username $in{"muser_$i"} =~ /^\S+$/ || &error(&text('chooser_emuser', $i+1)); &save_backend_config($file, "user", $in{"muser_$i"}); # Password $in{"mpassword_$i"} =~ /^\S+$/ || &error(&text('chooser_empassword', $i+1)); &save_backend_config($file, "password", $in{"mpassword_$i"}); # Custom query if ($postfix_version >= 2.2) { if ($in{"mquery_${i}_def"}) { &save_backend_config($file, "query", undef); } else { $in{"mdbname_$i"} =~ /\S/ || &error(&text('chooser_emquery', $i+1)); &save_backend_config($file, "query", $in{"mquery_$i"}); } } # Database name $in{"mdbname_$i"} =~ /^\S+$/ || &error(&text('chooser_emdbname', $i+1)); &save_backend_config($file, "dbname", $in{"mdbname_$i"}); # Table name $in{"mtable_$i"} =~ /^\S+$/ || &error(&text('chooser_emtable', $i+1)); &save_backend_config($file, "table", $in{"mtable_$i"}); # Value field $in{"mselect_field_$i"} =~ /^[a-z0-9\_]+$/i || &error(&text('chooser_emselect_field', $i+1)); &save_backend_config($file, "select_field", $in{"mselect_field_$i"}); # Key field $in{"mwhere_field_$i"} =~ /^[a-z0-9\_]+$/i || &error(&text('chooser_emwhere_field', $i+1)); &save_backend_config($file, "where_field", $in{"mwhere_field_$i"}); # Additional select conditions if ($in{"madditional_conditions_${i}_def"}) { &save_backend_config($file, "additional_conditions"); } else { $in{"madditional_conditions_$i"} =~ /\S/ || &error(&text('chooser_emadditional', $i+1)); &save_backend_config($file, "additional_conditions", $in{"madditional_conditions_$i"}); } push(@maps, "mysql:$file"); push(@files, $file); } elsif ($t eq "ldap") { # LDAP database if ($oldmaps[$i]->[0] eq "ldap" && $oldmaps[$i]->[1] =~ /^[\/\.]/) { # Same file as before $file = $oldmaps[$i]->[1]; } else { # Pick a filename based on the field $file = &guess_config_dir()."/".$in{'mapname'}. ($i ? ".$i" : "").".ldap.conf"; } # Save LDAP server hostname if ($in{"lserver_host_${i}_def"}) { &save_backend_config($file, "server_host", undef); } else { $in{"lserver_host_$i"} =~ /\S/ || &error(&text('chooser_elserver_host', $i+1)); &save_backend_config($file, "server_host", $in{"lserver_host_$i"}); } # LDAP port number if ($in{"lserver_port_${i}_def"}) { &save_backend_config($file, "server_port", undef); } else { $in{"lserver_port_$i"} =~ /^\d+$/ || &error(&text('chooser_elserver_port', $i+1)); &save_backend_config($file, "server_port", $in{"lserver_port_$i"}); } # Start TLS? &save_backend_config($file, "start_tls", $in{"lstart_tls_$i"}); # Search base $in{"lsearch_base_$i"} =~ /\S/ || &error(&text('chooser_elsearch_base', $i+1)); &save_backend_config($file, "search_base", $in{"lsearch_base_$i"}); # Query filter if ($in{"lquery_filter_${i}_def"}) { &save_backend_config($file, "query_filter", undef); } else { $in{"lquery_filter_$i"} =~ /^\S+$/ || &error(&text('chooser_elquery_filter', $i+1)); &save_backend_config($file, "query_filter", $in{"lquery_filter_$i"}); } # Resulting attribute if ($in{"lresult_attribute_${i}_def"}) { &save_backend_config($file, "result_attribute", undef); } else { $in{"lresult_attribute_$i"} =~ /^\S+$/ || &error(&text('chooser_elresult_attribute', $i+1)); &save_backend_config($file, "result_attribute", $in{"lresult_attribute_$i"}); } # Search scope &save_backend_config($file, "scope", $in{"lscope_$i"} || undef); # Login to server? &save_backend_config($file, "bind", $in{"lbind_$i"}); # Username if ($in{"lbind_dn_${i}_def"}) { &save_backend_config($file, "bind_dn", undef); } else { $in{"lbind_dn_$i"} =~ /\S/ || &error(&text('chooser_elbind_dn', $i+1)); &save_backend_config($file, "bind_dn", $in{"lbind_dn_$i"}); } # Password if ($in{"lbind_pw_${i}_def"}) { &save_backend_config($file, "bind_pw", undef); } else { $in{"lbind_pw_$i"} =~ /\S/ || &error(&text('chooser_elbind_pw', $i+1)); &save_backend_config($file, "bind_pw", $in{"lbind_pw_$i"}); } push(@maps, "ldap:$file"); push(@files, $file); } elsif ($t eq "other") { # Some other map $in{"other_$i"} =~ /^[a-z0-9]+:[^, ]+$/i || &error(&text('chooser_eother', $i+1)); push(@maps, $in{"other_$i"}); } else { &error("Unknown type $t"); } } @maps || &error($text{'chooser_enone'}); # Write out mysql and LDAP files @files = &unique(@files); @newfiles = map { !-r $_ } @files; foreach $f (@files) { &lock_file($f); } &flush_file_lines(@files); foreach $f (@newfiles) { &set_ownership_permissions(undef, undef, 0700, $f); } foreach $f (@files) { &unlock_file($f); } # Create final string for map $str = join(",", @maps); &popup_header($text{'chooser_title'}); print < top.opener.ifield.value = "$str"; window.close(); EOF if (@files) { &webmin_log("backend", undef, $in{'map_name'}); } &popup_footer();