1
0
Fork 0
mirror of https://github.com/SinTan1729/chhoto-url synced 2024-12-28 08:28:36 -06:00

Compare commits

...

4 commits

14 changed files with 53 additions and 10 deletions

View file

@ -1,3 +1,6 @@
# SPDX-FileCopyrightText: 2023 Sayantan Santra <sayantan.santra689@gmail.com>
# SPDX-License-Identifier: MIT
FROM lukemathwalker/cargo-chef:latest-rust-slim AS chef FROM lukemathwalker/cargo-chef:latest-rust-slim AS chef
WORKDIR /chhoto-url WORKDIR /chhoto-url

View file

@ -1,3 +1,6 @@
# SPDX-FileCopyrightText: 2023 Sayantan Santra <sayantan.santra689@gmail.com>
# SPDX-License-Identifier: MIT
FROM scratch as builder-amd64 FROM scratch as builder-amd64
COPY ./actix/target/x86_64-unknown-linux-musl/release/chhoto-url /chhoto-url COPY ./actix/target/x86_64-unknown-linux-musl/release/chhoto-url /chhoto-url

View file

@ -1,3 +1,6 @@
# SPDX-FileCopyrightText: 2023 Sayantan Santra <sayantan.santra689@gmail.com>
# SPDX-License-Identifier: MIT
# .env file has the variables $DOCKER_USERNAME and $PASSWORD defined # .env file has the variables $DOCKER_USERNAME and $PASSWORD defined
include .env include .env

View file

