2024-08-05 19:29:02 +02:00
use std ::error ::Error ;
use std ::fs ::File ;
use std ::io ::Read ;
2024-08-03 17:13:31 +02:00
use pandoc ::{ PandocError , PandocOutput } ;
use reqwest ::blocking ::Client ;
use serde ::Deserialize ;
2024-08-05 19:29:02 +02:00
use crate ::config_spec ::{ CfgField , CfgGroup } ;
2024-08-05 04:45:34 +02:00
pub const CONFIG : CfgGroup < 'static > = CfgGroup {
name : " wiki " ,
description : " API Settings for Mediawiki " ,
fields : & [
CfgField ::Default {
key : " server-url " ,
2024-08-07 04:17:46 +02:00
default : " https://wiki.berlin.ccc.de " ,
2024-08-05 04:45:34 +02:00
description : " Server running the wiki. " ,
} ,
CfgField ::Default {
key : " http-user " ,
default : " cccb-wiki " ,
description : " HTTP basic auth user name. " ,
} ,
CfgField ::Password { key : " http-password " , description : " HTTP basic auth password. " } ,
CfgField ::Default {
key : " api-user " ,
default : " PlenumBot@PlenumBot-PW1 " ,
description : " API Username associated with the bot account used for edits. " ,
} ,
CfgField ::Password {
key : " api-secret " ,
description : " API secret / \" password \" used for authenticating as the bot. " ,
} ,
] ,
} ;
2024-08-01 18:30:14 +02:00
2024-08-07 04:17:46 +02:00
pub struct Mediawiki {
server_url : String ,
http_user : String ,
http_password : String ,
is_dry_run : bool ,
client : Client ,
}
impl Mediawiki {
pub fn new (
server_url : & str , http_auth_user : & str , http_auth_password : & str , is_dry_run : bool ,
) -> Self {
Self {
server_url : server_url . to_string ( ) ,
http_user : http_auth_user . to_string ( ) ,
http_password : http_auth_password . to_string ( ) ,
is_dry_run ,
client : Client ::new ( ) ,
}
}
/// Authenticate with username and password on http basic auth
pub fn get_login_token ( & self ) -> Result < String , Box < dyn Error > > {
let url =
format! ( " {} /api.php?action=query&meta=tokens&type=login&format=json " , self . server_url ) ;
let resp = self
. client
. get ( url )
. basic_auth ( & self . http_user , Some ( & self . http_password ) )
. send ( ) ?
. text ( ) ? ;
let response_deserialized : QueryResponse = serde_json ::from_str ( & resp ) ? ;
Ok ( response_deserialized . query . tokens . logintoken )
}
}
2024-08-03 17:13:31 +02:00
#[ derive(Deserialize) ]
struct QueryResponse {
batchcomplete : String ,
query : QueryTokens ,
}
#[ derive(Deserialize) ]
struct QueryTokens {
tokens : Tokens ,
}
#[ derive(Deserialize) ]
struct Tokens {
logintoken : String ,
}
2024-08-01 18:30:14 +02:00
2024-08-03 17:13:31 +02:00
pub fn pad_ins_wiki ( old_pad_content : String ) {
convert_md_to_mediawiki ( old_pad_content ) ;
2024-08-01 18:30:14 +02:00
// Textdatei wieder einlesen
2024-08-03 17:13:31 +02:00
2024-08-01 18:30:14 +02:00
// Passwörter aus Datenbank lesen (ToBeDone)
2024-08-03 17:13:31 +02:00
/*
2024-08-01 18:30:14 +02:00
let plenum_bot_user = String ::from ( " PlenumBot@PlenumBot-PW1 " ) ;
let plenum_bot_pw = String ::from ( " **OLD_API_PW_REMOVED** " ) ;
2024-08-02 22:29:22 +02:00
let login_token = login_to_mediawiki ( plenum_bot_user . clone ( ) , plenum_bot_pw . clone ( ) )
. expect ( " Fehler beim Einloggen! " ) ;
2024-08-02 21:19:54 +02:00
println! ( " plenum_bot_user: {plenum_bot_user} , plenum_bot_pw: {plenum_bot_pw} , login_token: {login_token} " )
2024-08-03 17:13:31 +02:00
* /
2024-08-02 21:19:54 +02:00
}
2024-08-03 17:13:31 +02:00
/// Converts one file type into another using pandoc and saves the result as a txt file
fn pandoc_convert ( old_pad_content : String , output_filepath : & str , input_format : pandoc ::InputFormat , output_format : pandoc ::OutputFormat ) -> Result < PandocOutput , PandocError > {
2024-08-02 21:19:54 +02:00
//Convert Markdown into Mediawiki
// Vanilla pandoc Befehl: pandoc --from markdown --to mediawiki --no-highlight
let mut p = pandoc ::new ( ) ;
p . set_input ( pandoc ::InputKind ::Pipe ( old_pad_content ) ) ;
2024-08-03 17:13:31 +02:00
p . set_input_format ( input_format , vec! [ ] ) ;
p . set_output ( pandoc ::OutputKind ::File ( output_filepath . parse ( ) . unwrap ( ) ) ) ;
p . set_output_format ( output_format , vec! [ ] ) ;
2024-08-02 22:29:22 +02:00
p . execute ( )
2024-08-02 21:19:54 +02:00
}
2024-08-01 18:30:14 +02:00
2024-08-03 17:13:31 +02:00
/// Reads a text file from a specified path and returns it as a String
2024-08-07 04:17:46 +02:00
fn read_txt_file ( filepath : & str ) -> String {
let mut file = File ::open ( filepath )
. expect ( & * format! ( " Fehler beim öffnen der Textdatei mit Pfad {filepath} ! " ) ) ;
2024-08-03 17:13:31 +02:00
let mut contents = String ::new ( ) ;
2024-08-07 04:17:46 +02:00
file . read_to_string ( & mut contents )
. expect ( " Fehler beim auslesen der MediaWiki-Textdatei! " )
. to_string ( )
2024-08-03 17:13:31 +02:00
}
2024-08-02 22:29:22 +02:00
2024-08-03 17:13:31 +02:00
/// Takes a Sting in the Markdown format and returns a String in the mediawiki Format
2024-08-07 04:17:46 +02:00
fn convert_md_to_mediawiki ( old_pad_content : String ) -> String {
// TODO: use tempfile="3.3", make it a NamedTempFile::new()?;
// or alternatively use piped stdout to avoid files entirely
2024-08-03 17:13:31 +02:00
let output_filepath : & str = " ./pandoc_mediawiki.txt " ;
pandoc_convert ( old_pad_content , output_filepath , pandoc ::InputFormat ::Markdown , pandoc ::OutputFormat ::MediaWiki ) . expect ( " Fehler beim Umwandeln des und speichern des Pads in eine mediawiki-Textdatei " ) ;
read_txt_file ( output_filepath )
2024-08-02 22:29:22 +02:00
}