Search in sources :

Example 1 with ConfigEditablePlugin

use of org.apache.solr.security.ConfigEditablePlugin in project lucene-solr by apache.

the class SecurityConfHandler method doEdit.

private void doEdit(SolrQueryRequest req, SolrQueryResponse rsp, String path, final String key, final Object plugin) throws IOException {
    ConfigEditablePlugin configEditablePlugin = null;
    if (plugin == null) {
        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "No " + key + " plugin configured");
    }
    if (plugin instanceof ConfigEditablePlugin) {
        configEditablePlugin = (ConfigEditablePlugin) plugin;
    } else {
        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, key + " plugin is not editable");
    }
    if (req.getContentStreams() == null) {
        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "No contentStream");
    }
    List<CommandOperation> ops = CommandOperation.readCommands(req.getContentStreams(), rsp.getValues());
    if (ops == null) {
        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "No commands");
    }
    for (int count = 1; count <= 3; count++) {
        SecurityConfig securityConfig = getSecurityConfig(true);
        Map<String, Object> data = securityConfig.getData();
        Map<String, Object> latestConf = (Map<String, Object>) data.get(key);
        if (latestConf == null) {
            throw new SolrException(SERVER_ERROR, "No configuration present for " + key);
        }
        List<CommandOperation> commandsCopy = CommandOperation.clone(ops);
        Map<String, Object> out = configEditablePlugin.edit(Utils.getDeepCopy(latestConf, 4), commandsCopy);
        if (out == null) {
            List<Map> errs = CommandOperation.captureErrors(commandsCopy);
            if (!errs.isEmpty()) {
                rsp.add(CommandOperation.ERR_MSGS, errs);
                return;
            }
            log.debug("No edits made");
            return;
        } else {
            if (!Objects.equals(latestConf.get("class"), out.get("class"))) {
                throw new SolrException(SERVER_ERROR, "class cannot be modified");
            }
            Map meta = getMapValue(out, "");
            //encode the expected zkversion
            meta.put("v", securityConfig.getVersion() + 1);
            data.put(key, out);
            if (persistConf(securityConfig)) {
                securityConfEdited();
                return;
            }
        }
        log.debug("Security edit operation failed {} time(s)" + count);
    }
    throw new SolrException(SERVER_ERROR, "Failed to persist security config after 3 attempts. Giving up");
}
Also used : ConfigEditablePlugin(org.apache.solr.security.ConfigEditablePlugin) CommandOperation(org.apache.solr.common.util.CommandOperation) LinkedHashMap(java.util.LinkedHashMap) Map(java.util.Map) SolrException(org.apache.solr.common.SolrException)

Aggregations

LinkedHashMap (java.util.LinkedHashMap)1 Map (java.util.Map)1 SolrException (org.apache.solr.common.SolrException)1 CommandOperation (org.apache.solr.common.util.CommandOperation)1 ConfigEditablePlugin (org.apache.solr.security.ConfigEditablePlugin)1