@ -1,3 +1,6 @@
<!-- SPDX-FileCopyrightText: 2023 Sayantan Santra <sayantan.santra689@gmail.com> -->
<!-- SPDX-License-Identifier: MIT -->
[![docker-pulls](https://img.shields.io/docker/pulls/sintan1729/chhoto-url)](https://hub.docker.com/r/sintan1729/chhoto-url) [![docker-pulls](https://img.shields.io/docker/pulls/sintan1729/chhoto-url)](https://hub.docker.com/r/sintan1729/chhoto-url)
[![maintainer](https://img.shields.io/badge/maintainer-SinTan1729-blue)](https://github.com/SinTan1729) [![maintainer](https://img.shields.io/badge/maintainer-SinTan1729-blue)](https://github.com/SinTan1729)
![commit-since-latest-release](https://img.shields.io/github/commits-since/SinTan1729/chhoto-url/latest?sort=semver&label=commits%20since%20latest%20release) ![commit-since-latest-release](https://img.shields.io/github/commits-since/SinTan1729/chhoto-url/latest?sort=semver&label=commits%20since%20latest%20release)
@ -39,6 +42,7 @@ for small. URL means, well... URL. So the name simply means Small URL.
stays under 5MB under normal use.) stays under 5MB under normal use.)
- Counts number of hits for each short link in a privacy respecting way - Counts number of hits for each short link in a privacy respecting way
i.e. only the hit is recorded, and nothing else. i.e. only the hit is recorded, and nothing else.
- Has a mobile friendly UI.
- Allows setting the URL of your website, in case you want to conveniently - Allows setting the URL of your website, in case you want to conveniently
generate short links locally. generate short links locally.
- Links are stored in an SQLite database. - Links are stored in an SQLite database.

View file

@ -1,3 +1,6 @@
# SPDX-FileCopyrightText: 2023 Sayantan Santra <sayantan.santra689@gmail.com>
# SPDX-License-Identifier: MIT
[package] [package]
name = "chhoto-url" name = "chhoto-url"
version = "5.2.4" version = "5.2.4"

View file

@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: 2023 Sayantan Santra <sayantan.santra689@gmail.com>
// SPDX-License-Identifier: MIT
use actix_session::Session; use actix_session::Session;
use std::{env, time::SystemTime}; use std::{env, time::SystemTime};

View file

@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: 2023 Sayantan Santra <sayantan.santra689@gmail.com>
// SPDX-License-Identifier: MIT
use rusqlite::Connection; use rusqlite::Connection;
use serde::Serialize; use serde::Serialize;

View file

@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: 2023 Sayantan Santra <sayantan.santra689@gmail.com>
// SPDX-License-Identifier: MIT
use actix_files::{Files, NamedFile}; use actix_files::{Files, NamedFile};
use actix_session::{storage::CookieSessionStore, Session, SessionMiddleware}; use actix_session::{storage::CookieSessionStore, Session, SessionMiddleware};
use actix_web::{ use actix_web::{
@ -9,7 +12,7 @@ use actix_web::{
App, Either, HttpResponse, HttpServer, Responder, App, Either, HttpResponse, HttpServer, Responder,
}; };
use rusqlite::Connection; use rusqlite::Connection;
use std::env; use std::{env, io::Result};
mod auth; mod auth;
mod database; mod database;
mod utils; mod utils;
@ -30,12 +33,12 @@ async fn add_link(req: String, data: web::Data<AppState>, session: Session) -> H
if auth::validate(session) { if auth::validate(session) {
let out = utils::add_link(req, &data.db); let out = utils::add_link(req, &data.db);
if out.0 { if out.0 {
HttpResponse::Ok().body(out.1) HttpResponse::Created().body(out.1)
} else { } else {
HttpResponse::BadRequest().body(out.1) HttpResponse::Conflict().body(out.1)
} }
} else { } else {
HttpResponse::Forbidden().body("Not logged in!") HttpResponse::Unauthorized().body("Not logged in!")
} }
} }
@ -45,7 +48,7 @@ async fn getall(data: web::Data<AppState>, session: Session) -> HttpResponse {
if auth::validate(session) { if auth::validate(session) {
HttpResponse::Ok().body(utils::getall(&data.db)) HttpResponse::Ok().body(utils::getall(&data.db))
} else { } else {
HttpResponse::Forbidden().body("Not logged in!") HttpResponse::Unauthorized().body("Not logged in!")
} }
} }
@ -56,7 +59,7 @@ async fn siteurl(session: Session) -> HttpResponse {
let site_url = env::var("site_url").unwrap_or(String::from("unset")); let site_url = env::var("site_url").unwrap_or(String::from("unset"));
HttpResponse::Ok().body(site_url) HttpResponse::Ok().body(site_url)
} else { } else {
HttpResponse::Forbidden().body("Not logged in!") HttpResponse::Unauthorized().body("Not logged in!")
} }
} }
@ -103,7 +106,7 @@ async fn login(req: String, session: Session) -> HttpResponse {
if let Ok(password) = env::var("password") { if let Ok(password) = env::var("password") {
if password != req { if password != req {
eprintln!("Failed login attempt!"); eprintln!("Failed login attempt!");
return HttpResponse::Forbidden().body("Wrong password!"); return HttpResponse::Unauthorized().body("Wrong password!");
} }
} }
// Return Ok if no password was set on the server side // Return Ok if no password was set on the server side
@ -127,12 +130,12 @@ async fn delete_link(
HttpResponse::NotFound().body("Not found!") HttpResponse::NotFound().body("Not found!")
} }
} else { } else {
HttpResponse::Forbidden().body("Not logged in!") HttpResponse::Unauthorized().body("Not logged in!")
} }
} }
#[actix_web::main] #[actix_web::main]
async fn main() -> std::io::Result<()> { async fn main() -> Result<()> {
env_logger::init_from_env(env_logger::Env::new().default_filter_or("warn")); env_logger::init_from_env(env_logger::Env::new().default_filter_or("warn"));
// Generate session key in runtime so that restart invalidates older logins // Generate session key in runtime so that restart invalidates older logins

View file

@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: 2023 Sayantan Santra <sayantan.santra689@gmail.com>
// SPDX-License-Identifier: MIT
use nanoid::nanoid; use nanoid::nanoid;
use rand::seq::SliceRandom; use rand::seq::SliceRandom;
use regex::Regex; use regex::Regex;

View file

@ -1,3 +1,6 @@
# SPDX-FileCopyrightText: 2023 Sayantan Santra <sayantan.santra689@gmail.com>
# SPDX-License-Identifier: MIT
services: services:
chhoto-url: chhoto-url:
image: sintan1729/chhoto-url:latest image: sintan1729/chhoto-url:latest

View file

@ -1,3 +1,6 @@
<!-- SPDX-FileCopyrightText: 2023 Sayantan Santra <sayantan.santra689@gmail.com> -->
<!-- SPDX-License-Identifier: MIT -->
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">

View file

@ -1,3 +1,6 @@
<!-- SPDX-FileCopyrightText: 2023 Sayantan Santra <sayantan.santra689@gmail.com> -->
<!-- SPDX-License-Identifier: MIT -->
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>

View file

@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: 2023 Sayantan Santra <sayantan.santra689@gmail.com>
// SPDX-License-Identifier: MIT
const prepSubdir = (link) => { const prepSubdir = (link) => {
let thisPage = new URL(window.location.href); let thisPage = new URL(window.location.href);
let subdir = thisPage.pathname; let subdir = thisPage.pathname;

View file

@ -1,3 +1,6 @@
/* SPDX-FileCopyrightText: 2023 Sayantan Santra <sayantan.santra689@gmail.com> */
/* SPDX-License-Identifier: MIT */
@font-face { @font-face {
font-family: Montserrat; font-family: Montserrat;
src: url('Montserrat-VF.woff2'); src: url('Montserrat-VF.woff2');