1 /*
2  *  Make.org Core API
3  *  Copyright (C) 2021 Make.org
4  *
5  * This program is free software: you can redistribute it and/or modify
6  *  it under the terms of the GNU Affero General Public License as
7  *  published by the Free Software Foundation, either version 3 of the
8  *  License, or (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU Affero General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Affero General Public License
16  *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
17  *
18  */
19 
20 package org.make.api.technical
21 
22 import scala.util.chaining.scalaUtilChainingOps
23 
24 final case class IpAndHash(ip: String, hash: String)
25 
26 object IpAndHash {
27   private val IPv6SafeSegments = 3
28   private val IPv6SegmentsCount = 8
29 
30   private def obfuscateIpV4(ip: String): String =
31     s"${ip.take(ip.lastIndexOf("."))}.x"
32 
33   @SuppressWarnings(Array("org.wartremover.warts.Throw"))
34   private val obfuscateIpV6: String => String =
35     _.split("::")
36       .map(_.split(':').filterNot(_.isEmpty))
37       .pipe({
38         case Array()     => Array[String]()
39         case Array(elem) => elem
40         case Array(left, right) =>
41           val numberOfSegments = left.length + right.length
42           val numberOfCompressedSegments = IPv6SegmentsCount - numberOfSegments
43           left ++ Array.fill(numberOfCompressedSegments)("0") ++ right
44         case _ => throw new Error("Invalid IPv6 format")
45       })
46       .take(IPv6SafeSegments)
47       .mkString(":")
48       .concat("::")
49 
50   def obfuscateIp(ip: String): String = ip match {
51     case ip if ip.contains(":") => obfuscateIpV6(ip)
52     case _                      => obfuscateIpV4(ip)
53   }
54 }
Line Stmt Id Pos Tree Symbol Tests Code
27 128 932 - 933 Literal <nosymbol> org.make.api.technical.security.securityhelpertest,org.make.api.user.userapitest,org.make.api.userhistory.userhistorytest,org.make.api.technical.crm.crmservicecomponenttest 3
28 19 968 - 969 Literal <nosymbol> org.make.api.technical.security.securityhelpertest,org.make.api.user.userapitest,org.make.api.userhistory.userhistorytest,org.make.api.technical.crm.crmservicecomponenttest 8
48 216 1173 - 1706 Apply java.lang.String.concat org.make.api.technical.security.securityhelpertest scala.Predef.wrapRefArray[String](scala.Predef.refArrayOps[String](scala.util.`package`.chaining.scalaUtilChainingOps[Array[Array[String]]](scala.Predef.refArrayOps[String](x$1.split("::")).map[Array[String]](((x$2: String) => scala.Predef.refArrayOps[String](scala.Predef.augmentString(x$2).split(':')).filterNot(((x$3: String) => x$3.isEmpty()))))((ClassTag.apply[Array[String]](scala.runtime.ScalaRunTime.arrayClass(classOf[java.lang.String])): scala.reflect.ClassTag[Array[String]]))).pipe[Array[String]](((x0$1: Array[Array[String]]) => x0$1 match { case scala.Array.unapplySeq[Array[String]](<unapply-selector>) <unapply> () => scala.Array.apply[String]()((ClassTag.apply[String](classOf[java.lang.String]): scala.reflect.ClassTag[String])) case scala.Array.unapplySeq[Array[String]](<unapply-selector>) <unapply> ((elem @ _)) => elem case scala.Array.unapplySeq[Array[String]](<unapply-selector>) <unapply> ((left @ _), (right @ _)) => { val numberOfSegments: Int = left.length.+(right.length); val numberOfCompressedSegments: Int = IpAndHash.this.IPv6SegmentsCount.-(numberOfSegments); scala.Predef.refArrayOps[String](scala.Predef.refArrayOps[String](left).++[String](scala.Array.fill[String](numberOfCompressedSegments)("0")((ClassTag.apply[String](classOf[java.lang.String]): scala.reflect.ClassTag[String])))((ClassTag.apply[String](classOf[java.lang.String]): scala.reflect.ClassTag[String]))).++[String](right)((ClassTag.apply[String](classOf[java.lang.String]): scala.reflect.ClassTag[String])) } case _ => throw new scala.`package`.Error("Invalid IPv6 format") }))).take(IpAndHash.this.IPv6SafeSegments)).mkString(":").concat("::")
51 151 1774 - 1790 Apply java.lang.String.contains org.make.api.technical.security.securityhelpertest,org.make.api.user.userapitest,org.make.api.userhistory.userhistorytest,org.make.api.technical.crm.crmservicecomponenttest ip.contains(":")
51 24 1794 - 1811 Apply scala.Function1.apply org.make.api.technical.security.securityhelpertest IpAndHash.this.obfuscateIpV6.apply(ip)
52 237 1847 - 1864 Apply org.make.api.technical.IpAndHash.obfuscateIpV4 org.make.api.technical.security.securityhelpertest,org.make.api.user.userapitest,org.make.api.userhistory.userhistorytest,org.make.api.technical.crm.crmservicecomponenttest IpAndHash.this.obfuscateIpV4(ip)