7 Commits
0.1.5 ... 0.1.6

Author SHA1 Message Date
ede6aaf8aa run cargo update 2024-07-26 11:23:59 +02:00
a5b36ab0fb add timestamps to printing statements 2024-07-26 11:19:47 +02:00
c6afed3b11 add any pool in prep for differenc db backends 2024-07-25 18:21:31 +02:00
2c4c78125e bump dependency version 2024-07-25 18:18:09 +02:00
Hannes Kuchelmeister
365bb52772 Merge pull request #18 from 13hannes11/dependabot/cargo/openssl-0.10.66
Bump openssl from 0.10.64 to 0.10.66
2024-07-23 10:13:27 +02:00
dependabot[bot]
4bf9f20fd5 Bump openssl from 0.10.64 to 0.10.66
Bumps [openssl](https://github.com/sfackler/rust-openssl) from 0.10.64 to 0.10.66.
- [Release notes](https://github.com/sfackler/rust-openssl/releases)
- [Commits](https://github.com/sfackler/rust-openssl/compare/openssl-v0.10.64...openssl-v0.10.66)

---
updated-dependencies:
- dependency-name: openssl
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-22 18:14:08 +00:00
Hannes Kuchelmeister
884fa56545 Update version number in cargo.toml to match actual version number 2024-04-26 08:22:05 +02:00
4 changed files with 946 additions and 543 deletions

1430
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,17 +1,16 @@
[package] [package]
name = "ics-proxy" name = "ics-proxy"
version = "0.1.2" version = "0.1.5"
edition = "2021" edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
actix-web = "4.0" actix-web = "4.8"
uuid = { version = "1.0", features = ["v4"] } uuid = { version = "1.10", features = ["v4"] }
url = "2.2" url = "2.5"
reqwest = { version = "0.11", features = ["blocking"] } reqwest = { version = "0.12", features = ["blocking"] }
tera = "1.15" tera = "1.20"
dotenv = "0.15" dotenv = "0.15"
sqlx = { version = "0.8", features = ["sqlite", "any", "tls-rustls", "runtime-tokio"] }
sqlx = { version = "0.5", features = ["sqlite", "runtime-actix-rustls"] }
chrono = "0.4.38" chrono = "0.4.38"

View File

@@ -5,15 +5,17 @@ use actix_web::http::StatusCode;
use actix_web::web::Data; use actix_web::web::Data;
use actix_web::{error, web, App, Error, HttpRequest, HttpResponse, HttpServer, Responder, Result}; use actix_web::{error, web, App, Error, HttpRequest, HttpResponse, HttpServer, Responder, Result};
use sqlx::{Pool, Sqlite, SqlitePool}; use sqlx::{Pool, Sqlite, SqlitePool};
use std::time::SystemTime;
use tera::Tera; use tera::Tera;
use uuid::Uuid; use uuid::Uuid;
extern crate dotenv; extern crate dotenv;
use actix_web::middleware::Logger;
use dotenv::dotenv; use dotenv::dotenv;
mod model; mod model;
use model::Link; use chrono::DateTime;
use chrono::Utc;
use model::Link;
const REDIRECT_TIMEOUT_S: i32 = 2; const REDIRECT_TIMEOUT_S: i32 = 2;
#[derive(Clone)] #[derive(Clone)]
@@ -23,7 +25,8 @@ struct Config {
async fn make_ics_request(req: HttpRequest, db_pool: web::Data<Pool<Sqlite>>) -> impl Responder { async fn make_ics_request(req: HttpRequest, db_pool: web::Data<Pool<Sqlite>>) -> impl Responder {
let id = req.match_info().get("id").unwrap_or(""); let id = req.match_info().get("id").unwrap_or("");
println!("serving ics request"); let now = <SystemTime as Into<DateTime<Utc>>>::into(SystemTime::now()).to_rfc3339();
println!("{now} serving ics request");
match Uuid::parse_str(id) { match Uuid::parse_str(id) {
Ok(uuid) => match Link::find_by_uuid(uuid.to_string(), db_pool).await { Ok(uuid) => match Link::find_by_uuid(uuid.to_string(), db_pool).await {
Ok(link) => match reqwest::get(link.destination).await { Ok(link) => match reqwest::get(link.destination).await {
@@ -60,7 +63,8 @@ async fn edit_page(
db_pool: web::Data<Pool<Sqlite>>, db_pool: web::Data<Pool<Sqlite>>,
conf: web::Data<Config>, conf: web::Data<Config>,
) -> Result<HttpResponse, Error> { ) -> Result<HttpResponse, Error> {
println!("serving edit page"); let now = <SystemTime as Into<DateTime<Utc>>>::into(SystemTime::now()).to_rfc3339();
println!("{now} serving edit page");
// one uuid: 9228c1a4-8956-4f1c-8b5f-53cc575bd78 // one uuid: 9228c1a4-8956-4f1c-8b5f-53cc575bd78
if let Some(uuid_str) = query.get("uuid") { if let Some(uuid_str) = query.get("uuid") {
match Uuid::parse_str(uuid_str) { match Uuid::parse_str(uuid_str) {
@@ -258,7 +262,8 @@ async fn index_process(
// store tera template in application state // store tera template in application state
async fn index(tmpl: web::Data<tera::Tera>) -> Result<HttpResponse, Error> { async fn index(tmpl: web::Data<tera::Tera>) -> Result<HttpResponse, Error> {
// TODO: add option to prefill link with parameter // TODO: add option to prefill link with parameter
println!("serving index page"); let now = <SystemTime as Into<DateTime<Utc>>>::into(SystemTime::now()).to_rfc3339();
println!("{now} serving index page");
let s = tmpl let s = tmpl
.render("index.html", &tera::Context::new()) .render("index.html", &tera::Context::new())
.map_err(|_| error::ErrorInternalServerError("Template error"))?; .map_err(|_| error::ErrorInternalServerError("Template error"))?;
@@ -303,6 +308,7 @@ async fn main() -> std::io::Result<()> {
let tera = Tera::new("templates/**/*.html").unwrap(); let tera = Tera::new("templates/**/*.html").unwrap();
App::new() App::new()
.wrap(Logger::new("%a %{User-Agent}i"))
.app_data(Data::new(db_pool.clone())) // pass database pool to application so we can access it inside handlers .app_data(Data::new(db_pool.clone())) // pass database pool to application so we can access it inside handlers
.app_data(Data::new(tera)) .app_data(Data::new(tera))
.app_data(Data::new(conf.clone())) .app_data(Data::new(conf.clone()))

View File

@@ -1,9 +1,8 @@
use actix_web::web; use actix_web::web;
use chrono::DateTime; use chrono::DateTime;
use chrono::Utc; use chrono::Utc;
use std::time::SystemTime;
use sqlx::{Pool, Sqlite}; use sqlx::{Pool, Sqlite};
use std::time::SystemTime;
// Change to strings if to much headache // Change to strings if to much headache
pub struct Link { pub struct Link {
@@ -16,27 +15,24 @@ impl Link {
uuid: String, uuid: String,
pool: web::Data<Pool<Sqlite>>, pool: web::Data<Pool<Sqlite>>,
) -> Result<Link, sqlx::Error> { ) -> Result<Link, sqlx::Error> {
let now = <SystemTime as Into<DateTime<Utc>>>::into(SystemTime::now()).to_rfc3339();
let mut tx = pool.begin().await?; let mut tx = pool.begin().await?;
println!("find by uuid {uuid}"); println!("{now} find by uuid {uuid}");
let rec = sqlx::query!( let rec = sqlx::query!(
r#" r#"
SELECT * FROM links WHERE uuid = $1 SELECT * FROM links WHERE uuid = $1
"#, "#,
uuid uuid
) )
.fetch_one(&mut tx) .fetch_one(&mut *tx)
.await?; .await?;
let now = SystemTime::now();
let now: DateTime<Utc> = now.into();
let now = now.to_rfc3339();
sqlx::query!( sqlx::query!(
r#" UPDATE links SET last_used = $1 WHERE uuid = $2"#, r#" UPDATE links SET last_used = $1 WHERE uuid = $2"#,
now, now,
uuid, uuid,
) )
.execute(&mut tx) .execute(&mut *tx)
.await?; .await?;
tx.commit().await?; tx.commit().await?;
@@ -50,10 +46,10 @@ impl Link {
sqlx::query("UPDATE links SET destination = $2 WHERE uuid = $1;") sqlx::query("UPDATE links SET destination = $2 WHERE uuid = $1;")
.bind(&link.uuid) .bind(&link.uuid)
.bind(&link.destination) .bind(&link.destination)
.execute(&mut tx) .execute(&mut *tx)
.await?; .await?;
let now = <SystemTime as Into<DateTime<Utc>>>::into(SystemTime::now()).to_rfc3339();
println!("update uuid {}", link.uuid); println!("{} update uuid {}", now, link.uuid);
tx.commit().await?; tx.commit().await?;
Ok(link) Ok(link)
} }
@@ -62,10 +58,10 @@ impl Link {
sqlx::query("INSERT INTO links (uuid, destination) VALUES ($1, $2);") sqlx::query("INSERT INTO links (uuid, destination) VALUES ($1, $2);")
.bind(&link.uuid) .bind(&link.uuid)
.bind(&link.destination) .bind(&link.destination)
.execute(&mut tx) .execute(&mut *tx)
.await?; .await?;
let now = <SystemTime as Into<DateTime<Utc>>>::into(SystemTime::now()).to_rfc3339();
println!("create uuid {}", link.uuid); println!("{} create uuid {}", now, link.uuid);
tx.commit().await?; tx.commit().await?;
Ok(link) Ok(link)
} }