Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
402 changes: 245 additions & 157 deletions app/Global.scala

Large diffs are not rendered by default.

8 changes: 3 additions & 5 deletions app/controllers/Application.scala
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ class Application @Inject() (jsMessagesFactory: JsMessagesFactory, val messagesA
var local_fee = 0.1
var global_fee = 0.1
val decimal_separator = globals.settings(securesocial.core.SecureSocial.currentUser.get.user_country, "country_decimal_separator", 2).asInstanceOf[String]
val country_id = securesocial.core.SecureSocial.currentUser.get.user_country.getOrElse("br")
val country_id = securesocial.core.SecureSocial.currentUser.get.user_country
request.body.files map {
file =>
val fileName = file.filename
Expand All @@ -145,7 +145,7 @@ class Application @Inject() (jsMessagesFactory: JsMessagesFactory, val messagesA
}
local_fee = globals.calculate_local_fee(order_type, initial_value).toDouble
global_fee = globals.calculate_global_fee(order_type, initial_value).toDouble
val success = globals.userModel.create_order_with_picture(request.user.id, country_id, order_type, "Op", partner, globals.settings(Option(securesocial.core.SecureSocial.currentUser.get.user_country.getOrElse("br")), "country_currency_code", 2).asInstanceOf[String], initial_value, local_fee, global_fee, "", "", partner_account, fileName, image_id)
val success = globals.userModel.create_order_with_picture(request.user.id, country_id, order_type, "Op", partner, globals.settings(securesocial.core.SecureSocial.currentUser.get.user_country, "country_currency_code", 2).asInstanceOf[String], initial_value, local_fee, global_fee, "", "", partner_account, fileName, image_id)
}
}
Ok(views.html.exchange.dashboard(request.user))
Expand All @@ -169,8 +169,6 @@ class Application @Inject() (jsMessagesFactory: JsMessagesFactory, val messagesA
val position3 = file.key.substring(position2 + 1, file.key.length).indexOf("|") + position2 + 1
val position4 = file.key.substring(position3 + 1, file.key.length).indexOf("|") + position3 + 1
val decimal_separator = globals.settings(securesocial.core.SecureSocial.currentUser.get.user_country, "country_decimal_separator", 2).asInstanceOf[String]
//val country_id = securesocial.core.SecureSocial.currentUser.get.user_country.getOrElse("br")
// = try { Some(s.toDouble) } catch { case _ => None }
processed_value = try {
((file.key.substring(0, position)).replace(decimal_separator, ".")).toDouble
} catch {
Expand Down Expand Up @@ -205,7 +203,7 @@ class Application @Inject() (jsMessagesFactory: JsMessagesFactory, val messagesA
val docNumber = file.key
val user_id = request.user.id
val image_id = controllers.Image.saveImage(file.ref.file.getAbsolutePath, fileName, user_id)
var success = globals.userModel.create_order_with_picture(user_id, securesocial.core.SecureSocial.currentUser.get.user_country.getOrElse("br"), "V", "Op", docNumber, globals.settings(Option(securesocial.core.SecureSocial.currentUser.get.user_country.getOrElse("br")), "country_currency_code", 2).asInstanceOf[String], 0, 0, 0, "", "", "", fileName, image_id)
var success = globals.userModel.create_order_with_picture(user_id, securesocial.core.SecureSocial.currentUser.get.user_country, "V", "Op", docNumber, globals.settings(securesocial.core.SecureSocial.currentUser.get.user_country, "country_currency_code", 2).asInstanceOf[String], 0, 0, 0, "", "", "", fileName, image_id)
success = globals.userModel.update_user_doc(user_id, docNumber, image_id, fileName)
}
Ok(views.html.exchange.dashboard(request.user))
Expand Down
37 changes: 25 additions & 12 deletions app/controllers/IAPI/APIv1.scala
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ class APIv1 @Inject() (val messagesApi: MessagesApi) extends Controller with sec
}

def orders_list = SecuredAction(ajaxCall = true)(parse.json) { implicit request =>
val country = securesocial.core.SecureSocial.currentUser.get.user_country.getOrElse("br")
val country = securesocial.core.SecureSocial.currentUser.get.user_country
val search_criteria = (request.request.body \ "search_criteria").asOpt[String]
val search_value = (request.request.body \ "search_value").asOpt[String]
val orders_list_info = globals.engineModel.OrderList(Some(request.user.id), country, search_criteria, search_value)
Expand Down Expand Up @@ -120,7 +120,7 @@ class APIv1 @Inject() (val messagesApi: MessagesApi) extends Controller with sec
}

def users_list = SecuredAction(ajaxCall = true)(parse.anyContent) { implicit request =>
val country = securesocial.core.SecureSocial.currentUser.get.user_country.getOrElse("br")
val country = securesocial.core.SecureSocial.currentUser.get.user_country
val users_list_info = globals.engineModel.UsersList(country)
Ok(Json.toJson(users_list_info.map({ c =>
Json.obj(
Expand Down Expand Up @@ -197,6 +197,7 @@ class APIv1 @Inject() (val messagesApi: MessagesApi) extends Controller with sec
Json.obj(
"id" -> c.id,
"email" -> c.email.getOrElse("").toString,
"user_country" -> c.user_country.getOrElse("").toString,
"ip" -> c.ip.getOrElse("").toString,
"created" -> c.created.getOrElse(new DateTime(0).toString).toString,
"type" -> c.typ.toString
Expand All @@ -220,7 +221,7 @@ class APIv1 @Inject() (val messagesApi: MessagesApi) extends Controller with sec
}

def get_admins = SecuredAction(ajaxCall = true)(parse.anyContent) { implicit request =>
val admins = globals.engineModel.GetAdmins(securesocial.core.SecureSocial.currentUser.get.user_country.getOrElse("br"))
val admins = globals.engineModel.GetAdmins(securesocial.core.SecureSocial.currentUser.get.user_country)
Ok(Json.toJson(admins.map({ c =>
Json.obj(
"admin_g1" -> c._1,
Expand All @@ -234,7 +235,13 @@ class APIv1 @Inject() (val messagesApi: MessagesApi) extends Controller with sec
"email_l1" -> c._9,
"email_l2" -> c._10,
"email_o1" -> c._11,
"email_o2" -> c._12
"email_o2" -> c._12,
"user_country_g1" -> c._13,
"user_country_g2" -> c._14,
"user_country_l1" -> c._15,
"user_country_l2" -> c._16,
"user_country_o1" -> c._17,
"user_country_o2" -> c._18
)
})
))
Expand Down Expand Up @@ -342,7 +349,7 @@ class APIv1 @Inject() (val messagesApi: MessagesApi) extends Controller with sec
val agency = (request.request.body \ "agency").asOpt[String]
val account = (request.request.body \ "account").asOpt[String]
val doc1 = (request.request.body \ "doc1").asOpt[String]
if (globals.userModel.create_order(request.user.id, securesocial.core.SecureSocial.currentUser.get.user_country.getOrElse("br"), order_type, status, partner, globals.settings(securesocial.core.SecureSocial.currentUser.get.user_country, "country_currency_code", 2).asInstanceOf[String], initial_value, Option(local_fee), Option(global_fee), bank, agency, account, doc1)) {
if (globals.userModel.create_order(request.user.id, securesocial.core.SecureSocial.currentUser.get.user_country, order_type, status, partner, globals.settings(securesocial.core.SecureSocial.currentUser.get.user_country, "country_currency_code", 2).asInstanceOf[String], initial_value, Option(local_fee), Option(global_fee), bank, agency, account, doc1)) {
Ok(Json.obj())
} else {
BadRequest(Json.obj("message" -> Messages("messages.api.error.failedtocreateorder")))
Expand Down Expand Up @@ -409,13 +416,19 @@ class APIv1 @Inject() (val messagesApi: MessagesApi) extends Controller with sec

def save_admins = SecuredAction(ajaxCall = true)(parse.json) { implicit request =>
val country = (request.request.body \ "country").asOpt[String]
val admin_g1 = (request.request.body \ "admin_g1").asOpt[String]
val admin_g2 = (request.request.body \ "admin_g2").asOpt[String]
val admin_l1 = (request.request.body \ "admin_l1").asOpt[String]
val admin_l2 = (request.request.body \ "admin_l2").asOpt[String]
val admin_o1 = (request.request.body \ "admin_o1").asOpt[String]
val admin_o2 = (request.request.body \ "admin_o2").asOpt[String]
if (globals.userModel.save_admins(country, admin_g1, admin_g2, admin_l1, admin_l2, admin_o1, admin_o2)) {
val email_g1 = (request.request.body \ "email_g1").asOpt[String]
val email_g2 = (request.request.body \ "email_g2").asOpt[String]
val email_l1 = (request.request.body \ "email_l1").asOpt[String]
val email_l2 = (request.request.body \ "email_l2").asOpt[String]
val email_o1 = (request.request.body \ "email_o1").asOpt[String]
val email_o2 = (request.request.body \ "email_o2").asOpt[String]
val user_country_g1 = (request.request.body \ "user_country_g1").asOpt[String]
val user_country_g2 = (request.request.body \ "user_country_g2").asOpt[String]
val user_country_l1 = (request.request.body \ "user_country_l1").asOpt[String]
val user_country_l2 = (request.request.body \ "user_country_l2").asOpt[String]
val user_country_o1 = (request.request.body \ "user_country_o1").asOpt[String]
val user_country_o2 = (request.request.body \ "user_country_o2").asOpt[String]
if (globals.userModel.save_admins(country, email_g1, email_g2, email_l1, email_l2, email_o1, email_o2, user_country_g1, user_country_g2, user_country_l1, user_country_l2, user_country_o1, user_country_o2)) {
Ok(Json.obj())
} else {
BadRequest(Json.obj("message" -> Messages("messages.api.error.failedtosaveadministrators")))
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/LoginPage.scala
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ class LoginPage @Inject() (val messagesApi: MessagesApi) extends Controller with
user <- txbitsUserService.find(authenticator.uid.get)
) yield {
Authenticator.delete(authenticator.id)
globals.logModel.logEvent(LogEvent.fromRequest(Some(user.id), Some(user.email), request, LogType.Logout))
globals.logModel.logEvent(LogEvent.fromRequest(Some(user.id), Some(user.email), Some(user.user_country), request, LogType.Logout))
user
}
val result = Redirect(to).discardingCookies(Authenticator.discardingCookie)
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/PasswordChange.scala
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ class PasswordChange @Inject() (val messagesApi: MessagesApi) extends Controller
import scala.language.reflectiveCalls
// This never actually fails because we already checked that the password is valid in the validators
if (globals.userModel.userChangePass(request.user.id, info.currentPassword, info.password)) {
Mailer.sendPasswordChangedNotice(request.user.email, globals.userModel.userPgpByEmail(request.user.email))
Mailer.sendPasswordChangedNotice(request.user.email, globals.userModel.userPgpByEmail(request.user.email, request.user.user_country))
Redirect(onHandlePasswordChangeGoTo).flashing(Success -> Messages(OkMessage))
} else {
BadRequest(views.html.auth.passwordChange(form.withError("currentPassword", Messages(InvalidPasswordMessage))))
Expand Down
15 changes: 8 additions & 7 deletions app/controllers/ProviderController.scala
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,8 @@ class ProviderController @Inject() (val messagesApi: MessagesApi) extends Contro
tfaToken => {
val authenticator = SecureSocial.authenticatorFromRequest(request)
if (authenticator.isDefined) {
if (globals.userModel.userHasTotp(authenticator.get.email)) {
val user = globals.userModel.totpLoginStep2(authenticator.get.email, authenticator.get.totpSecret.get, tfaToken, models.LogModel.headersFromRequest(request), models.LogModel.ipFromRequest(request))
if (globals.userModel.userHasTotp(authenticator.get.email, authenticator.get.user_country)) {
val user = globals.userModel.totpLoginStep2(authenticator.get.email, authenticator.get.user_country, authenticator.get.totpSecret.get, tfaToken, models.LogModel.headersFromRequest(request), models.LogModel.ipFromRequest(request))
if (user.isDefined) {
Authenticator.save(authenticator.get.complete2fa(user.get.id))
Redirect(toUrl(request2session)).withSession(request2session - SecureSocial.OriginalUrlKey)
Expand Down Expand Up @@ -90,22 +90,23 @@ class ProviderController @Inject() (val messagesApi: MessagesApi) extends Contro
errors => badRequest(errors, request),
credentials => {
val email = credentials._1.trim
val user_country = credentials._3.trim
var user: Option[SocialUser] = None
var totp_hash: Option[String] = None
// check for 2FA
if (globals.userModel.userHasTotp(email)) {
totp_hash = globals.userModel.totpLoginStep1(email, credentials._2, credentials._3, models.LogModel.headersFromRequest(request), models.LogModel.ipFromRequest(request))
if (globals.userModel.userHasTotp(email, user_country)) {
totp_hash = globals.userModel.totpLoginStep1(email, user_country, credentials._2, models.LogModel.headersFromRequest(request), models.LogModel.ipFromRequest(request))
} else {
user = globals.userModel.findUserByEmailAndPassword(email, credentials._2, credentials._3, models.LogModel.headersFromRequest(request), models.LogModel.ipFromRequest(request))
user = globals.userModel.findUserByEmailAndPassword(email, user_country, credentials._2, models.LogModel.headersFromRequest(request), models.LogModel.ipFromRequest(request))
}
if (totp_hash.isDefined) {
// create session
val authenticator = Authenticator.create(None, totp_hash, email)
val authenticator = Authenticator.create(None, totp_hash, email, user_country)
Redirect(controllers.routes.LoginPage.tfaTOTP()).withSession(request2session).withCookies(authenticator.toCookie)
} else if (user.isDefined) {
// create session

val authenticator = Authenticator.create(Some(user.get.id), None, email)
val authenticator = Authenticator.create(Some(user.get.id), None, email, user_country)
Redirect(toUrl(request2session)).
withSession(request2session - SecureSocial.OriginalUrlKey).
withCookies(authenticator.toCookie).
Expand Down
41 changes: 23 additions & 18 deletions app/controllers/Registration.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,24 +18,29 @@ package controllers

import _root_.java.util.UUID
import javax.inject.Inject
import play.api.mvc.{ Result, Action, Controller }
import play.api.data._

import play.api.mvc.{ Action, Controller, Result }
import play.api.data.{ Mapping, _ }
import play.api.data.Forms._
import play.api.data.validation.Constraints._
import play.api.{ Play, Logger }
import play.api.i18n.{ Lang, MessagesApi, I18nSupport, Messages }
import play.api.{ Logger, Play }
import play.api.i18n.{ I18nSupport, Lang, Messages, MessagesApi }
import securesocial.core._
import Play.current
import securesocial.core.providers.utils._
import org.joda.time.DateTime

import scala.language.reflectiveCalls
import securesocial.core.Token

import scala.Some
import securesocial.core.SocialUser
import service.{ PGP, txbitsUserService }
import models.{ LogType, LogEvent }
import models.{ LogEvent, LogType }
import java.security.SecureRandom

import play.api.data.validation.Constraints

/**
* A controller to handle user registration.
*
Expand Down Expand Up @@ -69,7 +74,7 @@ class Registration @Inject() (val messagesApi: MessagesApi) extends Controller w
mapping(
Email -> email.verifying(nonEmpty)
) // binding
((email) => StartRegistrationInfo(email)) // unbinding
((email, user_country) => StartRegistrationInfo(email, user_country)) // unbinding
(info => Some(info.email))
)

Expand Down Expand Up @@ -140,9 +145,9 @@ class Registration @Inject() (val messagesApi: MessagesApi) extends Controller w
}

// XXX: copied from ProviderController TODO: fix duplication
def completePasswordAuth[A](id: Long, email: String)(implicit request: play.api.mvc.Request[A]) = {
def completePasswordAuth[A](id: Long, email: String, user_country: String)(implicit request: play.api.mvc.Request[A]) = {
import controllers.ProviderController._
val authenticator = Authenticator.create(Some(id), None, email)
val authenticator = Authenticator.create(Some(id), None, email, user_country)
Redirect(toUrl(request2session)).withSession(request2session - SecureSocial.OriginalUrlKey).withCookies(authenticator.toCookie)
}

Expand All @@ -163,22 +168,22 @@ class Registration @Inject() (val messagesApi: MessagesApi) extends Controller w
val user = txbitsUserService.create(SocialUser(
-1, // this is a placeholder
t.email,
t.user_country,
0, //not verified
t.language,
info.mailingList,
false,
None,
false,
securesocial.core.SecureSocial.currentUser.get.user_country,
false
), info.password, token, info.pgp)
), t.user_country, info.password, token, info.pgp)
txbitsUserService.deleteToken(t.uuid)
if (UsernamePasswordProvider.sendWelcomeEmail) {
Mailer.sendWelcomeEmail(user)
}
globals.logModel.logEvent(LogEvent.fromRequest(Some(user.id), Some(user.email), request, LogType.SignupSuccess))
globals.logModel.logEvent(LogEvent.fromRequest(Some(user.id), Some(user.email), Some(user.user_country), request, LogType.SignupSuccess))
if (UsernamePasswordProvider.signupSkipLogin) {
completePasswordAuth(user.id, user.email)
completePasswordAuth(user.id, user.email, user.user_country)
} else {
Redirect(onHandleSignUpGoTo).flashing(Success -> Messages(SignUpDone)).withSession(request2session)
}
Expand All @@ -200,7 +205,7 @@ class Registration @Inject() (val messagesApi: MessagesApi) extends Controller w
email => {
txbitsUserService.userExists(email) match {
case true => {
globals.userModel.trustedActionStart(email, isSignup = false, "")
globals.userModel.trustedActionStart(email, user_country, isSignup = false, "")
}
case false => {
// The user wasn't registered. Oh, well.
Expand All @@ -223,16 +228,16 @@ class Registration @Inject() (val messagesApi: MessagesApi) extends Controller w
BadRequest(views.html.auth.Registration.resetPasswordPage(errors, token))
},
p => {
val toFlash = txbitsUserService.userExists(t.email) match {
val toFlash = txbitsUserService.userExists(t.email, t.user_country) match {
case true => {
// this should never actually fail because we checked the token already
txbitsUserService.resetPass(t.email, token, p._1)
txbitsUserService.resetPass(t.email, t.user_country, token, p._1)
txbitsUserService.deleteToken(token)
Mailer.sendPasswordChangedNotice(t.email, globals.userModel.userPgpByEmail(t.email))
Mailer.sendPasswordChangedNotice(t.email, globals.userModel.userPgpByEmail(t.email, t.user_country))
Success -> Messages(PasswordUpdated)
}
case false => {
Logger.error("[securesocial] could not find user with email %s during password reset".format(t.email))
Logger.error("[securesocial] could not find user with email %s, country %s during password reset".format(t.email, t.user_country))
Error -> Messages(ErrorUpdatingPassword)
}
}
Expand Down Expand Up @@ -279,5 +284,5 @@ object Registration {
}

case class RegistrationInfo(mailingList: Boolean, password: String, pgp: String)
case class StartRegistrationInfo(email: String)
case class StartRegistrationInfo(email: String, user_country: String)
}
8 changes: 7 additions & 1 deletion app/models/EngineModel.scala
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,13 @@ class EngineModel(val db: String = "default") {
row[Option[String]]("email_l1").getOrElse(""),
row[Option[String]]("email_l2").getOrElse(""),
row[Option[String]]("email_o1").getOrElse(""),
row[Option[String]]("email_o2").getOrElse("")
row[Option[String]]("email_o2").getOrElse(""),
row[Option[String]]("user_country_g1").getOrElse(""),
row[Option[String]]("user_country_g2").getOrElse(""),
row[Option[String]]("user_country_l1").getOrElse(""),
row[Option[String]]("user_country_l2").getOrElse(""),
row[Option[String]]("user_country_o1").getOrElse(""),
row[Option[String]]("user_country_o2").getOrElse("")
)).toList
}

Expand Down
Loading