/* This code is part of Freenet. It is distributed under the GNU General * Public License, version 2 (or at your option any later version). See * http://www.gnu.org/ for further details of the GPL. */ package freenet.clients.fcp; import freenet.config.Config; import freenet.config.Option; import freenet.config.SubConfig; import freenet.node.Node; import freenet.support.Logger; import freenet.support.SimpleFieldSet; import freenet.support.Logger.LogLevel; public class ModifyConfig extends FCPMessage { static final String NAME = "ModifyConfig"; final SimpleFieldSet fs; final String identifier; public ModifyConfig(SimpleFieldSet fs) { this.fs = fs; this.identifier = fs.get("Identifier"); fs.removeValue("Identifier"); } @Override public SimpleFieldSet getFieldSet() { return new SimpleFieldSet(true); } @Override public String getName() { return NAME; } @Override public void run(FCPConnectionHandler handler, Node node) throws MessageInvalidException { if(!handler.hasFullAccess()) { throw new MessageInvalidException(ProtocolErrorMessage.ACCESS_DENIED, "ModifyConfig requires full access", identifier, false); } Config config = node.config; boolean logMINOR = Logger.shouldLog(LogLevel.MINOR, this); for(SubConfig sc: config.getConfigs()) { String prefix = sc.getPrefix(); for(Option<?> o: sc.getOptions()) { String configName=o.getName(); if(logMINOR) Logger.minor(this, "Setting "+prefix+ '.' +configName); // we ignore unreconized parameters String s = fs.get(prefix+ '.' +configName); if(s != null) { if(!(o.getValueString().equals(s))){ if(logMINOR) Logger.minor(this, "Setting "+prefix+ '.' +configName+" to "+s); try{ o.setValue(s); }catch(Exception e){ // Bad values silently fail from an FCP perspective, but the FCP client can tell if a change took by comparing ConfigData messages before and after Logger.error(this, "Caught "+e, e); } } } } } node.clientCore.storeConfig(); handler.outputHandler.queue(new ConfigData(node, true, false, false, false, false, false, false, false, identifier)); } }