/* * Copyright 2023 Vsevolod Stakhov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "lua_common.h" #include "lua_compress.h" #include "lptree.h" #include "utlist.h" #include "unix-std.h" #include "ottery.h" #include "lua_thread_pool.h" #include "libstat/stat_api.h" #include "libserver/rspamd_control.h" #include <math.h> /* Lua module init function */ #define MODULE_INIT_FUNC "module_init" #ifdef WITH_LUA_TRACE ucl_object_t *lua_traces; #endif const luaL_reg null_reg[] = { {"__tostring", rspamd_lua_class_tostring}, {NULL, NULL}}; static const char rspamd_modules_state_global[] = "rspamd_plugins_state"; static GQuark lua_error_quark(void) { return g_quark_from_static_string("lua-routines"); } /* * Used to map string to a pointer */ KHASH_INIT(lua_class_set, const char *, int, 1, rspamd_str_hash, rspamd_str_equal); struct rspamd_lua_context { lua_State *L; khash_t(lua_class_set) * classes; struct rspamd_lua_context *prev, *next; /* Expensive but we usually have exactly one lua state */ }; struct rspamd_lua_context *rspamd_lua_global_ctx = NULL; #define RSPAMD_LUA_NCLASSES 64 static inline struct rspamd_lua_context * rspamd_lua_ctx_by_state(lua_State *L) { struct rspamd_lua_context *cur; DL_FOREACH(rspamd_lua_global_ctx, cur) { if (cur->L == L) { return cur; } } /* When we are using thread pool, this is the case... */ return rspamd_lua_global_ctx; } /* Util functions */ /** * Create new class and store metatable on top of the stack (must be popped if not needed) * @param L * @param classname name of class * @param func table of class methods */ void rspamd_lua_new_class(lua_State *L, const gchar *classname, const struct luaL_reg *methods) { khiter_t k; gint r, nmethods = 0; gboolean seen_index = false; struct rspamd_lua_context *ctx = rspamd_lua_ctx_by_state(L); if (methods) { for (;;) { if (methods[nmethods].name != NULL) { if (strcmp(methods[nmethods].name, "__index") == 0) { seen_index = true; } nmethods++; } else { break; } } } lua_createtable(L, 0, 3 + nmethods); if (!seen_index) { lua_pushstring(L, "__index"); lua_pushvalue(L, -2); /* pushes the metatable */ lua_settable(L, -3); /* metatable.__index = metatable */ } lua_pushstring(L, "class"); lua_pushstring(L, classname); lua_rawset(L, -3); if (methods) { luaL_register(L, NULL, methods); /* pushes all methods as MT fields */ } lua_pushvalue(L, -1); /* Preserves metatable */ int offset = luaL_ref(L, LUA_REGISTRYINDEX); k = kh_put(lua_class_set, ctx->classes, classname, &r); kh_value(ctx->classes, k) = offset; /* MT is left on stack ! */ } static const gchar * rspamd_lua_class_tostring_buf(lua_State *L, gboolean print_pointer, gint pos) { static gchar buf[64]; const gchar *ret = NULL; gint pop = 0; if (!lua_getmetatable(L, pos)) { goto err; } pop++; lua_pushstring(L, "class"); lua_gettable(L, -2); pop++; if (!lua_isstring(L, -1)) { goto err; } if (print_pointer) { rspamd_snprintf(buf, sizeof(buf), "%s(%p)", lua_tostring(L, -1), lua_touserdata(L, 1)); } else { rspamd_snprintf(buf, sizeof(buf), "%s", lua_tostring(L, -1)); } ret = buf; err: lua_pop(L, pop); return ret; } gint rspamd_lua_class_tostring(lua_State *L) { const gchar *p; p = rspamd_lua_class_tostring_buf(L, TRUE, 1); if (!p) { lua_pushstring(L, "invalid object passed to 'lua_common.c:__tostring'"); return lua_error(L); } lua_pushstring(L, p); return 1; } void rspamd_lua_setclass(lua_State *L, const gchar *classname, gint objidx) { khiter_t k; struct rspamd_lua_context *ctx = rspamd_lua_ctx_by_state(L); k = kh_get(lua_class_set, ctx->classes, classname); g_assert(k != kh_end(ctx->classes)); lua_rawgeti(L, LUA_REGISTRYINDEX, kh_value(ctx->classes, k)); if (objidx < 0) { objidx--; } lua_setmetatable(L, objidx); } void rspamd_lua_class_metatable(lua_State *L, const gchar *classname) { khiter_t k; struct rspamd_lua_context *ctx = rspamd_lua_ctx_by_state(L); k = kh_get(lua_class_set, ctx->classes, classname); g_assert(k != kh_end(ctx->classes)); lua_rawgeti(L, LUA_REGISTRYINDEX, kh_value(ctx->classes, k)); } void rspamd_lua_add_metamethod(lua_State *L, const gchar *classname, luaL_Reg *meth) { khiter_t k; struct rspamd_lua_context *ctx = rspamd_lua_ctx_by_state(L); k = kh_get(lua_class_set, ctx->classes, classname); g_assert(k != kh_end(ctx->classes)); lua_rawgeti(L, LUA_REGISTRYINDEX, kh_value(ctx->classes, k)); lua_pushcfunction(L, meth->func); lua_setfield(L, -2, meth->name); lua_pop(L, 1); /* remove metatable */ } /* assume that table is at the top */ void rspamd_lua_table_set(lua_State *L, const gchar *index, const gchar *value) { lua_pushstring(L, index); if (value) { lua_pushstring(L, value); } else { lua_pushnil(L); } lua_settable(L, -3); } const gchar * rspamd_lua_table_get(lua_State *L, const gchar *index) { const gchar *result; lua_pushstring(L, index); lua_gettable(L, -2); if (!lua_isstring(L, -1)) { return NULL; } result = lua_tostring(L, -1); lua_pop(L, 1); return result; } static void lua_add_actions_global(lua_State *L) { gint i; lua_newtable(L); for (i = METRIC_ACTION_REJECT; i <= METRIC_ACTION_NOACTION; i++) { lua_pushstring(L, rspamd_action_to_str(i)); lua_pushinteger(L, i); lua_settable(L, -3); } /* Set global table */ lua_setglobal(L, "rspamd_actions"); } #ifndef __APPLE__ #define OS_SO_SUFFIX ".so" #else #define OS_SO_SUFFIX ".dylib" #endif void rspamd_lua_set_path(lua_State *L, const ucl_object_t *cfg_obj, GHashTable *vars) { const gchar *old_path, *additional_path = NULL; const ucl_object_t *opts = NULL; const gchar *rulesdir = RSPAMD_RULESDIR, *lualibdir = RSPAMD_LUALIBDIR, *libdir = RSPAMD_LIBDIR; const gchar *t; gchar path_buf[PATH_MAX]; lua_getglobal(L, "package"); lua_getfield(L, -1, "path"); old_path = luaL_checkstring(L, -1); if (strstr(old_path, RSPAMD_LUALIBDIR) != NULL) { /* Path has been already set, do not touch it */ lua_pop(L, 2); return; } if (cfg_obj) { opts = ucl_object_lookup(cfg_obj, "options"); if (opts != NULL) { opts = ucl_object_lookup(opts, "lua_path"); if (opts != NULL && ucl_object_type(opts) == UCL_STRING) { additional_path = ucl_object_tostring(opts); } } } if (additional_path) { rspamd_snprintf(path_buf, sizeof(path_buf), "%s;" "%s", additional_path, old_path); } else { /* Try environment */ t = getenv("RULESDIR"); if (t) { rulesdir = t; } t = getenv("LUALIBDIR"); if (t) { lualibdir = t; } t = getenv("LIBDIR"); if (t) { libdir = t; } t = getenv("RSPAMD_LIBDIR"); if (t) { libdir = t; } if (vars) { t = g_hash_table_lookup(vars, "RULESDIR"); if (t) { rulesdir = t; } t = g_hash_table_lookup(vars, "LUALIBDIR"); if (t) { lualibdir = t; } t = g_hash_table_lookup(vars, "LIBDIR"); if (t) { libdir = t; } t = g_hash_table_lookup(vars, "RSPAMD_LIBDIR"); if (t) { libdir = t; } } rspamd_snprintf(path_buf, sizeof(path_buf), "%s/lua/?.lua;" "%s/?.lua;" "%s/?.lua;" "%s/?/init.lua;" "%s", RSPAMD_CONFDIR, rulesdir, lualibdir, lualibdir, old_path); } lua_pop(L, 1); lua_pushstring(L, path_buf); lua_setfield(L, -2, "path"); lua_getglobal(L, "package"); lua_getfield(L, -1, "cpath"); old_path = luaL_checkstring(L, -1); additional_path = NULL; if (opts != NULL) { opts = ucl_object_lookup(opts, "lua_cpath"); if (opts != NULL && ucl_object_type(opts) == UCL_STRING) { additional_path = ucl_object_tostring(opts); } } if (additional_path) { rspamd_snprintf(path_buf, sizeof(path_buf), "%s/?%s;" "%s", additional_path, OS_SO_SUFFIX, old_path); } else { rspamd_snprintf(path_buf, sizeof(path_buf), "%s/?%s;" "%s", libdir, OS_SO_SUFFIX, old_path); } lua_pop(L, 1); lua_pushstring(L, path_buf); lua_setfield(L, -2, "cpath"); lua_pop(L, 1); } static gint rspamd_lua_cmp_version_components(const gchar *comp1, const gchar *comp2) { guint v1, v2; v1 = strtoul(comp1, NULL, 10); v2 = strtoul(comp2, NULL, 10); return v1 - v2; } static int rspamd_lua_rspamd_version_cmp(lua_State *L) { const gchar *ver; gchar **components; gint ret = 0; if (lua_type(L, 2) == LUA_TSTRING) { ver = lua_tostring(L, 2); components = g_strsplit_set(ver, ".-_", -1); if (!components) { return luaL_error(L, "invalid arguments to 'cmp': %s", ver); } if (components[0]) { ret = rspamd_lua_cmp_version_components(components[0], RSPAMD_VERSION_MAJOR); } if (ret) { goto set; } if (components[1]) { ret = rspamd_lua_cmp_version_components(components[1], RSPAMD_VERSION_MINOR); } if (ret) { goto set; } /* * XXX: we don't compare git releases assuming that it is meaningless */ } else { return luaL_error(L, "invalid arguments to 'cmp'"); } set: g_strfreev(components); lua_pushinteger(L, ret); return 1; } static int rspamd_lua_rspamd_version_numeric(lua_State *L) { static gint64 version_num = RSPAMD_VERSION_NUM; const gchar *type; if (lua_gettop(L) >= 2 && lua_type(L, 1) == LUA_TSTRING) { type = lua_tostring(L, 1); if (g_ascii_strcasecmp(type, "short") == 0) { version_num = RSPAMD_VERSION_MAJOR_NUM * 1000 + RSPAMD_VERSION_MINOR_NUM * 100 + RSPAMD_VERSION_PATCH_NUM * 10; } else if (g_ascii_strcasecmp(type, "main") == 0) { version_num = RSPAMD_VERSION_MAJOR_NUM * 1000 + RSPAMD_VERSION_MINOR_NUM * 100 + RSPAMD_VERSION_PATCH_NUM * 10; } else if (g_ascii_strcasecmp(type, "major") == 0) { version_num = RSPAMD_VERSION_MAJOR_NUM; } else if (g_ascii_strcasecmp(type, "patch") == 0) { version_num = RSPAMD_VERSION_PATCH_NUM; } else if (g_ascii_strcasecmp(type, "minor") == 0) { version_num = RSPAMD_VERSION_MINOR_NUM; } } lua_pushinteger(L, version_num); return 1; } static int rspamd_lua_rspamd_version(lua_State *L) { const gchar *result = NULL, *type; if (lua_gettop(L) == 0) { result = RVERSION; } else if (lua_gettop(L) >= 1 && lua_type(L, 1) == LUA_TSTRING) { /* We got something like string */ type = lua_tostring(L, 1); if (g_ascii_strcasecmp(type, "short") == 0) { result = RSPAMD_VERSION_MAJOR "." RSPAMD_VERSION_MINOR; } else if (g_ascii_strcasecmp(type, "main") == 0) { result = RSPAMD_VERSION_MAJOR "." RSPAMD_VERSION_MINOR "." RSPAMD_VERSION_PATCH; } else if (g_ascii_strcasecmp(type, "major") == 0) { result = RSPAMD_VERSION_MAJOR; } else if (g_ascii_strcasecmp(type, "minor") == 0) { result = RSPAMD_VERSION_MINOR; } else if (g_ascii_strcasecmp(type, "patch") == 0) { result = RSPAMD_VERSION_PATCH; } else if (g_ascii_strcasecmp(type, "id") == 0) { result = RID; } else if (g_ascii_strcasecmp(type, "num") == 0) { return rspamd_lua_rspamd_version_numeric(L); } else if (g_ascii_strcasecmp(type, "cmp") == 0) { return rspamd_lua_rspamd_version_cmp(L); } } lua_pushstring(L, result); return 1; } static gboolean rspamd_lua_load_env(lua_State *L, const char *fname, gint tbl_pos, GError **err) { gint orig_top = lua_gettop(L), err_idx; gboolean ret = TRUE; lua_pushcfunction(L, &rspamd_lua_traceback); err_idx = lua_gettop(L); if (luaL_loadfile(L, fname) != 0) { g_set_error(err, g_quark_from_static_string("lua_env"), errno, "cannot load lua file %s: %s", fname, lua_tostring(L, -1)); ret = FALSE; } if (ret && lua_pcall(L, 0, 1, err_idx) != 0) { g_set_error(err, g_quark_from_static_string("lua_env"), errno, "cannot init lua file %s: %s", fname, lua_tostring(L, -1)); ret = FALSE; } if (ret && lua_type(L, -1) == LUA_TTABLE) { for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) { lua_pushvalue(L, -2); /* Store key */ lua_pushvalue(L, -2); /* Store value */ lua_settable(L, tbl_pos); } } else if (ret) { g_set_error(err, g_quark_from_static_string("lua_env"), errno, "invalid return type when loading env from %s: %s", fname, lua_typename(L, lua_type(L, -1))); ret = FALSE; } lua_settop(L, orig_top); return ret; } gboolean rspamd_lua_set_env(lua_State *L, GHashTable *vars, char **lua_env, GError **err) { gint orig_top = lua_gettop(L); gchar **env = g_get_environ(); /* Set known paths as rspamd_paths global */ lua_getglobal(L, "rspamd_paths"); if (lua_isnil(L, -1)) { const gchar *confdir = RSPAMD_CONFDIR, *local_confdir = RSPAMD_LOCAL_CONFDIR, *rundir = RSPAMD_RUNDIR, *dbdir = RSPAMD_DBDIR, *logdir = RSPAMD_LOGDIR, *wwwdir = RSPAMD_WWWDIR, *pluginsdir = RSPAMD_PLUGINSDIR, *rulesdir = RSPAMD_RULESDIR, *lualibdir = RSPAMD_LUALIBDIR, *prefix = RSPAMD_PREFIX, *sharedir = RSPAMD_SHAREDIR; const gchar *t; /* Try environment */ t = g_environ_getenv(env, "SHAREDIR"); if (t) { sharedir = t; } t = g_environ_getenv(env, "PLUGINSDIR"); if (t) { pluginsdir = t; } t = g_environ_getenv(env, "RULESDIR"); if (t) { rulesdir = t; } t = g_environ_getenv(env, "DBDIR"); if (t) { dbdir = t; } t = g_environ_getenv(env, "RUNDIR"); if (t) { rundir = t; } t = g_environ_getenv(env, "LUALIBDIR"); if (t) { lualibdir = t; } t = g_environ_getenv(env, "LOGDIR"); if (t) { logdir = t; } t = g_environ_getenv(env, "WWWDIR"); if (t) { wwwdir = t; } t = g_environ_getenv(env, "CONFDIR"); if (t) { confdir = t; } t = g_environ_getenv(env, "LOCAL_CONFDIR"); if (t) { local_confdir = t; } if (vars) { t = g_hash_table_lookup(vars, "SHAREDIR"); if (t) { sharedir = t; } t = g_hash_table_lookup(vars, "PLUGINSDIR"); if (t) { pluginsdir = t; } t = g_hash_table_lookup(vars, "RULESDIR"); if (t) { rulesdir = t; } t = g_hash_table_lookup(vars, "LUALIBDIR"); if (t) { lualibdir = t; } t = g_hash_table_lookup(vars, "RUNDIR"); if (t) { rundir = t; } t = g_hash_table_lookup(vars, "WWWDIR"); if (t) { wwwdir = t; } t = g_hash_table_lookup(vars, "CONFDIR"); if (t) { confdir = t; } t = g_hash_table_lookup(vars, "LOCAL_CONFDIR"); if (t) { local_confdir = t; } t = g_hash_table_lookup(vars, "DBDIR"); if (t) { dbdir = t; } t = g_hash_table_lookup(vars, "LOGDIR"); if (t) { logdir = t; } } lua_createtable(L, 0, 9); rspamd_lua_table_set(L, RSPAMD_SHAREDIR_INDEX, sharedir); rspamd_lua_table_set(L, RSPAMD_CONFDIR_INDEX, confdir); rspamd_lua_table_set(L, RSPAMD_LOCAL_CONFDIR_INDEX, local_confdir); rspamd_lua_table_set(L, RSPAMD_RUNDIR_INDEX, rundir); rspamd_lua_table_set(L, RSPAMD_DBDIR_INDEX, dbdir); rspamd_lua_table_set(L, RSPAMD_LOGDIR_INDEX, logdir); rspamd_lua_table_set(L, RSPAMD_WWWDIR_INDEX, wwwdir); rspamd_lua_table_set(L, RSPAMD_PLUGINSDIR_INDEX, pluginsdir); rspamd_lua_table_set(L, RSPAMD_RULESDIR_INDEX, rulesdir); rspamd_lua_table_set(L, RSPAMD_LUALIBDIR_INDEX, lualibdir); rspamd_lua_table_set(L, RSPAMD_PREFIX_INDEX, prefix); lua_setglobal(L, "rspamd_paths"); } lua_getglobal(L, "rspamd_env"); if (lua_isnil(L, -1)) { lua_newtable(L); if (vars != NULL) { GHashTableIter it; gpointer k, v; g_hash_table_iter_init(&it, vars); while (g_hash_table_iter_next(&it, &k, &v)) { rspamd_lua_table_set(L, k, v); } } gint hostlen = sysconf(_SC_HOST_NAME_MAX); if (hostlen <= 0) { hostlen = 256; } else { hostlen++; } gchar *hostbuf = g_alloca(hostlen); memset(hostbuf, 0, hostlen); gethostname(hostbuf, hostlen - 1); rspamd_lua_table_set(L, "hostname", hostbuf); rspamd_lua_table_set(L, "version", RVERSION); rspamd_lua_table_set(L, "ver_major", RSPAMD_VERSION_MAJOR); rspamd_lua_table_set(L, "ver_minor", RSPAMD_VERSION_MINOR); rspamd_lua_table_set(L, "ver_id", RID); lua_pushstring(L, "ver_num"); lua_pushinteger(L, RSPAMD_VERSION_NUM); lua_settable(L, -3); if (env) { gint lim = g_strv_length(env); for (gint i = 0; i < lim; i++) { if (RSPAMD_LEN_CHECK_STARTS_WITH(env[i], strlen(env[i]), "RSPAMD_")) { const char *var = env[i] + sizeof("RSPAMD_") - 1, *value; gint varlen; varlen = strcspn(var, "="); value = var + varlen; if (*value == '=') { value++; lua_pushlstring(L, var, varlen); lua_pushstring(L, value); lua_settable(L, -3); } } } } if (lua_env) { gint lim = g_strv_length(lua_env); for (gint i = 0; i < lim; i++) { if (!rspamd_lua_load_env(L, lua_env[i], lua_gettop(L), err)) { return FALSE; } } } lua_setglobal(L, "rspamd_env"); } lua_settop(L, orig_top); g_strfreev(env); return TRUE; } void rspamd_lua_set_globals(struct rspamd_config *cfg, lua_State *L) { struct rspamd_config **pcfg; gint orig_top = lua_gettop(L); /* First check for global variable 'config' */ lua_getglobal(L, "config"); if (lua_isnil(L, -1)) { /* Assign global table to set up attributes */ lua_newtable(L); lua_setglobal(L, "config"); } lua_getglobal(L, "metrics"); if (lua_isnil(L, -1)) { lua_newtable(L); lua_setglobal(L, "metrics"); } lua_getglobal(L, "composites"); if (lua_isnil(L, -1)) { lua_newtable(L); lua_setglobal(L, "composites"); } lua_getglobal(L, "rspamd_classifiers"); if (lua_isnil(L, -1)) { lua_newtable(L); lua_setglobal(L, "rspamd_classifiers"); } lua_getglobal(L, "classifiers"); if (lua_isnil(L, -1)) { lua_newtable(L); lua_setglobal(L, "classifiers"); } lua_getglobal(L, "rspamd_version"); if (lua_isnil(L, -1)) { lua_pushcfunction(L, rspamd_lua_rspamd_version); lua_setglobal(L, "rspamd_version"); } if (cfg != NULL) { pcfg = lua_newuserdata(L, sizeof(struct rspamd_config *)); rspamd_lua_setclass(L, "rspamd{config}", -1); *pcfg = cfg; lua_setglobal(L, "rspamd_config"); } lua_settop(L, orig_top); } #ifdef WITH_LUA_TRACE static gint lua_push_trace_data(lua_State *L) { if (lua_traces) { ucl_object_push_lua(L, lua_traces, true); } else { lua_pushnil(L); } return 1; } #endif static void * rspamd_lua_wipe_realloc(void *ud, void *ptr, size_t osize, size_t nsize) RSPAMD_ATTR_ALLOC_SIZE(4); static void * rspamd_lua_wipe_realloc(void *ud, void *ptr, size_t osize, size_t nsize) { if (nsize == 0) { if (ptr) { rspamd_explicit_memzero(ptr, osize); } free(ptr); } else if (ptr == NULL) { return malloc(nsize); } else { if (nsize < osize) { /* Wipe on shrinking (actually never used) */ rspamd_explicit_memzero(((unsigned char *) ptr) + nsize, osize - nsize); } return realloc(ptr, nsize); } return NULL; } #ifndef WITH_LUAJIT extern int luaopen_bit(lua_State *L); #endif static unsigned int lua_initialized = 0; lua_State * rspamd_lua_init(bool wipe_mem) { lua_State *L; if (wipe_mem) { #ifdef WITH_LUAJIT /* TODO: broken on luajit without GC64 */ L = luaL_newstate(); #else L = lua_newstate(rspamd_lua_wipe_realloc, NULL); #endif } else { L = luaL_newstate(); } struct rspamd_lua_context *ctx; ctx = (struct rspamd_lua_context *) g_malloc0(sizeof(*ctx)); ctx->L = L; ctx->classes = kh_init(lua_class_set); kh_resize(lua_class_set, ctx->classes, RSPAMD_LUA_NCLASSES); DL_APPEND(rspamd_lua_global_ctx, ctx); lua_gc(L, LUA_GCSTOP, 0); luaL_openlibs(L); luaopen_logger(L); luaopen_mempool(L); luaopen_config(L); luaopen_map(L); luaopen_trie(L); luaopen_task(L); luaopen_textpart(L); luaopen_mimepart(L); luaopen_image(L); luaopen_url(L); luaopen_classifier(L); luaopen_statfile(L); luaopen_regexp(L); luaopen_cdb(L); luaopen_xmlrpc(L); luaopen_http(L); luaopen_redis(L); luaopen_upstream(L); lua_add_actions_global(L); luaopen_dns_resolver(L); luaopen_rsa(L); luaopen_ip(L); luaopen_expression(L); luaopen_text(L<'>feat/add-query-param-to-force-language feat/add-rector-config feat/add-search-everywhere-button feat/add-subscription-via-occ feat/add-user-enabled-apps-ocs feat/add-wcf-cap feat/add_log_scan_command feat/ai-guest-restriction feat/allow-account-local-search feat/allow-enum-entity feat/allow-getter-setter-decl-fors feat/allow-oauth-grant-bypass feat/allow-to-configure-default-view feat/app-icon-opacity feat/ask-deletion feat/auto-accept-trusted-server feat/auto-sync-desktop-version feat/cache-routes feat/caldav/migrate-to-sabre-sharing-plugin feat/caption-cant-upload feat/cardav-example-contact feat/certificatemanager/default-bundle-path-option feat/check-enterprise feat/cleanup-oc-util feat/cleanup-oc-util-methods feat/clipboard-fallback feat/contacts-menu/js-hook-action feat/context-chat-ocp feat/conversion-adjusting feat/core/features-api feat/core/install-without-admin-user feat/core/pwa-hide-header feat/cors-on-webdav feat/cron/before-after-events feat/cypress-setup feat/dark-mode-variables feat/database/primary-replica-split-stable28 feat/database/query-result-fetch-associative-fetch-num feat/dav-pagination feat/dav-trashbin-backend feat/dav/absence-get-set-commands feat/dav/calendar-obj-event-webhooks feat/dav/calendar-object-admin-audit-log feat/dav/public-share-chunked-upload feat/declarative-settings/typed-abstraction feat/delete-separator feat/disable-share-deletion feat/dispatcher/log-raw-response-data feat/drop-compile-commits-rebase feat/edit-share-token feat/empty-trash feat/event-builder-invitation-emails feat/example-event feat/expose-nc-groups-to-system-addressbook-contacts feat/federated-calendar-sharing feat/file-conversion-provider feat/file-conversion-provider-front feat/file-drop-recursive feat/file-list-actions feat/files-bulk-tagging feat/files-bulk-tagging-followup feat/files-home-view feat/files-row-height feat/files-shortcuts feat/files-shortcuts-2 feat/files/chunked-upload-config-capabilities feat/files/resumable-uploads feat/files_sharing/co-owner feat/files_trashbin/allow-preventing-trash-permanently feat/getByAncestorInStorage feat/hint-hidden feat/http/request-header-attribute feat/ignore-warning-files feat/image-size-metadata feat/imailaddressvalidator feat/issue-3786-allow-shared-calendars feat/issue-563-calendar-export feat/issue-563-calendar-import feat/issue-994-two-factor-api feat/larger_ipv6_range feat/lexicon/moving-out-from-unstable feat/log-client-side-req-id feat/log-large-assets feat/log/log-session-id feat/logger-allow-psr-loglevel feat/mail-provider-settings feat/make-setup-check-trait-public feat/make-tasks-types-toggleable feat/material-icons-outline feat/maxschmi-49902 feat/meeting-proposals feat/migrate-files_external-vue feat/mime-column feat/mime-names feat/mimes-names feat/mountmanager/emit-events feat/namespace-group-route feat/nfo feat/no-issue/add-logging-preview-generation feat/no-issue/show-remote-shares-as-internal-config feat/no-two-factor-required-attribute feat/node-dist feat/noid/add-bulk-activity feat/noid/add-busy-status feat/noid/add-command-to-list-all-routes feat/noid/add-fake-summary-provider feat/noid/allow-specifying-related-object feat/noid/cache-user-keys feat/noid/check-integrity-all-apps feat/noid/files-external-lexicon feat/noid/get-value-type-from-lexicon feat/noid/happy-birthday feat/noid/info-xml-spdx-license-ids feat/noid/internal-lint-request-event feat/noid/lexicon-configurable-default-value feat/noid/lexicon-events feat/noid/lexicon-migrate-keys feat/noid/lexicon-store-on-get-as-default feat/noid/link-to-calendar-event feat/noid/list-addressbook-shares feat/noid/log-query-parameters feat/noid/occ-list-delete-calendar-subscription feat/noid/preset-config feat/noid/priority-notifications feat/noid/profile-data-api feat/noid/ratelimit-header feat/noid/show-nice-label-when-searching-in-root feat/noid/store-lexicon-default feat/noid/support-email-mentions feat/occ-files-cleanup-help feat/occ/command-events feat/ocp-sanitize-filenames feat/ocp/attendee-availability-api feat/ocp/meetings-api-requirements feat/openapi/merged-spec feat/oracle-setup-cypres feat/order-action feat/package-node-npm-engines-update feat/pagination-cardav feat/photo-cache-avif feat/photo-cache-webp feat/php-setup-file-upload feat/postgres-13-17 feat/preset/custom-share-token feat/preset/load-apps-on-preset feat/preset/profile-visibility+presetmanager feat/profile-app feat/psalm/error-deprecations feat/public-log-level feat/reduce_available_languages_set feat/repair-step-deduplicate-mounts feat/requestheader/indirect-parameter feat/restore-to-original-dir feat/restrict-tag-creation feat/rich-profile-biography feat/router-list-routs-cmd feat/row_format_check feat/s3/sse-c feat/sanitize-filenames-command feat/search-by-parent-id feat/search-in-files feat/search-in-files--small feat/search-while-filtering feat/sensitive-declarative-settings feat/settings/advanced-deploy-options feat/settings/app_api/daemon-selection feat/settings/app_api_apps_management feat/settings/too-much-caching-setup-check feat/setup feat/setup-check-logging feat/setup-checks feat/setupcheck-task-pickup-speed feat/share-grid-view feat/sharing-title feat/shipped/app_api feat/show-hide-ext feat/show-time-diff-user feat/switch-from-settype-to-casts feat/sync-truncation feat/sync-truncation2 feat/sync-truncation3 feat/systemtags-bulk-create-list feat/systemtags-missing-attrs feat/systemtags-public feat/tags-colors feat/tags-colors-2 feat/talk-9679/threads feat/task/analyze-image feat/taskprocessing/TextToImageSingle feat/template-field-extraction-improvements feat/test-app-routes feat/unified_search/online_providers feat/use-php84-lazy-objects feat/user-folder feat/user-get-quota-bytes feat/verbose-cron feat/vue-material-icons-outline feat/workflow-auto-update-cypress.yml feat/workflow-auto-update-node.yml feat/workflow-auto-update-npm-audit-fix.yml feat/workflow-auto-update-pr-feedback.yml feat/workflow-auto-update-reuse.yml feat/workflow-generator feat/zip-folder-plugin feat/zst feature/23308/create-new-favorite-dashboard-widget feature/51791/add-bsky-option-to-accounts feature/53428-autoCreateCollectionOnUpload feature/add-allowed-view-extensions-config feature/add-profile-to-occ feature/files-list-occ-command feature/hide-external-shares-excluded-groups feature/highlight-active-menu feature/noid/config-lexicon feature/noid/wrapped-appconfig feature/settings-design-improvements fetch-mount-memory fetch-mount-memory-30 fetch-mount-memory-30-squash fieat/profile-pronounces file-info-key-location-27 filePointerCheck filecache-chunking files-cache-node files-external-optional-dependencies files-external-setup-path filesVersionsFuncRefact files_external-scan-unscanned fileutils-files-by-user fix-44318-remote-share-not-listed fix-button-alignment-for-email-templates-in-outlook fix-clearing-unified-search-when-modal-is-closed fix-copying-or-moving-from-shared-groupfolders fix-dav-properties-column-type fix-endless-spinner-on-file-entries-after-triggering-an-action-on-stable30 fix-enforce-theme-for-public-links fix-federated-group-shares-when-no-longer-found-in-remote-server fix-federated-sharing-bug fix-files-external-smbclient-deprecated-binaryfinder fix-jobs-app-disable fix-json-decoding-groups-excluded-from-share fix-nc-env-inclusion fix-papercut-23486-weather-status-locale fix-putcsv-default fix-remove-auto-guessing-for-preview-semaphore fix-running-files-external-s3-tests-in-stable30-ci fix-setupcheck-filelocking fix-setupcheck-webfinger-400 fix-setupchecks-normalizeUrl-url-filter fix-sharing-expiration-notify fix-show-original-owner fix-theming-for-disabled-accounts fix-theming-for-disabled-users fix-updater-secret fix-user-collaborators-returned-when-searching-for-mail-collaborators fix/29-template-layout fix/30-oc-files fix/30-template-layout fix/32bit-pack fix/32bit-support fix/43260 fix/44288/catch-filesmetadatanotfound-exception fix/44492/settings-remove-user-manager fix/45717/hide-last-modified-for-shipped-apps fix/45884/accept-notification fix/45982/hide-move-action fix/46920/respect-no-download fix/47275/driverException fix/47658/upgrade-version-3100005 fix/48012/fix-share-email-send-mail-share fix/48415/do-not-rename-main-share-link fix/48437/dont-exclude-user fix/48829/visual-feedback-4-encryption-toggle fix/48860/stop-silent-expiry-date-addition-on-link-shares fix/48993 fix/49431-automatically-disable-sab fix/49473/task-url fix/49584-background-worker-interval-fixes fix/49584-background-worker-remove-interval fix/49638/update-prefs-indexes fix/49728/adapt-search-filters-correctly fix/49887/early-check-for-overwritten-home fix/49909/workflow-vue-compat fix/49954/add-send-mail-toggle fix/50177/movy-copy-e2e-tests fix/50215/hideCreateTemplateFolder fix/50363/correct-system-tags-i18n fix/50512/send-password-2-owner fix/50788/pass-hide-download-on-save fix/51022/simpler-request-before-upgrade fix/51022/simpler-request-pre-upgrade fix/51226/show-remote-shares-as-external fix/51226/show-remote-shares-as-external-2 fix/51506/mdast-util-gfm-autolink-literal-override fix/51833/add-retries-to-s3-client fix/51875/allow-keyboard-input-4-share-expiration-on-chrome fix/52060/manage-download-on-federated-reshare fix/52131/ignore-missing-themes-31 fix/52278/remove-unused-etag-check fix/52590/available-account-groups fix/52617/fix-group-admin-delegation fix/52794/share-advanced-settings fix/52795/consistent-share-save-behavior fix/53363/available-groups fix/53674-webdav-paginate-missing-collection-type fix/54080/using-userconfig-to-set-lang fix/78296/nextcloud-vue fix/788/add-password-confirmation-required-to-user-storage-create fix/788/add-password-required-to-external-storages fix/AppStore--remove-unneeded-warning fix/FileList-render fix/IMimeTypeDetector-types fix/PasswordConfirmationMiddleware-empty-header fix/PublicShareUtils fix/account-manager fix/account-mgmnt-settings fix/account-property-validation fix/activity-log-for-favorites-in-dav fix/add-autoload.php-for-tests fix/add-calendar-object-index fix/add-function-type-for-mimetype-sanitizer fix/add-getappversions-replacement fix/add-password-confirmation-to-save-global-creds fix/addUniqueMountpointIndex fix/adjust-default-color-background-plain-to-new-background fix/admin-tag-color-prevent fix/ai-settings fix/align-avatar-visibility fix/allconfig-use-search-case-insensitive fix/allow-255-filenames fix/allow-download-with-hide-download-flag fix/allow-enforcing-windows-support fix/allow-quota-wrapper-check fix/alter-invite-attachment-filename-and-type fix/app-discover fix/app-discover-section-media fix/app-icon-aria fix/app-store-groups fix/app-store-markdown fix/app-store-reactivity fix/app-store-remove-force-enable fix/appconfig/sensitive-keys-external-jwt-private-key fix/appframework/csrf-request-checks fix/apps/wrong-missing-casts fix/appstore-regressions fix/auth-token-uniq-constraint-violation-handling fix/auth/authtoken-activity-update-in-transaction fix/auth/logout-redirect-url fix/auto-reload-tags fix/avoid-crashing-versions-listener-on-non-existing-file fix/avoid-invalid-share-on-transfer-ownership fix/background-image fix/backgroundjobs/adjust-intervals-time-sensitivities fix/backport-gridview-29 fix/baseresponse/xml-element-value-string-cast fix/better-drag-n-drop fix/bring-back-hide-downlaod fix/bring-back-zip-event fix/broken-event-notifications fix/cache-hit-getFirstNodeById fix/cache-ldap-configuration-prefixes fix/cachebuster-stable30 fix/caldav/event-organizer-interaction fix/caldav/event-reader-duration fix/caldav/no-invitations-to-circles fix/caldav/use-direct-route-event-activity fix/carddav/create-sab-concurrently fix/cast-node-names-to-string fix/catch-exception-in-encrypt-all fix/catch-exception-in-encryption-listener fix/clarify-app-manager-methods fix/clean-up-group-shares fix/cleanup-blurhash-images fix/cleanup-dependencyanalyser fix/cleanup-dicontainer fix/cleanup-getinstallpath fix/cleanup-loadapp-calls fix/cleanup-servercontainer fix/cleanup-template-functions fix/cleanup-test-legacy-autoloader fix/cleanup-updater-class fix/cleanup-user-backends fix/cloud-id-input fix/code-sign-test fix/codeowner-nc-backend fix/collaboration/deduplicate-email-shares fix/colum-sizes-outline-icon fix/comment/children-count-integer fix/comments-outlined-icons fix/comments/activity-rich-subject-parameters fix/composer/autoload-dev-deps fix/config/additional-configs fix/config/return-user-config-deleted fix/contactsmenu/padding fix/contactsmigratortest fix/conversion-extension fix/convert-log fix/convert-rotate-to-timedjob fix/convert-schedulednotifications-to-timedjob fix/convert-type fix/core-cachebuster fix/core-session-logout-logging fix/core/password-from-env-nc-pass fix/core/preview-generation fix/create-missing-replacement-indexes fix/credential-passwordless-auth fix/cron-strict-cookie fix/cron/log-long-running-jobs-stable26 fix/cron/no-constructor-without-args fix/csrf-token-ignore-twofactor fix/current-user-principal fix/cy-selectors-for-files-trashbin fix/dashboard--performance-and-refactoring fix/dashboard/dont-load-hidden-widgets-initially fix/dashboard/skip-hidden-widgets fix/datadirectory-protection-setupcheck fix/dav-add-strict-type-declarations fix/dav-cast-content-lenght-to-int fix/dav-cast-params-to-string fix/dav-csrf fix/dav-harden-stream-handling fix/dav-nickname-master fix/dav-nickname-stable31 fix/dav-sorting fix/dav/abort-incomplete-caldav-changes-sync fix/dav/absence-status-too-long fix/dav/carddav-new-card-check-addressbook-early fix/dav/carddav-read-card-memory-usage fix/dav/create-sab-in-transaction fix/dav/create-sab-install fix/dav/first-login-listener fix/dav/image-export-plugin-fallback fix/dav/limit-sync-token-created-at-updates-stable28 fix/dav/limit-sync-token-created-at-updates-stable29 fix/dav/orphan-cleanup-job fix/dav/publicremote-share-token-pattern fix/dav/remove-object-properties-expensive fix/dav/update-rooms-resources-background-job fix/dav/use-iuser-displayname fix/dav/view-only-check fix/db-adapter-insert-if-not-exists-atomic fix/declarative-settings-priority fix/default-contact fix/default-contact-error-verbosity fix/defaultshareprovider/filter-reshares-correctly fix/delete-legacy-autoloader fix/deprecate-oc-template-and-cleanup fix/deprecation-comment fix/deps/php-seclin fix/destination-drop-check fix/disable-reminder-invalid-nodes fix/do-not-cache-routes-on-debug-mode fix/do-not-remind fix/do-not-throw-from-countusers fix/do-not-update-userkey-when-masterkey-is-used fix/docblock-color fix/docs fix/download-non-files-view fix/download-perms fix/drop-file-preview fix/drop-v-html fix/duplicated-conflict-resolution fix/dyslexia-font-not-loading fix/edit-locally-labels fix/emit_hooks_on_copy fix/empty-file-0byte-stable30 fix/encode-guest-file-request fix/encoding-wrapper-scanner fix/encoding-wrapper-scanner-stable30 fix/encrypt-decrypt-password fix/encryption-events fix/encryption-text fix/encryption/web-ui-bogus fix/entity/strict-types fix/eslint-warning fix/eslint-warnings fix/etag-constraint-search-query fix/external-storage-controller-cast-id fix/external-storage-int fix/fail-safe-files-actions fix/fav-sort-nav fix/federated-share-opening fix/federated-users fix/federatedfilesharing/dialog-callback fix/federatedfilesharing/group-cleanup fix/federation-certificate-store fix/file-conversion-missing-extension fix/file-drop fix/file-list-filters-reset fix/file-name-validator-case-sensitivity fix/file-request-enforced fix/file-type-filter-state fix/file_reference_invalidate_rename fix/files--handle-empty-view-with-error fix/files--list-header-button-title fix/files-actions-menu-position fix/files-actions-subcomponent fix/files-add-move-info fix/files-better-search-icon fix/files-duplicated-nodes fix/files-external-notify-mount-id-stable28 fix/files-external-workflow fix/files-failed-node fix/files-header-empty-view fix/files-header-submenu fix/files-hidden-summary fix/files-mtime fix/files-navigation-quota-total fix/files-new-folder fix/files-page-title fix/files-plural fix/files-position-navigation fix/files-proper-loading-icon fix/files-public-share fix/files-reload fix/files-rename fix/files-rename-esc fix/files-rename-folder fix/files-rename-store fix/files-renaming fix/files-scroll-perf fix/files-sharing-download fix/files-sharing-file-drop-folder fix/files-sharing-label fix/files-show-details-when-no-action fix/files-summary fix/files-trash-download fix/files-trashbin-files-integration fix/files-version-creation fix/files-versions fix/files-versions-author fix/files-versions-listeners fix/files-wording fix/files/activity-rich-object-strings fix/files/delete-display-no-trashbin fix/files/favorites-widget-folder-preview fix/files/preview-service-worker-registration fix/files/reactivity-inject fix/files/sort-after-view-change fix/files_external-cred-dialog fix/files_external/definition-parameter fix/files_external/forbidden-exception fix/files_external/hidden-password-fields fix/files_external/smb-case-insensitive-path-building fix/files_external_scan fix/files_sharing--global-search-in-select fix/files_sharing/advanced-settings-delete-share-button fix/files_sharing/cleanup-error-messages fix/files_sharing/disable-editing fix/files_sharing/filter-own-reshared-shares fix/files_sharing/harden-api fix/files_sharing/hide-own-reshares fix/files_sharing/ocm-permissions fix/files_sharing/sharing-entry-link-override-expiration-date fix/files_versions/previews fix/filesreport-cast-fileId-to-int fix/filter-empty-email fix/filter-for-components-explicitly fix/fix-32bits-phpunit fix/fix-admin-audit-event-listening fix/fix-admin-audit-listener fix/fix-admin-audit-paths fix/fix-appmanager-cleanappid fix/fix-copy-to-mountpoint-root fix/fix-cypress-note-to-recipient fix/fix-default-share-folder-for-group-shares fix/fix-di-when-casing-is-wrong fix/fix-disabled-user-list-for-saml-subadmin fix/fix-disabled-user-list-for-subadmins fix/fix-email-setupcheck-with-null-smtpmode fix/fix-email-share-transfer-accross-storages fix/fix-encryption-manager-injection fix/fix-incorrect-query-in-federatedshareprovider fix/fix-int-casting fix/fix-ldap-setupcheck-crash fix/fix-loginflow-v1 fix/fix-movie-preview-construct fix/fix-php-error-on-upgrade fix/fix-psalm-taint-errors fix/fix-psalm-taint-errors-2 fix/fix-public-download-activity fix/fix-server-tests fix/fix-share-creation-error-messages fix/fix-storage-interface-check fix/fix-warning-lazy-ghost-application fix/flaky-cypress fix/flaky-live-photos fix/forbidden-files-insensitive fix/forward-user-login-if-no-session fix/get-managers-as-subadmin fix/get-version-of-core fix/gracefully-parse-trusted-certificates fix/grid-view-actions fix/group-admin-new-user fix/handle-errors-in-migrate-key-format fix/harden-account-properties fix/harden-admin-settings fix/harden-template-functions fix/harden-thumbnail-endpoint fix/harmonize-ldap-function-logging fix/headers-lifecycle fix/highcontras-scrollbar fix/http/jsonresponse-data-type fix/http/template-valid-status-codes fix/icons-header-meu fix/imip-test-expects-integer fix/improve-error-output-of-sso-test fix/improve-init-profiling fix/improve-ldap-avatar-handling fix/index-systemtags fix/insecure-crypto-env fix/install-app-before-enable fix/install-dbport-unused fix/installation-wording fix/invalid-app-config fix/invalid-copied-share-link fix/invalid-mtime fix/invitations-named-parameter fix/issue-12387-delete-invitations fix/issue-13862 fix/issue-23666 fix/issue-3021-return-no-content-instead-of-error fix/issue-34720 fix/issue-47879-property-serialization fix/issue-48079-windows-time-zones fix/issue-48528-disable-itip-and-imip-messages fix/issue-48528-disable-itip-and-imip-messages-2 fix/issue-48732-exdate-rdate-property-instances fix/issue-49756-translations fix/issue-50054-resource-invite-regression fix/issue-50104-system-address-book-ui-settings fix/issue-50748-calendar-object-move fix/issue-50748-card-object-move fix/issue-6838-use-old-event-information-when-new-is-missing fix/issue-7194-fifth-not-fifty fix/issue-8458-imip-improvements-2 fix/istorage/return-types fix/iurlgenerator/url-regex-markdown-parenthesis fix/jquery-ui fix/l10n-placeholder fix/l10n-plain-string fix/l10n-us-english fix/ldap-avoid-false-positive-mapping fix/ldap/cache-ttl-jitter fix/ldap/lower-case-emails fix/legacy-file-drop fix/legacy-filepicker fix/legacy-oc-filepicker fix/less-words fix/line-height-calc fix/link-share-conflict-modal fix/load-more-than-5-items-in-folder-filter fix/loading-account-menu fix/lock-session-during-cookie-renew fix/log-failure-from-file-events fix/log-login-flow-state-token-errors fix/log-memcache-log-path-hash fix/login-chain-24 fix/login-error-state fix/login-origin fix/loginflow fix/lookup-server fix/lookup-server-connector fix/lookup-server-connector-v2 fix/low-res-for-blurhash fix/lower-email-case fix/lus-background-job fix/mailer-binaryfinder-fallback fix/make-router-reactive fix/map-sharee-information fix/master-template-layout fix/middle-click fix/migrate-dav-to-events fix/migrate-encryption-away-from-hooks fix/mime fix/mime-fallback-public fix/mime-int fix/missing-import fix/mkcol-quota-exceeded-response fix/move-away-from-oc-app fix/move-email-logic-local-user-backend fix/move-storage-constructor-to-specific-interface fix/multi-select fix/mysql-removed-auth fix/nav-quota-new-design fix/newUser-provisioning_api fix/no-account-filter-public-share fix/no-issue/enforced-props-checks fix/no-issue/file-request-disable-when-no-public-upload fix/no-issue/link-sharing-defaults fix/no-issue/no-reshare-perms-4-email-shares fix/no-issue/prevent-create-delete-perms-on-file-shares fix/no-issue/proper-share-sorting fix/no-issue/show-file-drop-permissions-correctly fix/no-issue/use-password-default-sharing-details fix/no-issues/add-encryption-available-config fix/node-version fix/node-vibrant fix/noid-add-status-and-set-attendee-status fix/noid-adjust-variables-for-translations fix/noid-catch-listener-erros-instead-of-failing fix/noid-check-for-properties-before-processing fix/noid-fix-user-create-quota fix/noid-improve-calendar-accuracy-performace fix/noid-reset-password fix/noid-retrieve-all-authors-at-the-same-time fix/noid/accept-informational-tests-as-success fix/noid/actions-boundaries fix/noid/allows-some-char-from-federationid fix/noid/appconfig-setmixed-on-typed fix/noid/broken-password-reset-form fix/noid/broken-taskprocessing-api fix/noid/calendar-enabled fix/noid/check-file-before-download fix/noid/clean-config-code fix/noid/contactsmenu-ab-enabled fix/noid/content-header-height fix/noid/count-disabled-correct fix/noid/debug-objectstorage-s3 fix/noid/deleted-circles-share fix/noid/deprecation-correct-case fix/noid/discover-unique-ocmprovider fix/noid/empty-path-for-files-versions fix/noid/encrypted-propagation-test fix/noid/ensure-userid-attr-present fix/noid/expose-calendar-enabled fix/noid/fed-share-on-local-reshare fix/noid/federation-really-surely-init-token fix/noid/fifty-fifth fix/noid/files-page-heading-theming-name fix/noid/files-version-sidebar-item-style fix/noid/filter-cancelled-events fix/noid/fix-itipbroker-messages fix/noid/fix-try-login fix/noid/fix-unified-search-provider-id fix/noid/flaky-sso-tests fix/noid/get-fedid-from-cloudfed-provider fix/noid/get-preview-force-mimetype fix/noid/ignore-missing-memberships-on-reshare-verification fix/noid/ignore-missing-owner fix/noid/ignore-null-appinfo fix/noid/ignore-unavailable-token fix/noid/in-folder-search fix/noid/init-navigation-data-too-soon fix/noid/krb-fallback fix/noid/ldap-displayname-cached fix/noid/ldap-n-counted-mapped-users fix/noid/ldap-no-connection-reason fix/noid/ldap-remnants-as-disabled-global fix/noid/ldap-setopt-for-disabling-certcheck fix/noid/lexicon-update-lazy-status fix/noid/log-false-user fix/noid/make-s3-connect-timeout-option-configurable fix/noid/mark-searchkeys-as-internal fix/noid/metadata-on-fresh-setup fix/noid/no-emails-for-user-shares fix/noid/no-lazy-loading-on-isBypassListed fix/noid/note-to-recipient-test fix/noid/null-safe-metadata fix/noid/path-hash-prep-statement fix/noid/refresh-filesize-on-conflict-24 fix/noid/remote-account-activity-translation fix/noid/rename-remote-user-to-guest-user fix/noid/return-verified-email fix/noid/revert-api-breaking-return-type fix/noid/rich-editor-mixin fix/noid/run-kerberos-tests-on-ubuntu-latest fix/noid/set-ext-pwd-as-sensitive fix/noid/statetoken-concurrency fix/noid/stuck-ffmpeg fix/noid/task-processing-file-content-stream fix/noid/taskprocessing-appapi fix/noid/test-samba-with-self-hosted fix/noid/textprocessing-list-types fix/noid/textprocessing-schedule-taskprocessing-provider fix/noid/thudnerbird-addon-useragent fix/noid/transfer-ownership-select fix/noid/try-latest-buildjet-cache fix/noid/update-codeowners-nfebe fix/noid/wfe-empty-group-in-check fix/noid/wfe-set-inital-value fix/noid/windows-font-family fix/noid/wipe-local-storage fix/note-icon-color fix/note-to-recipient fix/null-label fix/oauth2/owncloud-migration fix/oauth2/retain-legacy-oc-client-support fix/oc/inheritdoc fix/occ/config-fileowner-suppress-errors fix/ocm-host fix/ocm-public-key-is-optional fix/ocmdiscoveryservice/cache-errors fix/only-show-reshare-if-there-is fix/openapi/array-syntax fix/openapi/outdated-specs fix/oracle-db-connection fix/oracle-db-connection-29 fix/oracle-insert-id fix/overide-itip-broker fix/ownership-transfer-source-user-files fix/pass-hide-download-in-update-request fix/password-field-sharing fix/password-validation fix/path-length fix/people-translation fix/perf/cache-avilable-taskt-types fix/perf/cache-taskprocessing-json-parse fix/pick-folder-smart-picker fix/picker-tag-color fix/preview-check fix/product-name-capability fix/profile-visibility fix/pronouns-tests fix/pronouns-translation fix/proper-download-check fix/proper-preview-icon fix/properly-fail-on-invalid-json fix/provisionApi-status-codes fix/provisioning_api/password-change-hint-translation fix/proxy-app-screenshot fix/psalm/enabled-find-unused-baseline-entry fix/psalm/throws-annotations fix/psalm/update-baseline fix/public-copy-move-stable-28 fix/public-displayname-owner fix/public-get fix/public-owner-scope fix/public-share-expiration fix/public-share-router fix/public-upload-notification-default fix/qbmapper/find-entities-return-type fix/querybuilder/oracle-indentifier-length fix/querybuilder/output-columns-aliases fix/quota-exceptions fix/quota-view-files fix/rate-limit-share-creation fix/read-only-share-download fix/reasons-to-use fix/recently_active_pgsql fix/recommended-apps fix/rector-use-statements fix/redirect-openfile-param fix/refactor-imip fix/refactor-user-access-to-file-list fix/refresh-convert-list fix/release-gen-changelog fix/reminder-node-access fix/remove-app.php-loading fix/remove-broken-versions-routes fix/remove-needless-console-log fix/remove-redundant-check-server fix/remove-references-to-deprected-storage-interface fix/remove-share-hint-exception-wrapping fix/rename-trashbin fix/reply-message fix/request-reviews fix/requesttoken fix/require-update-if-mtime-is-null fix/reset-phone-number fix/reset-property fix/resiliant-user-removal fix/resolve_public_rate_limit fix/restore-sucess fix/retry-delete-if-locked fix/revive-lowercase-email fix/rich-object-strings/better-exception-messages fix/richobjectstrings/validator-string-key-value-error fix/rtl-regession fix/s3-verify-peer-setting fix/s3-versions fix/s3/empty-sse-c-key fix/s3configtrait/proxy-false fix/sabre-dav-itip-broker fix/sass fix/scrolling-file-list fix/search-cast fix/search-tags-lowercase fix/session-cron fix/session/failed-clear-cookies fix/session/log-ephemeral-session-close fix/session/log-likely-lost-session-conditions fix/session/log-regenerate-id fix/session/log-session-id fix/session/log-session-start-error fix/session/permanent-token-app-password fix/session/session-passphraze-handling fix/session/transactional-remember-me-renewal fix/settings--disable-discover-when-app-store-is-disabled fix/settings-command fix/settings-l10n fix/settings-share-folder fix/settings/admin/ai/textprocessing fix/settings/email-change-restriction fix/settings/ex-apps-search fix/settings/mail-server-settings-form fix/settings/read-only-apps-root fix/settings/userid-dependency-injection fix/setupmanager/home-root-providers-register-mounts fix/share-allow-delete-perms-4-files fix/share-api-create--permissions fix/share-expiry-translation fix/share-label fix/share-notifications fix/share-sidebar-bugs fix/share-status fix/sharing-entry-link fix/sharing-error-catch fix/sharing-exp-date fix/sharing-password-submit-create fix/sharing-restore-on-failure fix/sharing-sidebar-tab-default fix/shipped-app-version fix/show-better-mtime fix/show-deleted-team-shares fix/show-share-recipient-in-mail fix/show-templates-folder-default fix/sidebar-favorites fix/simplify-login-box fix/size-update-appdata fix/stable27 fix/stable28-uploader fix/stable28/webcal-subscription-jobs-middleware fix/stable29-header-title fix/stable29/numerical-userid-file-item-display fix/stable29/webcal-subscription-jobs-middleware fix/stable29_share-api-create--permissions fix/stable30/create-download-attribute-if-missing fix/stable30/rename-trashbin fix/stable30/share-types-references fix/storage-local/get-source-path-spl-file-info fix/storage-settings fix/storage/get-directory-content-return-type fix/storage/get-owner-false fix/storage/method-docs-inheritance fix/strict-types fix/subadmin-user-groups fix/tag-fileid-check fix/tags-events fix/tags-search-case fix/tags/boolean-user-has-tags fix/task-cleanup-delay fix/task-processing-api-controller/dont-use-plus fix/taskprocessing-api-get-file-contents fix/taskprocessing-better-errors fix/taskprocessing-cache fix/taskprocessing-manager/php-notice fix/taskprocessingcontroller-errorhandling fix/tasktypes-translations fix/team-resource-deduplication fix/template-field-title fix/template-name-overflow fix/template-return-type fix/template-vue3-main fix/template/implement-itemplate fix/tests/migrations fix/texttotextchatwithtools-translator-notes fix/themes-layout fix/theming-migration fix/theming/default-theme-selection fix/ticket_9672007/share_mail fix/timedjob-execution-time fix/tp-validation fix/twitter-fediverse fix/two-factor-request-token fix/type-error-filter-mount fix/typo-recommended-apps fix/undefined-application-key fix/undefined-response fix/unified-search-bar fix/unified-search-ctrl-f fix/unified-search-empty-sections fix/unified-search-filter-reset-on-load-more fix/unified-search-size fix/unique-vcategory fix/unnecessary-template-fields-request fix/update-notification fix/update-notification-respect-config fix/update-share-entry-quick-select fix/updateall fix/updatenotification-legacy-toast fix/updatenotification/applist-error-handling fix/upload-file-drop-info fix/use-also-default-text fix/use-invokeprivate-for-test fix/user-login-with-cookie-e2ee fix/user-manager/limit-enabled-users-counting-seen fix/user_status/harden-api fix/users-gid fix/usertrait/backend-initialization fix/validation-defaults fix/version-channel fix/versions/wrong-toast fix/view-in-folder-conditions fix/view-local-close fix/view-only-preview fix/view/catch-mkdir-exception-non-existent-parents fix/wait-for-toast fix/weather_status/search-address-offline-errors fix/webauthn fix/webcal-subscription-jobs-middleware fix/webpack-nonce fix/wrong-image-type fixFilesRemindersJoins fixHardcodedVersionsFolder fixHeaderStyleSettings fixIncParam30 fixKeyExFileExt fixPhp83Deprecation fixWrongTranslation followup/39574/ocm-provider-without-beautiful-urls followup/47329/add-all-types-to-handling followup/48086/fix-more-activity-providers followup/53896/adjust-interface forbid-moving-subfolder-24 fox/noid/extended-auth-on-webdav fullFilePreviews fwdport/48445/master getMountsForFileId-non-sparse guzzleHandler gw-codeowners-public-api handle-missing-share-providers-when-promoting-reshares hasTableTaskprocessingTasks home-folder-readonly icewind-smb-3.7 ignore-write-test-unlink-err info-file-more-encryption-checks info-file-permissions info-storage-command instance-quota introduce-publish-classification-levels isNumericMtime issue-563-calendar-import-a issue_45523_actionmenu_in_multiple_actions_menu_bar joblist-build-error-log jr-quota-exceeded-admin-log jr/enh/updates/options-buttons-web-ui jr/meta/issue-template-bugs-closed-link jtr-auth-pw-max-length-config-sample jtr-chore-log-getEntries-cleanup jtr-chore-mbstring-func-overload jtr-ci-flakey-cypress-note-test jtr-docs-dispatcher-return jtr-feat-occ-default-help-docs-link jtr-feat-setupchecks-limit-type jtr-files-detection-refactor-finfo jtr-fix-403-design jtr-fix-dnspin-port-logging jtr-fix-files-reminders-disabled jtr-httpclient-compression jtr-locale-personal-info jtr-maint-refresh-part-1 jtr-perf-checks-connectivity-https-proto jtr-profile-email-pages jtr-refactor-auth-pubKeyTokPro jtr-refactor-remote-php jtr-remove-always-populate-raw-post-data jtr-settings-memory-limit-details jtr/chore-bug-report-logs jtr/desc-and-help-plus-minor-fixes-files-scan jtr/dns-noisy-dns-get-record jtr/fix-25162 jtr/fix-40666-fallback-copy jtr/fix-45671 jtr/fix-46609-delegation-add-group-overlap jtr/fix-appframework-server-proto jtr/fix-hash-hkdf-valueerror jtr/fix-ipv6-zone-ids-link-local jtr/fix-sharing-update-hints jtr/fix-streamer-zip64 jtr/fix-testSearchGroups jtr/fix-tests/mysql-phpunit-health jtr/fix-updater-cleanup-job-logging jtr/fix-wipe-missing-token-handling jtr/occ-maintenance-mode-desc jtr/preview-thumb-robustness jtr/router-light-refactoring jtr/setup-checks-heading jtr/setup-checks-heading-redo jtr/test-binaryfinder jtr/typo-accessibility-config-sample kerberos-saved-ticket kerberos-saved-ticket-27 ldap-queries leftybournes/fix/app-sorting leftybournes/fix/files_trashbin_dont_restore_full leftybournes/fix/files_trashbin_retention leftybournes/fix/object_storage_large_uploads leftybournes/fix/sftp_scan_infinite_loop leftybournes/fix/syslog location-provider lockThreadsOlderThan120d log-event-recursion logger-app-versions login-less-custom-bundle man/backport/45237/stable27 master master-IB#1156402 memcache-commands merge-token-updates metadata-storage-id mgallien/fix/retry_cache_operations_on_deadlock mixedSetTTL mount-cache-without-fs-access mount-move-checks mountpoint-get-numeric-storage-id-cache mountpoint-mkdir-quota move-from-encryption-no-opt moveOCPClasses moveStrictTyping multi-object-store mysqlNativePassCi nested-jail-root new-julius newfolder-race-improvements nickv-debug-reactions-test nickv/1214 nickv/1452 no-issue-use-correct-exceptions-in-share-class no-shared-direct-download noissue-refactor-share-class normlize-less notfound-debug-mounts notfound-debug-mounts-30 obj-delete-not-found obj-delete-not-found-20 object-store-filename object-store-move-db object-store-move-fixes object-store-orphan object-store-trash-move objectstore-touch-double-cache oc-wnd-migrate oc-wnd-migrate-25 occ-as-root occ-external-dependencies occ-upgrade-reminder occ-upgrade-wording oci-ci-faststart oci-string-length-empty ocs-user-info-quota-optimize optionally-hide-hidden-files-in-public-share-access oracle-share-reminder passedLockValueIsIntOrNull patch-14 patch/52833 patch/61084/disable-clear-cache patch/76955/disable-notification-on-email-change patch/hash-return-null patch/performance-scckit path-available perf/appconfig/caching perf/avatar perf/cache-file-reminders perf/cache-reference-list perf/cache-server-checks-local-cache perf/caldav/bigger-chunks-orphan-repair perf/capa perf/carddav/dont-query-circles perf/check-node-type perf/core/jobs-index perf/cron/delay-timedjob-checking perf/dav-preload-search-tags perf/db/cards-properties-abid-name-value-idx perf/db/jobs-table-indexes perf/excimer perf/files/cache-garbage-collection-background-job perf/files/chunked-upload-default-100-mib perf/files/setup-fs-basic-auth-request perf/filter-propfind perf/force-sending-ifnonematch perf/get_shares_at_once perf/improve-incomplete-scan perf/log-excessive-memory-consumption perf/log-high-memory-requests perf/noid/dont-load-addressbook-on-resolving-cloudid perf/noid/query-performance perf/noid/split-getSharedWith-query-into-more-performance-sets perf/noid/unified-search-init perf/paginate-filter-groups perf/properies-index- perf/realpath-custom-prop perf/reduce_mount_db_load perf/remove-filecache-index perf/share20/get-all-shares-in-folder perf/usermountcache/local-cache pr/51113 prevPropPromarrayClas primary-object-store-settings printOccHumanFriendly printOnlyOnceText profile-request pull_request-trigger pulsejet-patch-share-attr pulsejet/truncate-1 query-req-id-26 rakekniven-patch-1 rakekniven-patch-2 readd-object-store-phpunit rector-phpunit10 rector-tests refactSmallAdjust refactor-occ-preview-generate refactor/48925/sharing-sidebar-redesign refactor/account-management-router refactor/app/remove-register-routes refactor/apps/constructor-property-promotion refactor/apps/declare-strict-types refactor/apps/php55-features refactor/appstore-modernization refactor/background-service refactor/class-string-constant refactor/cleanup-login-logout-hooks refactor/dav/example-contact-service refactor/dirname-to-dir refactor/drop-to-uploader refactor/elvis refactor/files-cleanup refactor/files-deprecated-share-types refactor/files-filelist-width refactor/files-hotkeys refactor/files-required-navigation refactor/files/remove-app-class refactor/migration-override-attribute refactor/move-to-new-activity-exception refactor/ocp-deprecations refactor/preview-tests refactor/provide-file-actions-through-composable refactor/rector-core refactor/rector-top-level refactor/rector/extend-scope refactor/register-routes refactor/remove-app-registerRoutes refactor/self-class-reference refactor/settings/mail-settings-parameters refactor/share-manager-appconfig refactor/storage/constructors refactor/storage/strong-param-types refactor/storage/strong-type-properties refactor/stream-encryption/typings refactor/template-layout refactor/tempmanager refactor/unified-search- refactor/use-in-instead-of-or refactor/void-tests refactor/zip-event release/28.0.11 release/28.0.11_rc1 release/28.0.12 release/28.0.12_rc1 release/28.0.12_rc2 release/28.0.14 release/28.0.14_rc1 release/29.0.0beta2 release/29.0.11 release/29.0.11_rc1 release/29.0.12 release/29.0.12_rc1 release/29.0.12_rc2 release/29.0.13 release/29.0.13_rc1 release/29.0.13_rc2 release/29.0.14 release/29.0.14_rc1 release/29.0.15_rc1 release/29.0.15_rc2 release/29.0.16 release/29.0.16_rc1 release/29.0.8 release/29.0.8_rc1 release/29.0.9 release/29.0.9_rc1 release/29.0.9_rc2 release/30.0.10 release/30.0.10_rc1 release/30.0.11 release/30.0.11_rc1 release/30.0.12 release/30.0.12_rc1 release/30.0.13 release/30.0.13_rc1 release/30.0.1_rc release/30.0.1_rc1 release/30.0.1_rc2 release/30.0.2 release/30.0.2_rc1 release/30.0.2_rc2 release/30.0.4 release/30.0.4_rc1 release/30.0.5 release/30.0.5_rc1 release/30.0.6 release/30.0.6_rc1 release/30.0.6_rc2 release/30.0.7 release/30.0.7_rc1 release/30.0.7_rc2 release/30.0.8 release/30.0.8_rc1 release/30.0.9 release/30.0.9_rc1 release/30.0.9_rc2 release/31.0.0 release/31.0.0_beta_1 release/31.0.0_beta_2 release/31.0.0_beta_4 release/31.0.0_rc2 release/31.0.0_rc3 release/31.0.0_rc4 release/31.0.0_rc5 release/31.0.1 release/31.0.1_rc1 release/31.0.1_rc2 release/31.0.2 release/31.0.2_rc1 release/31.0.3 release/31.0.3_rc1 release/31.0.3_rc2 release/31.0.4 release/31.0.4_rc1 release/31.0.5 release/31.0.5_rc1 release/31.0.6 release/31.0.6_rc1 release/31.0.7 release/31.0.7_rc1 reminder-dont-validiate-node-dav remoteIdToShares remove-filecache-joins remove-locking-config-sample remove-non-accessible-shares remove-redundant-setting remove-scrutinizer remove-unused-method removeNoisyTextEmails removeTrailingComma rename-deleted-default-calendar-in-trashbin rename-hooks-webhook repair-mimetype-expensive-squashed-29 repair-tree-invalid-parent reshare-permission-logic-27 revert-49004 revert-49650-backport/49293/stable30 revert-49825-revert-49650-backport/49293/stable30 revert-51431-enh/noid/disable-bulk-upload revert-52122-backport/51431/stable30 revert-52123-backport/51431/stable31 revert-52503-fix/files_sharing/filter-own-reshared-shares revert-52914 revert-53077-backport/52914/stable31 revert-53078-backport/52914/stable30 revert-53918-revert-53141-perf/files/setup-fs-basic-auth-request revert/41453 revert/52035 revert/52038 revert/52818 revert/email-setting-migration revert/gfm-pin revert/openapi-extractor revert/share-node-accessible revoke-admin-overwrite-8 reworkShareExceptions rfc/global-rate-limit rfc/request-timeout run-test-mime-type-icon-again s3-bucket-create-exception s3-disable-multipart s3-disable-multipart-remove-debug s3-multipart-size-check safety-net-null-check scan-home-ext-storae scan-locked-error scanner-invalid-data-log scckit-backports security-missing-auth-error seekable-http-size-24 settings-datadir-unused setupChecksMoveFromBinary sftp-fopen-write-stat-cache sftp-known-mtime shard-key-hint-partition sharding-code-fixes sharding-existing sharding-select-fixes share-list-cmd share-list-set-owner share-mount-check-no-in share-move-storage-error share-reminder-sharding share-root-meta-cache shared-cache-watcher-update shared-cache-watcher-update-30 shared-target-verify-cache shared-target-verify-cache-fix skjnldbot/nextcloud-upload skjnldsbot/dep-upload-stable29 skjnldsbot/dep-upload-stable30 skjnldsbot/dep-upload-stable31 skjnldsv-patch-1 smb-acl-fail-soft smb-hasupdated-deleted smb-notify-test smb-open-failure-log smb-systembridge solracsf-patch-1 stable-swift-v3 stable10 stable11 stable12 stable13 stable14 stable15 stable16 stable17 stable18 stable19 stable20 stable21 stable22 stable23 stable24 stable25 stable26 stable27 stable28 stable28BackportMissingSetTTL stable29 stable30 stable30-admin-audit-listen-failed-login stable30-fix-renaming-a-received-share-by-a-user-with-stale-shares stable31 stable9 storage-cache-not-exists storage-debug-info storage-id-cache-memcache stream-assembly-stream-size sub-mount-filter-no-storage tag-color-query targetIsNotShared-catch-notfound techdebt/noid/add-parameter-typehints techdebt/noid/more-phpunit-10-preparations techdebt/noid/more-useful-debug-logs techdebt/noid/prepare-phpunit10 techdebt/noid/use-new-attributes-to-declare-since techdebt/standard-15/consumable-ocp test-disable-autoload-apps test-scanner-no-transactions-26 test/autotest-git test/cypress-flaky test/cypress-flakyness test/eol-check test/eol-check-26 test/files-download test/files-sharing-phpunit test/fix-cypress test/fix-files-sharing test/folder-tree test/integration/cleanup-logs test/no-git-ignore test/noid/debug-reactions-test test/noid/improve-test-output test/noid/more-phpunit-10 test/widget-perf test/workflow tests/fix-jest-leftover tests/noid/caldav-tests tests/noid/carddav-tests tests/noid/dav-systemtag tests/noid/debug-systemkeeper tests/noid/federated-file-sharing tests/noid/files_sharing-1 tests/noid/finish-dav tests/noid/ldap tests/noid/migrate-federation-and-files_trashbin tests/noid/migrate-files-external-to-phpunit10 tests/noid/migrate-files_versions tests/noid/migrate-more-apps-to-phpunit10 tests/noid/more-phpunit10-apps tests/noid/speed-up-comments-test tests/template-workflow transfer-external-storage transfer-share-skip-notfound translatable-string trasbin-event-fixes trimBucketDnsName try-non-recursive-source-27 update-phpdoc-for-folder-get update-size-byte update-stale-bot-configuration updateLastSeen updater-change-mimetype-objectstore upgrade/psr-log-to-v2 uploadfolder-rework uploadfolder-rework-autofix upstream/52135/52135-master useHttpFramework useNameNotUrl useOCPClassesTrashbin usermountcache-filecache-joins usermountcache-logging usermountcache-more-debug-logging validateProvidedEmail version-test-new-file wrapper-instanceof-resiliant-squash zip-download-no-sabre-response zorn-v-patch-1