|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
"io/ioutil"
|
|
|
|
"log"
|
|
|
|
"net/http"
|
|
|
|
"os"
|
|
|
|
|
|
|
|
// "reflect"
|
|
|
|
"net"
|
|
|
|
"net/url"
|
|
|
|
"strings"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
func CheckStatusCode(res *http.Response) {
|
|
|
|
|
|
|
|
switch {
|
|
|
|
case 300 <= res.StatusCode && res.StatusCode < 400:
|
|
|
|
fmt.Println("CheckStatusCode gitea apiKeys connection error: Redirect message")
|
|
|
|
case 401 == res.StatusCode:
|
|
|
|
fmt.Println("CheckStatusCode gitea apiKeys connection Error: Unauthorized")
|
|
|
|
case 400 <= res.StatusCode && res.StatusCode < 500:
|
|
|
|
fmt.Println("CheckStatusCode gitea apiKeys connection error: Client error")
|
|
|
|
case 500 <= res.StatusCode && res.StatusCode < 600:
|
|
|
|
fmt.Println("CheckStatusCode gitea apiKeys connection error Server error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func hasTimedOut(err error) bool {
|
|
|
|
switch err := err.(type) {
|
|
|
|
case *url.Error:
|
|
|
|
if err, ok := err.Err.(net.Error); ok && err.Timeout() {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
case *net.OpError:
|
|
|
|
if err.Timeout() {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
case net.Error:
|
|
|
|
if err.Timeout() {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
errTxt := "use of closed network connection"
|
|
|
|
if err != nil && strings.Contains(err.Error(), errTxt) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func RequestGet(apiKeys GiteaKeys) []byte {
|
|
|
|
cc := &http.Client{Timeout: time.Second * 2}
|
|
|
|
url := apiKeys.BaseUrl + apiKeys.Command + apiKeys.TokenKey[apiKeys.BruteforceTokenKey]
|
|
|
|
res, err := cc.Get(url)
|
|
|
|
if err != nil && hasTimedOut(err) {
|
|
|
|
fmt.Println(err)
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
CheckStatusCode(res)
|
|
|
|
b, readErr := ioutil.ReadAll(res.Body)
|
|
|
|
if readErr != nil {
|
|
|
|
log.Fatal(readErr)
|
|
|
|
}
|
|
|
|
res.Body.Close()
|
|
|
|
return b
|
|
|
|
}
|
|
|
|
|
|
|
|
func RequestPut(apiKeys GiteaKeys) []byte {
|
|
|
|
cc := &http.Client{Timeout: time.Second * 2}
|
|
|
|
url := apiKeys.BaseUrl + apiKeys.Command + apiKeys.TokenKey[apiKeys.BruteforceTokenKey]
|
|
|
|
request, err := http.NewRequest("PUT", url, nil)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
res, err := cc.Do(request)
|
|
|
|
CheckStatusCode(res)
|
|
|
|
if err != nil && hasTimedOut(err) {
|
|
|
|
fmt.Println(err)
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
b, readErr := ioutil.ReadAll(res.Body)
|
|
|
|
if readErr != nil {
|
|
|
|
log.Fatal(readErr)
|
|
|
|
}
|
|
|
|
res.Body.Close()
|
|
|
|
return b
|
|
|
|
}
|
|
|
|
|
|
|
|
func RequestDel(apiKeys GiteaKeys) []byte {
|
|
|
|
|
|
|
|
cc := &http.Client{Timeout: time.Second * 2}
|
|
|
|
url := apiKeys.BaseUrl + apiKeys.Command + apiKeys.TokenKey[apiKeys.BruteforceTokenKey]
|
|
|
|
request, err := http.NewRequest("DELETE", url, nil)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
res, err := cc.Do(request)
|
|
|
|
CheckStatusCode(res)
|
|
|
|
if err != nil && hasTimedOut(err) {
|
|
|
|
fmt.Println(err)
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
b, readErr := ioutil.ReadAll(res.Body)
|
|
|
|
if readErr != nil {
|
|
|
|
log.Fatal(readErr)
|
|
|
|
}
|
|
|
|
res.Body.Close()
|
|
|
|
return b
|
|
|
|
}
|
|
|
|
|
|
|
|
func RequestSearchResults(ApiKeys GiteaKeys) SearchResults {
|
|
|
|
|
|
|
|
b := RequestGet(ApiKeys)
|
|
|
|
|
|
|
|
var f SearchResults
|
|
|
|
jsonErr := json.Unmarshal(b, &f)
|
|
|
|
if jsonErr != nil {
|
|
|
|
log.Fatal(jsonErr)
|
|
|
|
}
|
|
|
|
return f
|
|
|
|
}
|
|
|
|
|
|
|
|
func RequestUsersList(ApiKeys GiteaKeys) (map[string]Account, int) {
|
|
|
|
|
|
|
|
b := RequestGet(ApiKeys)
|
|
|
|
var AccountU = make(map[string]Account)
|
|
|
|
|
|
|
|
var f []Account
|
|
|
|
jsonErr := json.Unmarshal(b, &f)
|
|
|
|
if jsonErr != nil {
|
|
|
|
log.Println(jsonErr)
|
|
|
|
if ApiKeys.BruteforceTokenKey == len(ApiKeys.TokenKey)-1 {
|
|
|
|
log.Println("Token key is unsuitable, call to system administrator ")
|
|
|
|
} else {
|
|
|
|
log.Println("Can't get UsersList try another token key")
|
|
|
|
}
|
|
|
|
if ApiKeys.BruteforceTokenKey < len(ApiKeys.TokenKey)-1 {
|
|
|
|
ApiKeys.BruteforceTokenKey++
|
|
|
|
log.Printf("BruteforceTokenKey=%d", ApiKeys.BruteforceTokenKey)
|
|
|
|
AccountU, ApiKeys.BruteforceTokenKey = RequestUsersList(ApiKeys)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for i := 0; i < len(f); i++ {
|
|
|
|
AccountU[f[i].Login] = Account{
|
|
|
|
// Email: f[i].Email,
|
|
|
|
ID: f[i].ID,
|
|
|
|
FullName: f[i].FullName,
|
|
|
|
Login: f[i].Login,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return AccountU, ApiKeys.BruteforceTokenKey
|
|
|
|
}
|
|
|
|
|
|
|
|
func RequestOrganizationList(apiKeys GiteaKeys) []Organization {
|
|
|
|
|
|
|
|
b := RequestGet(apiKeys)
|
|
|
|
|
|
|
|
var f []Organization
|
|
|
|
jsonErr := json.Unmarshal(b, &f)
|
|
|
|
if jsonErr != nil {
|
|
|
|
log.Printf("Please check setting GITEA_TOKEN, GITEA_URL ")
|
|
|
|
log.Fatal(jsonErr)
|
|
|
|
}
|
|
|
|
return f
|
|
|
|
}
|
|
|
|
|
|
|
|
func RequestTeamList(apiKeys GiteaKeys) []Team {
|
|
|
|
|
|
|
|
b := RequestGet(apiKeys)
|
|
|
|
|
|
|
|
var f []Team
|
|
|
|
jsonErr := json.Unmarshal(b, &f)
|
|
|
|
if jsonErr != nil {
|
|
|
|
log.Fatal(jsonErr)
|
|
|
|
}
|
|
|
|
return f
|
|
|
|
}
|
|
|
|
|
|
|
|
func parseJson(b []byte) interface{} {
|
|
|
|
var f interface{}
|
|
|
|
jsonErr := json.Unmarshal(b, &f)
|
|
|
|
if jsonErr != nil {
|
|
|
|
log.Fatal(jsonErr)
|
|
|
|
}
|
|
|
|
m := f.(interface{})
|
|
|
|
return m
|
|
|
|
}
|