This commit is contained in:
ntr 2018-09-15 15:00:42 +10:00
parent a68c2c31ab
commit 04a9765d3d
3 changed files with 55 additions and 4 deletions

View File

@ -40,7 +40,7 @@ function send(msg) {
// Connection opened // Connection opened
ws.addEventListener('open', function (event) { ws.addEventListener('open', function (event) {
send({ method: 'user_create', params: { name: 'somebodyelse', password: 'grepgrepgrep' }}); send({ method: 'user_login', params: { name: 'somebodyelse', password: 'grepgrepgrep' }});
}); });
// Listen for messages // Listen for messages

View File

@ -5,7 +5,7 @@ use failure::err_msg;
use net::Db; use net::Db;
use cryp::{Cryp, spawn}; use cryp::{Cryp, spawn};
use user::{User, create}; use user::{User, create, login};
pub struct Rpc; pub struct Rpc;
@ -41,6 +41,15 @@ impl Rpc {
Err(_e) => Err(err_msg("invalid params")), Err(_e) => Err(err_msg("invalid params")),
} }
}, },
"user_login" => {
match from_slice::<UserLoginMsg>(&data) {
Ok(v) => Ok(RpcResponse {
method: v.method,
params: login(v.params, db)?
}),
Err(_e) => Err(err_msg("invalid params")),
}
},
_ => Err(err_msg("unknown method")), _ => Err(err_msg("unknown method")),
} }

View File

@ -1,5 +1,5 @@
use uuid::Uuid; use uuid::Uuid;
use bcrypt::{DEFAULT_COST, hash}; use bcrypt::{DEFAULT_COST, hash, verify};
use rand::{thread_rng, Rng}; use rand::{thread_rng, Rng};
use rand::distributions::Alphanumeric; use rand::distributions::Alphanumeric;
use std::iter; use std::iter;
@ -7,7 +7,7 @@ use std::iter;
use std::str; use std::str;
use net::Db; use net::Db;
use rpc::{UserCreateParams, RpcResult}; use rpc::{UserCreateParams, UserLoginParams, RpcResult};
use failure::Error; use failure::Error;
use failure::err_msg; use failure::err_msg;
@ -19,6 +19,7 @@ pub struct User {
token: String, token: String,
} }
#[derive(Debug,Clone,Serialize,Deserialize)]
struct UserEntry { struct UserEntry {
id: Uuid, id: Uuid,
name: String, name: String,
@ -74,3 +75,44 @@ pub fn create(params: UserCreateParams, db: Db) -> Result<RpcResult, Error> {
Ok(RpcResult::User(entry)) Ok(RpcResult::User(entry))
} }
pub fn login(params: UserLoginParams, db: Db) -> Result<RpcResult, Error> {
let query = "
SELECT id, name, token, password
FROM users
WHERE name = $1;
";
// let tx = db.transaction()?;
let result = db
.query(query, &[&params.name])?;
let returned = result.iter().next().expect("no row returned");
let entry = UserEntry {
id: returned.get(0),
name: returned.get(1),
token: returned.get(2),
password: returned.get(3),
};
verify(&params.password, &entry.password)?;
println!("{:?} logged in", entry.name);
// MAYBE
// update token?
// don't necessarily want to log every session out when logging in
// tx.commit()?;
let user = User {
id: entry.id,
name: entry.name,
token: entry.token,
};
Ok(RpcResult::User(user))
}