diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceWindCalculator.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceWindCalculator.java index 5692a2c19a8..7a0e7e5237a 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceWindCalculator.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceWindCalculator.java @@ -40,30 +40,32 @@ public class RaceWindCalculator { private WindSummary getTrackedRaceWindSummary(TrackedRace trackedRace) { final TimePoint startOfRace = trackedRace.getStartOfRace(); + final WindSummary result; if (startOfRace == null) { - return null; - } - final TimePoint finishedTime = trackedRace.getFinishedTime(); - final TimePoint endOfRace = trackedRace.getEndOfRace(); - final TimePoint finishTime = finishedTime == null ? - endOfRace == null ? MillisecondsTimePoint.now().minus(trackedRace.getDelayToLiveInMillis()) : endOfRace : finishedTime; - final TimePoint newestEvent = trackedRace.getTimePointOfNewestEvent(); - final TimePoint toTimePoint; - if (newestEvent != null && newestEvent.before(finishTime)) { - toTimePoint = newestEvent; + result = null; } else { - toTimePoint = finishTime; - } - final TimePoint middleOfRace = startOfRace.plus(startOfRace.until(toTimePoint).divide(2)); - final List pointsToGetWind = Arrays.asList(startOfRace, middleOfRace, toTimePoint); - final List>> windFixesToUse = new ArrayList<>(3); - for (TimePoint timePoint : pointsToGetWind) { - final WindWithConfidence> windFixToUse = getWindFromTrackedRace(timePoint, trackedRace); - if (windFixToUse != null) { - windFixesToUse.add(windFixToUse); + final TimePoint finishedTime = trackedRace.getFinishedTime(); + final TimePoint endOfRace = trackedRace.getEndOfRace(); + final TimePoint finishTime = finishedTime == null ? + endOfRace == null ? MillisecondsTimePoint.now().minus(trackedRace.getDelayToLiveInMillis()) : endOfRace : finishedTime; + final TimePoint newestEvent = trackedRace.getTimePointOfNewestEvent(); + final TimePoint toTimePoint; + if (newestEvent != null && newestEvent.before(finishTime)) { + toTimePoint = newestEvent; + } else { + toTimePoint = finishTime; } + final TimePoint middleOfRace = startOfRace.plus(startOfRace.until(toTimePoint).divide(2)); + final List pointsToGetWind = Arrays.asList(startOfRace, middleOfRace, toTimePoint); + final List>> windFixesToUse = new ArrayList<>(3); + for (TimePoint timePoint : pointsToGetWind) { + final WindWithConfidence> windFixToUse = getWindFromTrackedRace(timePoint, trackedRace); + if (windFixToUse != null) { + windFixesToUse.add(windFixToUse); + } + } + result = createWindSummaryFromWindFixes(middleOfRace, windFixesToUse); } - final WindSummary result = createWindSummaryFromWindFixes(middleOfRace, windFixesToUse); return result; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_es.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_es.properties index 76a7df1a58f..5058ca463eb 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_es.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_es.properties @@ -1436,7 +1436,6 @@ gotoDesktop=Ir a la versión de escritorio goBack=Volver showAllX=Mostrar todo {0} collapseX=Comprimir {0} - numberOfGPSFixes=Correcciones de GPS fastestSailor=Más rápido highestSpeed=Máxima velocidad @@ -2327,3 +2326,4 @@ orcPerformanceCurveLegTypeDescriptionConstructedCourse=Regata construida; cada m orcPerformanceCurveLegTypeDescriptionWindwardLeeward=Regata de barlovento/sotavento (arriba y abajo) es una regata convencional alrededor de marcas de barlovento y sotavento donde la regata de carrera consiste en tramos de 50% de viento a barlovento y 50% de viento a sotavento.\nDurante la carrera, los cálculos ignoran el tipo de tramo real (barlovento/sotavento). orcPerformanceCurveLegTypeDescriptionWindwardLeewardRealLive=Regata de barlovento/sotavento (arriba y abajo) es una regata convencional alrededor de marcas de barlovento y sotavento donde la regata de carrera consiste en tramos de 50% de viento a barlovento y 50% de viento a sotavento.\nDurante la carrera, los tramos de barlovento y sotavento se modelan automáticamente como tramos de "regatas construidas" respectivamente para mejores predicciones, mientras que tras la carrera los valores medios se aplicarán a todos los tramos. errorWhileLoadingUserSettings=Error al cargar las opciones de usuario: {0} +certificates=Certificados diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_fr.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_fr.properties index 43eefab329c..607b7a34517 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_fr.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_fr.properties @@ -1436,7 +1436,6 @@ gotoDesktop=Aller à la version bureau goBack=Retour showAllX=Afficher tout {0} collapseX=Réduire {0} - numberOfGPSFixes=Positions GPS fastestSailor=Le plus rapide highestSpeed=Vitesse maximale @@ -2327,3 +2326,4 @@ orcPerformanceCurveLegTypeDescriptionConstructedCourse=Parcours construit. La co orcPerformanceCurveLegTypeDescriptionWindwardLeeward="Windward/Leeward" (au vent et sous le vent) est un parcours conventionnel autour des marques Au vent et Sous le vent où le parcours de la course se compose de portions de parcours à 50 % dans le lit du vent et à 50 % avec vent arrière.\nPendant la course, le type de portion de parcours réel (dans le lit du vent/vent arrière) ne sera pas pris en compte par les calculs. orcPerformanceCurveLegTypeDescriptionWindwardLeewardRealLive="Windward/Leeward" (au vent et sous le vent) est un parcours conventionnel autour des marques Au vent et Sous le vent où le parcours de la course se compose de portions de parcours à 50 % dans le lit du vent et à 50 % avec vent arrière.\nPendant la course, les portions de parcours dans le lit du vent et avec vent arrière seront automatiquement modélisées respectivement comme portions de parcours de "course construite" afin d''obtenir de meilleures prévisions, alors qu''après la course, les valeurs moyennes s''appliqueront à toutes les portions de parcours. errorWhileLoadingUserSettings=Erreur lors du chargement des options utilisateur : {0} +certificates=Certificats diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_it.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_it.properties index a7e4848d5c2..5db5150fb35 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_it.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_it.properties @@ -1436,7 +1436,6 @@ gotoDesktop=Vai a versione desktop goBack=Indietro showAllX=Mostra tutto {0} collapseX=Comprimi {0} - numberOfGPSFixes=Punti nave GPS fastestSailor=Più veloce highestSpeed=Velocità massima @@ -2327,3 +2326,4 @@ orcPerformanceCurveLegTypeDescriptionConstructedCourse=Rotta costruita; il compe orcPerformanceCurveLegTypeDescriptionWindwardLeeward=Distanza sopravento/sottovento è una rotta convenzionale intorno a segnali di distanza sopravento/sottovento che consiste di tratte 50% sopravento e 50% sottovento.\nDurante la gara i calcoli non terranno conto del tipo di tratta effettivo (sopravento/sottovento). orcPerformanceCurveLegTypeDescriptionWindwardLeewardRealLive=Distanza sopravento/sottovento è una rotta convenzionale intorno a segnali di distanza sopravento/sottovento che consiste di tratte 50% sopravento e 50% sottovento.\nDurante la gara, le tratte sopravento e sottovento vengono modellate come rispettive tratte con "rotta costruita" per migliori previsioni, mentre dopo la gara i valori medi saranno applicati a tutte le tratte. errorWhileLoadingUserSettings=Errore durante il caricamento delle impostazioni utente: {0} +certificates=Certificati diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties index 9cf5086812c..93b4b8b24e5 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties @@ -1436,7 +1436,6 @@ gotoDesktop=デスクトップバージョンにジャンプ goBack=戻る showAllX=全 {0} を表示 collapseX={0} を圧縮 - numberOfGPSFixes=GPS フィックス fastestSailor=最速 highestSpeed=最高速度 @@ -2327,3 +2326,4 @@ orcPerformanceCurveLegTypeDescriptionConstructedCourse=Constructed (コンスト orcPerformanceCurveLegTypeDescriptionWindwardLeeward=Windward/Leeward (風上と風下) は、レースコースが 50% の風上レグと 50% の風下レグから構成される、風上および風下マークを周回する一般的なコースです。\nレース中は、実際のレグタイプ (風上/風下) は計算では無視されます。 orcPerformanceCurveLegTypeDescriptionWindwardLeewardRealLive=Windward/Leeward (風上と風下) は、レースコースが 50% の風上レグと 50% の風下レグから構成される、風上および風下マークを周回する一般的なコースです。\nレース中は、風上レグと風下レグは予測をより良いものとするため、それぞれの "Constructed コース" レグとして自動的にモデル化され、一方、レース後は平均した値がすべてのレグに適用されます。 errorWhileLoadingUserSettings=ユーザ設定のロード中にエラーが発生: {0} +certificates=証明書 diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_pt.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_pt.properties index ce40cbbcbb1..da62f877b06 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_pt.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_pt.properties @@ -1436,7 +1436,6 @@ gotoDesktop=Ir para versão desktop goBack=Voltar showAllX=Visualizar todos os {0} collapseX=Comprimir {0} - numberOfGPSFixes=Pontos fixos de GPS fastestSailor=O mais rápido highestSpeed=Velocidade mais alta @@ -2327,3 +2326,4 @@ orcPerformanceCurveLegTypeDescriptionConstructedCourse=Percurso construído; a b orcPerformanceCurveLegTypeDescriptionWindwardLeeward=Barlavento/sotavento (contravento e popa) é um percurso convencional em volta de marcas de barlavento e sotavento, em que o percurso da corrida é composto por 50% de pernas de contravento e 50% de pernas de popa.\nDurante a corrida, o tipo de perna real (contravento/popa) será ignorado por todos os cálculos. orcPerformanceCurveLegTypeDescriptionWindwardLeewardRealLive=Barlavento/sotavento (contravento e popa) é um percurso convencional em volta de marcas de barlavento e sotavento, em que o percurso da corrida é composto por 50% de pernas de contravento e 50% de pernas de popa.\nDurante a corrida, as pernas de contravento e de popa serão modeladas automaticamente como pernas de "percurso construído" respectivas para melhores previsões, enquanto que depois da corrida, os valores médios serão aplicados a todas as pernas. errorWhileLoadingUserSettings=Erro ao carregar configurações do usuário: {0} +certificates=Certificados diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index f8ae0b89c7a..c43552ca2e5 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -1436,7 +1436,6 @@ gotoDesktop=Перейти на версию для рабочего стола goBack=Назад showAllX=Показать все {0} collapseX=Свернуть {0} - numberOfGPSFixes=Замеры GPS fastestSailor=Самый быстрый highestSpeed=Наивысшая скорость @@ -2327,3 +2326,4 @@ orcPerformanceCurveLegTypeDescriptionConstructedCourse=Конструируем orcPerformanceCurveLegTypeDescriptionWindwardLeeward=На ветре/под ветром (по ветру и против ветра): обычный курс вокруг наветренных и подветренных знаков, где курс гонки состоит из 50% наветренных и 50% подветренных отрезков.\nПри расчетах фактический тип отрезка (по ветру/против ветра) в ходе гонки будет игнорироваться. orcPerformanceCurveLegTypeDescriptionWindwardLeewardRealLive=На ветре/под ветром (по ветру и против ветра): обычный курс вокруг наветренных и подветренных знаков, где курс гонки состоит из 50% наветренных и 50% подветренных отрезков.\nВ ходе гонки наветренные и подветренные отрезки будут автоматически моделироваться как соответствующие отрезки "конструируемого курса" для лучшего прогнозирования, а после гонки для всех этапов будут применяться усредненные значения. errorWhileLoadingUserSettings=Ошибка при загрузке пользовательских настроек: {0} +certificates=Сертификаты diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties index adbc97586d6..ae95b98bbef 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties @@ -1436,7 +1436,6 @@ gotoDesktop=进入桌面版 goBack=返回 showAllX=显示所有{0} collapseX=折叠{0} - numberOfGPSFixes=GPS 修复 fastestSailor=最快 highestSpeed=最高速度 @@ -1566,7 +1565,7 @@ playstoreInsightApp=https://play.google.com/store/apps/details?id=com.sap.sailin playstoreRacecommitteeApp=https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app playStoreBuoyPingerApp=https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app playstoreBadge=https://play.google.com/intl/en_us/badges/static/images/badges/zh-cn_badge_web_generic.png -appstoreSapSailInsight=https://apps.apple.com/cn/app/sap-sail-insight/id1087154208 +appstoreSapSailInsight=https://itunes.apple.com/cn/app/sap-sail-insight/id1087154208 appstoreBadgeSuffix=_cn distanceFromAveragePosition=与平均位置的距离 useATouchOptimizedUI=使用触摸优化的 UI 移动修复 @@ -2327,3 +2326,4 @@ orcPerformanceCurveLegTypeDescriptionConstructedCourse=已构建的航向;每 orcPerformanceCurveLegTypeDescriptionWindwardLeeward=上风/下风(向上和向下)是围绕上风和下风标记的常规航向,其中,航向由 50% 上风和 50% 的下风航段构成。\n在竞赛期间,实际航段类型(上风/下风)会被计算忽略。 orcPerformanceCurveLegTypeDescriptionWindwardLeewardRealLive=上风/下风(向上和向下)是围绕上风和下风标记的常规航向,其中,航向由 50% 上风和 50% 的下风航段构成。\n在竞赛期间,上风和下风航段会被自动视为各自的“已构建航向”以便获取更好的预测,而在竞赛之后,平均值将应用于所有航段。 errorWhileLoadingUserSettings=加载用户设置时发生错误:{0} +certificates=证书 diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/SeriesJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/SeriesJsonSerializer.java index 167c92d787f..c31079ddf13 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/SeriesJsonSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/SeriesJsonSerializer.java @@ -66,6 +66,7 @@ public class SeriesJsonSerializer implements JsonSerializer { raceColumnJson.put("isLive", trackedRace.isLive(MillisecondsTimePoint.now())); raceColumnJson.put("isTracked", true); raceColumnJson.put("trackedRaceName", trackedRace.getRace().getName()); + raceColumnJson.put("raceId", trackedRace.getRace().getId().toString()); raceColumnJson.put("hasGpsData", trackedRace.hasGPSData()); raceColumnJson.put("hasWindData", trackedRace.hasWindData()); } else { diff --git a/java/com.sap.sse.common/src/com/sap/sse/SSECommon.gwt.xml b/java/com.sap.sse.common/src/com/sap/sse/SSECommon.gwt.xml index e85f55a5493..fd234c574ee 100644 --- a/java/com.sap.sse.common/src/com/sap/sse/SSECommon.gwt.xml +++ b/java/com.sap.sse.common/src/com/sap/sse/SSECommon.gwt.xml @@ -2,4 +2,9 @@ + + diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementService.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementService.java index b21df5941b5..1e5a61e3194 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementService.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementService.java @@ -77,7 +77,7 @@ public interface UserManagementService extends RemoteService { void putRoleDefintionToUserGroup(String userGroupIdAsString, String roleDefinitionIdAsString, boolean forAll) throws UnauthorizedException, org.apache.shiro.authz.UnauthorizedException; - void removeRoleDefintionFromUserGroup(String userGroupIdAsString, String roleDefinitionIdAsString) + void removeRoleDefinitionFromUserGroup(String userGroupIdAsString, String roleDefinitionIdAsString) throws UnauthorizedException, org.apache.shiro.authz.UnauthorizedException; Collection getUserList() throws UnauthorizedException, org.apache.shiro.authz.UnauthorizedException; diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementServiceAsync.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementServiceAsync.java index 25e8e24dc92..a44a6e5b0fe 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementServiceAsync.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementServiceAsync.java @@ -73,7 +73,7 @@ public interface UserManagementServiceAsync { void putRoleDefintionToUserGroup(String userGroupIdAsString, String roleDefinitionIdAsString, boolean forAll, AsyncCallback callback); - void removeRoleDefintionFromUserGroup(String userGroupIdAsString, String roleDefinitionIdAsString, + void removeRoleDefinitionFromUserGroup(String userGroupIdAsString, String roleDefinitionIdAsString, AsyncCallback callback); /** diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/roles/RoleDefinitionTableWrapper.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/roles/RoleDefinitionTableWrapper.java index 74da9d5a548..d4c8e25908f 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/roles/RoleDefinitionTableWrapper.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/roles/RoleDefinitionTableWrapper.java @@ -90,7 +90,7 @@ public class RoleDefinitionTableWrapper extends final UserGroupDTO selectedObject = userGroupSelectionModel.getSelectedObject(); if (selectedObject != null) { if (Window.confirm(stringMessages.doYouReallyWantToRemoveRole(rolePair.getA().getName()))) { - userService.getUserManagementService().removeRoleDefintionFromUserGroup( + userService.getUserManagementService().removeRoleDefinitionFromUserGroup( selectedObject.getId().toString(), rolePair.getA().getId().toString(), new AsyncCallback() { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/roles/UserGroupRoleDefinitionPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/roles/UserGroupRoleDefinitionPanel.java index bb7dbaa32f9..06cc970e648 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/roles/UserGroupRoleDefinitionPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/roles/UserGroupRoleDefinitionPanel.java @@ -138,9 +138,8 @@ public class UserGroupRoleDefinitionPanel extends Composite } else if (Window.confirm(stringMessages.doYouReallyWantToRemoveRole(selectedRole.getA().getName()))) { UserGroupDTO selectedObject = userGroupSelectionModel.getSelectedObject(); if (selectedObject != null) { - userManagementService.removeRoleDefintionFromUserGroup(selectedObject.getId().toString(), + userManagementService.removeRoleDefinitionFromUserGroup(selectedObject.getId().toString(), selectedRole.getA().getId().toString(), new AsyncCallback() { - @Override public void onFailure(Throwable caught) { Window.alert(stringMessages.couldNotDeleteRole(selectedRole.getA().getName())); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_es.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_es.properties index 199ad3c6819..51231d760e4 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_es.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_es.properties @@ -189,4 +189,4 @@ filterPermission=Autorización de filtro permission=Autorización nullUserGroup= editRolesAndPermissionsForUser=Editar roles y autorizaciones para el usuario {0} -permissionType:Tipo de autorización +permissionType=Tipo de autorización diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_fr.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_fr.properties index 1f9d3054654..3142b231d5a 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_fr.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_fr.properties @@ -189,4 +189,4 @@ filterPermission=Filtrer autorisations permission=Autorisation nullUserGroup= editRolesAndPermissionsForUser=Modifier les rôles et autorisations pour l''utilisateur {0} -permissionType:Type d''autorisation +permissionType=Type d''autorisation diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_it.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_it.properties index b52607eb5e8..291699274bd 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_it.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_it.properties @@ -189,4 +189,4 @@ filterPermission=Filtra autorizzazione permission=Autorizzazione nullUserGroup= editRolesAndPermissionsForUser=Elabora ruoli e autorizzazioni per l''utente {0} -permissionType:Tipo di autorizzazione +permissionType=Tipo di autorizzazione diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_ja.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_ja.properties index 9ed1601907d..fa68f6ceac9 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_ja.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_ja.properties @@ -189,4 +189,4 @@ filterPermission=権限のフィルタリング permission=権限 nullUserGroup= editRolesAndPermissionsForUser=ユーザ {0} のロールと権限を編集 -permissionType:権限タイプ +permissionType=権限タイプ diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_pt.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_pt.properties index 019347dd719..760b0924b52 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_pt.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_pt.properties @@ -189,4 +189,4 @@ filterPermission=Filtrar autorização permission=Autorização nullUserGroup= editRolesAndPermissionsForUser=Processar funções e autorizações para usuário {0} -permissionType:Tipo de autorização +permissionType=Tipo de autorização diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_ru.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_ru.properties index 8d76edd19ee..07b7cff1a2a 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_ru.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_ru.properties @@ -189,4 +189,4 @@ filterPermission=Фильтр полномочий permission=Полномочия nullUserGroup= editRolesAndPermissionsForUser=Редактировать роли и полномочия для пользователя {0} -permissionType:Тип полномочий +permissionType=Тип полномочий diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_zh.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_zh.properties index fc6e820456d..630a476ec46 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_zh.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_zh.properties @@ -189,4 +189,4 @@ filterPermission=筛选权限 permission=权限 nullUserGroup= editRolesAndPermissionsForUser=为用户{0}编辑角色和权限 -permissionType:权限类型 +permissionType=权限类型 diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/UserManagementServiceImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/UserManagementServiceImpl.java index fc736acf2b0..7f504400c0f 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/UserManagementServiceImpl.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/UserManagementServiceImpl.java @@ -435,18 +435,14 @@ public class UserManagementServiceImpl extends RemoteServiceServlet implements U } @Override - public void removeRoleDefintionFromUserGroup(String userGroupIdAsString, String roleDefinitionIdAsString) + public void removeRoleDefinitionFromUserGroup(String userGroupIdAsString, String roleDefinitionIdAsString) throws UnauthorizedException { final UserGroup userGroup = getSecurityService().getUserGroup(UUID.fromString(userGroupIdAsString)); if (SecurityUtils.getSubject().isPermitted( - SecuredSecurityTypes.USER_GROUP.getStringPermissionForObject(DefaultActions.DELETE, userGroup))) { + SecuredSecurityTypes.USER_GROUP.getStringPermissionForObject(DefaultActions.UPDATE, userGroup))) { final RoleDefinition roleDefinition = getSecurityService() .getRoleDefinition(UUID.fromString(roleDefinitionIdAsString)); if (roleDefinition != null) { - if (!getSecurityService().hasCurrentUserMetaPermissionsOfRoleDefinitionWithQualification(roleDefinition, - new Ownership(null, userGroup))) { - throw new UnauthorizedException("Not permitted to remove role definition from group"); - } getSecurityService().removeRoleDefintionFromUserGroup(userGroup, roleDefinition); } } else { @@ -917,28 +913,22 @@ public class UserManagementServiceImpl extends RemoteServiceServlet implements U @Override public SuccessInfo removeRoleFromUser(String username, String userQualifierName, UUID roleDefinitionId, String tenantQualifierName) throws UserManagementException, UnauthorizedException { - SuccessInfo successInfo; try { // get user for which to remove role final User user = getOrThrowUser(username); - // get user for which the role is qualified, if one exists getOrThrowQualifiedUser(userQualifierName); - // get the group tenant the role is qualified for if one exists UserGroup tenant = getOrThrowTenant(tenantQualifierName); - Role role = getOrThrowRoleFromIDs(roleDefinitionId, tenant == null ? null : tenant.getId(), userQualifierName); - final String message = "removed role " + role.getName() + " for user " + username; final TypeRelativeObjectIdentifier associationTypeIdentifier = PermissionAndRoleAssociation.get(role, user); final QualifiedObjectIdentifier qualifiedTypeIdentifier = SecuredSecurityTypes.ROLE_ASSOCIATION .getQualifiedObjectIdentifier(associationTypeIdentifier); getSecurityService().checkPermissionAndDeleteOwnershipForObjectRemoval(qualifiedTypeIdentifier, new Callable() { - @Override public Void call() throws Exception { getSecurityService().removeRoleFromUser(user, role); @@ -946,7 +936,6 @@ public class UserManagementServiceImpl extends RemoteServiceServlet implements U return null; } }); - final UserDTO userDTO = securityDTOFactory.createUserDTOFromUser(user, getSecurityService()); successInfo = new SuccessInfo(true, message, /* redirectURL */null, new Triple<>(userDTO, getAllUser(), getServerInfo())); @@ -1020,18 +1009,15 @@ public class UserManagementServiceImpl extends RemoteServiceServlet implements U @Override public SuccessInfo addPermissionForUser(String username, WildcardPermission permission) throws UnauthorizedException { - SuccessInfo successInfo; try { // check if user exists User user = getOrThrowUser(username); - // check permissions if (!getSecurityService().hasCurrentUserMetaPermissionWithOwnershipLookup(permission)) { throw new UnauthorizedException( "Not permitted to grant/revoke permission " + permission + " for user " + user.getName()); } - // grant permission final TypeRelativeObjectIdentifier associationTypeIdentifier = PermissionAndRoleAssociation.get(permission, user); @@ -1039,7 +1025,6 @@ public class UserManagementServiceImpl extends RemoteServiceServlet implements U getSecurityService().setOwnershipWithoutCheckPermissionForObjectCreationAndRevertOnError( SecuredSecurityTypes.PERMISSION_ASSOCIATION, associationTypeIdentifier, associationTypeIdentifier.toString(), new Action() { - @Override public void run() throws Exception { final QualifiedObjectIdentifier qualifiedObjectAssociationIdentifier = SecuredSecurityTypes.PERMISSION_ASSOCIATION @@ -1050,7 +1035,6 @@ public class UserManagementServiceImpl extends RemoteServiceServlet implements U logger.info(message); } }); - final UserDTO userDTO = securityDTOFactory.createUserDTOFromUser(user, getSecurityService()); successInfo = new SuccessInfo(true, message, /* redirectURL */null, new Triple<>(userDTO, getAllUser(), getServerInfo())); @@ -1064,25 +1048,16 @@ public class UserManagementServiceImpl extends RemoteServiceServlet implements U @Override public SuccessInfo removePermissionFromUser(String username, WildcardPermissionWithSecurityDTO permission) throws UnauthorizedException { - SuccessInfo successInfo; try { // check if user exists User user = getOrThrowUser(username); - - // check permissions - if (!getSecurityService().hasCurrentUserMetaPermissionWithOwnershipLookup(permission)) { - throw new UnauthorizedException( - "Not permitted to grant/revoke permission " + permission + " for user " + user.getName()); - } - // revoke permission final String message = "Revoked permission " + permission + " for user " + username; final TypeRelativeObjectIdentifier associationTypeIdentifier = PermissionAndRoleAssociation.get(permission, user); final QualifiedObjectIdentifier qualifiedTypeIdentifier = SecuredSecurityTypes.PERMISSION_ASSOCIATION .getQualifiedObjectIdentifier(associationTypeIdentifier); - getSecurityService().checkPermissionAndDeleteOwnershipForObjectRemoval(qualifiedTypeIdentifier, new Callable() { @Override @@ -1092,15 +1067,12 @@ public class UserManagementServiceImpl extends RemoteServiceServlet implements U return null; } }); - final UserDTO userDTO = securityDTOFactory.createUserDTOFromUser(user, getSecurityService()); successInfo = new SuccessInfo(true, message, /* redirectURL */null, new Triple<>(userDTO, getAllUser(), getServerInfo())); - - } catch (UserManagementException | UnauthorizedException e) { + } catch (UserManagementException e) { successInfo = new SuccessInfo(false, "Not permitted to revoke permission " + permission + " for user " + username + " or the user or permission did not exist", /* redirectURL */null, null); - } return successInfo; }