Skip to content

Commit

Permalink
Merge pull request #13 from tranchitella/men-4360
Browse files Browse the repository at this point in the history
MEN-4360: Extend the D-Bus API client to fetch the server URL
  • Loading branch information
lluiscampos committed Jan 18, 2021
2 parents b5f1a49 + 32cf712 commit ba20f26
Show file tree
Hide file tree
Showing 9 changed files with 82 additions and 20 deletions.
9 changes: 7 additions & 2 deletions app/daemon.go
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,9 @@ func (d *MenderShellDaemon) waitForJWTToken(client mender.AuthClient) (string, e
for {
select {
case p := <-tokenStateChange:
if len(p) > 1 && p[1].ParamType == dbus.GDBusTypeString && len(p[1].ParamData.(string)) > 0 {
d.serverUrl = p[1].ParamData.(string)
}
if len(p) > 0 && p[0].ParamType == dbus.GDBusTypeString && len(p[0].ParamData.(string)) > 0 {
return p[0].ParamData.(string), nil
}
Expand Down Expand Up @@ -295,13 +298,14 @@ func (d *MenderShellDaemon) dbusEventLoop(client mender.AuthClient) {
}
}
if needsReconnect && d.authorized {
jwtToken, _ := client.GetJWTToken()
jwtToken, serverURL, _ := client.GetJWTToken()
e := MenderShellDaemonEvent{
event: EventReconnect,
data: jwtToken,
id: "(dbusEventLoop)",
}
log.Debugf("(dbusEventLoop) posting Event: %s", e.event)
d.serverUrl = serverURL
d.postEvent(e)
needsReconnect = false
}
Expand Down Expand Up @@ -403,10 +407,11 @@ func (d *MenderShellDaemon) Run() error {
return err
}

jwtToken, err := client.GetJWTToken()
jwtToken, serverURL, err := client.GetJWTToken()
if err != nil {
log.Warnf("call to GetJWTToken on the Mender D-Bus API failed: %v", err)
}
d.serverUrl = serverURL

log.Debugf("GetJWTToken().len=%d", len(jwtToken))
if len(jwtToken) < 1 {
Expand Down
8 changes: 4 additions & 4 deletions app/daemon_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -960,7 +960,7 @@ func TestWaitForJWTToken(t *testing.T) {
jwtTokenStateChangeChan := make(chan []dbus.SignalParams, 1)
client.On("GetJwtTokenStateChangeChannel").Return(jwtTokenStateChangeChan, tc.err)

client.On("GetJWTToken").Return(tc.token, tc.err)
client.On("GetJWTToken").Return(tc.token, "", tc.err)
token, err := d.waitForJWTToken(client)
if tc.err != nil {
assert.Error(t, err)
Expand Down Expand Up @@ -1003,7 +1003,7 @@ func TestWaitForJWTToken(t *testing.T) {
},
}
client.On("GetJwtTokenStateChangeChannel").Return(jwtTokenStateChangeChan, tc.err)
client.On("GetJWTToken").Return(tc.token, tc.err)
client.On("GetJWTToken").Return(tc.token, "", tc.err)
token, err := d.waitForJWTToken(client)
if tc.err != nil {
assert.Error(t, err)
Expand Down Expand Up @@ -1067,7 +1067,7 @@ func TestDBusEventLoop(t *testing.T) {
ParamData: tc.token,
},
}, tc.err)
client.On("GetJWTToken").Return(tc.token, tc.err)
client.On("GetJWTToken").Return(tc.token, "", tc.err)
d.dbusEventLoop(client)
})
done <- true
Expand Down Expand Up @@ -1100,7 +1100,7 @@ func TestDBusEventLoop(t *testing.T) {
ParamData: tc.token,
},
}, tc.err)
client.On("GetJWTToken").Return(tc.token, tc.err)
client.On("GetJWTToken").Return(tc.token, "", tc.err)
go func() {
time.Sleep(time.Second)
d.stop = true
Expand Down
2 changes: 2 additions & 0 deletions client/dbus/dbus.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ var dbusAPI DBusAPI = nil
type DBusCallResponse interface {
// GetString returns a string stored in the response object
GetString() string
// GetString returns two strings stored in the response object
GetTwoStrings() (string, string)
// GetBoolean returns a boolean stored in the response object
GetBoolean() bool
}
Expand Down
18 changes: 18 additions & 0 deletions client/dbus/dbus_libgio.go.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,24 @@ static gchar *string_from_g_variant(GVariant *value)
return str;
}

