1 /*
2  *  Make.org Core API
3  *  Copyright (C) 2018 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.user.validation
21 
22 import com.typesafe.config.{Config, ConfigObject}
23 import org.make.api.ConfigComponent
24 import org.make.api.user.UserRegisterData
25 import org.make.core.Requirement
26 
27 import scala.concurrent.ExecutionContext.Implicits.global
28 import scala.concurrent.Future
29 
30 trait DefaultUserRegistrationValidatorComponent extends UserRegistrationValidatorComponent {
31   self: ConfigComponent =>
32 
33   override lazy val userRegistrationValidator: UserRegistrationValidator = new DefaultUserRegistrationValidator(
34     config.getConfig("make-api.user-validation")
35   )
36 }
37 
38 class DefaultUserRegistrationValidator(configuration: Config) extends UserRegistrationValidator {
39 
40   private val validatorsConfiguration: ConfigObject =
41     configuration.getObject("email.validators")
42 
43   private var validators: Seq[EmailValidation] = Seq.empty
44 
45   validatorsConfiguration.keySet.forEach { name =>
46     val validatorConfig = validatorsConfiguration.toConfig.getConfig(name)
47     val extraParameters = validatorConfig.getConfig("parameters")
48     val className = validatorConfig.getString("validator-class")
49 
50     @SuppressWarnings(Array("org.wartremover.warts.AsInstanceOf"))
51     val validator = Thread
52       .currentThread()
53       .getContextClassLoader
54       .loadClass(className)
55       .getConstructor()
56       .newInstance()
57       .asInstanceOf[EmailValidation]
58 
59     validator.init(name, extraParameters)
60 
61     validators :+= validator
62   }
63 
64   override def canRegister(userData: UserRegisterData): Future[Boolean] = {
65     Future
66       .traverse(validators) { _.canRegister(userData) }
67       .map(_.exists(identity))
68   }
69 
70   lazy val requirementsConfiguration: Seq[UserRequirement] =
71     configuration.getString("requirements").split(",").toSeq.flatMap {
72       case AgeIsRequired.value => Some(AgeIsRequired)
73       case LegalConsent.value  => Some(LegalConsent)
74       case ""                  => None
75     }
76 
77   override def requirements(request: UserProfileRequestValidation): Seq[Requirement] =
78     requirementsConfiguration.flatMap(_.requirement(request))
79 
80 }
Line Stmt Id Pos Tree Symbol Tests Code
41 24725 1482 - 1525 Apply com.typesafe.config.Config.getObject org.make.api.user.validation.defaultuserregistrationvalidatortest DefaultUserRegistrationValidator.this.configuration.getObject("email.validators")
43 22374 1576 - 1585 TypeApply scala.collection.SeqFactory.Delegate.empty org.make.api.user.validation.defaultuserregistrationvalidatortest scala.`package`.Seq.empty[Nothing]
45 24733 1589 - 2177 Apply java.lang.Iterable.forEach org.make.api.user.validation.defaultuserregistrationvalidatortest DefaultUserRegistrationValidator.this.validatorsConfiguration.keySet().forEach(((name: String) => { val validatorConfig: com.typesafe.config.Config = DefaultUserRegistrationValidator.this.validatorsConfiguration.toConfig().getConfig(name); val extraParameters: com.typesafe.config.Config = validatorConfig.getConfig("parameters"); val className: String = validatorConfig.getString("validator-class"); @SuppressWarnings(value = ["org.wartremover.warts.AsInstanceOf"]) val validator: org.make.api.user.validation.EmailValidation = java.lang.Thread.currentThread().getContextClassLoader().loadClass(className).getConstructor().newInstance().asInstanceOf[org.make.api.user.validation.EmailValidation]; validator.init(name, extraParameters); DefaultUserRegistrationValidator.this.validators_=(DefaultUserRegistrationValidator.this.validators.:+[org.make.api.user.validation.EmailValidation](validator)) }))
46 27266 1664 - 1712 Apply com.typesafe.config.Config.getConfig org.make.api.user.validation.defaultuserregistrationvalidatortest DefaultUserRegistrationValidator.this.validatorsConfiguration.toConfig().getConfig(name)
47 25037 1739 - 1778 Apply com.typesafe.config.Config.getConfig org.make.api.user.validation.defaultuserregistrationvalidatortest validatorConfig.getConfig("parameters")
48 22859 1799 - 1843 Apply com.typesafe.config.Config.getString org.make.api.user.validation.defaultuserregistrationvalidatortest validatorConfig.getString("validator-class")
57 26458 1932 - 2100 TypeApply scala.Any.asInstanceOf org.make.api.user.validation.defaultuserregistrationvalidatortest java.lang.Thread.currentThread().getContextClassLoader().loadClass(className).getConstructor().newInstance().asInstanceOf[org.make.api.user.validation.EmailValidation]
59 25335 2106 - 2143 Apply org.make.api.user.validation.EmailValidation.init org.make.api.user.validation.defaultuserregistrationvalidatortest validator.init(name, extraParameters)
61 23370 2149 - 2173 Apply scala.collection.SeqOps.:+ org.make.api.user.validation.defaultuserregistrationvalidatortest DefaultUserRegistrationValidator.this.validators.:+[org.make.api.user.validation.EmailValidation](validator)
61 26923 2149 - 2173 Apply org.make.api.user.validation.DefaultUserRegistrationValidator.validators_= org.make.api.user.validation.defaultuserregistrationvalidatortest DefaultUserRegistrationValidator.this.validators_=(DefaultUserRegistrationValidator.this.validators.:+[org.make.api.user.validation.EmailValidation](validator))
66 25255 2294 - 2294 TypeApply scala.collection.BuildFromLowPriority2.buildFromIterableOps org.make.api.user.validation.defaultuserregistrationvalidatortest collection.this.BuildFrom.buildFromIterableOps[Seq, org.make.api.user.validation.EmailValidation, Boolean]
66 27201 2296 - 2319 Apply org.make.api.user.validation.EmailValidation.canRegister org.make.api.user.validation.defaultuserregistrationvalidatortest x$1.canRegister(userData)
66 22380 2282 - 2292 Select org.make.api.user.validation.DefaultUserRegistrationValidator.validators org.make.api.user.validation.defaultuserregistrationvalidatortest DefaultUserRegistrationValidator.this.validators
66 22795 2294 - 2294 Select scala.concurrent.ExecutionContext.Implicits.global org.make.api.user.validation.defaultuserregistrationvalidatortest scala.concurrent.ExecutionContext.Implicits.global
67 27121 2259 - 2352 ApplyToImplicitArgs scala.concurrent.Future.map org.make.api.user.validation.defaultuserregistrationvalidatortest scala.concurrent.Future.traverse[org.make.api.user.validation.EmailValidation, Boolean, Seq](DefaultUserRegistrationValidator.this.validators)(((x$1: org.make.api.user.validation.EmailValidation) => x$1.canRegister(userData)))(collection.this.BuildFrom.buildFromIterableOps[Seq, org.make.api.user.validation.EmailValidation, Boolean], scala.concurrent.ExecutionContext.Implicits.global).map[Boolean](((x$2: Seq[Boolean]) => x$2.exists(((x: Boolean) => scala.Predef.identity[Boolean](x)))))(scala.concurrent.ExecutionContext.Implicits.global)
67 23304 2332 - 2332 Select scala.concurrent.ExecutionContext.Implicits.global org.make.api.user.validation.defaultuserregistrationvalidatortest scala.concurrent.ExecutionContext.Implicits.global
67 25346 2333 - 2351 Apply scala.collection.IterableOnceOps.exists x$2.exists(((x: Boolean) => scala.Predef.identity[Boolean](x)))
67 26467 2342 - 2350 Apply scala.Predef.identity scala.Predef.identity[Boolean](x)
78 22318 2734 - 2791 Apply scala.collection.IterableOps.flatMap org.make.api.user.validation.defaultuserregistrationvalidatortest DefaultUserRegistrationValidator.this.requirementsConfiguration.flatMap[org.make.core.Requirement](((x$3: org.make.api.user.validation.UserRequirement) => x$3.requirement(request)))
78 24890 2768 - 2790 Apply org.make.api.user.validation.UserRequirement.requirement org.make.api.user.validation.defaultuserregistrationvalidatortest x$3.requirement(request)