
serposcope.controllers.admin.LogController Maven / Gradle / Ivy
/*
* Serposcope - SEO rank checker https://serposcope.serphacker.com/
*
* Copyright (c) 2016 SERP Hacker
* @author Pierre Nogues
* @license https://opensource.org/licenses/MIT MIT License
*/
package serposcope.controllers.admin;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.serphacker.serposcope.db.base.BaseDB;
import com.serphacker.serposcope.db.google.GoogleDB;
import com.serphacker.serposcope.models.base.Group;
import com.serphacker.serposcope.models.base.Proxy;
import com.serphacker.serposcope.models.google.GoogleSearch;
import com.serphacker.serposcope.models.google.GoogleTarget;
import conf.SerposcopeConf;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.function.Consumer;
import java.util.logging.Level;
import ninja.Context;
import ninja.FilterWith;
import ninja.Result;
import ninja.Results;
import ninja.Router;
import ninja.params.Param;
import ninja.session.FlashScope;
import ninja.utils.ResponseStreams;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jetty.server.HttpOutput;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import serposcope.controllers.BaseController;
import serposcope.filters.AdminFilter;
import serposcope.filters.XSRFFilter;
@FilterWith(AdminFilter.class)
@Singleton
public class LogController extends BaseController {
private static final Logger LOG = LoggerFactory.getLogger(LogController.class);
@Inject
Router router;
@Inject
SerposcopeConf conf;
@Inject
BaseDB basedb;
@Inject
GoogleDB googledb;
public Result logs() {
String[] logs = getLogFiles();
return Results.ok().render("logs", logs);
}
public Result viewLog(Context context, @Param("log") String log, @Param("ano") String ano) {
String[] logs = getLogFiles();
if (log == null || !Arrays.asList(logs).contains(log)) {
context.getFlashScope().error("admin.log.invalidLogFile");
return Results.redirect(router.getReverseRoute(LogController.class, "logs"));
}
String path = conf.logdir + "/" + log;
if ("1".equals(ano)) {
Map map = getObfuscateMap();
return Results
.text()
.render((ctx, res) -> {
ResponseStreams responseStreams = context.finalizeHeaders(res);
try (
Writer writer = responseStreams.getWriter();
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(path)));
) {
writer.append("############################################################################\n");
writer.append("# WARNING : log anonymization will not obfuscate deleted keywords and data #\n");
writer.append("############################################################################\n");
writer.append("\n");
reader.lines().forEach((String line) -> {
for (Map.Entry entry : map.entrySet()) {
if(!StringUtils.isEmpty(entry.getKey())){
line = line.replace(entry.getKey(), entry.getValue());
}
}
try {writer.append(line).append("\n");} catch (IOException ex) {}
});
} catch (IOException ex) {
LOG.error("view log", ex);
}
});
} else {
return Results
.text()
.render((ctx, res) -> {
ResponseStreams responseStreams = context.finalizeHeaders(res);
try (OutputStream os = responseStreams.getOutputStream()) {
Files.copy(new File(path).toPath(), os);
} catch (IOException ex) {
LOG.error("view log", ex);
}
});
}
}
protected String[] getLogFiles() {
File logDir = new File(conf.logdir);
String[] logs = logDir.list();
if (logs == null) {
logs = new String[0];
} else {
Arrays.sort(logs, Collections.reverseOrder());
}
return logs;
}
protected Map getObfuscateMap(){
Map obfuscate = new HashMap<>();
List proxies = basedb.proxy.list();
for (Proxy proxy : proxies) {
obfuscate.put(proxy.getIp(), "#OBF#proxy-ip#");
obfuscate.put(proxy.getUsername(), "#OBF#proxy-user#");
obfuscate.put(proxy.getPassword(), "#OBF#proxy-pass#");
}
List groups = basedb.group.list();
for (Group group : groups) {
obfuscate.put(group.getName(), "#OBF#group-" + group.getId() + "#");
}
List searches = googledb.search.list();
for (GoogleSearch search : searches) {
obfuscate.put(search.getKeyword(), "#OBF#search-" + search.getId() + "#");
try {
obfuscate.put(URLEncoder.encode(search.getKeyword(), "UTF-8"), "#OBF#search-" + search.getId() + "#");
} catch (UnsupportedEncodingException ex) {
}
}
List targets = googledb.target.list();
for (GoogleTarget target : targets) {
obfuscate.put(target.getName(), "#OBF#target-" + target.getId() + "#");
}
return getSortedMapByReverseLength(obfuscate);
}
protected Map getSortedMapByReverseLength(Map map){
Map sortedMap = new TreeMap<>((String o1, String o2) -> {
if(o2 == null && o1 != null){
return -1;
}
if(o2 != null && o1 == null){
return 1;
}
if(o1 == null && o2 == null){
return 0;
}
int lenDiff = o2.length() - o1.length();
if(lenDiff == 0){
return o1.compareTo(o2);
}
return lenDiff;
});
sortedMap.putAll(map);
return sortedMap;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy