Skip to content

Commit 68baf98

Browse files
authored
Merge pull request #357 from clowder-framework/release/1.20.2
Release/1.20.2
2 parents 86ba0e3 + 359df51 commit 68baf98

File tree

12 files changed

+64
-55
lines changed

12 files changed

+64
-55
lines changed

.github/workflows/swagger.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,6 @@ jobs:
2323
- uses: actions/checkout@v2
2424

2525
- name: openapi-lint
26-
uses: mhiew/redoc-lint-github-action@v2
26+
uses: mbowman100/swagger-validator-action@master
2727
with:
28-
args: 'public/swagger.yml --skip-rule operation-operationId'
28+
files: public/swagger.yml

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,17 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](http://keepachangelog.com/)
66
and this project adheres to [Semantic Versioning](http://semver.org/).
77

8+
## 1.20.2 - 2022-04-30
9+
10+
### Fixed
11+
- swagger lint action
12+
- When downloading a file with a `'` in the name it would save the file as blob
13+
- Fix for a rare race condition with masonry where tiles could end up overlapping in space page.
14+
- Fixes bug where same extractor shows up multiple times and all Clowder instances index db on reindex [#327](https://github.com/clowder-framework/clowder/issues/327)
15+
16+
### Changed
17+
- Changed `Enabled By SuperAdmin` to read `Enabled by Server Admin` [#344](https://github.com/clowder-framework/clowder/issues/344)
18+
819
## 1.20.1 - 2022-04-04
920

1021
### Fixed

app/services/mongodb/MongoDBQueueService.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ trait MongoDBQueueService {
9393

9494
// start pool to being processing queue actions
9595
def listen() = {
96-
if (queueTimer == null) {
96+
//only if this is the primary clowder instance
97+
if (queueTimer == null && configuration.getBoolean("clowder.primary").getOrElse(true)) {
9798
// TODO: Need to make these in a separate pool
9899
queueTimer = Akka.system().scheduler.schedule(0 seconds, 5 millis) {
99100
getNextQueuedAction match {

app/services/rabbitmq/RabbitMQMessageService.scala

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -128,24 +128,27 @@ class RabbitMQMessageService extends MessageService {
128128
new MsgConsumer(channel.get, event_filter.get)
129129
)
130130

131-
// Start actor to listen to extractor heartbeats
132-
Logger.info("Starting extractor heartbeat listener")
133-
// create fanout exchange if it doesn't already exist
134-
channel.get.exchangeDeclare("extractors", "fanout", true)
135-
// anonymous queue
136-
val heartbeatsQueue = channel.get.queueDeclare().getQueue
137-
// bind queue to exchange
138-
channel.get.queueBind(heartbeatsQueue, "extractors", "*")
139-
extractorsHeartbeats = Some(Akka.system.actorOf(
140-
Props(new ExtractorsHeartbeats(channel.get, heartbeatsQueue)), name = "ExtractorsHeartbeats"
141-
))
142-
Logger.debug("Initializing a MsgConsumer for the ExtractorsHeartbeats")
143-
channel.get.basicConsume(
144-
heartbeatsQueue,
145-
false, // do not auto ack
146-
"ExtractorsHeartbeats", // tagging the consumer is important if you want to stop it later
147-
new MsgConsumer(channel.get, extractorsHeartbeats.get)
148-
)
131+
//register new extractor only if this is the primary clowder instance
132+
if (configuration.getBoolean("clowder.primary").getOrElse(true)) {
133+
// Start actor to listen to extractor heartbeats
134+
Logger.info("Starting extractor heartbeat listener")
135+
// create fanout exchange if it doesn't already exist
136+
channel.get.exchangeDeclare("extractors", "fanout", true)
137+
// anonymous queue
138+
val heartbeatsQueue = channel.get.queueDeclare().getQueue
139+
// bind queue to exchange
140+
channel.get.queueBind(heartbeatsQueue, "extractors", "*")
141+
extractorsHeartbeats = Some(Akka.system.actorOf(
142+
Props(new ExtractorsHeartbeats(channel.get, heartbeatsQueue)), name = "ExtractorsHeartbeats"
143+
))
144+
Logger.debug("Initializing a MsgConsumer for the ExtractorsHeartbeats")
145+
channel.get.basicConsume(
146+
heartbeatsQueue,
147+
false, // do not auto ack
148+
"ExtractorsHeartbeats", // tagging the consumer is important if you want to stop it later
149+
new MsgConsumer(channel.get, extractorsHeartbeats.get)
150+
)
151+
}
149152

150153
// Setup Actor to submit new extractions to broker
151154
extractQueue = Some(Akka.system.actorOf(Props(new PublishDirectActor(channel = channel.get,

app/util/FileUtils.scala

Lines changed: 11 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -856,37 +856,20 @@ object FileUtils {
856856
//Download CONTENT-DISPOSITION encoding
857857
//
858858
def encodeAttachment(filename: String, userAgent: String) : String = {
859-
val filenameStar = if (userAgent.indexOf("MSIE") > -1) {
860-
URLEncoder.encode(filename, "UTF-8")
861-
} else if (userAgent.indexOf("Edge") > -1){
862-
MimeUtility.encodeText(filename
863-
.replaceAll(",","%2C")
864-
.replaceAll("\"","%22")
865-
.replaceAll("/","%2F")
866-
.replaceAll("=","%3D")
867-
.replaceAll("&","%26")
868-
.replaceAll(":","%3A")
869-
.replaceAll(";","%3B")
870-
.replaceAll("\\?","%3F")
871-
.replaceAll("\\*","%2A")
859+
val filenameStar = MimeUtility.encodeText(filename
860+
.replaceAll("%","%25")
861+
.replaceAll(" ","%20")
862+
.replaceAll("\"","%22")
863+
.replaceAll("'","%27")
864+
.replaceAll(",","%2C")
865+
.replaceAll("/","%2F")
866+
.replaceAll("=","%3D")
867+
.replaceAll(":","%3A")
868+
.replaceAll(";","%3B")
869+
.replaceAll("\\*","%2A")
872870
,"utf-8","Q")
873-
} else {
874-
MimeUtility.encodeText(filename
875-
.replaceAll("%","%25")
876-
.replaceAll(" ","%20")
877-
.replaceAll("\"","%22")
878-
.replaceAll(",","%2C")
879-
.replaceAll("/","%2F")
880-
.replaceAll("=","%3D")
881-
.replaceAll(":","%3A")
882-
.replaceAll(";","%3B")
883-
.replaceAll("\\*","%2A")
884-
,"utf-8","Q")
885-
}
886-
Logger.debug(userAgent + ": " + filenameStar)
887871

888872
//Return the complete attachment header info
889873
"attachment; filename*=UTF-8''" + filenameStar
890874
}
891-
892875
}

app/views/spaces/space.scala.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ <h3>@Messages("collections.title")</h3>
148148
match.masonry();
149149

150150
// layout Masonry again after all images have loaded
151-
imagesLoaded( '.tiled-image', function() {
151+
imagesLoaded( match, function() {
152152
match.masonry({
153153
itemSelector: '.tiled-image',
154154
columnWidth: '.post-box',

app/views/spaces/updateExtractors.scala.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ <h1>Space Extractors</h1>
3535
<th>Name</th>
3636
<th>Description</th>
3737
<th>Process Triggers</th>
38-
<th class="text-center" title="Extractors marked for execution in all spaces">Enabled By SuperAdmin</th>
39-
<th class="text-center" title="Follow selection in 'Enabled By SuperAdmin' column">Use Default</th>
38+
<th class="text-center" title="Extractors marked for execution in all spaces">Enabled by Server Admin</th>
39+
<th class="text-center" title="Follow selection in 'Enabled by Server Admin' column">Use Default</th>
4040
<th class="text-center" title="Always trigger execution in this space">Enable in Space</th>
4141
<th class="text-center" title="Never trigger execution in this space">Disable in Space</th>
4242
</tr>

conf/application.conf

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,13 @@ api.version="beta"
183183
# mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
184184
mongodbURI = "mongodb://127.0.0.1:27017/clowder"
185185

186+
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
187+
# Clowder Primary Instance
188+
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
189+
# This is required if there are multiple clowder instances. This config variable indicates
190+
# the primary clowder instance who takes care of special actions like registering new extractors,
191+
# indexing db on a reindex etc. The default value is true which means only one instance of clowder running.
192+
clowder.primary=true
186193

187194
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
188195
# RabbitMQ

doc/src/sphinx/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
author = 'Luigi Marini'
2323

2424
# The full version, including alpha/beta/rc tags
25-
release = '1.20.1'
25+
release = '1.20.2'
2626

2727

2828
# -- General configuration ---------------------------------------------------

docker/custom.conf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ smtp.host=${?SMTP_SERVER}
3737
service.byteStorage=services.filesystem.DiskByteStorageService
3838
service.byteStorage=${?CLOWDER_STORAGE}
3939

40+
#primary Clowder instance
41+
clowder.primary=true
42+
clowder.primary=${?CLOWDER_PRIMARY}
43+
4044
# location in case of services.filesystem.DiskByteStorageService
4145
clowder.diskStorage.path="/home/clowder/data"
4246
clowder.diskStorage.path=${?CLOWDER_DISKPATH}

0 commit comments

Comments
 (0)