Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
b1ab3f3
feat(app-registry):INTEG-812 add controller for ptit observatoire widget
theovgl Mar 19, 2025
d7be4a4
chore(timeline): INTEG-422 add api for send notification from externa…
moustaphahennawi May 28, 2025
e0b13c0
feat(workspace): INTEG-896, port nextcloud integration directly into …
theovgl May 26, 2025
98b5560
chore(workspace): Remove share without copy option from toolbar
theovgl Jun 16, 2025
334dcf8
feat(workspace): Add sync document viewer component to preview Nextcl…
theovgl Jun 17, 2025
e961312
Fix(workspace): various bugs and inconsistencies
theovgl Jun 18, 2025
02e66bb
INTEG-819-954: Ajout API temps d'écran
bassamkh Jul 1, 2025
abff048
Fix(workspace): INTEG-896 fix regression preventing nextcloud account…
theovgl Jul 8, 2025
71a47ec
Feat(workspace): INTEG-897, open synced folder by URL param
theovgl Jul 25, 2025
733a2dd
chore(oauth) : IW-209 enrichment of oauth2 connector logs
theovgl Sep 22, 2025
2bcf860
feat(auth): INTEG-1081 Add Google SAML service provider
theovgl Nov 17, 2025
64cb372
chore: set snapshot version after merge
jenkinsEdificePublic Dec 10, 2025
89b9e69
feat: update vertx bus and map to support clustering
dboissin May 23, 2025
8d72992
wip: refactor loading and server map
dboissin May 26, 2025
c9f6e12
wip: refactor loading and server map
dboissin May 27, 2025
00ba427
fix(portal): fix portal start
dboissin May 27, 2025
921f87d
fix(portal, session): fix skins and sessions
dboissin May 28, 2025
b5d98cc
fix: fix storage
dboissin May 28, 2025
04521b4
wip: refactor localmap
dboissin May 30, 2025
a4d3f71
wip: refactor localmap
dboissin Jun 1, 2025
19365d3
fix(test): fix test
dboissin Jun 1, 2025
7311399
some fix
dboissin Jun 2, 2025
e79ea2f
fix(common): s3 call without sse-c
dboissin Jun 2, 2025
5eb7e95
fix : replace localmap
dboissin Jun 3, 2025
222c21e
fix: loading metricsOptions
dboissin Jun 3, 2025
e4c249b
fix(feeder): fix async init
dboissin Jun 12, 2025
3eb6698
fix(portal): move widgets registration from infra starter to portal
dboissin Jun 17, 2025
0dd9057
RBACK-117-zookeeper : fix post-rebase issues
mariusode Sep 11, 2025
c035593
ci: use FRONT_TAG if availabled when building react modules
juniorode Sep 12, 2025
ef108ea
feat: #RBACK-117, rework verticle init
mariusode Sep 15, 2025
1658760
feat: #RBACK-117, zookeeper migration
juniorode Sep 17, 2025
2648f9c
feat: #RBACK-119, publish image
juniorode Sep 22, 2025
e35b1aa
feat: #RBACK-117, zookeeper migration
juniorode Sep 22, 2025
eab1c9a
feat: #RBACK-117, zookeeper migration
juniorode Sep 22, 2025
f4502ef
feat: #RBACK-117, fix redis config fetch
juniorode Sep 22, 2025
6f7d988
feat: #RBACK-131 #RBACK-132 #RBACK-135, health check probes
juniorode Sep 23, 2025
33b4100
feat: #RBACK-117, fix EmailFactory building prerequisite
juniorode Sep 23, 2025
0b8d2b2
feat: #RBACK-126, allow JSON logging
juniorode Sep 24, 2025
49deb92
feat: #RBACK-155 #RBACK-127 #RBACK-164 #RBACK-165, use asyncMap in Ex…
juniorode Nov 5, 2025
899b8f2
fix: merge error
juniorode Dec 1, 2025
9ff38c0
feat-RBACK-171: handle CSV import and mass messaging for clustered en…
mariusode Dec 2, 2025
d7741a9
temp: add broker-client node
juniorode Dec 3, 2025
f31b066
fix: remove redundant dependencies
juniorode Dec 9, 2025
16d680b
chore: update dependencies
jenkinsEdificePublic Dec 10, 2025
9aafa2b
chore: update dependencies
jenkinsEdificePublic Dec 11, 2025
d0261cf
fix: RBACK-171, clean import path on FS only (#936)
mariusode Dec 12, 2025
2f98684
feat: #RBACK-117, kubernetes migration
juniorode Dec 12, 2025
e0ef65f
feat: #RBACK-117, kubernetes migration
juniorode Dec 15, 2025
9f87cd2
fix: fix ssec signature with special characters
juniorode Dec 16, 2025
0a6895f
feat: #RBACK-127, type exportResources result
juniorode Dec 16, 2025
4678e24
fix: prevent NPE when no UAI is set
juniorode Dec 16, 2025
9397ac4
feature: #RBACK-138 update some logger (#940)
vbillard91 Dec 17, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -94,9 +94,11 @@ conversation/src/main/resources/view/
**/backend/**/resources/public/*.*
# Ignore HTML files in "backend/view" folders
**/backend/**/resources/view/*.html
broker-parent/broker-client
#broker-parent/broker-client
.env
dependency-reduced-pom.xml
.flattened-pom.xml
.version.properties
.pnpm-store

?
7 changes: 7 additions & 0 deletions Jenkinsfile
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,13 @@ pipeline {
}
}
}
/*
stage('Build image') {
steps {
sh 'edifice image'
}
}
*/
}
post {
cleanup {
Expand Down
14 changes: 14 additions & 0 deletions admin/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,19 @@
<version>${revision}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>fr.wseduc</groupId>
<artifactId>mod-sms-proxy</artifactId>
<version>2.0-zookeeper-SNAPSHOT</version>
<scope>runtime</scope>
<classifier>fat</classifier>
</dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>mod-mongo-persistor</artifactId>
<version>4.1-zookeeper-SNAPSHOT</version>
<scope>runtime</scope>
<classifier>fat</classifier>
</dependency>
</dependencies>
</project>
95 changes: 54 additions & 41 deletions admin/src/main/java/org/entcore/admin/Admin.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,66 +18,79 @@

package org.entcore.admin;

import io.vertx.core.Future;
import io.vertx.core.Promise;

import java.util.Map;

import org.entcore.admin.controllers.AdminController;
import org.entcore.admin.controllers.BlockProfileTraceController;
import org.entcore.admin.controllers.PlatformInfoController;
import org.entcore.admin.controllers.ConfigController;
import org.entcore.admin.services.BlockProfileTraceService;
import org.entcore.admin.services.impl.DefaultBlockProfileTraceService;
import org.entcore.common.http.BaseServer;

import fr.wseduc.webutils.collections.SharedDataHelper;
import io.vertx.core.AsyncResult;
import io.vertx.core.Handler;
import io.vertx.core.eventbus.Message;
import io.vertx.core.json.JsonObject;
import io.vertx.core.shareddata.LocalMap;
import io.vertx.core.eventbus.DeliveryOptions;

public class Admin extends BaseServer {

@Override
public void start(final Promise<Void> startPromise) throws Exception {
super.start(startPromise);

addController(new AdminController());
@Override
public void start(final Promise<Void> startPromise) throws Exception {
final Promise<Void> promise = Promise.promise();
super.start(promise);
promise.future()
.compose(init -> SharedDataHelper.getInstance().<String, Object>getLocalMulti("server", "smsProvider", "node", "hidePersonalData"))
.compose(adminConfigMap -> initAdmin(adminConfigMap))
.onComplete(startPromise);
}

public Future<Void> initAdmin(final Map<String, Object> adminMap) {
addController(new AdminController());

BlockProfileTraceController blockProfileTraceController = new BlockProfileTraceController("adminv2");
BlockProfileTraceService blockProfileTraceService = new DefaultBlockProfileTraceService("adminv2");
blockProfileTraceController.setBlockProfileTraceService(blockProfileTraceService);
addController(blockProfileTraceController);
addController(new ConfigController());

final PlatformInfoController platformInfoController = new PlatformInfoController();
BlockProfileTraceController blockProfileTraceController = new BlockProfileTraceController("adminv2");
BlockProfileTraceService blockProfileTraceService = new DefaultBlockProfileTraceService("adminv2");
blockProfileTraceController.setBlockProfileTraceService(blockProfileTraceService);
addController(blockProfileTraceController);
addController(new ConfigController());

final PlatformInfoController platformInfoController = new PlatformInfoController();
platformInfoController.setHidePersonalData((Boolean) adminMap.get("hidePersonalData"));

// check if sms module activated
String smsAddress = "";
String smsProvider = "";
LocalMap<Object, Object> server = vertx.sharedData().getLocalMap("server");
if(server != null && server.get("smsProvider") != null) {
smsProvider = (String) server.get("smsProvider");
final String node = (String) server.get("node");
smsAddress = (node != null ? node : "") + "entcore.sms";
} else {
smsAddress = "entcore.sms";
}
// check if sms module activated
String smsAddress = "";
String smsProvider = "";
if(adminMap.get("smsProvider") != null) {
smsProvider = (String) adminMap.get("smsProvider");
final String node = (String) adminMap.get("node");
smsAddress = (node != null ? node : "") + "entcore.sms";
} else {
smsAddress = "entcore.sms";
}

JsonObject pingAction = new JsonObject()
.put("provider", smsProvider)
.put("action", "ping");
JsonObject pingAction = new JsonObject()
.put("provider", smsProvider)
.put("action", "ping");

vertx.eventBus().request(smsAddress, pingAction, new DeliveryOptions().setSendTimeout(5000l),
new Handler<AsyncResult<Message<JsonObject>>>() {
@Override
public void handle(AsyncResult<Message<JsonObject>> res) {
if (res != null && res.succeeded()) {
if ("ok".equals(res.result().body().getString("status"))) {
platformInfoController.setSmsModule(true);
}
}
addController(platformInfoController);
}
}
);
}
vertx.eventBus().request(smsAddress, pingAction, new DeliveryOptions().setSendTimeout(5000l),
new Handler<AsyncResult<Message<JsonObject>>>() {
@Override
public void handle(AsyncResult<Message<JsonObject>> res) {
if (res != null && res.succeeded()) {
if ("ok".equals(res.result().body().getString("status"))) {
platformInfoController.setSmsModule(true);
}
}
addController(platformInfoController);
}
}
);
return Future.succeededFuture();
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.entcore.admin.controllers;

import fr.wseduc.bus.BusAddress;
import fr.wseduc.mongodb.MongoDb;
import fr.wseduc.rs.ApiDoc;
import fr.wseduc.rs.Get;
import fr.wseduc.security.ActionType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
import io.vertx.core.http.HttpServerRequest;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.core.shareddata.LocalMap;
import org.entcore.common.http.filter.AdminFilter;
import org.entcore.common.http.filter.ResourceFilter;

Expand All @@ -40,6 +39,7 @@ public class PlatformInfoController extends BaseController {

private boolean smsActivated;
private static final List<String> PROFILES = Arrays.asList("Personnel", "Teacher", "Student", "Relative", "Guest");
private boolean hidePersonalData;

@Get("api/platform/module/sms")
@SecuredAction(type = ActionType.RESOURCE, value = "")
Expand All @@ -62,15 +62,13 @@ public void setSmsModule(boolean smsModule) {
@ResourceFilter(AdminFilter.class)
@MfaProtected()
public void readConfig(HttpServerRequest request) {
LocalMap<Object, Object> serverMap = vertx.sharedData().getLocalMap("server");

final JsonObject preDelete = config.getJsonObject("pre-delete");
final JsonObject configuration = new JsonObject()
.put("delete-user-delay", config.getLong("delete-user-delay", defaultDeleteUserDelay))
.put("reset-code-delay", config.getLong("resetCodeDelay", 0L))
.put("distributions", config.getJsonArray("distributions", new JsonArray()))
.put("hide-adminv1-link", config.getBoolean("hide-adminv1-link", false))
.put("hide-personal-data", serverMap.get("hidePersonalData"))
.put("hide-personal-data", hidePersonalData)
.put("mass-messaging-enabled", config.getBoolean("mass-messaging-enabled"))
.put("allow-adml-structure-name-change", config.getBoolean("allow-adml-structure-name-change", true))
.put("enable-manual-group-autolink", config.getBoolean("enable-manual-group-autolink", false))
Expand All @@ -95,4 +93,9 @@ public void readConfig(HttpServerRequest request) {

renderJson(request, configuration);
}

public void setHidePersonalData(boolean hidePersonalData) {
this.hidePersonalData = hidePersonalData;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import fr.wseduc.mongodb.MongoDb;
import fr.wseduc.mongodb.MongoQueryBuilder;
import fr.wseduc.webutils.Either;
import fr.wseduc.webutils.request.filter.Filter;
import io.vertx.core.Handler;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
Expand Down
1 change: 1 addition & 0 deletions admin/src/main/resources/i18n/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -1296,6 +1296,7 @@
"rss-widget": "RSS",
"save": "Enregistrer",
"save.modifications": "Enregistrer les modifications",
"screen-time-widget": "Temps d'écran",
"scholarshipHolder": "Boursier",
"school-widget": "Mon réseau",
"screen-time-widget": "Temps d'écran",
Expand Down
6 changes: 3 additions & 3 deletions admin/src/main/ts/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@
"font-awesome": "4.7.0",
"jquery": "^3.4.1",
"ngx-infinite-scroll": "14.0.1",
"ngx-ode-core": "dev",
"ngx-ode-sijil": "dev",
"ngx-ode-ui": "dev",
"ngx-ode-core": "zookeeper",
"ngx-ode-sijil": "zookeeper",
"ngx-ode-ui": "zookeeper",
"ngx-trumbowyg": "^6.0.7",
"noty": "2.4.1",
"reflect-metadata": "0.1.10",
Expand Down
7 changes: 7 additions & 0 deletions app-registry/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,12 @@
<version>${revision}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>mod-mongo-persistor</artifactId>
<version>4.1-zookeeper-SNAPSHOT</version>
<scope>runtime</scope>
<classifier>fat</classifier>
</dependency>
</dependencies>
</project>
39 changes: 30 additions & 9 deletions app-registry/src/main/java/org/entcore/registry/AppRegistry.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

package org.entcore.registry;

import io.vertx.core.Future;
import io.vertx.core.json.JsonObject;
import io.vertx.core.Promise;
import org.entcore.broker.api.utils.AddressParameter;
Expand All @@ -29,33 +30,53 @@
import org.entcore.registry.filters.AppRegistryFilter;
import org.entcore.registry.services.impl.NopAppRegistryEventService;

import java.util.ArrayList;
import java.util.List;

public class AppRegistry extends BaseServer {

@Override
public void start(final Promise<Void> startPromise) throws Exception {
super.start(startPromise);
final AppRegistryController appRegistryController = new AppRegistryController();
addController(appRegistryController);
addController(new ExternalApplicationController(config.getInteger("massAuthorizeBatchSize", 1000)));
addController(new WidgetController());
addController(new LibraryController(vertx, config()));
final Promise<Void> promise = Promise.promise();
super.start(promise);
promise.future().compose(init -> initAppRegistry()).onComplete(startPromise);
}

public Future<Void> initAppRegistry() {
final List<Future<?>> futures = new ArrayList<>();
final AppRegistryController appRegistryController = new AppRegistryController();
futures.add(addController(appRegistryController));

futures.add(addController(new ExternalApplicationController(config.getInteger("massAuthorizeBatchSize", 1000))));
futures.add(addController(new WidgetController()));
try {
futures.add(addController(new LibraryController(vertx, config())));
} catch (Exception e) {
return Future.failedFuture(e);
}
BrokerProxyUtils.addBrokerProxy(appRegistryController, vertx, new AddressParameter("application", "appregistry"));
JsonObject eduMalinConf = config.getJsonObject("edumalin-widget-config");
if(eduMalinConf != null)
addController(new EdumalinWidgetController());
futures.add(addController(new EdumalinWidgetController()));

JsonObject webGerestEnabled = config.getJsonObject("webGerest-config");
if(webGerestEnabled != null) {
addController(new WebGerestController());
futures.add(addController(new WebGerestController()));
}
JsonObject screenTimeEnabled = config.getJsonObject("screen-time-config");
if(screenTimeEnabled != null) {
addController(new ScreenTimeController());
futures.add(addController(new ScreenTimeController()));
}

JsonObject ptitObservatoireConf = config.getJsonObject("ptit-observatoire-widget-config");
if (ptitObservatoireConf != null) {
addController(new PtitObservatoireController());
}

setDefaultResourceFilter(new AppRegistryFilter());
new AppRegistryEventsHandler(vertx, new NopAppRegistryEventService());
vertx.eventBus().publish("app-registry.loaded", new JsonObject());
return Future.all(futures).mapEmpty();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,13 @@
import fr.wseduc.webutils.Either;
import fr.wseduc.webutils.I18n;
import fr.wseduc.webutils.Server;
import fr.wseduc.webutils.collections.SharedDataHelper;
import fr.wseduc.webutils.http.BaseController;

import fr.wseduc.webutils.http.Renders;
import io.vertx.core.Future;
import io.vertx.core.Promise;
import io.vertx.core.Future;
import io.vertx.core.Vertx;
import org.apache.commons.lang3.NotImplementedException;
import org.entcore.broker.api.appregistry.AppRegistrationRequestDTO;
Expand Down Expand Up @@ -77,10 +79,13 @@ public class AppRegistryController extends BaseController implements AppRegistry
private final AppRegistryService appRegistryService = new DefaultAppRegistryService();
private JsonObject skinLevels;

public void init(Vertx vertx, JsonObject config, RouteMatcher rm,
Map<String, fr.wseduc.webutils.security.SecuredAction> securedActions) {
public Future<Void> initAsync(Vertx vertx, JsonObject config, RouteMatcher rm,
Map<String, fr.wseduc.webutils.security.SecuredAction> securedActions) {
super.init(vertx, config, rm, securedActions);
this.skinLevels = new JsonObject(vertx.sharedData().getLocalMap("skin-levels"));
return SharedDataHelper.getInstance().<String, JsonObject>getLocal("server", "skin-levels")
.onSuccess(skinLevels -> AppRegistryController.this.skinLevels = skinLevels)
.onFailure(ex -> log.error("Error getting skin-levels", ex))
.mapEmpty();
}

@Get("/admin-console")
Expand Down Expand Up @@ -532,7 +537,7 @@ public void handle(JsonObject body) {
@Put("/structures/:structureId/roles")
@SecuredAction(value = "", type = ActionType.RESOURCE)
@ResourceFilter(AdminFilter.class)
@MfaProtected()
@MfaProtected()
public void authorizeProfiles(final HttpServerRequest request) {
bodyToJson(request, new Handler<JsonObject>() {
@Override
Expand Down
Loading