Init
This commit is contained in:
commit
df4b25de98
7 changed files with 216 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
config.yaml
|
||||
.idea
|
10
go.mod
Normal file
10
go.mod
Normal file
|
@ -0,0 +1,10 @@
|
|||
module mavenserver
|
||||
|
||||
go 1.15
|
||||
|
||||
require (
|
||||
github.com/go-sql-driver/mysql v1.5.0
|
||||
github.com/gorilla/mux v1.8.0
|
||||
github.com/jmoiron/sqlx v1.2.0
|
||||
gopkg.in/yaml.v2 v2.3.0
|
||||
)
|
15
go.sum
Normal file
15
go.sum
Normal file
|
@ -0,0 +1,15 @@
|
|||
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
|
||||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
|
||||
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
|
||||
github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA=
|
||||
github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
|
||||
github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
|
||||
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/mattn/go-sqlite3 v1.9.0 h1:pDRiWfl+++eC2FEFRy6jXmQlvp4Yh3z1MJKg4UeYM/4=
|
||||
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
|
||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
50
main.go
Normal file
50
main.go
Normal file
|
@ -0,0 +1,50 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"gopkg.in/yaml.v2"
|
||||
"mavenserver/maven"
|
||||
"os"
|
||||
)
|
||||
|
||||
func main() {
|
||||
var auth maven.AuthManager
|
||||
config := readconf("config.yaml")
|
||||
auth = maven.Create(config.Database)
|
||||
maven.StartServer(config.Server, &auth)
|
||||
}
|
||||
|
||||
func readconf(loc string) maven.Configuration {
|
||||
if _, err := os.Stat(loc); os.IsNotExist(err) {
|
||||
conf := `
|
||||
server:
|
||||
port: 8080
|
||||
mavenpath: "maven"
|
||||
basepath: "/maven"
|
||||
database:
|
||||
host: "localhost"
|
||||
database: "mavenusers"
|
||||
username: "root"
|
||||
password: "password"`
|
||||
file, err := os.Create(loc)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer file.Close()
|
||||
_, err = file.WriteString(conf)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
file, err := os.Open(loc)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer file.Close()
|
||||
var conf maven.Configuration
|
||||
dec := yaml.NewDecoder(file)
|
||||
err = dec.Decode(&conf)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return conf
|
||||
}
|
20
maven/config.go
Normal file
20
maven/config.go
Normal file
|
@ -0,0 +1,20 @@
|
|||
package maven
|
||||
|
||||
type ServerConf struct {
|
||||
Port int `yaml:"port"`
|
||||
MavenPath string `yaml:"mavenpath"`
|
||||
BasePath string `yaml:"basepath"`
|
||||
}
|
||||
|
||||
type DSN struct {
|
||||
Username string `yaml:"username"`
|
||||
Password string `yaml:"password"`
|
||||
Host string `yaml:"host"`
|
||||
Port int `yaml:"port"`
|
||||
Database string `yaml:"database"`
|
||||
}
|
||||
|
||||
type Configuration struct {
|
||||
Database DSN `yaml:"database"`
|
||||
Server ServerConf `yaml:"server"`
|
||||
}
|
52
maven/server.go
Normal file
52
maven/server.go
Normal file
|
@ -0,0 +1,52 @@
|
|||
package maven
|
||||
|
||||
import (
|
||||
"github.com/gorilla/mux"
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
"path"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
type PutHandler struct {
|
||||
rootpath string
|
||||
auth *AuthManager
|
||||
}
|
||||
|
||||
type AuthManager interface {
|
||||
HasAccess(path string, username string, password string) bool
|
||||
}
|
||||
|
||||
func StartServer(conf ServerConf, auth *AuthManager) {
|
||||
handler := mux.NewRouter()
|
||||
handler.PathPrefix(conf.BasePath).Methods("GET").Handler(http.StripPrefix(conf.BasePath, http.FileServer(http.Dir(conf.MavenPath))))
|
||||
handler.PathPrefix(conf.BasePath).Methods("PUT").Handler(http.StripPrefix(conf.BasePath, PutHandler{rootpath: conf.MavenPath, auth: auth}))
|
||||
err := http.ListenAndServe("0.0.0.0:"+strconv.Itoa(conf.Port), handler)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func (h PutHandler) ServeHTTP(res http.ResponseWriter, req *http.Request) {
|
||||
filepath := h.rootpath + req.URL.Path
|
||||
auth := *h.auth
|
||||
username, password, _ := req.BasicAuth()
|
||||
if auth.HasAccess(req.URL.Path, username, password) {
|
||||
err := os.MkdirAll(path.Dir(filepath), 0777)
|
||||
if err != nil {
|
||||
http.Error(res, err.Error(), http.StatusInternalServerError)
|
||||
}
|
||||
f, err := os.OpenFile(filepath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
|
||||
defer f.Close()
|
||||
if err != nil {
|
||||
http.Error(res, err.Error(), http.StatusInternalServerError)
|
||||
}
|
||||
_, err = io.Copy(f, req.Body)
|
||||
if err != nil {
|
||||
http.Error(res, err.Error(), http.StatusInternalServerError)
|
||||
}
|
||||
} else {
|
||||
http.Error(res, "No Permission", http.StatusForbidden)
|
||||
}
|
||||
}
|
67
maven/sql.go
Normal file
67
maven/sql.go
Normal file
|
@ -0,0 +1,67 @@
|
|||
package maven
|
||||
|
||||
import (
|
||||
"crypto/md5"
|
||||
"encoding/hex"
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
"github.com/jmoiron/sqlx"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
func Create(con DSN) Database {
|
||||
connec, err := sqlx.Open("mysql", con.Format())
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
connec.SetConnMaxLifetime(time.Minute * 3)
|
||||
connec.SetMaxOpenConns(10)
|
||||
return Database{db: connec}
|
||||
}
|
||||
|
||||
func (d DSN) Format() string {
|
||||
fm := ""
|
||||
if d.Username != "" {
|
||||
fm += d.Username
|
||||
if d.Password != "" {
|
||||
fm += ":"
|
||||
fm += d.Password
|
||||
}
|
||||
fm += "@"
|
||||
}
|
||||
if d.Host != "" {
|
||||
fm += "("
|
||||
fm += d.Host
|
||||
if d.Port != 0 {
|
||||
fm += ":"
|
||||
fm += strconv.Itoa(d.Port)
|
||||
}
|
||||
fm += ")"
|
||||
}
|
||||
fm += "/"
|
||||
fm += d.Database
|
||||
return fm
|
||||
}
|
||||
|
||||
type Database struct {
|
||||
db *sqlx.DB
|
||||
}
|
||||
|
||||
type User struct {
|
||||
Password string `DB:"password"`
|
||||
}
|
||||
|
||||
func (d Database) HasAccess(path string, username string, password string) bool {
|
||||
row := d.db.QueryRowx("SELECT password FROM users WHERE username=?", username)
|
||||
user := User{}
|
||||
err := row.StructScan(&user)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
return user.Password == Hash(password)
|
||||
}
|
||||
|
||||
func Hash(input string) string {
|
||||
hash := md5.Sum([]byte(input))
|
||||
return hex.EncodeToString(hash[:])
|
||||
}
|
Loading…
Reference in a new issue