gancio/server/helpers.js
lesion 08e4fe856c
Squashed commit of the following:
commit f31e7ae2c1
Author: joenepraat <joenepraat@posteo.org>
Date:   Thu Mar 30 13:17:01 2023 +0000

    Translated using Weblate (Dutch)

    Currently translated at 94.5% (297 of 314 strings)

    Translation: Gancio/Web
    Translate-URL: https://hosted.weblate.org/projects/gancio/web/nl/

commit 96486b5945
Author: lesion <lesion@autistici.org>
Date:   Thu Mar 30 11:18:39 2023 +0200

    minor

commit 9524fd52f3
Author: lesion <lesion@autistici.org>
Date:   Thu Mar 30 00:08:27 2023 +0200

    update changelog, releasing v1.6.8

commit df4ec69128
Author: lesion <lesion@autistici.org>
Date:   Wed Mar 29 12:41:52 2023 +0200

    force vuetify to not use google fonts

commit e35595df82
Author: lesion <lesion@autistici.org>
Date:   Tue Mar 28 21:54:06 2023 +0200

    layout

commit ee8a9843b3
Author: lesion <lesion@autistici.org>
Date:   Tue Mar 28 21:48:26 2023 +0200

    minor

commit 2608761a44
Author: lesion <lesion@autistici.org>
Date:   Tue Mar 28 19:04:49 2023 +0200

    update deps

commit d7c8de7580
Author: lesion <lesion@autistici.org>
Date:   Tue Mar 28 19:04:41 2023 +0200

    minor

commit 6b55ba1708
Author: lesion <lesion@autistici.org>
Date:   Tue Mar 28 19:04:16 2023 +0200

    use new luxon in rss template, fixing locale and timezone #254

commit fc52107bd9
Author: lesion <lesion@autistici.org>
Date:   Tue Mar 28 19:02:08 2023 +0200

    use luxon instead of dayjs server side too

commit f5604a03bc
Author: lesion <lesion@autistici.org>
Date:   Tue Mar 28 18:55:57 2023 +0200

    unit test for recurrent events

commit 3e81d1dfb3
Merge: f960400 e750fc8
Author: lesion <lesion@autistici.org>
Date:   Tue Mar 28 18:51:34 2023 +0200

    Merge remote-tracking branch 'weblate/master'

commit f960400085
Author: lesion <lesion@autistici.org>
Date:   Mon Mar 27 17:19:27 2023 +0200

    improve index/tag/place layout

commit 0682feaaf8
Author: lesion <lesion@autistici.org>
Date:   Mon Mar 27 17:18:57 2023 +0200

    minor with theme admin colors

commit e750fc8e81
Author: josé m <correoxm@disroot.org>
Date:   Sun Mar 26 07:48:06 2023 +0000

    Translated using Weblate (Galician)

    Currently translated at 100.0% (314 of 314 strings)

    Translation: Gancio/Web
    Translate-URL: https://hosted.weblate.org/projects/gancio/web/gl/

commit 4c74fd3227
Author: gallegonovato <fran-carro@hotmail.es>
Date:   Sat Mar 25 11:23:48 2023 +0000

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (314 of 314 strings)

    Translation: Gancio/Web
    Translate-URL: https://hosted.weblate.org/projects/gancio/web/es/

commit 428a94290f
Author: joenepraat <joenepraat@posteo.org>
Date:   Thu Mar 23 15:15:58 2023 +0000

    Translated using Weblate (Dutch)

    Currently translated at 95.5% (299 of 313 strings)

    Translation: Gancio/Web
    Translate-URL: https://hosted.weblate.org/projects/gancio/web/nl/

commit 373f78cd4e
Author: joenepraat <joenepraat@posteo.org>
Date:   Thu Mar 23 17:47:21 2023 +0000

    Translated using Weblate (Dutch)

    Currently translated at 7.6% (1 of 13 strings)

    Translation: Gancio/Email
    Translate-URL: https://hosted.weblate.org/projects/gancio/email/nl/

commit 2d11d88e8f
Merge: ea3066c e2fd5f8
Author: lesion <lesion@autistici.org>
Date:   Sat Mar 25 09:34:44 2023 +0100

    Merge remote-tracking branch 'weblate/master'

commit e2fd5f8b93
Author: joenepraat <joenepraat@posteo.org>
Date:   Thu Mar 23 15:15:58 2023 +0000

    Translated using Weblate (Dutch)

    Currently translated at 95.5% (299 of 313 strings)

    Translation: Gancio/Web
    Translate-URL: https://hosted.weblate.org/projects/gancio/web/nl/

