Add HTML form entry point

This commit is contained in:
Yax 2017-11-11 07:33:21 +01:00
parent 885996f25c
commit 04ce4dfbb7
7 changed files with 131 additions and 164 deletions

View file

@ -89,69 +89,3 @@ def new_comment():
abort(400)
return "OK"
@app.route("/report", methods=['GET'])
def report():
try:
token = request.args.get('token', '')
secret = request.args.get('secret', '')
if secret != config.SECRET:
logger.warn('Unauthorized request')
abort(401)
site = Site.select().where(Site.token == token).get()
if site is None:
logger.warn('Unknown site %s' % token)
abort(404)
processor.enqueue({'request': 'report', 'data': token})
except:
logger.exception("report failure")
abort(500)
return "OK"
@app.route("/accept", methods=['GET'])
def accept_comment():
try:
id = request.args.get('comment', '')
secret = request.args.get('secret', '')
if secret != config.SECRET:
logger.warn('Unauthorized request')
abort(401)
processor.enqueue({'request': 'late_accept', 'data': id})
except:
logger.exception("accept failure")
abort(500)
return "PUBLISHED"
@app.route("/reject", methods=['GET'])
def reject_comment():
try:
id = request.args.get('comment', '')
secret = request.args.get('secret', '')
if secret != config.SECRET:
logger.warn('Unauthorized request')
abort(401)
processor.enqueue({'request': 'late_reject', 'data': id})
except:
logger.exception("reject failure")
abort(500)
return "REJECTED"

41
app/controllers/form.py Normal file
View file

@ -0,0 +1,41 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
import config
from flask import request, jsonify, abort
from app import app
from app.models.site import Site
from app.models.comment import Comment
from app.helpers.hashing import md5
from app.services import processor
logger = logging.getLogger(__name__)
@app.route("/newcomment", methods=['POST'])
def new_form_comment():
try:
data = request.form
logger.info(data)
# validate token: retrieve site entity
token = data.get('token', '')
site = Site.select().where(Site.token == token).get()
if site is None:
logger.warn('Unknown site %s' % token)
abort(400)
# honeypot for spammers
captcha = data.get('captcha', '')
if captcha:
logger.warn('discard spam: data %s' % data)
abort(400)
processor.enqueue({'request': 'new_comment', 'data': data})
except:
logger.exception("new comment failure")
abort(400)
return "OK"

78
app/controllers/report.py Normal file
View file

@ -0,0 +1,78 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
import config
from flask import request, jsonify, abort
from app import app
from app.models.site import Site
from app.models.comment import Comment
from app.helpers.hashing import md5
from app.services import processor
logger = logging.getLogger(__name__)
@app.route("/report", methods=['GET'])
def report():
try:
token = request.args.get('token', '')
secret = request.args.get('secret', '')
if secret != config.SECRET:
logger.warn('Unauthorized request')
abort(401)
site = Site.select().where(Site.token == token).get()
if site is None:
logger.warn('Unknown site %s' % token)
abort(404)
processor.enqueue({'request': 'report', 'data': token})
except:
logger.exception("report failure")
abort(500)
return "OK"
@app.route("/accept", methods=['GET'])
def accept_comment():
try:
id = request.args.get('comment', '')
secret = request.args.get('secret', '')
if secret != config.SECRET:
logger.warn('Unauthorized request')
abort(401)
processor.enqueue({'request': 'late_accept', 'data': id})
except:
logger.exception("accept failure")
abort(500)
return "PUBLISHED"
@app.route("/reject", methods=['GET'])
def reject_comment():
try:
id = request.args.get('comment', '')
secret = request.args.get('secret', '')
if secret != config.SECRET:
logger.warn('Unauthorized request')
abort(401)
processor.enqueue({'request': 'late_reject', 'data': id})
except:
logger.exception("reject failure")
abort(500)
return "REJECTED"

View file

@ -20,6 +20,8 @@ import config
from app.services import database
from app.services import processor
from app.controllers import api
from app.controllers import form
from app.controllers import report
from app.controllers import mail
from app.controllers import reader
from app import app

View file

@ -1,5 +0,0 @@
{
"HostPort":"127.0.0.1:8101",
"Stacosys":"http://127.0.0.1:8100",
"CorsOrigin":"blogduyax.madyanne.fr"
}

View file

@ -1,85 +0,0 @@
package main
import (
"encoding/json"
"flag"
"fmt"
"github.com/patrickmn/go-cache"
"io/ioutil"
"net/http"
"os"
"time"
)
// ConfigType represents config info
type ConfigType struct {
HostPort string
Stacosys string
CorsOrigin string
}
var config ConfigType
var countCache = cache.New(5*time.Minute, 10*time.Minute)
func die(format string, v ...interface{}) {
fmt.Fprintln(os.Stderr, fmt.Sprintf(format, v...))
os.Exit(1)
}
func commentsCount(w http.ResponseWriter, r *http.Request) {
// only GET method is supported
if r.Method != "GET" {
http.NotFound(w, r)
return
}
// set header
w.Header().Add("Content-Type", "application/json")
w.Header().Add("Access-Control-Allow-Origin", config.CorsOrigin)
// get cached value
cachedBody, found := countCache.Get(r.URL.String())
if found {
//fmt.Printf("return cached value")
w.Write([]byte(cachedBody.(string)))
return
}
// relay request to stacosys
response, err := http.Get(config.Stacosys + r.URL.String())
if err != nil {
http.NotFound(w, r)
return
}
defer response.Body.Close()
body, err := ioutil.ReadAll(response.Body)
if err != nil {
http.NotFound(w, r)
return
}
// cache body and return response
countCache.Set(r.URL.String(), string(body), cache.DefaultExpiration)
//fmt.Printf(string(body))
w.Write(body)
}
func main() {
pathname := flag.String("config", "", "config pathname")
flag.Parse()
if *pathname == "" {
die("%s --config <pathname>", os.Args[0])
}
// read config File
file, e := ioutil.ReadFile(*pathname)
if e != nil {
die("File error: %v", e)
}
json.Unmarshal(file, &config)
fmt.Printf("config: %s\n", string(file))
//http.HandleFunc("/comments/count/", commentsCount)
http.HandleFunc("/comments/count", commentsCount)
http.ListenAndServe(config.HostPort, nil)
}

View file

@ -1,14 +1,16 @@
certifi==2017.11.5
chardet==3.0.4
click==6.7
clize==2.4
Flask==0.12.2
Flask-Cors==3.0.3
idna==2.6
itsdangerous==0.24
Jinja2==2.7.3
Markdown==2.6.2
MarkupSafe==0.23
peewee==2.6.0
PyMySQL==0.6.6
Jinja2==2.10
Markdown==2.6.9
MarkupSafe==1.0
peewee==2.10.2
PyRSS2Gen==1.1
requests==2.7.0
six==1.9.0
requests==2.18.4
six==1.11.0
urllib3==1.22
Werkzeug==0.12.2