radicle: Make addresses.db accessible from profile

Signed-off-by: xphoniex <dj.2dixx@gmail.com>
This commit is contained in:
xphoniex 2023-05-26 16:23:55 +00:00 committed by Alexis Sellier
parent 738d0dcbad
commit f526465f1b
No known key found for this signature in database
13 changed files with 95 additions and 29 deletions

View File

@ -1,5 +0,0 @@
mod store;
mod types;
pub use store::*;
pub use types::*;

View File

@ -1,4 +1,3 @@
pub mod address;
pub mod bounded;
pub mod control;
pub mod deserializer;

View File

@ -14,12 +14,12 @@ use reactor::Reactor;
use thiserror::Error;
use radicle::git;
use radicle::node::address;
use radicle::node::Handle as _;
use radicle::node::{ADDRESS_DB_FILE, ROUTING_DB_FILE, TRACKING_DB_FILE};
use radicle::profile::Home;
use radicle::Storage;
use crate::address;
use crate::control;
use crate::crypto::Signer;
use crate::node::{routing, NodeId};

View File

@ -19,8 +19,9 @@ use fastrand::Rng;
use localtime::{LocalDuration, LocalTime};
use log::*;
use crate::address;
use crate::address::{AddressBook, KnownAddress};
use radicle::node::address;
use radicle::node::address::{AddressBook, KnownAddress};
use crate::crypto;
use crate::crypto::{Signer, Verified};
use crate::identity::IdentityError;

View File

@ -4,12 +4,13 @@ use std::net;
use std::ops::{Deref, DerefMut};
use log::*;
use radicle::node::address;
use radicle::node::address::Store;
use radicle::rad;
use radicle::storage::ReadRepository;
use radicle::Storage;
use crate::address;
use crate::address::Store;
use crate::crypto::test::signer::MockSigner;
use crate::crypto::Signer;
use crate::identity::Id;

View File

@ -22,11 +22,12 @@ use netservices::{NetConnection, NetProtocol, NetReader, NetWriter};
use reactor::Timestamp;
use radicle::collections::HashMap;
use radicle::node::{routing, NodeId};
use radicle::node::{address, routing, NodeId};
use radicle::storage::WriteStorage;
use crate::crypto::Signer;
use crate::prelude::Deserializer;
use crate::service;
use crate::service::io::Io;
use crate::service::{session, DisconnectReason, Service};
use crate::wire::frame;
@ -35,7 +36,6 @@ use crate::wire::Encode;
use crate::worker;
use crate::worker::{ChannelEvent, FetchRequest, FetchResult, Task, TaskResult};
use crate::Link;
use crate::{address, service};
/// NoiseXK handshake pattern.
pub const NOISE_XK: HandshakePattern = HandshakePattern {

View File

@ -1,7 +1,6 @@
#![allow(clippy::match_like_matches_macro)]
#![allow(clippy::explicit_auto_deref)] // TODO: This can be removed when the clippy bugs are fixed
#![allow(clippy::iter_nth_zero)]
#![cfg_attr(not(test), warn(clippy::unwrap_used))]
pub extern crate radicle_crypto as crypto;

View File

@ -1,5 +1,6 @@
mod features;
pub mod address;
pub mod events;
pub mod routing;
pub mod tracking;

View File

@ -0,0 +1,51 @@
mod store;
mod types;
pub use store::*;
pub use types::*;
use crate::node::Address;
use cyphernet::addr::HostName;
use std::net;
/// Address type.
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AddressType {
Ipv4 = 1,
Ipv6 = 2,
Hostname = 3,
Onion = 4,
}
impl From<AddressType> for u8 {
fn from(other: AddressType) -> Self {
other as u8
}
}
impl From<&Address> for AddressType {
fn from(a: &Address) -> Self {
match a.host {
HostName::Ip(net::IpAddr::V4(_)) => AddressType::Ipv4,
HostName::Ip(net::IpAddr::V6(_)) => AddressType::Ipv6,
HostName::Dns(_) => AddressType::Hostname,
HostName::Tor(_) => AddressType::Onion,
_ => todo!(), // FIXME(cloudhead): Maxim will remove `non-exhaustive`
}
}
}
impl TryFrom<u8> for AddressType {
type Error = u8;
fn try_from(other: u8) -> Result<Self, Self::Error> {
match other {
1 => Ok(AddressType::Ipv4),
2 => Ok(AddressType::Ipv6),
3 => Ok(AddressType::Hostname),
4 => Ok(AddressType::Onion),
_ => Err(other),
}
}
}

View File

@ -1,18 +1,19 @@
use std::path::Path;
use std::{fmt, io};
use radicle::node;
use radicle::node::Address;
use radicle::prelude::Timestamp;
use radicle::sql::transaction;
use localtime::LocalTime;
use sqlite as sql;
use thiserror::Error;
use crate::address::types;
use crate::address::{KnownAddress, Source};
use crate::service::NodeId;
use crate::wire::AddressType;
use crate::LocalTime;
use crate::node;
use crate::node::address::{KnownAddress, Source};
use crate::node::Address;
use crate::node::NodeId;
use crate::prelude::Timestamp;
use crate::sql::transaction;
use super::types;
use super::AddressType;
#[derive(Error, Debug)]
pub enum Error {
@ -47,6 +48,15 @@ impl Book {
Ok(Self { db })
}
/// Same as [`Self::open`], but in read-only mode. This is useful to have multiple
/// open databases, as no locking is required.
pub fn reader<P: AsRef<Path>>(path: P) -> Result<Self, Error> {
let db = sql::Connection::open_with_flags(path, sqlite::OpenFlags::new().set_read_only())?;
db.execute(Self::SCHEMA)?;
Ok(Self { db })
}
/// Create a new in-memory address book.
pub fn memory() -> Result<Self, Error> {
let db = sql::Connection::open(":memory:")?;
@ -341,7 +351,7 @@ mod test {
use super::*;
use crate::test::arbitrary;
use crate::LocalTime;
use localtime::LocalTime;
#[test]
fn test_empty() {

View File

@ -1,12 +1,12 @@
use std::ops::{Deref, DerefMut};
use localtime::LocalTime;
use nonempty::NonEmpty;
use radicle::node;
use radicle::node::Address;
use radicle::prelude::Timestamp;
use crate::collections::HashMap;
use crate::LocalTime;
use crate::node;
use crate::node::Address;
use crate::prelude::Timestamp;
/// A map with the ability to randomly select values.
#[derive(Debug, Clone)]

View File

@ -18,7 +18,8 @@ use thiserror::Error;
use crate::crypto::ssh::agent::Agent;
use crate::crypto::ssh::{keystore, Keystore, Passphrase};
use crate::crypto::{PublicKey, Signer};
use crate::node::{self, routing, tracking};
use crate::node;
use crate::node::{address, routing, tracking};
use crate::prelude::Did;
use crate::storage::git::transport;
use crate::storage::git::Storage;
@ -143,6 +144,14 @@ impl Profile {
Ok(router)
}
/// Return a handle to the address database of the node.
pub fn addresses(&self) -> Result<address::Book, address::Error> {
let path = self.home.node().join(node::ADDRESS_DB_FILE);
let addresses = address::Book::reader(path)?;
Ok(addresses)
}
/// Return the path to the keys folder.
pub fn keys(&self) -> PathBuf {
self.home.keys()