commit 8280eb7c7a
Author: joenepraat <joenepraat@posteo.org>
Date:   Thu Mar 23 17:47:21 2023 +0000

    Translated using Weblate (Dutch)

    Currently translated at 7.6% (1 of 13 strings)

    Translation: Gancio/Email
    Translate-URL: https://hosted.weblate.org/projects/gancio/email/nl/

commit ea3066c34e
Author: lesion <lesion@autistici.org>
Date:   Fri Mar 24 16:03:08 2023 +0100

    people could choose custom colors

commit 8149ea23da
Author: lesion <lesion@autistici.org>
Date:   Wed Mar 22 15:39:02 2023 +0100

    moving vuetify configuration to "middleware"

commit 7e6130155a
Author: lesion <lesion@autistici.org>
Date:   Fri Mar 10 21:58:02 2023 +0100

    start with custom color

commit e2b07a06bd
Author: lesion <lesion@autistici.org>
Date:   Thu Mar 23 13:11:15 2023 +0100

    release WPGancio 1.7

commit b91774ac39
Author: lesion <lesion@autistici.org>
Date:   Thu Mar 23 13:09:10 2023 +0100

    fix tags merge in wp plugin and end_datetime

commit c8493d0810
Author: lesion <lesion@autistici.org>
Date:   Wed Mar 22 18:45:48 2023 +0100

    use new $time plugin instead of filters, fix #252

commit 780938ef91
Author: lesion <lesion@autistici.org>
Date:   Wed Mar 22 16:51:02 2023 +0100

    v1.6.7

commit 442f88f322
Author: lesion <lesion@autistici.org>
Date:   Wed Mar 22 16:49:37 2023 +0100

    minor

commit 9f90df2bfc
Author: lesion <lesion@autistici.org>
Date:   Wed Mar 22 16:24:08 2023 +0100

    v.1.6.6

commit 71fdeb6ff8
Author: lesion <lesion@autistici.org>
Date:   Wed Mar 22 16:17:02 2023 +0100

    some old event was flagged has multidate but without an end_datetime?

    fix #245

commit e6977368c5
Author: lesion <lesion@autistici.org>
Date:   Wed Mar 22 13:41:50 2023 +0100

    revert Intl, node is not ready, fix #250

commit eb2bf32162
Author: lesion <lesion@autistici.org>
Date:   Tue Mar 21 16:47:47 2023 +0100

    release v1.6.5

commit 0ebb467630
Author: lesion <lesion@autistici.org>
Date:   Tue Mar 21 01:15:35 2023 +0100

    minor

commit 934466b2ec
Author: lesion <lesion@autistici.org>
Date:   Mon Mar 20 21:09:58 2023 +0100

    add modules in package

commit ec62ad9ba8
Author: lesion <lesion@autistici.org>
Date:   Mon Mar 20 21:09:43 2023 +0100

    v-lazy in collection page too

commit d9f093fdbb
Author: lesion <lesion@autistici.org>
Date:   Mon Mar 20 12:55:17 2023 +0100

    releasing v1.6.5

commit 2ffd2aff82
Author: lesion <lesion@autistici.org>
Date:   Mon Mar 20 12:53:41 2023 +0100

    enable task manager in dev mode

commit 02f138e0f2
Author: lesion <lesion@autistici.org>
Date:   Mon Mar 20 12:40:39 2023 +0100

    update CHANGELOG

commit b8e096ee39
Author: lesion <lesion@autistici.org>
Date:   Mon Mar 20 12:40:19 2023 +0100

    minor with 2w recurrent event frequency

commit 8f221fb69c
Author: lesion <lesion@autistici.org>
Date:   Sun Mar 19 23:33:55 2023 +0100

    minor

commit 079bcd4af2
Merge: 99d78e2 ae990fc
Author: lesion <lesion@autistici.org>
Date:   Sun Mar 19 23:28:44 2023 +0100

    Merge remote-tracking branch 'sedum/feat/ssr-proxy'

