This is an automated email from the ASF dual-hosted git repository.
solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git
The following commit(s) were added to refs/heads/master by this push:
new ad1762459 [OPENMEETINGS-2733] some Sonar issues are addressed
ad1762459 is described below
commit ad17624596ae060490e6fd083483770d20c85e6d
Author: Maxim Solodovnik <[email protected]>
AuthorDate: Wed May 18 20:50:07 2022 +0700
[OPENMEETINGS-2733] some Sonar issues are addressed
---
.../openmeetings/core/converter/BaseConverter.java | 57 ++---
.../core/converter/InterviewConverter.java | 99 ++++----
.../openmeetings/core/ldap/LdapLoginManager.java | 277 +++++++++++----------
.../openmeetings/core/remote/KurentoHandler.java | 156 ++++++------
.../openmeetings/core/remote/StreamProcessor.java | 61 +++--
.../apache/openmeetings/web/app/Application.java | 10 +-
.../web/common/tree/FileTreePanel.java | 3 +-
.../openmeetings/web/common/tree/FolderPanel.java | 11 +-
.../apache/openmeetings/web/room/RoomPanel.java | 2 +-
.../web/room/activities/ActivitiesPanel.java | 6 +
.../web/user/calendar/CalendarDialog.java | 4 +
11 files changed, 369 insertions(+), 317 deletions(-)
diff --git
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/BaseConverter.java
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/BaseConverter.java
index 736cc1163..582d1b2f5 100644
---
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/BaseConverter.java
+++
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/BaseConverter.java
@@ -179,39 +179,34 @@ public abstract class BaseConverter {
}
protected RecordingChunk waitForTheStream(long chunkId) {
- RecordingChunk chunk = chunkDao.get(chunkId);
+ RecordingChunk chunk;
try {
- if (chunk.getStreamStatus() != Status.STOPPED) {
- log.debug("### Chunk Stream not yet written to
disk {}", chunkId);
- long counter = 0;
- long maxTimestamp = 0;
- while (true) {
- log.trace("### Stream not yet written
Thread Sleep - {}", chunkId);
-
- chunk = chunkDao.get(chunkId);
-
- if (chunk.getStreamStatus() ==
Status.STOPPED) {
- printChunkInfo(chunk, "Stream
now written");
- log.debug("### Thread continue
... " );
- break;
- } else {
- File chunkFlv =
getRecordingChunk(chunk.getRecording().getRoomId(), chunk.getStreamName());
- if (chunkFlv.exists() &&
maxTimestamp < chunkFlv.lastModified()) {
- maxTimestamp =
chunkFlv.lastModified();
- }
- if (maxTimestamp +
TIME_TO_WAIT_FOR_FRAME < System.currentTimeMillis()) {
- log.debug("### long
time without any update, closing ... ");
-
chunk.setStreamStatus(Status.STOPPED);
- chunkDao.update(chunk);
- break;
- }
- }
- if (++counter % 1000 == 0) {
- printChunkInfo(chunk, "Still
waiting");
- }
-
- Thread.sleep(100L);
+ long counter = 0;
+ long maxTimestamp = 0;
+ while (true) {
+ chunk = chunkDao.get(chunkId);
+
+ if (chunk.getStreamStatus() == Status.STOPPED) {
+ printChunkInfo(chunk, "Stream now
written");
+ log.debug("### Chunk stopped,
unblocking thread ... " );
+ break;
+ }
+ File chunkFlv =
getRecordingChunk(chunk.getRecording().getRoomId(), chunk.getStreamName());
+ if (chunkFlv.exists() && maxTimestamp <
chunkFlv.lastModified()) {
+ maxTimestamp = chunkFlv.lastModified();
}
+ if (maxTimestamp + TIME_TO_WAIT_FOR_FRAME <
System.currentTimeMillis()) {
+ log.debug("### long time without any
update, closing ... ");
+ chunk.setStreamStatus(Status.STOPPED);
+ chunkDao.update(chunk);
+ break;
+ }
+ if (++counter % 1000 == 0) {
+ printChunkInfo(chunk, "Still waiting");
+ }
+
+ log.trace("### Stream not yet written Thread
Sleep - {}", chunkId);
+ Thread.sleep(100L);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
diff --git
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/InterviewConverter.java
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/InterviewConverter.java
index 83de973a4..6b46cb761 100644
---
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/InterviewConverter.java
+++
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/InterviewConverter.java
@@ -228,56 +228,65 @@ public class InterviewConverter extends BaseConverter
implements IRecordingConve
return pStart;
}
- private static List<String> getFinalArgs(List<String> pods, File wav,
int w) throws IOException {
+ private static void fillFinalArgsOnlyPod(List<String> args, String pod,
File wav) throws IOException {
+ args.add("-i");
+ args.add(pod);
+ args.add("-i");
+ args.add(wav.getCanonicalPath());
+ args.add("-map");
+ args.add("0:v");
+ }
+
+ private static void fillFinalArgsGrid(List<String> args, List<String>
pods, File wav, int w) throws IOException {
final int numPods = pods.size();
- List<String> args = new ArrayList<>();
- if (numPods == 1) {
- args.add("-i");
- args.add(pods.get(0));
+ /* Creating grid
+ * ffmpeg -i top_l.mp4 -i top_r.mp4 -i bottom_l.mp4 -i
bottom_r.mp4 -i audio.mp4 \
+ * -filter_complex
"[0:v][1:v]hstack=inputs=2[t];[2:v][3:v]hstack=inputs=2[b];[t][b]vstack=inputs=2[v]"
\
+ * -map "[v]" -map 4:a -c:a copy -shortest output.mp4
+ */
+ StringBuilder cols = new StringBuilder();
+ StringBuilder rows = new StringBuilder();
+ int colCount = 0;
+ int j = 0;
+ for (int i = 0; i < numPods; ++i) {
+ colCount++;
args.add("-i");
- args.add(wav.getCanonicalPath());
- args.add("-map");
- args.add("0:v");
- } else {
- /* Creating grid
- * ffmpeg -i top_l.mp4 -i top_r.mp4 -i bottom_l.mp4 -i
bottom_r.mp4 -i audio.mp4 \
- * -filter_complex
"[0:v][1:v]hstack=inputs=2[t];[2:v][3:v]hstack=inputs=2[b];[t][b]vstack=inputs=2[v]"
\
- * -map "[v]" -map 4:a -c:a copy -shortest
output.mp4
- */
- StringBuilder cols = new StringBuilder();
- StringBuilder rows = new StringBuilder();
- int colCount = 0;
- int j = 0;
- for (int i = 0; i < numPods; ++i) {
- colCount++;
- args.add("-i");
- args.add(pods.get(i));
- cols.append('[').append(i).append(":v]");
- if (i != 0 && colCount % w == 0) {
-
cols.append("hstack=inputs=").append(colCount);
- if (j == 0 && i == numPods - 1) {
- cols.append("[v]");
- } else {
-
cols.append("[c").append(j).append("];");
- }
- rows.append("[c").append(j).append(']');
- j++;
- colCount = 0;
+ args.add(pods.get(i));
+ cols.append('[').append(i).append(":v]");
+ if (i != 0 && colCount % w == 0) {
+ cols.append("hstack=inputs=").append(colCount);
+ if (j == 0 && i == numPods - 1) {
+ cols.append("[v]");
+ } else {
+
cols.append("[c").append(j).append("];");
}
- if (i == numPods - 1) {
- if (j > 1) {
-
rows.append("vstack=inputs=").append(j).append("[out];[out]pad=ceil(iw/2)*2:ceil(ih/2)*2[v]");
- } else {
- rows.setLength(0);
- }
+ rows.append("[c").append(j).append(']');
+ j++;
+ colCount = 0;
+ }
+ if (i == numPods - 1) {
+ if (j > 1) {
+
rows.append("vstack=inputs=").append(j).append("[out];[out]pad=ceil(iw/2)*2:ceil(ih/2)*2[v]");
+ } else {
+ rows.setLength(0);
}
}
- args.add("-i");
- args.add(wav.getCanonicalPath());
- args.add("-filter_complex");
- args.add(cols.append(rows).toString());
- args.add("-map");
- args.add("[v]");
+ }
+ args.add("-i");
+ args.add(wav.getCanonicalPath());
+ args.add("-filter_complex");
+ args.add(cols.append(rows).toString());
+ args.add("-map");
+ args.add("[v]");
+ }
+
+ private static List<String> getFinalArgs(List<String> pods, File wav,
int w) throws IOException {
+ final int numPods = pods.size();
+ List<String> args = new ArrayList<>();
+ if (numPods == 1) {
+ fillFinalArgsOnlyPod(args, pods.get(0), wav);
+ } else {
+ fillFinalArgsGrid(args, pods, wav, w);
}
args.add("-map");
args.add(numPods + ":a");
diff --git
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/ldap/LdapLoginManager.java
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/ldap/LdapLoginManager.java
index 1d9ff93a7..e0e7804b9 100644
---
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/ldap/LdapLoginManager.java
+++
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/ldap/LdapLoginManager.java
@@ -37,6 +37,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.Optional;
import java.util.Properties;
import org.apache.commons.io.FileUtils;
@@ -53,6 +54,7 @@ import
org.apache.directory.api.ldap.model.message.AliasDerefMode;
import org.apache.directory.api.ldap.model.message.SearchRequestImpl;
import org.apache.directory.api.ldap.model.message.SearchScope;
import org.apache.directory.api.ldap.model.name.Dn;
+import org.apache.directory.api.ldap.model.name.Rdn;
import org.apache.directory.ldap.client.api.EntryCursorImpl;
import org.apache.directory.ldap.client.api.LdapConnection;
import org.apache.directory.ldap.client.api.LdapNetworkConnection;
@@ -166,6 +168,53 @@ public class LdapLoginManager {
return getStringAttr(config, entry, CONFIGKEY_LDAP_KEY_LOGIN,
LDAP_KEY_LOGIN);
}
+ private User doLogin(LdapWorker w, String login, String passwd, Long
domainId) throws Exception {
+ User u = null;
+ boolean authenticated = true;
+ Dn userDn = null;
+ Entry entry = null;
+ switch (w.options.type) {
+ case SEARCHANDBIND:
+ Map.Entry<Dn, Entry> search = searchAndBind(w,
login, passwd);
+ userDn = search.getKey();
+ entry = search.getValue();
+ break;
+ case SIMPLEBIND:
+ userDn = new Dn(String.format(w.options.userDn,
login));
+ w.conn.bind(userDn, passwd);
+ break;
+ case NONE:
+ default:
+ authenticated = false;
+ break;
+ }
+ u = authenticated ? userDao.getByLogin(login, Type.LDAP,
domainId) : userDao.login(login, passwd);
+ log.debug("getByLogin:: authenticated ? {}, login = '{}',
domain = {}, user = {}", authenticated, login, domainId, u);
+ if (u == null && Provisionning.AUTOCREATE != w.options.prov) {
+ log.error("User not found in OM DB and
Provisionning.AUTOCREATE was not set");
+ throw BAD_CREDENTIALS;
+ }
+ if (authenticated && entry == null) {
+ if (w.options.useAdminForAttrs) {
+ bindAdmin(w.conn, w.options);
+ }
+ entry = w.conn.lookup(userDn);
+ }
+ switch (w.options.prov) {
+ case AUTOUPDATE, AUTOCREATE:
+ u = w.getUser(entry, u);
+ if (w.options.syncPasswd) {
+ u.updatePassword(passwd);
+ }
+ u = userDao.update(u, null);
+ u = w.setUserPicture(entry, u);
+ break;
+ case NONE:
+ default:
+ break;
+ }
+ return u;
+ }
/**
* Ldap Login
*
@@ -188,49 +237,7 @@ public class LdapLoginManager {
try (LdapWorker w = new LdapWorker(domainId)) {
String login = w.options.useLowerCase ?
inLogin.toLowerCase(Locale.ROOT) : inLogin;
- boolean authenticated = true;
- Dn userDn = null;
- Entry entry = null;
- switch (w.options.type) {
- case SEARCHANDBIND:
- Map.Entry<Dn, Entry> search =
searchAndBind(w, login, passwd);
- userDn = search.getKey();
- entry = search.getValue();
- break;
- case SIMPLEBIND:
- userDn = new
Dn(String.format(w.options.userDn, login));
- w.conn.bind(userDn, passwd);
- break;
- case NONE:
- default:
- authenticated = false;
- break;
- }
- u = authenticated ? userDao.getByLogin(login,
Type.LDAP, domainId) : userDao.login(login, passwd);
- log.debug("getByLogin:: authenticated ? {}, login =
'{}', domain = {}, user = {}", authenticated, login, domainId, u);
- if (u == null && Provisionning.AUTOCREATE !=
w.options.prov) {
- log.error("User not found in OM DB and
Provisionning.AUTOCREATE was not set");
- throw BAD_CREDENTIALS;
- }
- if (authenticated && entry == null) {
- if (w.options.useAdminForAttrs) {
- bindAdmin(w.conn, w.options);
- }
- entry = w.conn.lookup(userDn);
- }
- switch (w.options.prov) {
- case AUTOUPDATE, AUTOCREATE:
- u = w.getUser(entry, u);
- if (w.options.syncPasswd) {
- u.updatePassword(passwd);
- }
- u = userDao.update(u, null);
- u = w.setUserPicture(entry, u);
- break;
- case NONE:
- default:
- break;
- }
+ u = doLogin(w, login, passwd, domainId);
} catch (LdapAuthenticationException ae) {
log.error("Not authenticated.", ae);
throw BAD_CREDENTIALS;
@@ -342,68 +349,94 @@ public class LdapLoginManager {
conn = new LdapNetworkConnection(options.host,
options.port, options.secure);
}
- public User setUserPicture(Entry entry, User inUser) throws
LdapInvalidAttributeValueException {
- Attribute a = getAttr(config, entry,
CONFIGKEY_LDAP_KEY_PICTURE, "");
+ private User updatePic(User inUser, InputStream is, StoredFile
sf) {
User u = inUser;
- if (a != null) {
- Value val = a.get();
- if (val != null && val.getBytes() != null) {
- InputStream is = new
ByteArrayInputStream(val.getBytes());
- StoredFile sf = new
StoredFile("picture", is);
- if (sf.isImage()) {
- Path tempImage = null;
- try {
- tempImage =
Files.createTempFile("omLdap", "img");
-
FileUtils.copyToFile(is, tempImage.toFile());
-
imageConverter.convertImageUserProfile(tempImage.toFile(), inUser.getId(),
sf.isAsIs());
- u =
userDao.get(inUser.getId());
- } catch (Exception e) {
- log.error("Unable to
store binary image from LDAP", e);
- } finally {
- if (tempImage != null) {
- try {
-
Files.deleteIfExists(tempImage);
- } catch
(IOException e) {
-
log.error("Unexpected error while clean-up", e);
- }
- }
- }
- } else {
-
u.setPictureUri(val.getString());
+ Path tempImage = null;
+ try {
+ tempImage = Files.createTempFile("omLdap",
"img");
+ FileUtils.copyToFile(is, tempImage.toFile());
+
imageConverter.convertImageUserProfile(tempImage.toFile(), inUser.getId(),
sf.isAsIs());
+ u = userDao.get(inUser.getId());
+ } catch (Exception e) {
+ log.error("Unable to store binary image from
LDAP", e);
+ } finally {
+ if (tempImage != null) {
+ try {
+ Files.deleteIfExists(tempImage);
+ } catch (IOException e) {
+ log.error("Unexpected error
while clean-up", e);
}
}
}
- if (Strings.isEmpty(u.getPictureUri()) &&
!Strings.isEmpty(options.pictureUri)) {
- u.setPictureUri(options.pictureUri);
+ return u;
+ }
+
+ public User setUserPicture(Entry entry, User inUser) throws
LdapInvalidAttributeValueException {
+ User user = Optional.ofNullable(getAttr(config, entry,
CONFIGKEY_LDAP_KEY_PICTURE, ""))
+ .map(Attribute::get)
+ .filter(val -> val != null &&
val.getBytes() != null)
+ .map(val -> {
+ User u = inUser;
+ InputStream is = new
ByteArrayInputStream(val.getBytes());
+ StoredFile sf = new
StoredFile("picture", is);
+ if (sf.isImage()) {
+ u = updatePic(inUser,
is, sf);
+ } else {
+
u.setPictureUri(val.getString());
+ }
+ return u;
+ }).orElse(inUser);
+ if (Strings.isEmpty(user.getPictureUri()) &&
!Strings.isEmpty(options.pictureUri)) {
+ user.setPictureUri(options.pictureUri);
+ }
+ return userDao.update(user, null);
+ }
+
+ private User create(Entry entry) throws
LdapInvalidAttributeValueException {
+ User u = getNewUserInstance(null);
+ u.setType(Type.LDAP);
+ u.getRights().remove(Right.LOGIN);
+ u.setDomainId(domainId);
+ Group g = groupDao.get(getDefaultGroup());
+ if (g != null) {
+ u.addGroup(g);
+ }
+ String login = getLogin(config, entry);
+ if (ldapCfg.getAddDomainToUserName()) {
+ login = login + "@" + ldapCfg.getDomain();
+ }
+ if (options.useLowerCase) {
+ login = login.toLowerCase(Locale.ROOT);
+ }
+ u.setLogin(login);
+ u.setShowContactDataToContacts(true);
+ u.setAddress(new Address());
+ return u;
+ }
+
+ private List<Dn> getGroupDns(Entry entry, User u) throws
IOException, LdapException, CursorException {
+ List<Dn> groups = new ArrayList<>();
+ if (GroupMode.ATTRIBUTE == options.groupMode) {
+ Attribute attr = getAttr(config, entry,
CONFIGKEY_LDAP_KEY_GROUP, LDAP_KEY_GROUP);
+ if (attr != null) {
+ for (Value v : attr) {
+ groups.add(new
Dn(v.getString()));
+ }
+ }
+ } else if (GroupMode.QUERY == options.groupMode) {
+ Dn baseDn = new Dn(options.searchBase);
+ String searchQ =
String.format(options.groupQuery, u.getLogin());
+ fillGroups(baseDn, searchQ, groups);
}
- return userDao.update(u, null);
+ return groups;
}
- public User getUser(Entry entry, User u) throws LdapException,
CursorException, OmException, IOException {
+ public User getUser(Entry entry, User user) throws
LdapException, CursorException, OmException, IOException {
if (entry == null) {
log.error("LDAP entry is null, search or lookup
by Dn failed");
throw BAD_CREDENTIALS;
}
- if (u == null) {
- u = getNewUserInstance(null);
- u.setType(Type.LDAP);
- u.getRights().remove(Right.LOGIN);
- u.setDomainId(domainId);
- Group g = groupDao.get(getDefaultGroup());
- if (g != null) {
- u.addGroup(g);
- }
- String login = getLogin(config, entry);
- if (ldapCfg.getAddDomainToUserName()) {
- login = login + "@" +
ldapCfg.getDomain();
- }
- if (options.useLowerCase) {
- login = login.toLowerCase(Locale.ROOT);
- }
- u.setLogin(login);
- u.setShowContactDataToContacts(true);
- u.setAddress(new Address());
- }
+ User u = user == null ? create(entry) : user;
u.setLastname(getStringAttr(config, entry,
CONFIGKEY_LDAP_KEY_LASTNAME, LDAP_KEY_LASTNAME));
u.setFirstname(getStringAttr(config, entry,
CONFIGKEY_LDAP_KEY_FIRSTNAME, LDAP_KEY_FIRSTNAME));
u.getAddress().setEmail(getStringAttr(config, entry,
CONFIGKEY_LDAP_KEY_MAIL, LDAP_KEY_MAIL));
@@ -420,42 +453,30 @@ public class LdapLoginManager {
}
u.setTimeZoneId(getTimeZone(tz).getID());
- List<Dn> groups = new ArrayList<>();
- if (GroupMode.ATTRIBUTE == options.groupMode) {
- Attribute attr = getAttr(config, entry,
CONFIGKEY_LDAP_KEY_GROUP, LDAP_KEY_GROUP);
- if (attr != null) {
- for (Value v : attr) {
- groups.add(new
Dn(v.getString()));
- }
- }
- } else if (GroupMode.QUERY == options.groupMode) {
- Dn baseDn = new Dn(options.searchBase);
- String searchQ =
String.format(options.groupQuery, u.getLogin());
- fillGroups(baseDn, searchQ, groups);
- }
- for (Dn g : groups) {
- String name = g.getRdn().getValue();
- if (!Strings.isEmpty(name)) {
- Group o = groupDao.get(name);
- boolean found = false;
- if (o == null) {
- o = new Group();
- o.setName(name);
- o = groupDao.update(o,
u.getId());
- } else {
- for (GroupUser ou :
u.getGroupUsers()) {
- if
(ou.getGroup().getName().equals(name)) {
- found = true;
- break;
+ getGroupDns(entry, u).stream()
+ .map(Dn::getRdn)
+ .map(Rdn::getValue)
+ .filter(name -> !Strings.isEmpty(name))
+ .forEach(name -> {
+ Group o = groupDao.get(name);
+ boolean found = false;
+ if (o == null) {
+ o = new Group();
+ o.setName(name);
+ o = groupDao.update(o,
u.getId());
+ } else {
+ for (GroupUser ou :
u.getGroupUsers()) {
+ if
(ou.getGroup().getName().equals(name)) {
+ found =
true;
+ break;
+ }
}
}
- }
- if (!found) {
- u.addGroup(o);
- log.debug("Going to add user to
group:: {}", name);
- }
- }
- }
+ if (!found) {
+ u.addGroup(o);
+ log.debug("Going to add
user to group:: {}", name);
+ }
+ });
return u;
}
diff --git
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
index aa4d6af87..f1d62de9c 100644
---
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
+++
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
@@ -427,86 +427,100 @@ public class KurentoHandler {
scheduler =
Executors.newScheduledThreadPool(watchThreadCount);
}
- @Override
- public void onEvent(ObjectCreatedEvent evt) {
- log.debug("Kurento::ObjectCreated -> {}, source {}",
evt.getObject(), evt.getSource());
- if (evt.getObject() instanceof MediaPipeline) {
- // room created
- final String roid = evt.getObject().getId();
- scheduler.schedule(() -> {
- if (client == null) {
+ private void checkPipeline(String roomOid) {
+ scheduler.schedule(() -> {
+ if (client == null) {
+ return;
+ }
+ // still alive
+ MediaPipeline pipe = client.getById(roomOid,
MediaPipeline.class);
+ Map<String, String> tags = tagsAsMap(pipe);
+ try {
+ final String inKuid =
tags.get(TAG_KUID);
+ if (inKuid != null &&
ignoredKuids.contains(inKuid)) {
return;
}
- // still alive
- MediaPipeline pipe =
client.getById(roid, MediaPipeline.class);
- Map<String, String> tags =
tagsAsMap(pipe);
- try {
- final String inKuid =
tags.get(TAG_KUID);
- if (inKuid != null &&
ignoredKuids.contains(inKuid)) {
- return;
- }
- if (validTestPipeline(tags)) {
- return;
- }
- if (kuid.equals(inKuid)) {
- KStream stream =
streamProcessor.getByUid(tags.get(TAG_STREAM_UID));
- if (stream != null) {
- if
(stream.getRoomId().equals(Long.valueOf(tags.get(TAG_ROOM)))
-
&& stream.getPipeline().getId().equals(pipe.getId()))
- {
- return;
- } else {
-
stream.release();
- }
+ if (validTestPipeline(tags)) {
+ return;
+ }
+ if (kuid.equals(inKuid)) {
+ KStream stream =
streamProcessor.getByUid(tags.get(TAG_STREAM_UID));
+ if (stream != null) {
+ if
(stream.getRoomId().equals(Long.valueOf(tags.get(TAG_ROOM)))
+ &&
stream.getPipeline().getId().equals(pipe.getId()))
+ {
+ return;
+ } else {
+
stream.release();
}
}
- } catch (Exception e) {
- log.warn("Unexpected error
while checking MediaPipeline {}, tags: {}", pipe.getId(), tags, e);
}
- log.warn("Invalid MediaPipeline {}
detected, will be dropped, tags: {}", pipe.getId(), tags);
- pipe.release();
- }, objCheckTimeout, MILLISECONDS);
- } else if (evt.getObject() instanceof Endpoint
curPoint) {
- // endpoint created
- final String eoid = curPoint.getId();
- Class<? extends Endpoint> clazz = null;
- if (curPoint instanceof WebRtcEndpoint) {
- clazz = WebRtcEndpoint.class;
- } else if (curPoint instanceof
RecorderEndpoint) {
- clazz = RecorderEndpoint.class;
- } else if (curPoint instanceof PlayerEndpoint) {
- clazz = PlayerEndpoint.class;
- } else if (curPoint instanceof RtpEndpoint) {
- clazz = RtpEndpoint.class;
+ } catch (Exception e) {
+ log.warn("Unexpected error while
checking MediaPipeline {}, tags: {}", pipe.getId(), tags, e);
}
- final Class<? extends Endpoint> fClazz = clazz;
- scheduler.schedule(() -> {
- if (client == null || fClazz == null) {
+ log.warn("Invalid MediaPipeline {} detected,
will be dropped, tags: {}", pipe.getId(), tags);
+ pipe.release();
+ }, objCheckTimeout, MILLISECONDS);
+ }
+
+ private Class<? extends Endpoint> getEndpointClass(Endpoint
curPoint) {
+ Class<? extends Endpoint> clazz = null;
+ if (curPoint instanceof WebRtcEndpoint) {
+ clazz = WebRtcEndpoint.class;
+ } else if (curPoint instanceof RecorderEndpoint) {
+ clazz = RecorderEndpoint.class;
+ } else if (curPoint instanceof PlayerEndpoint) {
+ clazz = PlayerEndpoint.class;
+ } else if (curPoint instanceof RtpEndpoint) {
+ clazz = RtpEndpoint.class;
+ }
+ return clazz;
+ }
+
+ private void checkEndpoint(String endpointOid, Class<? extends
Endpoint> clazz) {
+ scheduler.schedule(() -> {
+ if (client == null || clazz == null) {
+ return;
+ }
+ // still alive
+ Endpoint point = client.getById(eoid, clazz);
+ Map<String, String> tags = tagsAsMap(point);
+ try {
+ Map<String, String> pipeTags =
tagsAsMap(point.getMediaPipeline());
+ final String inKuid =
pipeTags.get(TAG_KUID);
+ if (ignoredKuids.contains(inKuid)) {
return;
}
- // still alive
- Endpoint point = client.getById(eoid,
fClazz);
- Map<String, String> tags =
tagsAsMap(point);
- try {
- Map<String, String> pipeTags =
tagsAsMap(point.getMediaPipeline());
- final String inKuid =
pipeTags.get(TAG_KUID);
- if
(ignoredKuids.contains(inKuid)) {
- return;
- }
- if
(validTestPipeline(pipeTags)) {
- return;
- }
- KStream stream =
streamProcessor.getByUid(tags.get("outUid"));
-
log.debug("Kurento::ObjectCreated -> New Endpoint {} detected, tags: {},
kStream: {}", point.getId(), tags, stream);
- if (stream != null &&
stream.contains(tags.get("uid"))) {
- return;
- }
- } catch (Exception e) {
- log.warn("Unexpected error
while checking Endpoint {}, tags: {}", point.getId(), tags, e);
+ if (validTestPipeline(pipeTags)) {
+ return;
}
- log.warn("Invalid Endpoint {} detected,
will be dropped, tags: {}", point.getId(), tags);
- point.release();
- }, objCheckTimeout, MILLISECONDS);
+ KStream stream =
streamProcessor.getByUid(tags.get("outUid"));
+ log.debug("Kurento::ObjectCreated ->
New Endpoint {} detected, tags: {}, kStream: {}", point.getId(), tags, stream);
+ if (stream != null &&
stream.contains(tags.get("uid"))) {
+ return;
+ }
+ } catch (Exception e) {
+ log.warn("Unexpected error while
checking Endpoint {}, tags: {}", point.getId(), tags, e);
+ }
+ log.warn("Invalid Endpoint {} detected, will be
dropped, tags: {}", point.getId(), tags);
+ point.release();
+ }, objCheckTimeout, MILLISECONDS);
+ }
+
+ @Override
+ public void onEvent(ObjectCreatedEvent evt) {
+ log.debug("Kurento::ObjectCreated -> {}, source {}",
evt.getObject(), evt.getSource());
+ if (evt.getObject() instanceof MediaPipeline) {
+ // room created
+ final String roid = evt.getObject().getId();
+
+ checkPipeline(roid);
+ } else if (evt.getObject() instanceof Endpoint
curPoint) {
+ // endpoint created
+ final String eoid = curPoint.getId();
+ final Class<? extends Endpoint> clazz =
getEndpointClass(curPoint);
+
+ checkEndpoint(eoid, clazz);
}
}
diff --git
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
index d99edb9e9..2ef4b79f0 100644
---
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
+++
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
@@ -85,25 +85,14 @@ public class StreamProcessor implements IStreamProcessor {
@TimedApplication
void onMessage(Client c, final String cmdId, JSONObject msg) {
final String uid = msg.optString("uid");
- StreamDesc sd;
Optional<StreamDesc> osd;
log.debug("Incoming message from user with ID '{}': {}",
c.getUserId(), msg);
switch (cmdId) {
case "devicesAltered":
- sd = c.getStream(uid);
- if (sd != null) {
- if (!msg.getBoolean("audio") &&
c.hasActivity(Activity.AUDIO)) {
- c.remove(Activity.AUDIO);
- }
- if (!msg.getBoolean("video") &&
c.hasActivity(Activity.VIDEO)) {
- c.remove(Activity.VIDEO);
- }
- sd.setActivities();
- WebSocketHelper.sendRoom(new
TextRoomMessage(c.getRoomId(), cm.update(c), RoomMessage.Type.RIGHT_UPDATED,
c.getUid()));
- }
+ onDeviceAltered(c, uid, msg);
break;
case "toggleActivity":
- toggleActivity(c,
Activity.valueOf(msg.getString("activity")));
+ onToggleActivity(c,
Activity.valueOf(msg.getString("activity")));
break;
case "broadcastStarted":
streamProcessorActions.handleBroadcastStarted(c, uid, msg);
@@ -124,19 +113,7 @@ public class StreamProcessor implements IStreamProcessor {
}
break;
case "wannaRecord":
- osd = c.getScreenStream();
- if (recordingAllowed(c)) {
- Room r = c.getRoom();
- if (Room.Type.INTERVIEW == r.getType())
{
- log.warn("This shouldn't be
called for interview room");
- break;
- }
- boolean sharing = isSharing(r.getId());
- startSharing(c, osd, msg,
Activity.RECORD);
- if (sharing) {
- startRecording(c);
- }
- }
+ onWannaRecord(c, msg);
break;
case "pauseSharing":
pauseSharing(c, uid);
@@ -153,6 +130,36 @@ public class StreamProcessor implements IStreamProcessor {
}
}
+ private void onDeviceAltered(Client c, String uid, JSONObject msg) {
+ StreamDesc sd = c.getStream(uid);
+ if (sd != null) {
+ if (!msg.getBoolean("audio") &&
c.hasActivity(Activity.AUDIO)) {
+ c.remove(Activity.AUDIO);
+ }
+ if (!msg.getBoolean("video") &&
c.hasActivity(Activity.VIDEO)) {
+ c.remove(Activity.VIDEO);
+ }
+ sd.setActivities();
+ WebSocketHelper.sendRoom(new
TextRoomMessage(c.getRoomId(), cm.update(c), RoomMessage.Type.RIGHT_UPDATED,
c.getUid()));
+ }
+ }
+
+ private void onWannaRecord(Client c, JSONObject msg) {
+ Optional<StreamDesc> osd = c.getScreenStream();
+ if (recordingAllowed(c)) {
+ Room r = c.getRoom();
+ if (Room.Type.INTERVIEW == r.getType()) {
+ log.warn("This shouldn't be called for
interview room");
+ return;
+ }
+ boolean sharing = isSharing(r.getId());
+ startSharing(c, osd, msg, Activity.RECORD);
+ if (sharing) {
+ startRecording(c);
+ }
+ }
+ }
+
/**
* Method to start broadcasting. Externalised for mocking purpose to
be able to
* prevent calling webRTC methods.
@@ -187,7 +194,7 @@ public class StreamProcessor implements IStreamProcessor {
}
@TimedApplication
- public void toggleActivity(Client c, Activity a) {
+ public void onToggleActivity(Client c, Activity a) {
log.info("PARTICIPANT {}: trying to toggle activity {}", c, a);
if (!kHandler.isConnected()) {
return;
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
index 3e4283938..3ec486d72 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
@@ -287,12 +287,10 @@ public class Application extends
AuthenticatedWebApplication implements IApplica
@Override
public void onEndRequest(RequestCycle cycle) {
Response resp = cycle.getResponse();
- if (resp instanceof WebResponse wresp) {
- if (wresp.isHeaderSupported()) {
-
wresp.setHeader("X-XSS-Protection", "1; mode=block");
-
wresp.setHeader("Strict-Transport-Security", "max-age=31536000;
includeSubDomains; preload");
-
wresp.setHeader("X-Content-Type-Options", "nosniff");
- }
+ if (resp instanceof WebResponse wresp &&
wresp.isHeaderSupported()) {
+ wresp.setHeader("X-XSS-Protection", "1;
mode=block");
+
wresp.setHeader("Strict-Transport-Security", "max-age=31536000;
includeSubDomains; preload");
+
wresp.setHeader("X-Content-Type-Options", "nosniff");
}
}
});
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
index 5f6954fe9..89cc385ef 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
@@ -190,8 +190,7 @@ public abstract class FileTreePanel extends Panel {
@Override
public void onDrop(AjaxRequestTarget target, Component
component) {
Object o = component.getDefaultModelObject();
- if (o instanceof BaseFileItem) {
- BaseFileItem f = (BaseFileItem)o;
+ if (o instanceof BaseFileItem f) {
if (isSelected(f)) {
deleteAll(target);
} else {
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
index 5909d3bb7..b0057ab6d 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
@@ -110,8 +110,8 @@ public class FolderPanel extends Panel implements
IDraggableListener, IDroppable
protected void onSubmit(AjaxRequestTarget target) {
super.onSubmit(target);
f.setName(getEditor().getModelObject());
- if (f instanceof Recording) {
- recDao.update((Recording)f);
+ if (f instanceof Recording rec) {
+ recDao.update(rec);
} else {
fileDao.update((FileItem)f);
}
@@ -153,8 +153,8 @@ public class FolderPanel extends Panel implements
IDraggableListener, IDroppable
f.setOwnerId(p.getOwnerId());
f.setRoomId(p.getRoomId());
f.setGroupId(p.getGroupId());
- if (f instanceof Recording) {
- recDao.update((Recording)f);
+ if (f instanceof Recording rec) {
+ recDao.update(rec);
} else {
fileDao.update((FileItem)f);
}
@@ -216,9 +216,8 @@ public class FolderPanel extends Panel implements
IDraggableListener, IDroppable
@Override
public void onDrop(AjaxRequestTarget target, Component component) {
Object o = component.getDefaultModelObject();
- if (o instanceof BaseFileItem) {
+ if (o instanceof BaseFileItem f) {
BaseFileItem p = (BaseFileItem)getDefaultModelObject();
- BaseFileItem f = (BaseFileItem)o;
if (treePanel.isSelected(f)) {
moveAll(target, p);
} else {
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
index 821ab685d..78e99af87 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
@@ -796,7 +796,7 @@ public class RoomPanel extends BasePanel {
if (!c.getRoom().isAudioOnly()
&& !activityAllowed(c, Client.Activity.VIDEO, c.getRoom())) {
c.allow(Room.Right.VIDEO);
}
-
streamProcessor.toggleActivity(c, c.getRoom().isAudioOnly()
+
streamProcessor.onToggleActivity(c, c.getRoom().isAudioOnly()
?
Client.Activity.AUDIO
:
Client.Activity.AUDIO_VIDEO);
}
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java
index d2c314de4..a631f0c9a 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java
@@ -223,6 +223,8 @@ public class ActivitiesPanel extends Panel {
case REQ_RIGHT_HAVE_QUESTION:
text = String.format(fmt, name,
getString("activities.ask.question"), df.format(a.getCreated()));
break;
+ default:
+ break;
}
final JSONObject aobj = new JSONObject()
.put("id", a.getId())
@@ -244,6 +246,8 @@ public class ActivitiesPanel extends Panel {
aobj.put("accept", false);
aobj.put("decline", false);
break;
+ default:
+ break;
}
handler.appendJavaScript(new
StringBuilder("Activities.add(").append(aobj.toString()).append(");"));
}
@@ -269,6 +273,8 @@ public class ActivitiesPanel extends Panel {
break;
case ROOM_ENTER, ROOM_EXIT:
cls.append("bg-white auto-clean");
+ default:
+ break;
}
return cls;
}
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarDialog.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarDialog.java
index d7caa3a30..83715ecb9 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarDialog.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarDialog.java
@@ -358,6 +358,8 @@ public class CalendarDialog extends Modal<OmCalendar> {
target.add(delete.setVisible(isOwner(c)));
}
target.add(save.setVisible(isOwner(c)));
+ default:
+ break;
}
}
@@ -465,6 +467,8 @@ public class CalendarDialog extends Modal<OmCalendar> {
gcal.setEnabled(false);
setGCalVisibility(calendar);
break;
+ default:
+ break;
}
}