• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

mendersoftware / deviceauth / 1056932186

25 Oct 2023 05:42PM UTC coverage: 83.607% (-1.0%) from 84.604%
1056932186

push

gitlab-ci

web-flow
Merge pull request #674 from tranchitella/men-6775

feat: support for Ed25519 server keys for signing the JWT tokens

121 of 137 new or added lines in 5 files covered. (88.32%)

2 existing lines in 1 file now uncovered.

4789 of 5728 relevant lines covered (83.61%)

47.01 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

71.43
/server.go
1
// Copyright 2023 Northern.tech AS
2
//
3
//    Licensed under the Apache License, Version 2.0 (the "License");
4
//    you may not use this file except in compliance with the License.
5
//    You may obtain a copy of the License at
6
//
7
//        http://www.apache.org/licenses/LICENSE-2.0
8
//
9
//    Unless required by applicable law or agreed to in writing, software
10
//    distributed under the License is distributed on an "AS IS" BASIS,
11
//    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
//    See the License for the specific language governing permissions and
13
//    limitations under the License.
14

15
package main
16

17
import (
18
        "net/http"
19
        "time"
20

21
        "github.com/ant0ine/go-json-rest/rest"
22
        "github.com/mendersoftware/go-lib-micro/config"
23
        "github.com/mendersoftware/go-lib-micro/log"
24
        "github.com/pkg/errors"
25

26
        api_http "github.com/mendersoftware/deviceauth/api/http"
27
        "github.com/mendersoftware/deviceauth/cache"
28
        "github.com/mendersoftware/deviceauth/client/orchestrator"
29
        "github.com/mendersoftware/deviceauth/client/tenant"
30
        dconfig "github.com/mendersoftware/deviceauth/config"
31
        "github.com/mendersoftware/deviceauth/devauth"
32
        "github.com/mendersoftware/deviceauth/jwt"
33
        "github.com/mendersoftware/deviceauth/store/mongo"
34
)
35

36
func SetupAPI(stacktype string) (*rest.Api, error) {
3✔
37
        api := rest.NewApi()
3✔
38
        if err := SetupMiddleware(api, stacktype); err != nil {
4✔
39
                return nil, errors.Wrap(err, "failed to setup middleware")
1✔
40
        }
1✔
41

42
        //this will override the framework's error resp to the desired one:
43
        // {"error": "msg"}
44
        // instead of:
45
        // {"Error": "msg"}
46
        rest.ErrorFieldName = "error"
2✔
47

2✔
48
        return api, nil
2✔
49
}
50

51
func RunServer(c config.Reader) error {
1✔
52
        var tenantadmAddr = c.GetString(dconfig.SettingTenantAdmAddr)
1✔
53

1✔
54
        l := log.New(log.Ctx{})
1✔
55

1✔
56
        db, err := mongo.NewDataStoreMongo(
1✔
57
                mongo.DataStoreMongoConfig{
1✔
58
                        ConnectionString: c.GetString(dconfig.SettingDb),
1✔
59

1✔
60
                        SSL:           c.GetBool(dconfig.SettingDbSSL),
1✔
61
                        SSLSkipVerify: c.GetBool(dconfig.SettingDbSSLSkipVerify),
1✔
62

1✔
63
                        Username: c.GetString(dconfig.SettingDbUsername),
1✔
64
                        Password: c.GetString(dconfig.SettingDbPassword),
1✔
65
                })
1✔
66
        if err != nil {
1✔
67
                return errors.Wrap(err, "database connection failed")
×
68
        }
×
69

70
        jwtHandler, err := jwt.NewJWTHandler(
1✔
71
                c.GetString(dconfig.SettingServerPrivKeyPath),
1✔
72
        )
1✔
73
        var jwtFallbackHandler jwt.Handler
1✔
74
        fallback := c.GetString(dconfig.SettingServerFallbackPrivKeyPath)
1✔
75
        if err == nil && fallback != "" {
1✔
NEW
76
                jwtFallbackHandler, err = jwt.NewJWTHandler(
×
NEW
77
                        fallback,
×
NEW
78
                )
×
NEW
79
        }
×
80
        if err != nil {
1✔
NEW
81
                return err
×
NEW
82
        }
×
83

84
        orchClientConf := orchestrator.Config{
1✔
85
                OrchestratorAddr: c.GetString(dconfig.SettingOrchestratorAddr),
1✔
86
                Timeout:          time.Duration(30) * time.Second,
1✔
87
        }
1✔
88

1✔
89
        devauth := devauth.NewDevAuth(db,
1✔
90
                orchestrator.NewClient(orchClientConf),
1✔
91
                jwtHandler,
1✔
92
                devauth.Config{
1✔
93
                        Issuer:             c.GetString(dconfig.SettingJWTIssuer),
1✔
94
                        ExpirationTime:     int64(c.GetInt(dconfig.SettingJWTExpirationTimeout)),
1✔
95
                        DefaultTenantToken: c.GetString(dconfig.SettingDefaultTenantToken),
1✔
96
                        InventoryAddr:      config.Config.GetString(dconfig.SettingInventoryAddr),
1✔
97

1✔
98
                        EnableReporting: config.Config.GetBool(dconfig.SettingEnableReporting),
1✔
99
                        HaveAddons: config.Config.GetBool(dconfig.SettingHaveAddons) &&
1✔
100
                                tenantadmAddr != "",
1✔
101
                })
1✔
102

1✔
103
        if jwtFallbackHandler != nil {
1✔
NEW
104
                devauth = devauth.WithJWTFallbackHandler(jwtFallbackHandler)
×
NEW
105
        }
×
106

107
        if tenantadmAddr != "" {
2✔
108
                tc := tenant.NewClient(tenant.Config{
1✔
109
                        TenantAdmAddr: tenantadmAddr,
1✔
110
                })
1✔
111
                devauth = devauth.WithTenantVerification(tc)
1✔
112
        }
1✔
113

114
        if cacheAddr := c.GetString(dconfig.SettingRedisAddr); cacheAddr != "" {
1✔
115
                l.Infof("setting up redis cache")
×
116

×
117
                cache, err := cache.NewRedisCache(cacheAddr,
×
118
                        c.GetString(dconfig.SettingRedisUsername),
×
119
                        c.GetString(dconfig.SettingRedisPassword),
×
120
                        c.GetInt(dconfig.SettingRedisDb),
×
121
                        c.GetInt(dconfig.SettingRedisTimeoutSec),
×
122
                        c.GetInt(dconfig.SettingRedisLimitsExpSec),
×
123
                )
×
124

×
125
                if err != nil {
×
126
                        return err
×
127
                }
×
128

129
                devauth = devauth.WithCache(cache)
×
130
        }
131

132
        api, err := SetupAPI(c.GetString(dconfig.SettingMiddleware))
1✔
133
        if err != nil {
1✔
134
                return errors.Wrap(err, "API setup failed")
×
135
        }
×
136

137
        devauthapi := api_http.NewDevAuthApiHandlers(devauth, db)
1✔
138

1✔
139
        apph, err := devauthapi.GetApp()
1✔
140
        if err != nil {
1✔
141
                return errors.Wrap(err, "device authentication API handlers setup failed")
×
142
        }
×
143
        api.SetApp(apph)
1✔
144

1✔
145
        addr := c.GetString(dconfig.SettingListen)
1✔
146
        l.Printf("listening on %s", addr)
1✔
147

1✔
148
        return http.ListenAndServe(addr, api.MakeHandler())
1✔
149
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc