NewServer builds a new server.
(c Component, contextFiller fillcontext.Filler, conf config.InteropServer)
| 90 | |
| 91 | // NewServer builds a new server. |
| 92 | func NewServer(c Component, contextFiller fillcontext.Filler, conf config.InteropServer) (*Server, error) { |
| 93 | ctx := log.NewContextWithField(c.Context(), "namespace", "interop") |
| 94 | logger := log.FromContext(ctx) |
| 95 | |
| 96 | // TODO: Remove (https://github.com/TheThingsNetwork/lorawan-stack/issues/6026) |
| 97 | senderClientCAs, err := fetchSenderClientCAs(ctx, conf, c) |
| 98 | if err != nil { |
| 99 | return nil, err |
| 100 | } |
| 101 | senderClientCAPool := x509.NewCertPool() |
| 102 | for _, certs := range senderClientCAs { |
| 103 | for _, cert := range certs { |
| 104 | senderClientCAPool.AddCert(cert) |
| 105 | } |
| 106 | } |
| 107 | |
| 108 | tokenVerifiers := make(map[string]tokenVerifier) |
| 109 | if conf.PacketBroker.Enabled { |
| 110 | iss := conf.PacketBroker.TokenIssuer |
| 111 | // The token audience must match the configured public TLS address. Therefore, a non-empty value must be set. |
| 112 | aud := conf.PublicTLSAddress |
| 113 | if aud == "" { |
| 114 | return nil, errNoPublicTLSAddress.New() |
| 115 | } |
| 116 | tokenVerifier, err := newPacketBrokerTokenVerifier(ctx, iss, aud, c) |
| 117 | if err != nil { |
| 118 | return nil, err |
| 119 | } |
| 120 | tokenVerifiers[iss] = tokenVerifier |
| 121 | } |
| 122 | |
| 123 | s := &Server{ |
| 124 | config: conf, |
| 125 | // TODO: Remove (https://github.com/TheThingsNetwork/lorawan-stack/issues/6026) |
| 126 | senderClientCAs: senderClientCAs, |
| 127 | senderClientCAPool: senderClientCAPool, |
| 128 | tokenVerifiers: tokenVerifiers, |
| 129 | js: &noopServer{}, |
| 130 | } |
| 131 | |
| 132 | s.router = mux.NewRouter() |
| 133 | s.router.NotFoundHandler = http.HandlerFunc(webhandlers.NotFound) |
| 134 | s.router.Use( |
| 135 | mux.MiddlewareFunc(webmiddleware.Recover()), |
| 136 | mux.MiddlewareFunc(webmiddleware.FillContext(contextFiller)), |
| 137 | mux.MiddlewareFunc(webmiddleware.RequestURL()), |
| 138 | mux.MiddlewareFunc(webmiddleware.RequestID()), |
| 139 | mux.MiddlewareFunc(webmiddleware.MaxBody(1<<15)), // 32 kB. |
| 140 | mux.MiddlewareFunc(webmiddleware.Log(logger, nil)), |
| 141 | mux.MiddlewareFunc(ratelimit.HTTPMiddleware(c.RateLimiter(), "http:interop")), |
| 142 | ) |
| 143 | s.router. |
| 144 | NewRoute(). |
| 145 | Handler(s.handle()). |
| 146 | Headers("Content-Type", "application/json"). |
| 147 | Methods(http.MethodPost) |
| 148 | |
| 149 | return s, nil |