/* * Copyright 2014-2015 Groupon, Inc * Copyright 2014-2015 The Billing Project, LLC * * The Billing Project licenses this file to you under the Apache License, version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ package org.killbill.billing.server.log.obfuscators; import org.killbill.billing.server.log.ServerTestSuiteNoDB; import org.mockito.Mockito; import org.testng.Assert; import org.testng.annotations.Test; import ch.qos.logback.classic.spi.ILoggingEvent; public class TestPatternObfuscator extends ServerTestSuiteNoDB { private final PatternObfuscator obfuscator = new PatternObfuscator(); @Test(groups = "fast") public void testAdyen() throws Exception { verify("<ns:expiryMonth>04</expiryMonth>\n" + "<ns:expiryYear>2015</expiryYear>\n" + "<ns:holderName> test </holderName>\n" + "<ns:number>5123456789012346</number>\n" + "<ns2:shopperEmail>Bob@example.org</ns2:shopperEmail>\n" + "<ns2:shopperIP>127.0.0.1</ns2:shopperIP>\n" + "<ns2:shopperInteraction xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"/>\n" + "<ns2:shopperName>\n" + " <firstName>Bob</firstName>\n" + " <gender xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"/>\n" + " <infix xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"/>\n" + " <lastName>Smith</lastName>\n" + "</ns2:shopperName>\n", "<ns:expiryMonth>04</expiryMonth>\n" + "<ns:expiryYear>2015</expiryYear>\n" + "<ns:holderName>********</holderName>\n" + "<ns:number>****************</number>\n" + "<ns2:shopperEmail>***************</ns2:shopperEmail>\n" + "<ns2:shopperIP>127.0.0.1</ns2:shopperIP>\n" + "<ns2:shopperInteraction xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"/>\n" + "<ns2:shopperName>\n" + " <firstName>***</firstName>\n" + " <gender xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"/>\n" + " <infix xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"/>\n" + " <lastName>*****</lastName>\n" + "</ns2:shopperName>\n"); } @Test(groups = "fast") public void testCyberSource() throws Exception { verify("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" + " <s:Header>\n" + " <wsse:Security s:mustUnderstand=\"1\" xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\">\n" + " <wsse:UsernameToken>\n" + " <wsse:Username/>\n" + " <wsse:Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText\"/>\n" + " </wsse:UsernameToken>\n" + " </wsse:Security>\n" + " </s:Header>\n" + " <s:Body xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n" + " <requestMessage xmlns=\"urn:schemas-cybersource-com:transaction-data-1.109\">\n" + " <merchantID/>\n" + " <merchantReferenceCode>e92a3bfd-0713-4396-a1e2-ff46cb051f8c</merchantReferenceCode>\n" + " <clientLibrary>Ruby Active Merchant</clientLibrary>\n" + " <clientLibraryVersion>1.47.0</clientLibraryVersion>\n" + " <clientEnvironment>java</clientEnvironment>\n" + "<billTo>\n" + " <firstName>John</firstName>\n" + " <lastName>Doe</lastName>\n" + " <street1>5, oakriu road</street1>\n" + " <street2>apt. 298</street2>\n" + " <city>Gdio Foia</city>\n" + " <state>FL</state>\n" + " <postalCode>49302</postalCode>\n" + " <country>US</country>\n" + " <email>1428324461-test@tester.com</email>\n" + "</billTo>\n" + "<purchaseTotals>\n" + " <currency>USD</currency>\n" + " <grandTotalAmount>0.00</grandTotalAmount>\n" + "</purchaseTotals>\n" + "<card>\n" + " <accountNumber>4242424242424242</accountNumber>\n" + " <expirationMonth>12</expirationMonth>\n" + " <expirationYear>2017</expirationYear>\n" + " <cvNumber>1234</cvNumber>\n" + " <cardType>001</cardType>\n" + "</card>\n" + "<subscription>\n" + " <paymentMethod>credit card</paymentMethod>\n" + "</subscription>\n" + "<recurringSubscriptionInfo>\n" + " <amount>0.00</amount>\n" + " <frequency>on-demand</frequency>\n" + " <approvalRequired>false</approvalRequired>\n" + "</recurringSubscriptionInfo>\n" + "<paySubscriptionCreateService run=\"true\"/>\n" + "<businessRules>\n" + "</businessRules>\n" + " </requestMessage>\n" + " </s:Body>\n" + "</s:Envelope>", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" + " <s:Header>\n" + " <wsse:Security s:mustUnderstand=\"1\" xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\">\n" + " <wsse:UsernameToken>\n" + " <wsse:Username/>\n" + " <wsse:Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText\"/>\n" + " </wsse:UsernameToken>\n" + " </wsse:Security>\n" + " </s:Header>\n" + " <s:Body xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n" + " <requestMessage xmlns=\"urn:schemas-cybersource-com:transaction-data-1.109\">\n" + " <merchantID/>\n" + " <merchantReferenceCode>e92a3bfd-0713-4396-a1e2-ff46cb051f8c</merchantReferenceCode>\n" + " <clientLibrary>Ruby Active Merchant</clientLibrary>\n" + " <clientLibraryVersion>1.47.0</clientLibraryVersion>\n" + " <clientEnvironment>java</clientEnvironment>\n" + "<billTo>\n" + " <firstName>****</firstName>\n" + " <lastName>***</lastName>\n" + " <street1>5, oakriu road</street1>\n" + " <street2>apt. 298</street2>\n" + " <city>Gdio Foia</city>\n" + " <state>FL</state>\n" + " <postalCode>49302</postalCode>\n" + " <country>US</country>\n" + " <email>**************************</email>\n" + "</billTo>\n" + "<purchaseTotals>\n" + " <currency>USD</currency>\n" + " <grandTotalAmount>0.00</grandTotalAmount>\n" + "</purchaseTotals>\n" + "<card>\n" + " <accountNumber>****************</accountNumber>\n" + " <expirationMonth>12</expirationMonth>\n" + " <expirationYear>2017</expirationYear>\n" + " <cvNumber>****</cvNumber>\n" + " <cardType>001</cardType>\n" + "</card>\n" + "<subscription>\n" + " <paymentMethod>credit card</paymentMethod>\n" + "</subscription>\n" + "<recurringSubscriptionInfo>\n" + " <amount>0.00</amount>\n" + " <frequency>on-demand</frequency>\n" + " <approvalRequired>false</approvalRequired>\n" + "</recurringSubscriptionInfo>\n" + "<paySubscriptionCreateService run=\"true\"/>\n" + "<businessRules>\n" + "</businessRules>\n" + " </requestMessage>\n" + " </s:Body>\n" + "</s:Envelope>"); } @Test(groups = "fast") public void testLitle() throws Exception { verify("<litleOnlineRequest merchantId=\\\"merchant_id\\\" version=\\\"8.18\\\" xmlns=\\\"http://www.litle.com/schema\\\"><authentication><user>login</user><password>password</password></authentication><sale id=\\\"615b9cb3-8580-4f57-bf69-9\\\" reportGroup=\\\"Default Report Group\\\"><orderId>615b9cb3-8580-4f57-bf69-9</orderId><amount>10000</amount><orderSource>ecommerce</orderSource><billToAddress><name>John Doe</name><email>1428325948-test@tester.com</email><addressLine1>5, oakriu road</addressLine1><addressLine2>apt. 298</addressLine2><city>Gdio Foia</city><state>FL</state><zip>49302</zip><country>US</country></billToAddress><shipToAddress/><card><type>VI</type><number>4242424242424242</number><expDate>1217</expDate><cardValidationNum>1234</cardValidationNum></card></sale></litleOnlineRequest>", "<litleOnlineRequest merchantId=\\\"merchant_id\\\" version=\\\"8.18\\\" xmlns=\\\"http://www.litle.com/schema\\\"><authentication><user>login</user><password>********</password></authentication><sale id=\\\"615b9cb3-8580-4f57-bf69-9\\\" reportGroup=\\\"Default Report Group\\\"><orderId>615b9cb3-8580-4f57-bf69-9</orderId><amount>10000</amount><orderSource>ecommerce</orderSource><billToAddress><name>********</name><email>**************************</email><addressLine1>5, oakriu road</addressLine1><addressLine2>apt. 298</addressLine2><city>Gdio Foia</city><state>FL</state><zip>49302</zip><country>US</country></billToAddress><shipToAddress/><card><type>VI</type><number>****************</number><expDate>1217</expDate><cardValidationNum>****</cardValidationNum></card></sale></litleOnlineRequest>"); } @Test(groups = "fast") public void testJSON() throws Exception { verify("{\n" + " \"card\": {\n" + " \"id\": \"card_483etw4er9fg4vF3sQdrt3FG\",\n" + " \"object\": \"card\",\n" + " \"banknumber\": 4111111111111111,\n" + " \"cvv\" : 111,\n" + " \"cvv\": 111,\n" + " \"cvv\": \"111\",\n" + " \"data\": {\"cvv\" : 111 },\n" + " \"last4\": \"0000\",\n" + " \"brand\": \"Visa\",\n" + " \"funding\": \"credit\",\n" + " \"exp_month\": 6,\n" + " \"exp_year\": 2019,\n" + " \"fingerprint\": \"HOh74kZU387WlUvy\",\n" + " \"country\": \"US\",\n" + " \"name\": \"Bob Smith\",\n" + " \"address_line1\": null,\n" + " \"address_line2\": null,\n" + " \"address_city\": null,\n" + " \"address_state\": null,\n" + " \"address_zip\": null,\n" + " \"address_country\": null,\n" + " \"dynamic_last4\": \"4242\",\n" + " \"customer\": null,\n" + " \"type\": \"Visa\"}\n" + "}", "{\n" + " \"card\": {\n" + " \"id\": \"card_483etw4er9fg4vF3sQdrt3FG\",\n" + " \"object\": \"card\",\n" + " \"banknumber\": ****************,\n" + " \"cvv\" : ***,\n" + " \"cvv\": ***,\n" + " \"cvv\": *****,\n" + " \"data\": {\"cvv\" : ****},\n" + " \"last4\": \"0000\",\n" + " \"brand\": \"Visa\",\n" + " \"funding\": \"credit\",\n" + " \"exp_month\": 6,\n" + " \"exp_year\": 2019,\n" + " \"fingerprint\": \"HOh74kZU387WlUvy\",\n" + " \"country\": \"US\",\n" + " \"name\": ***********,\n" + " \"address_line1\": null,\n" + " \"address_line2\": null,\n" + " \"address_city\": null,\n" + " \"address_state\": null,\n" + " \"address_zip\": null,\n" + " \"address_country\": null,\n" + " \"dynamic_last4\": \"4242\",\n" + " \"customer\": null,\n" + " \"type\": \"Visa\"}\n" + "}"); } @Test(groups = "fast") public void testPayU() throws Exception { verify("<entry>\n" + " <key xsi:type=\"xsd:string\">PayU.ccvv</key>\n" + " <value xsi:type=\"xsd:string\">1234</value>\n" + "</entry>\n" + "<entry>\n" + " <key xsi:type=\"xsd:string\">PayU.ccnum</key>\n" + " <value xsi:type=\"xsd:string\">4111111111111111</value>\n" + "</entry>\n" + "<entry>\n" + " <key xsi:type=\"xsd:string\">PayU.ccexpmon</key>\n" + " <value xsi:type=\"xsd:string\">12</value>\n" + "</entry>\n" + " <key xsi:type=\"xsd:string\">PayU.ccexpyear</key>\n" + " <value xsi:type=\"xsd:string\">2018</value>\n" + "</entry>\n", "<entry>\n" + " <key xsi:type=\"xsd:string\">PayU.ccvv</key>\n" + " <value xsi:type=\"xsd:string\">****</value>\n" + "</entry>\n" + "<entry>\n" + " <key xsi:type=\"xsd:string\">PayU.ccnum</key>\n" + " <value xsi:type=\"xsd:string\">4111111111111111</value>\n" + "</entry>\n" + "<entry>\n" + " <key xsi:type=\"xsd:string\">PayU.ccexpmon</key>\n" + " <value xsi:type=\"xsd:string\">12</value>\n" + "</entry>\n" + " <key xsi:type=\"xsd:string\">PayU.ccexpyear</key>\n" + " <value xsi:type=\"xsd:string\">2018</value>\n" + "</entry>\n" ); } @Test(groups = "fast", description = "Test for ActiveMerchant wiredump_device logging") public void testWithQuotedNewLines() throws Exception { verify("[cybersource-plugin] \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?><accountNumber>4111111111111111</accountNumber>\\n <expirationMonth>09</expirationMonth>\\n \"", "[cybersource-plugin] \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?><accountNumber>****************</accountNumber>\\n <expirationMonth>09</expirationMonth>\\n \""); } @Test(groups = "fast") public void testProfilingHeaderIsNotObfuscated() throws Exception { final ILoggingEvent event = Mockito.mock(ILoggingEvent.class); Mockito.when(event.getLoggerName()).thenReturn(Obfuscator.LOGGING_FILTER_NAME); verify("1 * Server out-bound response\n" + "1 < 500\n" + "1 < Content-Type: application/json\n" + "1 < X-Killbill-Profiling-Resp: {\"rawData\":[{\"name\":\"DAO:AccountSqlDao:getById\",\"durationUsec\":14873},{\"name\":\"DAO:PaymentMethodSqlDao:getById\",\"durationUsec\":10438},{\"name\":\"DAO:PaymentSqlDao:create\",\"durationUsec\":31750},{\"name\":\"DAO:TransactionSqlDao:create\",\"durationUsec\":23121},{\"name\":\"DAO:PaymentSqlDao:getById\",\"durationUsec\":2541},{\"name\":\"DAO:TransactionSqlDao:getByPaymentId\",\"durationUsec\":3574},{\"name\":\"DAO:PaymentMethodSqlDao:getPaymentMethodIncludedDelete\",\"durationUsec\":1763},{\"name\":\"DAO:TransactionSqlDao:updateTransactionStatus\",\"durationUsec\":13994},{\"name\":\"DAO:PaymentSqlDao:updatePaymentStateName\",\"durationUsec\":11929},{\"name\":\"DAO:TransactionSqlDao:getById\",\"durationUsec\":5245}]}", event); } @Test(groups = "fast") public void testPluginProperties() throws Exception { verify("ENTERING onSuccessCall paymentMethodId='e92a3bfd-0713-4396-a1e2-ff46cb051f8c' ccVerificationValue='123' ccNumber = '4111111111111111' ccTrackData=\"XXX\" ccFirstName = \"John\" ccLastName=\"'Smith'\"", "ENTERING onSuccessCall paymentMethodId='e92a3bfd-0713-4396-a1e2-ff46cb051f8c' ccVerificationValue='***' ccNumber = '****************' ccTrackData=\"***\" ccFirstName = \"****\" ccLastName=\"*******\""); } private void verify(final String input, final ILoggingEvent event) { verify(input, input, event); } private void verify(final String input, final String output) { verify(input, output, Mockito.mock(ILoggingEvent.class)); } private void verify(final String input, final String output, final ILoggingEvent event) { final String obfuscated = obfuscator.obfuscate(input, event); Assert.assertEquals(obfuscated, output, obfuscated); } }