Skip to content

Commit

Permalink
A lot of improvements :)
Browse files Browse the repository at this point in the history
  • Loading branch information
Frostman committed Apr 22, 2012
1 parent d44de7a commit 93cea1c
Show file tree
Hide file tree
Showing 3 changed files with 277 additions and 59 deletions.
75 changes: 60 additions & 15 deletions src/auth/Auth.kt
Original file line number Diff line number Diff line change
@@ -1,22 +1,30 @@
package auth

import java.util.LinkedHashMap
import org.apache.commons.io.FileUtils
import crypt.decryptFile
import crypt.encryptFile
import java.io.File
import java.util.ArrayList
import java.util.LinkedHashMap
import java.util.LinkedList
import java.util.List
import java.util.Map
import org.apache.commons.codec.binary.Base64
import org.apache.commons.codec.binary.StringUtils
import crypt.encryptFile
import crypt.decryptFile
import java.util.Map
import java.util.List
import java.util.LinkedList
import sun.tools.jconsole.Plotter.Unit
import org.apache.commons.io.FileUtils
import ui.et.Column
import ui.et.PasswordValue
import ui.et.StringValue
import ui.et.Value

class AuthDb(val dbPath : String) {
// login -> user
public val users : Map<String, User> = LinkedHashMap<String, User>()

fun load() {
fun load(val encrypted : Boolean = false) {
if(encrypted) {
decryptFile(ui.key, File(dbPath))
}

users.clear()
for (line in FileUtils.readLines(File(dbPath))) {
val split = line.sure().split(" ").sure()
Expand All @@ -27,9 +35,18 @@ class AuthDb(val dbPath : String) {

users.put(login, User(login, password, role, lastModified))
}

if (encrypted){
encryptFile(ui.key, File(dbPath))
}
}

fun save() = FileUtils.writeLines(File(dbPath), users.b64Values())
fun save(val encrypt : Boolean = false) {
FileUtils.writeLines(File(dbPath), users.b64Values())
if (encrypt) {
encryptFile(ui.key, File(dbPath))
}
}
}

enum class Role {
Expand All @@ -45,6 +62,30 @@ class User(val login : String, val password : String, val role : Role, val lastM
fun toString() = "${login} ${password} ${if (role == Role.ADMIN) 0 else 1} $lastModified"

fun asB64String() = "${login.toB64()} ${password.toB64()} ${if (role == Role.ADMIN) 0 else 1} $lastModified"

fun asColumns() : List<Value> {
val columns = ArrayList<Value>()

columns.add(StringValue(login))
columns.add(StringValue(password))
columns.add(StringValue(if (role == Role.ADMIN) "admin" else "user"))
columns.add(StringValue(lastModified.toString()))

return columns
}

class object {
public val columns : List<Column> = arrayList(Column("login"), object : Column("password", true){
public override fun onChanged() : #(Int, Any?)? = #(3, StringValue(System.currentTimeMillis().toString()))
}, Column("role"), Column("lastModified"));

public fun fromColumns(val it : List<Value>) : User = User(
(it[0] as StringValue).str,
(it[1] as StringValue).str,
if(it[2] is StringValue && (it[2] as StringValue).str.equals("admin")) Role.ADMIN else Role.USER,
(it[3] as StringValue).str.toLong()
)
}
}

fun Map<String, User>.b64Values() : List<String> {
Expand All @@ -62,11 +103,9 @@ fun String.toB64() = Base64.encodeBase64URLSafeString(this.getBytes()).sure()
fun String.fromB64() = StringUtils.newStringUtf8(Base64.decodeBase64(this.getBytes())).sure()

fun checkCredentials(val login : String, val password : String, val key : String = "test key", val dbPath : String = "database") : Boolean {
decryptFile(key, File(dbPath))
val db = AuthDb(dbPath)
db.load()
db.load(true)
val result = db.users.get(login)?.password.equals(password)
encryptFile(key, File(dbPath))

if (db.users.size == 0) {
return true
Expand All @@ -75,9 +114,15 @@ fun checkCredentials(val login : String, val password : String, val key : String
return result
}

fun getUser(val login : String, val dbPath : String = "database") : User? {
val db = AuthDb(dbPath)
db.load(true)

return db.users.get(login)
}

fun main(args : Array<String>) {
val db = AuthDb("database")
db.users.put("admin", User("admin", "admin", Role.ADMIN, 0))
db.save()
encryptFile("test key", File("database"))
db.save(true)
}
68 changes: 43 additions & 25 deletions src/ui/EditableTable.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,16 @@ import java.util.List
import javax.swing.JFrame
import javax.swing.JScrollPane
import javax.swing.JTable
import javax.swing.table.AbstractTableModel
import javax.swing.table.TableCellEditor
import javax.swing.ListSelectionModel
import javax.swing.WindowConstants
import javax.swing.table.AbstractTableModel

class EditableTable(val columns : List<Column>) {
val table = JTable();
public val table : JTable = JTable();

{
table.setAutoCreateRowSorter(true)
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION)
}

fun getScrollPane(x : Int, y : Int, width : Int, height : Int) : JScrollPane {
Expand All @@ -28,40 +29,57 @@ class EditableTable(val columns : List<Column>) {
return scroll
}

var data : List<List<Value>> = ArrayList<List<Value>>()
set(newData) {
$data = newData
table.setModel(object : AbstractTableModel() {
public override fun getRowCount() = data.size()
public override fun getColumnCount() = columns.size()
public override fun getValueAt(row : Int, column : Int) = data[row][column]
public override fun isCellEditable(row : Int, column : Int) = columns[column].editable
public override fun getColumnName(column : Int) = columns[column].name

public override fun setValueAt(newValue : Any?, row : Int, column : Int) {
data[row][column] = if (newValue is String) StringValue(newValue) else newValue as Value
fireTableCellUpdated(row, column)
}
})
var idx = 0
for (column in columns) {
table.getColumnModel()!!.getColumn(idx++)!!.setCellEditor(column.editor)
public var data : List<List<Value>> = ArrayList<List<Value>>()
set(newData) {
$data = newData
table.setModel(object : AbstractTableModel() {
public override fun getRowCount() = data.size()
public override fun getColumnCount() = columns.size()
public override fun getValueAt(row : Int, column : Int) = data[row][column]
public override fun isCellEditable(row : Int, column : Int) = columns[column].editable
public override fun getColumnName(column : Int) = columns[column].name

public override fun setValueAt(newValue : Any?, row : Int, column : Int) {
if(data[row][column] is StringValue && !(data[row][column] as StringValue).str.equals( newValue)) {
val changed = columns[column].onChanged()
if(changed != null) {
setValueAt(changed._2, row, changed._1)
}
}
data[row][column] = if (newValue is String) StringValue(newValue) else newValue as Value
fireTableCellUpdated(row, column)
}
})
// var idx = 0
// for (column in columns) {
// table.getColumnModel()!!.getColumn(idx++)!!.setCellEditor(column.editor)
// }
}
}

fun <T> getObjects(transform : List<Value>.() -> T) = data.map{it.transform()}

fun removeSelected() {
val selected = table.convertRowIndexToModel(table.getSelectedRow())
data.remove(selected)
data = data
}
}

class Column(val name : String, val editable : Boolean = true, val editor : TableCellEditor? = null)
val doNothing = {null}

open class Column(val name : String, val editable : Boolean = true) {
public open fun onChanged() : #(Int, Any?)? = null
}

trait Value

trait ValueEditor

class StringValue(val str : String) : Value {
class StringValue(public val str : String) : Value {
fun toString() : String = str
}

class PasswordValue(val password : String) : Value {
class PasswordValue(public val password : String) : Value {
fun toString() : String = password
}

Expand Down
Loading

0 comments on commit 93cea1c

Please sign in to comment.