diff options
| author | 2021-11-10 00:54:35 -0500 | |
|---|---|---|
| committer | 2021-11-10 00:54:35 -0500 | |
| commit | 58fb7a0cee13d84170aac52f3f89d91888e1afe3 (patch) | |
| tree | 1d6312ba15f9ece5a8031e5280dfb8b38be8dfa3 /doc | |
| parent | 28db84b46139c9bb2bbcac8c6cc56e71d1e35629 (diff) | |
| parent | beb08eb751fa8e1f72042f263316ab5e5ddb596d (diff) | |
Update upstream source from tag 'upstream/2.4.0+dfsg'
Update to upstream version '2.4.0+dfsg'
with Debian dir 4b6668cc08c7b0e56b1e1f7b4e89ecdb316182a0
Diffstat (limited to 'doc')
| -rw-r--r-- | doc/QtCodeStyle.xml | 234 | ||||
| -rw-r--r-- | doc/barrier.conf.example-advanced | 6 | ||||
| -rw-r--r-- | doc/barrier.conf.example-barebones | 17 | ||||
| -rw-r--r-- | doc/barrier.conf.example-basic | 4 | ||||
| -rw-r--r-- | doc/barrierc.1 | 2 | ||||
| -rw-r--r-- | doc/barriers.1 | 2 | ||||
| -rw-r--r-- | doc/newsfragments/README.md | 13 | ||||
| -rw-r--r-- | doc/org.barrier-foss.org.barrierc.plist | 18 | ||||
| -rw-r--r-- | doc/org.barrier-foss.org.barriers.plist | 12 | ||||
| -rw-r--r-- | doc/release_notes/index.md | 94 | ||||
| -rw-r--r-- | doc/release_notes/index.template.jinja | 37 |
11 files changed, 183 insertions, 256 deletions
diff --git a/doc/QtCodeStyle.xml b/doc/QtCodeStyle.xml deleted file mode 100644 index e621c4f..0000000 --- a/doc/QtCodeStyle.xml +++ /dev/null @@ -1,234 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE QtCreatorCodeStyle> -<!-- Written by QtCreator 3.0.1, 2014-02-14T09:50:24. --> -<qtcreator> - <data> - <variable>CodeStyleData</variable> - <valuemap type="QVariantMap"> - <value type="bool" key="AlignAssignments">false</value> - <value type="bool" key="AutoSpacesForTabs">false</value> - <value type="bool" key="BindStarToIdentifier">true</value> - <value type="bool" key="BindStarToLeftSpecifier">false</value> - <value type="bool" key="BindStarToRightSpecifier">false</value> - <value type="bool" key="BindStarToTypeName">false</value> - <value type="bool" key="ExtraPaddingForConditionsIfConfusingAlign">true</value> - <value type="bool" key="IndentAccessSpecifiers">false</value> - <value type="bool" key="IndentBlockBody">true</value> - <value type="bool" key="IndentBlockBraces">false</value> - <value type="bool" key="IndentBlocksRelativeToSwitchLabels">false</value> - <value type="bool" key="IndentClassBraces">false</value> - <value type="bool" key="IndentControlFlowRelativeToSwitchLabels">true</value> - <value type="bool" key="IndentDeclarationsRelativeToAccessSpecifiers">true</value> - <value type="bool" key="IndentEnumBraces">false</value> - <value type="bool" key="IndentFunctionBody">true</value> - <value type="bool" key="IndentFunctionBraces">false</value> - <value type="bool" key="IndentNamespaceBody">false</value> - <value type="bool" key="IndentNamespaceBraces">false</value> - <value type="int" key="IndentSize">4</value> - <value type="bool" key="IndentStatementsRelativeToSwitchLabels">true</value> - <value type="bool" key="IndentSwitchLabels">false</value> - <value type="int" key="PaddingMode">2</value> - <value type="bool" key="SpacesForTabs">false</value> - <value type="int" key="TabSize">4</value> - </valuemap> - </data> - <data> - <variable>DisplayName</variable> - <value type="QString">Barrier</value> - </data> -</qtcreator> -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE QtCreatorCodeStyle> -<!-- Written by QtCreator 3.0.1, 2014-02-14T09:50:24. --> -<qtcreator> - <data> - <variable>CodeStyleData</variable> - <valuemap type="QVariantMap"> - <value type="bool" key="AlignAssignments">false</value> - <value type="bool" key="AutoSpacesForTabs">false</value> - <value type="bool" key="BindStarToIdentifier">true</value> - <value type="bool" key="BindStarToLeftSpecifier">false</value> - <value type="bool" key="BindStarToRightSpecifier">false</value> - <value type="bool" key="BindStarToTypeName">false</value> - <value type="bool" key="ExtraPaddingForConditionsIfConfusingAlign">true</value> - <value type="bool" key="IndentAccessSpecifiers">false</value> - <value type="bool" key="IndentBlockBody">true</value> - <value type="bool" key="IndentBlockBraces">false</value> - <value type="bool" key="IndentBlocksRelativeToSwitchLabels">false</value> - <value type="bool" key="IndentClassBraces">false</value> - <value type="bool" key="IndentControlFlowRelativeToSwitchLabels">true</value> - <value type="bool" key="IndentDeclarationsRelativeToAccessSpecifiers">true</value> - <value type="bool" key="IndentEnumBraces">false</value> - <value type="bool" key="IndentFunctionBody">true</value> - <value type="bool" key="IndentFunctionBraces">false</value> - <value type="bool" key="IndentNamespaceBody">false</value> - <value type="bool" key="IndentNamespaceBraces">false</value> - <value type="int" key="IndentSize">4</value> - <value type="bool" key="IndentStatementsRelativeToSwitchLabels">true</value> - <value type="bool" key="IndentSwitchLabels">false</value> - <value type="int" key="PaddingMode">2</value> - <value type="bool" key="SpacesForTabs">false</value> - <value type="int" key="TabSize">4</value> - </valuemap> - </data> - <data> - <variable>DisplayName</variable> - <value type="QString">Barrier</value> - </data> -</qtcreator> -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE QtCreatorCodeStyle> -<!-- Written by QtCreator 3.0.1, 2014-02-14T09:50:24. --> -<qtcreator> - <data> - <variable>CodeStyleData</variable> - <valuemap type="QVariantMap"> - <value type="bool" key="AlignAssignments">false</value> - <value type="bool" key="AutoSpacesForTabs">false</value> - <value type="bool" key="BindStarToIdentifier">true</value> - <value type="bool" key="BindStarToLeftSpecifier">false</value> - <value type="bool" key="BindStarToRightSpecifier">false</value> - <value type="bool" key="BindStarToTypeName">false</value> - <value type="bool" key="ExtraPaddingForConditionsIfConfusingAlign">true</value> - <value type="bool" key="IndentAccessSpecifiers">false</value> - <value type="bool" key="IndentBlockBody">true</value> - <value type="bool" key="IndentBlockBraces">false</value> - <value type="bool" key="IndentBlocksRelativeToSwitchLabels">false</value> - <value type="bool" key="IndentClassBraces">false</value> - <value type="bool" key="IndentControlFlowRelativeToSwitchLabels">true</value> - <value type="bool" key="IndentDeclarationsRelativeToAccessSpecifiers">true</value> - <value type="bool" key="IndentEnumBraces">false</value> - <value type="bool" key="IndentFunctionBody">true</value> - <value type="bool" key="IndentFunctionBraces">false</value> - <value type="bool" key="IndentNamespaceBody">false</value> - <value type="bool" key="IndentNamespaceBraces">false</value> - <value type="int" key="IndentSize">4</value> - <value type="bool" key="IndentStatementsRelativeToSwitchLabels">true</value> - <value type="bool" key="IndentSwitchLabels">false</value> - <value type="int" key="PaddingMode">2</value> - <value type="bool" key="SpacesForTabs">false</value> - <value type="int" key="TabSize">4</value> - </valuemap> - </data> - <data> - <variable>DisplayName</variable> - <value type="QString">Barrier</value> - </data> -</qtcreator> -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE QtCreatorCodeStyle> -<!-- Written by QtCreator 3.0.1, 2014-02-14T09:50:24. --> -<qtcreator> - <data> - <variable>CodeStyleData</variable> - <valuemap type="QVariantMap"> - <value type="bool" key="AlignAssignments">false</value> - <value type="bool" key="AutoSpacesForTabs">false</value> - <value type="bool" key="BindStarToIdentifier">true</value> - <value type="bool" key="BindStarToLeftSpecifier">false</value> - <value type="bool" key="BindStarToRightSpecifier">false</value> - <value type="bool" key="BindStarToTypeName">false</value> - <value type="bool" key="ExtraPaddingForConditionsIfConfusingAlign">true</value> - <value type="bool" key="IndentAccessSpecifiers">false</value> - <value type="bool" key="IndentBlockBody">true</value> - <value type="bool" key="IndentBlockBraces">false</value> - <value type="bool" key="IndentBlocksRelativeToSwitchLabels">false</value> - <value type="bool" key="IndentClassBraces">false</value> - <value type="bool" key="IndentControlFlowRelativeToSwitchLabels">true</value> - <value type="bool" key="IndentDeclarationsRelativeToAccessSpecifiers">true</value> - <value type="bool" key="IndentEnumBraces">false</value> - <value type="bool" key="IndentFunctionBody">true</value> - <value type="bool" key="IndentFunctionBraces">false</value> - <value type="bool" key="IndentNamespaceBody">false</value> - <value type="bool" key="IndentNamespaceBraces">false</value> - <value type="int" key="IndentSize">4</value> - <value type="bool" key="IndentStatementsRelativeToSwitchLabels">true</value> - <value type="bool" key="IndentSwitchLabels">false</value> - <value type="int" key="PaddingMode">2</value> - <value type="bool" key="SpacesForTabs">false</value> - <value type="int" key="TabSize">4</value> - </valuemap> - </data> - <data> - <variable>DisplayName</variable> - <value type="QString">Barrier</value> - </data> -</qtcreator> -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE QtCreatorCodeStyle> -<!-- Written by QtCreator 3.0.1, 2014-02-14T09:50:24. --> -<qtcreator> - <data> - <variable>CodeStyleData</variable> - <valuemap type="QVariantMap"> - <value type="bool" key="AlignAssignments">false</value> - <value type="bool" key="AutoSpacesForTabs">false</value> - <value type="bool" key="BindStarToIdentifier">true</value> - <value type="bool" key="BindStarToLeftSpecifier">false</value> - <value type="bool" key="BindStarToRightSpecifier">false</value> - <value type="bool" key="BindStarToTypeName">false</value> - <value type="bool" key="ExtraPaddingForConditionsIfConfusingAlign">true</value> - <value type="bool" key="IndentAccessSpecifiers">false</value> - <value type="bool" key="IndentBlockBody">true</value> - <value type="bool" key="IndentBlockBraces">false</value> - <value type="bool" key="IndentBlocksRelativeToSwitchLabels">false</value> - <value type="bool" key="IndentClassBraces">false</value> - <value type="bool" key="IndentControlFlowRelativeToSwitchLabels">true</value> - <value type="bool" key="IndentDeclarationsRelativeToAccessSpecifiers">true</value> - <value type="bool" key="IndentEnumBraces">false</value> - <value type="bool" key="IndentFunctionBody">true</value> - <value type="bool" key="IndentFunctionBraces">false</value> - <value type="bool" key="IndentNamespaceBody">false</value> - <value type="bool" key="IndentNamespaceBraces">false</value> - <value type="int" key="IndentSize">4</value> - <value type="bool" key="IndentStatementsRelativeToSwitchLabels">true</value> - <value type="bool" key="IndentSwitchLabels">false</value> - <value type="int" key="PaddingMode">2</value> - <value type="bool" key="SpacesForTabs">false</value> - <value type="int" key="TabSize">4</value> - </valuemap> - </data> - <data> - <variable>DisplayName</variable> - <value type="QString">Barrier</value> - </data> -</qtcreator> -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE QtCreatorCodeStyle> -<!-- Written by QtCreator 3.0.1, 2014-02-14T09:50:24. --> -<qtcreator> - <data> - <variable>CodeStyleData</variable> - <valuemap type="QVariantMap"> - <value type="bool" key="AlignAssignments">false</value> - <value type="bool" key="AutoSpacesForTabs">false</value> - <value type="bool" key="BindStarToIdentifier">true</value> - <value type="bool" key="BindStarToLeftSpecifier">false</value> - <value type="bool" key="BindStarToRightSpecifier">false</value> - <value type="bool" key="BindStarToTypeName">false</value> - <value type="bool" key="ExtraPaddingForConditionsIfConfusingAlign">true</value> - <value type="bool" key="IndentAccessSpecifiers">false</value> - <value type="bool" key="IndentBlockBody">true</value> - <value type="bool" key="IndentBlockBraces">false</value> - <value type="bool" key="IndentBlocksRelativeToSwitchLabels">false</value> - <value type="bool" key="IndentClassBraces">false</value> - <value type="bool" key="IndentControlFlowRelativeToSwitchLabels">true</value> - <value type="bool" key="IndentDeclarationsRelativeToAccessSpecifiers">true</value> - <value type="bool" key="IndentEnumBraces">false</value> - <value type="bool" key="IndentFunctionBody">true</value> - <value type="bool" key="IndentFunctionBraces">false</value> - <value type="bool" key="IndentNamespaceBody">false</value> - <value type="bool" key="IndentNamespaceBraces">false</value> - <value type="int" key="IndentSize">4</value> - <value type="bool" key="IndentStatementsRelativeToSwitchLabels">true</value> - <value type="bool" key="IndentSwitchLabels">false</value> - <value type="int" key="PaddingMode">2</value> - <value type="bool" key="SpacesForTabs">false</value> - <value type="int" key="TabSize">4</value> - </valuemap> - </data> - <data> - <variable>DisplayName</variable> - <value type="QString">Barrier</value> - </data> -</qtcreator> diff --git a/doc/barrier.conf.example-advanced b/doc/barrier.conf.example-advanced index ad9df29..e1b2392 100644 --- a/doc/barrier.conf.example-advanced +++ b/doc/barrier.conf.example-advanced @@ -47,9 +47,9 @@ section: links end # The aliases section is to map the full names of the computers to their logical names used in the screens section -# One way to find the actual name of a comptuer is to run hostname from a command window +# One way to find the actual name of a computer is to run hostname from a command window section: aliases # Laptop is actually known as John-Smiths-MacBook-3.local - desktop2: - John-Smiths-MacBook-3.local + John-Smiths-MacBook-3.local: + desktop2 end diff --git a/doc/barrier.conf.example-barebones b/doc/barrier.conf.example-barebones new file mode 100644 index 0000000..1a4558d --- /dev/null +++ b/doc/barrier.conf.example-barebones @@ -0,0 +1,17 @@ +# barebones barrier.conf example +# for two computers side by side +# replace screen.name.server and screen.name.client with your screen names from gui +# there's a 50/50 chance you'll want to swap left and right +# save this as barrier.conf in your home folder and "Use existing configuration" on server + +section: screens + screen.name.server: + screen.name.client: +end + +section: links + screen.name.server: + left = screen.name.client + screen.name.client: + right = screen.name.server +end diff --git a/doc/barrier.conf.example-basic b/doc/barrier.conf.example-basic index 39ff6d6..57d71d9 100644 --- a/doc/barrier.conf.example-basic +++ b/doc/barrier.conf.example-basic @@ -34,6 +34,6 @@ end section: aliases # The "real" name of iMac is John-Smiths-iMac-3.local. If we wanted we could remove this alias and instead use John-Smiths-iMac-3.local everywhere iMac is above. Hopefully it should be easy to see why using an alias is nicer - iMac: - John-Smiths-iMac-3.local + John-Smiths-iMac-3.local: + iMac end diff --git a/doc/barrierc.1 b/doc/barrierc.1 index 2fd882a..d470447 100644 --- a/doc/barrierc.1 +++ b/doc/barrierc.1 @@ -1,5 +1,5 @@ .\" See UpdateManpages.txt about modification of this file. Most of it was generated by help2man 1.47.8. -.TH BARRIERC "1" "November 2019" "barrierc 2.3.3-release" "User Commands" +.TH BARRIERC "1" "November 2019" "barrierc 2.4.0-release" "User Commands" .SH NAME barrierc \- Barrier Keyboard/Mouse Client .SH SYNOPSIS diff --git a/doc/barriers.1 b/doc/barriers.1 index 098ea84..f4a460e 100644 --- a/doc/barriers.1 +++ b/doc/barriers.1 @@ -1,5 +1,5 @@ .\" See UpdateManpages.txt about modification of this file. Most of it was generated by help2man 1.47.8. -.TH BARRIERS "1" "November 2019" "barriers 2.3.3-release" "User Commands" +.TH BARRIERS "1" "November 2019" "barriers 2.4.0-release" "User Commands" .SH NAME barriers \- Barrier Keyboard/Mouse Server .SH SYNOPSIS diff --git a/doc/newsfragments/README.md b/doc/newsfragments/README.md new file mode 100644 index 0000000..0338cf8 --- /dev/null +++ b/doc/newsfragments/README.md @@ -0,0 +1,13 @@ +This is the directory for release note fragments processed by +[towncrier](https://github.com/hawkowl/towncrier). + +When making a user-visible change create a file in this directory and it will be automatically be +included into the release note document when the next release is published. + +The file extension specifies the type of a change. The following are currently supported: + + - .feature: a new feature. + - .bugfix: a bug fix. + - .security: a fix for security issue. + - .doc: a documentation improvement. + - .removal: a deprecation or removal of functionality. diff --git a/doc/org.barrier-foss.org.barrierc.plist b/doc/org.barrier-foss.org.barrierc.plist index 31e10ba..90345c8 100644 --- a/doc/org.barrier-foss.org.barrierc.plist +++ b/doc/org.barrier-foss.org.barrierc.plist @@ -4,17 +4,17 @@ <plist version="1.0"> <!-- Mac OSX only: Copy this plist file into [~]/Library/LaunchAgents to start barrier client automatically. Make sure you change the IP below. --> <dict> - <key>Label</key> - <string>org.debauchee.com.barrierc.plist</string> - <key>OnDemand</key> - <false/> - <key>ProgramArguments</key> - <array> + <key>Label</key> + <string>org.debauchee.com.barrierc.plist</string> + <key>OnDemand</key> + <false/> + <key>ProgramArguments</key> + <array> <string>/usr/bin/barrierc</string> <!-- Replace this IP with the IP of your barriers server --> <string>192.168.0.2</string> - </array> - <key>RunAtLoad</key> - <true/> + </array> + <key>RunAtLoad</key> + <true/> </dict> </plist> diff --git a/doc/org.barrier-foss.org.barriers.plist b/doc/org.barrier-foss.org.barriers.plist index f1ab5bf..fed7b47 100644 --- a/doc/org.barrier-foss.org.barriers.plist +++ b/doc/org.barrier-foss.org.barriers.plist @@ -4,12 +4,12 @@ <plist version="1.0"> <!-- Mac OSX only: Copy this plist file into [~]/Library/LaunchAgents to start barrier server automatically. Make sure you change configuration file below --> <dict> - <key>Label</key> - <string>org.debauchee.com.barriers.plist</string> - <key>OnDemand</key> - <false/> - <key>ProgramArguments</key> - <array> + <key>Label</key> + <string>org.debauchee.com.barriers.plist</string> + <key>OnDemand</key> + <false/> + <key>ProgramArguments</key> + <array> <string>/usr/bin/barriers</string> <string>--no-daemon</string> <string>--config</string> diff --git a/doc/release_notes/index.md b/doc/release_notes/index.md new file mode 100644 index 0000000..72d3a43 --- /dev/null +++ b/doc/release_notes/index.md @@ -0,0 +1,94 @@ +Release notes +============= + +[comment]: <> (towncrier release notes start) + +Barrier `2.4.0` ( `2021-11-01` ) +================================ + +Security fixes +-------------- + +- Barrier now supports client identity verification (fixes CVE-2021-42072, CVE-2021-42073). + + Previously a malicious client could connect to Barrier server without any authentication and + send application-level messages. This made the attack surface of Barrier significantly larger. + Additionally, in case the malicious client got possession of a valid screen name by brute forcing + or other means it could modify the clipboard contents of the server. + + To support seamless upgrades from older versions of Barrier this is currently disabled by default. + The feature can be enabled in the settings dialog. If enabled, older clients of Barrier will be + rejected. + +- Barrier now uses SHA256 fingerprints for establishing security of encrypted SSL connections. + After upgrading client to new version the existing server fingerprint will need to be approved + again. Client and server will show both SHA1 and SHA256 server fingerprints to allow + interoperability with older versions of Barrier. + +Bug fixes +--------- + +- Fixed build failure on mips*el and riscv64 architecture. +- Fixed reading of configuration on Windows when the paths contain non-ASCII characters +(https://github.com/debauchee/barrier/issues/976, https://github.com/debauchee/barrier/issues/974, + https://github.com/debauchee/barrier/issues/444). +- Barrier no longer uses openssl CLI tool for any operations and hooks into the openssl library directly. +- More X11 clipboard MIME types have been mapped to corresponding converters (https://github.com/debauchee/barrier/issues/344). +- Fixed setup of multiple actions associated with a hotkey. +- Fixed setup of hotkeys with special characters such as comma and semicolon + (https://github.com/debauchee/barrier/issues/778). +- Fixed transfer of non-ASCII characters coming from a Windows server in certain cases + (https://github.com/debauchee/barrier/issues/527). +- Barrier will now regenerate server certificate if it's invalid instead of failing to launch + (https://github.com/debauchee/barrier/issues/802) +- Added support for additional keys on Sun Microsystems USB keyboards + (https://github.com/debauchee/barrier/issues/784). +- Updated Chinese translation. +- Updated Slovak translation. +- Theme icons are now preferred to icons distributed together with Barrier + (https://github.com/debauchee/barrier/issues/471). +- Fixed incorrect setup of Barrier service path on Windows. + +Features +-------- + +- Added `--drop-target` option that improves drag and drop support on Windows when Barrier is + being run as a portable app. +- The `--enable-crypto` command line option has been made the default to reduce chances of + accidental security mishaps when configuring Barrier from command line. + A new `--disable-crypto` command line option has been added to explicitly disable encryption. +- Added support for randomart images for easier comparison of SSL certificate fingerprints. + The algorithm is identical to what OpenSSH uses. +- Implemented a configuration option for Server GUI auto-start. +- Made it possible to use keyboard instead of mouse to modify screen layout. +- Added support for keyboard backlight media keys +- Added support for Eisu_toggle and Muhenkan keys +- Added `--profile-dir` option that allows to select custom profile directory. + +Barrier `2.3.4` ( `2021-11-01` ) +================================ + +Security fixes +-------------- + +- Barrier will now correctly close connections when the app-level handshake fails (fixes CVE-2021-42075). + + Previously repeated failing connections would leak file descriptors leading to Barrier being unable + to receive new connections from clients. + +- Barrier will now enforce a maximum length of input messages (fixes CVE-2021-42076). + + Previously it was possible for a malicious client or server to send excessive length messages + leading to denial of service by resource exhaustion. + +- Fixed a bug which caused Barrier to crash when disconnecting a TCP session just after sending Hello message. + This bug allowed an unauthenticated attacker to crash Barrier with only network access. + +All of the above security issues have been reported by Matthias Gerstner who was really helpful +resolving them. + +Bug fixes +--------- + +- Fixed a bug in SSL implementation that caused invalid data occasionally being sent to clients + under heavy load. diff --git a/doc/release_notes/index.template.jinja b/doc/release_notes/index.template.jinja new file mode 100644 index 0000000..418a1d3 --- /dev/null +++ b/doc/release_notes/index.template.jinja @@ -0,0 +1,37 @@ +{% for section, _ in sections|dictsort(by='key') %} +{% set underline = "-" %} +{% if section %} +{{section}} +{{ underline * section|length }}{% set underline = "-" %} + +{% endif %} +{% if sections[section] %} +{% for category, val in definitions|dictsort if category in sections[section]%} + +{{ definitions[category]['name'] }} +{{ underline * definitions[category]['name']|length }} + +{% if definitions[category]['showcontent'] %} +{% for text, values in sections[section][category]|dictsort(by='value') %} +- {{ text }} +{% endfor %} +{% else %} +- {{ sections[section][category]['']|sort|join(', ') }} + + +{% endif %} +{% if sections[section][category]|length == 0 %} + +No significant changes. + + +{% else %} +{% endif %} +{% endfor %} +{% else %} + +No significant changes. + + +{% endif %} +{% endfor %} |
