parent
43f50d88f1
commit
2e4f44a838
@ -0,0 +1,123 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2022-2023 Niko Bonnieure, Par le Peuple, NextGraph.org developers |
||||||
|
* All rights reserved. |
||||||
|
* Licensed under the Apache License, Version 2.0 |
||||||
|
* <LICENSE-APACHE2 or http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
|
* or the MIT license <LICENSE-MIT or http://opensource.org/licenses/MIT>,
|
||||||
|
* at your option. All files in the project carrying such |
||||||
|
* notice may not be copied, modified, or distributed except |
||||||
|
* according to those terms. |
||||||
|
*/ |
||||||
|
use crate::broker::{ServerConfig, BROKER}; |
||||||
|
use crate::connection::NoiseFSM; |
||||||
|
use crate::types::*; |
||||||
|
use crate::{actor::*, errors::ProtocolError, types::ProtocolMessage}; |
||||||
|
|
||||||
|
use async_std::sync::Mutex; |
||||||
|
use p2p_repo::log::*; |
||||||
|
use p2p_repo::types::PubKey; |
||||||
|
use serde::{Deserialize, Serialize}; |
||||||
|
use std::sync::Arc; |
||||||
|
|
||||||
|
use super::StartProtocol; |
||||||
|
|
||||||
|
/// Add invitation
|
||||||
|
#[derive(Clone, Debug, Serialize, Deserialize)] |
||||||
|
pub struct AddInvitationV0 { |
||||||
|
pub invite_code: InvitationCode, |
||||||
|
pub expiry: u32, |
||||||
|
pub memo: Option<String>, |
||||||
|
} |
||||||
|
|
||||||
|
/// Add invitation
|
||||||
|
#[derive(Clone, Debug, Serialize, Deserialize)] |
||||||
|
pub enum AddInvitation { |
||||||
|
V0(AddInvitationV0), |
||||||
|
} |
||||||
|
|
||||||
|
impl AddInvitation { |
||||||
|
pub fn code(&self) -> &InvitationCode { |
||||||
|
match self { |
||||||
|
AddInvitation::V0(o) => &o.invite_code, |
||||||
|
} |
||||||
|
} |
||||||
|
pub fn expiry(&self) -> u32 { |
||||||
|
match self { |
||||||
|
AddInvitation::V0(o) => o.expiry, |
||||||
|
} |
||||||
|
} |
||||||
|
pub fn memo(&self) -> &Option<String> { |
||||||
|
match self { |
||||||
|
AddInvitation::V0(o) => &o.memo, |
||||||
|
} |
||||||
|
} |
||||||
|
pub fn get_actor(&self) -> Box<dyn EActor> { |
||||||
|
Actor::<AddInvitation, AdminResponse>::new_responder() |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl TryFrom<ProtocolMessage> for AddInvitation { |
||||||
|
type Error = ProtocolError; |
||||||
|
fn try_from(msg: ProtocolMessage) -> Result<Self, Self::Error> { |
||||||
|
if let ProtocolMessage::Start(StartProtocol::Admin(AdminRequest::V0(AdminRequestV0 { |
||||||
|
content: AdminRequestContentV0::AddInvitation(a), |
||||||
|
.. |
||||||
|
}))) = msg |
||||||
|
{ |
||||||
|
Ok(a) |
||||||
|
} else { |
||||||
|
log_debug!("INVALID {:?}", msg); |
||||||
|
Err(ProtocolError::InvalidValue) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl From<AddInvitation> for ProtocolMessage { |
||||||
|
fn from(msg: AddInvitation) -> ProtocolMessage { |
||||||
|
unimplemented!(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl From<AddInvitation> for AdminRequestContentV0 { |
||||||
|
fn from(msg: AddInvitation) -> AdminRequestContentV0 { |
||||||
|
AdminRequestContentV0::AddInvitation(msg) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl Actor<'_, AddInvitation, AdminResponse> {} |
||||||
|
|
||||||
|
#[async_trait::async_trait] |
||||||
|
impl EActor for Actor<'_, AddInvitation, AdminResponse> { |
||||||
|
async fn respond( |
||||||
|
&mut self, |
||||||
|
msg: ProtocolMessage, |
||||||
|
fsm: Arc<Mutex<NoiseFSM>>, |
||||||
|
) -> Result<(), ProtocolError> { |
||||||
|
let req = AddInvitation::try_from(msg)?; |
||||||
|
let broker = BROKER.read().await; |
||||||
|
broker |
||||||
|
.get_storage()? |
||||||
|
.add_invitation(req.code(), req.expiry(), req.memo())?; |
||||||
|
|
||||||
|
let invitation = crate::types::Invitation::V0(InvitationV0::new( |
||||||
|
broker.get_bootstrap()?.clone(), |
||||||
|
Some(req.code().get_symkey()), |
||||||
|
None, |
||||||
|
broker.get_registration_url().map(|s| s.clone()), |
||||||
|
)); |
||||||
|
let response: AdminResponseV0 = invitation.into(); |
||||||
|
fsm.lock().await.send(response.into()).await?; |
||||||
|
Ok(()) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl From<Invitation> for AdminResponseV0 { |
||||||
|
fn from(res: Invitation) -> AdminResponseV0 { |
||||||
|
AdminResponseV0 { |
||||||
|
id: 0, |
||||||
|
result: 0, |
||||||
|
content: AdminResponseContentV0::Invitation(res), |
||||||
|
padding: vec![], |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,130 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2022-2023 Niko Bonnieure, Par le Peuple, NextGraph.org developers |
||||||
|
* All rights reserved. |
||||||
|
* Licensed under the Apache License, Version 2.0 |
||||||
|
* <LICENSE-APACHE2 or http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
|
* or the MIT license <LICENSE-MIT or http://opensource.org/licenses/MIT>,
|
||||||
|
* at your option. All files in the project carrying such |
||||||
|
* notice may not be copied, modified, or distributed except |
||||||
|
* according to those terms. |
||||||
|
*/ |
||||||
|
use crate::broker::BROKER; |
||||||
|
use crate::connection::NoiseFSM; |
||||||
|
use crate::types::*; |
||||||
|
use crate::{actor::*, errors::ProtocolError, types::ProtocolMessage}; |
||||||
|
|
||||||
|
use async_std::sync::Mutex; |
||||||
|
use p2p_repo::log::*; |
||||||
|
use p2p_repo::types::PubKey; |
||||||
|
use serde::{Deserialize, Serialize}; |
||||||
|
use std::sync::Arc; |
||||||
|
|
||||||
|
use super::StartProtocol; |
||||||
|
|
||||||
|
/// List invitations registered on this broker
|
||||||
|
#[derive(Clone, Copy, Debug, Serialize, Deserialize)] |
||||||
|
pub struct ListInvitationsV0 { |
||||||
|
/// should list only the admin invitations.
|
||||||
|
pub admin: bool, |
||||||
|
/// should list only the unique invitations.
|
||||||
|
pub unique: bool, |
||||||
|
/// should list only the multi invitations.
|
||||||
|
pub multi: bool, |
||||||
|
} |
||||||
|
|
||||||
|
/// List invitations registered on this broker
|
||||||
|
#[derive(Clone, Copy, Debug, Serialize, Deserialize)] |
||||||
|
pub enum ListInvitations { |
||||||
|
V0(ListInvitationsV0), |
||||||
|
} |
||||||
|
|
||||||
|
impl ListInvitations { |
||||||
|
pub fn admin(&self) -> bool { |
||||||
|
match self { |
||||||
|
Self::V0(o) => o.admin, |
||||||
|
} |
||||||
|
} |
||||||
|
pub fn unique(&self) -> bool { |
||||||
|
match self { |
||||||
|
Self::V0(o) => o.unique, |
||||||
|
} |
||||||
|
} |
||||||
|
pub fn multi(&self) -> bool { |
||||||
|
match self { |
||||||
|
Self::V0(o) => o.multi, |
||||||
|
} |
||||||
|
} |
||||||
|
pub fn get_actor(&self) -> Box<dyn EActor> { |
||||||
|
Actor::<ListInvitations, AdminResponse>::new_responder() |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl TryFrom<ProtocolMessage> for ListInvitations { |
||||||
|
type Error = ProtocolError; |
||||||
|
fn try_from(msg: ProtocolMessage) -> Result<Self, Self::Error> { |
||||||
|
if let ProtocolMessage::Start(StartProtocol::Admin(AdminRequest::V0(AdminRequestV0 { |
||||||
|
content: AdminRequestContentV0::ListInvitations(a), |
||||||
|
.. |
||||||
|
}))) = msg |
||||||
|
{ |
||||||
|
Ok(a) |
||||||
|
} else { |
||||||
|
//log_debug!("INVALID {:?}", msg);
|
||||||
|
Err(ProtocolError::InvalidValue) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl From<ListInvitations> for ProtocolMessage { |
||||||
|
fn from(msg: ListInvitations) -> ProtocolMessage { |
||||||
|
unimplemented!(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl From<ListInvitations> for AdminRequestContentV0 { |
||||||
|
fn from(msg: ListInvitations) -> AdminRequestContentV0 { |
||||||
|
AdminRequestContentV0::ListInvitations(msg) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl Actor<'_, ListInvitations, AdminResponse> {} |
||||||
|
|
||||||
|
#[async_trait::async_trait] |
||||||
|
impl EActor for Actor<'_, ListInvitations, AdminResponse> { |
||||||
|
async fn respond( |
||||||
|
&mut self, |
||||||
|
msg: ProtocolMessage, |
||||||
|
fsm: Arc<Mutex<NoiseFSM>>, |
||||||
|
) -> Result<(), ProtocolError> { |
||||||
|
let req = ListInvitations::try_from(msg)?; |
||||||
|
let res = BROKER.read().await.get_storage()?.list_invitations( |
||||||
|
req.admin(), |
||||||
|
req.unique(), |
||||||
|
req.multi(), |
||||||
|
); |
||||||
|
let response: AdminResponseV0 = res.into(); |
||||||
|
fsm.lock().await.send(response.into()).await?; |
||||||
|
Ok(()) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl From<Result<Vec<(InvitationCode, u32, Option<String>)>, ProtocolError>> for AdminResponseV0 { |
||||||
|
fn from( |
||||||
|
res: Result<Vec<(InvitationCode, u32, Option<String>)>, ProtocolError>, |
||||||
|
) -> AdminResponseV0 { |
||||||
|
match res { |
||||||
|
Err(e) => AdminResponseV0 { |
||||||
|
id: 0, |
||||||
|
result: e.into(), |
||||||
|
content: AdminResponseContentV0::EmptyResponse, |
||||||
|
padding: vec![], |
||||||
|
}, |
||||||
|
Ok(vec) => AdminResponseV0 { |
||||||
|
id: 0, |
||||||
|
result: 0, |
||||||
|
content: AdminResponseContentV0::Invitations(vec), |
||||||
|
padding: vec![], |
||||||
|
}, |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue