Skip to content

Commit 88c5fe5

Browse files
committed
Check IP
1 parent ac8b355 commit 88c5fe5

File tree

8 files changed

+26
-14
lines changed

8 files changed

+26
-14
lines changed

app/controllers/Controller.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ class Controller @Inject()(userAction: UserAction, userActionOption: UserActionO
107107
val address = request.body.hcursor.downField("address").as[String].getOrElse(throw new Throwable("address field must exist"))
108108
val assetId = request.body.hcursor.downField("assetId").as[String].getOrElse(throw new Throwable("assetId field must exist"))
109109
verifyRecaptcha(challenge)
110-
if (paymentTokenDao.exists(request.user.username, address, Conf.ergoAssets(assetId.toInt).name)) {
110+
if (paymentTokenDao.exists(request.user.username, address, request.ip, Conf.ergoAssets(assetId.toInt).name)) {
111111
BadRequest(
112112
s"""{
113113
| "message": "This address has already received ${Conf.ergoAssets(assetId.toInt).name} assets."
@@ -118,7 +118,7 @@ class Controller @Inject()(userAction: UserAction, userActionOption: UserActionO
118118
val proxy_info = selectRandomProxyInfo(Conf.proxyInfos)
119119
val txId = createReward.sendAsset(address, proxy_info.get, Conf.ergoAssets(assetId.toInt)).replaceAll("\"", "")
120120
if (txId.nonEmpty) {
121-
paymentTokenDao.insertConsiderOldPayment(TokenPayment(request.user.username, address, Conf.ergoAssets(assetId.toInt).assets("erg"), Conf.ergoAssets(assetId.toInt).name, txId))
121+
paymentTokenDao.insertConsiderOldPayment(TokenPayment(request.user.username, address, Conf.ergoAssets(assetId.toInt).assets("erg"), Conf.ergoAssets(assetId.toInt).name, request.ip, txId))
122122
Ok(
123123
s"""{
124124
| "txId": "${Conf.explorerFrontUrl}/en/transactions/${txId}"

app/controllers/actions/UserAction.scala

+5-5
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@ import java.time.{LocalDateTime, ZoneOffset}
44
import scala.concurrent.{ExecutionContext, Future}
55
import javax.inject._
66
import play.api.mvc._
7-
87
import models.User
9-
import utils.Util.{AuthException, NotVerifiedException}
10-
import utils.Util
8+
import utils.Util.{AuthException, NotValidIP, NotVerifiedException}
9+
import utils.{Conf, Util}
1110

12-
class UserRequest[A](val user: User, request: Request[A]) extends WrappedRequest[A](request)
11+
class UserRequest[A](val user: User, val ip: String, request: Request[A]) extends WrappedRequest[A](request)
1312

1413
class UserAction @Inject() (val parser: BodyParsers.Default)(implicit val executionContext: ExecutionContext)
1514
extends ActionBuilder[UserRequest, AnyContent]
@@ -25,6 +24,7 @@ class UserAction @Inject() (val parser: BodyParsers.Default)(implicit val execut
2524
.flatMap(DAOs._1.getUser)
2625
val validUser = user.getOrElse(throw AuthException())
2726
if (!validUser.verified) throw NotVerifiedException()
28-
new UserRequest(validUser, request)
27+
val ip = request.headers.get(Conf.ipField).getOrElse(throw NotValidIP())
28+
new UserRequest(validUser, ip, request)
2929
}
3030
}

app/dao/PaymentTokenDAO.scala

+6-4
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,10 @@ trait PaymentTokenComponent { self: HasDatabaseConfigProvider[JdbcProfile] =>
2626
def type_tokens = column[String]("TYPE_TOKENS")
2727
def tx_id = column[String]("TXID")
2828
def username = column[String]("USERNAME")
29+
def ip = column[String]("IP")
2930
def created_time = column[LocalDateTime]("CREATED_TIME", O.Default(LocalDateTime.now()))
3031
def done = column[Boolean]("DONE", O.Default(false))
31-
def * = (username, address, erg_amount, type_tokens, tx_id, created_time, done) <> (TokenPayment.tupled, TokenPayment.unapply)
32+
def * = (username, address, erg_amount, type_tokens, ip, tx_id, created_time, done) <> (TokenPayment.tupled, TokenPayment.unapply)
3233
def user_token = index("USER_TOKEN", (username, type_tokens), unique = true)
3334
}
3435

@@ -38,9 +39,10 @@ trait PaymentTokenComponent { self: HasDatabaseConfigProvider[JdbcProfile] =>
3839
def type_tokens = column[String]("TYPE_TOKENS")
3940
def tx_id = column[String]("TXID")
4041
def username = column[String]("USERNAME")
42+
def ip = column[String]("IP")
4143
def created_time = column[LocalDateTime]("CREATED_TIME")
4244
def done = column[Boolean]("DONE")
43-
def * = (username, address, erg_amount, type_tokens, tx_id, created_time, done) <> (TokenPayment.tupled, TokenPayment.unapply)
45+
def * = (username, address, erg_amount, type_tokens, ip, tx_id, created_time, done) <> (TokenPayment.tupled, TokenPayment.unapply)
4446
def user_token = index("USER_TOKEN_ARCHIVE", (username, type_tokens, created_time), unique = true)
4547
}
4648

@@ -92,9 +94,9 @@ class PaymentTokenDAO @Inject() (protected val dbConfigProvider: DatabaseConfigP
9294
* @param type_tokens Type batch of assets
9395
* @return boolean result
9496
*/
95-
def exists(username: String, address: String, type_tokens: String): Boolean = {
97+
def exists(username: String, address: String, ip: String, type_tokens: String): Boolean = {
9698
val res = db.run(tokenPayments.filter(payment => {
97-
(payment.address === address || payment.username === username) && (payment.type_tokens === type_tokens)
99+
(payment.address === address || payment.username === username || payment.ip === ip) && (payment.type_tokens === type_tokens)
98100
} ).exists.result)
99101
Await.result(res, Duration.Inf)
100102
}

app/models/Models.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import play.api.mvc.Session
88
import scala.collection.mutable
99

1010
case class Payment(address: String, amount: Long, txid: String)
11-
case class TokenPayment(username: String, address: String, amount: Long, typeTokens: String, txid: String, createdTime: LocalDateTime = LocalDateTime.now(), done: Boolean = false)
11+
case class TokenPayment(username: String, address: String, amount: Long, typeTokens: String, ip: String, txid: String, createdTime: LocalDateTime = LocalDateTime.now(), done: Boolean = false)
1212
case class User(discordId: String, username: String, email: String, verified: Boolean)
1313
object UserObj {
1414
def apply(discordId: String, username: String, discriminator: String, email: String, verified: Boolean): Option[User] ={

app/utils/Conf.scala

+2
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ object Conf {
7979
lazy val paymentMonitorThreadInterval: Long = readKey(config, "paymentMonitorThreadInterval", "86400").toLong
8080
lazy val thresholdDayIgnorePayments: Long = readKey(config, "thresholdDayIgnorePayments", "5").toLong
8181

82+
lazy val ipField: String = readKey(config, "ip-field", "cf-connecting-ip")
83+
8284
def readKey(config: Configuration, key: String, default: String = null): String = {
8385
try {
8486
if(config.has(key)) config.getOptional[String](key).get

app/utils/CreateReward.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class CreateReward @Inject()(networkIObject: NetworkIObject, explorer: Explorer)
2828
if (proxyData._3.nonEmpty) {
2929
var tokens: Seq[ErgoToken] = Seq.empty
3030
proxyData._3.foreach( token => {
31-
if (assetConfig.assets.get(token._1).isDefined) {
31+
if (assetConfig.assets.contains(token._1)) {
3232
if ((token._2 - assetConfig.assets(token._1)) > 0)
3333
tokens = tokens :+ new ErgoToken(token._1, token._2 - assetConfig.assets(token._1))
3434
}
@@ -66,7 +66,7 @@ class CreateReward @Inject()(networkIObject: NetworkIObject, explorer: Explorer)
6666
boxes :+= walletInput
6767
val ergCondition = totalInputValue >= (assetConfig.assets("erg") + Conf.defaultTxFee + Conf.minErg)
6868
val assetsCondition= assetConfig.assets.filterNot(_._1.equals("erg")).map(asset => {
69-
if (totalInputAssets.get(asset._1).isDefined) totalInputAssets(asset._1) >= asset._2
69+
if (totalInputAssets.contains(asset._1)) totalInputAssets(asset._1) >= asset._2
7070
else false
7171
}).reduceOption(_&&_)
7272
if (ergCondition && assetsCondition.getOrElse(true)) return (boxes, totalInputValue, totalInputAssets, true)

app/utils/Util.scala

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ object Util {
3434
final case class AuthException(private val message: String = "Authenticate Failed") extends Throwable(message)
3535
final case class NotVerifiedException(private val message: String = "Your discord account don't verified") extends Throwable(message)
3636
final case class DuplicateRequestException(private val message: String = s"This user has already received assets") extends Throwable(message)
37+
final case class NotValidIP(private val message: String = "Your IP is not valid") extends Throwable(message)
3738

3839
def validateAddress(address: String): Boolean = {
3940
try{

conf/evolutions/default/3.sql

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
-- !Ups
2+
ALTER TABLE TOKEN_PAYMENT ADD IP VARCHAR(100) DEFAULT null;
3+
ALTER TABLE TOKEN_PAYMENT_ARCHIVE ADD IP VARCHAR(100) DEFAULT null;
4+
5+
-- !Downs
6+
ALTER TABLE TOKEN_PAYMENT DROP IP;
7+
ALTER TABLE TOKEN_PAYMENT_ARCHIVE DROP IP;

0 commit comments

Comments
 (0)