index
:
nextcloud-server.git
27-shared-null-storage-merged
3rdparty/justinrainbow/json-schema
3rdparty/stable28/sabre-dav-itip-broker
3rdparty/stable29/sabre-dav-itip-broker
3rdparty/stable30/sabre-dav-itip-broker
44287-fix-avatar-fed-share-receiver
44319-fix-fed-share-user-avatars
Dennis1993-patch-1
Fix/app-menu-overflow
Fix/mp3_regex
Jerome-Herbinet-better-devices-wipe-action-wording
Jerome-Herbinet-internal-shares-parameter-better-distinction
Jerome-Herbinet-patch-1
Valdnet-patch-1
add-caldav-repair-middleware
add-command-to-cleanup-preview
add-default-request-timeout-const
add-integration-tests-for-moving-a-file-from-and-to-a-shared-folder
add-integration-tests-for-renaming-a-share-by-a-user-with-stale-shares
addAllToGroupBy
addConstrDep
admin-audit-listen-failed-login
admin_audit/enh/move-to-event-listeners
allowMkcolAndPut
appStoreDisabledOcc
artonge/backport/stable27/47770
artonge/backport/stable29/48207
artonge/chore/ldap_wizard_rewrite
artonge/chore/update_nc_cypress_beta.11
artonge/chore/update_nc_pwd_confirmation_v5.3.1
artonge/chore/update_password_confirmation_v5.3.1
artonge/chore/user_retry_trait
artonge/debt/core_main.js
artonge/feat/add_retry_support_to_query_builder
artonge/feat/allow_deleting_metadata
artonge/feat/compare_hashed_password_when_updating_global_cred_in_files_external
artonge/feat/maintenance_warn_encrypt_all
artonge/feat/pwd_confirmation_allow_set_period
artonge/feat/reset_route_when_sidebar_and_viewer_are_close
artonge/feat/skip-trash-header
artonge/feat/validate_keychecksum
artonge/fix/access_list_unaccepted_shares
artonge/fix/color_debounce
artonge/fix/copy_cache_during_copy_operations
artonge/fix/displayname_in_sidebar
artonge/fix/drop_unecessary_exit
artonge/fix/epehmeral_sessions
artonge/fix/extra_files_integrity_check
artonge/fix/file_list_jump_on_viewer_close
artonge/fix/getting_cache_entry
artonge/fix/handle_folders_copy_live_photos
artonge/fix/hash_return_type
artonge/fix/listen_to_group_removal_for_share
artonge/fix/login_flow_v2_sessions
artonge/fix/login_flow_v2_sessions_2
artonge/fix/metadata_field_search
artonge/fix/min_age_rentention_files_versions
artonge/fix/missing_dot
artonge/fix/opening_a_secondly_created_file
artonge/fix/prevent_missing_users_from_crashing_disabled_users_search
artonge/fix/publicpage_attribute
artonge/fix/remove_duplicate_propfind_call
artonge/fix/remove_unnecessary_formating
artonge/fix/restoring_encrypted_version
artonge/fix/sidebar_davpath
artonge/fix/storage_full_warning
artonge/fix/transfer_ownership
artonge/fix/uid_type
artonge/fix/vue_app_names
artonge/local/IONOS/feat/config_unified_search_providers_allowed
artonge/local/IONOS/tl/dev/disable-mailing
artonge/local/georglauterbach/feat/skip_cname
authPropertyPromotion
automated/noid/main-fix-npm-audit
automated/noid/master-fix-npm-audit
automated/noid/master-update-ca-cert-bundle
automated/noid/master-update-code-signing-crl
automated/noid/master-update-psalm-baseline
automated/noid/stable22-update-ca-cert-bundle
automated/noid/stable22-update-code-signing-crl
automated/noid/stable23-update-ca-cert-bundle
automated/noid/stable23-update-code-signing-crl
automated/noid/stable24-update-ca-cert-bundle
automated/noid/stable24-update-code-signing-crl
automated/noid/stable25-update-ca-cert-bundle
automated/noid/stable25-update-code-signing-crl
automated/noid/stable26-update-ca-cert-bundle
automated/noid/stable26-update-code-signing-crl
automated/noid/stable27-fix-npm-audit
automated/noid/stable27-update-ca-cert-bundle
automated/noid/stable27-update-code-signing-crl
automated/noid/stable28-fix-npm-audit
automated/noid/stable28-update-ca-cert-bundle
automated/noid/stable28-update-code-signing-crl
automated/noid/stable28-update-psalm-baseline
automated/noid/stable29-fix-npm-audit
automated/noid/stable29-update-ca-cert-bundle
automated/noid/stable29-update-code-signing-crl
automated/noid/stable29-update-psalm-baseline
automated/noid/stable30-fix-npm-audit
automated/noid/stable30-update-ca-cert-bundle
automated/noid/stable30-update-code-signing-crl
automated/noid/stable30-update-psalm-baseline
automated/noid/stable31-fix-npm-audit
automated/noid/stable31-update-ca-cert-bundle
automated/update-workflows/default
avatar-work-29
avoidStatusSessions
background-job-list-reserved
backport/29-openfile
backport/30/fix_move_on_same_bucket
backport/38630/stable28
backport/38630/stable29
backport/38630/stable30
backport/39607/stable26
backport/40367/stable25
backport/40367/stable26
backport/40394/stable25
backport/40394/stable26
backport/40394/stable27
backport/40394/stable28
backport/40394/stable29
backport/40394/stable30
backport/41327/stable26
backport/42170/stable28
backport/42172/stable26
backport/42548/stable22
backport/42930/stable26
backport/42971/stable25
backport/43025/stable28
backport/43025/stable29
backport/43025/stable30
backport/43252/stable26
backport/43580/stable26
backport/44017/stable26
backport/44130/stable26
backport/44218/stable29
backport/44236/stable28
backport/44295/stable29
backport/44533/stable29
backport/44555/stable27
backport/44745/stable27
backport/44745/stable28
backport/44838/stable27
backport/44912/stable27
backport/44945/stable30
backport/44956/stable28
backport/45026/stable26
backport/45098/stable28
backport/45098/stable29
backport/45364/stable29
backport/45364/stable30
backport/45364/stable31
backport/45765/stable30
backport/45848/stable28
backport/46013/stable26
backport/46013/stable27
backport/46013/stable28
backport/46114/stable30
backport/46124/stable28
backport/46124/stable29
backport/46124/stable30
backport/46140/stable28
backport/46140/stable29
backport/46140/stable30
backport/46218/stable27
backport/46218/stable28
backport/46218/stable29
backport/46218/stable30
backport/46222/stable30
backport/46480/stable28
backport/46480/stable29
backport/46480/stable30
backport/46534/stable27
backport/46691/stable30
backport/46780/stable30
backport/46780/stable31
backport/46931/stable28
backport/47180/stable26
backport/47180/stable28
backport/47265/stable30
backport/47316/stable28
backport/47316/stable29
backport/47316/stable30
backport/47339/stable28
backport/47339/stable29
backport/47339/stable30
backport/47349/stable28
backport/47349/stable29
backport/47349/stable30
backport/47399/stable30
backport/47425/stable28
backport/47425/stable29
backport/47425/stable30
backport/47441/stable29
backport/47510/stable29
backport/47513/stable29
backport/47513/stable30
backport/47513/stable31
backport/47515/stable29
backport/47527/stable30
backport/47628/stable29
backport/47640/stable29
backport/47649/stable28
backport/47649/stable29
backport/47670/stable30
backport/47737/stable30
backport/47745/stable28
backport/47756/stable29
backport/47756/stable30
backport/47801/stable30
backport/47807/stable29
backport/47824/stable30
backport/47832/stable28
backport/47832/stable29
backport/47832/stable30
backport/47834/stable28
backport/47834/stable29
backport/47834/stable30
backport/47846/stable28
backport/47846/stable29
backport/47846/stable30
backport/47847/stable28
backport/47847/stable29
backport/47847/stable30
backport/47848/stable28
backport/47848/stable29
backport/47848/stable30
backport/47852/stable30
backport/47853/stable29
backport/47854/stable28
backport/47854/stable29
backport/47854/stable30
backport/47858/stable28
backport/47858/stable29
backport/47858/stable30
backport/47860/stable28
backport/47860/stable29
backport/47881/stable29
backport/47881/stable30
backport/47883/stable29
backport/47883/stable30
backport/47889/stable30
backport/47889/stable31
backport/47896/stable28
backport/47896/stable29
backport/47896/stable30
backport/47905/stable29
backport/47905/stable30
backport/47910/stable28
backport/47910/stable29
backport/47910/stable30
backport/47914/stable28
backport/47914/stable29
backport/47914/stable30
backport/47920/stable28
backport/47920/stable29
backport/47920/stable30
backport/47924/stable28
backport/47924/stable29
backport/47924/stable30
backport/47928/stable28
backport/47928/stable29
backport/47928/stable30
backport/47933/stable28
backport/47933/stable29
backport/47933/stable30
backport/47954/stable28
backport/47954/stable29
backport/47954/stable30
backport/47971/stable28
backport/47971/stable29
backport/47971/stable30
backport/47986/stable28
backport/47986/stable29
backport/48008/stable28
backport/48008/stable29
backport/48008/stable30
backport/48013/stable28
backport/48013/stable29
backport/48013/stable30
backport/48014/stable28
backport/48014/stable29
backport/48014/stable30
backport/48015/stable28
backport/48015/stable29
backport/48015/stable30
backport/48016/stable29
backport/48016/stable30
backport/48017/stable28
backport/48017/stable29
backport/48017/stable30
backport/48028/stable30
backport/48030/stable28
backport/48030/stable29
backport/48030/stable30
backport/48031/stable29
backport/48031/stable30
backport/48037/stable30
backport/48043/stable28
backport/48043/stable29
backport/48043/stable30
backport/48044/stable29
backport/48044/stable30
backport/48045/stable28
backport/48045/stable29
backport/48045/stable30
backport/48050/stable28
backport/48050/stable29
backport/48050/stable30
backport/48063/stable30
backport/48080/stable28
backport/48080/stable29
backport/48080/stable30
backport/48081/stable28
backport/48081/stable29
backport/48081/stable30
backport/48090/stable29
backport/48090/stable30
backport/48094/stable28
backport/48094/stable29
backport/48094/stable30
backport/48114/stable28
backport/48114/stable29
backport/48114/stable30
backport/48134/stable30
backport/48140/stable30
backport/48142/stable25
backport/48142/stable26
backport/48142/stable27
backport/48142/stable28
backport/48142/stable29
backport/48145/stable28
backport/48145/stable29
backport/48145/stable30
backport/48153/stable30
backport/48160/stable30
backport/48162/stable30
backport/48177/stable28
backport/48177/stable29
backport/48177/stable30
backport/48205/stable28
backport/48205/stable29
backport/48207/stable28
backport/48207/stable29
backport/48207/stable30
backport/48215/stable30
backport/48222/stable30
backport/48224/stable30
backport/48227/stable30
backport/48235/stable29
backport/48235/stable30
backport/48266/stable28
backport/48266/stable29
backport/48266/stable30
backport/48268/stable28
backport/48268/stable29
backport/48268/stable30
backport/48282/stable24
backport/48282/stable25
backport/48282/stable26
backport/48282/stable27
backport/48282/stable28
backport/48282/stable29
backport/48294/master
backport/48297/stable25
backport/48297/stable26
backport/48307/stable28
backport/48307/stable29
backport/48307/stable30
backport/48311/stable29
backport/48311/stable30
backport/48315/stable28
backport/48331/stable28
backport/48331/stable29
backport/48331/stable30
backport/48345/stable28
backport/48345/stable29
backport/48345/stable30
backport/48354/stable28
backport/48354/stable29
backport/48354/stable30
backport/48356/stable30
backport/48359/stable25
backport/48359/stable26
backport/48359/stable27
backport/48359/stable28
backport/48359/stable29
backport/48359/stable30
backport/48361/stable28
backport/48361/stable29
backport/48361/stable30
backport/48366/stable28
backport/48366/stable29
backport/48366/stable30
backport/48373/stable28
backport/48373/stable29
backport/48373/stable30
backport/48375/stable28
backport/48375/stable29
backport/48375/stable30
backport/48381/stable30
backport/48425/stable29
backport/48425/stable30
backport/48426/stable28
backport/48426/stable29
backport/48426/stable30
backport/48437/stable28
backport/48437/stable29
backport/48437/stable30
backport/48439/stable30
backport/48445/stable27
backport/48451/stable29
backport/48451/stable30
backport/48466/stable28
backport/48466/stable29
backport/48466/stable30
backport/48480/stable30
backport/48484/stable29
backport/48484/stable30
backport/48486/stable30
backport/48508/stable30
backport/48510/stable25
backport/48510/stable26
backport/48510/stable27
backport/48512/stable30
backport/48513/stable30
backport/48519/stable29
backport/48519/stable30
backport/48520/stable30
backport/48522/stable30
backport/48532/stable28
backport/48532/stable29
backport/48532/stable30
backport/48538/stable30
backport/48539/stable28
backport/48539/stable29
backport/48540/stable30
backport/48542/stable30
backport/48543/stable30
backport/48548/stable30
backport/48559/stable30
backport/48563/stable30
backport/48572/stable30
backport/48581/stable29
backport/48581/stable30
backport/48581/stable31
backport/48583/stable28
backport/48583/stable29
backport/48583/stable30
backport/48584/stable28
backport/48584/stable29
backport/48584/stable30
backport/48597/stable28
backport/48597/stable29
backport/48597/stable30
backport/48600/stable28
backport/48600/stable29
backport/48600/stable30
backport/48603/stable28
backport/48603/stable29
backport/48603/stable30
backport/48619/stable30
backport/48623/stable28
backport/48623/stable29
backport/48623/stable30
backport/48625/stable29
backport/48625/stable30
backport/48628/stable30
backport/48632/stable29
backport/48632/stable30
backport/48638/stable30
backport/48651/stable29
backport/48651/stable30
backport/48665/stable30
backport/48672/stable31
backport/48673/stable28
backport/48673/stable29
backport/48673/stable30
backport/48675/stable28
backport/48675/stable29
backport/48675/stable30
backport/48682/stable28
backport/48682/stable29
backport/48682/stable30
backport/48684/stable28
backport/48684/stable29
backport/48684/stable30
backport/48689/stable29
backport/48689/stable30
backport/48696/stable28
backport/48696/stable29
backport/48696/stable30
backport/48723/stable30
backport/48728/stable30
backport/48736/stable27
backport/48736/stable28
backport/48736/stable29
backport/48736/stable30
backport/48737/stable30
backport/48743/stable29
backport/48743/stable30
backport/48749/stable27
backport/48760/stable30
backport/48766/stable28
backport/48766/stable29
backport/48766/stable30
backport/48769/stable29
backport/48769/stable30
backport/48787/stable30
backport/48788/stable27
backport/48788/stable28
backport/48788/stable29
backport/48788/stable30
backport/48795/stable31
backport/48799/stable30
backport/48809/stable30
backport/48824/stable29
backport/48833/stable30
backport/48839/stable28
backport/48839/stable29
backport/48839/stable30
backport/48850/stable30
backport/48852/stable30
backport/48853/stable30
backport/48854/stable30
backport/48863/stable30
backport/48871/stable29
backport/48871/stable30
backport/48882/stable30
backport/48887/stable29
backport/48887/stable30
backport/48889/stable28
backport/48898/stable28
backport/48898/stable29
backport/48898/stable30
backport/48912/stable30
backport/48915/stable28
backport/48915/stable29
backport/48915/stable30
backport/48917/stable25
backport/48917/stable26
backport/48917/stable27
backport/48917/stable28
backport/48917/stable29
backport/48917/stable30
backport/48918/stable28
backport/48918/stable29
backport/48918/stable30
backport/48921/stable25
backport/48921/stable26
backport/48921/stable27
backport/48921/stable28
backport/48921/stable29
backport/48921/stable30
backport/48933/stable28
backport/48933/stable29
backport/48933/stable30
backport/48934/stable28
backport/48947/stable28
backport/48947/stable29
backport/48947/stable30
backport/48991/stable29
backport/48991/stable30
backport/48992/stable27
backport/48992/stable28
backport/48992/stable29
backport/48992/stable30
backport/49004/stable28
backport/49004/stable29
backport/49004/stable30
backport/49009/49009-stable29
backport/49009/stable25
backport/49009/stable26
backport/49009/stable27
backport/49009/stable28
backport/49009/stable30
backport/49017/stable28
backport/49017/stable29
backport/49017/stable30
backport/49023/stable28
backport/49023/stable29
backport/49023/stable30
backport/49039/stable30
backport/49053/stable28
backport/49053/stable29
backport/49053/stable30
backport/49057/master
backport/49065/stable28
backport/49065/stable29
backport/49065/stable30
backport/49075/stable30
backport/49076/stable28
backport/49076/stable29
backport/49112/stable28
backport/49112/stable29
backport/49112/stable30
backport/49115/stable28
backport/49115/stable30
backport/49130/stable29
backport/49130/stable30
backport/49134/stable30
backport/49139/stable28
backport/49139/stable29
backport/49139/stable30
backport/49141/stable30
backport/49143/stable28
backport/49143/stable29
backport/49143/stable30
backport/49146/stable28
backport/49146/stable29
backport/49146/stable30
backport/49147/stable30
backport/49149/stable29
backport/49150/stable28
backport/49150/stable29
backport/49150/stable30
backport/49153/stable28
backport/49153/stable29
backport/49176/stable30
backport/49196/stable28
backport/49196/stable29
backport/49196/stable30
backport/49199/stable28
backport/49199/stable29
backport/49199/stable30
backport/49203/stable29
backport/49203/stable30
backport/49208/stable29
backport/49208/stable30
backport/49209/stable30
backport/49218/stable28
backport/49218/stable29
backport/49218/stable30
backport/49219/stable30
backport/49225/stable28
backport/49225/stable29
backport/49225/stable30
backport/49226/stable30
backport/49232/stable28
backport/49232/stable29
backport/49232/stable30
backport/49237/stable30
backport/49259/stable30
backport/49260/stable30
backport/49261/stable30
backport/49262/stable28
backport/49262/stable29
backport/49271/stable29
backport/49271/stable30
backport/49281/stable30
backport/49288/stable29
backport/49288/stable30
backport/49293/stable30
backport/49308/stable29
backport/49308/stable30
backport/49311/stable28
backport/49311/stable29
backport/49311/stable30
backport/49315/stable28
backport/49315/stable29
backport/49315/stable30
backport/49332/stable28
backport/49332/stable29
backport/49332/stable30
backport/49346/stable30
backport/49351/stable29
backport/49351/stable30
backport/49357/stable30
backport/49361/stable28
backport/49361/stable29
backport/49361/stable30
backport/49372/stable28
backport/49372/stable29
backport/49372/stable30
backport/49373/stable29
backport/49380/stable30
backport/49384/master
backport/49398/stable29
backport/49398/stable30
backport/49432/master
backport/49432/stable30
backport/49434/stable30
backport/49440/stable29
backport/49440/stable30
backport/49440/stable31
backport/49442/stable28
backport/49442/stable29
backport/49442/stable30
backport/49451/stable29
backport/49451/stable30
backport/49454/stable28
backport/49454/stable29
backport/49454/stable30
backport/49459/stable30
backport/49464/stable28
backport/49464/stable29
backport/49464/stable30
backport/49476/stable28
backport/49476/stable29
backport/49476/stable30
backport/49477/stable30
backport/49489/stable30
backport/49493/stable28
backport/49493/stable29
backport/49494/stable29
backport/49494/stable29-squashed
backport/49494/stable30
backport/49503/stable28
backport/49503/stable29
backport/49503/stable30
backport/49528/stable28
backport/49528/stable29
backport/49528/stable30
backport/49551/stable29
backport/49551/stable30
backport/49552/stable28
backport/49552/stable29
backport/49552/stable30
backport/49552/stable31
backport/49557/stable30
backport/49569/stable29
backport/49569/stable30
backport/49581/stable28
backport/49581/stable30
backport/49587/stable30
backport/49588/stable29
backport/49588/stable30
backport/49602/stable28
backport/49602/stable29
backport/49602/stable30
backport/49629/stable29
backport/49631/stable29
backport/49639/stable28
backport/49639/stable29
backport/49639/stable30
backport/49639/stable31
backport/49645/stable31
backport/49677/stable30
backport/49681/stable29
backport/49681/stable30
backport/49685/stable28
backport/49685/stable29
backport/49685/stable30
backport/49693/stable29
backport/49693/stable30
backport/49694/stable30
backport/49746/stable30
backport/49747/stable27
backport/49747/stable28
backport/49747/stable29
backport/49747/stable30
backport/49799/stable28
backport/49799/stable29
backport/49799/stable30
backport/49801/stable30
backport/49803/stable29
backport/49803/stable30
backport/49815/stable28
backport/49815/stable29
backport/49820/stable30
backport/49822/stable28
backport/49822/stable29
backport/49832/stable30
backport/49839/stable29
backport/49839/stable30
backport/49843/stable29
backport/49843/stable30
backport/49847/stable30
backport/49852/stable30
backport/49880/stable28
backport/49880/stable30
backport/49882/stable28
backport/49882/stable29
backport/49885/stable30
backport/49887/stable29
backport/49887/stable30
backport/49898/stable30
backport/49900/stable29
backport/49917/stable30
backport/49927/stable28
backport/49962/stable29
backport/49962/stable30
backport/49966/stable29
backport/49966/stable30
backport/49973/master
backport/49974/stable29
backport/49974/stable30
backport/49988/stable29
backport/49988/stable30
backport/50017/stable29
backport/50017/stable30
backport/50025/stable29
backport/50025/stable30
backport/50026/stable29
backport/50026/stable30
backport/50034/stable29
backport/50034/stable30
backport/50035/stable28
backport/50035/stable29
backport/50035/stable30
backport/50046/stable29
backport/50046/stable30
backport/50053/stable29
backport/50053/stable30
backport/50053/stable31
backport/50070/stable29
backport/50070/stable30
backport/50076/stable29
backport/50076/stable30
backport/50077/stable29
backport/50077/stable30
backport/50081/stable31
backport/50083/stable30
backport/50111/stable29
backport/50111/stable30
backport/50113/stable29
backport/50113/stable30
backport/50123/master
backport/50123/stable29
backport/50123/stable30
backport/50128/stable29
backport/50128/stable30
backport/50129/stable30
backport/50129/stable31
backport/50152/stable29
backport/50152/stable30
backport/50154/stable29
backport/50161/stable29
backport/50161/stable30
backport/50177/stable29
generated by cgit v1.2.3 (git 2.39.1) at 2025-03-05 12:31:43 +0000 an class="o">&hiter, &h, &v)) { rspamd_ftok_t *hn = h, *hv = v; rspamd_http_message_add_header (msg, hn->begin, hv->begin); } if (task->cfg->log_urls || (task->flags & RSPAMD_TASK_FLAG_EXT_URLS)) { flags |= RSPAMD_PROTOCOL_URLS; } top = rspamd_protocol_write_ucl (task, flags); if (pobj) { *pobj = top; } if (!(task->flags & RSPAMD_TASK_FLAG_NO_LOG)) { rspamd_roll_history_update (task->worker->srv->history, task); } rspamd_task_write_log (task); if (task->cfg->log_re_cache) { restat = rspamd_re_cache_get_stat (task->re_rt); g_assert (restat != NULL); msg_info_task ( "regexp statistics: %ud pcre regexps scanned, %ud regexps matched," " %ud regexps total, %ud regexps cached," " %HL bytes scanned using pcre, %HL bytes scanned total", restat->regexp_checked, restat->regexp_matched, restat->regexp_total, restat->regexp_fast_cached, restat->bytes_scanned_pcre, restat->bytes_scanned); } reply = rspamd_fstring_sized_new (1000); if (msg->method < HTTP_SYMBOLS && !RSPAMD_TASK_IS_SPAMC (task)) { rspamd_ucl_emit_fstring (top, UCL_EMIT_JSON_COMPACT, &reply); } else { if (RSPAMD_TASK_IS_SPAMC (task)) { rspamd_ucl_tospamc_output (top, &reply); } else { rspamd_ucl_torspamc_output (top, &reply); } } if ((task->flags & RSPAMD_TASK_FLAG_COMPRESSED) && rspamd_libs_reset_compression (task->cfg->libs_ctx)) { /* We can compress output */ ZSTD_inBuffer zin; ZSTD_outBuffer zout; ZSTD_CStream *zstream; rspamd_fstring_t *compressed_reply; gsize r; zstream = task->cfg->libs_ctx->out_zstream; compressed_reply = rspamd_fstring_sized_new (ZSTD_compressBound (reply->len)); zin.pos = 0; zin.src = reply->str; zin.size = reply->len; zout.pos = 0; zout.dst = compressed_reply->str; zout.size = compressed_reply->allocated; while (zin.pos < zin.size) { r = ZSTD_compressStream (zstream, &zout, &zin); if (ZSTD_isError (r)) { msg_err_task ("cannot compress: %s", ZSTD_getErrorName (r)); rspamd_fstring_free (compressed_reply); rspamd_http_message_set_body_from_fstring_steal (msg, reply); goto end; } } r = ZSTD_endStream (zstream, &zout); if (ZSTD_isError (r)) { msg_err_task ("cannot finalize compress: %s", ZSTD_getErrorName (r)); rspamd_fstring_free (compressed_reply); rspamd_http_message_set_body_from_fstring_steal (msg, reply); goto end; } msg_info_task ("writing compressed results: %z bytes before " "%z bytes after", zin.pos, zout.pos); compressed_reply->len = zout.pos; rspamd_fstring_free (reply); rspamd_http_message_set_body_from_fstring_steal (msg, compressed_reply); rspamd_http_message_add_header (msg, "Compression", "zstd"); if (task->cfg->libs_ctx->out_dict && task->cfg->libs_ctx->out_dict->id != 0) { gchar dict_str[32]; rspamd_snprintf (dict_str, sizeof (dict_str), "%ud", task->cfg->libs_ctx->out_dict->id); rspamd_http_message_add_header (msg, "Dictionary", dict_str); } } else { rspamd_http_message_set_body_from_fstring_steal (msg, reply); } end: if (!(task->flags & RSPAMD_TASK_FLAG_NO_STAT)) { /* Update stat for default metric */ metric_res = task->result; if (metric_res != NULL) { if (metric_res->action != METRIC_ACTION_MAX) { action = metric_res->action; } else { action = rspamd_check_action_metric (task, metric_res); } if (action == METRIC_ACTION_SOFT_REJECT && (task->flags & RSPAMD_TASK_FLAG_GREYLISTED)) { /* Set stat action to greylist to display greylisted messages */ action = METRIC_ACTION_GREYLIST; } if (action < METRIC_ACTION_MAX) { #ifndef HAVE_ATOMIC_BUILTINS task->worker->srv->stat->actions_stat[action]++; #else __atomic_add_fetch (&task->worker->srv->stat->actions_stat[action], 1, __ATOMIC_RELEASE); #endif } } /* Increase counters */ #ifndef HAVE_ATOMIC_BUILTINS task->worker->srv->stat->messages_scanned++; #else __atomic_add_fetch (&task->worker->srv->stat->messages_scanned, 1, __ATOMIC_RELEASE); #endif } } void rspamd_protocol_write_log_pipe (struct rspamd_task *task) { struct rspamd_worker_log_pipe *lp; struct rspamd_protocol_log_message_sum *ls; lua_State *L = task->cfg->lua_state; struct rspamd_metric_result *mres; GHashTableIter it; gpointer k, v; struct rspamd_symbol_result *sym; gint id, i; guint32 *sid, n = 0, nextra = 0; gsize sz; GArray *extra; struct rspamd_protocol_log_symbol_result er; struct rspamd_task **ptask; /* Get extra results from lua plugins */ extra = g_array_new (FALSE, FALSE, sizeof (er)); lua_getglobal (L, "rspamd_plugins"); if (lua_istable (L, -1)) { lua_pushnil (L); while (lua_next (L, -2)) { if (lua_istable (L, -1)) { lua_pushvalue (L, -2); /* stack: * -1: copy of key * -2: value (module table) * -3: key (module name) * -4: global */ lua_pushstring (L, "log_callback"); lua_gettable (L, -3); /* stack: * -1: func * -2: copy of key * -3: value (module table) * -3: key (module name) * -4: global */ if (lua_isfunction (L, -1)) { ptask = lua_newuserdata (L, sizeof (*ptask)); *ptask = task; rspamd_lua_setclass (L, "rspamd{task}", -1); /* stack: * -1: task * -2: func * -3: key copy * -4: value (module table) * -5: key (module name) * -6: global */ msg_debug_task ("calling for %s", lua_tostring (L, -3)); if (lua_pcall (L, 1, 1, 0) != 0) { msg_info_task ("call to log callback %s failed: %s", lua_tostring (L, -2), lua_tostring (L, -1)); lua_pop (L, 1); /* stack: * -1: key copy * -2: value * -3: key */ } else { /* stack: * -1: result * -2: key copy * -3: value * -4: key */ if (lua_istable (L, -1)) { /* Another iteration */ lua_pushnil (L); while (lua_next (L, -2)) { /* stack: * -1: value * -2: key * -3: result table (pcall) * -4: key copy (parent) * -5: value (parent) * -6: key (parent) */ if (lua_istable (L, -1)) { er.id = 0; er.score = 0.0; lua_rawgeti (L, -1, 1); if (lua_isnumber (L, -1)) { er.id = lua_tonumber (L, -1); } lua_rawgeti (L, -2, 2); if (lua_isnumber (L, -1)) { er.score = lua_tonumber (L, -1); } /* stack: * -1: value[2] * -2: value[1] * -3: values * -4: key * -5: result table (pcall) * -6: key copy (parent) * -7: value (parent) * -8: key (parent) */ lua_pop (L, 2); /* Values */ g_array_append_val (extra, er); } lua_pop (L, 1); /* Value for lua_next */ } lua_pop (L, 1); /* Table result of pcall */ } else { msg_info_task ("call to log callback %s returned " "wrong type: %s", lua_tostring (L, -2), lua_typename (L, lua_type (L, -1))); lua_pop (L, 1); /* Returned error */ } } } else { lua_pop (L, 1); /* stack: * -1: key copy * -2: value * -3: key */ } } lua_pop (L, 2); /* Top table + key copy */ } lua_pop (L, 1); /* rspamd_plugins global */ } else { lua_pop (L, 1); } nextra = extra->len; LL_FOREACH (task->cfg->log_pipes, lp) { if (lp->fd != -1) { switch (lp->type) { case RSPAMD_LOG_PIPE_SYMBOLS: mres = task->result; if (mres) { n = g_hash_table_size (mres->symbols); sz = sizeof (*ls) + sizeof (struct rspamd_protocol_log_symbol_result) * (n + nextra); ls = g_slice_alloc (sz); /* Handle settings id */ sid = rspamd_mempool_get_variable (task->task_pool, "settings_hash"); if (sid) { ls->settings_id = *sid; } else { ls->settings_id = 0; } ls->score = mres->score; ls->required_score = rspamd_task_get_required_score (task, mres); ls->nresults = n; ls->nextra = nextra; g_hash_table_iter_init (&it, mres->symbols); i = 0; while (g_hash_table_iter_next (&it, &k, &v)) { id = rspamd_symbols_cache_find_symbol (task->cfg->cache, k); sym = v; if (id >= 0) { ls->results[i].id = id; ls->results[i].score = sym->score; } else { ls->results[i].id = -1; ls->results[i].score = 0.0; } i ++; } memcpy (&ls->results[n], extra->data, nextra * sizeof (er)); } else { sz = sizeof (*ls); ls = g_slice_alloc0 (sz); ls->nresults = 0; } /* We don't really care about return value here */ if (write (lp->fd, ls, sz) == -1) { msg_info_task ("cannot write to log pipe: %s", strerror (errno)); } g_slice_free1 (sz, ls); break; default: msg_err_task ("unknown log format %d", lp->type); break; } } } g_array_free (extra, TRUE); } void rspamd_protocol_write_reply (struct rspamd_task *task) { struct rspamd_http_message *msg; const gchar *ctype = "application/json"; rspamd_fstring_t *reply; msg = rspamd_http_new_message (HTTP_RESPONSE); if (rspamd_http_connection_is_encrypted (task->http_conn)) { msg_info_task ("<%s> writing encrypted reply", task->message_id); } if (!RSPAMD_TASK_IS_JSON (task)) { /* Turn compatibility on */ msg->method = HTTP_SYMBOLS; } if (RSPAMD_TASK_IS_SPAMC (task)) { msg->flags |= RSPAMD_HTTP_FLAG_SPAMC; } msg->date = time (NULL); debug_task ("writing reply to client"); if (task->err != NULL) { ucl_object_t *top = NULL; top = ucl_object_typed_new (UCL_OBJECT); msg->code = 500 + task->err->code % 100; msg->status = rspamd_fstring_new_init (task->err->message, strlen (task->err->message)); ucl_object_insert_key (top, ucl_object_fromstring (task->err->message), "error", 0, false); ucl_object_insert_key (top, ucl_object_fromstring (g_quark_to_string (task->err->domain)), "error_domain", 0, false); reply = rspamd_fstring_sized_new (256); rspamd_ucl_emit_fstring (top, UCL_EMIT_JSON_COMPACT, &reply); ucl_object_unref (top); rspamd_http_message_set_body_from_fstring_steal (msg, reply); } else { msg->status = rspamd_fstring_new_init ("OK", 2); switch (task->cmd) { case CMD_REPORT_IFSPAM: case CMD_REPORT: case CMD_CHECK: case CMD_SYMBOLS: case CMD_PROCESS: case CMD_SKIP: case CMD_CHECK_V2: rspamd_protocol_http_reply (msg, task, NULL); rspamd_protocol_write_log_pipe (task); break; case CMD_PING: rspamd_http_message_set_body (msg, "pong" CRLF, 6); ctype = "text/plain"; break; case CMD_OTHER: msg_err_task ("BROKEN"); break; } } rspamd_http_connection_reset (task->http_conn); rspamd_http_connection_write_message (task->http_conn, msg, NULL, ctype, task, task->sock, &task->tv, task->ev_base); task->processed_stages |= RSPAMD_TASK_STAGE_REPLIED; }