change to use logging instead of print to stdout
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
package controllers
|
package controllers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"html"
|
"html"
|
||||||
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@ func Register(c *gin.Context) {
|
|||||||
|
|
||||||
// Default to regular user role if not specified
|
// Default to regular user role if not specified
|
||||||
if input.RoleId == 0 {
|
if input.RoleId == 0 {
|
||||||
fmt.Printf("Register no role specified, defaulting to RoleId of 2.\n")
|
log.Printf("Register no role specified, defaulting to RoleId of 2.\n")
|
||||||
u.RoleId = 2
|
u.RoleId = 2
|
||||||
} else {
|
} else {
|
||||||
u.RoleId = input.RoleId
|
u.RoleId = input.RoleId
|
||||||
@@ -50,9 +50,9 @@ func Register(c *gin.Context) {
|
|||||||
|
|
||||||
// Check if user already exists
|
// Check if user already exists
|
||||||
testUser, _ := models.GetUserByName(u.UserName)
|
testUser, _ := models.GetUserByName(u.UserName)
|
||||||
fmt.Printf("Register checking if user already exists : '%v'\n", testUser)
|
log.Printf("Register checking if user already exists : '%v'\n", testUser)
|
||||||
if (models.User{} == testUser) {
|
if (models.User{} == testUser) {
|
||||||
fmt.Printf("Register confirmed no existing username\n")
|
log.Printf("Register confirmed no existing username\n")
|
||||||
} else {
|
} else {
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Attempt to register conflicting username"})
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Attempt to register conflicting username"})
|
||||||
return
|
return
|
||||||
@@ -64,7 +64,7 @@ func Register(c *gin.Context) {
|
|||||||
c.JSON(http.StatusBadRequest, gin.H{"Error hashing password": err.Error()})
|
c.JSON(http.StatusBadRequest, gin.H{"Error hashing password": err.Error()})
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
fmt.Printf("Register generated hashed password value '%s' from '%s'\n", string(hashedPassword), input.Password)
|
log.Printf("Register generated hashed password value '%s' from '%s'\n", string(hashedPassword), input.Password)
|
||||||
}
|
}
|
||||||
u.Password = string(hashedPassword)
|
u.Password = string(hashedPassword)
|
||||||
|
|
||||||
@@ -92,7 +92,7 @@ func Login(c *gin.Context) {
|
|||||||
u.UserName = input.Username
|
u.UserName = input.Username
|
||||||
u.Password = input.Password
|
u.Password = input.Password
|
||||||
|
|
||||||
fmt.Printf("Login checking username '%s' and password '%s'\n", u.UserName, u.Password)
|
log.Printf("Login checking username '%s' and password '%s'\n", u.UserName, u.Password)
|
||||||
|
|
||||||
token, err := models.LoginCheck(u.UserName, u.Password)
|
token, err := models.LoginCheck(u.UserName, u.Password)
|
||||||
|
|
||||||
|
@@ -3,7 +3,7 @@ package controllers
|
|||||||
import (
|
import (
|
||||||
"ccsecrets/models"
|
"ccsecrets/models"
|
||||||
"ccsecrets/utils/token"
|
"ccsecrets/utils/token"
|
||||||
"fmt"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
@@ -22,7 +22,7 @@ func RetrieveSecret(c *gin.Context) {
|
|||||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
fmt.Printf("RetrieveSecret received JSON input '%v'\n", input)
|
log.Printf("RetrieveSecret received JSON input '%v'\n", input)
|
||||||
|
|
||||||
// Get the user and role id of the requestor
|
// Get the user and role id of the requestor
|
||||||
user_id, err := token.ExtractTokenID(c)
|
user_id, err := token.ExtractTokenID(c)
|
||||||
@@ -72,7 +72,7 @@ func RetrieveMultpleSecrets(c *gin.Context) {
|
|||||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
fmt.Printf("StoreSecret received JSON input '%v'\n", input)
|
log.Printf("StoreSecret received JSON input '%v'\n", input)
|
||||||
|
|
||||||
// Get the user and role id of the requestor
|
// Get the user and role id of the requestor
|
||||||
user_id, err := token.ExtractTokenID(c)
|
user_id, err := token.ExtractTokenID(c)
|
||||||
|
@@ -3,7 +3,7 @@ package controllers
|
|||||||
import (
|
import (
|
||||||
"ccsecrets/models"
|
"ccsecrets/models"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
@@ -27,7 +27,7 @@ func StoreSecret(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("StoreSecret received JSON input '%v'\n", input)
|
log.Printf("StoreSecret received JSON input '%v'\n", input)
|
||||||
|
|
||||||
// Populate fields
|
// Populate fields
|
||||||
s := models.Secret{}
|
s := models.Secret{}
|
||||||
@@ -55,7 +55,7 @@ func StoreSecret(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(checkExists) > 0 {
|
if len(checkExists) > 0 {
|
||||||
fmt.Printf("StoreSecret not storing secret with '%d' already matching secrets.\n", len(checkExists))
|
log.Printf("StoreSecret not storing secret with '%d' already matching secrets.\n", len(checkExists))
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"error": "StoreSecret attempting to store secret already defined. API calls for update/delete don't yet exist"})
|
c.JSON(http.StatusBadRequest, gin.H{"error": "StoreSecret attempting to store secret already defined. API calls for update/delete don't yet exist"})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -86,7 +86,7 @@ func UpdateSecret(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("UpdateSecret received JSON input '%v'\n", input)
|
log.Printf("UpdateSecret received JSON input '%v'\n", input)
|
||||||
|
|
||||||
// Get the user and role id of the requestor
|
// Get the user and role id of the requestor
|
||||||
u, err := models.GetUserRoleFromToken(c)
|
u, err := models.GetUserRoleFromToken(c)
|
||||||
|
5
main.go
5
main.go
@@ -35,6 +35,7 @@ func main() {
|
|||||||
fmt.Println("Unable to write logfile", err)
|
fmt.Println("Unable to write logfile", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
log.SetOutput(logfileWriter)
|
||||||
|
|
||||||
// Initiate connection to sqlite and make sure our schema is up to date
|
// Initiate connection to sqlite and make sure our schema is up to date
|
||||||
models.ConnectDatabase()
|
models.ConnectDatabase()
|
||||||
@@ -88,7 +89,7 @@ func main() {
|
|||||||
bindIP = "8443"
|
bindIP = "8443"
|
||||||
}
|
}
|
||||||
bindAddress := fmt.Sprint(bindIP, ":", bindPort)
|
bindAddress := fmt.Sprint(bindIP, ":", bindPort)
|
||||||
fmt.Printf("Will listen on address 'https://%s'\n", bindAddress)
|
log.Printf("Will listen on address 'https://%s'\n", bindAddress)
|
||||||
|
|
||||||
// Get file names for TLS cert/key
|
// Get file names for TLS cert/key
|
||||||
tlsCertFilename := os.Getenv("TLS_CERT_FILE")
|
tlsCertFilename := os.Getenv("TLS_CERT_FILE")
|
||||||
@@ -107,7 +108,7 @@ func main() {
|
|||||||
|
|
||||||
// Generate certificate if required
|
// Generate certificate if required
|
||||||
if !(utils.FileExists(tlsCertFilename) && utils.FileExists(tlsKeyFilename)) {
|
if !(utils.FileExists(tlsCertFilename) && utils.FileExists(tlsKeyFilename)) {
|
||||||
fmt.Printf("Specified TLS certificate (%s) or private key (%s) do not exist.\n", tlsCertFilename, tlsKeyFilename)
|
log.Printf("Specified TLS certificate (%s) or private key (%s) do not exist.\n", tlsCertFilename, tlsKeyFilename)
|
||||||
utils.GenerateCerts(tlsCertFilename, tlsKeyFilename)
|
utils.GenerateCerts(tlsCertFilename, tlsKeyFilename)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
package middlewares
|
package middlewares
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"ccsecrets/models"
|
"ccsecrets/models"
|
||||||
@@ -50,7 +50,7 @@ func JwtAuthAdminMiddleware() gin.HandlerFunc {
|
|||||||
c.Abort()
|
c.Abort()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
fmt.Printf("JwtAuthAdminMiddleware retrieved UserRole object '%v'\n", ur)
|
log.Printf("JwtAuthAdminMiddleware retrieved UserRole object '%v'\n", ur)
|
||||||
|
|
||||||
if !ur.Admin {
|
if !ur.Admin {
|
||||||
c.String(http.StatusUnauthorized, "User role is Non-Admin")
|
c.String(http.StatusUnauthorized, "User role is Non-Admin")
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
package models
|
package models
|
||||||
|
|
||||||
import "fmt"
|
import "log"
|
||||||
|
|
||||||
type Role struct {
|
type Role struct {
|
||||||
RoleId int `db:"RoleId"`
|
RoleId int `db:"RoleId"`
|
||||||
@@ -16,7 +16,7 @@ func QueryRoles() ([]Role, error) {
|
|||||||
rows, err := db.Queryx("SELECT * FROM roles")
|
rows, err := db.Queryx("SELECT * FROM roles")
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("QueryRoles error executing sql record : '%s'\n", err)
|
log.Printf("QueryRoles error executing sql record : '%s'\n", err)
|
||||||
return results, err
|
return results, err
|
||||||
} else {
|
} else {
|
||||||
// parse all the results into a slice
|
// parse all the results into a slice
|
||||||
@@ -24,13 +24,13 @@ func QueryRoles() ([]Role, error) {
|
|||||||
var r Role
|
var r Role
|
||||||
err = rows.StructScan(&r)
|
err = rows.StructScan(&r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("QueryRoles error parsing sql record : '%s'\n", err)
|
log.Printf("QueryRoles error parsing sql record : '%s'\n", err)
|
||||||
return results, err
|
return results, err
|
||||||
}
|
}
|
||||||
results = append(results, r)
|
results = append(results, r)
|
||||||
|
|
||||||
}
|
}
|
||||||
fmt.Printf("QueryRoles retrieved '%d' results\n", len(results))
|
log.Printf("QueryRoles retrieved '%d' results\n", len(results))
|
||||||
}
|
}
|
||||||
|
|
||||||
return results, nil
|
return results, nil
|
||||||
|
@@ -6,8 +6,8 @@ import (
|
|||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/jmoiron/sqlx"
|
"github.com/jmoiron/sqlx"
|
||||||
@@ -29,16 +29,16 @@ func (s *Secret) SaveSecret() (*Secret, error) {
|
|||||||
|
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
fmt.Printf("SaveSecret storing values '%v'\n", s)
|
log.Printf("SaveSecret storing values '%v'\n", s)
|
||||||
result, err := db.NamedExec((`INSERT INTO secrets (RoleId, DeviceName, DeviceCategory, UserName, Secret) VALUES (:RoleId, :DeviceName, :DeviceCategory, :UserName, :Secret)`), s)
|
result, err := db.NamedExec((`INSERT INTO secrets (RoleId, DeviceName, DeviceCategory, UserName, Secret) VALUES (:RoleId, :DeviceName, :DeviceCategory, :UserName, :Secret)`), s)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("StoreSecret error executing sql record : '%s'\n", err)
|
log.Printf("StoreSecret error executing sql record : '%s'\n", err)
|
||||||
return s, err
|
return s, err
|
||||||
} else {
|
} else {
|
||||||
affected, _ := result.RowsAffected()
|
affected, _ := result.RowsAffected()
|
||||||
id, _ := result.LastInsertId()
|
id, _ := result.LastInsertId()
|
||||||
fmt.Printf("StoreSecret insert returned result id '%d' affecting %d row(s).\n", id, affected)
|
log.Printf("StoreSecret insert returned result id '%d' affecting %d row(s).\n", id, affected)
|
||||||
}
|
}
|
||||||
|
|
||||||
return s, nil
|
return s, nil
|
||||||
@@ -50,7 +50,7 @@ func GetSecrets(s *Secret) ([]Secret, error) {
|
|||||||
var rows *sqlx.Rows
|
var rows *sqlx.Rows
|
||||||
var secretResults []Secret
|
var secretResults []Secret
|
||||||
|
|
||||||
fmt.Printf("GetSecret querying values '%v'\n", s)
|
log.Printf("GetSecret querying values '%v'\n", s)
|
||||||
|
|
||||||
// Determine whether to query for a specific device or a category of devices
|
// Determine whether to query for a specific device or a category of devices
|
||||||
// Prefer querying device name than category
|
// Prefer querying device name than category
|
||||||
@@ -61,13 +61,13 @@ func GetSecrets(s *Secret) ([]Secret, error) {
|
|||||||
} else if s.DeviceCategory != "" {
|
} else if s.DeviceCategory != "" {
|
||||||
rows, err = db.Queryx("SELECT * FROM secrets WHERE DeviceCategory LIKE ? AND RoleId = ?", s.DeviceCategory, s.RoleId)
|
rows, err = db.Queryx("SELECT * FROM secrets WHERE DeviceCategory LIKE ? AND RoleId = ?", s.DeviceCategory, s.RoleId)
|
||||||
} else {
|
} else {
|
||||||
fmt.Printf("GetSecret no valid search options specified\n")
|
log.Printf("GetSecret no valid search options specified\n")
|
||||||
err = errors.New("no valid search options specified")
|
err = errors.New("no valid search options specified")
|
||||||
return secretResults, err
|
return secretResults, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("GetSecret error executing sql record : '%s'\n", err)
|
log.Printf("GetSecret error executing sql record : '%s'\n", err)
|
||||||
return secretResults, err
|
return secretResults, err
|
||||||
} else {
|
} else {
|
||||||
// parse all the results into a slice
|
// parse all the results into a slice
|
||||||
@@ -75,20 +75,20 @@ func GetSecrets(s *Secret) ([]Secret, error) {
|
|||||||
var r Secret
|
var r Secret
|
||||||
err = rows.StructScan(&r)
|
err = rows.StructScan(&r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("GetSecret error parsing sql record : '%s'\n", err)
|
log.Printf("GetSecret error parsing sql record : '%s'\n", err)
|
||||||
return secretResults, err
|
return secretResults, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decrypt the secret
|
// Decrypt the secret
|
||||||
_, err = r.DecryptSecret()
|
_, err = r.DecryptSecret()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("GetSecret unable to decrypt stored secret '%v', skipping result.\n", r.Secret)
|
log.Printf("GetSecret unable to decrypt stored secret '%v', skipping result.\n", r.Secret)
|
||||||
} else {
|
} else {
|
||||||
secretResults = append(secretResults, r)
|
secretResults = append(secretResults, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
fmt.Printf("GetSecret retrieved '%d' results\n", len(secretResults))
|
log.Printf("GetSecret retrieved '%d' results\n", len(secretResults))
|
||||||
}
|
}
|
||||||
|
|
||||||
return secretResults, nil
|
return secretResults, nil
|
||||||
@@ -98,22 +98,22 @@ func (s *Secret) UpdateSecret() (*Secret, error) {
|
|||||||
|
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
fmt.Printf("UpdateSecret storing values '%v'\n", s)
|
log.Printf("UpdateSecret storing values '%v'\n", s)
|
||||||
|
|
||||||
if s.SecretId == 0 {
|
if s.SecretId == 0 {
|
||||||
err = errors.New("UpdateSecret unable to locate secret with empty secretId field")
|
err = errors.New("UpdateSecret unable to locate secret with empty secretId field")
|
||||||
fmt.Printf("UpdateSecret error in pre-check : '%s'\n", err)
|
log.Printf("UpdateSecret error in pre-check : '%s'\n", err)
|
||||||
return s, err
|
return s, err
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := db.NamedExec((`UPDATE secrets SET DeviceName = :DeviceName, DeviceCategory = :DeviceCategory, UserName = :UserName, Secret = :Secret WHERE SecretId = :SecretId`), s)
|
result, err := db.NamedExec((`UPDATE secrets SET DeviceName = :DeviceName, DeviceCategory = :DeviceCategory, UserName = :UserName, Secret = :Secret WHERE SecretId = :SecretId`), s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("UpdateSecret error executing sql record : '%s'\n", err)
|
log.Printf("UpdateSecret error executing sql record : '%s'\n", err)
|
||||||
return &Secret{}, err
|
return &Secret{}, err
|
||||||
} else {
|
} else {
|
||||||
affected, _ := result.RowsAffected()
|
affected, _ := result.RowsAffected()
|
||||||
id, _ := result.LastInsertId()
|
id, _ := result.LastInsertId()
|
||||||
fmt.Printf("UpdateSecret insert returned result id '%d' affecting %d row(s).\n", id, affected)
|
log.Printf("UpdateSecret insert returned result id '%d' affecting %d row(s).\n", id, affected)
|
||||||
}
|
}
|
||||||
|
|
||||||
return s, nil
|
return s, nil
|
||||||
@@ -128,35 +128,35 @@ func (s *Secret) EncryptSecret() (*Secret, error) {
|
|||||||
//key := []byte("ECB518652A170880555136EA1F9752D6")
|
//key := []byte("ECB518652A170880555136EA1F9752D6")
|
||||||
plaintext := []byte(s.Secret)
|
plaintext := []byte(s.Secret)
|
||||||
|
|
||||||
fmt.Printf("EncryptSecret applying key '%v' of length '%d' to plaintext secret '%s'\n", key, len(key), s.Secret)
|
log.Printf("EncryptSecret applying key '%v' of length '%d' to plaintext secret '%s'\n", key, len(key), s.Secret)
|
||||||
|
|
||||||
block, err := aes.NewCipher(key)
|
block, err := aes.NewCipher(key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("EncryptSecret NewCipher error '%s'\n", err)
|
log.Printf("EncryptSecret NewCipher error '%s'\n", err)
|
||||||
return s, err
|
return s, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Never use more than 2^32 random nonces with a given key because of the risk of a repeat.
|
// Never use more than 2^32 random nonces with a given key because of the risk of a repeat.
|
||||||
nonce := make([]byte, nonceSize)
|
nonce := make([]byte, nonceSize)
|
||||||
if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
|
if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
|
||||||
fmt.Printf("EncryptSecret nonce generation error '%s'\n", err)
|
log.Printf("EncryptSecret nonce generation error '%s'\n", err)
|
||||||
return s, err
|
return s, err
|
||||||
}
|
}
|
||||||
fmt.Printf("EncryptSecret random nonce value is '%x'\n", nonce)
|
log.Printf("EncryptSecret random nonce value is '%x'\n", nonce)
|
||||||
|
|
||||||
aesgcm, err := cipher.NewGCM(block)
|
aesgcm, err := cipher.NewGCM(block)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("EncryptSecret NewGCM error '%s'\n", err)
|
log.Printf("EncryptSecret NewGCM error '%s'\n", err)
|
||||||
return s, err
|
return s, err
|
||||||
}
|
}
|
||||||
|
|
||||||
ciphertext := aesgcm.Seal(nil, nonce, plaintext, nil)
|
ciphertext := aesgcm.Seal(nil, nonce, plaintext, nil)
|
||||||
fmt.Printf("EncryptSecret generated ciphertext '%x''\n", ciphertext)
|
log.Printf("EncryptSecret generated ciphertext '%x''\n", ciphertext)
|
||||||
|
|
||||||
// Create a new slice to store nonce at the start and then the resulting ciphertext
|
// Create a new slice to store nonce at the start and then the resulting ciphertext
|
||||||
// Nonce is always 12 bytes
|
// Nonce is always 12 bytes
|
||||||
combinedText := append(nonce, ciphertext...)
|
combinedText := append(nonce, ciphertext...)
|
||||||
fmt.Printf("EncryptSecret combined secret value is now '%x'\n", combinedText)
|
log.Printf("EncryptSecret combined secret value is now '%x'\n", combinedText)
|
||||||
|
|
||||||
// Store the value back into the struct ready for database operations
|
// Store the value back into the struct ready for database operations
|
||||||
s.Secret = hex.EncodeToString(combinedText)
|
s.Secret = hex.EncodeToString(combinedText)
|
||||||
@@ -175,44 +175,44 @@ func (s *Secret) DecryptSecret() (*Secret, error) {
|
|||||||
//key := []byte("ECB518652A170880555136EA1F9752D6")
|
//key := []byte("ECB518652A170880555136EA1F9752D6")
|
||||||
|
|
||||||
if len(s.Secret) < nonceSize {
|
if len(s.Secret) < nonceSize {
|
||||||
fmt.Printf("DecryptSecret ciphertext is too short to decrypt\n")
|
log.Printf("DecryptSecret ciphertext is too short to decrypt\n")
|
||||||
return s, errors.New("ciphertext is too short")
|
return s, errors.New("ciphertext is too short")
|
||||||
}
|
}
|
||||||
|
|
||||||
crypted, err := hex.DecodeString(s.Secret)
|
crypted, err := hex.DecodeString(s.Secret)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("DecryptSecret unable to convert hex encoded string due to error '%s'\n", err)
|
log.Printf("DecryptSecret unable to convert hex encoded string due to error '%s'\n", err)
|
||||||
return s, err
|
return s, err
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("DecryptSecret processing secret '%x'\n", crypted)
|
log.Printf("DecryptSecret processing secret '%x'\n", crypted)
|
||||||
|
|
||||||
//nonce, _ := hex.DecodeString("64a9433eae7ccceee2fc0eda")
|
//nonce, _ := hex.DecodeString("64a9433eae7ccceee2fc0eda")
|
||||||
// The nonce is the first 12 bytes from the ciphertext
|
// The nonce is the first 12 bytes from the ciphertext
|
||||||
nonce := crypted[:nonceSize]
|
nonce := crypted[:nonceSize]
|
||||||
ciphertext := crypted[nonceSize:]
|
ciphertext := crypted[nonceSize:]
|
||||||
|
|
||||||
fmt.Printf("DecryptSecret applying key '%v' and nonce '%x' to ciphertext '%x'\n", key, nonce, ciphertext)
|
log.Printf("DecryptSecret applying key '%v' and nonce '%x' to ciphertext '%x'\n", key, nonce, ciphertext)
|
||||||
|
|
||||||
block, err := aes.NewCipher(key)
|
block, err := aes.NewCipher(key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("DecryptSecret NewCipher error '%s'\n", err)
|
log.Printf("DecryptSecret NewCipher error '%s'\n", err)
|
||||||
return s, err
|
return s, err
|
||||||
}
|
}
|
||||||
|
|
||||||
aesgcm, err := cipher.NewGCM(block)
|
aesgcm, err := cipher.NewGCM(block)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("DecryptSecret NewGCM error '%s'\n", err)
|
log.Printf("DecryptSecret NewGCM error '%s'\n", err)
|
||||||
return s, err
|
return s, err
|
||||||
}
|
}
|
||||||
|
|
||||||
plaintext, err := aesgcm.Open(nil, nonce, ciphertext, nil)
|
plaintext, err := aesgcm.Open(nil, nonce, ciphertext, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("DecryptSecret Open error '%s'\n", err)
|
log.Printf("DecryptSecret Open error '%s'\n", err)
|
||||||
return s, err
|
return s, err
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("DecryptSecret plaintext is '%s'\n", plaintext)
|
log.Printf("DecryptSecret plaintext is '%s'\n", plaintext)
|
||||||
|
|
||||||
s.Secret = string(plaintext)
|
s.Secret = string(plaintext)
|
||||||
return s, nil
|
return s, nil
|
||||||
|
@@ -74,10 +74,10 @@ func ConnectDatabase() {
|
|||||||
db, err = sqlx.Open("sqlite", sqlPath)
|
db, err = sqlx.Open("sqlite", sqlPath)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("Error opening sqlite database connection to file '%s' : '%s'\n", sqlPath, err)
|
log.Printf("Error opening sqlite database connection to file '%s' : '%s'\n", sqlPath, err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
} else {
|
} else {
|
||||||
fmt.Printf("Connected to sqlite database file '%s'\n", sqlPath)
|
log.Printf("Connected to sqlite database file '%s'\n", sqlPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
//sqlx.NameMapper = func(s string) string { return s }
|
//sqlx.NameMapper = func(s string) string { return s }
|
||||||
@@ -89,7 +89,7 @@ func ConnectDatabase() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func DisconnectDatabase() {
|
func DisconnectDatabase() {
|
||||||
fmt.Printf("DisconnectDatabase called")
|
log.Printf("DisconnectDatabase called")
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,28 +99,28 @@ func CreateTables() {
|
|||||||
// Create database tables if it doesn't exist
|
// Create database tables if it doesn't exist
|
||||||
// Roles table should go first since other tables refer to it
|
// Roles table should go first since other tables refer to it
|
||||||
if _, err = db.Exec(createRoles); err != nil {
|
if _, err = db.Exec(createRoles); err != nil {
|
||||||
fmt.Printf("Error checking roles table : '%s'", err)
|
log.Printf("Error checking roles table : '%s'", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
rowCount, _ = CheckCount("roles")
|
rowCount, _ = CheckCount("roles")
|
||||||
if rowCount == 0 {
|
if rowCount == 0 {
|
||||||
if _, err = db.Exec("INSERT INTO roles VALUES(1, 'Admin', false, true);"); err != nil {
|
if _, err = db.Exec("INSERT INTO roles VALUES(1, 'Admin', false, true);"); err != nil {
|
||||||
fmt.Printf("Error adding initial admin role : '%s'", err)
|
log.Printf("Error adding initial admin role : '%s'", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
if _, err = db.Exec("INSERT INTO roles VALUES(2, 'UserRole', false, false);"); err != nil {
|
if _, err = db.Exec("INSERT INTO roles VALUES(2, 'UserRole', false, false);"); err != nil {
|
||||||
fmt.Printf("Error adding initial user role : '%s'", err)
|
log.Printf("Error adding initial user role : '%s'", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
if _, err = db.Exec("INSERT INTO roles VALUES(3, 'GuestRole', true, false);"); err != nil {
|
if _, err = db.Exec("INSERT INTO roles VALUES(3, 'GuestRole', true, false);"); err != nil {
|
||||||
fmt.Printf("Error adding initial guest role : '%s'", err)
|
log.Printf("Error adding initial guest role : '%s'", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Users table
|
// Users table
|
||||||
if _, err = db.Exec(createUsers); err != nil {
|
if _, err = db.Exec(createUsers); err != nil {
|
||||||
fmt.Printf("Error checking users table : '%s'", err)
|
log.Printf("Error checking users table : '%s'", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
rowCount, _ = CheckCount("users")
|
rowCount, _ = CheckCount("users")
|
||||||
@@ -130,30 +130,30 @@ func CreateTables() {
|
|||||||
if initialPassword == "" {
|
if initialPassword == "" {
|
||||||
initialPassword = "password"
|
initialPassword = "password"
|
||||||
} else if initialPassword[:4] == "$2a$" {
|
} else if initialPassword[:4] == "$2a$" {
|
||||||
fmt.Printf("CreateTables inital admin password is already a hash")
|
log.Printf("CreateTables inital admin password is already a hash")
|
||||||
} else {
|
} else {
|
||||||
cryptText, _ := bcrypt.GenerateFromPassword([]byte(initialPassword), bcrypt.DefaultCost)
|
cryptText, _ := bcrypt.GenerateFromPassword([]byte(initialPassword), bcrypt.DefaultCost)
|
||||||
initialPassword = string(cryptText)
|
initialPassword = string(cryptText)
|
||||||
}
|
}
|
||||||
if _, err = db.Exec("INSERT INTO users VALUES(1, 1, 'Administrator', ?);", initialPassword); err != nil {
|
if _, err = db.Exec("INSERT INTO users VALUES(1, 1, 'Administrator', ?);", initialPassword); err != nil {
|
||||||
fmt.Printf("Error adding initial admin role : '%s'", err)
|
log.Printf("Error adding initial admin role : '%s'", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Secrets table
|
// Secrets table
|
||||||
if _, err = db.Exec(createSecrets); err != nil {
|
if _, err = db.Exec(createSecrets); err != nil {
|
||||||
fmt.Printf("Error checking secrets table : '%s'", err)
|
log.Printf("Error checking secrets table : '%s'", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
// Schema table should go last so we know if the database has a value in the schema table then everything was created properly
|
// Schema table should go last so we know if the database has a value in the schema table then everything was created properly
|
||||||
if _, err = db.Exec(createSchema); err != nil {
|
if _, err = db.Exec(createSchema); err != nil {
|
||||||
fmt.Printf("Error checking schema table : '%s'", err)
|
log.Printf("Error checking schema table : '%s'", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
schemaCheck, _ := CheckColumnExists("schema", "Version")
|
schemaCheck, _ := CheckColumnExists("schema", "Version")
|
||||||
if !schemaCheck {
|
if !schemaCheck {
|
||||||
if _, err = db.Exec("INSERT INTO schema VALUES(1);"); err != nil {
|
if _, err = db.Exec("INSERT INTO schema VALUES(1);"); err != nil {
|
||||||
fmt.Printf("Error adding initial scehama version : '%s'", err)
|
log.Printf("Error adding initial scehama version : '%s'", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -165,12 +165,12 @@ func CheckCount(tablename string) (int, error) {
|
|||||||
var count int
|
var count int
|
||||||
stmt, err := db.Prepare("SELECT COUNT(*) as count FROM " + tablename)
|
stmt, err := db.Prepare("SELECT COUNT(*) as count FROM " + tablename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("CheckCount error preparing sqlite statement : '%s'\n", err)
|
log.Printf("CheckCount error preparing sqlite statement : '%s'\n", err)
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
err = stmt.QueryRow().Scan(&count)
|
err = stmt.QueryRow().Scan(&count)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("CheckCount error querying database record count : '%s'\n", err)
|
log.Printf("CheckCount error querying database record count : '%s'\n", err)
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
stmt.Close() // or use defer rows.Close(), idc
|
stmt.Close() // or use defer rows.Close(), idc
|
||||||
@@ -214,7 +214,7 @@ func GenerateInsertMethod(q interface{}) (string, error) {
|
|||||||
fieldValues = fmt.Sprintf("%s, %d", fieldValues, boolSet)
|
fieldValues = fmt.Sprintf("%s, %d", fieldValues, boolSet)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
fmt.Printf("Unsupported type '%s'\n", v.Field(i).Kind())
|
log.Printf("Unsupported type '%s'\n", v.Field(i).Kind())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
query = fmt.Sprintf("%s(%s) VALUES (%s)", query, fieldNames, fieldValues)
|
query = fmt.Sprintf("%s(%s) VALUES (%s)", query, fieldNames, fieldValues)
|
||||||
@@ -227,14 +227,14 @@ func CheckColumnExists(table string, column string) (bool, error) {
|
|||||||
var count int64
|
var count int64
|
||||||
rows, err := db.Queryx("SELECT COUNT(*) AS CNTREC FROM pragma_table_info('" + table + "') WHERE name='" + column + "';")
|
rows, err := db.Queryx("SELECT COUNT(*) AS CNTREC FROM pragma_table_info('" + table + "') WHERE name='" + column + "';")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("CheckColumnExists error querying database for existence of column '%s' : '%s'\n", column, err)
|
log.Printf("CheckColumnExists error querying database for existence of column '%s' : '%s'\n", column, err)
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
defer rows.Close()
|
defer rows.Close()
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
// cols is an []interface{} of all of the column results
|
// cols is an []interface{} of all of the column results
|
||||||
cols, _ := rows.SliceScan()
|
cols, _ := rows.SliceScan()
|
||||||
fmt.Printf("CheckColumnExists Value is '%v' for table '%s' and column '%s'\n", cols[0].(int64), table, column)
|
log.Printf("CheckColumnExists Value is '%v' for table '%s' and column '%s'\n", cols[0].(int64), table, column)
|
||||||
count = cols[0].(int64)
|
count = cols[0].(int64)
|
||||||
|
|
||||||
if count == 1 {
|
if count == 1 {
|
||||||
@@ -246,7 +246,7 @@ func CheckColumnExists(table string, column string) (bool, error) {
|
|||||||
|
|
||||||
err = rows.Err()
|
err = rows.Err()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("CheckColumnExists error getting results : '%s'\n", err)
|
log.Printf("CheckColumnExists error getting results : '%s'\n", err)
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -3,7 +3,7 @@ package models
|
|||||||
import (
|
import (
|
||||||
"ccsecrets/utils/token"
|
"ccsecrets/utils/token"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
@@ -33,19 +33,19 @@ func (u *User) SaveUser() (*User, error) {
|
|||||||
result, err := db.NamedExec((`INSERT INTO users (RoleId, UserName, Password) VALUES (:RoleId, :UserName, :Password)`), u)
|
result, err := db.NamedExec((`INSERT INTO users (RoleId, UserName, Password) VALUES (:RoleId, :UserName, :Password)`), u)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("SaveUser error executing sql record : '%s'\n", err)
|
log.Printf("SaveUser error executing sql record : '%s'\n", err)
|
||||||
return &User{}, err
|
return &User{}, err
|
||||||
} else {
|
} else {
|
||||||
affected, _ := result.RowsAffected()
|
affected, _ := result.RowsAffected()
|
||||||
id, _ := result.LastInsertId()
|
id, _ := result.LastInsertId()
|
||||||
fmt.Printf("SaveUser insert returned result id '%d' affecting %d row(s).\n", id, affected)
|
log.Printf("SaveUser insert returned result id '%d' affecting %d row(s).\n", id, affected)
|
||||||
}
|
}
|
||||||
|
|
||||||
return u, nil
|
return u, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func VerifyPassword(password, hashedPassword string) error {
|
func VerifyPassword(password, hashedPassword string) error {
|
||||||
fmt.Printf("VerifyPassword comparing password vs hashed:\n'%s'\n'%s'\n", password, hashedPassword)
|
log.Printf("VerifyPassword comparing password vs hashed:\n'%s'\n'%s'\n", password, hashedPassword)
|
||||||
return bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(password))
|
return bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(password))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,7 +58,7 @@ func LoginCheck(username string, password string) (string, error) {
|
|||||||
// Query database for matching user object
|
// Query database for matching user object
|
||||||
err = db.QueryRowx("SELECT * FROM Users WHERE Username=?", username).StructScan(&u)
|
err = db.QueryRowx("SELECT * FROM Users WHERE Username=?", username).StructScan(&u)
|
||||||
|
|
||||||
fmt.Printf("LoginCheck retrieved user '%v' from database\n", u)
|
log.Printf("LoginCheck retrieved user '%v' from database\n", u)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
@@ -67,16 +67,16 @@ func LoginCheck(username string, password string) (string, error) {
|
|||||||
err = VerifyPassword(password, u.Password)
|
err = VerifyPassword(password, u.Password)
|
||||||
|
|
||||||
if err != nil && err == bcrypt.ErrMismatchedHashAndPassword {
|
if err != nil && err == bcrypt.ErrMismatchedHashAndPassword {
|
||||||
fmt.Printf("LoginCheck says password doesn't match stored hash.\n")
|
log.Printf("LoginCheck says password doesn't match stored hash.\n")
|
||||||
return "", err
|
return "", err
|
||||||
} else {
|
} else {
|
||||||
fmt.Printf("LoginCheck verified password against stored hash.\n")
|
log.Printf("LoginCheck verified password against stored hash.\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
token, err := token.GenerateToken(uint(u.UserId))
|
token, err := token.GenerateToken(uint(u.UserId))
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("LoginCheck error generating token : '%s'\n", err)
|
log.Printf("LoginCheck error generating token : '%s'\n", err)
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,10 +122,10 @@ func GetUserRoleByID(uid uint) (UserRole, error) {
|
|||||||
var ur UserRole
|
var ur UserRole
|
||||||
|
|
||||||
// Query database for matching user object
|
// Query database for matching user object
|
||||||
fmt.Printf("GetUserRoleByID querying for userid '%d'\n", uid)
|
log.Printf("GetUserRoleByID querying for userid '%d'\n", uid)
|
||||||
err := db.QueryRowx("SELECT users.UserId, users.RoleId, users.UserName, users.Password, roles.RoleName, roles.ReadOnly, roles.Admin FROM users INNER JOIN roles ON users.RoleId = roles.RoleId WHERE users.UserId=?", uid).StructScan(&ur)
|
err := db.QueryRowx("SELECT users.UserId, users.RoleId, users.UserName, users.Password, roles.RoleName, roles.ReadOnly, roles.Admin FROM users INNER JOIN roles ON users.RoleId = roles.RoleId WHERE users.UserId=?", uid).StructScan(&ur)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("GetUserRoleByID received error when querying database : '%s'\n", err)
|
log.Printf("GetUserRoleByID received error when querying database : '%s'\n", err)
|
||||||
return ur, errors.New("GetUserRoleByID user not found")
|
return ur, errors.New("GetUserRoleByID user not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,10 +144,10 @@ func GetUserRoleFromToken(c *gin.Context) (UserRole, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Query database for matching user object
|
// Query database for matching user object
|
||||||
fmt.Printf("GetUserRoleFromToken querying for userid '%d'\n", user_id)
|
log.Printf("GetUserRoleFromToken querying for userid '%d'\n", user_id)
|
||||||
err = db.QueryRowx("SELECT users.UserId, users.RoleId, users.UserName, users.Password, roles.RoleName, roles.ReadOnly, roles.Admin FROM users INNER JOIN roles ON users.RoleId = roles.RoleId WHERE users.UserId=?", user_id).StructScan(&ur)
|
err = db.QueryRowx("SELECT users.UserId, users.RoleId, users.UserName, users.Password, roles.RoleName, roles.ReadOnly, roles.Admin FROM users INNER JOIN roles ON users.RoleId = roles.RoleId WHERE users.UserId=?", user_id).StructScan(&ur)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("GetUserRoleFromToken received error when querying database : '%s'\n", err)
|
log.Printf("GetUserRoleFromToken received error when querying database : '%s'\n", err)
|
||||||
return ur, errors.New("GetUserRoleFromToken user not found")
|
return ur, errors.New("GetUserRoleFromToken user not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2,6 +2,7 @@ package token
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -15,7 +16,7 @@ func GenerateToken(user_id uint) (string, error) {
|
|||||||
|
|
||||||
token_lifespan, err := strconv.Atoi(os.Getenv("TOKEN_HOUR_LIFESPAN"))
|
token_lifespan, err := strconv.Atoi(os.Getenv("TOKEN_HOUR_LIFESPAN"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("GenerateToken Error getting env value TOKEN_HOUR_LIFESPAN\n")
|
log.Printf("GenerateToken Error getting env value TOKEN_HOUR_LIFESPAN\n")
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -6,7 +6,6 @@ import (
|
|||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
"crypto/x509/pkix"
|
"crypto/x509/pkix"
|
||||||
"encoding/pem"
|
"encoding/pem"
|
||||||
"fmt"
|
|
||||||
"log"
|
"log"
|
||||||
"math/big"
|
"math/big"
|
||||||
"net"
|
"net"
|
||||||
@@ -25,7 +24,7 @@ func GetFilePath(path string) string {
|
|||||||
|
|
||||||
// check if filename exists
|
// check if filename exists
|
||||||
if _, err := os.Stat(path); os.IsNotExist((err)) {
|
if _, err := os.Stat(path); os.IsNotExist((err)) {
|
||||||
fmt.Printf("File '%s' not found, searching in same directory as binary\n", path)
|
log.Printf("File '%s' not found, searching in same directory as binary\n", path)
|
||||||
// if not, check that it exists in the same directory as the currently executing binary
|
// if not, check that it exists in the same directory as the currently executing binary
|
||||||
ex, err2 := os.Executable()
|
ex, err2 := os.Executable()
|
||||||
if err2 != nil {
|
if err2 != nil {
|
||||||
@@ -76,7 +75,7 @@ func GenerateCerts(tlsCert string, tlsKey string) {
|
|||||||
|
|
||||||
// Check that the directory exists
|
// Check that the directory exists
|
||||||
relativePath := filepath.Dir(tlsCert)
|
relativePath := filepath.Dir(tlsCert)
|
||||||
fmt.Printf("GenerateCerts relative path for file creation is '%s'\n", relativePath)
|
log.Printf("GenerateCerts relative path for file creation is '%s'\n", relativePath)
|
||||||
_, err = os.Stat(relativePath)
|
_, err = os.Stat(relativePath)
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
log.Printf("Certificate path does not exist, creating %s before generating certificate\n", relativePath)
|
log.Printf("Certificate path does not exist, creating %s before generating certificate\n", relativePath)
|
||||||
@@ -126,13 +125,13 @@ func GenerateCerts(tlsCert string, tlsKey string) {
|
|||||||
ifaces, err := net.Interfaces()
|
ifaces, err := net.Interfaces()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("Error enumerating interfaces: %v\n", err)
|
log.Printf("Error enumerating interfaces: %v\n", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, i := range ifaces {
|
for _, i := range ifaces {
|
||||||
addrs, err := i.Addrs()
|
addrs, err := i.Addrs()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("Oops: %v\n", err)
|
log.Printf("Oops: %v\n", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, address := range addrs {
|
for _, address := range addrs {
|
||||||
|
Reference in New Issue
Block a user