Skip to content

Micro-library for validating and obfuscating email addresses

License

Notifications You must be signed in to change notification settings

hmrc/emailaddress

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

92 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

emailaddress

This library is Deprecated. You can reach out Digital-Contact team for further assistance.
Alternatively you can write you own EmailAddress class as in the following example: https://github.com/hmrc/preferences-frontend/blob/main/app/emailaddress/EmailAddress.scala

Join the chat at https://gitter.im/hmrc/emailaddress Build Status Download

Scala micro-library for typing, validating and obfuscating email addresses

Address Typing & Validation

The EmailAddress class will only accept valid addresses:

scala> import uk.gov.hmrc.emailaddress._
import uk.gov.hmrc.emailaddress._

scala> EmailAddress("[email protected]")
res0: uk.gov.hmrc.emailaddress.EmailAddress = example@test.com

scala> EmailAddress("not_a_meaningful_address")
java.lang.IllegalArgumentException: requirement failed: 'not_a_meaningful_address' is not a valid email address

You can also use EmailAddress.isValid(...):

scala> EmailAddress.isValid("[email protected]")
res2: Boolean = true

scala> EmailAddress.isValid("not_a_meaningful_address")
res3: Boolean = false

Accessing the domain and mailbox

You can access the mailbox and domain of a given address:

scala> EmailAddress("[email protected]").domain
res0: uk.gov.hmrc.emailaddress.EmailAddress.Domain = test.com

scala> EmailAddress("[email protected]").mailbox
res1: uk.gov.hmrc.emailaddress.EmailAddress.Mailbox = example

These compare equal as you might expect:

scala> EmailAddress("[email protected]").domain == EmailAddress("[email protected]").domain
res2: Boolean = true

scala> EmailAddress("[email protected]").domain == EmailAddress("[email protected]").domain
res3: Boolean = false

Obfuscation

Addresses are obfuscated by starring out all of their mailbox part, apart from the first and last letters:

scala> ObfuscatedEmailAddress("[email protected]")
res4: uk.gov.hmrc.emailaddress.ObfuscatedEmailAddress = e*****e@test.com

Unless there are only two letters:

scala> ObfuscatedEmailAddress("[email protected]")
res7: uk.gov.hmrc.emailaddress.ObfuscatedEmailAddress = **@test.com```

You can also create them directly from an EmailAddress:

scala> EmailAddress("[email protected]").obfuscated
res6: uk.gov.hmrc.emailaddress.ObfuscatedEmailAddress = e*****e@test.com

Converting back to String

All classes toString and implicitly convert to Strings nicely:

scala> val someString: String = EmailAddress("[email protected]")
someString: String = example@test.com

scala> val someString = EmailAddress("[email protected]").toString
someString: String = example@test.com

scala> val someString: String = ObfuscatedEmailAddress("[email protected]")
someString: String = e*****e@test.com

scala> val someString = ObfuscatedEmailAddress("[email protected]").toString
someString: String = e*****e@test.com

scala> EmailAddress("[email protected]").domain.toString
res4: String = test.com

scala> val s: String = EmailAddress("[email protected]").domain
s: String = test.com

scala> EmailAddress("[email protected]").mailbox.toString
res5: String = example

scala> val s: String = EmailAddress("[email protected]").mailbox
s: String = example

Installing

Include the following dependency in your SBT build before v4.0.0

resolvers += Resolver.bintrayRepo("hmrc", "releases")

libraryDependencies += "uk.gov.hmrc" %% "emailaddress" % "<INSERT VERSION>"

Include one the following dependencies in your SBT build for v4.0.0 or after depending on whether you are using Play 2.8, Play 2.9 or Play 3.0

libraryDependencies += "uk.gov.hmrc" %% "emailaddress-play-28" % "<INSERT VERSION>"

OR

libraryDependencies += "uk.gov.hmrc" %% "emailaddress-play-29" % "<INSERT VERSION>"

OR

libraryDependencies += "uk.gov.hmrc" %% "emailaddress-play-30" % "<INSERT VERSION>"

Run the tests and sbt fmt before raising a PR

Format:

sbt fmt

Then run the tests and coverage report:

sbt clean coverage test coverageReport

If your build fails due to poor test coverage, DO NOT lower the test coverage threshold, instead inspect the generated report located here on your local repo: /target/scala-2.12/scoverage-report/index.html

Then run the integration tests:

sbt it:test

License

This code is open source software licensed under the Apache 2.0 License.