diff --git a/java/com.github.branflake2267.gwt-maps-api/.project b/java/com.github.branflake2267.gwt-maps-api/.project index 5447b2c01ac..adb1377b722 100644 --- a/java/com.github.branflake2267.gwt-maps-api/.project +++ b/java/com.github.branflake2267.gwt-maps-api/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.google.gwt.ajaxloader/.project b/java/com.google.gwt.ajaxloader/.project index 29bd272350b..a4a980a65d1 100644 --- a/java/com.google.gwt.ajaxloader/.project +++ b/java/com.google.gwt.ajaxloader/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.google.gwt.dev/.project b/java/com.google.gwt.dev/.project index 07fec1d03ba..254d973cede 100644 --- a/java/com.google.gwt.dev/.project +++ b/java/com.google.gwt.dev/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.google.gwt.servlet/.project b/java/com.google.gwt.servlet/.project index 4019bf222f8..432f3f92371 100644 --- a/java/com.google.gwt.servlet/.project +++ b/java/com.google.gwt.servlet/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.google.gwt.user/.project b/java/com.google.gwt.user/.project index 5a611228710..398ee1616d5 100644 --- a/java/com.google.gwt.user/.project +++ b/java/com.google.gwt.user/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.googlecode.java-diff-utils.test/.project b/java/com.googlecode.java-diff-utils.test/.project index 30644bdeb0a..2ad1c2d4652 100755 --- a/java/com.googlecode.java-diff-utils.test/.project +++ b/java/com.googlecode.java-diff-utils.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.googlecode.java-diff-utils/.project b/java/com.googlecode.java-diff-utils/.project index 8da7abc7b55..05c89df62e7 100755 --- a/java/com.googlecode.java-diff-utils/.project +++ b/java/com.googlecode.java-diff-utils/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.googlecode.mgwt/.project b/java/com.googlecode.mgwt/.project index 64cd0a55b18..c174cdc7b09 100644 --- a/java/com.googlecode.mgwt/.project +++ b/java/com.googlecode.mgwt/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.barbados.resultimport.test/.project b/java/com.sap.sailing.barbados.resultimport.test/.project index 000b089d063..e87ff532c2a 100644 --- a/java/com.sap.sailing.barbados.resultimport.test/.project +++ b/java/com.sap.sailing.barbados.resultimport.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.barbados.resultimport/.project b/java/com.sap.sailing.barbados.resultimport/.project index 82a6c202035..b951ba424f4 100644 --- a/java/com.sap.sailing.barbados.resultimport/.project +++ b/java/com.sap.sailing.barbados.resultimport/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.competitorimport/.project b/java/com.sap.sailing.competitorimport/.project index 4371e50fca6..562e9855501 100644 --- a/java/com.sap.sailing.competitorimport/.project +++ b/java/com.sap.sailing.competitorimport/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.dashboards.gwt/.project b/java/com.sap.sailing.dashboards.gwt/.project index 520fc2bd59d..1c8cf650668 100644 --- a/java/com.sap.sailing.dashboards.gwt/.project +++ b/java/com.sap.sailing.dashboards.gwt/.project @@ -32,7 +32,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature com.gwtplugins.gwt.eclipse.core.gwtNature diff --git a/java/com.sap.sailing.datamining.provider/.project b/java/com.sap.sailing.datamining.provider/.project index 13699a1a554..58f8d7b572b 100755 --- a/java/com.sap.sailing.datamining.provider/.project +++ b/java/com.sap.sailing.datamining.provider/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.datamining.shared/.project b/java/com.sap.sailing.datamining.shared/.project index 3e76c7f629f..37fbf76b38a 100644 --- a/java/com.sap.sailing.datamining.shared/.project +++ b/java/com.sap.sailing.datamining.shared/.project @@ -32,7 +32,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature com.gwtplugins.gwt.eclipse.core.gwtNature diff --git a/java/com.sap.sailing.datamining.test/.project b/java/com.sap.sailing.datamining.test/.project index 91f4fe867cc..29b1df0edae 100644 --- a/java/com.sap.sailing.datamining.test/.project +++ b/java/com.sap.sailing.datamining.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.datamining/.project b/java/com.sap.sailing.datamining/.project index f40554ff5f4..7d404a89907 100644 --- a/java/com.sap.sailing.datamining/.project +++ b/java/com.sap.sailing.datamining/.project @@ -32,7 +32,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature com.gwtplugins.gwt.eclipse.core.gwtNature diff --git a/java/com.sap.sailing.declination.test/.project b/java/com.sap.sailing.declination.test/.project index 58850df91c8..4cf28739efa 100755 --- a/java/com.sap.sailing.declination.test/.project +++ b/java/com.sap.sailing.declination.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.declination/.project b/java/com.sap.sailing.declination/.project index d4ad11c6d72..3aea99e9711 100755 --- a/java/com.sap.sailing.declination/.project +++ b/java/com.sap.sailing.declination/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.bravoadapter/.project b/java/com.sap.sailing.domain.bravoadapter/.project index b9978a06950..afa1083609c 100755 --- a/java/com.sap.sailing.domain.bravoadapter/.project +++ b/java/com.sap.sailing.domain.bravoadapter/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.common/.project b/java/com.sap.sailing.domain.common/.project index 7779c8b14a0..8bcc64d7d6b 100755 --- a/java/com.sap.sailing.domain.common/.project +++ b/java/com.sap.sailing.domain.common/.project @@ -32,7 +32,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature com.gwtplugins.gwt.eclipse.core.gwtNature diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BoatClassMasterdata.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BoatClassMasterdata.java index 3b5518c248d..0839ca80263 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BoatClassMasterdata.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BoatClassMasterdata.java @@ -56,7 +56,7 @@ public enum BoatClassMasterdata { GC_32 ("GC 32", false, 10.0, 6.00, BoatHullType.CATAMARAN, true, "GC32", "GC-32"), GP_26 ("GP 26", true, 7.90, 2.55, BoatHullType.MONOHULL, true, "GP26", "GP-26"), HOBIE_16 ("Hobie 16", true, 5.05, 2.41, BoatHullType.CATAMARAN, false, "H16"), - H_BOAT ("H-Boat", true, 8.28, 2.18, BoatHullType.MONOHULL, true, "HB", "H-Boat"), + H_BOAT ("H-Boat", true, 8.28, 2.18, BoatHullType.MONOHULL, true, "HB", "H-Boot"), HANSA_303 ("Hansa 303", false, 3.03, 1.35, BoatHullType.MONOHULL, false, "Hansa-303", "Hansa303"), HOBIE_TIGER ("Hobie Tiger", true, 5.51, 2.60, BoatHullType.CATAMARAN, true), HOBIE_WILD_CAT ("Hobie Wild Cat", true, 5.49, 2.59, BoatHullType.CATAMARAN, true, "Hobie Wild Cat F18"), @@ -108,7 +108,7 @@ public enum BoatClassMasterdata { SPLASH_BLUE ("Splash Blue", true, 3.50, 1.50, BoatHullType.MONOHULL, false, "Splash_Blue"), SPLASH_RED ("Splash Red", true, 3.50, 1.50, BoatHullType.MONOHULL, false, "Splash_Red"), SPLASH_GREEN ("Splash Green", true, 3.50, 1.50, BoatHullType.MONOHULL, false, "Splash_Green"), - STAR ("Star", true, 6.92, 1.74, BoatHullType.MONOHULL, false, "STR"), + STAR ("Star", true, 6.92, 1.74, BoatHullType.MONOHULL, false, "STR", "STARBOOT", "STARBOAT"), STREAMLINE ("Streamline", true, 7.15, 2.55, BoatHullType.MONOHULL, true), SUNBEAM_22 ("Sunbeam 22", true, 6.70, 2.15, BoatHullType.MONOHULL, true, "Sunbeam 22.1"), SWAN_45 ("Swan 45", true, 13.83, 3.91, BoatHullType.MONOHULL, true, "Swan", "Swan-45"), diff --git a/java/com.sap.sailing.domain.deckmanadapter.test/.project b/java/com.sap.sailing.domain.deckmanadapter.test/.project index fd1b6107082..1e33e21430e 100755 --- a/java/com.sap.sailing.domain.deckmanadapter.test/.project +++ b/java/com.sap.sailing.domain.deckmanadapter.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.deckmanadapter/.project b/java/com.sap.sailing.domain.deckmanadapter/.project index 93bbb09883e..7fc0ea71872 100755 --- a/java/com.sap.sailing.domain.deckmanadapter/.project +++ b/java/com.sap.sailing.domain.deckmanadapter/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.expeditionadapter/.project b/java/com.sap.sailing.domain.expeditionadapter/.project index a413084a0cd..11525013504 100755 --- a/java/com.sap.sailing.domain.expeditionadapter/.project +++ b/java/com.sap.sailing.domain.expeditionadapter/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.igtimiadapter.gateway/.project b/java/com.sap.sailing.domain.igtimiadapter.gateway/.project index fb064dabaca..a1fcbd29f75 100644 --- a/java/com.sap.sailing.domain.igtimiadapter.gateway/.project +++ b/java/com.sap.sailing.domain.igtimiadapter.gateway/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.igtimiadapter.persistence/.project b/java/com.sap.sailing.domain.igtimiadapter.persistence/.project index 7d52cb74c97..7710c4efbbd 100755 --- a/java/com.sap.sailing.domain.igtimiadapter.persistence/.project +++ b/java/com.sap.sailing.domain.igtimiadapter.persistence/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.igtimiadapter.test/.project b/java/com.sap.sailing.domain.igtimiadapter.test/.project index 4ec7f1c59af..835b376a16f 100755 --- a/java/com.sap.sailing.domain.igtimiadapter.test/.project +++ b/java/com.sap.sailing.domain.igtimiadapter.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.igtimiadapter/.project b/java/com.sap.sailing.domain.igtimiadapter/.project index 97dd7581430..4a0ffb203e3 100755 --- a/java/com.sap.sailing.domain.igtimiadapter/.project +++ b/java/com.sap.sailing.domain.igtimiadapter/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.persistence/.project b/java/com.sap.sailing.domain.persistence/.project index 63ad26fbdd7..020fbf0fca3 100755 --- a/java/com.sap.sailing.domain.persistence/.project +++ b/java/com.sap.sailing.domain.persistence/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/.project b/java/com.sap.sailing.domain.racelogtrackingadapter.test/.project index 30f37c10090..2431af52485 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/.project +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/.project b/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/.project index f3c0beddc15..fdd64c33d54 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/.project +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/.project b/java/com.sap.sailing.domain.racelogtrackingadapter/.project index 6d8ea47c43e..e4bfd178b79 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/.project +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.shared.android.test/.project b/java/com.sap.sailing.domain.shared.android.test/.project index b20b2f876c0..913923f097c 100644 --- a/java/com.sap.sailing.domain.shared.android.test/.project +++ b/java/com.sap.sailing.domain.shared.android.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.shared.android/.project b/java/com.sap.sailing.domain.shared.android/.project index eba6e1dade9..56066863cbe 100644 --- a/java/com.sap.sailing.domain.shared.android/.project +++ b/java/com.sap.sailing.domain.shared.android/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CompetitorImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CompetitorImpl.java index b8f14712ff4..6236deb7432 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CompetitorImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CompetitorImpl.java @@ -46,6 +46,14 @@ public class CompetitorImpl implements DynamicCompetitor { this.searchTag = searchTag; this.listeners = new HashSet(); } + + private Object writeReplace() { + if (CompetitorSerializationCustomizer.getCurrentCustomizer().removalOfPersonalDataNecessary(this)) { + return new CompetitorImpl(id, name, shortName, color, /* email */ null, flagImage, team, timeOnTimeFactor, + timeOnDistanceAllowancePerNauticalMile, searchTag); + } + return this; + } private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException { ois.defaultReadObject(); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CompetitorSerializationCustomizer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CompetitorSerializationCustomizer.java new file mode 100644 index 00000000000..b18bad37b63 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CompetitorSerializationCustomizer.java @@ -0,0 +1,46 @@ +package com.sap.sailing.domain.base.impl; + +import java.util.function.Supplier; + +import com.sap.sailing.domain.base.Competitor; + +public interface CompetitorSerializationCustomizer { + + boolean removalOfPersonalDataNecessary(Competitor competitor); + + public static final ThreadLocal threadLocalCustomizer = new ThreadLocal<>(); + + public static final CompetitorSerializationCustomizer defaultCustomizer = new CompetitorSerializationCustomizer() { + @Override + public boolean removalOfPersonalDataNecessary(Competitor competitor) { + return false; + } + }; + + public static CompetitorSerializationCustomizer getCurrentCustomizer() { + CompetitorSerializationCustomizer result = threadLocalCustomizer.get(); + if (result == null) { + result = defaultCustomizer; + } + return result; + } + + public static void doWithCustomizer(CompetitorSerializationCustomizer customizer, Runnable action) { + threadLocalCustomizer.set(customizer); + try { + action.run(); + } finally { + threadLocalCustomizer.remove(); + } + } + + public static T doWithCustomizer(CompetitorSerializationCustomizer customizer, Supplier action) { + threadLocalCustomizer.set(customizer); + try { + return action.get(); + } finally { + threadLocalCustomizer.remove(); + } + } + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CompetitorWithBoatImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CompetitorWithBoatImpl.java index 284cf5fa6c9..d10eb123b9f 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CompetitorWithBoatImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CompetitorWithBoatImpl.java @@ -26,6 +26,15 @@ public class CompetitorWithBoatImpl extends CompetitorImpl implements DynamicCom competitor.getTimeOnDistanceAllowancePerNauticalMile(), competitor.getSearchTag(), boat); } + private Object writeReplace() { + if (CompetitorSerializationCustomizer.getCurrentCustomizer().removalOfPersonalDataNecessary(this)) { + return new CompetitorWithBoatImpl(getId(), getName(), getShortName(), getColor(), /* email */ null, + getFlagImage(), getTeam(), getTimeOnTimeFactor(), getTimeOnDistanceAllowancePerNauticalMile(), + getSearchTag(), boat); + } + return this; + } + public Competitor resolve(SharedDomainFactory domainFactory) { final Competitor result; if (!hasBoat()) { diff --git a/java/com.sap.sailing.domain.swisstimingadapter.persistence/.project b/java/com.sap.sailing.domain.swisstimingadapter.persistence/.project index b059e9ad7ed..c27a4a9ab4a 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter.persistence/.project +++ b/java/com.sap.sailing.domain.swisstimingadapter.persistence/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.swisstimingadapter.test/.project b/java/com.sap.sailing.domain.swisstimingadapter.test/.project index 0310bcf9121..c15701a305d 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter.test/.project +++ b/java/com.sap.sailing.domain.swisstimingadapter.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.swisstimingadapter/.project b/java/com.sap.sailing.domain.swisstimingadapter/.project index a087e0f7357..d0b79376fe1 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter/.project +++ b/java/com.sap.sailing.domain.swisstimingadapter/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.swisstimingreplayadapter.test/.project b/java/com.sap.sailing.domain.swisstimingreplayadapter.test/.project index 8bc1b12493d..9e3d1b58809 100644 --- a/java/com.sap.sailing.domain.swisstimingreplayadapter.test/.project +++ b/java/com.sap.sailing.domain.swisstimingreplayadapter.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.swisstimingreplayadapter/.project b/java/com.sap.sailing.domain.swisstimingreplayadapter/.project index 1d9da58cdab..74b2d2c52f4 100644 --- a/java/com.sap.sailing.domain.swisstimingreplayadapter/.project +++ b/java/com.sap.sailing.domain.swisstimingreplayadapter/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.test/.project b/java/com.sap.sailing.domain.test/.project index 0a9550a016b..7448bbefb9c 100755 --- a/java/com.sap.sailing.domain.test/.project +++ b/java/com.sap.sailing.domain.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.tractracadapter.persistence/.project b/java/com.sap.sailing.domain.tractracadapter.persistence/.project index 343c04d4a85..078c002c4e9 100755 --- a/java/com.sap.sailing.domain.tractracadapter.persistence/.project +++ b/java/com.sap.sailing.domain.tractracadapter.persistence/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.tractracadapter/.project b/java/com.sap.sailing.domain.tractracadapter/.project index f8cd2e2d499..7ecc9e35862 100755 --- a/java/com.sap.sailing.domain.tractracadapter/.project +++ b/java/com.sap.sailing.domain.tractracadapter/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.windfinderadapter.test/.project b/java/com.sap.sailing.domain.windfinderadapter.test/.project index f4e90b744ba..aee841b7223 100644 --- a/java/com.sap.sailing.domain.windfinderadapter.test/.project +++ b/java/com.sap.sailing.domain.windfinderadapter.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain.windfinderadapter/.project b/java/com.sap.sailing.domain.windfinderadapter/.project index 8efe69d0cbe..a50d5c03434 100644 --- a/java/com.sap.sailing.domain.windfinderadapter/.project +++ b/java/com.sap.sailing.domain.windfinderadapter/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain/.project b/java/com.sap.sailing.domain/.project index 667ec7791d2..daaff4b5dae 100755 --- a/java/com.sap.sailing.domain/.project +++ b/java/com.sap.sailing.domain/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardWithCache.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardWithCache.java index 3f9d47db486..db9d59f35a4 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardWithCache.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardWithCache.java @@ -27,8 +27,10 @@ import java.util.logging.Logger; import com.sap.sailing.domain.abstractlog.race.InvalidatesLeaderboardCache; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.base.Boat; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.CompetitorWithBoat; import com.sap.sailing.domain.base.Course; import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.Fleet; @@ -585,8 +587,24 @@ public abstract class AbstractLeaderboardWithCache implements Leaderboard { LeaderboardEntryDTO entryDTO = new LeaderboardEntryDTO(); TrackedRace trackedRace = raceColumn.getTrackedRace(competitor); entryDTO.race = trackedRace == null ? null : trackedRace.getRaceIdentifier(); - // TODO bug2822: Should this rather come from raceColumn.getBoatOfCompetitor() ? - entryDTO.boat = trackedRace == null ? null : baseDomainFactory.convertToBoatDTO(trackedRace.getBoatOfCompetitor(competitor)); + Boat boat; + if (trackedRace != null) { + boat = trackedRace.getBoatOfCompetitor(competitor); + } else { + // check if it's a CompetitorWithBoat: + if (competitor.hasBoat()) { + boat = ((CompetitorWithBoat) competitor).getBoat(); + } else { + final Fleet fleetOfCompetitor = raceColumn.getFleetOfCompetitor(competitor); + if (fleetOfCompetitor != null) { + final Map competitorsAndTheirBoats = raceColumn.getCompetitorsRegisteredInRacelog(fleetOfCompetitor); + boat = competitorsAndTheirBoats.get(competitor); + } else { + boat = null; + } + } + } + entryDTO.boat = boat == null ? null : baseDomainFactory.convertToBoatDTO(boat); entryDTO.totalPoints = entry.getTotalPoints(); if (fillTotalPointsUncorrected) { entryDTO.totalPointsUncorrected = entry.getTotalPointsUncorrected(); diff --git a/java/com.sap.sailing.ess40.resultimport.test/.project b/java/com.sap.sailing.ess40.resultimport.test/.project index bacaddea80a..77c9ca46d48 100755 --- a/java/com.sap.sailing.ess40.resultimport.test/.project +++ b/java/com.sap.sailing.ess40.resultimport.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.ess40.resultimport/.project b/java/com.sap.sailing.ess40.resultimport/.project index b665aeee3fb..958ac0c075a 100755 --- a/java/com.sap.sailing.ess40.resultimport/.project +++ b/java/com.sap.sailing.ess40.resultimport/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.expeditionconnector.common/.project b/java/com.sap.sailing.expeditionconnector.common/.project index 255447215e5..bcd9181d7e4 100755 --- a/java/com.sap.sailing.expeditionconnector.common/.project +++ b/java/com.sap.sailing.expeditionconnector.common/.project @@ -32,7 +32,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature com.gwtplugins.gwt.eclipse.core.gwtNature diff --git a/java/com.sap.sailing.expeditionconnector.persistence/.project b/java/com.sap.sailing.expeditionconnector.persistence/.project index c6034e7c533..e42db9b1e26 100755 --- a/java/com.sap.sailing.expeditionconnector.persistence/.project +++ b/java/com.sap.sailing.expeditionconnector.persistence/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.expeditionconnector.test/.project b/java/com.sap.sailing.expeditionconnector.test/.project index cb065b0d8fb..025209a6648 100755 --- a/java/com.sap.sailing.expeditionconnector.test/.project +++ b/java/com.sap.sailing.expeditionconnector.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.expeditionconnector/.project b/java/com.sap.sailing.expeditionconnector/.project index 1c71354f3f4..ded7ee340a0 100755 --- a/java/com.sap.sailing.expeditionconnector/.project +++ b/java/com.sap.sailing.expeditionconnector/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.freg.resultimport.test/.project b/java/com.sap.sailing.freg.resultimport.test/.project index 87d00f1126b..2d6c83b16d3 100755 --- a/java/com.sap.sailing.freg.resultimport.test/.project +++ b/java/com.sap.sailing.freg.resultimport.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.freg.resultimport/.project b/java/com.sap.sailing.freg.resultimport/.project index a99382aeabe..1bb09fc83ed 100755 --- a/java/com.sap.sailing.freg.resultimport/.project +++ b/java/com.sap.sailing.freg.resultimport/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.geocoding.test/.project b/java/com.sap.sailing.geocoding.test/.project index ccee6e7ad13..1a803b11191 100644 --- a/java/com.sap.sailing.geocoding.test/.project +++ b/java/com.sap.sailing.geocoding.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.geocoding/.project b/java/com.sap.sailing.geocoding/.project index 18680f3dc59..3f8614412de 100644 --- a/java/com.sap.sailing.geocoding/.project +++ b/java/com.sap.sailing.geocoding/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.grib.test/.project b/java/com.sap.sailing.grib.test/.project index 9bc15e55f91..a8dd7de79a6 100644 --- a/java/com.sap.sailing.grib.test/.project +++ b/java/com.sap.sailing.grib.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.grib/.project b/java/com.sap.sailing.grib/.project index d0428178f93..9069daa0b2c 100644 --- a/java/com.sap.sailing.grib/.project +++ b/java/com.sap.sailing.grib/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.gwt.ui.test/.project b/java/com.sap.sailing.gwt.ui.test/.project index 1b5fe668904..c12f174b9ff 100755 --- a/java/com.sap.sailing.gwt.ui.test/.project +++ b/java/com.sap.sailing.gwt.ui.test/.project @@ -32,7 +32,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature com.gwtplugins.gwt.eclipse.core.gwtNature diff --git a/java/com.sap.sailing.gwt.ui/.project b/java/com.sap.sailing.gwt.ui/.project index c684e289776..0187ad26fa5 100755 --- a/java/com.sap.sailing.gwt.ui/.project +++ b/java/com.sap.sailing.gwt.ui/.project @@ -32,7 +32,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature org.eclipse.wst.jsdt.core.jsNature com.gwtplugins.gwt.eclipse.core.gwtNature diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/StructureImportManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/StructureImportManagementPanel.java index d881cbbac40..ee8149f72fa 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/StructureImportManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/StructureImportManagementPanel.java @@ -452,8 +452,7 @@ public class StructureImportManagementPanel extends SimplePanel implements Regat return result; } - private void createRegattas(final Iterable selectedOriginalRegattasFromXRR, - EventDTO newEvent) { + private void createRegattas(final Iterable selectedOriginalRegattasFromXRR, EventDTO newEvent) { eventManagementPanel.fillEvents(); final Set regattaConfigurationsToCreate = new HashSet<>(); for (RegattaDTO originalRegattaFromXRR : selectedOriginalRegattasFromXRR) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/DataMiningServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/DataMiningServiceImpl.java index 179c371170c..e92a60cad26 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/DataMiningServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/DataMiningServiceImpl.java @@ -14,13 +14,11 @@ import java.util.Locale; import java.util.Map; import java.util.Map.Entry; -import org.apache.shiro.SecurityUtils; import org.apache.shiro.authz.AuthorizationException; import org.osgi.framework.BundleContext; import org.osgi.util.tracker.ServiceTracker; import com.sap.sailing.server.interfaces.RacingEventService; -import com.sap.sse.ServerInfo; import com.sap.sse.common.settings.SerializableSettings; import com.sap.sse.datamining.DataMiningServer; import com.sap.sse.datamining.Query; @@ -51,7 +49,6 @@ import com.sap.sse.datamining.shared.impl.dto.ReducedDimensionsDTO; import com.sap.sse.datamining.shared.impl.dto.StoredDataMiningQueryDTOImpl; import com.sap.sse.datamining.ui.client.DataMiningService; import com.sap.sse.gwt.server.ProxiedRemoteServiceServlet; -import com.sap.sse.gwt.client.ServerInfoDTO; import com.sap.sse.i18n.ResourceBundleStringMessages; import com.sap.sse.security.SecurityService; import com.sap.sse.security.shared.impl.SecuredSecurityTypes.ServerActions; @@ -74,7 +71,7 @@ public class DataMiningServiceImpl extends ProxiedRemoteServiceServlet implement dataMiningServerTracker = createAndOpenDataMiningServerTracker(context); securityServiceTracker = ServiceTrackerFactory.createAndOpen(context, SecurityService.class); - storedDataMiningQueryPersistor = new StoredDataMiningQueryPersisterImpl(securityServiceTracker.getService()); + storedDataMiningQueryPersistor = new StoredDataMiningQueryPersisterImpl(getSecurityService()); dtoFactory = new DataMiningDTOFactory(); } @@ -89,6 +86,10 @@ public class DataMiningServiceImpl extends ProxiedRemoteServiceServlet implement private DataMiningServer getDataMiningServer() { return dataMiningServerTracker.getService(); } + + private SecurityService getSecurityService() { + return securityServiceTracker.getService(); + } @Override public Date getComponentsChangedTimepoint() { @@ -116,10 +117,7 @@ public class DataMiningServiceImpl extends ProxiedRemoteServiceServlet implement * if permission does not exist */ private void checkDataMiningPermission() { - // TODO: should be moved to one place (not the ServerInfoDTO) -> could not be moved to ServerInfo, since - // sse.security is not available - SecurityUtils.getSubject().checkPermission(new ServerInfoDTO(ServerInfo.getName(), ServerInfo.getBuildVersion()) - .getIdentifier().getStringPermission(ServerActions.DATA_MINING)); + getSecurityService().checkCurrentUserServerPermission(ServerActions.DATA_MINING); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index d4192234640..da4a75d772f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -1,6 +1,7 @@ package com.sap.sailing.gwt.ui.server; import java.awt.image.BufferedImage; +import java.io.BufferedReader; import java.io.DataInputStream; import java.io.File; import java.io.FileOutputStream; @@ -4290,9 +4291,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet @Override public ReplicationStateDTO getReplicaInfo() { - SecurityUtils.getSubject().checkPermission( - SecuredSecurityTypes.SERVER.getStringPermissionForTypeRelativeIdentifier(ServerActions.READ_REPLICATOR, - new TypeRelativeObjectIdentifier(ServerInfo.getName()))); + getSecurityService().checkCurrentUserServerPermission(ServerActions.READ_REPLICATOR); ReplicationService service = getReplicationService(); Set replicaDTOs = new HashSet(); for (ReplicaDescriptor replicaDescriptor : service.getReplicaInfo()) { @@ -4333,9 +4332,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet public void startReplicatingFromMaster(String messagingHost, String masterHostName, String exchangeName, int servletPort, int messagingPort, String usernameOrNull, String passwordOrNull) throws IOException, ClassNotFoundException, InterruptedException { - SecurityUtils.getSubject() - .checkPermission(SecuredSecurityTypes.SERVER.getStringPermissionForTypeRelativeIdentifier( - ServerActions.START_REPLICATION, new TypeRelativeObjectIdentifier(ServerInfo.getName()))); + getSecurityService().checkCurrentUserServerPermission(ServerActions.START_REPLICATION); // The queue name must always be the same for this server. In order to achieve // this we're using the unique server identifier final ReplicationService replicationService = getReplicationService(); @@ -5126,9 +5123,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet @Override public void updateServerConfiguration(ServerConfigurationDTO serverConfiguration) { - SecurityUtils.getSubject() - .checkPermission(SecuredSecurityTypes.SERVER.getStringPermissionForTypeRelativeIdentifier( - ServerActions.CONFIGURE_LOCAL_SERVER, new TypeRelativeObjectIdentifier(ServerInfo.getName()))); + getSecurityService().checkCurrentUserServerPermission(ServerActions.CONFIGURE_LOCAL_SERVER); getService().apply(new UpdateServerConfiguration( new SailingServerConfigurationImpl(serverConfiguration.isStandaloneServer()))); if (serverConfiguration.isSelfService() != null) { @@ -5427,9 +5422,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet List regattaDTOs = new ArrayList(); Iterable regattas = structureImporter.getRegattas(parsedEvent); for (Regatta regatta : regattas) { - if (getSecurityService().hasCurrentUserReadPermission(regatta)) { - regattaDTOs.add(convertToRegattaDTO(regatta)); - } + regattaDTOs.add(convertToRegattaDTO(regatta)); } return regattaDTOs; } @@ -5623,9 +5616,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet @Override public void stopReplicatingFromMaster() { - SecurityUtils.getSubject() - .checkPermission(SecuredSecurityTypes.SERVER.getStringPermissionForTypeRelativeIdentifier( - ServerActions.START_REPLICATION, new TypeRelativeObjectIdentifier(ServerInfo.getName()))); + getSecurityService().checkCurrentUserServerPermission(ServerActions.START_REPLICATION); try { getReplicationService().stopToReplicateFromMaster(); } catch (IOException e) { @@ -5636,9 +5627,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet @Override public void stopAllReplicas() { - SecurityUtils.getSubject() - .checkPermission(SecuredSecurityTypes.SERVER.getStringPermissionForTypeRelativeIdentifier( - ServerActions.REPLICATE, new TypeRelativeObjectIdentifier(ServerInfo.getName()))); + getSecurityService().checkCurrentUserServerPermission(ServerActions.REPLICATE); try { getReplicationService().stopAllReplicas(); } catch (IOException e) { @@ -5649,9 +5638,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet @Override public void stopSingleReplicaInstance(String identifier) { - SecurityUtils.getSubject() - .checkPermission(SecuredSecurityTypes.SERVER.getStringPermissionForTypeRelativeIdentifier( - ServerActions.REPLICATE, new TypeRelativeObjectIdentifier(ServerInfo.getName()))); + getSecurityService().checkCurrentUserServerPermission(ServerActions.REPLICATE); UUID uuid = UUID.fromString(identifier); try { getReplicationService().unregisterReplica(uuid); @@ -5767,18 +5754,12 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet public UUID importMasterData(final String urlAsString, final String[] groupNames, final boolean override, final boolean compress, final boolean exportWind, final boolean exportDeviceConfigurations, String targetServerUsername, String targetServerPassword) { - // FIXME should the targetserver also check this? - SecurityUtils.getSubject().isPermitted(SecuredSecurityTypes.SERVER.getStringPermissionForTypeRelativeIdentifier( - ServerActions.CAN_IMPORT_MASTERDATA, new TypeRelativeObjectIdentifier(ServerInfo.getName()))); - + getSecurityService().checkCurrentUserServerPermission(ServerActions.CAN_IMPORT_MASTERDATA); String token = RemoteServerUtil.resolveBearerTokenForRemoteServer(urlAsString, targetServerUsername, targetServerPassword); - final UUID importOperationId = UUID.randomUUID(); - getService().createOrUpdateDataImportProgressWithReplication(importOperationId, 0.0, DataImportSubProgress.INIT, - 0.0); + getService().createOrUpdateDataImportProgressWithReplication(importOperationId, 0.0, DataImportSubProgress.INIT, 0.0); final User user = getSecurityService().getCurrentUser(); final UserGroup tenant = getSecurityService().getDefaultTenantForCurrentUser(); - // Create a progress indicator for as long as the server gets data from the other server. // As soon as the server starts the import operation, a progress object will be built on every server Runnable masterDataImportTask = new Runnable() { @@ -5813,13 +5794,21 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet inputStream = new TimeoutExtendingInputStream(connection.getInputStream(), connection); } final MasterDataImporter importer = new MasterDataImporter(baseDomainFactory, getService(), - user, - tenant); + user, tenant); importer.importFromStream(inputStream, importOperationId, override); } catch (Throwable e) { // do not assume that RuntimeException is logged properly - logger.log(Level.SEVERE, e.getMessage(), e); - getService().setDataImportFailedWithReplication(importOperationId, e.getMessage() + String message = e.getMessage(); + if (connection instanceof HttpURLConnection) { + // try to obtain an error message from the connection's error stream: + try { + message = new BufferedReader(new InputStreamReader(((HttpURLConnection) connection).getErrorStream())).readLine(); + } catch (Exception exceptionTryingToReadErrorStream) { + // in this case we just stay with the exception's message + } + } + logger.log(Level.SEVERE, message, e); + getService().setDataImportFailedWithReplication(importOperationId, message + "\n\nHave you checked if the" + " versions (commit-wise) of the importing and exporting servers are compatible with each other? " + "If the error still occurs, when both servers are running the same version, please report the problem."); diff --git a/java/com.sap.sailing.kiworesultimport.test/.project b/java/com.sap.sailing.kiworesultimport.test/.project index 1421921fba3..e9f86490481 100644 --- a/java/com.sap.sailing.kiworesultimport.test/.project +++ b/java/com.sap.sailing.kiworesultimport.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.kiworesultimport/.project b/java/com.sap.sailing.kiworesultimport/.project index a1aa50371ad..3e12ea22645 100644 --- a/java/com.sap.sailing.kiworesultimport/.project +++ b/java/com.sap.sailing.kiworesultimport/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.manage2sail.resultimport.test/.project b/java/com.sap.sailing.manage2sail.resultimport.test/.project index 8f4948ee364..52ae2ce037f 100644 --- a/java/com.sap.sailing.manage2sail.resultimport.test/.project +++ b/java/com.sap.sailing.manage2sail.resultimport.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.manage2sail.resultimport/.project b/java/com.sap.sailing.manage2sail.resultimport/.project index a2606335bd9..9e3bc68ae26 100644 --- a/java/com.sap.sailing.manage2sail.resultimport/.project +++ b/java/com.sap.sailing.manage2sail.resultimport/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.manage2sail/.project b/java/com.sap.sailing.manage2sail/.project index ca7605b13f9..c8f2b042fbb 100644 --- a/java/com.sap.sailing.manage2sail/.project +++ b/java/com.sap.sailing.manage2sail/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.media.persistence.test/.project b/java/com.sap.sailing.media.persistence.test/.project index ab02faa2b7c..c8fd9906d3c 100644 --- a/java/com.sap.sailing.media.persistence.test/.project +++ b/java/com.sap.sailing.media.persistence.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.mongodb.test/.project b/java/com.sap.sailing.mongodb.test/.project index a4a000d741a..be107c0949e 100755 --- a/java/com.sap.sailing.mongodb.test/.project +++ b/java/com.sap.sailing.mongodb.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.monitoring/.project b/java/com.sap.sailing.monitoring/.project index 5bf2c3ba6d0..c2a34d888fd 100644 --- a/java/com.sap.sailing.monitoring/.project +++ b/java/com.sap.sailing.monitoring/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.news/.project b/java/com.sap.sailing.news/.project index cba19cda41d..dee836e5af0 100644 --- a/java/com.sap.sailing.news/.project +++ b/java/com.sap.sailing.news/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.nmeaconnector.test/.project b/java/com.sap.sailing.nmeaconnector.test/.project index c521410104f..f634c612681 100755 --- a/java/com.sap.sailing.nmeaconnector.test/.project +++ b/java/com.sap.sailing.nmeaconnector.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.nmeaconnector/.project b/java/com.sap.sailing.nmeaconnector/.project index c8d00592061..56e2e35c113 100755 --- a/java/com.sap.sailing.nmeaconnector/.project +++ b/java/com.sap.sailing.nmeaconnector/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.polars.datamining.shared/.project b/java/com.sap.sailing.polars.datamining.shared/.project index 6dc505ab246..eca7faa4577 100644 --- a/java/com.sap.sailing.polars.datamining.shared/.project +++ b/java/com.sap.sailing.polars.datamining.shared/.project @@ -32,7 +32,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature com.gwtplugins.gwt.eclipse.core.gwtNature diff --git a/java/com.sap.sailing.polars.datamining/.project b/java/com.sap.sailing.polars.datamining/.project index a217a17527e..f055cc6d5d6 100644 --- a/java/com.sap.sailing.polars.datamining/.project +++ b/java/com.sap.sailing.polars.datamining/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.polars.test/.project b/java/com.sap.sailing.polars.test/.project index 7980f4925e6..02c4c142cc3 100644 --- a/java/com.sap.sailing.polars.test/.project +++ b/java/com.sap.sailing.polars.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.polars/.project b/java/com.sap.sailing.polars/.project index b2e142dedfa..395d11a7d0f 100644 --- a/java/com.sap.sailing.polars/.project +++ b/java/com.sap.sailing.polars/.project @@ -23,6 +23,5 @@ org.eclipse.jdt.core.javanature - org.eclipse.pde.PluginNature diff --git a/java/com.sap.sailing.resultimport/.project b/java/com.sap.sailing.resultimport/.project index f36785ea507..588f69ad820 100644 --- a/java/com.sap.sailing.resultimport/.project +++ b/java/com.sap.sailing.resultimport/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.routeconverterjava11extension/.project b/java/com.sap.sailing.routeconverterjava11extension/.project index 6fc2819bb00..57ae627c81e 100755 --- a/java/com.sap.sailing.routeconverterjava11extension/.project +++ b/java/com.sap.sailing.routeconverterjava11extension/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.sailwave.resultimport.test/.project b/java/com.sap.sailing.sailwave.resultimport.test/.project index 818efda9dc5..fe11b55df93 100644 --- a/java/com.sap.sailing.sailwave.resultimport.test/.project +++ b/java/com.sap.sailing.sailwave.resultimport.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.sailwave.resultimport/.project b/java/com.sap.sailing.sailwave.resultimport/.project index 598a39f33d8..7e7c1299f8d 100644 --- a/java/com.sap.sailing.sailwave.resultimport/.project +++ b/java/com.sap.sailing.sailwave.resultimport/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.selenium.test/.project b/java/com.sap.sailing.selenium.test/.project index 6d980ffd37d..b41449cf208 100644 --- a/java/com.sap.sailing.selenium.test/.project +++ b/java/com.sap.sailing.selenium.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/.project b/java/com.sap.sailing.server.gateway.serialization.shared.android/.project index 0802e21577c..ef3070b2707 100755 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/.project +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.server.gateway.serialization.test/.project b/java/com.sap.sailing.server.gateway.serialization.test/.project index 8fd93b5b758..1735422c292 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/.project +++ b/java/com.sap.sailing.server.gateway.serialization.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.server.gateway.serialization/.project b/java/com.sap.sailing.server.gateway.serialization/.project index cc12d1eed4a..87f6adf6722 100644 --- a/java/com.sap.sailing.server.gateway.serialization/.project +++ b/java/com.sap.sailing.server.gateway.serialization/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.server.gateway.test.support/.project b/java/com.sap.sailing.server.gateway.test.support/.project index edc0549576d..c86eab62472 100644 --- a/java/com.sap.sailing.server.gateway.test.support/.project +++ b/java/com.sap.sailing.server.gateway.test.support/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.server.gateway.test/.project b/java/com.sap.sailing.server.gateway.test/.project index 4cf34e53fa2..8d4cd9ae3b6 100644 --- a/java/com.sap.sailing.server.gateway.test/.project +++ b/java/com.sap.sailing.server.gateway.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.server.gateway/.project b/java/com.sap.sailing.server.gateway/.project index d04cc8ee9a6..91167a58644 100644 --- a/java/com.sap.sailing.server.gateway/.project +++ b/java/com.sap.sailing.server.gateway/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/spi/MasterDataResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/spi/MasterDataResource.java index 471b6edcdfa..0162476c95d 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/spi/MasterDataResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/spi/MasterDataResource.java @@ -23,19 +23,25 @@ import javax.ws.rs.QueryParam; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; -import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.StreamingOutput; +import org.apache.shiro.authz.AuthorizationException; + +import com.sap.sailing.domain.base.Boat; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Event; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.configuration.DeviceConfiguration; +import com.sap.sailing.domain.base.impl.CompetitorSerializationCustomizer; import com.sap.sailing.domain.common.media.MediaTrack; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.LeaderboardGroup; +import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; import com.sap.sailing.domain.masterdataimport.TopLevelMasterData; import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource; import com.sap.sse.security.SecurityService; +import com.sap.sse.security.shared.impl.SecuredSecurityTypes.PublicReadableActions; +import com.sap.sse.security.shared.impl.SecuredSecurityTypes.ServerActions; import com.sap.sse.security.shared.impl.User; @Path("/v1/masterdata/leaderboardgroups") @@ -50,9 +56,7 @@ public class MasterDataResource extends AbstractSailingServerResource { throws UnsupportedEncodingException { final SecurityService securityService = getSecurityService(); User user = securityService.getCurrentUser(); - if (user == null) { - return Response.status(Status.FORBIDDEN).build(); - } + securityService.checkCurrentUserServerPermission(ServerActions.CAN_EXPORT_MASTERDATA); final long startTime = System.currentTimeMillis(); logger.info("Masterdataexport has started; requesting user: "+user); if (compress == null) { @@ -66,33 +70,59 @@ public class MasterDataResource extends AbstractSailingServerResource { } logger.info(String.format("Masterdataexport gzip compression is turned %s", compress ? "on" : "off")); Map allLeaderboardGroups = getService().getLeaderboardGroups(); - Set groupsToExport = new HashSet(); - if (requestedLeaderboardGroups.isEmpty()) { - // add all visible + // Add all visible LeaderboardGroups. + // The request will not fail due to missing LeaderboardGroup READ permissions. for (LeaderboardGroup group : allLeaderboardGroups.values()) { if (securityService.hasCurrentUserReadPermission(group)) { groupsToExport.add(group); } } } else { - // add all requested, that are visible + // Add all requested LeaderboardGroups. + // The request will fail due to missing LeaderboardGroup READ permissions. for (String name : requestedLeaderboardGroups) { LeaderboardGroup group = allLeaderboardGroups.get(name); if (group != null) { - if (securityService.hasCurrentUserReadPermission(group)) { - groupsToExport.add(group); + if (!securityService.hasCurrentUserReadPermission(group)) { + throw new AuthorizationException("No permission to read leaderboard group '" + name + "'"); } + groupsToExport.add(group); } } } final List competitorIds = new ArrayList(); for (LeaderboardGroup lg : groupsToExport) { for (Leaderboard leaderboard : lg.getLeaderboards()) { - if (securityService.hasCurrentUserReadPermission(leaderboard)) { - for (Competitor competitor : leaderboard.getAllCompetitors()) { - competitorIds.add(competitor.getId()); + // All Leaderboards/Regattas contained in the LeaderboardGroup need to be visible + // to ensure consistency during import. A partial/pruned import is not intended to take place. + if (!securityService.hasCurrentUserReadPermission(leaderboard) + || ((leaderboard instanceof RegattaLeaderboard) && !securityService + .hasCurrentUserReadPermission(((RegattaLeaderboard) leaderboard).getRegatta()))) { + throw new AuthorizationException( + "No permission to read all leaderboards and regattas of leaderboard group '" + lg.getName() + + "'"); + } + for (Competitor competitor : leaderboard.getAllCompetitors()) { + // All competitors reachable by Leaderboards contained in a LeaderboardGroup + // need to be readable (READ or READ_PUBLIC) to allow the import. + // Pruning of personal data (email) is done during serialization if the user has READ_PUBLIC but no + // READ permission. + if (!securityService.hasCurrentUserOneOfExplicitPermissions(competitor, + PublicReadableActions.READ_AND_READ_PUBLIC_ACTIONS)) { + throw new AuthorizationException("No permission to read competitor " + competitor.getId() + + " for leaderboard '" + leaderboard.getName() + "'"); + } + competitorIds.add(competitor.getId()); + } + for (Boat boat : leaderboard.getAllBoats()) { + // All boats reachable by Leaderboards contained in a LeaderboardGroup + // need to be readable (READ or READ_PUBLIC) to allow the import. + if (!securityService.hasCurrentUserOneOfExplicitPermissions(boat, + PublicReadableActions.READ_AND_READ_PUBLIC_ACTIONS)) { + throw new AuthorizationException("No permission to read boat " + boat.getId() + + " for leaderboard '" + leaderboard.getName() + "'"); } } } @@ -100,43 +130,52 @@ public class MasterDataResource extends AbstractSailingServerResource { Set raceManagerDeviceConfigurations = new HashSet<>(); if (exportDeviceConfigs) { for (DeviceConfiguration deviceConfig : getAllDeviceConfigs()) { - // FIXME here permission check? - raceManagerDeviceConfigurations.add(deviceConfig); + // DeviceConfiguration are explicitly filtered by their permissions + // because no filtering based on the selected LeaderboardGroups is done. + // This is the only way to allow importing DeviceConfigurations at all. + if (securityService.hasCurrentUserReadPermission(deviceConfig)) { + raceManagerDeviceConfigurations.add(deviceConfig); + } } } ArrayList events = new ArrayList<>(); for (Event event : getService().getAllEvents()) { - if (securityService.hasCurrentUserReadPermission(event)) { - events.add(event); - } + events.add(event); } - ArrayList mediaTracks = new ArrayList<>(); for (MediaTrack mediaTrack : getService().getAllMediaTracks()) { - if (securityService.hasCurrentUserReadPermission(mediaTrack)) { - mediaTracks.add(mediaTrack); - } + mediaTracks.add(mediaTrack); } Map regattaRaceIds = new HashMap<>(); for (Entry regattaRaceMap : getService().getPersistentRegattasForRaceIDs().entrySet()) { - if (securityService.hasCurrentUserReadPermission(regattaRaceMap.getValue())) { - regattaRaceIds.put(regattaRaceMap.getKey(), regattaRaceMap.getValue()); - } + regattaRaceIds.put(regattaRaceMap.getKey(), regattaRaceMap.getValue()); } final TopLevelMasterData masterData = new TopLevelMasterData(groupsToExport, events, regattaRaceIds, mediaTracks, getService().getSensorFixStore(), exportWind, raceManagerDeviceConfigurations); + // Checking permissions after filtering of Events to be transferred. + for (Event event: masterData.getAllEvents()) { + if (!securityService.hasCurrentUserReadPermission(event)) { + throw new AuthorizationException("No permission to read event " + event.getId()); + } + } + // Checking permissions after filtering of MediaTracks to be transferred. + for (MediaTrack mediaTrack : masterData.getFilteredMediaTracks()) { + if (!securityService.hasCurrentUserReadPermission(mediaTrack)) { + throw new AuthorizationException("No permission to read media track " + mediaTrack.dbId); + } + } final StreamingOutput streamingOutput; if (compress) { - streamingOutput = new CompressingStreamingOutput(masterData, competitorIds, startTime); + streamingOutput = new CompressingStreamingOutput(masterData, competitorIds, startTime, securityService); } else { - streamingOutput = new NonCompressingStreamingOutput(masterData, competitorIds, startTime); + streamingOutput = new NonCompressingStreamingOutput(masterData, competitorIds, startTime, securityService); } - final ResponseBuilder resp = Response.ok(streamingOutput); + ResponseBuilder resp = Response.ok(streamingOutput); if (compress) { resp.header("Content-Encoding", "gzip"); } - Response builtResponse = resp.build(); + final Response builtResponse = resp.build(); long timeToExport = System.currentTimeMillis() - startTime; logger.info(String.format("Took %s ms to start masterdataexport-streaming.", timeToExport)); return builtResponse; @@ -150,39 +189,50 @@ public class MasterDataResource extends AbstractSailingServerResource { private final TopLevelMasterData masterData; private final List competitorIds; private final long startTime; + private final SecurityService securityService; - protected AbstractStreamingOutput(TopLevelMasterData masterData, List competitorIds, long startTime) { + protected AbstractStreamingOutput(TopLevelMasterData masterData, List competitorIds, long startTime, SecurityService securityService) { super(); this.masterData = masterData; this.competitorIds = competitorIds; this.startTime = startTime; + this.securityService = securityService; } protected abstract OutputStream wrapOutputStream(OutputStream outputStream) throws IOException; @Override public void write(OutputStream output) throws IOException, WebApplicationException { - ObjectOutputStream objectOutputStream = null; - try { - OutputStream gzipOrNot = wrapOutputStream(output); - OutputStream outputStreamWithByteCounter = new ByteCountOutputStreamDecorator(gzipOrNot); - objectOutputStream = new ObjectOutputStream(outputStreamWithByteCounter); - masterData.setMasterDataExportFlagOnRaceColumns(true); - // Actual start of streaming - writeObjects(competitorIds, masterData, objectOutputStream); - } finally { - objectOutputStream.close(); - masterData.setMasterDataExportFlagOnRaceColumns(false); - } - long timeToExport = System.currentTimeMillis() - startTime; - logger.info(String.format("Took %s ms to finish masterdataexport", timeToExport)); + CompetitorSerializationCustomizer + .doWithCustomizer(c -> { + return !securityService.hasCurrentUserReadPermission(c) && c.getEmail() != null; + }, () -> { + try { + ObjectOutputStream objectOutputStream = null; + try { + OutputStream gzipOrNot = wrapOutputStream(output); + OutputStream outputStreamWithByteCounter = new ByteCountOutputStreamDecorator(gzipOrNot); + objectOutputStream = new ObjectOutputStream(outputStreamWithByteCounter); + masterData.setMasterDataExportFlagOnRaceColumns(true); + // Actual start of streaming + writeObjects(competitorIds, masterData, objectOutputStream); + } finally { + objectOutputStream.close(); + masterData.setMasterDataExportFlagOnRaceColumns(false); + } + long timeToExport = System.currentTimeMillis() - startTime; + logger.info(String.format("Took %s ms to finish masterdataexport", timeToExport)); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); } } private class NonCompressingStreamingOutput extends AbstractStreamingOutput { protected NonCompressingStreamingOutput(TopLevelMasterData masterData, List competitorIds, - long startTime) { - super(masterData, competitorIds, startTime); + long startTime, SecurityService securityService) { + super(masterData, competitorIds, startTime, securityService); } @Override @@ -193,8 +243,8 @@ public class MasterDataResource extends AbstractSailingServerResource { private class CompressingStreamingOutput extends AbstractStreamingOutput { protected CompressingStreamingOutput(TopLevelMasterData masterData, List competitorIds, - long startTime) { - super(masterData, competitorIds, startTime); + long startTime, SecurityService securityService) { + super(masterData, competitorIds, startTime, securityService); } @Override diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/trackfiles/impl/ExpeditionAllInOneImporter.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/trackfiles/impl/ExpeditionAllInOneImporter.java index 94249ca9a1c..025002e3592 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/trackfiles/impl/ExpeditionAllInOneImporter.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/trackfiles/impl/ExpeditionAllInOneImporter.java @@ -26,7 +26,6 @@ import java.util.stream.Collectors; import java.util.stream.StreamSupport; import org.apache.commons.fileupload.FileItem; -import org.apache.shiro.SecurityUtils; import org.apache.shiro.authz.AuthorizationException; import org.apache.shiro.subject.Subject; import org.json.simple.parser.ParseException; @@ -96,7 +95,6 @@ import com.sap.sailing.server.operationaltransformation.CreateRegattaLeaderboard import com.sap.sailing.server.operationaltransformation.UpdateEvent; import com.sap.sailing.server.security.PermissionAwareRaceTrackingHandler; import com.sap.sailing.server.util.WaitForTrackedRaceUtil; -import com.sap.sse.ServerInfo; import com.sap.sse.common.Duration; import com.sap.sse.common.NoCorrespondingServiceRegisteredException; import com.sap.sse.common.TimePoint; @@ -108,8 +106,6 @@ import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.i18n.ResourceBundleStringMessages; import com.sap.sse.security.SecurityService; import com.sap.sse.security.shared.HasPermissions.DefaultActions; -import com.sap.sse.security.shared.TypeRelativeObjectIdentifier; -import com.sap.sse.security.shared.impl.SecuredSecurityTypes; import com.sap.sse.security.shared.impl.SecuredSecurityTypes.ServerActions; /** @@ -287,9 +283,7 @@ public class ExpeditionAllInOneImporter { public ImporterResult importFiles(final String filenameWithSuffix, final FileItem fileItem, final String boatClassName, ImportMode importMode, String existingRegattaName, boolean importStartData) throws AllInOneImportException, IOException, FormatNotSupportedException { - SecurityUtils.getSubject().checkPermission( - SecuredSecurityTypes.SERVER.getStringPermissionForTypeRelativeIdentifier(ServerActions.CREATE_OBJECT, - new TypeRelativeObjectIdentifier(ServerInfo.getName()))); + securityService.checkCurrentUserServerPermission(ServerActions.CREATE_OBJECT); final List errors = new ArrayList<>(); final String importTimeString = DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(LocalDateTime.now(ZoneOffset.UTC)); final String filename = ExpeditionImportFilenameUtils.truncateFilenameExtentions(filenameWithSuffix); diff --git a/java/com.sap.sailing.server.interface/.project b/java/com.sap.sailing.server.interface/.project index 8f602d997ba..86ee88aaa78 100755 --- a/java/com.sap.sailing.server.interface/.project +++ b/java/com.sap.sailing.server.interface/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.server.replication.test/.project b/java/com.sap.sailing.server.replication.test/.project index 6fb67f82008..d65f2d2d8c1 100644 --- a/java/com.sap.sailing.server.replication.test/.project +++ b/java/com.sap.sailing.server.replication.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/MediaReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/MediaReplicationTest.java index ba0259953f0..ba103027386 100644 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/MediaReplicationTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/MediaReplicationTest.java @@ -22,7 +22,9 @@ import java.util.UUID; import javax.ws.rs.core.Response; import javax.ws.rs.core.StreamingOutput; +import org.junit.Assert; import org.junit.Test; +import org.mockito.Matchers; import org.mockito.Mockito; import com.sap.sailing.domain.base.DomainFactory; @@ -50,11 +52,11 @@ import com.sap.sse.mongodb.MongoDBService; import com.sap.sse.security.SecurityService; import com.sap.sse.security.interfaces.UserImpl; import com.sap.sse.security.shared.WithQualifiedObjectIdentifier; +import com.sap.sse.security.shared.impl.SecuredSecurityTypes.PublicReadableActions; +import com.sap.sse.security.shared.impl.SecuredSecurityTypes.ServerActions; import com.sap.sse.security.shared.impl.User; import com.sap.sse.security.shared.impl.UserGroupImpl; -import org.junit.Assert; - public class MediaReplicationTest extends AbstractServerReplicationTest { private void waitSomeTime() throws InterruptedException { @@ -202,7 +204,10 @@ public class MediaReplicationTest extends AbstractServerReplicationTest { Mockito.doNothing().when(securityService).checkCurrentUserReadPermission(Mockito.any()); Mockito.doReturn(true).when(securityService) .hasCurrentUserReadPermission(Mockito.any(WithQualifiedObjectIdentifier.class)); - + Mockito.doReturn(true).when(securityService) + .hasCurrentUserServerPermission(ServerActions.CAN_EXPORT_MASTERDATA); + Mockito.doReturn(true).when(securityService).hasCurrentUserOneOfExplicitPermissions( + Mockito.any(WithQualifiedObjectIdentifier.class), Matchers. anyVararg()); // Setup source service RacingEventServiceImpl sourceService = Mockito.spy(new RacingEventServiceImpl()); diff --git a/java/com.sap.sailing.server.test/.project b/java/com.sap.sailing.server.test/.project index 7c0a92e867a..00790a85381 100755 --- a/java/com.sap.sailing.server.test/.project +++ b/java/com.sap.sailing.server.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java index 9a944a4da70..0679e3a175b 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java @@ -37,6 +37,7 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import org.mockito.Matchers; import org.mockito.Mockito; import com.mongodb.WriteConcern; @@ -152,6 +153,8 @@ import com.sap.sse.mongodb.MongoDBConfiguration; import com.sap.sse.mongodb.MongoDBService; import com.sap.sse.security.SecurityService; import com.sap.sse.security.shared.WithQualifiedObjectIdentifier; +import com.sap.sse.security.shared.impl.SecuredSecurityTypes.PublicReadableActions; +import com.sap.sse.security.shared.impl.SecuredSecurityTypes.ServerActions; import com.sap.sse.security.shared.impl.User; import com.sap.sse.security.shared.impl.UserGroupImpl; import com.sap.sse.shared.media.ImageDescriptor; @@ -205,6 +208,10 @@ public class MasterDataImportTest { Mockito.doReturn(true).when(securityService) .hasCurrentUserReadPermission(Mockito.any(WithQualifiedObjectIdentifier.class)); + Mockito.doReturn(true).when(securityService) + .hasCurrentUserServerPermission(ServerActions.CAN_EXPORT_MASTERDATA); + Mockito.doReturn(true).when(securityService).hasCurrentUserOneOfExplicitPermissions( + Mockito.any(WithQualifiedObjectIdentifier.class), Matchers. anyVararg()); Mockito.doReturn(true).when(fakeSubject).isAuthenticated(); diff --git a/java/com.sap.sailing.server.testsupport/.project b/java/com.sap.sailing.server.testsupport/.project index fc826dcca0d..a0f185411c2 100644 --- a/java/com.sap.sailing.server.testsupport/.project +++ b/java/com.sap.sailing.server.testsupport/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.server.trackfiles.test/.project b/java/com.sap.sailing.server.trackfiles.test/.project index 19d323089ec..c403e1e47bc 100644 --- a/java/com.sap.sailing.server.trackfiles.test/.project +++ b/java/com.sap.sailing.server.trackfiles.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.server.trackfiles/.project b/java/com.sap.sailing.server.trackfiles/.project index d4063f95610..df2f53072a2 100644 --- a/java/com.sap.sailing.server.trackfiles/.project +++ b/java/com.sap.sailing.server.trackfiles/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.server/.project b/java/com.sap.sailing.server/.project index a8b7a47686a..44872190a23 100755 --- a/java/com.sap.sailing.server/.project +++ b/java/com.sap.sailing.server/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.simulator.test/.project b/java/com.sap.sailing.simulator.test/.project index 6e91001fe19..1a788f5bab5 100644 --- a/java/com.sap.sailing.simulator.test/.project +++ b/java/com.sap.sailing.simulator.test/.project @@ -33,7 +33,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature com.gwtplugins.gwt.eclipse.core.gwtNature diff --git a/java/com.sap.sailing.simulator/.project b/java/com.sap.sailing.simulator/.project index f86820f24df..3a5a0c2b90e 100644 --- a/java/com.sap.sailing.simulator/.project +++ b/java/com.sap.sailing.simulator/.project @@ -32,7 +32,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature com.gwtplugins.gwt.eclipse.core.gwtNature diff --git a/java/com.sap.sailing.udpconnector/.project b/java/com.sap.sailing.udpconnector/.project index 4fd650e213a..d0418e99ebc 100755 --- a/java/com.sap.sailing.udpconnector/.project +++ b/java/com.sap.sailing.udpconnector/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.velum.resultimport.test/.project b/java/com.sap.sailing.velum.resultimport.test/.project index 0727bc8ef05..97b3c7d224f 100644 --- a/java/com.sap.sailing.velum.resultimport.test/.project +++ b/java/com.sap.sailing.velum.resultimport.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.velum.resultimport/.project b/java/com.sap.sailing.velum.resultimport/.project index 11d2ba9be5d..cf49e0d27b2 100644 --- a/java/com.sap.sailing.velum.resultimport/.project +++ b/java/com.sap.sailing.velum.resultimport/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.www/.project b/java/com.sap.sailing.www/.project index 9df335c4c2e..b12c4005bb7 100644 --- a/java/com.sap.sailing.www/.project +++ b/java/com.sap.sailing.www/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.www/release_notes_admin.html b/java/com.sap.sailing.www/release_notes_admin.html index 9102203011c..cafc0699e99 100755 --- a/java/com.sap.sailing.www/release_notes_admin.html +++ b/java/com.sap.sailing.www/release_notes_admin.html @@ -39,6 +39,17 @@ the current session's user as their owner, and the current session's user's default creation group as their owning group. +
  • Fixed issues with Manage2Sail regatta structure import: Imports of regattas with + no "ClassName" property, such as handicap / Yardstick regattas, will now create + regattas with "?" as boat class name to avoid other problems; furthermore, + due to a permission check that was too restrictive, regattas to import could not + be seen unless the user had "super-admin" power. +
  • +
  • Introduced a new permission SERVER:CAN_EXPORT_MASTERDATA:<server-name> + which controls if a user is allowed to export masterdata used by the MDI. + In addition, the user still needs to be able to read the data to be imported. + On the importing server, the user needs to have the permission SERVER:CAN_IMPORT_MASTERDATA:<server-name>. +
  • April 2019

    diff --git a/java/com.sap.sailing.xmlexport.test/.project b/java/com.sap.sailing.xmlexport.test/.project index 934210d75df..cd47961f79c 100755 --- a/java/com.sap.sailing.xmlexport.test/.project +++ b/java/com.sap.sailing.xmlexport.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.xmlexport/.project b/java/com.sap.sailing.xmlexport/.project index bd3d72fce05..ec76adc89c7 100755 --- a/java/com.sap.sailing.xmlexport/.project +++ b/java/com.sap.sailing.xmlexport/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.xrr.resultimport.test/.project b/java/com.sap.sailing.xrr.resultimport.test/.project index 45f7b28d352..2517026127f 100755 --- a/java/com.sap.sailing.xrr.resultimport.test/.project +++ b/java/com.sap.sailing.xrr.resultimport.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.xrr.resultimport/.project b/java/com.sap.sailing.xrr.resultimport/.project index f10ca5c0495..abcada1b2e1 100755 --- a/java/com.sap.sailing.xrr.resultimport/.project +++ b/java/com.sap.sailing.xrr.resultimport/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.xrr.schema/.project b/java/com.sap.sailing.xrr.schema/.project index 764fa04e83c..87143d30c4d 100755 --- a/java/com.sap.sailing.xrr.schema/.project +++ b/java/com.sap.sailing.xrr.schema/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.xrr.structureimport/.project b/java/com.sap.sailing.xrr.structureimport/.project index e45cbe00588..91d75987eac 100755 --- a/java/com.sap.sailing.xrr.structureimport/.project +++ b/java/com.sap.sailing.xrr.structureimport/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.xrr.structureimport/src/com/sap/sailing/xrr/structureimport/StructureImporter.java b/java/com.sap.sailing.xrr.structureimport/src/com/sap/sailing/xrr/structureimport/StructureImporter.java index f5f77368012..cb0c8483d56 100755 --- a/java/com.sap.sailing.xrr.structureimport/src/com/sap/sailing/xrr/structureimport/StructureImporter.java +++ b/java/com.sap.sailing.xrr.structureimport/src/com/sap/sailing/xrr/structureimport/StructureImporter.java @@ -30,6 +30,7 @@ import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.SeriesImpl; import com.sap.sailing.domain.base.impl.TeamImpl; +import com.sap.sailing.domain.common.BoatClassMasterdata; import com.sap.sailing.domain.common.CompetitorRegistrationType; import com.sap.sailing.domain.common.FleetColors; import com.sap.sailing.domain.common.LeaderboardNameConstants; @@ -64,6 +65,7 @@ public class StructureImporter { private LinkedHashMap boatForPerson; private final DomainFactory baseDomainFactory; private final SetRacenumberStrategy setRacenumberStrategy; + private final static String UNKNOWN_BOATCLASS_NAME = "?"; public StructureImporter(SetRacenumberStrategy setRacenumber, DomainFactory baseDomainFactory) { this.setRacenumberStrategy = setRacenumber; @@ -98,9 +100,18 @@ public class StructureImporter { BuildStructure buildStructure = new BuildStructure(races); final TimePoint startDate = null; // TODO can regatta start time be inferred from XRR document? final TimePoint endDate = null; // TODO can regatta end time be inferred from XRR document? - RegattaImpl regatta = new RegattaImpl(RegattaImpl.getDefaultName(event.getTitle(), ((Division) event - .getRaceOrDivisionOrRegattaSeriesResult().get(0)).getTitle()), - baseDomainFactory.getOrCreateBoatClass(result.getA().getBoatClass()), + final String regattaName = RegattaImpl.getDefaultName(event.getTitle(), ((Division) event + .getRaceOrDivisionOrRegattaSeriesResult().get(0)).getTitle()); + final String boatClassName; + if (result.getA().getBoatClass() != null) { + boatClassName = result.getA().getBoatClass(); + } else { + // we need a boat class; use some default + logger.warning("No boat class set in regatta to import: "+regattaName+". Setting to \""+UNKNOWN_BOATCLASS_NAME+"\""); + boatClassName = UNKNOWN_BOATCLASS_NAME; + } + RegattaImpl regatta = new RegattaImpl(regattaName, + baseDomainFactory.getOrCreateBoatClass(boatClassName), /* canBoatsOfCompetitorsChangePerRace */ true, CompetitorRegistrationType.CLOSED, startDate, endDate, getSeries(buildStructure), false, this.baseDomainFactory.createScoringScheme(ScoringSchemeType.LOW_POINT), event.getEventID(), null, diff --git a/java/com.sap.sailing.yachtscoring.resultimport.test/.project b/java/com.sap.sailing.yachtscoring.resultimport.test/.project index cabaf35e444..53fa925c263 100644 --- a/java/com.sap.sailing.yachtscoring.resultimport.test/.project +++ b/java/com.sap.sailing.yachtscoring.resultimport.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sailing.yachtscoring.resultimport/.project b/java/com.sap.sailing.yachtscoring.resultimport/.project index 7de1281b339..b18c82ab8e6 100644 --- a/java/com.sap.sailing.yachtscoring.resultimport/.project +++ b/java/com.sap.sailing.yachtscoring.resultimport/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.common.test/.project b/java/com.sap.sse.common.test/.project index c108b8c5327..54b8a7f747d 100644 --- a/java/com.sap.sse.common.test/.project +++ b/java/com.sap.sse.common.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.common/.project b/java/com.sap.sse.common/.project index c28bb7a5e5a..030e33f04a1 100644 --- a/java/com.sap.sse.common/.project +++ b/java/com.sap.sse.common/.project @@ -32,7 +32,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature com.gwtplugins.gwt.eclipse.core.gwtNature diff --git a/java/com.sap.sse.datamining.annotations/.project b/java/com.sap.sse.datamining.annotations/.project index 58c1e5bd5f5..8987fe5d1af 100644 --- a/java/com.sap.sse.datamining.annotations/.project +++ b/java/com.sap.sse.datamining.annotations/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.datamining.shared/.project b/java/com.sap.sse.datamining.shared/.project index 4930800502d..e249f61c253 100644 --- a/java/com.sap.sse.datamining.shared/.project +++ b/java/com.sap.sse.datamining.shared/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.datamining.test/.project b/java/com.sap.sse.datamining.test/.project index 3867b76f31a..b9bc7178bb5 100644 --- a/java/com.sap.sse.datamining.test/.project +++ b/java/com.sap.sse.datamining.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.datamining.ui.test/.project b/java/com.sap.sse.datamining.ui.test/.project index ad59090e252..947c121d794 100644 --- a/java/com.sap.sse.datamining.ui.test/.project +++ b/java/com.sap.sse.datamining.ui.test/.project @@ -32,7 +32,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature com.gwtplugins.gwt.eclipse.core.gwtNature diff --git a/java/com.sap.sse.datamining.ui/.project b/java/com.sap.sse.datamining.ui/.project index 003e74ffac2..8fe32bc8da4 100644 --- a/java/com.sap.sse.datamining.ui/.project +++ b/java/com.sap.sse.datamining.ui/.project @@ -32,7 +32,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature com.gwtplugins.gwt.eclipse.core.gwtNature diff --git a/java/com.sap.sse.datamining/.project b/java/com.sap.sse.datamining/.project index 233a003e667..853ccbc27ae 100644 --- a/java/com.sap.sse.datamining/.project +++ b/java/com.sap.sse.datamining/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.filestorage.test/.project b/java/com.sap.sse.filestorage.test/.project index abfcae8ae1a..bde66d2313d 100644 --- a/java/com.sap.sse.filestorage.test/.project +++ b/java/com.sap.sse.filestorage.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.filestorage/.project b/java/com.sap.sse.filestorage/.project index d769cf7f224..e6e174381b7 100755 --- a/java/com.sap.sse.filestorage/.project +++ b/java/com.sap.sse.filestorage/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.gwt.adminconsole/.project b/java/com.sap.sse.gwt.adminconsole/.project index 045c56ed0c0..27df14a5add 100755 --- a/java/com.sap.sse.gwt.adminconsole/.project +++ b/java/com.sap.sse.gwt.adminconsole/.project @@ -32,7 +32,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature com.gwtplugins.gwt.eclipse.core.gwtNature diff --git a/java/com.sap.sse.gwt.test/.project b/java/com.sap.sse.gwt.test/.project index 537b0feb168..66bec80c524 100644 --- a/java/com.sap.sse.gwt.test/.project +++ b/java/com.sap.sse.gwt.test/.project @@ -32,7 +32,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature com.gwtplugins.gwt.eclipse.core.gwtNature diff --git a/java/com.sap.sse.jersey.jaxbdependencyfragment/.project b/java/com.sap.sse.jersey.jaxbdependencyfragment/.project index 9036413ab0b..9aa7b45b542 100755 --- a/java/com.sap.sse.jersey.jaxbdependencyfragment/.project +++ b/java/com.sap.sse.jersey.jaxbdependencyfragment/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.jettyextensions/.project b/java/com.sap.sse.jettyextensions/.project index a895d460939..87a4878e94d 100755 --- a/java/com.sap.sse.jettyextensions/.project +++ b/java/com.sap.sse.jettyextensions/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.mail.replication.test/.project b/java/com.sap.sse.mail.replication.test/.project index 51fa2fe50fb..aaa106da7ac 100755 --- a/java/com.sap.sse.mail.replication.test/.project +++ b/java/com.sap.sse.mail.replication.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.mail.replication.testsupport/.project b/java/com.sap.sse.mail.replication.testsupport/.project index 1d1e9965612..e89959d9584 100755 --- a/java/com.sap.sse.mail.replication.testsupport/.project +++ b/java/com.sap.sse.mail.replication.testsupport/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.mail/.project b/java/com.sap.sse.mail/.project index a9824e60a43..9a8b9d7a5de 100755 --- a/java/com.sap.sse.mail/.project +++ b/java/com.sap.sse.mail/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.mongodb/.project b/java/com.sap.sse.mongodb/.project index c39b3395c38..a8f6e0d5c84 100755 --- a/java/com.sap.sse.mongodb/.project +++ b/java/com.sap.sse.mongodb/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.operationaltransformation.test/.project b/java/com.sap.sse.operationaltransformation.test/.project index 5545736d716..14979299b19 100755 --- a/java/com.sap.sse.operationaltransformation.test/.project +++ b/java/com.sap.sse.operationaltransformation.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.operationaltransformation/.project b/java/com.sap.sse.operationaltransformation/.project index de9bfe64079..69dcc0d88bc 100755 --- a/java/com.sap.sse.operationaltransformation/.project +++ b/java/com.sap.sse.operationaltransformation/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.replication.interfaces/.project b/java/com.sap.sse.replication.interfaces/.project index 6379d22889e..e035a961c24 100755 --- a/java/com.sap.sse.replication.interfaces/.project +++ b/java/com.sap.sse.replication.interfaces/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.replication.testsupport/.project b/java/com.sap.sse.replication.testsupport/.project index b9ba602570e..41db88d512b 100755 --- a/java/com.sap.sse.replication.testsupport/.project +++ b/java/com.sap.sse.replication.testsupport/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.replication/.project b/java/com.sap.sse.replication/.project index 968a30d87fa..a87afbfadce 100644 --- a/java/com.sap.sse.replication/.project +++ b/java/com.sap.sse.replication/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.security.common/.project b/java/com.sap.sse.security.common/.project index f250403412d..c0398336b8d 100755 --- a/java/com.sap.sse.security.common/.project +++ b/java/com.sap.sse.security.common/.project @@ -32,7 +32,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature com.gwtplugins.gwt.eclipse.core.gwtNature diff --git a/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/impl/SecuredSecurityTypes.java b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/impl/SecuredSecurityTypes.java index d693a0ba890..8f434d81df9 100644 --- a/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/impl/SecuredSecurityTypes.java +++ b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/impl/SecuredSecurityTypes.java @@ -83,6 +83,7 @@ public class SecuredSecurityTypes extends HasPermissionsImpl { DATA_MINING, CAN_IMPORT_MASTERDATA, + CAN_EXPORT_MASTERDATA, /** * Secures replication actions on the master side. */ @@ -97,7 +98,7 @@ public class SecuredSecurityTypes extends HasPermissionsImpl { READ_REPLICATOR; private static final Action[] ALL_ACTIONS = new Action[] { CONFIGURE_FILE_STORAGE, CONFIGURE_LOCAL_SERVER, - CONFIGURE_REMOTE_INSTANCES, CREATE_OBJECT, CAN_IMPORT_MASTERDATA, DATA_MINING, + CONFIGURE_REMOTE_INSTANCES, CREATE_OBJECT, CAN_IMPORT_MASTERDATA, CAN_EXPORT_MASTERDATA, DATA_MINING, REPLICATE, START_REPLICATION, READ_REPLICATOR, DefaultActions.CHANGE_OWNERSHIP, DefaultActions.CHANGE_ACL, DefaultActions.UPDATE }; } diff --git a/java/com.sap.sse.security.interface/.project b/java/com.sap.sse.security.interface/.project index a1bdef0ba7a..f06070b860d 100644 --- a/java/com.sap.sse.security.interface/.project +++ b/java/com.sap.sse.security.interface/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.security.persistence.test/.project b/java/com.sap.sse.security.persistence.test/.project index 204d81c317e..07ddced6727 100755 --- a/java/com.sap.sse.security.persistence.test/.project +++ b/java/com.sap.sse.security.persistence.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.security.persistence/.project b/java/com.sap.sse.security.persistence/.project index a155be2d55a..fa493986490 100755 --- a/java/com.sap.sse.security.persistence/.project +++ b/java/com.sap.sse.security.persistence/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.security.replication.test/.project b/java/com.sap.sse.security.replication.test/.project index f22f7fea878..99c8fa740ec 100755 --- a/java/com.sap.sse.security.replication.test/.project +++ b/java/com.sap.sse.security.replication.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.security.test/.project b/java/com.sap.sse.security.test/.project index 5d73df4afae..1bed205b6f2 100644 --- a/java/com.sap.sse.security.test/.project +++ b/java/com.sap.sse.security.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.security.testsupport/.project b/java/com.sap.sse.security.testsupport/.project index 00fe204247e..5421c54b5b2 100755 --- a/java/com.sap.sse.security.testsupport/.project +++ b/java/com.sap.sse.security.testsupport/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.security.ui/.project b/java/com.sap.sse.security.ui/.project index b2c40005b31..9eb58d17896 100644 --- a/java/com.sap.sse.security.ui/.project +++ b/java/com.sap.sse.security.ui/.project @@ -32,7 +32,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature com.gwtplugins.gwt.eclipse.core.gwtNature diff --git a/java/com.sap.sse.security.userstore.mongodb/.project b/java/com.sap.sse.security.userstore.mongodb/.project index e444758d688..86c213b04ce 100644 --- a/java/com.sap.sse.security.userstore.mongodb/.project +++ b/java/com.sap.sse.security.userstore.mongodb/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.security/.project b/java/com.sap.sse.security/.project index e77bf03511e..9e4d21d0786 100644 --- a/java/com.sap.sse.security/.project +++ b/java/com.sap.sse.security/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java b/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java index 441ef4719ed..60afdbb4eb0 100644 --- a/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java +++ b/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java @@ -42,9 +42,10 @@ import com.sap.sse.security.shared.WithQualifiedObjectIdentifier; import com.sap.sse.security.shared.impl.AccessControlList; import com.sap.sse.security.shared.impl.Ownership; import com.sap.sse.security.shared.impl.Role; +import com.sap.sse.security.shared.impl.SecuredSecurityTypes; +import com.sap.sse.security.shared.impl.SecuredSecurityTypes.ServerActions; import com.sap.sse.security.shared.impl.User; import com.sap.sse.security.shared.impl.UserGroup; -import com.sap.sse.security.shared.impl.SecuredSecurityTypes.ServerActions; /** * A service interface for security management. Intended to be used as an OSGi service that can be registered, e.g., by @@ -606,4 +607,16 @@ public interface SecurityService extends ReplicableWithObjectInputStream sessionsAlreadyScheduledForOnChange = new WeakHashMap<>(); + private static final Object DUMMY = new Object(); // for use as dummy value in sessionsAlreadyScheduledForOnChange + + private static final ConcurrentWeakHashMap sessionsAlreadyScheduledForOnChange = new ConcurrentWeakHashMap<>(); public SecurityWebSessionManager() { super(); @@ -56,7 +57,7 @@ public class SecurityWebSessionManager extends DefaultWebSessionManager { private void triggerOnChangeLatestInHalfTimeoutPeriod(Session s) { Duration sendDurationLatestIn = new MillisecondsDurationImpl(s.getTimeout()).minus(MAX_DURATION_ASSUMED_FOR_MESSAGE_DELIVERY); if (!sessionsAlreadyScheduledForOnChange.containsKey(s)) { - sessionsAlreadyScheduledForOnChange.put(s, null); + sessionsAlreadyScheduledForOnChange.put(s, DUMMY); timer.schedule(()->{ onChange(s); sessionsAlreadyScheduledForOnChange.remove(s); }, MillisecondsTimePoint.now().plus( sendDurationLatestIn.compareTo(MAX_DURATION_AFTER_WHICH_TO_PING_SESSION) > 0 ? diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java b/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java index ad0a471bdac..2ec9b5dcbf0 100644 --- a/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java +++ b/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java @@ -1668,9 +1668,7 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat } if (doServerCreateObjectCheck) { - SecurityUtils.getSubject() - .checkPermission(SecuredSecurityTypes.SERVER.getStringPermissionForTypeRelativeIdentifier( - ServerActions.CREATE_OBJECT, new TypeRelativeObjectIdentifier(ServerInfo.getName()))); + checkCurrentUserServerPermission(ServerActions.CREATE_OBJECT); } try { SecurityUtils.getSubject().checkPermission(identifier.getStringPermission(DefaultActions.CREATE)); @@ -1700,6 +1698,21 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat return result; } + @Override + public boolean hasCurrentUserServerPermission(ServerActions action) { + return SecurityUtils.getSubject().isPermitted(constructServerPermissionString(action)); + } + + @Override + public void checkCurrentUserServerPermission(ServerActions action) { + SecurityUtils.getSubject().checkPermission(constructServerPermissionString(action)); + } + + private String constructServerPermissionString(ServerActions action) { + return SecuredSecurityTypes.SERVER.getStringPermissionForTypeRelativeIdentifier( + action, new TypeRelativeObjectIdentifier(ServerInfo.getName())); + } + @Override public T setOwnershipWithoutCheckPermissionForObjectCreationAndRevertOnError(HasPermissions type, TypeRelativeObjectIdentifier typeIdentifier, String securityDisplayName, Callable actionWithResult) { diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/jaxrs/ShiroAuthorizationExceptionTo401ResponseMapper.java b/java/com.sap.sse.security/src/com/sap/sse/security/jaxrs/ShiroAuthorizationExceptionTo401ResponseMapper.java index bac0245a0f0..ff7e10b8e75 100755 --- a/java/com.sap.sse.security/src/com/sap/sse/security/jaxrs/ShiroAuthorizationExceptionTo401ResponseMapper.java +++ b/java/com.sap.sse.security/src/com/sap/sse/security/jaxrs/ShiroAuthorizationExceptionTo401ResponseMapper.java @@ -1,5 +1,8 @@ package com.sap.sse.security.jaxrs; +import java.util.logging.Level; +import java.util.logging.Logger; + import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import javax.ws.rs.ext.ExceptionMapper; @@ -9,8 +12,10 @@ import org.apache.shiro.authz.AuthorizationException; @Provider public class ShiroAuthorizationExceptionTo401ResponseMapper implements ExceptionMapper { + private static final Logger logger = Logger.getLogger(ShiroAuthorizationExceptionTo401ResponseMapper.class.getName()); @Override public Response toResponse(AuthorizationException exception) { + logger.log(Level.WARNING, "AuthorizationException occurred in REST call: " + exception.getMessage()); return Response.status(Status.UNAUTHORIZED).entity(exception.getMessage()).build(); } } diff --git a/java/com.sap.sse.shared.android.test/.project b/java/com.sap.sse.shared.android.test/.project index a32b5afbd2d..5b23c8744f2 100644 --- a/java/com.sap.sse.shared.android.test/.project +++ b/java/com.sap.sse.shared.android.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.shared.android/.project b/java/com.sap.sse.shared.android/.project index 1ced6293522..353ba7cc333 100755 --- a/java/com.sap.sse.shared.android/.project +++ b/java/com.sap.sse.shared.android/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.test/.project b/java/com.sap.sse.test/.project index fefd499bfc5..24a5af0d237 100644 --- a/java/com.sap.sse.test/.project +++ b/java/com.sap.sse.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse.threadmanager/.project b/java/com.sap.sse.threadmanager/.project index f7b52e2c2e9..07348460594 100644 --- a/java/com.sap.sse.threadmanager/.project +++ b/java/com.sap.sse.threadmanager/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.sap.sse/.project b/java/com.sap.sse/.project index ae82bf33116..b43816a868d 100755 --- a/java/com.sap.sse/.project +++ b/java/com.sap.sse/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/com.tractrac.clientmodule/.project b/java/com.tractrac.clientmodule/.project index 3d2dfd4b8b0..eae30e2cd37 100755 --- a/java/com.tractrac.clientmodule/.project +++ b/java/com.tractrac.clientmodule/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/net.sf.marineapi.test/.project b/java/net.sf.marineapi.test/.project index e04929144ac..fb982b808dc 100755 --- a/java/net.sf.marineapi.test/.project +++ b/java/net.sf.marineapi.test/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/net.sf.marineapi/.project b/java/net.sf.marineapi/.project index 4dec2646755..863f9316491 100755 --- a/java/net.sf.marineapi/.project +++ b/java/net.sf.marineapi/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/org.json.simple/.project b/java/org.json.simple/.project index 14f0b0e639d..ee6a79b108b 100755 --- a/java/org.json.simple/.project +++ b/java/org.json.simple/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/org.moxieapps.gwt.highcharts/.project b/java/org.moxieapps.gwt.highcharts/.project index 0b77374036c..bc1efa03bb1 100755 --- a/java/org.moxieapps.gwt.highcharts/.project +++ b/java/org.moxieapps.gwt.highcharts/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/org.mp4parser.isoparser/.project b/java/org.mp4parser.isoparser/.project index 99468a6d49f..7e53eacca25 100644 --- a/java/org.mp4parser.isoparser/.project +++ b/java/org.mp4parser.isoparser/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/java/org.openqa.selenium.osgi/.project b/java/org.openqa.selenium.osgi/.project index 672e20251ec..e9b400b1210 100644 --- a/java/org.openqa.selenium.osgi/.project +++ b/java/org.openqa.selenium.osgi/.project @@ -22,7 +22,6 @@ - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature