Compare commits

..

No commits in common. "9af4fa56e174de927c43cdf326db1e52d2e44104" and "234e2ccaa3b7021f81513dc451fffb4b25df8353" have entirely different histories.

6 changed files with 20 additions and 40 deletions

View File

@ -12,20 +12,18 @@ impl Error {
impl From<git2::Error> for Error { impl From<git2::Error> for Error {
fn from(giterr: git2::Error) -> Self { fn from(giterr: git2::Error) -> Self {
// panic!()
Error::BadGateway(format!("{}", giterr)) Error::BadGateway(format!("{}", giterr))
} }
} }
impl From<std::io::Error> for Error {
fn from(ioerr: std::io::Error) -> Self {
Error::BadGateway(format!("{}", ioerr))
}
}
impl From<Error> for actix_web::error::Error { impl From<Error> for actix_web::error::Error {
fn from(e: Error) -> Self { fn from(e: Error) -> Self {
match e { match e {
Error::BadGateway(msg) => {HttpResponseBuilder::new(StatusCode::BAD_GATEWAY).body(msg).into()} Error::BadGateway(msg) => {HttpResponseBuilder::new(StatusCode::BAD_GATEWAY).body(msg).into()}
Error::Unauthorized(realm) => {AuthenticationError::from(basic::Config::default().realm(realm)).into()}} Error::Unauthorized(msg) => {
let config : basic::Config = Default::default();
AuthenticationError::from(config).into()}
}
} }
} }

View File

@ -1,4 +1,3 @@
pub struct Gitust { pub struct Gitust {
pub repo_root_path : String, pub repo_root_path : String,
pub session_key : String,
} }

View File

@ -14,7 +14,6 @@ use tokio::process::{Child, Command};
use crate::gitust::Gitust; use crate::gitust::Gitust;
use crate::reader::ToStream; use crate::reader::ToStream;
use crate::error;
//#[get("/git/{owner}/{repo}.git/{path:.*}")] //#[get("/git/{owner}/{repo}.git/{path:.*}")]
pub async fn git_proto( pub async fn git_proto(
@ -23,7 +22,7 @@ pub async fn git_proto(
mut req: HttpRequest, mut req: HttpRequest,
gitust : web::Data<Gitust>, gitust : web::Data<Gitust>,
auth : BasicAuth, auth : BasicAuth,
) -> Result<HttpResponse, error::Error>{ ) -> io::Result<HttpResponse>{
//println!("enter git_proto"); //println!("enter git_proto");
let mut cmd = Command::new("git"); let mut cmd = Command::new("git");
cmd.arg("http-backend"); cmd.arg("http-backend");

View File

@ -155,16 +155,13 @@ async fn main() -> std::io::Result<()> {
env_logger::from_env(Env::default().default_filter_or("info")).init(); env_logger::from_env(Env::default().default_filter_or("info")).init();
HttpServer::new(|| { HttpServer::new(|| {
let auth = HttpAuthentication::basic(basic_auth_validator); let auth = HttpAuthentication::basic(basic_auth_validator);
let gitust = Gitust {
repo_root_path: "/home/hubert/gitust".to_string(),
session_key: "oWe0ait9bi2Ohyiod2eeXirao1Oochie".to_string(),
};
let session_key = (&gitust.session_key).as_bytes();
App::new() App::new()
.data(Gitust {
repo_root_path: "/home/hubert/gitust".to_string(),
})
.wrap(Logger::default()) .wrap(Logger::default())
// .wrap(Logger::new("%a %{User-Agent}i")) // .wrap(Logger::new("%a %{User-Agent}i"))
.wrap(CookieSession::signed(session_key).secure(false)) .wrap(CookieSession::signed(&[0; 32]).secure(false))
.data(gitust)
.service(hello) .service(hello)
.service(echo) .service(echo)
.service(hello_test) .service(hello_test)
@ -186,6 +183,7 @@ async fn main() -> std::io::Result<()> {
) )
.service( .service(
webx::resource("/git/{user}/{repo}.git/{path:.*}") webx::resource("/git/{user}/{repo}.git/{path:.*}")
// .wrap(auth)
.route(webx::route().to(gitproto::git_proto)) .route(webx::route().to(gitproto::git_proto))
) )
.service( .service(

View File

@ -1,7 +1,7 @@
use std::path::Path; use std::path::Path;
use actix_web::web; use actix_web::web;
use actix_web_httpauth::extractors::basic; use actix_web_httpauth::extractors::basic::BasicAuth;
use actix_web::get; use actix_web::get;
use askama_actix::Template; use askama_actix::Template;
@ -60,10 +60,9 @@ pub async fn git_main(
web::Path((ownername, reponame)): web::Path<(String, String)>, web::Path((ownername, reponame)): web::Path<(String, String)>,
web::Query(GitWebQ{commit : commitnameopt, path : pathopt, branch : branchopt}) : web::Query<GitWebQ>, web::Query(GitWebQ{commit : commitnameopt, path : pathopt, branch : branchopt}) : web::Query<GitWebQ>,
gitust : web::Data<Gitust>, gitust : web::Data<Gitust>,
auth : Option<basic::BasicAuth>, auth : Option<BasicAuth>,
//auth : BasicAuth, //auth : BasicAuth,
) -> Result<GitMainTemplate<Vec<Entry>, Vec<(String, String)>>, error::Error> { ) -> Result<GitMainTemplate<Vec<Entry>, Vec<(String, String)>>, error::Error> {
// let authtorization = auth.ok_or(error::Error::Unauthorized("safe repo".to_string()))?;
let rootname = match pathopt { let rootname = match pathopt {
None => {"".to_string()} None => {"".to_string()}
Some(s) => { Some(s) => {
@ -83,8 +82,7 @@ pub async fn git_main(
}; };
let owner = Owner { name : ownername}; let owner = Owner { name : ownername};
let repo = Repository {name : reponame, owner}; let repo = Repository {name : reponame, owner};
// let user = User { name : "Hubert".to_string()}; let user = User { name : "Hubert".to_string()};
let user = auth.map(|auth| User{name : auth.user_id().to_string()});
// il faut ajouter le commit/branch dans la query // il faut ajouter le commit/branch dans la query
let path = rootname.split("/").map_accum("/git/".to_string() + &repo.owner.name + "/" + &repo.name, |str_ref, b| { let path = rootname.split("/").map_accum("/git/".to_string() + &repo.owner.name + "/" + &repo.name, |str_ref, b| {
let href = b + "/" + str_ref; let href = b + "/" + str_ref;
@ -106,5 +104,5 @@ pub async fn git_main(
} }
} }
} }
Ok(GitMainTemplate { repo, browse : entries, root : path, user_opt : user}) Ok(GitMainTemplate { repo, browse : entries, root : path, user_opt : Some(user)})
} }

View File

@ -1,21 +1,9 @@
use actix_web_httpauth::extractors::basic::BasicAuth; use actix_web_httpauth::extractors::basic::BasicAuth;
use std::borrow::Cow; use std::borrow::Cow;
pub trait AuthValidator { pub fn check_user(auth : BasicAuth) -> bool {
fn check_user(&self, name : &String, pwd : &String) -> bool; match auth.password() {
fn check_basic(&self, basic : BasicAuth) -> bool {
match basic.password() {
None => {false} None => {false}
Some(pwd) => {self.check_user(&basic.user_id().to_string(), &pwd.to_string())} Some(pwd) => {pwd.to_string().eq(&(auth.user_id().to_string() + "pwd"))}
}
}
}
pub struct TestValidator;
impl AuthValidator for TestValidator {
fn check_user(&self, name: &String, pwd: &String) -> bool {
pwd.eq(&(name.clone() + "pwd")) //stub!
} }
} }