package stirling.software.SPDF.utils; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.List; import org.springframework.web.multipart.MultipartFile; import com.fathzer.soft.javaluator.DoubleEvaluator; import io.github.pixee.security.HostValidator; import io.github.pixee.security.Urls; public class GeneralUtils { public static File convertMultipartFileToFile(MultipartFile multipartFile) throws IOException { File tempFile = Files.createTempFile("temp", null).toFile(); try (FileOutputStream os = new FileOutputStream(tempFile)) { os.write(multipartFile.getBytes()); } return tempFile; } public static void deleteDirectory(Path path) throws IOException { Files.walkFileTree( path, new SimpleFileVisitor() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { Files.delete(file); return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { Files.delete(dir); return FileVisitResult.CONTINUE; } }); } public static String convertToFileName(String name) { String safeName = name.replaceAll("[^a-zA-Z0-9]", "_"); if (safeName.length() > 50) { safeName = safeName.substring(0, 50); } return safeName; } public static boolean isValidURL(String urlStr) { try { Urls.create( urlStr, Urls.HTTP_PROTOCOLS, HostValidator.DENY_COMMON_INFRASTRUCTURE_TARGETS); return true; } catch (MalformedURLException e) { return false; } } public static File multipartToFile(MultipartFile multipart) throws IOException { Path tempFile = Files.createTempFile("overlay-", ".pdf"); try (InputStream in = multipart.getInputStream(); FileOutputStream out = new FileOutputStream(tempFile.toFile())) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } } return tempFile.toFile(); } public static Long convertSizeToBytes(String sizeStr) { if (sizeStr == null) { return null; } sizeStr = sizeStr.trim().toUpperCase(); try { if (sizeStr.endsWith("KB")) { return (long) (Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2)) * 1024); } else if (sizeStr.endsWith("MB")) { return (long) (Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2)) * 1024 * 1024); } else if (sizeStr.endsWith("GB")) { return (long) (Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2)) * 1024 * 1024 * 1024); } else if (sizeStr.endsWith("B")) { return Long.parseLong(sizeStr.substring(0, sizeStr.length() - 1)); } else { // Assume MB if no unit is specified return (long) (Double.parseDouble(sizeStr) * 1024 * 1024); } } catch (NumberFormatException e) { // The numeric part of the input string cannot be parsed, handle this case } return null; } public static List parsePageList(String pages, int totalPages, boolean oneBased) { if (pages == null) { return List.of(1); // Default to first page if input is null } try { return parsePageList(pages.split(","), totalPages, oneBased); } catch (NumberFormatException e) { return List.of(1); // Default to first page if input is invalid } } public static List parsePageList(String[] pages, int totalPages) { return parsePageList(pages, totalPages, false); } public static List parsePageList(String[] pages, int totalPages, boolean oneBased) { List result = new ArrayList<>(); int offset = oneBased ? 1 : 0; for (String page : pages) { if ("all".equalsIgnoreCase(page)) { for (int i = 0; i < totalPages; i++) { result.add(i + offset); } } else if (page.contains(",")) { // Split the string into parts, could be single pages or ranges String[] parts = page.split(","); for (String part : parts) { result.addAll(handlePart(part, totalPages, offset)); } } else { result.addAll(handlePart(page, totalPages, offset)); } } return new ArrayList<>( new java.util.LinkedHashSet<>(result)); // Remove duplicates and maintain order } public static List evaluateNFunc(String expression, int maxValue) { List results = new ArrayList<>(); DoubleEvaluator evaluator = new DoubleEvaluator(); // Validate the expression if (!expression.matches("[0-9n+\\-*/() ]+")) { throw new IllegalArgumentException("Invalid expression"); } int n = 0; while (true) { // Replace 'n' with the current value of n, correctly handling numbers before 'n' String sanitizedExpression = insertMultiplicationBeforeN(expression, n); Double result = evaluator.evaluate(sanitizedExpression); // Check if the result is null or not within bounds if (result == null || result <= 0 || result.intValue() > maxValue) { if (n != 0) break; } else { results.add(result.intValue()); } n++; } return results; } private static String insertMultiplicationBeforeN(String expression, int nValue) { // Insert multiplication between a number and 'n' (e.g., "4n" becomes "4*n") String withMultiplication = expression.replaceAll("(\\d)n", "$1*n"); // Now replace 'n' with its current value return withMultiplication.replaceAll("n", String.valueOf(nValue)); } private static List handlePart(String part, int totalPages, int offset) { List partResult = new ArrayList<>(); // First check for n-syntax because it should not be processed as a range if (part.contains("n")) { partResult = evaluateNFunc(part, totalPages); // Adjust the results according to the offset for (int i = 0; i < partResult.size(); i++) { int adjustedValue = partResult.get(i) - 1 + offset; partResult.set(i, adjustedValue); } } else if (part.contains("-")) { // Process ranges only if it's not n-syntax String[] rangeParts = part.split("-"); try { int start = Integer.parseInt(rangeParts[0]); int end = Integer.parseInt(rangeParts[1]); for (int i = start; i <= end; i++) { if (i >= 1 && i <= totalPages) { partResult.add(i - 1 + offset); } } } catch (NumberFormatException e) { // Range is invalid, ignore this part } } else { // This is a single page number try { int pageNum = Integer.parseInt(part.trim()); if (pageNum >= 1 && pageNum <= totalPages) { partResult.add(pageNum - 1 + offset); } } catch (NumberFormatException ignored) { // Ignore invalid numbers } } return partResult; } public static boolean createDir(String path) { Path folder = Paths.get(path); if (!Files.exists(folder)) { try { Files.createDirectories(folder); } catch (IOException e) { e.printStackTrace(); return false; } } return true; } }