Made DoH feature optional to be able to create new builds for MIPSes.

This commit is contained in:
Revertron
2021-09-15 23:56:51 +02:00
parent 6eb185f76a
commit 82ccffbbb7
5 changed files with 50 additions and 15 deletions
+3 -2
View File
@@ -38,7 +38,7 @@ rand-old = { package = "rand", version = "0.7.0" } # For ed25519-dalek
sqlite = "0.26.0" sqlite = "0.26.0"
uuid = { version = "0.8.2", features = ["serde", "v4"] } uuid = { version = "0.8.2", features = ["serde", "v4"] }
mio = { version = "0.7.13", features = ["os-poll", "net"] } mio = { version = "0.7.13", features = ["os-poll", "net"] }
ureq = "2.2" ureq = { version = "2.2", optional = true }
lru = "0.6" lru = "0.6"
derive_more = "0.99.16" derive_more = "0.99.16"
lazy_static = "1.4.0" lazy_static = "1.4.0"
@@ -79,4 +79,5 @@ FileDescription="Alternative Free Identity System"
[features] [features]
webgui = ["web-view", "tinyfiledialogs", "open"] webgui = ["web-view", "tinyfiledialogs", "open"]
edge = ["webgui", "web-view/edge"] edge = ["webgui", "web-view/edge"]
default = ["webgui"] doh = ["ureq"]
default = ["webgui", "doh"]
+6 -1
View File
@@ -23,6 +23,11 @@ PKGREPLACES=alfis
mkdir -p bin mkdir -p bin
FEATURES = "doh"
if [ $PKGARCH = "mipsel" ]; then FEATURES=''
elif [ $PKGARCH = "mips" ]; then FEATURES=''
fi
TARGET="" TARGET=""
# Building nogui versions only # Building nogui versions only
if [ $PKGARCH = "amd64" ]; then TARGET='x86_64-unknown-linux-musl' if [ $PKGARCH = "amd64" ]; then TARGET='x86_64-unknown-linux-musl'
@@ -36,7 +41,7 @@ else
exit 1 exit 1
fi fi
cross build --release --no-default-features --target $TARGET cross build --release --no-default-features --features=$FEATURES --target $TARGET
upx target/$TARGET/release/alfis upx target/$TARGET/release/alfis
cp target/$TARGET/release/alfis ./alfis cp target/$TARGET/release/alfis ./alfis
cp target/$TARGET/release/alfis ./bin/alfis-linux-$PKGARCH-v$PKGVERSION-nogui cp target/$TARGET/release/alfis ./bin/alfis-linux-$PKGARCH-v$PKGVERSION-nogui
+19 -5
View File
@@ -1,11 +1,17 @@
//! client for sending DNS queries to other servers //! client for sending DNS queries to other servers
use std::io::{Write, Read}; use std::io::Write;
#[cfg(feature = "doh")]
use std::io::Read;
use std::marker::{Send, Sync}; use std::marker::{Send, Sync};
use std::net::{SocketAddr, TcpStream, ToSocketAddrs, UdpSocket, IpAddr}; use std::net::{SocketAddr, TcpStream, ToSocketAddrs, UdpSocket};
#[cfg(feature = "doh")]
use std::net::IpAddr;
use std::sync::atomic::{AtomicUsize, Ordering, AtomicBool}; use std::sync::atomic::{AtomicUsize, Ordering, AtomicBool};
use std::sync::mpsc::{channel, Sender}; use std::sync::mpsc::{channel, Sender};
use std::sync::{Arc, Mutex, RwLock}; use std::sync::{Arc, Mutex};
#[cfg(feature = "doh")]
use std::sync::RwLock;
use std::thread::{sleep, Builder}; use std::thread::{sleep, Builder};
use std::time::Duration as SleepDuration; use std::time::Duration as SleepDuration;
@@ -15,9 +21,14 @@ use derive_more::{Display, Error, From};
#[allow(unused_imports)] #[allow(unused_imports)]
use log::{debug, error, info, trace, warn}; use log::{debug, error, info, trace, warn};
use crate::dns::buffer::{BytePacketBuffer, PacketBuffer, StreamPacketBuffer, VectorPacketBuffer}; use crate::dns::buffer::{BytePacketBuffer, PacketBuffer, StreamPacketBuffer};
#[cfg(feature = "doh")]
use crate::dns::buffer::VectorPacketBuffer;
use crate::dns::netutil::{read_packet_length, write_packet_length}; use crate::dns::netutil::{read_packet_length, write_packet_length};
use crate::dns::protocol::{DnsPacket, DnsQuestion, QueryType, DnsRecord}; use crate::dns::protocol::{DnsPacket, DnsQuestion, QueryType};
#[cfg(feature = "doh")]
use crate::dns::protocol::DnsRecord;
#[cfg(feature = "doh")]
use lru::LruCache; use lru::LruCache;
#[derive(Debug, Display, From, Error)] #[derive(Debug, Display, From, Error)]
@@ -372,12 +383,14 @@ impl DnsClient for DnsNetworkClient {
} }
} }
#[cfg(feature = "doh")]
pub struct HttpsDnsClient { pub struct HttpsDnsClient {
agent: ureq::Agent, agent: ureq::Agent,
/// Counter for assigning packet ids /// Counter for assigning packet ids
seq: AtomicUsize, seq: AtomicUsize,
} }
#[cfg(feature = "doh")]
impl HttpsDnsClient { impl HttpsDnsClient {
pub fn new(bootstraps: Vec<String>) -> Self { pub fn new(bootstraps: Vec<String>) -> Self {
let client_name = format!("ALFIS/{}", env!("CARGO_PKG_VERSION")); let client_name = format!("ALFIS/{}", env!("CARGO_PKG_VERSION"));
@@ -444,6 +457,7 @@ impl HttpsDnsClient {
} }
} }
#[cfg(feature = "doh")]
impl DnsClient for HttpsDnsClient { impl DnsClient for HttpsDnsClient {
fn get_sent_count(&self) -> usize { fn get_sent_count(&self) -> usize {
// No statistics for now // No statistics for now
+16 -6
View File
@@ -7,7 +7,9 @@ use derive_more::{Display, Error, From};
use crate::dns::authority::Authority; use crate::dns::authority::Authority;
use crate::dns::cache::SynchronizedCache; use crate::dns::cache::SynchronizedCache;
use crate::dns::client::{DnsClient, DnsNetworkClient, HttpsDnsClient}; use crate::dns::client::{DnsClient, DnsNetworkClient};
#[cfg(feature = "doh")]
use crate::dns::client::HttpsDnsClient;
use crate::dns::filter::DnsFilter; use crate::dns::filter::DnsFilter;
use crate::dns::resolve::{DnsResolver, ForwardingDnsResolver, RecursiveDnsResolver}; use crate::dns::resolve::{DnsResolver, ForwardingDnsResolver, RecursiveDnsResolver};
@@ -45,7 +47,7 @@ pub struct ServerContext {
pub cache: SynchronizedCache, pub cache: SynchronizedCache,
pub filters: Vec<Box<dyn DnsFilter + Sync + Send>>, pub filters: Vec<Box<dyn DnsFilter + Sync + Send>>,
pub old_client: Box<dyn DnsClient + Sync + Send>, pub old_client: Box<dyn DnsClient + Sync + Send>,
pub doh_client: Box<dyn DnsClient + Sync + Send>, pub doh_client: Option<Box<dyn DnsClient + Sync + Send>>,
pub dns_listen: String, pub dns_listen: String,
pub api_port: u16, pub api_port: u16,
pub resolve_strategy: ResolveStrategy, pub resolve_strategy: ResolveStrategy,
@@ -64,13 +66,19 @@ impl Default for ServerContext {
} }
impl ServerContext { impl ServerContext {
#[allow(unused_variables)]
pub fn new(dns_listen: String, bootstraps: Vec<String>) -> ServerContext { pub fn new(dns_listen: String, bootstraps: Vec<String>) -> ServerContext {
#[cfg(not(feature = "doh"))]
let doh_client = None;
#[cfg(feature = "doh")]
let doh_client: Option<Box<dyn DnsClient + Sync + Send>> = Some(Box::new(HttpsDnsClient::new(bootstraps)));
ServerContext { ServerContext {
authority: Authority::new(), authority: Authority::new(),
cache: SynchronizedCache::new(), cache: SynchronizedCache::new(),
filters: Vec::new(), filters: Vec::new(),
old_client: Box::new(DnsNetworkClient::new(10000 + (rand::random::<u16>() % 20000))), old_client: Box::new(DnsNetworkClient::new(10000 + (rand::random::<u16>() % 50000))),
doh_client: Box::new(HttpsDnsClient::new(bootstraps)), doh_client,
dns_listen, dns_listen,
api_port: 5380, api_port: 5380,
resolve_strategy: ResolveStrategy::Recursive, resolve_strategy: ResolveStrategy::Recursive,
@@ -87,7 +95,9 @@ impl ServerContext {
// Start UDP client thread // Start UDP client thread
self.old_client.run()?; self.old_client.run()?;
// Start DoH client // Start DoH client
self.doh_client.run()?; if let Some(client) = &self.doh_client {
client.run()?;
}
// Load authority data // Load authority data
self.authority.load()?; self.authority.load()?;
@@ -122,7 +132,7 @@ pub mod tests {
cache: SynchronizedCache::new(), cache: SynchronizedCache::new(),
filters: Vec::new(), filters: Vec::new(),
old_client: Box::new(DnsStubClient::new(callback)), old_client: Box::new(DnsStubClient::new(callback)),
doh_client: Box::new(HttpsDnsClient::new(Vec::new())), doh_client: Some(Box::new(HttpsDnsClient::new(Vec::new()))),
dns_listen: String::from("0.0.0.0:53"), dns_listen: String::from("0.0.0.0:53"),
api_port: 5380, api_port: 5380,
resolve_strategy: ResolveStrategy::Recursive, resolve_strategy: ResolveStrategy::Recursive,
+6 -1
View File
@@ -89,7 +89,12 @@ impl DnsResolver for ForwardingDnsResolver {
let result = match self.context.cache.lookup(qname, qtype) { let result = match self.context.cache.lookup(qname, qtype) {
None => { None => {
if is_url(upstream) { if is_url(upstream) {
self.context.doh_client.send_query(qname, qtype, upstream, true)? if let Some(client) = &self.context.doh_client {
client.send_query(qname, qtype, upstream, true)?
} else {
log::error!("This build doesn't support DoH");
return Err(ResolveError::NoServerFound);
}
} else { } else {
self.context.old_client.send_query(qname, qtype, upstream, true)? self.context.old_client.send_query(qname, qtype, upstream, true)?
} }