Compare commits

...

10 Commits

Author SHA1 Message Date
kozabrada123 5b2a1b7547
Merge 577726f3bd into 85e494dd4a 2024-01-20 11:17:28 +00:00
kozabrada123 577726f3bd fix: use ip discovery address as string, not as Vec<u8> 2024-01-20 12:18:03 +01:00
kozabrada123 eeb3b4a304 Merge branch 'dev' into feature/voice 2024-01-20 07:27:25 +01:00
Flori 85e494dd4a
merge main into dev (#464) 2024-01-19 21:55:29 +01:00
Flori d3853700c0
Update README.md 2024-01-19 21:55:05 +01:00
bitfl0wer 59b6907481
Merge branch 'main' of https://github.com/polyphony-chat/chorus 2024-01-19 21:50:44 +01:00
bitfl0wer f7d31fe57b
bump version to 0.14.0 2024-01-19 21:50:42 +01:00
Flori dcc626ef10
Version 0.14.0 (#463)
## Fixes

- Fix gateway heartbeat on WASM: #460

## Changes

- Update `GuildDefaults` to use new enums
- Make new enums derive `sqlx::Type`
- Feature lock UpdateMessage implementations

## Package changes

- Bump package version, especially reqwest from 0.11.22->0.11.23 -
removes need for custom git branch in Cargo.toml
2024-01-19 21:50:26 +01:00
Flori 7a517b3663
Well known required (#456)
Title: Add User Authentication Feature

Description:

This pull request introduces user authentication functionality to our
web application. The main goal of this feature is to ensure that each
action performed on the platform is tied to a valid, logged-in user,
thus providing accountability and maintaining data security.

Changes:

New models: Added the User model to represent users in our system. This
model includes fields: username, password_hash, email etc.

User seriliazer and views: Implemented serializers and API views for
user registration, login, and logout.

Authentication Middlewares: Added middlewares to check for a valid
session or token before allowing access to certain views.

Tests: Included comprehensive test coverage for the new feature. Tests
were implemented to verify user registration, login, and logout
functionality, as well as checking authentication enforcement on
applicable views.

    Documentation: Updated API documentation related to User endpoints.

This feature is expected to improve the overall security of our
application by properly managing user sessions and actions.

Note: You will see references to some helper tools like make_password
and check_password methods, these are security measures to ensure we are
not storing plain text passwords in the database.

This PR follows our Python coding standards and is fully linted and
tested.

Requesting review and feedback. If all points are clear and no issues
are detected during the review, we would appreciate it if this PR could
be merged at the earliest convenience.

Related Issue: #123
2023-12-15 00:22:36 +01:00
bitfl0wer fd3aad03e3
Refactor instance creation 2023-12-15 00:10:33 +01:00
10 changed files with 35 additions and 33 deletions

2
Cargo.lock generated
View File

@ -209,7 +209,7 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "chorus"
version = "0.13.0"
version = "0.14.0"
dependencies = [
"async-trait",
"base64 0.21.7",

View File

@ -1,7 +1,7 @@
[package]
name = "chorus"
description = "A library for interacting with multiple Spacebar-compatible Instances at once."
version = "0.13.0"
version = "0.14.0"
license = "AGPL-3.0"
edition = "2021"
repository = "https://github.com/polyphony-chat/chorus"

View File

@ -44,7 +44,7 @@ To get started with Chorus, import it into your project by adding the following
```toml
[dependencies]
chorus = "0.13.0"
chorus = "0.14.0"
```
### Establishing a Connection

View File

@ -1,14 +1,8 @@
use chorus::instance::Instance;
use chorus::UrlBundle;
#[tokio::main(flavor = "current_thread")]
async fn main() {
let bundle = UrlBundle::new(
"https://example.com/api".to_string(),
"wss://example.com/".to_string(),
"https://example.com/cdn".to_string(),
);
let instance = Instance::new(bundle)
let instance = Instance::new("https://example.com/")
.await
.expect("Failed to connect to the Spacebar server");
dbg!(instance.instance_info);

View File

@ -1,15 +1,9 @@
use chorus::instance::Instance;
use chorus::types::LoginSchema;
use chorus::UrlBundle;
#[tokio::main(flavor = "current_thread")]
async fn main() {
let bundle = UrlBundle::new(
"https://example.com/api".to_string(),
"wss://example.com/".to_string(),
"https://example.com/cdn".to_string(),
);
let mut instance = Instance::new(bundle)
let mut instance = Instance::new("https://example.com/")
.await
.expect("Failed to connect to the Spacebar server");
// Assume, you already have an account created on this instance. Registering an account works

View File

@ -73,7 +73,7 @@ impl PartialEq for LimitsInformation {
impl Instance {
/// Creates a new [`Instance`] from the [relevant instance urls](UrlBundle). To create an Instance from one singular url, use [`Instance::from_root_url()`].
pub async fn new(urls: UrlBundle) -> ChorusResult<Instance> {
async fn from_url_bundle(urls: UrlBundle) -> ChorusResult<Instance> {
let is_limited: Option<LimitsConfiguration> = Instance::is_limited(&urls.api).await?;
let limit_information;
@ -114,9 +114,9 @@ impl Instance {
/// Shorthand for `Instance::new(UrlBundle::from_root_domain(root_domain).await?)`.
///
/// If `limited` is `true`, then Chorus will track and enforce rate limits for this instance.
pub async fn from_root_url(root_url: &str) -> ChorusResult<Instance> {
pub async fn new(root_url: &str) -> ChorusResult<Instance> {
let urls = UrlBundle::from_root_url(root_url).await?;
Instance::new(urls).await
Instance::from_url_bundle(urls).await
}
pub async fn is_limited(api_url: &str) -> ChorusResult<Option<LimitsConfiguration>> {

View File

@ -140,6 +140,12 @@ pub mod voice;
/// # Notes
/// All the urls can be found on the /api/policies/instance/domains endpoint of a spacebar server
pub struct UrlBundle {
/// The root url of an Instance. Usually, this would be the url where `.well-known/spacebar` can
/// be located under. If the instance you are connecting to for some reason does not have a
/// `.well-known` set up (for example, if it is a local/testing instance), you can use the api
/// url as a substitute.
/// Ex: `https://spacebar.chat`
pub root: String,
/// The api's url.
/// Ex: `https://old.server.spacebar.chat/api`
pub api: String,
@ -154,8 +160,9 @@ pub struct UrlBundle {
impl UrlBundle {
/// Creates a new UrlBundle from the relevant urls.
pub fn new(api: String, wss: String, cdn: String) -> Self {
pub fn new(root: String, api: String, wss: String, cdn: String) -> Self {
Self {
root: UrlBundle::parse_url(root),
api: UrlBundle::parse_url(api),
wss: UrlBundle::parse_url(wss),
cdn: UrlBundle::parse_url(cdn),
@ -240,7 +247,12 @@ impl UrlBundle {
.json::<types::types::domains_configuration::Domains>()
.await
{
Ok(UrlBundle::new(body.api_endpoint, body.gateway, body.cdn))
Ok(UrlBundle::new(
url.to_string(),
body.api_endpoint,
body.gateway,
body.cdn,
))
} else {
Err(ChorusError::RequestFailed {
url: url.to_string(),

View File

@ -39,10 +39,9 @@ pub enum VoiceProtocol {
///
/// See <https://discord-userdoccers.vercel.app/topics/voice-connections#protocol-data-structure>
pub struct SelectProtocolData {
/// Our external ip
// FIXME: This is a string
pub address: Vec<u8>,
/// Our external udp port
/// Our external ip we got from ip discovery
pub address: String,
/// Our external udp port we got from id discovery
pub port: u16,
/// The mode of encryption to use
pub mode: VoiceEncryptionMode,

View File

@ -111,6 +111,8 @@ impl Observer<VoiceReady> for VoiceHandler {
*self.voice_udp_connection.lock().await = Some(udp_handle.clone());
let string_ip_address = String::from_utf8(ip_discovery.address).expect("Ip discovery gave non string ip");
self.voice_gateway_connection
.lock()
.await
@ -119,7 +121,7 @@ impl Observer<VoiceReady> for VoiceHandler {
.send_select_protocol(SelectProtocol {
protocol: VoiceProtocol::Udp,
data: SelectProtocolData {
address: ip_discovery.address,
address: string_ip_address,
port: ip_discovery.port,
mode: VoiceEncryptionMode::Xsalsa20Poly1305,
},

View File

@ -52,12 +52,7 @@ impl TestBundle {
// Set up a test by creating an Instance and a User. Reduces Test boilerplate.
pub(crate) async fn setup() -> TestBundle {
let urls = UrlBundle::new(
"http://localhost:3001/api".to_string(),
"ws://localhost:3001".to_string(),
"http://localhost:3001".to_string(),
);
let instance = Instance::new(urls.clone()).await.unwrap();
let instance = Instance::new("http://localhost:3001/api").await.unwrap();
// Requires the existance of the below user.
let reg = RegisterSchema {
username: "integrationtestuser".into(),
@ -114,6 +109,12 @@ pub(crate) async fn setup() -> TestBundle {
.await
.unwrap();
let urls = UrlBundle::new(
"http://localhost:3001/api".to_string(),
"http://localhost:3001/api".to_string(),
"ws://localhost:3001".to_string(),
"http://localhost:3001".to_string(),
);
TestBundle {
urls,
user,