]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Fix base64 folding in Lua API
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sun, 6 May 2018 15:54:01 +0000 (16:54 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sun, 6 May 2018 15:54:01 +0000 (16:54 +0100)
Issue: #2225

src/lua/lua_util.c
src/plugins/lua/dmarc.lua

index 50fa6d3979a604d6ffd39a1f2efb321ec839f138..6c200d1be8c0c82a9de733bf571633ef4ff3715d 100644 (file)
@@ -50,7 +50,7 @@ LUA_FUNCTION_DEF (util, load_rspamd_config);
  */
 LUA_FUNCTION_DEF (util, config_from_ucl);
 /***
- * @function util.encode_base64(input[, str_len])
+ * @function util.encode_base64(input[, str_len, [newlines_type]])
  * Encodes data in base64 breaking lines if needed
  * @param {text or string} input input data
  * @param {number} str_len optional size of lines or 0 if split is not needed
@@ -756,6 +756,7 @@ lua_util_encode_base64 (lua_State *L)
        gchar *out;
        gsize inlen, outlen;
        guint str_lim = 0;
+       gboolean fold = FALSE;
 
        if (lua_type (L, 1) == LUA_TSTRING) {
                s = luaL_checklstring (L, 1, &inlen);
@@ -771,13 +772,37 @@ lua_util_encode_base64 (lua_State *L)
 
        if (lua_gettop (L) > 1) {
                str_lim = luaL_checknumber (L, 2);
+
+               fold = !!(str_lim > 0);
        }
 
        if (s == NULL) {
                lua_pushnil (L);
        }
        else {
-               out = rspamd_encode_base64 (s, inlen, str_lim, &outlen);
+
+               if (fold) {
+                       out = rspamd_encode_base64 (s, inlen, str_lim, &outlen);
+               }
+               else {
+                       enum rspamd_newlines_type how = RSPAMD_TASK_NEWLINES_CRLF;
+
+                       if (lua_type (L, 3) == LUA_TSTRING) {
+                               const gchar *how_str = lua_tostring (L, 3);
+
+                               if (g_ascii_strcasecmp (how_str, "cr") == 0) {
+                                       how = RSPAMD_TASK_NEWLINES_CR;
+                               }
+                               else if (g_ascii_strcasecmp (how_str, "lf") == 0) {
+                                       how = RSPAMD_TASK_NEWLINES_LF;
+                               }
+                               else if (g_ascii_strcasecmp (how_str, "crlf") != 0) {
+                                       return luaL_error (L, "invalid newline style: %s", how_str);
+                               }
+                       }
+
+                       out = rspamd_encode_base64_fold (s, inlen, str_lim, &outlen, how);
+               }
 
                if (out != NULL) {
                        t = lua_newuserdata (L, sizeof (*t));
index 652526d693fb7ac2fe40b0fb5e26cf3f2010df03..58e48bd01e4edc27892b539356da862efd9d1f37 100644 (file)
@@ -744,7 +744,10 @@ if opts['reporting'] == true then
         for k in pairs(reporting_addr) do
           table.insert(tmp_addr, k)
         end
-        local encoded = rspamd_util.encode_base64(table.concat({xmlf('header'), xmlf('entries'), xmlf('footer')}), 78)
+        local encoded = rspamd_util.encode_base64(table.concat(
+                {xmlf('header'),
+                 xmlf('entries'),
+                 xmlf('footer')}), 78)
         local function mail_cb(err, data, conn)
           local function no_error(merr, mdata, wantcode)
             wantcode = wantcode or '2'