beeb

joined 2 years ago
[–] beeb@lemm.ee 1 points 6 months ago (1 children)

Note that there are many security concerns with this, notably the fact that there is no input validation on the id path segment which means you can get the content of any file (e.g. http://localhost:3000/src%2Fmain.rs). It's also very easy to scrape the content of all the files because the IDs are easy to predict. When the server reboots, you will overwrite previously written files because the counter starts back at zero. Using a UUID would probably mostly solve both these issues.

[–] beeb@lemm.ee 1 points 6 months ago* (last edited 6 months ago) (2 children)

Here's a slightly more idiomatic version:

use std::{
    fs,
    sync::atomic::{AtomicUsize, Ordering},
};

use axum::{extract::Path, http::StatusCode, routing::get, routing::post, Router};

const MAX_FILE_SIZE: usize = 1024 * 1024 * 10;
static FILE_COUNT: AtomicUsize = AtomicUsize::new(0);

async fn handle(Path(id): Path<String>) -> (StatusCode, String) {
    match fs::read_to_string(id) {
        Ok(content) => (StatusCode::OK, content),
        Err(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()),
    }
}

async fn submit_handle(bytes: String) -> (StatusCode, String) {
    dbg!(&bytes);
    if bytes.len() > MAX_FILE_SIZE {
        // Don't store the file if it exceeds max size
        return (
            StatusCode::BAD_REQUEST,
            "ERROR: max size exceeded".to_string(),
        );
    }
    let path = FILE_COUNT.fetch_add(1, Ordering::SeqCst);
    if let Err(e) = fs::write(path.to_string(), bytes) {
        return (StatusCode::INTERNAL_SERVER_ERROR, e.to_string());
    }
    (StatusCode::CREATED, format!("http://localhost:3000/%7Bpath%7D"))
}

#[tokio::main]
async fn main() {
    let app = Router::new()
        .route("/", get(|| async { "Paste something in pastebin! use curl -X POST http://localhost:3000/submit -d 'this is some data'" }))
        .route("/{id}", get(handle))
        .route("/submit", post(submit_handle));

    let listener = tokio::net::TcpListener::bind("127.0.0.1:3000")
        .await
        .unwrap();
    axum::serve(listener, app).await.unwrap();
}

Note that there are no unwrap in the handlers which would absolutely want to avoid (it would crash your server). The endpoints now also return the correct HTTP code for each case. Some minor changes regarding creating the string values (use of format! and to_string() on string slices). Lemmy messes with the curly braces in the format! macro, there should be curly braces around the path variable name.

[–] beeb@lemm.ee 1 points 6 months ago (2 children)

Fetch add will return the old value before updating it so you don't need the ".load" call above it!

[–] beeb@lemm.ee 4 points 6 months ago* (last edited 6 months ago) (7 children)

I will probably post an improved version (if you like) but the main point is that you do not need the atomic to be mut, and so you don't need unsafe. Have a look at https://doc.rust-lang.org/std/sync/atomic/struct.AtomicUsize.html#method.fetch_add too

[–] beeb@lemm.ee 7 points 6 months ago (1 children)

Did you check out the Examples ?

[–] beeb@lemm.ee 3 points 6 months ago* (last edited 6 months ago)

I can only guess the print orientation but it looks like curling to me. Basically on that side, the part cooling fan (or lack thereof) is making the plastic of overhangs curl more than on the opposite side which gives you this bad surface finish. Otherwise maybe a retraction issue but that would probably show in other places too (oozing).

[–] beeb@lemm.ee 1 points 9 months ago

That was my point exactly :) glad you got it

[–] beeb@lemm.ee 2 points 9 months ago

Good to hear! I surely will give it a try, I've used nixos as my work distro for a little bit last year but they forced us to switch to Ubuntu.

[–] beeb@lemm.ee 2 points 9 months ago (2 children)

Literally copy pasted from a random repo as an illustration

[–] beeb@lemm.ee 7 points 9 months ago* (last edited 9 months ago) (4 children)

OP: "typescript is easy and rust is ugly"

Typescript :

export type PayloadActionCreator<
  P = void,
  T extends string = string,
  PA extends PrepareAction<P> | void = void
> = IfPrepareActionMethodProvided<
  PA,
  _ActionCreatorWithPreparedPayload<PA, T>,
  // else
  IsAny<
    P,
    ActionCreatorWithPayload<any, T>,
    IsUnknownOrNonInferrable<
      P,
      ActionCreatorWithNonInferrablePayload<T>,
      // else
      IfVoid<
        P,
        ActionCreatorWithoutPayload<T>,
        // else
        IfMaybeUndefined<
          P,
          ActionCreatorWithOptionalPayload<P, T>,
          // else
          ActionCreatorWithPayload<P, T>
        >
      >
    >
  >
>
[–] beeb@lemm.ee 3 points 9 months ago* (last edited 9 months ago) (4 children)

Okay so how is it with Cinammon, mate xfce? I know it's crap with Wayland and Xorg especially with nvidia drivers.

[–] beeb@lemm.ee 1 points 9 months ago* (last edited 9 months ago)

Check out Zen Browser

view more: ‹ prev next ›