Merge branch 'update-goamqp' into 'main'
chore: update to latest version of goamqp See merge request unboundsoftware/shiny/authz_client!3
This commit was merged in pull request #6.
This commit is contained in:
@@ -6,6 +6,8 @@ import (
|
|||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
|
||||||
|
"gitlab.com/sparetimecoders/goamqp"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CompanyPrivileges contains the privileges for a combination of email address and company id
|
// CompanyPrivileges contains the privileges for a combination of email address and company id
|
||||||
@@ -69,7 +71,7 @@ func (h *PrivilegeHandler) Fetch() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Process privilege-related events and update the internal state
|
// Process privilege-related events and update the internal state
|
||||||
func (h *PrivilegeHandler) Process(msg interface{}) bool {
|
func (h *PrivilegeHandler) Process(msg interface{}, _ goamqp.Headers) (interface{}, error) {
|
||||||
switch ev := msg.(type) {
|
switch ev := msg.(type) {
|
||||||
case *UserAdded:
|
case *UserAdded:
|
||||||
if priv, exists := h.privileges[ev.Email]; exists {
|
if priv, exists := h.privileges[ev.Email]; exists {
|
||||||
@@ -79,21 +81,21 @@ func (h *PrivilegeHandler) Process(msg interface{}) bool {
|
|||||||
ev.CompanyID: {},
|
ev.CompanyID: {},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true
|
return nil, nil
|
||||||
case *UserRemoved:
|
case *UserRemoved:
|
||||||
if priv, exists := h.privileges[ev.Email]; exists {
|
if priv, exists := h.privileges[ev.Email]; exists {
|
||||||
delete(priv, ev.CompanyID)
|
delete(priv, ev.CompanyID)
|
||||||
}
|
}
|
||||||
return true
|
return nil, nil
|
||||||
case *PrivilegeAdded:
|
case *PrivilegeAdded:
|
||||||
h.setPrivileges(ev.Email, ev.CompanyID, ev.Privilege, true)
|
h.setPrivileges(ev.Email, ev.CompanyID, ev.Privilege, true)
|
||||||
return true
|
return nil, nil
|
||||||
case *PrivilegeRemoved:
|
case *PrivilegeRemoved:
|
||||||
h.setPrivileges(ev.Email, ev.CompanyID, ev.Privilege, false)
|
h.setPrivileges(ev.Email, ev.CompanyID, ev.Privilege, false)
|
||||||
return true
|
return nil, nil
|
||||||
default:
|
default:
|
||||||
fmt.Printf("Got unexpected message type (%s): '%+v'\n", reflect.TypeOf(msg).String(), msg)
|
fmt.Printf("Got unexpected message type (%s): '%+v'\n", reflect.TypeOf(msg).String(), msg)
|
||||||
return false
|
return nil, fmt.Errorf("unexpected event type: '%s'", reflect.TypeOf(msg))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+52
-40
@@ -8,25 +8,28 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
"gitlab.com/sparetimecoders/goamqp"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestPrivilegeHandler_Process_InvalidType(t *testing.T) {
|
func TestPrivilegeHandler_Process_InvalidType(t *testing.T) {
|
||||||
handler := New(WithBaseURL("base"))
|
handler := New(WithBaseURL("base"))
|
||||||
|
|
||||||
result := handler.Process("abc")
|
result, err := handler.Process("abc", goamqp.Headers{})
|
||||||
|
|
||||||
assert.False(t, result)
|
assert.Nil(t, result)
|
||||||
|
assert.EqualError(t, err, "unexpected event type: 'string'")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPrivilegeHandler_Process_PrivilegeRemoved(t *testing.T) {
|
func TestPrivilegeHandler_Process_PrivilegeRemoved(t *testing.T) {
|
||||||
handler := New(WithBaseURL("base"))
|
handler := New(WithBaseURL("base"))
|
||||||
|
|
||||||
result := handler.Process(&PrivilegeAdded{
|
result, err := handler.Process(&PrivilegeAdded{
|
||||||
Email: "jim@example.org",
|
Email: "jim@example.org",
|
||||||
CompanyID: "abc-123",
|
CompanyID: "abc-123",
|
||||||
Privilege: PrivilegeAdmin,
|
Privilege: PrivilegeAdmin,
|
||||||
})
|
}, goamqp.Headers{})
|
||||||
assert.True(t, result)
|
assert.Nil(t, result)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
companies := handler.CompaniesByUser("jim@example.org", func(privileges CompanyPrivileges) bool {
|
companies := handler.CompaniesByUser("jim@example.org", func(privileges CompanyPrivileges) bool {
|
||||||
return privileges.Admin
|
return privileges.Admin
|
||||||
@@ -34,12 +37,13 @@ func TestPrivilegeHandler_Process_PrivilegeRemoved(t *testing.T) {
|
|||||||
|
|
||||||
assert.Equal(t, []string{"abc-123"}, companies)
|
assert.Equal(t, []string{"abc-123"}, companies)
|
||||||
|
|
||||||
result = handler.Process(&PrivilegeRemoved{
|
result, err = handler.Process(&PrivilegeRemoved{
|
||||||
Email: "jim@example.org",
|
Email: "jim@example.org",
|
||||||
CompanyID: "abc-123",
|
CompanyID: "abc-123",
|
||||||
Privilege: PrivilegeAdmin,
|
Privilege: PrivilegeAdmin,
|
||||||
})
|
}, goamqp.Headers{})
|
||||||
assert.True(t, result)
|
assert.Nil(t, result)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
companies = handler.CompaniesByUser("jim@example.org", func(privileges CompanyPrivileges) bool {
|
companies = handler.CompaniesByUser("jim@example.org", func(privileges CompanyPrivileges) bool {
|
||||||
return privileges.Admin
|
return privileges.Admin
|
||||||
@@ -51,17 +55,19 @@ func TestPrivilegeHandler_Process_PrivilegeRemoved(t *testing.T) {
|
|||||||
func TestPrivilegeHandler_Process_UserAdded_And_UserRemoved(t *testing.T) {
|
func TestPrivilegeHandler_Process_UserAdded_And_UserRemoved(t *testing.T) {
|
||||||
handler := New(WithBaseURL("base"))
|
handler := New(WithBaseURL("base"))
|
||||||
|
|
||||||
result := handler.Process(&UserAdded{
|
result, err := handler.Process(&UserAdded{
|
||||||
Email: "jim@example.org",
|
Email: "jim@example.org",
|
||||||
CompanyID: "abc-123",
|
CompanyID: "abc-123",
|
||||||
})
|
}, goamqp.Headers{})
|
||||||
assert.True(t, result)
|
assert.Nil(t, result)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
result = handler.Process(&UserAdded{
|
result, err = handler.Process(&UserAdded{
|
||||||
Email: "jim@example.org",
|
Email: "jim@example.org",
|
||||||
CompanyID: "abc-456",
|
CompanyID: "abc-456",
|
||||||
})
|
}, goamqp.Headers{})
|
||||||
assert.True(t, result)
|
assert.Nil(t, result)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
companies := handler.CompaniesByUser("jim@example.org", func(privileges CompanyPrivileges) bool {
|
companies := handler.CompaniesByUser("jim@example.org", func(privileges CompanyPrivileges) bool {
|
||||||
return true
|
return true
|
||||||
@@ -69,17 +75,19 @@ func TestPrivilegeHandler_Process_UserAdded_And_UserRemoved(t *testing.T) {
|
|||||||
sort.Strings(companies)
|
sort.Strings(companies)
|
||||||
assert.Equal(t, []string{"abc-123", "abc-456"}, companies)
|
assert.Equal(t, []string{"abc-123", "abc-456"}, companies)
|
||||||
|
|
||||||
result = handler.Process(&UserRemoved{
|
result, err = handler.Process(&UserRemoved{
|
||||||
Email: "jim@example.org",
|
Email: "jim@example.org",
|
||||||
CompanyID: "abc-123",
|
CompanyID: "abc-123",
|
||||||
})
|
}, goamqp.Headers{})
|
||||||
assert.True(t, result)
|
assert.Nil(t, result)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
result = handler.Process(&UserRemoved{
|
result, err = handler.Process(&UserRemoved{
|
||||||
Email: "jim@example.org",
|
Email: "jim@example.org",
|
||||||
CompanyID: "abc-456",
|
CompanyID: "abc-456",
|
||||||
})
|
}, goamqp.Headers{})
|
||||||
assert.True(t, result)
|
assert.Nil(t, result)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
companies = handler.CompaniesByUser("jim@example.org", func(privileges CompanyPrivileges) bool {
|
companies = handler.CompaniesByUser("jim@example.org", func(privileges CompanyPrivileges) bool {
|
||||||
return true
|
return true
|
||||||
@@ -100,11 +108,12 @@ func TestPrivilegeHandler_GetCompanies_Email_Not_Found(t *testing.T) {
|
|||||||
func TestPrivilegeHandler_GetCompanies_No_Companies_Found(t *testing.T) {
|
func TestPrivilegeHandler_GetCompanies_No_Companies_Found(t *testing.T) {
|
||||||
handler := New(WithBaseURL("base"))
|
handler := New(WithBaseURL("base"))
|
||||||
|
|
||||||
result := handler.Process(&UserAdded{
|
result, err := handler.Process(&UserAdded{
|
||||||
Email: "jim@example.org",
|
Email: "jim@example.org",
|
||||||
CompanyID: "abc-123",
|
CompanyID: "abc-123",
|
||||||
})
|
}, goamqp.Headers{})
|
||||||
assert.True(t, result)
|
assert.Nil(t, result)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
companies := handler.CompaniesByUser("jim@example.org", func(privileges CompanyPrivileges) bool {
|
companies := handler.CompaniesByUser("jim@example.org", func(privileges CompanyPrivileges) bool {
|
||||||
return privileges.Admin
|
return privileges.Admin
|
||||||
@@ -118,11 +127,12 @@ func TestPrivilegeHandler_GetCompanies_No_Companies_Found(t *testing.T) {
|
|||||||
|
|
||||||
assert.Equal(t, []string{"abc-123"}, companies)
|
assert.Equal(t, []string{"abc-123"}, companies)
|
||||||
|
|
||||||
result = handler.Process(&UserRemoved{
|
result, err = handler.Process(&UserRemoved{
|
||||||
Email: "jim@example.org",
|
Email: "jim@example.org",
|
||||||
CompanyID: "abc-123",
|
CompanyID: "abc-123",
|
||||||
})
|
}, goamqp.Headers{})
|
||||||
assert.True(t, result)
|
assert.Nil(t, result)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
companies = handler.CompaniesByUser("jim@example.org", func(privileges CompanyPrivileges) bool {
|
companies = handler.CompaniesByUser("jim@example.org", func(privileges CompanyPrivileges) bool {
|
||||||
return true
|
return true
|
||||||
@@ -133,12 +143,13 @@ func TestPrivilegeHandler_GetCompanies_No_Companies_Found(t *testing.T) {
|
|||||||
func TestPrivilegeHandler_GetCompanies_Company_With_Company_Access_Found(t *testing.T) {
|
func TestPrivilegeHandler_GetCompanies_Company_With_Company_Access_Found(t *testing.T) {
|
||||||
handler := New(WithBaseURL("base"))
|
handler := New(WithBaseURL("base"))
|
||||||
|
|
||||||
result := handler.Process(&PrivilegeAdded{
|
result, err := handler.Process(&PrivilegeAdded{
|
||||||
Email: "jim@example.org",
|
Email: "jim@example.org",
|
||||||
CompanyID: "abc-123",
|
CompanyID: "abc-123",
|
||||||
Privilege: PrivilegeCompany,
|
Privilege: PrivilegeCompany,
|
||||||
})
|
}, goamqp.Headers{})
|
||||||
assert.True(t, result)
|
assert.Nil(t, result)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
companies := handler.CompaniesByUser("jim@example.org", func(privileges CompanyPrivileges) bool {
|
companies := handler.CompaniesByUser("jim@example.org", func(privileges CompanyPrivileges) bool {
|
||||||
return privileges.Company
|
return privileges.Company
|
||||||
@@ -150,12 +161,13 @@ func TestPrivilegeHandler_GetCompanies_Company_With_Company_Access_Found(t *test
|
|||||||
func TestPrivilegeHandler_GetCompanies_Company_With_Admin_Access_Found(t *testing.T) {
|
func TestPrivilegeHandler_GetCompanies_Company_With_Admin_Access_Found(t *testing.T) {
|
||||||
handler := New(WithBaseURL("base"))
|
handler := New(WithBaseURL("base"))
|
||||||
|
|
||||||
result := handler.Process(&PrivilegeAdded{
|
result, err := handler.Process(&PrivilegeAdded{
|
||||||
Email: "jim@example.org",
|
Email: "jim@example.org",
|
||||||
CompanyID: "abc-123",
|
CompanyID: "abc-123",
|
||||||
Privilege: PrivilegeConsumer,
|
Privilege: PrivilegeConsumer,
|
||||||
})
|
}, goamqp.Headers{})
|
||||||
assert.True(t, result)
|
assert.Nil(t, result)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
companies := handler.CompaniesByUser("jim@example.org", func(privileges CompanyPrivileges) bool {
|
companies := handler.CompaniesByUser("jim@example.org", func(privileges CompanyPrivileges) bool {
|
||||||
return privileges.Consumer
|
return privileges.Consumer
|
||||||
@@ -177,11 +189,11 @@ func TestPrivilegeHandler_IsAllowed_Return_False_If_No_Privileges(t *testing.T)
|
|||||||
func TestPrivilegeHandler_IsAllowed_Return_True_If_Privilege_Exists(t *testing.T) {
|
func TestPrivilegeHandler_IsAllowed_Return_True_If_Privilege_Exists(t *testing.T) {
|
||||||
handler := New(WithBaseURL("base"))
|
handler := New(WithBaseURL("base"))
|
||||||
|
|
||||||
handler.Process(&PrivilegeAdded{
|
_, _ = handler.Process(&PrivilegeAdded{
|
||||||
Email: "jim@example.org",
|
Email: "jim@example.org",
|
||||||
CompanyID: "abc-123",
|
CompanyID: "abc-123",
|
||||||
Privilege: PrivilegeTime,
|
Privilege: PrivilegeTime,
|
||||||
})
|
}, goamqp.Headers{})
|
||||||
|
|
||||||
result := handler.IsAllowed("jim@example.org", "abc-123", func(privileges CompanyPrivileges) bool {
|
result := handler.IsAllowed("jim@example.org", "abc-123", func(privileges CompanyPrivileges) bool {
|
||||||
return privileges.Time
|
return privileges.Time
|
||||||
@@ -189,11 +201,11 @@ func TestPrivilegeHandler_IsAllowed_Return_True_If_Privilege_Exists(t *testing.T
|
|||||||
|
|
||||||
assert.True(t, result)
|
assert.True(t, result)
|
||||||
|
|
||||||
handler.Process(&PrivilegeAdded{
|
_, _ = handler.Process(&PrivilegeAdded{
|
||||||
Email: "jim@example.org",
|
Email: "jim@example.org",
|
||||||
CompanyID: "abc-123",
|
CompanyID: "abc-123",
|
||||||
Privilege: PrivilegeInvoicing,
|
Privilege: PrivilegeInvoicing,
|
||||||
})
|
}, goamqp.Headers{})
|
||||||
|
|
||||||
result = handler.IsAllowed("jim@example.org", "abc-123", func(privileges CompanyPrivileges) bool {
|
result = handler.IsAllowed("jim@example.org", "abc-123", func(privileges CompanyPrivileges) bool {
|
||||||
return privileges.Invoicing
|
return privileges.Invoicing
|
||||||
@@ -201,11 +213,11 @@ func TestPrivilegeHandler_IsAllowed_Return_True_If_Privilege_Exists(t *testing.T
|
|||||||
|
|
||||||
assert.True(t, result)
|
assert.True(t, result)
|
||||||
|
|
||||||
handler.Process(&PrivilegeAdded{
|
_, _ = handler.Process(&PrivilegeAdded{
|
||||||
Email: "jim@example.org",
|
Email: "jim@example.org",
|
||||||
CompanyID: "abc-123",
|
CompanyID: "abc-123",
|
||||||
Privilege: PrivilegeAccounting,
|
Privilege: PrivilegeAccounting,
|
||||||
})
|
}, goamqp.Headers{})
|
||||||
|
|
||||||
result = handler.IsAllowed("jim@example.org", "abc-123", func(privileges CompanyPrivileges) bool {
|
result = handler.IsAllowed("jim@example.org", "abc-123", func(privileges CompanyPrivileges) bool {
|
||||||
return privileges.Accounting
|
return privileges.Accounting
|
||||||
@@ -213,11 +225,11 @@ func TestPrivilegeHandler_IsAllowed_Return_True_If_Privilege_Exists(t *testing.T
|
|||||||
|
|
||||||
assert.True(t, result)
|
assert.True(t, result)
|
||||||
|
|
||||||
handler.Process(&PrivilegeAdded{
|
_, _ = handler.Process(&PrivilegeAdded{
|
||||||
Email: "jim@example.org",
|
Email: "jim@example.org",
|
||||||
CompanyID: "abc-123",
|
CompanyID: "abc-123",
|
||||||
Privilege: PrivilegeSupplier,
|
Privilege: PrivilegeSupplier,
|
||||||
})
|
}, goamqp.Headers{})
|
||||||
|
|
||||||
result = handler.IsAllowed("jim@example.org", "abc-123", func(privileges CompanyPrivileges) bool {
|
result = handler.IsAllowed("jim@example.org", "abc-123", func(privileges CompanyPrivileges) bool {
|
||||||
return privileges.Supplier
|
return privileges.Supplier
|
||||||
|
|||||||
@@ -2,4 +2,7 @@ module gitlab.com/unboundsoftware/shiny/authz_client
|
|||||||
|
|
||||||
go 1.13
|
go 1.13
|
||||||
|
|
||||||
require github.com/stretchr/testify v1.4.0
|
require (
|
||||||
|
github.com/stretchr/testify v1.4.0
|
||||||
|
gitlab.com/sparetimecoders/goamqp v0.3.1
|
||||||
|
)
|
||||||
|
|||||||
@@ -1,10 +1,20 @@
|
|||||||
|
github.com/caarlos0/env v3.5.0+incompatible/go.mod h1:tdCsowwCzMLdkqRYDlHpZCp2UooDD3MspDBjZ2AD02Y=
|
||||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
|
||||||
|
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271 h1:WhxRHzgeVGETMlmVfqhRn8RIeeNoPr2Czh33I4Zdccw=
|
||||||
|
github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
|
gitlab.com/sparetimecoders/goamqp v0.3.1 h1:Pf5nANlKzCP6h5MVrKgfKknf3Vkz3psGh97Mh8Coxqs=
|
||||||
|
gitlab.com/sparetimecoders/goamqp v0.3.1/go.mod h1:Xci7oyW/j9kJXr0QRgLRGv8e0R91ZSksPhYCei5FK5U=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
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/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
||||||
|
|||||||
Reference in New Issue
Block a user