Merge pull request #4729 from dignow/fix/login_store_user_info

Fix/login store user info
This commit is contained in:
RustDesk 2023-06-22 02:16:32 +08:00 committed by GitHub
commit e6bade2c5f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 77 additions and 28 deletions

View File

@ -14,21 +14,39 @@ class HttpType {
static const kAuthResTypeEmailCheck = "email_check"; static const kAuthResTypeEmailCheck = "email_check";
} }
enum UserStatus { kDisabled, kNormal, kUnverified }
// to-do: The UserPayload does not contain all the fields of the user.
// Is all the fields of the user needed?
class UserPayload { class UserPayload {
String id = '';
String name = ''; String name = '';
String email = ''; String email = '';
String note = ''; String note = '';
int? status; UserStatus status;
bool isAdmin = false; bool isAdmin = false;
UserPayload.fromJson(Map<String, dynamic> json) UserPayload.fromJson(Map<String, dynamic> json)
: id = json['id'] ?? '', : name = json['name'] ?? '',
name = json['name'] ?? '',
email = json['email'] ?? '', email = json['email'] ?? '',
note = json['note'] ?? '', note = json['note'] ?? '',
status = json['status'], status = json['status'] == 0
? UserStatus.kDisabled
: json['status'] == -1
? UserStatus.kUnverified
: UserStatus.kNormal,
isAdmin = json['is_admin'] == true; isAdmin = json['is_admin'] == true;
Map<String, dynamic> toJson() {
final Map<String, dynamic> map = {
'name': name,
'status': status == UserStatus.kDisabled
? 0
: status == UserStatus.kUnverified
? -1
: 1,
};
return map;
}
} }
class PeerPayload { class PeerPayload {

View File

@ -424,6 +424,8 @@ Future<bool?> loginDialog() async {
if (resp.access_token != null) { if (resp.access_token != null) {
await bind.mainSetLocalOption( await bind.mainSetLocalOption(
key: 'access_token', value: resp.access_token!); key: 'access_token', value: resp.access_token!);
await bind.mainSetLocalOption(
key: 'user_info', value: jsonEncode(resp.user ?? {}));
close(true); close(true);
return; return;
} }
@ -482,12 +484,8 @@ Future<bool?> loginDialog() async {
curOP: curOP, curOP: curOP,
cbLogin: (Map<String, dynamic> authBody) { cbLogin: (Map<String, dynamic> authBody) {
try { try {
final loginResp = // access_token is already stored in the rust side.
gFFI.userModel.getLoginResponseFromAuthBody(authBody); gFFI.userModel.getLoginResponseFromAuthBody(authBody);
if (loginResp.access_token != null) {
bind.mainSetLocalOption(
key: 'access_token', value: loginResp.access_token!);
}
} catch (e) { } catch (e) {
debugPrint('Failed too parse oidc login body: "$authBody"'); debugPrint('Failed too parse oidc login body: "$authBody"');
} }

View File

@ -75,6 +75,7 @@ class UserModel {
Future<void> reset() async { Future<void> reset() async {
await bind.mainSetLocalOption(key: 'access_token', value: ''); await bind.mainSetLocalOption(key: 'access_token', value: '');
await bind.mainSetLocalOption(key: 'user_info', value: '');
await gFFI.abModel.reset(); await gFFI.abModel.reset();
await gFFI.groupModel.reset(); await gFFI.groupModel.reset();
userName.value = ''; userName.value = '';

View File

@ -4,6 +4,7 @@ use hbb_common::{
log, ResultType, log, ResultType,
}; };
use reqwest::blocking::Client; use reqwest::blocking::Client;
use serde::ser::SerializeStruct;
use serde_derive::{Deserialize, Serialize}; use serde_derive::{Deserialize, Serialize};
use serde_repr::{Deserialize_repr, Serialize_repr}; use serde_repr::{Deserialize_repr, Serialize_repr};
use std::{ use std::{
@ -59,8 +60,6 @@ pub struct UserInfo {
#[serde(default)] #[serde(default)]
pub settings: UserSettings, pub settings: UserSettings,
#[serde(default)] #[serde(default)]
pub login_ip_whitelist: Vec<WhitelistItem>,
#[serde(default)]
pub login_device_whitelist: Vec<WhitelistItem>, pub login_device_whitelist: Vec<WhitelistItem>,
#[serde(default)] #[serde(default)]
pub other: HashMap<String, String>, pub other: HashMap<String, String>,
@ -82,23 +81,18 @@ pub enum UserStatus {
Unverified = -1, Unverified = -1,
} }
#[derive(Debug, Clone, Copy, PartialEq, Serialize_repr, Deserialize_repr)] #[derive(Debug, Clone, Deserialize)]
#[repr(i64)]
pub enum UserRole {
Owner = 10,
Admin = 1,
Member = 0,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserPayload { pub struct UserPayload {
pub name: String, pub name: String,
pub email: Option<String>, pub email: Option<String>,
pub note: Option<String>, pub note: Option<String>,
pub status: UserStatus, pub status: UserStatus,
pub info: UserInfo, pub info: UserInfo,
pub role: UserRole,
pub is_admin: bool, pub is_admin: bool,
pub third_auth_type: Option<String>,
// helper field for serialize
#[serde(default)]
pub ser_store_local: bool,
} }
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Debug, Clone, Serialize, Deserialize)]
@ -127,6 +121,30 @@ pub struct AuthResult {
pub auth_body: Option<AuthBody>, pub auth_body: Option<AuthBody>,
} }
impl serde::Serialize for UserPayload {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
if self.ser_store_local {
let mut state = serializer.serialize_struct("UserPayload", 1)?;
state.serialize_field("name", &self.name)?;
state.serialize_field("status", &self.status)?;
state.end()
} else {
let mut state = serializer.serialize_struct("UserPayload", 7)?;
state.serialize_field("name", &self.name)?;
state.serialize_field("email", &self.email)?;
state.serialize_field("note", &self.note)?;
state.serialize_field("status", &self.status)?;
state.serialize_field("info", &self.info)?;
state.serialize_field("is_admin", &self.is_admin)?;
state.serialize_field("third_auth_type", &self.third_auth_type)?;
state.end()
}
}
}
impl OidcSession { impl OidcSession {
fn new() -> Self { fn new() -> Self {
Self { Self {
@ -226,16 +244,18 @@ impl OidcSession {
let query_timeout = OIDC_SESSION.read().unwrap().query_timeout; let query_timeout = OIDC_SESSION.read().unwrap().query_timeout;
while OIDC_SESSION.read().unwrap().keep_querying && begin.elapsed() < query_timeout { while OIDC_SESSION.read().unwrap().keep_querying && begin.elapsed() < query_timeout {
match Self::query(&code_url.code, &id, &uuid) { match Self::query(&code_url.code, &id, &uuid) {
Ok(HbbHttpResponse::<_>::Data(auth_body)) => { Ok(HbbHttpResponse::<_>::Data(mut auth_body)) => {
if remember_me { if remember_me {
LocalConfig::set_option( LocalConfig::set_option(
"access_token".to_owned(), "access_token".to_owned(),
auth_body.access_token.clone(), auth_body.access_token.clone(),
); );
auth_body.user.ser_store_local = true;
LocalConfig::set_option( LocalConfig::set_option(
"user_info".to_owned(), "user_info".to_owned(),
serde_json::to_string(&auth_body.user).unwrap_or_default(), serde_json::to_string(&auth_body.user).unwrap_or_default(),
); );
auth_body.user.ser_store_local = false;
} }
OIDC_SESSION OIDC_SESSION
.write() .write()

View File

@ -1174,6 +1174,14 @@ function check_if_overlay() {
checkConnectStatus(); checkConnectStatus();
function set_local_user_info(user) {
var user_info = {name: user.name};
if (user.status) {
user_info.status = user.status;
}
handler.set_local_option("user_info", JSON.stringify(user_info));
}
function login() { function login() {
var name0 = getUserName(); var name0 = getUserName();
var pass0 = ''; var pass0 = '';
@ -1209,7 +1217,7 @@ function login() {
return; return;
} }
handler.set_local_option("access_token", data.access_token); handler.set_local_option("access_token", data.access_token);
handler.set_local_option("user_info", JSON.stringify(data.user)); set_local_user_info(data.user);
show_progress(-1); show_progress(-1);
myIdMenu.update(); myIdMenu.update();
getAb(); getAb();
@ -1248,7 +1256,7 @@ function on_email_check(last_msg) {
return; return;
} }
handler.set_local_option("access_token", data.access_token); handler.set_local_option("access_token", data.access_token);
handler.set_local_option("user_info", JSON.stringify(data.user)); set_local_user_info(data.user);
show_progress(-1); show_progress(-1);
myIdMenu.update(); myIdMenu.update();
getAb(); getAb();
@ -1298,7 +1306,7 @@ function refreshCurrentUser() {
handleAbError(data.error); handleAbError(data.error);
return; return;
} }
handler.set_local_option("user_info", JSON.stringify(data)); set_local_user_info(data);
myIdMenu.update(); myIdMenu.update();
getAb(); getAb();
}, function(err, status) { }, function(err, status) {

View File

@ -822,7 +822,11 @@ pub fn account_auth_cancel() {
#[cfg(feature = "flutter")] #[cfg(feature = "flutter")]
pub fn account_auth_result() -> String { pub fn account_auth_result() -> String {
serde_json::to_string(&account::OidcSession::get_result()).unwrap_or_default() let mut auth_result = account::OidcSession::get_result();
if let Some(auth) = auth_result.auth_body.as_mut() {
auth.user.ser_store_local = false;
}
serde_json::to_string(&auth_result).unwrap_or_default()
} }
#[cfg(feature = "flutter")] #[cfg(feature = "flutter")]