commit 99d78e2492
Author: lesion <lesion@autistici.org>
Date:   Sun Mar 19 23:26:57 2023 +0100

    Squashed commit of the following:

    commit 5c0d380740c24e0467cef916fd0560cb26409f9f
    Author: lesion <lesion@autistici.org>
    Date:   Sun Mar 19 23:22:25 2023 +0100

        update yarn.lock

    commit 909ee71ecb8f27e4fba72430aecc92bf527e6cd4
    Author: lesion <lesion@autistici.org>
    Date:   Sun Mar 19 23:22:09 2023 +0100

        Squashed commit of the following:

        commit fc8a9f4506
        Author: lesion <lesion@autistici.org>
        Date:   Tue Mar 14 16:42:24 2023 +0100

            address some issues with recurrent events, fix #247

        commit f7357666ca
        Author: lesion <lesion@autistici.org>
        Date:   Tue Mar 14 16:16:52 2023 +0100

            fix event import from URL

        commit e1bca6f46a
        Author: lesion <lesion@autistici.org>
        Date:   Tue Mar 14 16:15:42 2023 +0100

             add Duch (nl) locale (thanks @jeoenepraat)

        commit 5f8afdbc12
        Merge: 57a052a 92ca5ab
        Author: lesion <lesion@autistici.org>
        Date:   Tue Mar 14 11:39:50 2023 +0100

            Merge remote-tracking branch 'weblate/master'

        commit 57a052a7fa
        Merge: 63d1d2e 55137d2
        Author: lesion <lesion@autistici.org>
        Date:   Tue Mar 14 11:39:33 2023 +0100

            Merge commit '55137d2ac23549e633f36ad10139fd4168c2645f'

        commit 92ca5abf5e
        Author: joenepraat <joenepraat@posteo.org>
        Date:   Fri Mar 10 23:16:32 2023 +0000

            Translated using Weblate (Dutch)

            Currently translated at 68.3% (214 of 313 strings)

            Translation: Gancio/Web
            Translate-URL: https://hosted.weblate.org/projects/gancio/web/nl/

        commit 63d1d2ee53
        Author: lesion <lesion@autistici.org>
        Date:   Thu Mar 9 21:41:06 2023 +0100

            minor

        commit d2759a55a5
        Author: lesion <lesion@autistici.org>
        Date:   Thu Mar 9 21:38:39 2023 +0100

            wrong user / admin merge dark theme settings - fix #244

        commit b401d829db
        Author: lesion <lesion@autistici.org>
        Date:   Thu Mar 9 21:24:45 2023 +0100

            remove a small warning

        commit ccffe5f7b0
        Author: lesion <lesion@autistici.org>
        Date:   Fri Feb 24 11:40:36 2023 +0100

            push tags on release

        commit 55137d2ac2
        Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
        Date:   Thu Feb 23 23:56:16 2023 +0000

            Bump sequelize from 6.28.0 to 6.29.0

            Bumps [sequelize](https://github.com/sequelize/sequelize) from 6.28.0 to 6.29.0.
            - [Release notes](https://github.com/sequelize/sequelize/releases)
            - [Commits](https://github.com/sequelize/sequelize/compare/v6.28.0...v6.29.0)

            ---
            updated-dependencies:
            - dependency-name: sequelize
              dependency-type: direct:production
            ...

            Signed-off-by: dependabot[bot] <support@github.com>

        commit b654f29d8b
        Author: lesion <lesion@autistici.org>
        Date:   Wed Feb 22 13:21:17 2023 +0100

            update changelog

        commit 0cd1ee9d89
        Author: lesion <lesion@autistici.org>
        Date:   Wed Feb 22 13:17:29 2023 +0100

            increase rate limit max requests per minutes

        commit b6dafc082e
        Author: lesion <lesion@autistici.org>
        Date:   Wed Feb 22 08:45:39 2023 +0100

            minor

        commit 0fa7769844
        Author: lesion <lesion@autistici.org>
        Date:   Wed Feb 22 08:45:18 2023 +0100

            location saving is not working when geocoding is disabled, fix #238

        commit 07f9e2d9ee
        Author: lesion <lesion@autistici.org>
        Date:   Wed Feb 22 08:33:40 2023 +0100

            really fix #232

        commit bae930799e
        Author: lesion <lesion@autistici.org>
        Date:   Wed Feb 22 08:33:09 2023 +0100

            downgrade mariadb (sequelize is not ready)

        commit d733d7fef1
        Author: lesion <lesion@autistici.org>
        Date:   Wed Feb 22 00:16:28 2023 +0100

            aargh

        commit 98b22aad70
        Author: lesion <lesion@autistici.org>
        Date:   Tue Feb 21 00:56:06 2023 +0100

            minor

        commit fc098b603d
        Author: lesion <lesion@autistici.org>
        Date:   Tue Feb 21 00:55:44 2023 +0100

            missing i18n in setup, fix #239

        commit 3eaf72af19
        Merge: bba196b d6c6034
        Author: lesion <lesion@autistici.org>
        Date:   Mon Feb 20 21:17:37 2023 +0100

            Merge remote-tracking branch 'weblate/master'

        commit bba196b068
        Author: lesion <lesion@autistici.org>
        Date:   Sat Feb 18 00:05:52 2023 +0100

            update changelog, v1.6.3

        commit bb9f7cca47
        Author: lesion <lesion@autistici.org>
        Date:   Sat Feb 18 00:04:28 2023 +0100

            minor

        commit 80d2dbd06b
        Author: lesion <lesion@autistici.org>
        Date:   Fri Feb 17 23:40:28 2023 +0100

            minor

        commit d6c6034630
        Author: fadelkon <fadelkon@posteo.net>
        Date:   Thu Feb 16 22:09:23 2023 +0000

            Translated using Weblate (Catalan)

            Currently translated at 100.0% (313 of 313 strings)

            Translation: Gancio/Web
            Translate-URL: https://hosted.weblate.org/projects/gancio/web/ca/

        commit d125cf1506
        Author: lesion <lesion@autistici.org>
        Date:   Fri Feb 17 21:56:31 2023 +0100

            set a default user_locale path

        commit 4367960a62
        Merge: c8cc5c6 87dd179
        Author: lesion <lesion@autistici.org>
        Date:   Tue Feb 7 17:46:58 2023 +0100

            Merge branch 'master' into gh

        commit c8cc5c6c97
        Merge: 88e0c90 550e221
        Author: lesion <lesion@autistici.org>
        Date:   Mon Jan 9 17:15:21 2023 +0100

            Merge branch 'master' into gh

        commit 88e0c90a66
        Merge: 421aa12 f212ac1
        Author: lesion <lesion@autistici.org>
        Date:   Thu Dec 15 09:54:41 2022 +0100

            Merge branch 'master' into gh

        commit 421aa12781
        Merge: 5f6cc46 b3488e7
        Author: lesion <lesion@autistici.org>
        Date:   Wed Sep 28 12:26:08 2022 +0200

            Merge branch 'master' into gh

        commit 5f6cc46cdc
        Merge: b66feb9 171d968
        Author: lesion <lesion@autistici.org>
        Date:   Mon Aug 8 00:08:12 2022 +0200

            Merge branch 'master' into gh

        commit b66feb92e2
        Merge: 80c55d5 05d068f
        Author: lesion <lesion@autistici.org>
        Date:   Tue Jun 21 23:48:40 2022 +0200

            Merge branch 'master' into gh

        commit 80c55d5601
        Merge: 814090e a154fdf
        Author: lesion <lesion@autistici.org>
        Date:   Mon Jun 6 17:27:00 2022 +0200

            Merge branch 'master' into gh

        commit 814090e9b6
        Merge: 616c542 2e3aba9
        Author: lesion <lesion@autistici.org>
        Date:   Mon Jun 6 17:19:31 2022 +0200

            Merge branch 'master' into gh

        commit 616c54229a
        Merge: e4cb22e 82dcaf9
        Author: lesion <lesion@autistici.org>
        Date:   Mon Jun 6 16:57:05 2022 +0200

            Merge branch 'master' into gh

        commit e4cb22ee33
        Merge: 5dddfbd 8657937
        Author: lesion <lesion@autistici.org>
        Date:   Fri Mar 11 23:41:22 2022 +0100

            Merge branch 'master' into gh

        commit 5dddfbd29e
        Merge: 60e9d95 10c6b0d
        Author: lesion <lesion@autistici.org>
        Date:   Fri Mar 11 23:22:12 2022 +0100

            Merge branch 'master' into gh

        commit 60e9d95ba8
        Merge: 79445ca ad93f83
        Author: lesion <lesion@autistici.org>
        Date:   Tue Dec 7 01:35:18 2021 +0100

            Merge branch 'master' into gh

        commit 79445ca8a7
        Merge: 9472d8d cd313ef
        Author: les <lesion@autistici.org>
        Date:   Thu Jun 24 21:52:25 2021 +0200

            Merge branch 'master' into gh

        commit 9472d8d919
        Merge: f960149 9e9643e
        Author: les <lesion@autistici.org>
        Date:   Fri Mar 26 22:27:41 2021 +0100

            Merge branch 'dev' into gh

        commit f9601492dc
        Author: les <lesion@autistici.org>
        Date:   Fri Dec 6 11:30:41 2019 +0100

            update dependencies

        commit f8c7fa2b45
        Author: les <lesion@autistici.org>
        Date:   Fri Dec 6 11:41:13 2019 +0100

            minor

        commit 33ca266535
        Author: les <lesion@autistici.org>
        Date:   Fri Dec 6 11:38:15 2019 +0100

            prepare gh as a mirror

    commit 5c8875411631048210eb50030e83cb272a40d54a
    Author: lesion <lesion@autistici.org>
    Date:   Sun Mar 19 23:18:40 2023 +0100

        update deps

    commit 7eac4fce324a6e75cdda296d672317cf2497c005
    Author: lesion <lesion@autistici.org>
    Date:   Sun Mar 19 23:18:25 2023 +0100

        refactoring event detail page

    commit dc9ca88bc62708b869be3f3efe51d9155fe17830
    Author: lesion <lesion@autistici.org>
    Date:   Sun Mar 19 23:17:35 2023 +0100

        show hide boosts/bookmarks, fix #241

    commit d4a25b1dd0b9404e0de7ca5cf546f0d29bc8943e
    Author: lesion <lesion@autistici.org>
    Date:   Sun Mar 19 23:13:58 2023 +0100

        minor with unixFormat

    commit 239d6bcab19ef3cf53d1b2544a5c9a36ba8dd25b
    Author: lesion <lesion@autistici.org>
    Date:   Sun Mar 19 23:12:25 2023 +0100

        minor

    commit b149f980db8245c12a6940997be6d5657bddf829
    Author: lesion <lesion@autistici.org>
    Date:   Sun Mar 19 23:12:05 2023 +0100

        minor

    commit 6f2955c584ec9da2c10991fb09ab57735a31385d
    Author: lesion <lesion@autistici.org>
    Date:   Sun Mar 19 23:11:49 2023 +0100

        minor

    commit dd586c38c9ef2f0b408ef90eb27dffe53355305a
    Author: lesion <lesion@autistici.org>
    Date:   Sun Mar 19 23:11:31 2023 +0100

        minor on style

    commit 544823717b9801e63bef15394b25bfbcd842c10f
    Author: lesion <lesion@autistici.org>
    Date:   Sun Mar 19 23:11:15 2023 +0100

        fix multidate issue, go to event on save

    commit 9ef0c75d03ee2d69f89034b28d6991f85ffefb06
    Author: lesion <lesion@autistici.org>
    Date:   Sun Mar 19 23:09:47 2023 +0100

        use v-lazy, improve search, full tag/place events

    commit ac91072b79960815e0535e63ac45e0b5c6100764
    Author: lesion <lesion@autistici.org>
    Date:   Sun Mar 19 22:47:51 2023 +0100

        increase DDOS limiter to 250 req/min

    commit d0ca92efb4afe48d2fd236083d9e290ab8d49704
    Author: lesion <lesion@autistici.org>
    Date:   Sun Mar 19 22:47:14 2023 +0100

        update changelog

    commit 2d54f19225acc4118d60ef8c9d12f9495e6776ca
    Author: lesion <lesion@autistici.org>
    Date:   Sun Mar 19 22:46:51 2023 +0100

        use luxon instead of dayjs, new $time plugin

commit ae990fc370
Author: sedum <sedum@oziosi.org>
Date:   Thu Mar 16 17:29:48 2023 +0100

    add support for server side http proxy, close #240

commit fc8a9f4506
Author: lesion <lesion@autistici.org>
Date:   Tue Mar 14 16:42:24 2023 +0100

    address some issues with recurrent events, fix #247

commit f7357666ca
Author: lesion <lesion@autistici.org>
Date:   Tue Mar 14 16:16:52 2023 +0100

    fix event import from URL

commit e1bca6f46a
Author: lesion <lesion@autistici.org>
Date:   Tue Mar 14 16:15:42 2023 +0100

     add Duch (nl) locale (thanks @jeoenepraat)

commit 5f8afdbc12
Merge: 57a052a 92ca5ab
Author: lesion <lesion@autistici.org>
Date:   Tue Mar 14 11:39:50 2023 +0100

    Merge remote-tracking branch 'weblate/master'

commit 57a052a7fa
Merge: 63d1d2e 55137d2
Author: lesion <lesion@autistici.org>
Date:   Tue Mar 14 11:39:33 2023 +0100

    Merge commit '55137d2ac23549e633f36ad10139fd4168c2645f'

commit 92ca5abf5e
Author: joenepraat <joenepraat@posteo.org>
Date:   Fri Mar 10 23:16:32 2023 +0000

    Translated using Weblate (Dutch)

    Currently translated at 68.3% (214 of 313 strings)

    Translation: Gancio/Web
    Translate-URL: https://hosted.weblate.org/projects/gancio/web/nl/

commit 63d1d2ee53
Author: lesion <lesion@autistici.org>
Date:   Thu Mar 9 21:41:06 2023 +0100

    minor

commit d2759a55a5
Author: lesion <lesion@autistici.org>
Date:   Thu Mar 9 21:38:39 2023 +0100

    wrong user / admin merge dark theme settings - fix #244

commit b401d829db
Author: lesion <lesion@autistici.org>
Date:   Thu Mar 9 21:24:45 2023 +0100

    remove a small warning

commit 55137d2ac2
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date:   Thu Feb 23 23:56:16 2023 +0000

    Bump sequelize from 6.28.0 to 6.29.0

    Bumps [sequelize](https://github.com/sequelize/sequelize) from 6.28.0 to 6.29.0.
    - [Release notes](https://github.com/sequelize/sequelize/releases)
    - [Commits](https://github.com/sequelize/sequelize/compare/v6.28.0...v6.29.0)

    ---
    updated-dependencies:
    - dependency-name: sequelize
      dependency-type: direct:production
    ...

    Signed-off-by: dependabot[bot] <support@github.com>

commit 4367960a62
Merge: c8cc5c6 87dd179
Author: lesion <lesion@autistici.org>
Date:   Tue Feb 7 17:46:58 2023 +0100

    Merge branch 'master' into gh

commit c8cc5c6c97
Merge: 88e0c90 550e221
Author: lesion <lesion@autistici.org>
Date:   Mon Jan 9 17:15:21 2023 +0100

    Merge branch 'master' into gh

commit 88e0c90a66
Merge: 421aa12 f212ac1
Author: lesion <lesion@autistici.org>
Date:   Thu Dec 15 09:54:41 2022 +0100

    Merge branch 'master' into gh

commit 421aa12781
Merge: 5f6cc46 b3488e7
Author: lesion <lesion@autistici.org>
Date:   Wed Sep 28 12:26:08 2022 +0200

    Merge branch 'master' into gh

commit 5f6cc46cdc
Merge: b66feb9 171d968
Author: lesion <lesion@autistici.org>
Date:   Mon Aug 8 00:08:12 2022 +0200

    Merge branch 'master' into gh

commit b66feb92e2
Merge: 80c55d5 05d068f
Author: lesion <lesion@autistici.org>
Date:   Tue Jun 21 23:48:40 2022 +0200

    Merge branch 'master' into gh

commit 80c55d5601
Merge: 814090e a154fdf
Author: lesion <lesion@autistici.org>
Date:   Mon Jun 6 17:27:00 2022 +0200

    Merge branch 'master' into gh

commit 814090e9b6
Merge: 616c542 2e3aba9
Author: lesion <lesion@autistici.org>
Date:   Mon Jun 6 17:19:31 2022 +0200

    Merge branch 'master' into gh

commit 616c54229a
Merge: e4cb22e 82dcaf9
Author: lesion <lesion@autistici.org>
Date:   Mon Jun 6 16:57:05 2022 +0200

    Merge branch 'master' into gh

commit e4cb22ee33
Merge: 5dddfbd 8657937
Author: lesion <lesion@autistici.org>
Date:   Fri Mar 11 23:41:22 2022 +0100

    Merge branch 'master' into gh

commit 5dddfbd29e
Merge: 60e9d95 10c6b0d
Author: lesion <lesion@autistici.org>
Date:   Fri Mar 11 23:22:12 2022 +0100

    Merge branch 'master' into gh

commit 60e9d95ba8
Merge: 79445ca ad93f83
Author: lesion <lesion@autistici.org>
Date:   Tue Dec 7 01:35:18 2021 +0100

    Merge branch 'master' into gh

commit 79445ca8a7
Merge: 9472d8d cd313ef
Author: les <lesion@autistici.org>
Date:   Thu Jun 24 21:52:25 2021 +0200

    Merge branch 'master' into gh

commit 9472d8d919
Merge: f960149 9e9643e
Author: les <lesion@autistici.org>
Date:   Fri Mar 26 22:27:41 2021 +0100

    Merge branch 'dev' into gh

commit f9601492dc
Author: les <lesion@autistici.org>
Date:   Fri Dec 6 11:30:41 2019 +0100

    update dependencies

commit f8c7fa2b45
Author: les <lesion@autistici.org>
Date:   Fri Dec 6 11:41:13 2019 +0100

    minor

commit 33ca266535
Author: les <lesion@autistici.org>
Date:   Fri Dec 6 11:38:15 2019 +0100

    prepare gh as a mirror
2023-04-03 16:39:26 +02:00

298 lines
10 KiB
JavaScript

const ical = require('ical.js')
const settingsController = require('./api/controller/settings')
const express = require('express')
const dayjs = require('dayjs')
const timezone = require('dayjs/plugin/timezone')
dayjs.extend(timezone)
const config = require('./config')
const log = require('./log')
const pkg = require('../package.json')
const path = require('path')
const sharp = require('sharp')
const axios = require('axios')
const crypto = require('crypto')
const Microformats = require('microformat-node')
const get = require('lodash/get')
const DOMPurify = require('dompurify')
const { JSDOM } = require('jsdom')
const { window } = new JSDOM('<!DOCTYPE html>')
const domPurify = DOMPurify(window)
const URL = require('url')
domPurify.addHook('beforeSanitizeElements', node => {
if (node.hasAttribute && node.hasAttribute('href')) {
const href = node.getAttribute('href')
const text = node.textContent
// remove FB tracking param
if (href.includes('fbclid=')) {
try {
const url = new URL.URL(href)
url.searchParams.delete('fbclid')
node.setAttribute('href', url.href)
if (text.includes('fbclid=')) {
node.textContent = url.href
}
} catch (e) {
return node
}
}
}
return node
})
module.exports = {
randomString(length = 12) {
const wishlist = '0123456789abcdefghijklmnopqrstuvwxyz'
return Array.from(crypto.randomFillSync(new Uint32Array(length)))
.map(x => wishlist[x % wishlist.length])
.join('')
},
sanitizeHTML(html) {
return domPurify.sanitize(html, {
ALLOWED_TAGS: ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'br', 'i', 'span',
'h6', 'b', 'a', 'li', 'ul', 'ol', 'code', 'blockquote', 'u', 's', 'strong'],
ALLOWED_ATTR: ['href', 'target']
})
},
async initSettings(_req, res, next) {
// initialize settings
// res.locals.settings = cloneDeep(settingsController.settings)
const settings = settingsController.settings
res.locals.settings = {
title: settings.title || config.title,
description: settings.description || config.description,
baseurl: config.baseurl,
hostname: config.hostname,
version: pkg.version,
instance_timezone: settings.instance_timezone,
instance_locale: settings.instance_locale,
instance_name: settings.instance_name,
instance_place: settings.instance_place,
allow_registration: settings.allow_registration,
allow_anon_event: settings.allow_anon_event,
allow_recurrent_event: settings.allow_recurrent_event,
allow_multidate_event: settings.allow_multidate_event,
recurrent_event_visible: settings.recurrent_event_visible,
enable_federation: settings.enable_federation,
enable_resources: settings.enable_resources,
hide_boosts: settings.hide_boosts,
enable_trusted_instances: settings.enable_trusted_instances,
trusted_instances: settings.trusted_instances,
trusted_instances_label: settings.trusted_instances_label,
'theme.is_dark': settings['theme.is_dark'],
dark_colors: settings.dark_colors,
light_colors: settings.light_colors,
hide_thumbs: settings.hide_thumbs,
hide_calendar: settings.hide_calendar,
allow_geolocation: settings.allow_geolocation,
geocoding_provider_type: settings.geocoding_provider_type,
geocoding_provider: settings.geocoding_provider,
geocoding_countrycodes: settings.geocoding_countrycodes,
tilelayer_provider: settings.tilelayer_provider,
tilelayer_provider_attribution: settings.tilelayer_provider_attribution,
footerLinks: settings.footerLinks,
about: settings.about,
allow_event_only_online: settings.allow_event_only_online,
allow_event_also_online: settings.allow_event_also_online
}
next()
},
serveStatic() {
const router = express.Router()
// serve images/thumb
router.use('/media/', express.static(config.upload_path, { immutable: true, maxAge: '1y' }), (_req, res) => res.sendStatus(404))
router.use('/download/:filename', (req, res) => {
res.download(req.params.filename, undefined, { root: config.upload_path }, err => {
if (err) {
// Check if headers have been sent
if(res.headersSent) {
log.warn(err)
} else {
res.status(404).send('Not found (but nice try 😊)')
}
}
})
})
router.use('/fallbackimage.png', (req, res, next) => {
const fallbackImagePath = settingsController.settings.fallback_image || './static/noimg.svg'
return express.static(fallbackImagePath)(req, res, next)
})
router.use('/headerimage.png', (req, res, next) => {
const headerImagePath = settingsController.settings.header_image || './static/noimg.svg'
return express.static(headerImagePath)(req, res, next)
})
router.use('/logo.png', (req, res, next) => {
const logoPath = settingsController.settings.logo || './static/gancio'
return express.static(logoPath + '.png')(req, res, next)
})
router.use('/favicon.ico', (req, res, next) => {
const faviconPath = res.locals.settings.logo ? res.locals.settings.logo + '.png' : './assets/favicon.ico'
return express.static(faviconPath)(req, res, next)
})
return router
},
logRequest(req, _res, next) {
log.debug(`${req.method} ${req.path}`)
next()
},
col(field) {
if (config.db.dialect === 'postgres') {
return '"' + field.split('.').join('"."') + '"'
} else if (config.db.dialect === 'mariadb') {
return '`' + field.split('.').join('`.`') + '`'
} else {
return field
}
},
async getImageFromURL(url) {
log.debug(`getImageFromURL ${url}`)
const filename = crypto.randomBytes(16).toString('hex')
const sharpStream = sharp({ failOnError: true })
const promises = [
sharpStream.clone().resize(500, null, { withoutEnlargement: true }).jpeg({ effort: 6, mozjpeg: true }).toFile(path.resolve(config.upload_path, 'thumb', filename + '.jpg')),
sharpStream.clone().resize(1200, null, { withoutEnlargement: true }).jpeg({ quality: 95, effort: 6, mozjpeg: true }).toFile(path.resolve(config.upload_path, filename + '.jpg')),
]
const response = await axios({ method: 'GET', url: encodeURI(url), responseType: 'stream' })
response.data.pipe(sharpStream)
return Promise.all(promises)
.then(res => {
const info = res[1]
return {
destination: config.upload_path,
filename: filename + '.jpg',
path: path.resolve(config.upload_path, filename + '.jpg'),
height: info.height,
width: info.width,
size: info.size,
}
})
.catch(err => {
log.error(err)
req.err = err
cb(null)
})
},
/**
* Import events from url
* It does supports ICS and H-EVENT
*/
async importURL(req, res) {
const url = req.query.URL
try {
const response = await axios.get(url)
const contentType = response.headers['content-type']
if (contentType.includes('text/html')) {
Microformats.get({ html: response.data, filter: ['h-event'] }, (err, data) => {
if (err || !data.items.length || !data.items[0].properties) {
return res.sendStatus(404)
}
const events = data.items.map(e => {
const props = e.properties
let media = get(props, 'featured[0]')
if (media) {
media = URL.resolve(url, media)
}
return {
title: get(props, 'name[0]', ''),
description: get(props, 'description[0]', ''),
place: {
name: get(props, 'location[0].properties.name[0].value', '') || get(props, 'location[0].properties.name', '') || get(props, 'location[0]'),
address: get(props, 'location[0].properties.street-address[0]') || get(props, 'location[0].properties.street-address')
},
start_datetime: dayjs(get(props, 'start[0]', '')).unix(),
end_datetime: dayjs(get(props, 'end[0]', '')).unix(),
tags: get(props, 'category', []),
media: media ? [{ name: get(props, 'name[0]', ''), url: media, focalpoint: [0, 0] }] : []
}
})
return res.json(events)
})
} else if (contentType.includes('text/calendar')) {
const ret = ical.parse(response.data)
const component = new ical.Component(ret)
const events = component.getAllSubcomponents('vevent')
return res.json(events.map(e => {
const event = new ical.Event(e)
return {
title: get(event, 'summary', ''),
description: get(event, 'description', ''),
place: { name: get(event, 'location', '') },
start_datetime: dayjs(get(event, 'startDate', null)).unix(),
end_datetime: dayjs(get(event, 'endDate', null)).unix()
}
}))
}
} catch (e) {
log.error('[Import URL]', e)
res.status(400).json(e.toString())
}
},
getWeekdayN(date, n, weekday) {
let cursor
if (n === -1) {
cursor = date.endOf('month')
cursor = cursor.set({ weekday })
if (cursor.month !== date.month) {
cursor = cursor.minus({ days: 7 })
}
} else {
cursor = date.startOf('month')
cursor = cursor.add(cursor.day() <= date.day() ? n - 1 : n, 'week')
cursor = cursor.plus({ days: cursor.weekday <= date.weekday ? (n-1) * 7 : n * 7})
cursor = cursor.set({ weekday })
}
cursor = cursor.set({ hour: date.hour, minute: date.minute, second: 0 })
log.debug(cursor)
return cursor
},
async APRedirect(req, res, next) {
const eventController = require('../server/api/controller/event')
const acceptJson = req.accepts('html', 'application/activity+json') === 'application/activity+json'
if (acceptJson) {
const event = await eventController._get(req.params.slug)
if (event) {
return res.redirect(`/federation/m/${event.id}`)
}
}
next()
},
async feedRedirect(req, res, next) {
const accepted = req.accepts('html', 'application/rss+xml', 'text/calendar')
if (['application/rss+xml', 'text/calendar'].includes(accepted) && /^\/(tag|place|collection)\/.*/.test(req.path)) {
return res.redirect((accepted === 'application/rss+xml' ? '/feed/rss' : '/feed/ics') + req.path)
}
next()
},
async isGeocodingEnabled(req, res, next) {
if (res.locals.settings.allow_geolocation) {
next()
} else {
res.sendStatus(403)
}
}
}