struct rspamd_url *url = value;
ucl_object_t *obj;
- if (url->userlen > 0 && url->hostlen > 0 &&
- url->host == url->user + url->userlen + 1) {
- obj = ucl_object_fromlstring (url->user,
+ if (url->userlen > 0 && url->hostlen > 0) {
+ obj = ucl_object_fromlstring (rspamd_url_user_unsafe (url),
url->userlen + url->hostlen + 1);
ucl_array_append (cb->top, obj);
}
switch (field) {
case UF_SCHEMA:
if (uri->userlen > 0) {
- uri->user -= shift;
+ uri->usershift -= shift;
}
if (uri->hostlen > 0) {
uri->host -= shift;
uri->fragmentlen = complen;
break;
case UF_USERINFO:
- uri->user = comp;
+ uri->usershift = u.field_data[i].off;
uri->userlen = complen;
break;
default:
}
if (url->userlen > 0) {
- rspamd_cryptobox_fast_hash_update (&st, url->user, url->userlen);
+ rspamd_cryptobox_fast_hash_update (&st, rspamd_url_user_unsafe(url), url->userlen);
}
return (guint)rspamd_cryptobox_fast_hash_final (&st);
return FALSE;
}
else {
- return rspamd_lc_cmp (u1->user, u2->user, u1->userlen) ==
- 0;
+ return (rspamd_lc_cmp (rspamd_url_user_unsafe(u1),
+ rspamd_url_user_unsafe(u2),
+ u1->userlen) == 0);
}
}
else {
#define CHECK_URL_COMPONENT(beg, len, flags) do { \
for (i = 0; i < (len); i ++) { \
- if ((rspamd_url_encoding_classes[(beg)[i]] & (flags)) == 0) { \
+ if ((rspamd_url_encoding_classes[(guchar)(beg)[i]] & (flags)) == 0) { \
dlen += 2; \
} \
} \
#define ENCODE_URL_COMPONENT(beg, len, flags) do { \
for (i = 0; i < (len) && dend > d; i ++) { \
- if ((rspamd_url_encoding_classes[(beg)[i]] & (flags)) == 0) { \
+ if ((rspamd_url_encoding_classes[(guchar)(beg)[i]] & (flags)) == 0) { \
*d++ = '%'; \
- *d++ = hexdigests[((beg)[i] >> 4) & 0xf]; \
- *d++ = hexdigests[(beg)[i] & 0xf]; \
+ *d++ = hexdigests[(guchar)((beg)[i] >> 4) & 0xf]; \
+ *d++ = hexdigests[(guchar)(beg)[i] & 0xf]; \
} \
else { \
*d++ = (beg)[i]; \
CHECK_URL_COMPONENT ((guchar *)url->host, url->hostlen,
RSPAMD_URL_FLAGS_HOSTSAFE);
- CHECK_URL_COMPONENT ((guchar *)url->user, url->userlen,
+ CHECK_URL_COMPONENT (rspamd_url_user_unsafe(url), url->userlen,
RSPAMD_URL_FLAGS_USERSAFE);
CHECK_URL_COMPONENT ((guchar *)url->data, url->datalen,
RSPAMD_URL_FLAGS_PATHSAFE);
}
if (url->userlen > 0) {
- ENCODE_URL_COMPONENT ((guchar *)url->user, url->userlen,
+ ENCODE_URL_COMPONENT (rspamd_url_user_unsafe (url), url->userlen,
RSPAMD_URL_FLAGS_USERSAFE);
*d++ = ':';
}
LUA_TRACE_POINT;
struct rspamd_lua_url *url = lua_check_url (L, 1);
- if (url != NULL && url->url->user != NULL) {
- lua_pushlstring (L, url->url->user, url->url->userlen);
+ if (url != NULL && rspamd_url_user (url->url) != NULL) {
+ lua_pushlstring (L, rspamd_url_user (url->url), url->url->userlen);
}
else {
lua_pushnil (L);
if (url->url->protocol == PROTOCOL_MAILTO) {
gchar *tmp = g_malloc (url->url->userlen + 1 +
url->url->hostlen);
- memcpy (tmp, url->url->user, url->url->userlen);
+ if (url->url->userlen) {
+ memcpy (tmp, url->url->string + url->url->usershift, url->url->userlen);
+ }
+
tmp[url->url->userlen] = '@';
memcpy (tmp + url->url->userlen + 1, url->url->host,
url->url->hostlen);
if (u->userlen > 0) {
lua_pushstring (L, "user");
- lua_pushlstring (L, u->user, u->userlen);
+ lua_pushlstring (L, rspamd_url_user (u), u->userlen);
lua_settable (L, -3);
}