From: Nishi Date: Tue, 1 Oct 2024 18:07:27 +0000 (+0000) Subject: rpc works X-Git-Url: https://git.chaotic.ninja/gitweb/nishi/?a=commitdiff_plain;h=f86f4684e4a28899efd41dd9ea8751ec34a0b45d;p=koakuma.git rpc works git-svn-id: file:///raid/svn-personal/koakuma/trunk@5 219d0f9c-2d94-d447-890a-813e76b88fe9 --- diff --git a/Tool/create-project.in b/Tool/create-project.in index 76aae3e..76d5d3a 100644 --- a/Tool/create-project.in +++ b/Tool/create-project.in @@ -1,5 +1,6 @@ #!/usr/bin/env tclsh # $Id$ +package require tdom set RPC_URL "http://127.0.0.1/koakuma/rpc" foreach arg $argv { if { [string range "$arg" 0 0] == "-" } { @@ -17,6 +18,7 @@ foreach path [glob "@@PREFIX@@/lib/koakuma/utility/*.tcl"] { if { [info exists "env(KOAKUMA_RPC)"] } { set RPC_URL "$env(KOAKUMA_RPC)" } +set RPC_URL "[regsub {/+$} "$RPC_URL" ""]" puts -nonewline "Authentication: " set status [::rpc::require-auth] if { $status == 1 } { @@ -31,4 +33,37 @@ if { $status == 1 } { } else { puts "Not required" } -::rpc::send + +dom createNodeCmd -tagName "name" -jsonType NONE elementNode keyName +dom createNodeCmd -tagName "description" -jsonType NONE elementNode keyDescription +dom createNodeCmd -tagName "vcs" -jsonType NONE elementNode keyVCS +dom createNodeCmd -tagName "url" -jsonType NONE elementNode keyURL + +dom createNodeCmd -jsonType STRING textNode valueString + +set doc [dom createDocumentNode] + +proc ask_for {show var} { + upvar 1 $var $var + puts -nonewline "$show: " + flush stdout + set $var "[gets stdin]" +} + +ask_for "Name" name +ask_for "Description" description +ask_for "VCS" vcs +ask_for "VCS URL" url + +$doc appendFromScript { + keyName {valueString "$name"} + keyDescription {valueString "$description"} + keyVCS {valueString "$vcs"} + keyURL {valueString "$url"} +} +set result [::rpc::send "/create-project" "[$doc asJSON]"] +if { [lindex $result 0] == 200 } { +} else { + set doc [dom parse -json "[lindex $result 1]"] + puts "Error: [$doc selectNodes "string(/error)"]" +} diff --git a/Utility/rpc.tcl b/Utility/rpc.tcl index 609782f..16fa0fc 100644 --- a/Utility/rpc.tcl +++ b/Utility/rpc.tcl @@ -20,21 +20,21 @@ namespace eval rpc { set username "" set password "" proc ask-auth {} { - upvar 1 username username - upvar 1 password password + global username + global password puts -nonewline "Username: " flush stdout - set username "[gets stdin]" + set ::rpc::username "[gets stdin]" puts -nonewline "Password: " flush stdout exec stty -echo - set password "[gets stdin]" + set ::rpc::password "[gets stdin]" exec stty echo puts "" set headers "" lappend headers "Authorization" - lappend headers "Basic [::base64::encode -wrapchar "" "$username:$password"]" + lappend headers "Basic [::base64::encode -wrapchar "" "$::rpc::username:$::rpc::password"]" global RPC_URL set tok [::http::geturl "$RPC_URL" -headers $headers] @@ -46,4 +46,19 @@ namespace eval rpc { } return 0 } + proc send {path content} { + set headers "" + global RPC_URL + if { "$::rpc::username" != "" } { + lappend headers "Authorization" + lappend headers "Basic [::base64::encode -wrapchar "" "$::rpc::username:$::rpc::password"]" + } + set tok [::http::geturl "$RPC_URL$path" -headers $headers -type "application/json" -query "$content"] + set code [::http::ncode $tok] + set body "[::http::data $tok]" + ::http::cleanup $tok + lappend result "$code" + lappend result "$body" + return $result + } } diff --git a/koakuma.cgi.in b/koakuma.cgi.in index 9a7aeb6..870d273 100644 --- a/koakuma.cgi.in +++ b/koakuma.cgi.in @@ -54,6 +54,7 @@ if { [catch { package require tdom dom createNodeCmd -tagName "rpc" elementNode rootXML dom createNodeCmd -tagName "version" -jsonType NONE elementNode keyVersion + dom createNodeCmd -tagName "error" -jsonType NONE elementNode keyError dom createNodeCmd -jsonType STRING textNode valueString }] } { crash "Failed to load tDOM" @@ -67,6 +68,16 @@ if { [catch { crash "Could not load components" } +set data "" + +while { [gets stdin line] >= 0 } { + if { "$data" == "" } { + set data "$line" + } else { + set data "$data\n$line" + } +} + set toc "" set result "" set content "" @@ -265,14 +276,59 @@ if { [catch { rputs "$content" end_html 1 } elseif { [regexp {^/rpc(/.*)?$} "$path"] } { - rputs "" regexp {^/rpc(/.*)?$} "$path" -> api set doc [dom createDocumentNode] - set root $doc + $doc appendFromScript { + keyVersion {valueString "$KOAKUMA_VERSION"} + } if { "$api" == "" || "$api" == "/" } { + rputs "" + rputs "[$doc asJSON]" + } elseif { "$api" == "/create-project" } { + if { [catch {dom parse -json "$data" clidoc}] } { + rputs "Status: 400 Bad Request" + $doc appendFromScript { + keyError {valueString "Bad JSON"} + } + } else { + set projname "[$clidoc selectNodes "string(/name)"]" + set projdescription "[$clidoc selectNodes "string(/description)"]" + set vcs "[$clidoc selectNodes "string(/vcs)"]" + set url "[$clidoc selectNodes "string(/url)"]" + if { "$projname" == "" || "$projdescription" == "" || "$vcs" == "" || "$url" == "" } { + rputs "Status: 400 Bad Request" + $doc appendFromScript { + keyError {valueString "Required field missing"} + } + } else { + set has_vcs 0 + loop_components { + upvar 1 has_vcs has_vcs + upvar 1 vcs vcs + if { "$name" == "$vcs" } { + set has_vcs 1 + break + } + } + if { $has_vcs == 0 } { + rputs "Status: 400 Bad Request" + $doc appendFromScript { + keyError {valueString "Not a valid VCS"} + } + } else { + open_projects + close_projects + } + } + } + rputs "" + rputs "[$doc asJSON]" + } else { $root appendFromScript { - keyVersion {valueString "$KOAKUMA_VERSION"} + keyError {valueString "No such endpoint"} } + rputs "Status: 404 Not Found" + rputs "" rputs "[$doc asJSON]" } } elseif { [regexp {^/project/[^/]+.*$} "$path"] } {