Skip to content
Snippets Groups Projects
Commit 4834ebcb authored by Benoit Lavenier's avatar Benoit Lavenier
Browse files

- change security logger name

- allow search rest access on user event
- user event : add pubkeys AND names on TX events
parent b59a170f
No related branches found
No related tags found
No related merge requests found
Showing
with 126 additions and 22 deletions
...@@ -36,4 +36,6 @@ public interface Protocol { ...@@ -36,4 +36,6 @@ public interface Protocol {
String TYPE_MEMBERSHIP = "Membership"; String TYPE_MEMBERSHIP = "Membership";
String TYPE_TRANSACTION = "Transaction"; String TYPE_TRANSACTION = "Transaction";
String BMA_API = "BASIC_MERKLED_API";
} }
package org.duniter.core.client.model.elasticsearch;
/*
* #%L
* Duniter4j :: Core Client API
* %%
* Copyright (C) 2014 - 2016 EIS
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
/**
* Created by blavenie on 31/03/16.
*/
public interface Protocol {
String VERSION = "1";
String ES_API = "ELASTICSEARCH_API";
String CESIUM_PLUS_API = "CESIUM_PLUS_API";
}
...@@ -21,6 +21,7 @@ logger: ...@@ -21,6 +21,7 @@ logger:
org.duniter.elasticsearch: DEBUG org.duniter.elasticsearch: DEBUG
duniter : DEBUG duniter : DEBUG
duniter.security : ERROR
duniter.user.event : INFO duniter.user.event : INFO
duniter.network.p2p: TRACE duniter.network.p2p: TRACE
......
...@@ -37,7 +37,7 @@ import java.util.*; ...@@ -37,7 +37,7 @@ import java.util.*;
*/ */
public class RestSecurityController extends AbstractLifecycleComponent<RestSecurityController> { public class RestSecurityController extends AbstractLifecycleComponent<RestSecurityController> {
private static final ESLogger log = ESLoggerFactory.getLogger("security"); private static final ESLogger log = ESLoggerFactory.getLogger("duniter.security");
private boolean enable; private boolean enable;
......
...@@ -32,9 +32,10 @@ import static org.elasticsearch.rest.RestStatus.FORBIDDEN; ...@@ -32,9 +32,10 @@ import static org.elasticsearch.rest.RestStatus.FORBIDDEN;
public class RestSecurityFilter extends RestFilter { public class RestSecurityFilter extends RestFilter {
private static final ESLogger log = ESLoggerFactory.getLogger("security"); private static final ESLogger log = ESLoggerFactory.getLogger("duniter.security");
private RestSecurityController securityController; private RestSecurityController securityController;
private final boolean debug;
@Inject @Inject
public RestSecurityFilter(PluginSettings pluginSettings, RestController controller, RestSecurityController securityController) { public RestSecurityFilter(PluginSettings pluginSettings, RestController controller, RestSecurityController securityController) {
...@@ -44,13 +45,14 @@ public class RestSecurityFilter extends RestFilter { ...@@ -44,13 +45,14 @@ public class RestSecurityFilter extends RestFilter {
controller.registerFilter(this); controller.registerFilter(this);
} }
this.securityController = securityController; this.securityController = securityController;
this.debug = log.isDebugEnabled();
} }
@Override @Override
public void process(RestRequest request, RestChannel channel, RestFilterChain filterChain) throws Exception { public void process(RestRequest request, RestChannel channel, RestFilterChain filterChain) throws Exception {
if (securityController.isAllow(request)) { if (securityController.isAllow(request)) {
if (log.isDebugEnabled()) { if (debug) {
log.debug(String.format("Allow %s request [%s]", request.method().name(), request.path())); log.debug(String.format("Allow %s request [%s]", request.method().name(), request.path()));
} }
filterChain.continueProcessing(request, channel); filterChain.continueProcessing(request, channel);
......
package org.duniter.elasticsearch.gchange.model;
/*
* #%L
* Duniter4j :: Core Client API
* %%
* Copyright (C) 2014 - 2016 EIS
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
/**
* Created by blavenie on 31/03/16.
*/
public interface Protocol {
String VERSION = "1";
String GCHANGE_API = "GCHANGE_API";
}
...@@ -25,6 +25,7 @@ package org.duniter.elasticsearch.gchange.service; ...@@ -25,6 +25,7 @@ package org.duniter.elasticsearch.gchange.service;
import org.duniter.core.client.model.local.Peer; import org.duniter.core.client.model.local.Peer;
import org.duniter.core.service.CryptoService; import org.duniter.core.service.CryptoService;
import org.duniter.elasticsearch.gchange.PluginSettings; import org.duniter.elasticsearch.gchange.PluginSettings;
import org.duniter.elasticsearch.gchange.model.Protocol;
import org.duniter.elasticsearch.service.AbstractSynchroService; import org.duniter.elasticsearch.service.AbstractSynchroService;
import org.duniter.elasticsearch.service.ServiceLocator; import org.duniter.elasticsearch.service.ServiceLocator;
import org.duniter.elasticsearch.threadpool.ThreadPool; import org.duniter.elasticsearch.threadpool.ThreadPool;
...@@ -44,7 +45,7 @@ public class SynchroService extends AbstractSynchroService { ...@@ -44,7 +45,7 @@ public class SynchroService extends AbstractSynchroService {
public void synchronize() { public void synchronize() {
logger.info("Synchronizing data..."); logger.info("Synchronizing data...");
Peer peer = getPeerFromAPI("GCHANGE API"); Peer peer = getPeerFromAPI(Protocol.GCHANGE_API);
synchronize(peer); synchronize(peer);
} }
......
...@@ -58,18 +58,6 @@ public class PluginSettings extends org.duniter.elasticsearch.PluginSettings { ...@@ -58,18 +58,6 @@ public class PluginSettings extends org.duniter.elasticsearch.PluginSettings {
return settings.get("duniter.keyring.sec"); return settings.get("duniter.keyring.sec");
} }
public boolean enableDataSync() {
return settings.getAsBoolean("duniter.user.sync.enable", false);
}
public String getDataSyncHost() {
return settings.get("duniter.user.sync.host", "data.duniter.fr");
}
public int getDataSyncPort() {
return settings.getAsInt("duniter.user.sync.port", 80);
}
public String getMailSmtpHost() { public String getMailSmtpHost() {
return settings.get("duniter.mail.smtp.host", "localhost"); return settings.get("duniter.mail.smtp.host", "localhost");
} }
......
...@@ -40,6 +40,7 @@ public class RestModule extends AbstractModule implements Module { ...@@ -40,6 +40,7 @@ public class RestModule extends AbstractModule implements Module {
bind(RestUserSettingsIndexAction.class).asEagerSingleton(); bind(RestUserSettingsIndexAction.class).asEagerSingleton();
bind(RestUserSettingsUpdateAction.class).asEagerSingleton(); bind(RestUserSettingsUpdateAction.class).asEagerSingleton();
bind(RestUserEventMarkAsReadAction.class).asEagerSingleton(); bind(RestUserEventMarkAsReadAction.class).asEagerSingleton();
bind(RestUserEventSearchAction.class).asEagerSingleton();
// History // History
bind(RestHistoryDeleteIndexAction.class).asEagerSingleton(); bind(RestHistoryDeleteIndexAction.class).asEagerSingleton();
......
package org.duniter.elasticsearch.user.rest.user;
import org.duniter.elasticsearch.rest.security.RestSecurityController;
import org.duniter.elasticsearch.user.service.UserEventService;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.rest.RestRequest;
/**
* Created by blavenie on 13/12/16.
*/
public class RestUserEventSearchAction {
@Inject
public RestUserEventSearchAction(RestSecurityController securityController) {
securityController.allow(RestRequest.Method.GET, String.format("/%s/%s/_search", UserEventService.INDEX, UserEventService.EVENT_TYPE));
securityController.allow(RestRequest.Method.POST, String.format("/%s/%s/_search", UserEventService.INDEX, UserEventService.EVENT_TYPE));
securityController.allow(RestRequest.Method.GET, String.format("/%s/%s/_count", UserEventService.INDEX, UserEventService.EVENT_TYPE));
securityController.allow(RestRequest.Method.POST, String.format("/%s/%s/_count", UserEventService.INDEX, UserEventService.EVENT_TYPE));
}
}
...@@ -204,14 +204,15 @@ public class BlockchainUserEventService extends AbstractService implements Chang ...@@ -204,14 +204,15 @@ public class BlockchainUserEventService extends AbstractService implements Chang
Set<String> senders = ImmutableSet.copyOf(tx.getIssuers()); Set<String> senders = ImmutableSet.copyOf(tx.getIssuers());
// Received // Received
String sendersString = joinPubkeys(senders, true); String senderNames = getNamesFromPubkeys(senders, true);
String sendersPubkeys = joinPubkeys(senders, false);
Set<String> receivers = new HashSet<>(); Set<String> receivers = new HashSet<>();
for (String output : tx.getOutputs()) { for (String output : tx.getOutputs()) {
String[] parts = output.split(":"); String[] parts = output.split(":");
if (parts.length >= 3 && parts[2].startsWith("SIG(")) { if (parts.length >= 3 && parts[2].startsWith("SIG(")) {
String receiver = parts[2].substring(4, parts[2].length() - 1); String receiver = parts[2].substring(4, parts[2].length() - 1);
if (!senders.contains(receiver) && !receivers.contains(receiver)) { if (!senders.contains(receiver) && !receivers.contains(receiver)) {
notifyUserEvent(block, receiver, UserEventCodes.TX_RECEIVED, I18n.n("duniter.user.event.tx.received"), sendersString); notifyUserEvent(block, receiver, UserEventCodes.TX_RECEIVED, I18n.n("duniter.user.event.tx.received"), senderNames, sendersPubkeys);
receivers.add(receiver); receivers.add(receiver);
} }
} }
...@@ -219,9 +220,10 @@ public class BlockchainUserEventService extends AbstractService implements Chang ...@@ -219,9 +220,10 @@ public class BlockchainUserEventService extends AbstractService implements Chang
// Sent // Sent
if (CollectionUtils.isNotEmpty(receivers)) { if (CollectionUtils.isNotEmpty(receivers)) {
String receiverStr = joinPubkeys(receivers, true); String receiverNames = getNamesFromPubkeys(receivers, true);
String receiverPubkeys = joinPubkeys(receivers, false);
for (String sender : senders) { for (String sender : senders) {
notifyUserEvent(block, sender, UserEventCodes.TX_SENT, I18n.n("duniter.user.event.tx.sent"), receiverStr); notifyUserEvent(block, sender, UserEventCodes.TX_SENT, I18n.n("duniter.user.event.tx.sent"), receiverNames, receiverPubkeys);
} }
} }
...@@ -247,7 +249,7 @@ public class BlockchainUserEventService extends AbstractService implements Chang ...@@ -247,7 +249,7 @@ public class BlockchainUserEventService extends AbstractService implements Chang
userEventService.deleteEventsByReference(new UserEvent.Reference(change.getIndex(), change.getType(), change.getId())); userEventService.deleteEventsByReference(new UserEvent.Reference(change.getIndex(), change.getType(), change.getId()));
} }
private String joinPubkeys(Set<String> pubkeys, boolean minify) { private String getNamesFromPubkeys(Set<String> pubkeys, boolean minify) {
Preconditions.checkNotNull(pubkeys); Preconditions.checkNotNull(pubkeys);
Preconditions.checkArgument(pubkeys.size()>0); Preconditions.checkArgument(pubkeys.size()>0);
if (pubkeys.size() == 1) { if (pubkeys.size() == 1) {
...@@ -268,4 +270,21 @@ public class BlockchainUserEventService extends AbstractService implements Chang ...@@ -268,4 +270,21 @@ public class BlockchainUserEventService extends AbstractService implements Chang
return sb.substring(DEFAULT_PUBKEYS_SEPARATOR.length()); return sb.substring(DEFAULT_PUBKEYS_SEPARATOR.length());
} }
private String joinPubkeys(Set<String> pubkeys, boolean minify) {
Preconditions.checkNotNull(pubkeys);
Preconditions.checkArgument(pubkeys.size()>0);
if (pubkeys.size() == 1) {
String pubkey = pubkeys.iterator().next();
return (minify ? ModelUtils.minifyPubkey(pubkey) : pubkey);
}
StringBuilder sb = new StringBuilder();
pubkeys.stream().forEach((pubkey)-> {
sb.append(DEFAULT_PUBKEYS_SEPARATOR);
sb.append(minify ? ModelUtils.minifyPubkey(pubkey) : pubkey);
});
return sb.substring(DEFAULT_PUBKEYS_SEPARATOR.length());
}
} }
...@@ -22,6 +22,7 @@ package org.duniter.elasticsearch.user.service; ...@@ -22,6 +22,7 @@ package org.duniter.elasticsearch.user.service;
* #L% * #L%
*/ */
import org.duniter.core.client.model.elasticsearch.Protocol;
import org.duniter.core.client.model.local.Peer; import org.duniter.core.client.model.local.Peer;
import org.duniter.core.service.CryptoService; import org.duniter.core.service.CryptoService;
import org.duniter.elasticsearch.PluginSettings; import org.duniter.elasticsearch.PluginSettings;
...@@ -45,7 +46,7 @@ public class SynchroService extends AbstractSynchroService { ...@@ -45,7 +46,7 @@ public class SynchroService extends AbstractSynchroService {
public void synchronize() { public void synchronize() {
logger.info("Synchronizing user data..."); logger.info("Synchronizing user data...");
Peer peer = getPeerFromAPI("ES API"); Peer peer = getPeerFromAPI(Protocol.ES_API);
synchronize(peer); synchronize(peer);
} }
...@@ -71,5 +72,6 @@ public class SynchroService extends AbstractSynchroService { ...@@ -71,5 +72,6 @@ public class SynchroService extends AbstractSynchroService {
protected void importMessageChanges(Peer peer, long sinceTime) { protected void importMessageChanges(Peer peer, long sinceTime) {
importChanges(peer, MessageService.INDEX, MessageService.RECORD_TYPE, sinceTime); importChanges(peer, MessageService.INDEX, MessageService.RECORD_TYPE, sinceTime);
importChanges(peer, MessageService.INDEX, MessageService.OUTBOX_TYPE, sinceTime);
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment