Guest User

Untitled

a guest
Dec 3rd, 2017
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.80 KB | None | 0 0
  1. package com.erezbiox1
  2.  
  3. import java.nio.charset.StandardCharsets
  4. import java.security.MessageDigest
  5. import java.sql.DriverManager
  6. import java.sql.ResultSet
  7. import java.util.*
  8. import kotlin.reflect.KProperty
  9.  
  10. @Suppress("NullableBooleanElvis", "unused", "MemberVisibilityCanPrivate")
  11.  
  12. /**
  13. * Created by Erezbiox1 on 30/11/2017.
  14. * (C) 2017 Erez Rotem All Rights Reserved.
  15. */
  16.  
  17. abstract class AbstractUser(val id: Int) {
  18.  
  19. var username: String by SQL()
  20. var email: String by SQL()
  21. var password: String
  22. get() = error("Cannot access hashed password")
  23. set(pass) = sql("UPDATE users SET password = ?", hash(password))
  24.  
  25. companion object {
  26. fun sql(query: String, vararg objects: Any, function: ((ResultSet?) -> Unit)? = null) {
  27. Class.forName("com.mysql.jdbc.Driver")
  28.  
  29. val db = DriverManager.getConnection("jdbc:mysql://localhost:3306/main", "erez", "Pizza123")
  30. val statement = db.prepareStatement(query)
  31. objects.withIndex().forEach {
  32. when(it.value){
  33. is Int -> statement.setInt(it.index + 1, it.value as Int)
  34. is Boolean -> statement.setBoolean(it.index + 1, it.value as Boolean)
  35. else -> statement.setString(it.index + 1, it.value.toString())
  36. }
  37. }
  38. val result =
  39. if(statement.execute() && statement.resultSet.next())
  40. statement.resultSet
  41. else null
  42.  
  43. function?.invoke(result)
  44.  
  45. result?.close()
  46. statement.close()
  47. db.close()
  48. }
  49.  
  50. inline fun <reified T> ResultSet?.get(column: Int = 1) : T? {
  51. if(this == null)
  52. return null
  53.  
  54. return when(T::class){
  55. java.lang.Integer::class -> this.getInt(column) as T
  56. java.lang.Integer::class.java -> this.getInt(column) as T
  57. java.lang.Boolean::class -> this.getBoolean(column) as T
  58. java.lang.Boolean::class.java -> this.getBoolean(column) as T
  59. else -> this.getString(column) as T
  60. }
  61. }
  62.  
  63. private fun createHash(password: String) : String {
  64. val random = UUID.randomUUID().toString()
  65. return random + ":" + hash(random + password)
  66. }
  67.  
  68. private fun matchHash(password: String, hash: String) : Boolean {
  69. val split = hash.split(":")
  70. val salt = split[0]
  71. val hashed = split[1]
  72. return hash(salt + password) == hashed
  73. }
  74.  
  75. private fun hash(password: String): String {
  76. return Base64.getEncoder().encodeToString(MessageDigest.getInstance("SHA-256").digest(password.toByteArray(StandardCharsets.UTF_8)))
  77. }
  78.  
  79. @JvmStatic
  80. protected fun registerUser(username: String, email: String, password: String) : Int {
  81. var userId = -1
  82. sql("SELECT id, password FROM users WHERE username = ?", username.toLowerCase()){
  83. val pass = it?.get<String>(2)
  84. if(pass != null){
  85. userId =
  86. if(hash(password.toLowerCase()) == pass)
  87. it.get(1)!!
  88. else -2
  89. }
  90.  
  91. }
  92.  
  93. if(userId == -1){
  94. sql("INSERT INTO users (username, email, password) VALUES (?, ?, ?)",
  95. username.toLowerCase(),
  96. email.toLowerCase(),
  97. createHash(password.toLowerCase()))
  98.  
  99. sql("SELECT id FROM users WHERE username = ?", username.toLowerCase()){
  100. userId = it?.get() ?: -1 // Cannot really be -1, but what the heck.
  101. }
  102. }
  103.  
  104. return userId
  105. }
  106.  
  107. @JvmStatic
  108. protected fun loginUser(username: String, password: String) : Int {
  109. var userId = -1
  110. sql("SELECT id, password FROM users WHERE username = ?", username.toLowerCase()){
  111. val pass = it?.get<String>(2)
  112. if(pass != null)
  113. userId = if(matchHash(password.toLowerCase(), pass))
  114. it.get(1) ?: -1
  115. else -2
  116. }
  117. return userId
  118. }
  119. }
  120.  
  121. inner class SQL(val name: String? = null) {
  122. inline operator fun <reified T> getValue(ref: Any?, property: KProperty<*>) : T {
  123. var value: T? = null
  124. sql("SELECT ${name ?: property.name} FROM users where id = ?", id){
  125. value = it.get()
  126. }
  127. return value ?: error("Database Connection Error. value is null.")
  128. }
  129.  
  130. operator fun <T> setValue(ref: Any?, property: KProperty<*>, value: T) {
  131. sql("UPDATE users SET ${name ?: property.name} = ? WHERE id = ?", value!!, id)
  132. }
  133. }
  134. }
Add Comment
Please, Sign In to add comment