Parcourir la source

client IP can be recorded - assuming nginx reverse proxy - choose x-forwarded-for

tags/v0.5
patrick il y a 5 ans
Parent
révision
6a2295e202
8 fichiers modifiés avec 236 ajouts et 140 suppressions
  1. +1
    -1
      config.json
  2. +1
    -1
      config.test.json
  3. +36
    -128
      db.go
  4. +150
    -0
      db_crud.go
  5. +38
    -0
      ip2long.go
  6. +9
    -9
      main.go
  7. BIN
      mysql-model.mwb
  8. +1
    -1
      purchase.go

+ 1
- 1
config.json Voir le fichier

@@ -12,6 +12,6 @@
"Driver": "mysql",
"User" : "sp",
"Pass" : "sp",
"Schema": "goblog"
"Schema": "leanwork_pay"
}
}

+ 1
- 1
config.test.json Voir le fichier

@@ -12,6 +12,6 @@
"Driver": "mysql",
"User" : "sp",
"Pass" : "sp",
"Schema": "goblog"
"Schema": "leanwork_pay"
}
}

+ 36
- 128
db.go Voir le fichier

@@ -2,149 +2,57 @@ package main

import (
"database/sql"
"fmt"
"log"
"net/http"
"text/template"

_ "github.com/go-sql-driver/mysql"
)

