Skip to content

Commit

Permalink
[enh] Update documentation (HTTP API)
Browse files Browse the repository at this point in the history
[enh] Config: rename some option for moderation
  • Loading branch information
blavenie committed Mar 4, 2020
1 parent ee19f9d commit 57918ad
Show file tree
Hide file tree
Showing 16 changed files with 356 additions and 118 deletions.
34 changes: 16 additions & 18 deletions cesium-plus-pod-assembly/src/main/assembly/config/elasticsearch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,15 @@ duniter.p2p.includes.endpoints: [
#
# Allow admin (define in duniter.keyring) to delete documents ? (default: true)
#
# duniter.document.allowAdminDeletion: false
# duniter.document.moderators.admin: false
#
# Public keys of moderators. Moderators can delete any user documents (profile, page comment, etc.) (default: <empty>)
#
duniter.document.moderators.pubkeys: [
'38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE', # Benoit Lavenier
'47JpfrGkoHJWtumeu7f67fbAxkvaHYVQBNo5GszNs61Z', # Bertrand Presles
'HmH5beJqKGMeotcQUrSW7Wo5tKvAksHmfYXfiSQ9EbWz' # Le Sou Mayennais
]
#
# ---------------------------------- Cesium+ Pod > Mail module -----------------------
#
Expand Down Expand Up @@ -310,7 +318,6 @@ duniter.mail.enable: false
#
# duniter.mail.subject.prefix: '[Cesium+]'
#
#
# ---------------------------------- Cesium+ Pod > User module ---------------------------
#
# Enable user module (Allow to store User profile, private message, page, group...) (default: true)
Expand All @@ -321,13 +328,14 @@ duniter.mail.enable: false
#
# duniter.user.api: MY_CUSTOM_API
#
# Public keys of user moderator. Moderators can delete any user documents (profile, etc.) (default: <empty>)
#
duniter.user.moderators.pubkeys: [
'38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE', # Benoit Lavenier
'47JpfrGkoHJWtumeu7f67fbAxkvaHYVQBNo5GszNs61Z', # Bertrand Presles
'HmH5beJqKGMeotcQUrSW7Wo5tKvAksHmfYXfiSQ9EbWz' # Le Sou Mayennais
]
# Requirements to send abuse report on document (profile, page, etc.) (default: ['member'])
#
# duniter.user.document.abuse.issuer.requirements: ['wasMember', 'member', 'profile']
#
# Requirements to send likes on document (profile, page, etc.) (default: empty)
#
# duniter.user.document.like.issuer.requirements: ['wasMember', 'member', 'profile']
#
# ---------------------------------- Cesium+ Pod > Subscription module -------------------
#
Expand Down Expand Up @@ -379,14 +387,4 @@ duniter.user.moderators.pubkeys: [
# Default image to share (min size of 200x200px) for `og:image` (default: https://g1.duniter.fr/img/logo_200px.png)
#
# duniter.share.image.default.url: 'https://domain.com/cesium/img/logo_200px.png'
#
# ---------------------------------- Cesium+ Pod > Moderation and likes -------------------
#
# Requirements to send abuse report, on `profile` or `page`. (default: ['member'])
#
# duniter.abuse.issuer.requirements: ['wasMember', 'member', 'profile']
#
# Requirements to send likes, on `profile` or `page`. (default: empty)
#
# duniter.like.issuer.requirements: ['wasMember', 'member', 'profile']
#
40 changes: 23 additions & 17 deletions cesium-plus-pod-assembly/src/test/es-home/config/elasticsearch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,8 @@ duniter.network.timeout: 5000
duniter.keyring.salt: 'abc'
duniter.keyring.password: 'def'
#
# Enable security - will restrict HTTP access to only Cesium+ known indices - /!\ WARNING: should be enable for production use
# Enable security - will restrict HTTP access to only ES known indices
# /!\ WARNING: should be enable for production use
#
duniter.security.enable: true
#
Expand Down Expand Up @@ -236,7 +237,7 @@ duniter.p2p.includes.endpoints: [
#
# Enable a full synchro. This will compare each documents from other peers.
#
#duniter.p2p.fullResyncAtStartup: true
# duniter.p2p.fullResyncAtStartup: true
#
# Peer API to index (default : ["BASIC_MERKLE_API", "BMAS", "WS2P" ] UNION ${duniter.p2p.peering.targetedApis} UNION ${duniter.p2p.peering.publishedApis})
#
Expand Down Expand Up @@ -275,7 +276,15 @@ duniter.p2p.peering.interval: 60
#
# Allow admin (define in duniter.keyring) to delete documents ? (default: true)
#
# duniter.document.allowAdminDeletion: true
# duniter.document.moderators.admin: false
#
# Public keys of moderators. Moderators can delete any user documents (profile, page comment, etc.) (default: <empty>)
#
duniter.document.moderators.pubkeys: [
'38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE', # Benoit Lavenier
'47JpfrGkoHJWtumeu7f67fbAxkvaHYVQBNo5GszNs61Z', # Bertrand Presles
'HmH5beJqKGMeotcQUrSW7Wo5tKvAksHmfYXfiSQ9EbWz' # Le Sou Mayennais
]
#
# ---------------------------------- Cesium+ Pod > Mail module -----------------------
#
Expand Down Expand Up @@ -310,28 +319,24 @@ duniter.mail.enable: false
#
# duniter.mail.subject.prefix: '[Cesium+]'
#
# ---------------------------------- Cesium+ Pod > Websocket server ----------------------
#
# Websocket port (default: ${http.port})
#
# duniter.ws.port: 9400-9410
#
# ---------------------------------- Cesium+ Pod > User module ---------------------------
#
# Enable user module (Allow to store User profile, private message, page, group...) (default: true)
#
# duniter.user.enable: false
#
# Endpoint API for user data (use by P2P synchronization) (default: ES_USER_API)
# Endpoint API for user data (use by P2P synchronization) (default: 'ES_USER_API')
#
# duniter.user.api: MY_CUSTOM_API
# Public keys of user moderator. Moderators can delete any user documents (profile, etc.) (default: <empty>)
#
duniter.user.moderators.pubkeys: [
'38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE', # Benoit Lavenier
'47JpfrGkoHJWtumeu7f67fbAxkvaHYVQBNo5GszNs61Z', # Bertrand Presles
'HmH5beJqKGMeotcQUrSW7Wo5tKvAksHmfYXfiSQ9EbWz' # Le Sou Mayennais
]
#
# Requirements to send abuse report on document (profile, page, etc.) (default: ['member'])
#
# duniter.user.document.abuse.issuer.requirements: ['wasMember', 'member', 'profile']
#
# Requirements to send likes on document (profile, page, etc.) (default: empty)
#
# duniter.user.document.like.issuer.requirements: ['wasMember', 'member', 'profile']
#
# ---------------------------------- Cesium+ Pod > Subscription module -------------------
#
Expand Down Expand Up @@ -382,4 +387,5 @@ duniter.user.moderators.pubkeys: [
#
# Default image to share (min size of 200x200px) for `og:image` (default: https://g1.duniter.fr/img/logo_200px.png)
#
# duniter.share.image.default.url: 'https://domain.com/cesium/img/logo_200px.png'
# duniter.share.image.default.url: 'https://domain.com/cesium/img/logo_200px.png'
#
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
import org.duniter.core.exception.TechnicalException;
import org.duniter.core.service.CryptoService;
import org.duniter.core.util.CollectionUtils;
import org.duniter.core.util.Preconditions;
import org.duniter.core.util.StringUtils;
import org.duniter.core.util.crypto.CryptoUtils;
import org.duniter.core.util.crypto.KeyPair;
Expand Down Expand Up @@ -71,11 +70,13 @@ public class PluginSettings extends AbstractLifecycleComponent<PluginSettings> {
private static Peer duniterPeer;
private Optional<Peer> clusterPeer;
private List<Peer> clusterPeerEndpoints;
private Set<String> adminAndModeratorPubkeys;

private String softwareDefaultVersion;

private final CryptoService cryptoService;
private final EndpointApi coreEnpointApi;

protected final Settings settings;

/**
Expand Down Expand Up @@ -539,8 +540,25 @@ public int getDocumentTimeMaxFutureDelta() {
return settings.getAsInt("duniter.document.time.maxFutureDelta", 600); // in seconds = 10min
}

public boolean allowDocumentDeletionByAdmin() {
return settings.getAsBoolean("duniter.document.allowAdminDeletion", true); //
public boolean allowDocumentModerationByAdmin() {
return settings.getAsBoolean("duniter.document.moderators.admin", true); //
}

public String[] getDocumentModeratorsPubkeys() {
return this.settings.getAsArray("duniter.document.moderators.pubkeys");
}

public Set<String> getDocumentAdminAndModeratorsPubkeys() {
if (adminAndModeratorPubkeys == null) {

ImmutableSet.Builder<String> moderators = ImmutableSet.builder();
if (!isRandomNodeKeypair() && allowDocumentModerationByAdmin()) {
moderators.add(getNodePubkey());
}
adminAndModeratorPubkeys = moderators.add(getDocumentModeratorsPubkeys()).build();
}

return adminAndModeratorPubkeys;
}

public String getWebSocketHost() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import org.duniter.elasticsearch.rest.network.RestNetworkPeeringPeersPostAction;
import org.duniter.elasticsearch.rest.network.RestNetworkPeersGetAction;
import org.duniter.elasticsearch.rest.network.RestNetworkWs2pHeadsGetAction;
import org.duniter.elasticsearch.rest.node.RestNodeModeratorsGetAction;
import org.duniter.elasticsearch.rest.node.RestNodeSummaryGetAction;
import org.duniter.elasticsearch.rest.node.RestNodeStatsGetAction;
import org.duniter.elasticsearch.rest.security.RestSecurityAuthAction;
Expand All @@ -48,6 +49,7 @@ public class RestModule extends AbstractModule implements Module {
// Common
bind(RestNodeSummaryGetAction.class).asEagerSingleton();
bind(RestNodeStatsGetAction.class).asEagerSingleton();
bind(RestNodeModeratorsGetAction.class).asEagerSingleton();

// Authentication & Security
bind(RestSecurityGetChallengeAction.class).asEagerSingleton();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.duniter.elasticsearch.user.rest.user;
package org.duniter.elasticsearch.rest.node;

/*
* #%L
Expand All @@ -22,9 +22,8 @@
* #L%
*/

import com.google.common.collect.ImmutableSet;
import org.duniter.core.exception.TechnicalException;
import org.duniter.elasticsearch.user.PluginSettings;
import org.duniter.elasticsearch.PluginSettings;
import org.duniter.elasticsearch.rest.RestXContentBuilder;
import org.duniter.elasticsearch.rest.XContentRestResponse;
import org.duniter.elasticsearch.rest.security.RestSecurityController;
Expand All @@ -35,24 +34,23 @@
import org.elasticsearch.rest.*;

import java.io.IOException;
import java.util.Set;

/**
* A rest to post a request to process a new currency/peer.
*
*/
public class RestUserModeratorsGetAction extends BaseRestHandler {
public class RestNodeModeratorsGetAction extends BaseRestHandler {

private final PluginSettings pluginSettings;

@Inject
public RestUserModeratorsGetAction(PluginSettings pluginSettings, Settings settings, RestController controller, Client client, RestSecurityController securityController) {
public RestNodeModeratorsGetAction(PluginSettings pluginSettings, Settings settings, RestController controller, Client client, RestSecurityController securityController) {
super(settings, controller, client);

this.pluginSettings = pluginSettings;

securityController.allow(RestRequest.Method.GET, "/user/moderators");
controller.registerHandler(RestRequest.Method.GET, "/user/moderators", this);
securityController.allow(RestRequest.Method.GET, "/node/moderators");
controller.registerHandler(RestRequest.Method.GET, "/node/moderators", this);
}

@Override
Expand All @@ -65,13 +63,13 @@ protected void handleRequest(RestRequest request, RestChannel channel, Client cl
public XContentBuilder createSummary(RestRequest request) {
try {
XContentBuilder mapping = RestXContentBuilder.restContentBuilder(request).startObject()
.field("moderators", pluginSettings.getAdminAndModeratorsPubkeys())
.field("moderators", pluginSettings.getDocumentAdminAndModeratorsPubkeys())
.endObject();

return mapping;
}
catch(IOException ioe) {
throw new TechnicalException(String.format("Error while generating JSON for [/user/moderators]: %s", ioe.getMessage()), ioe);
throw new TechnicalException(String.format("Error while generating JSON for [/node/moderators]: %s", ioe.getMessage()), ioe);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ protected void configDocStats() {
.registerIndex(PageIndexDao.INDEX, PageCommentDao.TYPE)
.registerIndex(GroupIndexDao.INDEX, GroupRecordDao.TYPE)
.registerIndex(GroupIndexDao.INDEX, GroupCommentDao.TYPE)
.registerIndex(HistoryService.INDEX, HistoryService.DELETE_TYPE)
.registerIndex(DeleteHistoryService.INDEX, DeleteHistoryService.DELETE_TYPE)
.registerIndex(LikeService.INDEX, LikeService.RECORD_TYPE)
;

Expand Down Expand Up @@ -159,7 +159,7 @@ protected void createIndices() {
if (logger.isInfoEnabled()) {
logger.info("Reloading indices...");
}
injector.getInstance(HistoryService.class)
injector.getInstance(DeleteHistoryService.class)
.deleteIndex()
.createIndexIfNotExists();
injector.getInstance(MessageService.class)
Expand Down Expand Up @@ -193,7 +193,7 @@ protected void createIndices() {

boolean cleanBlockchainUserEvents = injector.getInstance(UserService.class).isIndexExists() && pluginSettings.reloadBlockchainIndices();

injector.getInstance(HistoryService.class).createIndexIfNotExists();
injector.getInstance(DeleteHistoryService.class).createIndexIfNotExists();
injector.getInstance(UserService.class).createIndexIfNotExists();
injector.getInstance(MessageService.class).createIndexIfNotExists();
injector.getInstance(GroupService.class).createIndexIfNotExists();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,6 @@ public class PluginSettings extends AbstractLifecycleComponent<PluginSettings> {

private final EndpointApi userEndpointApi;

private Set<String> adminAndModeratorPubkeys;

@Inject
public PluginSettings(Settings settings,
org.duniter.elasticsearch.PluginSettings delegate) {
Expand Down Expand Up @@ -183,10 +181,11 @@ public String getMailSubjectPrefix() {
}

public String[] getReportAbuseIssuerRequirements() {
return settings.getAsArray("duniter.abuse.issuer.requirements", new String[]{"member"});
return settings.getAsArray("duniter.user.document.abuse.issuer.requirements", new String[]{"member"});
}

public String[] getLikeIssuerRequirements() {
return settings.getAsArray("duniter.like.issuer.requirements", new String[]{});
return settings.getAsArray("duniter.user.document.like.issuer.requirements", new String[]{});
}

/* -- delegate methods -- */
Expand Down Expand Up @@ -243,25 +242,8 @@ public String getKeyringSecretKey() {
return delegate.getKeyringSecretKey();
}

public boolean allowDocumentDeletionByAdmin() {
return delegate.allowDocumentDeletionByAdmin();
}

public String[] getUserModeratorsPubkeys() {
return this.settings.getAsArray("duniter.user.moderators.pubkeys");
}

public Set<String> getAdminAndModeratorsPubkeys() {
if (adminAndModeratorPubkeys == null) {

ImmutableSet.Builder<String> moderators = ImmutableSet.builder();
if (!isRandomNodeKeypair() && allowDocumentDeletionByAdmin()) {
moderators.add(getNodePubkey());
}
adminAndModeratorPubkeys = moderators.add(getUserModeratorsPubkeys()).build();
}

return adminAndModeratorPubkeys;
public Set<String> getDocumentAdminAndModeratorsPubkeys() {
return delegate.getDocumentAdminAndModeratorsPubkeys();
}

public void addI18nBundleName(String bundleName) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
import org.duniter.elasticsearch.user.rest.message.compat.RestMessageRecordMarkAsReadAction;
import org.duniter.elasticsearch.user.rest.message.compat.RestMessageRecordSearchAction;
import org.duniter.elasticsearch.user.rest.mixed.RestMixedSearchAction;
import org.duniter.elasticsearch.user.rest.user.RestUserModeratorsGetAction;
import org.duniter.elasticsearch.user.rest.page.*;
import org.duniter.elasticsearch.user.rest.user.*;
import org.elasticsearch.common.inject.AbstractModule;
Expand All @@ -55,7 +54,6 @@ public class RestModule extends AbstractModule implements Module {
bind(RestUserEventSearchAction.class).asEagerSingleton();
bind(RestUserAvatarAction.class).asEagerSingleton();
bind(RestUserShareLinkAction.class).asEagerSingleton();
bind(RestUserModeratorsGetAction.class).asEagerSingleton();

// Group
bind(RestGroupIndexAction.class).asEagerSingleton();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

import org.duniter.elasticsearch.rest.AbstractRestPostIndexAction;
import org.duniter.elasticsearch.rest.security.RestSecurityController;
import org.duniter.elasticsearch.user.service.HistoryService;
import org.duniter.elasticsearch.user.service.DeleteHistoryService;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.settings.Settings;
Expand All @@ -34,10 +34,10 @@ public class RestHistoryDeleteIndexAction extends AbstractRestPostIndexAction {

@Inject
public RestHistoryDeleteIndexAction(Settings settings, RestController controller, Client client,
RestSecurityController securityController, HistoryService service) {
RestSecurityController securityController, DeleteHistoryService service) {
super(settings, controller, client, securityController,
HistoryService.INDEX,
HistoryService.DELETE_TYPE,
DeleteHistoryService.INDEX,
DeleteHistoryService.DELETE_TYPE,
json -> service.indexDeleteFromJson(json, false));

}
Expand Down
Loading

0 comments on commit 57918ad

Please sign in to comment.