AuthorizeNet/sdk-java

View on GitHub
src/main/java/net/authorize/util/SensitiveFilterPatternConverter.java

Summary

Maintainability
A
1 hr
Test Coverage
package net.authorize.util;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.regex.Pattern;

import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
import org.apache.logging.log4j.core.pattern.ConverterKeys;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

@Plugin(name = "SensitiveFilterPatternConverter", category = "Converter")
@ConverterKeys({"maskedMessage"})
public class SensitiveFilterPatternConverter extends LogEventPatternConverter{
    private static Pattern[] cardPatterns;
    
    private static Pattern[] tagPatterns;
    private static String[] tagReplacements;
    private static Gson gson;
    
    private SensitiveFilterPatternConverter(final String name, final String style) {
        super(name, style);
        initialize();
    }
    
    public static SensitiveFilterPatternConverter newInstance(final String[] options) {
        return new SensitiveFilterPatternConverter("maskedMessage", "maskedMessage");
    }

    @Override
    public void format(LogEvent event, StringBuilder toAppendTo) {
        try {
                String message = event.getMessage().getFormattedMessage();
                String maskXmlMessage = SensitiveFilterPatternConverter.maskSensitiveXmlString(message);
                String maskCardNumber = SensitiveFilterPatternConverter.maskCreditCards(maskXmlMessage);
                
                toAppendTo.append(maskCardNumber.trim());
        }
        catch(Exception e){
        }
    }

    public void initialize() {
        try {
            GsonBuilder gsonBuilder = new GsonBuilder();
            gsonBuilder.registerTypeAdapter(SensitiveDataConfigType.class, new SensitiveTagsDeserializer());
            gson = gsonBuilder.create();
                
            InputStream in = getClass().getResourceAsStream("/AuthorizedNetSensitiveTagsConfig.json"); 
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                SensitiveDataConfigType configType = gson.fromJson(reader, SensitiveDataConfigType.class);
                cardPatterns = new Pattern[configType.sensitiveStringRegexes.length];

              for(int i = 0; i < configType.sensitiveStringRegexes.length; i++) {  
                      cardPatterns[i] = Pattern.compile(configType.sensitiveStringRegexes[i]);
                  }
                  
                int noOfSensitiveTags = configType.sensitiveTags.length;
                tagPatterns     = new Pattern[noOfSensitiveTags];
                tagReplacements = new String[noOfSensitiveTags];
                      
                 for(int j=0; j<noOfSensitiveTags; j++) {
                      String tagName     = configType.sensitiveTags[j].tagName;
                      String pattern     = configType.sensitiveTags[j].pattern;
                      String replacement = configType.sensitiveTags[j].replacement;
                      
                      if(pattern != null && !pattern.isEmpty())
                          tagPatterns[j] = Pattern.compile("<"+tagName+">"+pattern+"</"+tagName+">");
                      else
                          tagPatterns[j] = Pattern.compile("<"+tagName+">"+".+"+"</"+tagName+">");
                      tagReplacements[j] = "<"+tagName+">"+replacement+"</"+tagName+">";
                  }
                 if(reader!=null)
                     reader.close();
        }
        catch(Exception e){
        }
    }
    
    public static String maskCreditCards(String str) {
        for (int i = 0; i < cardPatterns.length; i++) {
            str = cardPatterns[i].matcher(str).replaceAll("XXXX");
        }
        return str;
    }
    
    public static String maskSensitiveXmlString(String str) {
        for (int i = 0; i < tagPatterns.length; i++) {
            str = tagPatterns[i].matcher(str).replaceAll(tagReplacements[i]);
        }
        return str;
    }
}