// creates a new string from a GVariant containing two strings
static gchar *first_string_from_g_variant(GVariant *value)
{
gchar *str1;
gchar *str2;
g_variant_get(value, "(ss)", &str1, &str2);
return str1;
}

// creates a new string from a GVariant containing two strings
static gchar *second_string_from_g_variant(GVariant *value)
{
gchar *str1;
gchar *str2;
g_variant_get(value, "(ss)", &str1, &str2);
return str2;
}

// creates a new boolean from a GVariant
static gboolean boolean_from_g_variant(GVariant *value)
{
Expand Down
10 changes: 9 additions & 1 deletion client/dbus/dbus_libgio_response.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2020 Northern.tech AS
// Copyright 2021 Northern.tech AS
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -38,6 +38,14 @@ func (r *dbusCallResponseLibgio) GetString() string {
return goString(str)
}

// GetTwoStrings returns two string stored in the response object
func (r *dbusCallResponseLibgio) GetTwoStrings() (string, string) {
gvariant := C.to_gvariant(r.ptr)
str1 := C.first_string_from_g_variant(gvariant)
str2 := C.second_string_from_g_variant(gvariant)
return goString(str1), goString(str2)
}

// GetBoolean returns a boolean stored in the response object
func (r *dbusCallResponseLibgio) GetBoolean() bool {
val := C.boolean_from_g_variant(C.to_gvariant(r.ptr))
Expand Down
23 changes: 22 additions & 1 deletion client/dbus/mocks/DBusCallResponse.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 5 additions & 4 deletions client/mender/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ type AuthClient interface {
// Connect to the Mender client interface
Connect(objectName, objectPath, interfaceName string) error
// GetJWTToken returns a device JWT token
GetJWTToken() (string, error)
GetJWTToken() (string, string, error)
// FetchJWTToken schedules the fetching of a new device JWT token
FetchJWTToken() (bool, error)
// GetJwtTokenStateChangeChannel returns a channel that can be used to wait for the JwtTokenStateChange signal
Expand Down Expand Up @@ -85,12 +85,13 @@ func (a *AuthClientDBUS) Connect(objectName, objectPath, interfaceName string) e
}

// GetJWTToken returns a device JWT token
func (a *AuthClientDBUS) GetJWTToken() (string, error) {
func (a *AuthClientDBUS) GetJWTToken() (string, string, error) {
response, err := a.dbusAPI.BusProxyCall(a.authManagerProxy, DBusMethodNameGetJwtToken, nil, DBusMethodTimeoutInMilliSeconds)
if err != nil {
return "", err
return "", "", err
}
return response.GetString(), nil
token, serverURL := response.GetTwoStrings()
return token, serverURL, nil
}

// FetchJWTToken schedules the fetching of a new device JWT token
Expand Down
6 changes: 3 additions & 3 deletions client/mender/auth_test.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2020 Northern.tech AS
// Copyright 2021 Northern.tech AS
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -117,7 +117,7 @@ func TestAuthClientGetJWTToken(t *testing.T) {
defer response.AssertExpectations(t)

if tc.busProxyCallError == nil {
response.On("GetString").Return(JWTTokenValue)
response.On("GetTwoStrings").Return(JWTTokenValue, "")
}

dbusAPI := &dbus_mocks.DBusAPI{}
Expand All @@ -134,7 +134,7 @@ func TestAuthClientGetJWTToken(t *testing.T) {
assert.NoError(t, err)
assert.NotNil(t, client)

value, err := client.GetJWTToken()
value, _, err := client.GetJWTToken()
if tc.busProxyCallError != nil {
assert.Error(t, err, tc.busProxyCallError)
} else {
Expand Down
17 changes: 12 additions & 5 deletions client/mender/mocks/AuthClient.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit ba20f26

Please sign in to comment.