mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-08 22:45:51 +01:00
53 lines
1.7 KiB
Scala
53 lines
1.7 KiB
Scala
package service
|
|
|
|
import model.Profile._
|
|
import profile.simple._
|
|
import model.{Account, AccessToken}
|
|
import util.StringUtil
|
|
import scala.util.Random
|
|
|
|
trait AccessTokenService {
|
|
|
|
def makeAccessTokenString: String = {
|
|
val bytes = new Array[Byte](20)
|
|
Random.nextBytes(bytes)
|
|
bytes.map("%02x".format(_)).mkString
|
|
}
|
|
|
|
def tokenToHash(token: String): String = StringUtil.sha1(token)
|
|
|
|
/**
|
|
* @retuen (TokenId, Token)
|
|
*/
|
|
def generateAccessToken(userName: String, note: String)(implicit s: Session): (Int, String) = {
|
|
var token: String = null
|
|
var hash: String = null
|
|
do{
|
|
token = makeAccessTokenString
|
|
hash = tokenToHash(token)
|
|
}while(AccessTokens.filter(_.tokenHash === hash.bind).exists.run)
|
|
val newToken = AccessToken(
|
|
userName = userName,
|
|
note = note,
|
|
tokenHash = hash)
|
|
val tokenId = (AccessTokens returning AccessTokens.map(_.accessTokenId)) += newToken
|
|
(tokenId, token)
|
|
}
|
|
|
|
def getAccountByAccessToken(token: String)(implicit s: Session): Option[Account] =
|
|
Accounts
|
|
.innerJoin(AccessTokens)
|
|
.filter{ case (ac, t) => (ac.userName === t.userName) && (t.tokenHash === tokenToHash(token).bind) && (ac.removed === false.bind) }
|
|
.map{ case (ac, t) => ac }
|
|
.firstOption
|
|
|
|
def getAccessTokens(userName: String)(implicit s: Session): List[AccessToken] =
|
|
AccessTokens.filter(_.userName === userName.bind).sortBy(_.accessTokenId.desc).list
|
|
|
|
def deleteAccessToken(userName: String, accessTokenId: Int)(implicit s: Session): Unit =
|
|
AccessTokens filter (t => t.userName === userName.bind && t.accessTokenId === accessTokenId) delete
|
|
|
|
}
|
|
|
|
object AccessTokenService extends AccessTokenService
|