From ebb3f5828c9ac684f18135b17152d714939578f8 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Fri, 4 Dec 2015 05:46:53 +0100 Subject: further improved simple web interface diff --git a/src/helsinki.at/rhimport/importer.go b/src/helsinki.at/rhimport/importer.go index 8c7e66e..e47bc05 100644 --- a/src/helsinki.at/rhimport/importer.go +++ b/src/helsinki.at/rhimport/importer.go @@ -26,7 +26,7 @@ package rhimport import ( // "bytes" - "fmt" + // "fmt" // "io" // "mime/multipart" // "net/http" @@ -36,7 +36,8 @@ import ( type ImportContext struct { Conf *Config UserName string - password string + Password string + Trusted bool GroupName string Cart int Channels int @@ -51,6 +52,8 @@ func NewImportContext(conf *Config, user string, group string, cart int) *Import ctx := new(ImportContext) ctx.Conf = conf ctx.UserName = user + ctx.Password = "" + ctx.Trusted = false ctx.GroupName = group ctx.Cart = cart ctx.Channels = 2 @@ -75,7 +78,7 @@ func (ctx *ImportContext) getPassword(cached bool) (err error) { err = res.err return } - ctx.password = res.password + ctx.Password = res.password return } @@ -129,12 +132,14 @@ func (ctx *ImportContext) getPassword(cached bool) (err error) { func ImportFile(ctx *ImportContext) (err error) { rhl.Println("ImportFile called for", ctx.SourceFile) - if err = ctx.getPassword(true); err != nil { - return + if ctx.Trusted { + if err = ctx.getPassword(true); err != nil { + return + } } - rhdl.Println("credentials:", ctx.UserName, "/", ctx.password) + rhdl.Printf("credentials: '%s':'%s'", ctx.UserName, ctx.Password) - err = fmt.Errorf("%+v", ctx) +// err = fmt.Errorf("%+v", ctx) return } diff --git a/src/helsinki.at/rhimportd/ctrlWeb.go b/src/helsinki.at/rhimportd/ctrlWeb.go index 275f095..5a76f15 100644 --- a/src/helsinki.at/rhimportd/ctrlWeb.go +++ b/src/helsinki.at/rhimportd/ctrlWeb.go @@ -25,46 +25,24 @@ package main import ( - "fmt" "helsinki.at/rhimport" - "html" "net/http" _ "net/http/pprof" ) type webHandler struct { *rhimport.Config - H func(*rhimport.Config, http.ResponseWriter, *http.Request) (int, error) + trusted bool + H func(*rhimport.Config, bool, http.ResponseWriter, *http.Request) } func (self webHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - status, err := self.H(self.Config, w, r) - if err != nil { - switch status { - case http.StatusNotFound: - http.NotFound(w, r) - default: - http.Error(w, fmt.Sprintf("%s: %s", http.StatusText(status), err), status) - } - } -} - -func IndexHandler(conf *rhimport.Config, w http.ResponseWriter, r *http.Request) (status int, err error) { - - ctx := rhimport.NewImportContext(conf, "hugo", "test", 17324) - ctx.SourceFile = html.EscapeString(r.URL.Path) - ctx.DeleteSourceFile = true - - if err = rhimport.ImportFile(ctx); err != nil { - status = http.StatusInternalServerError - } else { - status = http.StatusOK - } - return + self.H(self.Config, self.trusted, w, r) } func StartControlWeb(addr_s string, conf *rhimport.Config) { - http.Handle("/", webHandler{conf, IndexHandler}) + http.Handle("/public/simple", webHandler{conf, false, webSimpleHandler}) + http.Handle("/trusted/simple", webHandler{conf, true, webSimpleHandler}) rhl.Println("listening on", addr_s) http.ListenAndServe(addr_s, nil) diff --git a/src/helsinki.at/rhimportd/ctrlWebSimple.go b/src/helsinki.at/rhimportd/ctrlWebSimple.go new file mode 100644 index 0000000..eb781dd --- /dev/null +++ b/src/helsinki.at/rhimportd/ctrlWebSimple.go @@ -0,0 +1,105 @@ +// +// rhimportd +// +// The Radio Helsinki Rivendell Import Daemon +// +// +// Copyright (C) 2015 Christian Pointner +// +// This file is part of rhimportd. +// +// rhimportd is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// any later version. +// +// rhimportd is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with rhimportd. If not, see . +// + +package main + +import ( + "encoding/json" + "helsinki.at/rhimport" + "html" + "net/http" + _ "net/http/pprof" + "fmt" +) + +type webSimpleRequestData struct { + UserName string `json:"LOGIN_NAME"` + Password string `json:"PASSWORD"` + GroupName string `json:"GROUP_NAME"` + Cart int `json:"CART_NUMBER"` + Channels int `json:"CHANNELS"` + NormalizationLevel int `json:"NORMALIZATION_LEVEL"` + AutotrimLevel int `json:"AUTOTRIM_LEVEL"` + UseMetaData bool `json:"USE_METADATA"` + SourceUri string `json:"SOURCE_URI"` +} + +type webSimpleResponseData struct { + ResponseCode int `json:"REPONSE_CODE"` + ErrorString string `json:"ERROR_STRING"` + AudioConvertError int `json:"AudioConvertError"` +} + +func webSimpleErrorResponse(w http.ResponseWriter, code int, error_str string, audio_err int) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusInternalServerError) + encoder := json.NewEncoder(w) + respdata := webSimpleResponseData{code, error_str, audio_err} + encoder.Encode(respdata) +} + +func webSimpleResponse(w http.ResponseWriter) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusInternalServerError) + encoder := json.NewEncoder(w) + respdata := webSimpleResponseData{200, "SUCCESS", 0} + encoder.Encode(respdata) +} + +func webSimpleHandler(conf *rhimport.Config, trusted bool, w http.ResponseWriter, r *http.Request) { + rhdl.Printf("SimpleHandler: request for '%s'", html.EscapeString(r.URL.Path)) + + decoder := json.NewDecoder(r.Body) + var reqdata webSimpleRequestData + if err := decoder.Decode(&reqdata); err != nil { + webSimpleErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Error parsing JSON response: %s", err), 0) + return + } + + username := reqdata.UserName + if trusted { + username = r.Header.Get("X-Forwarded-User") + } + ctx := rhimport.NewImportContext(conf, username, reqdata.GroupName, reqdata.Cart) + ctx.Password = reqdata.Password + ctx.Trusted = trusted + ctx.Channels = reqdata.Channels + ctx.NormalizationLevel = reqdata.NormalizationLevel + ctx.AutotrimLevel = reqdata.AutotrimLevel + ctx.UseMetaData = reqdata.UseMetaData + + // TODO: call the fetcher + + // TODO: the following should be returned by the fetcher + ctx.SourceFile = "" + ctx.DeleteSourceFile = true + + if err := rhimport.ImportFile(ctx); err != nil { + webSimpleErrorResponse(w, http.StatusInternalServerError, err.Error(), 0) + return + } + + webSimpleResponse(w) + return +} diff --git a/test/simple-empty.json b/test/simple-empty.json new file mode 100644 index 0000000..2c63c08 --- /dev/null +++ b/test/simple-empty.json @@ -0,0 +1,2 @@ +{ +} diff --git a/test/simple1.json b/test/simple1.json new file mode 100644 index 0000000..2c63c08 --- /dev/null +++ b/test/simple1.json @@ -0,0 +1,2 @@ +{ +} diff --git a/test/test-simple.sh b/test/test-simple.sh new file mode 100755 index 0000000..e797dd1 --- /dev/null +++ b/test/test-simple.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +if [ -z "$1" ]; then + echo "Usage: $0 " + exit 1 +fi + +curl -XPOST 'http://localhost:4000/public/simple' -d @$1 + +exit 0 -- cgit v0.10.2