}
static bool
-connect_limit_key_parse(const char *ident, struct connect_limit_key *key_r)
+connect_limit_key_parse(const char *const **_args,
+ struct connect_limit_key *key_r)
{
- const char *p, *p2, *ip_str;
+ const char *const *args = *_args;
- /* imap, pop3: service/ip/username
- lmtp: service/username */
- p = strchr(ident, '/');
- if (p == NULL)
+ /* <username> <service> <ip> */
+ if (str_array_length(args) < 3)
return FALSE;
i_zero(key_r);
- key_r->service = t_strdup_until(ident, p++);
+ key_r->username = args[0];
+ key_r->service = args[1];
+ if (args[2][0] != '\0' && net_addr2ip(args[2], &key_r->ip) < 0)
+ return FALSE;
- p2 = strchr(p, '/');
- if (p2 == NULL)
- key_r->username = p;
- else {
- ip_str = t_strdup_until(p, p2++);
- key_r->username = p2;
- if (ip_str[0] != '\0' && net_addr2ip(ip_str, &key_r->ip) < 0)
- return FALSE;
- }
+ *_args += 3;
return TRUE;
}
*error_r = "CONNECT: Invalid pid";
return -1;
}
- if (!connect_limit_key_parse(args[1], &key)) {
+ args++;
+ if (!connect_limit_key_parse(&args, &key)) {
*error_r = "CONNECT: Invalid ident string";
return -1;
}
*error_r = "DISCONNECT: Invalid pid";
return -1;
}
- if (!connect_limit_key_parse(args[1], &key)) {
+ args++;
+ if (!connect_limit_key_parse(&args, &key)) {
*error_r = "DISCONNECT: Invalid ident string";
return -1;
}
*error_r = "LOOKUP: Not enough parameters";
return -1;
}
- if (!connect_limit_key_parse(args[0], &key)) {
+ if (!connect_limit_key_parse(&args, &key)) {
*error_r = "LOOKUP: Invalid ident string";
return -1;
}
const struct master_service_anvil_session *session)
{
str_printfa(cmd, "%s\t", my_pid);
+ str_append_tabescaped(cmd, session->username);
+ str_append_c(cmd, '\t');
str_append_tabescaped(cmd, session->service_name);
- if (session->ip.family != 0) {
- str_append_c(cmd, '/');
+ str_append_c(cmd, '\t');
+ if (session->ip.family != 0)
str_append(cmd, net_ip2addr(&session->ip));
- }
- str_append_c(cmd, '/');
- str_append_tabescaped(cmd, session->username);
}
bool master_service_anvil_connect(struct master_service *service,
const struct mail_storage_service_input *input =
mail_storage_service_user_get_input(llrcpt->service_user);
const char *query = t_strconcat("LOOKUP\t",
- master_service_get_name(master_service),
- "/", str_tabescape(input->username), NULL);
+ str_tabescape(input->username), "\t",
+ master_service_get_name(master_service), "\t", NULL);
llrcpt->anvil_query = anvil_client_query(anvil, query,
lmtp_local_rcpt_anvil_cb, llrcpt);
return 0;
return;
}
- query = t_strconcat("LOOKUP\t", login_binary->protocol, "/",
- net_ip2addr(&client->ip), "/",
- str_tabescape(client->virtual_user), NULL);
+ query = t_strconcat("LOOKUP\t",
+ str_tabescape(client->virtual_user), "\t",
+ login_binary->protocol, "\t",
+ net_ip2addr(&client->ip), NULL);
client->anvil_request = req;
client->anvil_query =
anvil_client_query(anvil, query, anvil_lookup_callback, req);