type Employee struct {
Id int
Name string
City string
type TransactionDB struct {
h *sql.DB
}

func dbConn() (db *sql.DB) {
dbDriver := Config.DB.Driver
dbUser := Config.DB.User
dbPass := Config.DB.Pass
dbName := Config.DB.Schema
db, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@/"+dbName)
if err != nil {
panic(err.Error())
}
return db
}

var tmpl = template.Must(template.ParseGlob("form/*"))
var db TransactionDB

func Index(w http.ResponseWriter, r *http.Request) {
db := dbConn()
selDB, err := db.Query("SELECT * FROM Employee ORDER BY id DESC")
func (m *TransactionDB) conn(c AppConfig) error {
dbDriver := c.DB.Driver
dbUser := c.DB.User
dbPass := c.DB.Pass
dbName := c.DB.Schema
h, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@/"+dbName)
if err != nil {
panic(err.Error())
}
emp := Employee{}
res := []Employee{}
for selDB.Next() {
var id int
var name, city string
err = selDB.Scan(&id, &name, &city)
if err != nil {
panic(err.Error())
}
emp.Id = id
emp.Name = name
emp.City = city
res = append(res, emp)
}
tmpl.ExecuteTemplate(w, "Index", res)
defer db.Close()
}

func Show(w http.ResponseWriter, r *http.Request) {
db := dbConn()
nId := r.URL.Query().Get("id")
selDB, err := db.Query("SELECT * FROM Employee WHERE id=?", nId)
if err != nil {
panic(err.Error())
}
emp := Employee{}
for selDB.Next() {
var id int
var name, city string
err = selDB.Scan(&id, &name, &city)
if err != nil {
panic(err.Error())
}
emp.Id = id
emp.Name = name
emp.City = city
}
tmpl.ExecuteTemplate(w, "Show", emp)
defer db.Close()
m.h = h
fmt.Printf("%x", h)
return err
}

func New(w http.ResponseWriter, r *http.Request) {
tmpl.ExecuteTemplate(w, "New", nil)
func (m *TransactionDB) close() {
defer m.h.Close()
}

func Edit(w http.ResponseWriter, r *http.Request) {
db := dbConn()
nId := r.URL.Query().Get("id")
selDB, err := db.Query("SELECT * FROM Employee WHERE id=?", nId)
if err != nil {
panic(err.Error())
}
emp := Employee{}
for selDB.Next() {
var id int
var name, city string
err = selDB.Scan(&id, &name, &city)
if err != nil {
panic(err.Error())
}
emp.Id = id
emp.Name = name
emp.City = city
}
tmpl.ExecuteTemplate(w, "Edit", emp)
defer db.Close()
}

func Insert(w http.ResponseWriter, r *http.Request) {
db := dbConn()
if r.Method == "POST" {
name := r.FormValue("name")
city := r.FormValue("city")
insForm, err := db.Prepare("INSERT INTO Employee(name, city) VALUES(?,?)")
if err != nil {
panic(err.Error())
}
insForm.Exec(name, city)
log.Println("INSERT: Name: " + name + " | City: " + city)
func (m *TransactionDB) addRequest(r *http.Request) error {
if err := m.conn(Config); err != nil {
return err
}
defer db.Close()
http.Redirect(w, r, "/", 301)
}

func Update(w http.ResponseWriter, r *http.Request) {
db := dbConn()
if r.Method == "POST" {
name := r.FormValue("name")
city := r.FormValue("city")
id := r.FormValue("uid")
insForm, err := db.Prepare("UPDATE Employee SET name=?, city=? WHERE id=?")
if err != nil {
panic(err.Error())
}
insForm.Exec(name, city, id)
log.Println("UPDATE: Name: " + name + " | City: " + city)
}
defer db.Close()
http.Redirect(w, r, "/", 301)
}
r.ParseForm()
//assuming form has been parsed
pickupUrl := r.Form["pickupUrl"][0]
receiveUrl := r.Form["receiveUrl"][0]
signType := r.Form["signType"][0]
orderNo := r.Form["orderNo"][0]
orderAmount := r.Form["orderAmount"][0]
orderCurrency := r.Form["orderCurrency"][0]
customerId := r.Form["customerId"][0]
sign := r.Form["sign"][0]
valid := isLeanworkFormValid(r.Form)
ip4 := getClientIPLong(r)

func Delete(w http.ResponseWriter, r *http.Request) {
db := dbConn()
emp := r.URL.Query().Get("id")
delForm, err := db.Prepare("DELETE FROM Employee WHERE id=?")
if err != nil {
panic(err.Error())
insForm, err := m.h.Prepare("INSERT INTO request(pickupUrl, receiveUrl, signType, orderNo, orderAmount, orderCurrency, customerId, sign, valid, ip4) VALUES(?,?,?,?,?,?,?,?,?,?)")
if err == nil {
insForm.Exec(pickupUrl, receiveUrl, signType, orderNo, orderAmount, orderCurrency, customerId, sign, valid, ip4)
log.Println("INSERT: customerId: " + customerId + " | orderAmount: " + orderCurrency + " " + orderAmount)
}
delForm.Exec(emp)
log.Println("DELETE")
defer db.Close()
http.Redirect(w, r, "/", 301)
m.close()
return err
}

+ 150
- 0
db_crud.go Voir le fichier

@@ -0,0 +1,150 @@
package main

import (
"database/sql"
"log"
"net/http"
"text/template"

_ "github.com/go-sql-driver/mysql"
)

type Employee struct {
Id int
Name string
City string
}

var tmpl = template.Must(template.ParseGlob("form/*"))

func dbConn() (db *sql.DB) {
dbDriver := Config.DB.Driver
dbUser := Config.DB.User
dbPass := Config.DB.Pass
dbName := Config.DB.Schema
db, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@/"+dbName)
if err != nil {
panic(err.Error())
}
return db
}

func Index(w http.ResponseWriter, r *http.Request) {
db := dbConn()
selDB, err := db.Query("SELECT * FROM Employee ORDER BY id DESC")
if err != nil {
panic(err.Error())
}
emp := Employee{}
res := []Employee{}
for selDB.Next() {
var id int
var name, city string
err = selDB.Scan(&id, &name, &city)
if err != nil {
panic(err.Error())
}
emp.Id = id
emp.Name = name
emp.City = city
res = append(res, emp)
}
tmpl.ExecuteTemplate(w, "Index", res)
defer db.Close()
}

func Show(w http.ResponseWriter, r *http.Request) {
db := dbConn()
nId := r.URL.Query().Get("id")
selDB, err := db.Query("SELECT * FROM Employee WHERE id=?", nId)
if err != nil {
panic(err.Error())
}
emp := Employee{}
for selDB.Next() {
var id int
var name, city string
err = selDB.Scan(&id, &name, &city)
if err != nil {
panic(err.Error())
}
emp.Id = id
emp.Name = name
emp.City = city
}
tmpl.ExecuteTemplate(w, "Show", emp)
defer db.Close()
}

func New(w http.ResponseWriter, r *http.Request) {
tmpl.ExecuteTemplate(w, "New", nil)
}

func Edit(w http.ResponseWriter, r *http.Request) {
db := dbConn()
nId := r.URL.Query().Get("id")
selDB, err := db.Query("SELECT * FROM Employee WHERE id=?", nId)
if err != nil {
panic(err.Error())
}
emp := Employee{}
for selDB.Next() {
var id int
var name, city string
err = selDB.Scan(&id, &name, &city)
if err != nil {
panic(err.Error())
}
emp.Id = id
emp.Name = name
emp.City = city
}
tmpl.ExecuteTemplate(w, "Edit", emp)
defer db.Close()
}

func Insert(w http.ResponseWriter, r *http.Request) {
db := dbConn()
if r.Method == "POST" {
name := r.FormValue("name")
city := r.FormValue("city")
insForm, err := db.Prepare("INSERT INTO Employee(name, city) VALUES(?,?)")
if err != nil {
panic(err.Error())
}
insForm.Exec(name, city)
log.Println("INSERT: Name: " + name + " | City: " + city)
}
defer db.Close()
http.Redirect(w, r, "/", 301)
}

func Update(w http.ResponseWriter, r *http.Request) {
db := dbConn()
if r.Method == "POST" {
name := r.FormValue("name")
city := r.FormValue("city")
id := r.FormValue("uid")
insForm, err := db.Prepare("UPDATE Employee SET name=?, city=? WHERE id=?")
if err != nil {
panic(err.Error())
}
insForm.Exec(name, city, id)
log.Println("UPDATE: Name: " + name + " | City: " + city)
}
defer db.Close()
http.Redirect(w, r, "/", 301)
}

func Delete(w http.ResponseWriter, r *http.Request) {
db := dbConn()
emp := r.URL.Query().Get("id")
delForm, err := db.Prepare("DELETE FROM Employee WHERE id=?")
if err != nil {
panic(err.Error())
}
delForm.Exec(emp)
log.Println("DELETE")
defer db.Close()
http.Redirect(w, r, "/", 301)
}

+ 38
- 0
ip2long.go Voir le fichier

@@ -0,0 +1,38 @@
package main

import (
"bytes"
"encoding/binary"
"net"
"net/http"
"strconv"
"strings"
)

func ip2Long(ip string) uint32 {
var long uint32
binary.Read(bytes.NewBuffer(net.ParseIP(ip).To4()), binary.BigEndian, &long)
return long
}

func backtoIP4(ipInt int64) string {

// need to do two bit shifting and “0xff” masking
b0 := strconv.FormatInt((ipInt>>24)&0xff, 10)
b1 := strconv.FormatInt((ipInt>>16)&0xff, 10)
b2 := strconv.FormatInt((ipInt>>8)&0xff, 10)
b3 := strconv.FormatInt((ipInt & 0xff), 10)
return b0 + "." + b1 + "." + b2 + "." + b3
}

func getClientIP(r *http.Request) string {
//a := r.RemoteAddr // always be 127.0.0.1:300456 port number may vary
a := r.Header.Get("X-Forwarded-For")
s := strings.Split(a, ":")
return s[0]
}

func getClientIPLong(r *http.Request) uint32 {
s := getClientIP(r)
return ip2Long(s)
}

+ 9
- 9
main.go Voir le fichier

@@ -7,15 +7,15 @@ import (

func main() {
readConfig()
log.Println("Server started on: http://localhost:8080")
//http.HandleFunc("/", StartPay)
http.HandleFunc("/", StartPay)

http.HandleFunc("/", Index)
http.HandleFunc("/show", Show)
http.HandleFunc("/new", New)
http.HandleFunc("/edit", Edit)
http.HandleFunc("/insert", Insert)
http.HandleFunc("/update", Update)
http.HandleFunc("/delete", Delete)
// http.HandleFunc("/", Index)
// http.HandleFunc("/show", Show)
// http.HandleFunc("/new", New)
// http.HandleFunc("/edit", Edit)
// http.HandleFunc("/insert", Insert)
// http.HandleFunc("/update", Update)
// http.HandleFunc("/delete", Delete)
http.ListenAndServe(":8080", nil)
log.Println("Server started on: http://localhost:8080")
}

BIN
mysql-model.mwb Voir le fichier


+ 1
- 1
purchase.go Voir le fichier

@@ -11,7 +11,7 @@ func StartPay(w http.ResponseWriter, r *http.Request) {
return
}
r.ParseForm()
db.addRequest(r)
if !isLeanworkFormValid(r.Form) {
fmt.Fprintf(w, "invalid request")
return

Chargement…
Annuler
Enregistrer