| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | package api | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2023-12-05 23:04:39 +08:00
										 |  |  | 	"bytes" | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | 	"context" | 
					
						
							| 
									
										
										
										
											2023-12-05 23:04:39 +08:00
										 |  |  | 	"crypto/rand" | 
					
						
							|  |  |  | 	"crypto/rsa" | 
					
						
							| 
									
										
										
										
											2017-02-15 21:29:20 +08:00
										 |  |  | 	"crypto/tls" | 
					
						
							| 
									
										
										
										
											2023-12-05 23:04:39 +08:00
										 |  |  | 	"crypto/x509" | 
					
						
							|  |  |  | 	"crypto/x509/pkix" | 
					
						
							| 
									
										
										
										
											2024-07-23 21:41:03 +08:00
										 |  |  | 	"encoding/json" | 
					
						
							| 
									
										
										
										
											2023-12-05 23:04:39 +08:00
										 |  |  | 	"encoding/pem" | 
					
						
							| 
									
										
										
										
											2020-11-19 20:34:28 +08:00
										 |  |  | 	"errors" | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2023-12-05 23:04:39 +08:00
										 |  |  | 	"math/big" | 
					
						
							| 
									
										
										
										
											2017-04-27 14:54:21 +08:00
										 |  |  | 	"net" | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | 	"net/http" | 
					
						
							|  |  |  | 	"os" | 
					
						
							|  |  |  | 	"path" | 
					
						
							| 
									
										
										
										
											2020-10-19 23:35:31 +08:00
										 |  |  | 	"path/filepath" | 
					
						
							| 
									
										
										
										
											2021-02-16 00:55:41 +08:00
										 |  |  | 	"strings" | 
					
						
							| 
									
										
										
										
											2023-08-03 21:19:01 +08:00
										 |  |  | 	"sync" | 
					
						
							| 
									
										
										
										
											2023-12-05 23:04:39 +08:00
										 |  |  | 	"time" | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-02 21:52:30 +08:00
										 |  |  | 	"github.com/prometheus/client_golang/prometheus" | 
					
						
							|  |  |  | 	"github.com/prometheus/client_golang/prometheus/promhttp" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-27 13:57:53 +08:00
										 |  |  | 	"github.com/youmark/pkcs8" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-06 10:56:17 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/api/avatar" | 
					
						
							| 
									
										
										
										
											2019-01-16 21:53:59 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/api/routing" | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | 	httpstatic "github.com/grafana/grafana/pkg/api/static" | 
					
						
							| 
									
										
										
										
											2023-01-24 04:10:14 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/bus" | 
					
						
							| 
									
										
										
										
											2022-12-13 18:03:36 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/infra/db" | 
					
						
							| 
									
										
										
										
											2022-06-15 20:59:40 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/infra/kvstore" | 
					
						
							| 
									
										
										
										
											2019-06-13 16:55:38 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/infra/localcache" | 
					
						
							| 
									
										
										
										
											2019-05-13 14:45:54 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/infra/log" | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/infra/remotecache" | 
					
						
							| 
									
										
										
										
											2021-08-25 21:11:22 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/infra/tracing" | 
					
						
							| 
									
										
										
										
											2021-08-31 01:39:55 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/login/social" | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/middleware" | 
					
						
							| 
									
										
										
										
											2023-01-24 04:10:14 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/middleware/csrf" | 
					
						
							| 
									
										
										
										
											2023-03-31 21:38:09 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/middleware/loggermw" | 
					
						
							| 
									
										
										
										
											2023-08-16 21:05:19 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/middleware/requestmeta" | 
					
						
							| 
									
										
										
										
											2021-03-22 20:22:48 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/plugins" | 
					
						
							| 
									
										
										
										
											2023-01-27 22:08:17 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/plugins/pluginscdn" | 
					
						
							| 
									
										
										
										
											2021-04-06 21:49:09 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/accesscontrol" | 
					
						
							| 
									
										
										
										
											2022-09-19 15:54:37 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/annotations" | 
					
						
							| 
									
										
										
										
											2024-07-29 18:18:43 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/anonymous" | 
					
						
							| 
									
										
										
										
											2022-08-02 22:55:19 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/apikey" | 
					
						
							| 
									
										
										
										
											2024-07-29 18:18:43 +08:00
										 |  |  | 	grafanaapiserver "github.com/grafana/grafana/pkg/services/apiserver" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/services/apiserver/endpoints/request" | 
					
						
							| 
									
										
										
										
											2023-01-24 04:10:14 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/auth" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/services/authn" | 
					
						
							| 
									
										
										
										
											2021-08-31 01:39:55 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/cleanup" | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/contexthandler" | 
					
						
							| 
									
										
										
										
											2022-08-30 02:44:55 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/correlations" | 
					
						
							| 
									
										
										
										
											2022-02-16 21:15:44 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/dashboards" | 
					
						
							| 
									
										
										
										
											2022-02-17 16:31:26 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/dashboardsnapshots" | 
					
						
							| 
									
										
										
										
											2022-05-25 16:41:51 +08:00
										 |  |  | 	dashver "github.com/grafana/grafana/pkg/services/dashboardversion" | 
					
						
							| 
									
										
										
										
											2021-03-18 01:10:40 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/datasourceproxy" | 
					
						
							| 
									
										
										
										
											2018-10-26 16:40:33 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/datasources" | 
					
						
							| 
									
										
										
										
											2023-08-21 21:26:49 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/datasources/guardian" | 
					
						
							| 
									
										
										
										
											2021-08-31 01:39:55 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/encryption" | 
					
						
							| 
									
										
										
										
											2022-01-27 01:44:20 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/featuremgmt" | 
					
						
							| 
									
										
										
										
											2023-01-24 04:10:14 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/folder" | 
					
						
							| 
									
										
										
										
											2018-10-12 17:26:42 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/hooks" | 
					
						
							| 
									
										
										
										
											2021-08-31 01:39:55 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/libraryelements" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/services/librarypanels" | 
					
						
							| 
									
										
										
										
											2023-01-24 04:10:14 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/licensing" | 
					
						
							| 
									
										
										
										
											2021-03-22 20:22:48 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/live" | 
					
						
							| 
									
										
										
										
											2021-04-26 18:17:49 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/live/pushhttp" | 
					
						
							| 
									
										
										
										
											2019-06-13 22:47:52 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/login" | 
					
						
							| 
									
										
										
										
											2022-09-02 00:08:42 +08:00
										 |  |  | 	loginAttempt "github.com/grafana/grafana/pkg/services/loginattempt" | 
					
						
							| 
									
										
										
										
											2022-09-23 04:04:48 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/navtree" | 
					
						
							| 
									
										
										
										
											2021-08-31 01:39:55 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/ngalert" | 
					
						
							| 
									
										
										
										
											2022-02-03 17:33:46 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/notifications" | 
					
						
							| 
									
										
										
										
											2023-01-24 04:10:14 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/oauthtoken" | 
					
						
							| 
									
										
										
										
											2022-08-24 01:26:21 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/org" | 
					
						
							| 
									
										
										
										
											2022-07-18 17:26:35 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/playlist" | 
					
						
							| 
									
										
										
										
											2022-03-11 01:38:04 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/plugindashboards" | 
					
						
							| 
									
										
										
										
											2024-07-29 18:18:43 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/pluginsintegration/managedplugins" | 
					
						
							| 
									
										
										
										
											2024-09-09 17:38:35 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginassets" | 
					
						
							| 
									
										
										
										
											2025-05-09 21:58:04 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginchecker" | 
					
						
							| 
									
										
										
										
											2023-03-08 00:22:30 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/pluginsintegration/plugincontext" | 
					
						
							|  |  |  | 	pluginSettings "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginsettings" | 
					
						
							| 
									
										
										
										
											2023-09-11 19:59:24 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore" | 
					
						
							| 
									
										
										
										
											2022-04-21 21:03:17 +08:00
										 |  |  | 	pref "github.com/grafana/grafana/pkg/services/preference" | 
					
						
							| 
									
										
										
										
											2020-03-25 21:14:24 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/provisioning" | 
					
						
							| 
									
										
										
										
											2022-07-07 07:51:44 +08:00
										 |  |  | 	publicdashboardsApi "github.com/grafana/grafana/pkg/services/publicdashboards/api" | 
					
						
							| 
									
										
										
										
											2022-01-26 22:48:41 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/query" | 
					
						
							| 
									
										
										
										
											2022-01-29 00:55:09 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/queryhistory" | 
					
						
							| 
									
										
										
										
											2022-08-30 02:44:55 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/quota" | 
					
						
							| 
									
										
										
										
											2018-05-24 21:26:27 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/rendering" | 
					
						
							| 
									
										
										
										
											2021-03-22 20:22:48 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/search" | 
					
						
							| 
									
										
										
										
											2023-01-24 04:10:14 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/searchV2" | 
					
						
							| 
									
										
										
										
											2021-11-01 17:53:33 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/searchusers" | 
					
						
							| 
									
										
										
										
											2021-11-05 00:47:21 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/secrets" | 
					
						
							| 
									
										
										
										
											2022-08-30 02:44:55 +08:00
										 |  |  | 	secretsKV "github.com/grafana/grafana/pkg/services/secrets/kvstore" | 
					
						
							| 
									
										
										
										
											2022-08-25 04:24:50 +08:00
										 |  |  | 	spm "github.com/grafana/grafana/pkg/services/secrets/kvstore/migrations" | 
					
						
							| 
									
										
										
										
											2022-01-26 22:48:41 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/serviceaccounts" | 
					
						
							| 
									
										
										
										
											2021-03-22 20:22:48 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/shorturls" | 
					
						
							| 
									
										
										
										
											2022-05-19 20:32:10 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/star" | 
					
						
							| 
									
										
										
										
											2023-01-25 22:58:54 +08:00
										 |  |  | 	starApi "github.com/grafana/grafana/pkg/services/star/api" | 
					
						
							| 
									
										
										
										
											2023-01-24 04:10:14 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/stats" | 
					
						
							| 
									
										
										
										
											2022-03-18 01:19:23 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/store" | 
					
						
							| 
									
										
										
										
											2022-09-21 20:04:01 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/tag" | 
					
						
							| 
									
										
										
										
											2022-09-21 00:58:04 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/team" | 
					
						
							| 
									
										
										
										
											2022-08-13 00:13:23 +08:00
										 |  |  | 	tempUser "github.com/grafana/grafana/pkg/services/temp_user" | 
					
						
							| 
									
										
										
										
											2025-05-09 21:58:04 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/updatemanager" | 
					
						
							| 
									
										
										
										
											2022-07-16 00:06:44 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/user" | 
					
						
							| 
									
										
										
										
											2023-01-24 04:10:14 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/validations" | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/setting" | 
					
						
							| 
									
										
										
										
											2023-05-08 23:11:36 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/util" | 
					
						
							| 
									
										
										
										
											2021-10-11 20:30:59 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/web" | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-23 05:13:46 +08:00
										 |  |  | type HTTPServer struct { | 
					
						
							| 
									
										
										
										
											2022-01-24 21:41:18 +08:00
										 |  |  | 	log              log.Logger | 
					
						
							|  |  |  | 	web              *web.Mux | 
					
						
							|  |  |  | 	context          context.Context | 
					
						
							|  |  |  | 	httpSrv          *http.Server | 
					
						
							|  |  |  | 	middlewares      []web.Handler | 
					
						
							|  |  |  | 	namedMiddlewares []routing.RegisterNamedMiddleware | 
					
						
							| 
									
										
										
										
											2022-06-14 22:07:41 +08:00
										 |  |  | 	bus              bus.Bus | 
					
						
							| 
									
										
										
										
											2017-02-06 16:40:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-08 19:59:51 +08:00
										 |  |  | 	pluginContextProvider        *plugincontext.Provider | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 	RouteRegister                routing.RouteRegister | 
					
						
							|  |  |  | 	RenderService                rendering.Service | 
					
						
							|  |  |  | 	Cfg                          *setting.Cfg | 
					
						
							| 
									
										
										
										
											2024-01-10 02:38:06 +08:00
										 |  |  | 	Features                     featuremgmt.FeatureToggles | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 	SettingsProvider             setting.Provider | 
					
						
							|  |  |  | 	HooksService                 *hooks.HooksService | 
					
						
							| 
									
										
										
										
											2022-09-23 04:04:48 +08:00
										 |  |  | 	navTreeService               navtree.Service | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 	CacheService                 *localcache.CacheService | 
					
						
							|  |  |  | 	DataSourceCache              datasources.CacheService | 
					
						
							| 
									
										
										
										
											2022-11-18 16:56:06 +08:00
										 |  |  | 	AuthTokenService             auth.UserTokenService | 
					
						
							| 
									
										
										
										
											2022-07-16 00:06:44 +08:00
										 |  |  | 	QuotaService                 quota.Service | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 	RemoteCacheService           *remotecache.RemoteCache | 
					
						
							|  |  |  | 	ProvisioningService          provisioning.ProvisioningService | 
					
						
							| 
									
										
										
										
											2023-01-24 00:53:43 +08:00
										 |  |  | 	License                      licensing.Licensing | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 	AccessControl                accesscontrol.AccessControl | 
					
						
							|  |  |  | 	DataProxy                    *datasourceproxy.DataSourceProxyService | 
					
						
							| 
									
										
										
										
											2025-01-24 23:01:46 +08:00
										 |  |  | 	DataSourceRequestValidator   validations.DataSourceRequestValidator | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 	pluginClient                 plugins.Client | 
					
						
							| 
									
										
										
										
											2023-09-11 19:59:24 +08:00
										 |  |  | 	pluginStore                  pluginstore.Store | 
					
						
							| 
									
										
										
										
											2022-09-23 20:27:01 +08:00
										 |  |  | 	pluginInstaller              plugins.Installer | 
					
						
							| 
									
										
										
										
											2023-03-29 18:55:55 +08:00
										 |  |  | 	pluginFileStore              plugins.FileStore | 
					
						
							| 
									
										
										
										
											2022-03-11 01:38:04 +08:00
										 |  |  | 	pluginDashboardService       plugindashboards.Service | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 	pluginStaticRouteResolver    plugins.StaticRouteResolver | 
					
						
							|  |  |  | 	pluginErrorResolver          plugins.ErrorResolver | 
					
						
							| 
									
										
										
										
											2024-09-09 17:38:35 +08:00
										 |  |  | 	pluginAssets                 *pluginassets.Service | 
					
						
							| 
									
										
										
										
											2025-05-09 21:58:04 +08:00
										 |  |  | 	pluginPreinstall             pluginchecker.Preinstall | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 	SearchService                search.Service | 
					
						
							|  |  |  | 	ShortURLService              shorturls.Service | 
					
						
							|  |  |  | 	QueryHistoryService          queryhistory.Service | 
					
						
							| 
									
										
										
										
											2022-07-25 22:19:07 +08:00
										 |  |  | 	CorrelationsService          correlations.Service | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 	Live                         *live.GrafanaLive | 
					
						
							|  |  |  | 	LivePushGateway              *pushhttp.Gateway | 
					
						
							| 
									
										
										
										
											2022-07-29 14:26:44 +08:00
										 |  |  | 	StorageService               store.StorageService | 
					
						
							| 
									
										
										
										
											2022-09-23 07:02:09 +08:00
										 |  |  | 	SearchV2HTTPService          searchV2.SearchHTTPService | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 	ContextHandler               *contexthandler.ContextHandler | 
					
						
							| 
									
										
										
										
											2023-03-31 21:38:09 +08:00
										 |  |  | 	LoggerMiddleware             loggermw.Logger | 
					
						
							| 
									
										
										
										
											2022-12-13 18:03:36 +08:00
										 |  |  | 	SQLStore                     db.DB | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 	AlertNG                      *ngalert.AlertNG | 
					
						
							|  |  |  | 	LibraryPanelService          librarypanels.Service | 
					
						
							|  |  |  | 	LibraryElementService        libraryelements.Service | 
					
						
							|  |  |  | 	SocialService                social.Service | 
					
						
							|  |  |  | 	Listener                     net.Listener | 
					
						
							|  |  |  | 	EncryptionService            encryption.Internal | 
					
						
							|  |  |  | 	SecretsService               secrets.Service | 
					
						
							| 
									
										
										
										
											2022-08-30 02:44:55 +08:00
										 |  |  | 	secretsStore                 secretsKV.SecretsKVStore | 
					
						
							| 
									
										
										
										
											2025-05-15 15:51:25 +08:00
										 |  |  | 	SecretsMigrator              secrets.Migrator | 
					
						
							| 
									
										
										
										
											2025-03-20 18:00:59 +08:00
										 |  |  | 	secretMigrationProvider      spm.SecretMigrationProvider | 
					
						
							| 
									
										
										
										
											2022-02-11 22:52:14 +08:00
										 |  |  | 	DataSourcesService           datasources.DataSourceService | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 	cleanUpService               *cleanup.CleanUpService | 
					
						
							|  |  |  | 	tracer                       tracing.Tracer | 
					
						
							| 
									
										
										
										
											2025-05-09 21:58:04 +08:00
										 |  |  | 	grafanaUpdateChecker         *updatemanager.GrafanaService | 
					
						
							|  |  |  | 	pluginsUpdateChecker         *updatemanager.PluginsService | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 	searchUsersService           searchusers.Service | 
					
						
							| 
									
										
										
										
											2023-03-17 02:39:17 +08:00
										 |  |  | 	queryDataService             query.Service | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 	serviceAccountsService       serviceaccounts.Service | 
					
						
							|  |  |  | 	authInfoService              login.AuthInfoService | 
					
						
							| 
									
										
										
										
											2024-02-17 01:54:59 +08:00
										 |  |  | 	NotificationService          notifications.Service | 
					
						
							| 
									
										
										
										
											2022-07-07 02:42:39 +08:00
										 |  |  | 	DashboardService             dashboards.DashboardService | 
					
						
							| 
									
										
										
										
											2022-02-16 21:15:44 +08:00
										 |  |  | 	dashboardProvisioningService dashboards.DashboardProvisioningService | 
					
						
							| 
									
										
										
										
											2022-10-11 03:47:53 +08:00
										 |  |  | 	folderService                folder.Service | 
					
						
							| 
									
										
										
										
											2023-08-21 21:26:49 +08:00
										 |  |  | 	dsGuardian                   guardian.DatasourceGuardianProvider | 
					
						
							| 
									
										
										
										
											2022-06-15 01:41:29 +08:00
										 |  |  | 	dashboardsnapshotsService    dashboardsnapshots.Service | 
					
						
							| 
									
										
										
										
											2022-09-09 15:44:50 +08:00
										 |  |  | 	PluginSettings               pluginSettings.Service | 
					
						
							| 
									
										
										
										
											2022-04-06 10:56:17 +08:00
										 |  |  | 	AvatarCacheServer            *avatar.AvatarCacheServer | 
					
						
							| 
									
										
										
										
											2022-04-21 21:03:17 +08:00
										 |  |  | 	preferenceService            pref.Service | 
					
						
							| 
									
										
										
										
											2022-06-02 21:52:30 +08:00
										 |  |  | 	Csrf                         csrf.Service | 
					
						
							| 
									
										
										
										
											2022-05-10 21:48:47 +08:00
										 |  |  | 	folderPermissionsService     accesscontrol.FolderPermissionsService | 
					
						
							|  |  |  | 	dashboardPermissionsService  accesscontrol.DashboardPermissionsService | 
					
						
							| 
									
										
										
										
											2022-05-25 16:41:51 +08:00
										 |  |  | 	dashboardVersionService      dashver.Service | 
					
						
							| 
									
										
										
										
											2022-07-07 07:51:44 +08:00
										 |  |  | 	PublicDashboardsApi          *publicdashboardsApi.Api | 
					
						
							| 
									
										
										
										
											2022-05-19 20:32:10 +08:00
										 |  |  | 	starService                  star.Service | 
					
						
							| 
									
										
										
										
											2022-07-18 17:26:35 +08:00
										 |  |  | 	playlistService              playlist.Service | 
					
						
							| 
									
										
										
										
											2022-08-02 22:55:19 +08:00
										 |  |  | 	apiKeyService                apikey.Service | 
					
						
							| 
									
										
										
										
											2022-06-15 20:59:40 +08:00
										 |  |  | 	kvStore                      kvstore.KVStore | 
					
						
							| 
									
										
										
										
											2023-01-27 22:08:17 +08:00
										 |  |  | 	pluginsCDNService            *pluginscdn.Service | 
					
						
							| 
									
										
										
										
											2024-07-29 18:18:43 +08:00
										 |  |  | 	managedPluginsService        managedplugins.Manager | 
					
						
							| 
									
										
										
										
											2022-08-30 02:44:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-14 01:42:24 +08:00
										 |  |  | 	userService          user.Service | 
					
						
							|  |  |  | 	tempUserService      tempUser.Service | 
					
						
							|  |  |  | 	loginAttemptService  loginAttempt.Service | 
					
						
							|  |  |  | 	orgService           org.Service | 
					
						
							| 
									
										
										
										
											2025-01-07 01:05:22 +08:00
										 |  |  | 	orgDeletionService   org.DeletionService | 
					
						
							| 
									
										
										
										
											2024-08-15 19:38:43 +08:00
										 |  |  | 	TeamService          team.Service | 
					
						
							| 
									
										
										
										
											2023-04-14 01:42:24 +08:00
										 |  |  | 	accesscontrolService accesscontrol.Service | 
					
						
							|  |  |  | 	annotationsRepo      annotations.Repository | 
					
						
							|  |  |  | 	tagService           tag.Service | 
					
						
							|  |  |  | 	oauthTokenService    oauthtoken.OAuthTokenService | 
					
						
							|  |  |  | 	statsService         stats.Service | 
					
						
							|  |  |  | 	authnService         authn.Service | 
					
						
							|  |  |  | 	starApi              *starApi.API | 
					
						
							| 
									
										
										
										
											2023-08-16 21:05:19 +08:00
										 |  |  | 	promRegister         prometheus.Registerer | 
					
						
							| 
									
										
										
										
											2023-12-07 05:34:23 +08:00
										 |  |  | 	promGatherer         prometheus.Gatherer | 
					
						
							| 
									
										
										
										
											2023-11-01 01:26:39 +08:00
										 |  |  | 	clientConfigProvider grafanaapiserver.DirectRestConfigProvider | 
					
						
							| 
									
										
										
										
											2023-11-14 12:34:09 +08:00
										 |  |  | 	namespacer           request.NamespaceMapper | 
					
						
							| 
									
										
										
										
											2023-11-30 00:58:41 +08:00
										 |  |  | 	anonService          anonymous.Service | 
					
						
							| 
									
										
										
										
											2024-03-14 20:25:28 +08:00
										 |  |  | 	userVerifier         user.Verifier | 
					
						
							| 
									
										
										
										
											2024-03-22 23:13:22 +08:00
										 |  |  | 	tlsCerts             TLSCerts | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type TLSCerts struct { | 
					
						
							|  |  |  | 	certLock  sync.RWMutex | 
					
						
							|  |  |  | 	certMtime time.Time | 
					
						
							|  |  |  | 	keyMtime  time.Time | 
					
						
							|  |  |  | 	certs     *tls.Certificate | 
					
						
							| 
									
										
										
										
											2021-08-25 21:11:22 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type ServerOptions struct { | 
					
						
							|  |  |  | 	Listener net.Listener | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-14 22:07:41 +08:00
										 |  |  | func ProvideHTTPServer(opts ServerOptions, cfg *setting.Cfg, routeRegister routing.RouteRegister, bus bus.Bus, | 
					
						
							| 
									
										
										
										
											2023-01-24 00:53:43 +08:00
										 |  |  | 	renderService rendering.Service, licensing licensing.Licensing, hooksService *hooks.HooksService, | 
					
						
							| 
									
										
										
										
											2024-04-04 21:04:47 +08:00
										 |  |  | 	cacheService *localcache.CacheService, sqlStore db.DB, | 
					
						
							| 
									
										
										
										
											2025-01-24 23:01:46 +08:00
										 |  |  | 	dataSourceRequestValidator validations.DataSourceRequestValidator, pluginStaticRouteResolver plugins.StaticRouteResolver, | 
					
						
							| 
									
										
										
										
											2023-09-11 19:59:24 +08:00
										 |  |  | 	pluginDashboardService plugindashboards.Service, pluginStore pluginstore.Store, pluginClient plugins.Client, | 
					
						
							| 
									
										
										
										
											2022-09-23 20:27:01 +08:00
										 |  |  | 	pluginErrorResolver plugins.ErrorResolver, pluginInstaller plugins.Installer, settingsProvider setting.Provider, | 
					
						
							| 
									
										
										
										
											2022-11-18 16:56:06 +08:00
										 |  |  | 	dataSourceCache datasources.CacheService, userTokenService auth.UserTokenService, | 
					
						
							| 
									
										
										
										
											2023-08-10 15:56:04 +08:00
										 |  |  | 	cleanUpService *cleanup.CleanUpService, shortURLService shorturls.Service, queryHistoryService queryhistory.Service, | 
					
						
							|  |  |  | 	correlationsService correlations.Service, remoteCache *remotecache.RemoteCache, provisioningService provisioning.ProvisioningService, | 
					
						
							|  |  |  | 	accessControl accesscontrol.AccessControl, dataSourceProxy *datasourceproxy.DataSourceProxyService, searchService *search.SearchService, | 
					
						
							| 
									
										
										
										
											2021-08-25 21:11:22 +08:00
										 |  |  | 	live *live.GrafanaLive, livePushGateway *pushhttp.Gateway, plugCtxProvider *plugincontext.Provider, | 
					
						
							| 
									
										
										
										
											2024-02-02 12:52:02 +08:00
										 |  |  | 	contextHandler *contexthandler.ContextHandler, loggerMiddleware loggermw.Logger, features featuremgmt.FeatureToggles, | 
					
						
							| 
									
										
										
										
											2022-06-07 08:52:44 +08:00
										 |  |  | 	alertNG *ngalert.AlertNG, libraryPanelService librarypanels.Service, libraryElementService libraryelements.Service, | 
					
						
							| 
									
										
										
										
											2023-03-02 01:42:53 +08:00
										 |  |  | 	quotaService quota.Service, socialService social.Service, tracer tracing.Tracer, | 
					
						
							| 
									
										
										
										
											2025-05-09 21:58:04 +08:00
										 |  |  | 	encryptionService encryption.Internal, grafanaUpdateChecker *updatemanager.GrafanaService, | 
					
						
							|  |  |  | 	pluginsUpdateChecker *updatemanager.PluginsService, searchUsersService searchusers.Service, | 
					
						
							| 
									
										
										
										
											2023-03-29 18:55:55 +08:00
										 |  |  | 	dataSourcesService datasources.DataSourceService, queryDataService query.Service, pluginFileStore plugins.FileStore, | 
					
						
							| 
									
										
										
										
											2024-09-09 17:38:35 +08:00
										 |  |  | 	serviceaccountsService serviceaccounts.Service, pluginAssets *pluginassets.Service, | 
					
						
							| 
									
										
										
										
											2023-11-03 23:14:51 +08:00
										 |  |  | 	authInfoService login.AuthInfoService, storageService store.StorageService, | 
					
						
							| 
									
										
										
										
											2024-02-17 01:54:59 +08:00
										 |  |  | 	notificationService notifications.Service, dashboardService dashboards.DashboardService, | 
					
						
							| 
									
										
										
										
											2022-10-11 03:47:53 +08:00
										 |  |  | 	dashboardProvisioningService dashboards.DashboardProvisioningService, folderService folder.Service, | 
					
						
							| 
									
										
										
										
											2024-03-14 22:36:35 +08:00
										 |  |  | 	dsGuardian guardian.DatasourceGuardianProvider, | 
					
						
							| 
									
										
										
										
											2023-03-11 20:28:12 +08:00
										 |  |  | 	dashboardsnapshotsService dashboardsnapshots.Service, pluginSettings pluginSettings.Service, | 
					
						
							| 
									
										
										
										
											2022-08-01 23:56:36 +08:00
										 |  |  | 	avatarCacheServer *avatar.AvatarCacheServer, preferenceService pref.Service, | 
					
						
							| 
									
										
										
										
											2023-10-12 16:10:54 +08:00
										 |  |  | 	folderPermissionsService accesscontrol.FolderPermissionsService, | 
					
						
							| 
									
										
										
										
											2022-05-25 16:41:51 +08:00
										 |  |  | 	dashboardPermissionsService accesscontrol.DashboardPermissionsService, dashboardVersionService dashver.Service, | 
					
						
							| 
									
										
										
										
											2024-07-29 18:18:43 +08:00
										 |  |  | 	starService star.Service, csrfService csrf.Service, managedPlugins managedplugins.Manager, | 
					
						
							| 
									
										
										
										
											2022-08-25 04:24:50 +08:00
										 |  |  | 	playlistService playlist.Service, apiKeyService apikey.Service, kvStore kvstore.KVStore, | 
					
						
							| 
									
										
										
										
											2025-03-20 18:00:59 +08:00
										 |  |  | 	secretsMigrator secrets.Migrator, secretsService secrets.Service, | 
					
						
							|  |  |  | 	secretMigrationProvider spm.SecretMigrationProvider, secretsStore secretsKV.SecretsKVStore, | 
					
						
							| 
									
										
										
										
											2022-09-21 00:58:04 +08:00
										 |  |  | 	publicDashboardsApi *publicdashboardsApi.Api, userService user.Service, tempUserService tempUser.Service, | 
					
						
							| 
									
										
										
										
											2025-01-07 01:05:22 +08:00
										 |  |  | 	loginAttemptService loginAttempt.Service, orgService org.Service, orgDeletionService org.DeletionService, teamService team.Service, | 
					
						
							| 
									
										
										
										
											2023-04-14 01:42:24 +08:00
										 |  |  | 	accesscontrolService accesscontrol.Service, navTreeService navtree.Service, | 
					
						
							| 
									
										
										
										
											2024-11-27 13:57:53 +08:00
										 |  |  | 	annotationRepo annotations.Repository, tagService tag.Service, searchv2HTTPService searchV2.SearchHTTPService, oauthTokenService oauthtoken.OAuthTokenService, | 
					
						
							| 
									
										
										
										
											2023-12-07 05:34:23 +08:00
										 |  |  | 	statsService stats.Service, authnService authn.Service, pluginsCDNService *pluginscdn.Service, promGatherer prometheus.Gatherer, | 
					
						
							| 
									
										
										
										
											2023-11-30 00:58:41 +08:00
										 |  |  | 	starApi *starApi.API, promRegister prometheus.Registerer, clientConfigProvider grafanaapiserver.DirectRestConfigProvider, anonService anonymous.Service, | 
					
						
							| 
									
										
										
										
											2025-05-09 21:58:04 +08:00
										 |  |  | 	userVerifier user.Verifier, pluginPreinstall pluginchecker.Preinstall, | 
					
						
							| 
									
										
										
										
											2022-08-24 19:29:17 +08:00
										 |  |  | ) (*HTTPServer, error) { | 
					
						
							| 
									
										
										
										
											2021-10-11 20:30:59 +08:00
										 |  |  | 	web.Env = cfg.Env | 
					
						
							|  |  |  | 	m := web.New() | 
					
						
							| 
									
										
										
										
											2018-05-01 21:51:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-25 21:11:22 +08:00
										 |  |  | 	hs := &HTTPServer{ | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 		Cfg:                          cfg, | 
					
						
							|  |  |  | 		RouteRegister:                routeRegister, | 
					
						
							| 
									
										
										
										
											2022-06-14 22:07:41 +08:00
										 |  |  | 		bus:                          bus, | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 		RenderService:                renderService, | 
					
						
							|  |  |  | 		License:                      licensing, | 
					
						
							|  |  |  | 		HooksService:                 hooksService, | 
					
						
							|  |  |  | 		CacheService:                 cacheService, | 
					
						
							|  |  |  | 		SQLStore:                     sqlStore, | 
					
						
							| 
									
										
										
										
											2025-01-24 23:01:46 +08:00
										 |  |  | 		DataSourceRequestValidator:   dataSourceRequestValidator, | 
					
						
							| 
									
										
										
										
											2022-09-23 20:27:01 +08:00
										 |  |  | 		pluginInstaller:              pluginInstaller, | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 		pluginClient:                 pluginClient, | 
					
						
							|  |  |  | 		pluginStore:                  pluginStore, | 
					
						
							|  |  |  | 		pluginStaticRouteResolver:    pluginStaticRouteResolver, | 
					
						
							| 
									
										
										
										
											2022-03-11 01:38:04 +08:00
										 |  |  | 		pluginDashboardService:       pluginDashboardService, | 
					
						
							| 
									
										
										
										
											2024-09-09 17:38:35 +08:00
										 |  |  | 		pluginAssets:                 pluginAssets, | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 		pluginErrorResolver:          pluginErrorResolver, | 
					
						
							| 
									
										
										
										
											2023-03-29 18:55:55 +08:00
										 |  |  | 		pluginFileStore:              pluginFileStore, | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 		grafanaUpdateChecker:         grafanaUpdateChecker, | 
					
						
							|  |  |  | 		pluginsUpdateChecker:         pluginsUpdateChecker, | 
					
						
							| 
									
										
										
										
											2025-01-27 23:39:46 +08:00
										 |  |  | 		pluginPreinstall:             pluginPreinstall, | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 		SettingsProvider:             settingsProvider, | 
					
						
							|  |  |  | 		DataSourceCache:              dataSourceCache, | 
					
						
							|  |  |  | 		AuthTokenService:             userTokenService, | 
					
						
							|  |  |  | 		cleanUpService:               cleanUpService, | 
					
						
							|  |  |  | 		ShortURLService:              shortURLService, | 
					
						
							|  |  |  | 		QueryHistoryService:          queryHistoryService, | 
					
						
							| 
									
										
										
										
											2022-07-25 22:19:07 +08:00
										 |  |  | 		CorrelationsService:          correlationsService, | 
					
						
							| 
									
										
										
										
											2024-01-10 02:38:06 +08:00
										 |  |  | 		Features:                     features, // a read only view of the managers state
 | 
					
						
							| 
									
										
										
										
											2022-03-18 01:19:23 +08:00
										 |  |  | 		StorageService:               storageService, | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 		RemoteCacheService:           remoteCache, | 
					
						
							|  |  |  | 		ProvisioningService:          provisioningService, | 
					
						
							|  |  |  | 		AccessControl:                accessControl, | 
					
						
							|  |  |  | 		DataProxy:                    dataSourceProxy, | 
					
						
							| 
									
										
										
										
											2022-09-23 07:02:09 +08:00
										 |  |  | 		SearchV2HTTPService:          searchv2HTTPService, | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 		SearchService:                searchService, | 
					
						
							|  |  |  | 		Live:                         live, | 
					
						
							|  |  |  | 		LivePushGateway:              livePushGateway, | 
					
						
							| 
									
										
										
										
											2023-06-08 19:59:51 +08:00
										 |  |  | 		pluginContextProvider:        plugCtxProvider, | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 		ContextHandler:               contextHandler, | 
					
						
							| 
									
										
										
										
											2023-03-31 21:38:09 +08:00
										 |  |  | 		LoggerMiddleware:             loggerMiddleware, | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 		AlertNG:                      alertNG, | 
					
						
							|  |  |  | 		LibraryPanelService:          libraryPanelService, | 
					
						
							|  |  |  | 		LibraryElementService:        libraryElementService, | 
					
						
							|  |  |  | 		QuotaService:                 quotaService, | 
					
						
							|  |  |  | 		tracer:                       tracer, | 
					
						
							|  |  |  | 		log:                          log.New("http.server"), | 
					
						
							|  |  |  | 		web:                          m, | 
					
						
							|  |  |  | 		Listener:                     opts.Listener, | 
					
						
							|  |  |  | 		SocialService:                socialService, | 
					
						
							|  |  |  | 		EncryptionService:            encryptionService, | 
					
						
							|  |  |  | 		SecretsService:               secretsService, | 
					
						
							| 
									
										
										
										
											2025-05-15 15:51:25 +08:00
										 |  |  | 		SecretsMigrator:              secretsMigrator, | 
					
						
							| 
									
										
										
										
											2025-03-20 18:00:59 +08:00
										 |  |  | 		secretMigrationProvider:      secretMigrationProvider, | 
					
						
							| 
									
										
										
										
											2022-08-30 02:44:55 +08:00
										 |  |  | 		secretsStore:                 secretsStore, | 
					
						
							| 
									
										
										
										
											2022-02-09 21:01:32 +08:00
										 |  |  | 		DataSourcesService:           dataSourcesService, | 
					
						
							|  |  |  | 		searchUsersService:           searchUsersService, | 
					
						
							|  |  |  | 		queryDataService:             queryDataService, | 
					
						
							|  |  |  | 		serviceAccountsService:       serviceaccountsService, | 
					
						
							|  |  |  | 		authInfoService:              authInfoService, | 
					
						
							|  |  |  | 		NotificationService:          notificationService, | 
					
						
							| 
									
										
										
										
											2022-07-07 02:42:39 +08:00
										 |  |  | 		DashboardService:             dashboardService, | 
					
						
							| 
									
										
										
										
											2022-02-16 21:15:44 +08:00
										 |  |  | 		dashboardProvisioningService: dashboardProvisioningService, | 
					
						
							|  |  |  | 		folderService:                folderService, | 
					
						
							| 
									
										
										
										
											2023-08-21 21:26:49 +08:00
										 |  |  | 		dsGuardian:                   dsGuardian, | 
					
						
							| 
									
										
										
										
											2022-06-15 01:41:29 +08:00
										 |  |  | 		dashboardsnapshotsService:    dashboardsnapshotsService, | 
					
						
							| 
									
										
										
										
											2022-02-25 18:29:18 +08:00
										 |  |  | 		PluginSettings:               pluginSettings, | 
					
						
							| 
									
										
										
										
											2022-04-06 10:56:17 +08:00
										 |  |  | 		AvatarCacheServer:            avatarCacheServer, | 
					
						
							| 
									
										
										
										
											2022-04-21 21:03:17 +08:00
										 |  |  | 		preferenceService:            preferenceService, | 
					
						
							| 
									
										
										
										
											2022-06-02 21:52:30 +08:00
										 |  |  | 		Csrf:                         csrfService, | 
					
						
							| 
									
										
										
										
											2022-05-10 21:48:47 +08:00
										 |  |  | 		folderPermissionsService:     folderPermissionsService, | 
					
						
							|  |  |  | 		dashboardPermissionsService:  dashboardPermissionsService, | 
					
						
							| 
									
										
										
										
											2022-05-25 16:41:51 +08:00
										 |  |  | 		dashboardVersionService:      dashboardVersionService, | 
					
						
							| 
									
										
										
										
											2022-05-19 20:32:10 +08:00
										 |  |  | 		starService:                  starService, | 
					
						
							| 
									
										
										
										
											2022-07-18 17:26:35 +08:00
										 |  |  | 		playlistService:              playlistService, | 
					
						
							| 
									
										
										
										
											2022-08-02 22:55:19 +08:00
										 |  |  | 		apiKeyService:                apiKeyService, | 
					
						
							| 
									
										
										
										
											2022-06-15 20:59:40 +08:00
										 |  |  | 		kvStore:                      kvStore, | 
					
						
							| 
									
										
										
										
											2022-07-07 07:51:44 +08:00
										 |  |  | 		PublicDashboardsApi:          publicDashboardsApi, | 
					
						
							| 
									
										
										
										
											2022-07-16 00:06:44 +08:00
										 |  |  | 		userService:                  userService, | 
					
						
							| 
									
										
										
										
											2022-08-13 00:13:23 +08:00
										 |  |  | 		tempUserService:              tempUserService, | 
					
						
							| 
									
										
										
										
											2022-08-17 14:34:23 +08:00
										 |  |  | 		loginAttemptService:          loginAttemptService, | 
					
						
							| 
									
										
										
										
											2022-08-24 01:26:21 +08:00
										 |  |  | 		orgService:                   orgService, | 
					
						
							| 
									
										
										
										
											2025-01-07 01:05:22 +08:00
										 |  |  | 		orgDeletionService:           orgDeletionService, | 
					
						
							| 
									
										
										
										
											2024-08-15 19:38:43 +08:00
										 |  |  | 		TeamService:                  teamService, | 
					
						
							| 
									
										
										
										
											2022-09-23 04:04:48 +08:00
										 |  |  | 		navTreeService:               navTreeService, | 
					
						
							| 
									
										
										
										
											2022-08-24 19:29:17 +08:00
										 |  |  | 		accesscontrolService:         accesscontrolService, | 
					
						
							| 
									
										
										
										
											2022-09-19 15:54:37 +08:00
										 |  |  | 		annotationsRepo:              annotationRepo, | 
					
						
							| 
									
										
										
										
											2022-09-21 20:04:01 +08:00
										 |  |  | 		tagService:                   tagService, | 
					
						
							| 
									
										
										
										
											2022-10-19 00:17:28 +08:00
										 |  |  | 		oauthTokenService:            oauthTokenService, | 
					
						
							| 
									
										
										
										
											2022-12-01 01:11:07 +08:00
										 |  |  | 		statsService:                 statsService, | 
					
						
							| 
									
										
										
										
											2023-01-17 16:11:45 +08:00
										 |  |  | 		authnService:                 authnService, | 
					
						
							| 
									
										
										
										
											2023-01-27 22:08:17 +08:00
										 |  |  | 		pluginsCDNService:            pluginsCDNService, | 
					
						
							| 
									
										
										
										
											2024-07-29 18:18:43 +08:00
										 |  |  | 		managedPluginsService:        managedPlugins, | 
					
						
							| 
									
										
										
										
											2023-01-25 22:58:54 +08:00
										 |  |  | 		starApi:                      starApi, | 
					
						
							| 
									
										
										
										
											2023-08-16 21:05:19 +08:00
										 |  |  | 		promRegister:                 promRegister, | 
					
						
							| 
									
										
										
										
											2023-12-07 05:34:23 +08:00
										 |  |  | 		promGatherer:                 promGatherer, | 
					
						
							| 
									
										
										
										
											2023-11-01 01:26:39 +08:00
										 |  |  | 		clientConfigProvider:         clientConfigProvider, | 
					
						
							| 
									
										
										
										
											2023-11-14 12:34:09 +08:00
										 |  |  | 		namespacer:                   request.GetNamespaceMapper(cfg), | 
					
						
							| 
									
										
										
										
											2023-11-30 00:58:41 +08:00
										 |  |  | 		anonService:                  anonService, | 
					
						
							| 
									
										
										
										
											2024-03-14 20:25:28 +08:00
										 |  |  | 		userVerifier:                 userVerifier, | 
					
						
							| 
									
										
										
										
											2021-08-25 21:11:22 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	if hs.Listener != nil { | 
					
						
							|  |  |  | 		hs.log.Debug("Using provided listener") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-07-01 22:01:43 +08:00
										 |  |  | 	hs.registerRoutes() | 
					
						
							| 
									
										
										
										
											2021-08-25 21:11:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-19 00:33:21 +08:00
										 |  |  | 	// Register access control scope resolver for annotations
 | 
					
						
							| 
									
										
										
										
											2024-12-31 00:48:35 +08:00
										 |  |  | 	hs.AccessControl.RegisterScopeAttributeResolver(AnnotationTypeScopeResolver(hs.annotationsRepo, features, dashboardService, folderService)) | 
					
						
							| 
									
										
										
										
											2022-03-19 00:33:21 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-25 21:11:22 +08:00
										 |  |  | 	if err := hs.declareFixedRoles(); err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return hs, nil | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-11 20:30:59 +08:00
										 |  |  | func (hs *HTTPServer) AddMiddleware(middleware web.Handler) { | 
					
						
							| 
									
										
										
										
											2020-07-23 15:54:07 +08:00
										 |  |  | 	hs.middlewares = append(hs.middlewares, middleware) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-24 21:41:18 +08:00
										 |  |  | func (hs *HTTPServer) AddNamedMiddleware(middleware routing.RegisterNamedMiddleware) { | 
					
						
							|  |  |  | 	hs.namedMiddlewares = append(hs.namedMiddlewares, middleware) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-03 21:19:01 +08:00
										 |  |  | func (hs *HTTPServer) Run(ctx context.Context) error { | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | 	hs.context = ctx | 
					
						
							| 
									
										
										
										
											2018-07-02 14:35:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-01 22:01:43 +08:00
										 |  |  | 	hs.applyRoutes() | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 00:55:41 +08:00
										 |  |  | 	// Remove any square brackets enclosing IPv6 addresses, a format we support for backwards compatibility
 | 
					
						
							| 
									
										
										
										
											2021-03-10 19:41:29 +08:00
										 |  |  | 	host := strings.TrimSuffix(strings.TrimPrefix(hs.Cfg.HTTPAddr, "["), "]") | 
					
						
							| 
									
										
										
										
											2019-11-27 19:07:21 +08:00
										 |  |  | 	hs.httpSrv = &http.Server{ | 
					
						
							| 
									
										
										
										
											2021-03-19 18:21:52 +08:00
										 |  |  | 		Addr:        net.JoinHostPort(host, hs.Cfg.HTTPPort), | 
					
						
							| 
									
										
										
										
											2021-10-11 20:30:59 +08:00
										 |  |  | 		Handler:     hs.web, | 
					
						
							| 
									
										
										
										
											2021-03-19 18:21:52 +08:00
										 |  |  | 		ReadTimeout: hs.Cfg.ReadTimeout, | 
					
						
							| 
									
										
										
										
											2019-10-22 19:07:43 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | 	switch hs.Cfg.Protocol { | 
					
						
							| 
									
										
										
										
											2024-03-22 23:13:22 +08:00
										 |  |  | 	case setting.HTTP2Scheme, setting.HTTPSScheme: | 
					
						
							|  |  |  | 		if err := hs.configureTLS(); err != nil { | 
					
						
							| 
									
										
										
										
											2019-11-27 19:07:21 +08:00
										 |  |  | 			return err | 
					
						
							| 
									
										
										
										
											2019-08-16 23:06:54 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2024-03-22 23:13:22 +08:00
										 |  |  | 		if hs.Cfg.CertFile != "" && hs.Cfg.KeyFile != "" { | 
					
						
							|  |  |  | 			if hs.Cfg.CertWatchInterval > 0 { | 
					
						
							|  |  |  | 				hs.httpSrv.TLSConfig.GetCertificate = hs.GetCertificate | 
					
						
							|  |  |  | 				go hs.WatchAndUpdateCerts(ctx) | 
					
						
							|  |  |  | 				hs.log.Debug("HTTP Server certificates reload feature is enabled") | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				hs.log.Debug("HTTP Server certificates reload feature is NOT enabled") | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-11-27 19:07:21 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-12-01 16:53:27 +08:00
										 |  |  | 	default: | 
					
						
							| 
									
										
										
										
											2019-11-27 19:07:21 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-21 16:41:10 +08:00
										 |  |  | 	listener, err := hs.getListener() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							| 
									
										
										
										
											2019-11-27 19:07:21 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-03-22 21:14:44 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-27 19:07:21 +08:00
										 |  |  | 	hs.log.Info("HTTP Server Listen", "address", listener.Addr().String(), "protocol", | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | 		hs.Cfg.Protocol, "subUrl", hs.Cfg.AppSubURL, "socket", hs.Cfg.SocketPath) | 
					
						
							| 
									
										
										
										
											2019-11-27 19:07:21 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-03 21:19:01 +08:00
										 |  |  | 	var wg sync.WaitGroup | 
					
						
							|  |  |  | 	wg.Add(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// handle http shutdown on server context done
 | 
					
						
							|  |  |  | 	go func() { | 
					
						
							|  |  |  | 		defer wg.Done() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		<-ctx.Done() | 
					
						
							|  |  |  | 		if err := hs.httpSrv.Shutdown(context.Background()); err != nil { | 
					
						
							|  |  |  | 			hs.log.Error("Failed to shutdown server", "error", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | 	switch hs.Cfg.Protocol { | 
					
						
							| 
									
										
										
										
											2020-10-02 21:45:45 +08:00
										 |  |  | 	case setting.HTTPScheme, setting.SocketScheme: | 
					
						
							| 
									
										
										
										
											2023-08-03 21:19:01 +08:00
										 |  |  | 		if err := hs.httpSrv.Serve(listener); err != nil { | 
					
						
							|  |  |  | 			if errors.Is(err, http.ErrServerClosed) { | 
					
						
							|  |  |  | 				hs.log.Debug("server was shutdown gracefully") | 
					
						
							|  |  |  | 				return nil | 
					
						
							| 
									
										
										
										
											2019-11-27 19:07:21 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2023-08-03 21:19:01 +08:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-10-02 21:45:45 +08:00
										 |  |  | 	case setting.HTTP2Scheme, setting.HTTPSScheme: | 
					
						
							| 
									
										
										
										
											2023-12-05 23:04:39 +08:00
										 |  |  | 		if err := hs.httpSrv.ServeTLS(listener, "", ""); err != nil { | 
					
						
							| 
									
										
										
										
											2023-08-03 21:19:01 +08:00
										 |  |  | 			if errors.Is(err, http.ErrServerClosed) { | 
					
						
							|  |  |  | 				hs.log.Debug("server was shutdown gracefully") | 
					
						
							|  |  |  | 				return nil | 
					
						
							| 
									
										
										
										
											2019-11-27 19:07:21 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2023-08-03 21:19:01 +08:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | 	default: | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | 		panic(fmt.Sprintf("Unhandled protocol %q", hs.Cfg.Protocol)) | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-03 21:19:01 +08:00
										 |  |  | 	wg.Wait() | 
					
						
							| 
									
										
										
										
											2019-11-27 19:07:21 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-21 16:41:10 +08:00
										 |  |  | func (hs *HTTPServer) getListener() (net.Listener, error) { | 
					
						
							|  |  |  | 	if hs.Listener != nil { | 
					
						
							|  |  |  | 		return hs.Listener, nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | 	switch hs.Cfg.Protocol { | 
					
						
							| 
									
										
										
										
											2020-10-02 21:45:45 +08:00
										 |  |  | 	case setting.HTTPScheme, setting.HTTPSScheme, setting.HTTP2Scheme: | 
					
						
							| 
									
										
										
										
											2020-08-21 16:41:10 +08:00
										 |  |  | 		listener, err := net.Listen("tcp", hs.httpSrv.Addr) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							| 
									
										
										
										
											2022-06-07 04:30:31 +08:00
										 |  |  | 			return nil, fmt.Errorf("failed to open listener on address %s: %w", hs.httpSrv.Addr, err) | 
					
						
							| 
									
										
										
										
											2020-08-21 16:41:10 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		return listener, nil | 
					
						
							| 
									
										
										
										
											2020-10-02 21:45:45 +08:00
										 |  |  | 	case setting.SocketScheme: | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | 		listener, err := net.ListenUnix("unix", &net.UnixAddr{Name: hs.Cfg.SocketPath, Net: "unix"}) | 
					
						
							| 
									
										
										
										
											2020-08-21 16:41:10 +08:00
										 |  |  | 		if err != nil { | 
					
						
							| 
									
										
										
										
											2022-06-07 04:30:31 +08:00
										 |  |  | 			return nil, fmt.Errorf("failed to open listener for socket %s: %w", hs.Cfg.SocketPath, err) | 
					
						
							| 
									
										
										
										
											2020-08-21 16:41:10 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Make socket writable by group
 | 
					
						
							| 
									
										
										
										
											2020-12-10 18:53:21 +08:00
										 |  |  | 		// nolint:gosec
 | 
					
						
							| 
									
										
										
										
											2022-11-01 22:04:01 +08:00
										 |  |  | 		if err := os.Chmod(hs.Cfg.SocketPath, os.FileMode(hs.Cfg.SocketMode)); err != nil { | 
					
						
							|  |  |  | 			return nil, fmt.Errorf("failed to change socket mode %d: %w", hs.Cfg.SocketMode, err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// golang.org/pkg/os does not have chgrp
 | 
					
						
							|  |  |  | 		// Changing the gid of a file without privileges requires that the target group is in the group of the process and that the process is the file owner
 | 
					
						
							|  |  |  | 		if err := os.Chown(hs.Cfg.SocketPath, -1, hs.Cfg.SocketGid); err != nil { | 
					
						
							|  |  |  | 			return nil, fmt.Errorf("failed to change socket group id %d: %w", hs.Cfg.SocketGid, err) | 
					
						
							| 
									
										
										
										
											2020-08-21 16:41:10 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return listener, nil | 
					
						
							|  |  |  | 	default: | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | 		hs.log.Error("Invalid protocol", "protocol", hs.Cfg.Protocol) | 
					
						
							|  |  |  | 		return nil, fmt.Errorf("invalid protocol %q", hs.Cfg.Protocol) | 
					
						
							| 
									
										
										
										
											2020-08-21 16:41:10 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-05 23:04:39 +08:00
										 |  |  | func (hs *HTTPServer) selfSignedCert() ([]tls.Certificate, error) { | 
					
						
							|  |  |  | 	template := &x509.Certificate{ | 
					
						
							|  |  |  | 		IsCA:                  true, | 
					
						
							|  |  |  | 		BasicConstraintsValid: true, | 
					
						
							|  |  |  | 		SubjectKeyId:          []byte{1}, | 
					
						
							|  |  |  | 		SerialNumber:          big.NewInt(1), | 
					
						
							|  |  |  | 		Subject: pkix.Name{ | 
					
						
							|  |  |  | 			CommonName: hs.Cfg.Domain, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		NotBefore: time.Now(), | 
					
						
							|  |  |  | 		NotAfter:  time.Now().AddDate(1, 0, 0), | 
					
						
							|  |  |  | 		// see http://golang.org/pkg/crypto/x509/#KeyUsage
 | 
					
						
							|  |  |  | 		ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, x509.ExtKeyUsageServerAuth}, | 
					
						
							|  |  |  | 		KeyUsage:    x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// generate private key
 | 
					
						
							|  |  |  | 	privatekey, err := rsa.GenerateKey(rand.Reader, 4096) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, fmt.Errorf("error generating tls private key: %w", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	publickey := &privatekey.PublicKey | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// create a self-signed certificate
 | 
					
						
							|  |  |  | 	var parent = template | 
					
						
							|  |  |  | 	certBytes, err := x509.CreateCertificate(rand.Reader, template, parent, publickey, privatekey) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, fmt.Errorf("error generating tls self-signed certificate: %w", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// encode certificate and private key to PEM
 | 
					
						
							|  |  |  | 	certPEM := new(bytes.Buffer) | 
					
						
							|  |  |  | 	_ = pem.Encode(certPEM, &pem.Block{ | 
					
						
							|  |  |  | 		Type:  "CERTIFICATE", | 
					
						
							|  |  |  | 		Bytes: certBytes, | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	certPrivKeyPEM := new(bytes.Buffer) | 
					
						
							|  |  |  | 	_ = pem.Encode(certPrivKeyPEM, &pem.Block{ | 
					
						
							|  |  |  | 		Type:  "RSA PRIVATE KEY", | 
					
						
							|  |  |  | 		Bytes: x509.MarshalPKCS1PrivateKey(privatekey), | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// create tlsCertificate from generated certificate and private key
 | 
					
						
							|  |  |  | 	tlsCert, err := tls.X509KeyPair(certPEM.Bytes(), certPrivKeyPEM.Bytes()) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, fmt.Errorf("error creating tls self-signed certificate: %w", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return []tls.Certificate{tlsCert}, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (hs *HTTPServer) tlsCertificates() ([]tls.Certificate, error) { | 
					
						
							|  |  |  | 	// if we don't have either a cert or key specified, generate a self-signed certificate
 | 
					
						
							|  |  |  | 	if hs.Cfg.CertFile == "" && hs.Cfg.KeyFile == "" { | 
					
						
							|  |  |  | 		return hs.selfSignedCert() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-22 23:13:22 +08:00
										 |  |  | 	tlsCert, err := hs.readCertificates() | 
					
						
							| 
									
										
										
										
											2023-05-08 23:11:36 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-03-22 23:13:22 +08:00
										 |  |  | 		return nil, err | 
					
						
							| 
									
										
										
										
											2023-05-08 23:11:36 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-03-22 23:13:22 +08:00
										 |  |  | 	hs.tlsCerts.certs = tlsCert | 
					
						
							| 
									
										
										
										
											2023-05-08 23:11:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-22 23:13:22 +08:00
										 |  |  | 	if err := hs.updateMtimeOfServerCerts(); err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							| 
									
										
										
										
											2019-08-16 23:06:54 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-03-22 23:13:22 +08:00
										 |  |  | 	return []tls.Certificate{*tlsCert}, nil | 
					
						
							| 
									
										
										
										
											2019-08-16 23:06:54 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-02 14:35:50 +08:00
										 |  |  | func (hs *HTTPServer) applyRoutes() { | 
					
						
							|  |  |  | 	// start with middlewares & static routes
 | 
					
						
							|  |  |  | 	hs.addMiddlewaresAndStaticRoutes() | 
					
						
							|  |  |  | 	// then add view routes & api routes
 | 
					
						
							| 
									
										
										
										
											2022-01-24 21:41:18 +08:00
										 |  |  | 	hs.RouteRegister.Register(hs.web, hs.namedMiddlewares...) | 
					
						
							| 
									
										
										
										
											2018-07-02 14:35:50 +08:00
										 |  |  | 	// lastly not found route
 | 
					
						
							| 
									
										
										
										
											2022-08-25 16:11:27 +08:00
										 |  |  | 	hs.web.NotFound(middleware.ProvideRouteOperationName("notfound"), middleware.ReqSignedIn, hs.NotFoundHandler) | 
					
						
							| 
									
										
										
										
											2018-07-02 14:35:50 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (hs *HTTPServer) addMiddlewaresAndStaticRoutes() { | 
					
						
							| 
									
										
										
										
											2021-10-11 20:30:59 +08:00
										 |  |  | 	m := hs.web | 
					
						
							| 
									
										
										
										
											2018-07-02 14:35:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-16 21:05:19 +08:00
										 |  |  | 	m.Use(requestmeta.SetupRequestMetadata()) | 
					
						
							| 
									
										
										
										
											2025-07-23 01:55:44 +08:00
										 |  |  | 	m.Use(middleware.RequestTracing(hs.tracer, middleware.SkipTracingPaths)) | 
					
						
							| 
									
										
										
										
											2023-08-16 21:05:19 +08:00
										 |  |  | 	m.Use(middleware.RequestMetrics(hs.Features, hs.Cfg, hs.promRegister)) | 
					
						
							| 
									
										
										
										
											2021-04-20 21:22:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-31 21:38:09 +08:00
										 |  |  | 	m.UseMiddleware(hs.LoggerMiddleware.Middleware()) | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-10 19:41:29 +08:00
										 |  |  | 	if hs.Cfg.EnableGzip { | 
					
						
							| 
									
										
										
										
											2021-08-10 19:29:46 +08:00
										 |  |  | 		m.UseMiddleware(middleware.Gziper()) | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-04 15:00:07 +08:00
										 |  |  | 	m.UseMiddleware(middleware.Recovery(hs.Cfg, hs.License)) | 
					
						
							| 
									
										
										
										
											2022-07-14 02:28:59 +08:00
										 |  |  | 	m.UseMiddleware(hs.Csrf.Middleware()) | 
					
						
							| 
									
										
										
										
											2017-11-15 20:51:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-10 19:41:29 +08:00
										 |  |  | 	hs.mapStatic(m, hs.Cfg.StaticRootPath, "build", "public/build") | 
					
						
							| 
									
										
										
										
											2022-02-08 20:38:43 +08:00
										 |  |  | 	hs.mapStatic(m, hs.Cfg.StaticRootPath, "", "public", "/public/views/swagger.html") | 
					
						
							| 
									
										
										
										
											2021-03-10 19:41:29 +08:00
										 |  |  | 	hs.mapStatic(m, hs.Cfg.StaticRootPath, "robots.txt", "robots.txt") | 
					
						
							| 
									
										
										
										
											2024-09-04 17:22:03 +08:00
										 |  |  | 	hs.mapStatic(m, hs.Cfg.StaticRootPath, "mockServiceWorker.js", "mockServiceWorker.js") | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-10 19:41:29 +08:00
										 |  |  | 	if hs.Cfg.ImageUploadProvider == "local" { | 
					
						
							| 
									
										
										
										
											2018-05-24 21:26:27 +08:00
										 |  |  | 		hs.mapStatic(m, hs.Cfg.ImagesDir, "", "/public/img/attachments") | 
					
						
							| 
									
										
										
										
											2017-12-31 06:01:51 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-01 01:12:34 +08:00
										 |  |  | 	if len(hs.Cfg.CustomResponseHeaders) > 0 { | 
					
						
							|  |  |  | 		m.Use(middleware.AddCustomResponseHeaders(hs.Cfg)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | 	m.Use(middleware.AddDefaultResponseHeaders(hs.Cfg)) | 
					
						
							| 
									
										
										
										
											2019-05-06 15:22:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-10 19:41:29 +08:00
										 |  |  | 	if hs.Cfg.ServeFromSubPath && hs.Cfg.AppSubURL != "" { | 
					
						
							|  |  |  | 		m.SetURLPrefix(hs.Cfg.AppSubURL) | 
					
						
							| 
									
										
										
										
											2023-04-24 15:55:55 +08:00
										 |  |  | 		m.UseMiddleware(middleware.SubPathRedirect(hs.Cfg)) | 
					
						
							| 
									
										
										
										
											2019-05-27 23:47:29 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-11 20:30:59 +08:00
										 |  |  | 	m.UseMiddleware(web.Renderer(filepath.Join(hs.Cfg.StaticRootPath, "views"), "[[", "]]")) | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-02 13:14:26 +08:00
										 |  |  | 	// These endpoints are used for monitoring the Grafana instance
 | 
					
						
							| 
									
										
										
										
											2020-10-21 17:06:19 +08:00
										 |  |  | 	// and should not be redirected or rejected.
 | 
					
						
							| 
									
										
										
										
											2020-10-02 13:14:26 +08:00
										 |  |  | 	m.Use(hs.healthzHandler) | 
					
						
							|  |  |  | 	m.Use(hs.apiHealthHandler) | 
					
						
							| 
									
										
										
										
											2017-09-07 04:24:10 +08:00
										 |  |  | 	m.Use(hs.metricsEndpoint) | 
					
						
							| 
									
										
										
										
											2022-03-29 17:18:26 +08:00
										 |  |  | 	m.Use(hs.pluginMetricsEndpoint) | 
					
						
							| 
									
										
										
										
											2022-09-12 18:04:43 +08:00
										 |  |  | 	m.Use(hs.frontendLogEndpoints()) | 
					
						
							| 
									
										
										
										
											2020-10-02 13:14:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-25 20:35:21 +08:00
										 |  |  | 	m.UseMiddleware(hs.ContextHandler.Middleware) | 
					
						
							| 
									
										
										
										
											2022-09-27 19:58:49 +08:00
										 |  |  | 	m.Use(middleware.OrgRedirect(hs.Cfg, hs.userService)) | 
					
						
							| 
									
										
										
										
											2023-04-24 15:55:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | 	// needs to be after context handler
 | 
					
						
							| 
									
										
										
										
											2021-03-10 19:41:29 +08:00
										 |  |  | 	if hs.Cfg.EnforceDomain { | 
					
						
							| 
									
										
										
										
											2020-12-16 02:09:04 +08:00
										 |  |  | 		m.Use(middleware.ValidateHostHeader(hs.Cfg)) | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-09-10 22:45:27 +08:00
										 |  |  | 	// handle action urls
 | 
					
						
							|  |  |  | 	m.UseMiddleware(middleware.ValidateActionUrl(hs.Cfg, hs.log)) | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-13 00:30:33 +08:00
										 |  |  | 	m.Use(middleware.HandleNoCacheHeaders) | 
					
						
							| 
									
										
										
										
											2022-11-17 01:11:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if hs.Cfg.CSPEnabled || hs.Cfg.CSPReportOnlyEnabled { | 
					
						
							|  |  |  | 		m.UseMiddleware(middleware.ContentSecurityPolicy(hs.Cfg, hs.log)) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-07-23 15:54:07 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	for _, mw := range hs.middlewares { | 
					
						
							|  |  |  | 		m.Use(mw) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-11 20:30:59 +08:00
										 |  |  | func (hs *HTTPServer) metricsEndpoint(ctx *web.Context) { | 
					
						
							| 
									
										
										
										
											2018-09-13 20:36:16 +08:00
										 |  |  | 	if !hs.Cfg.MetricsEndpointEnabled { | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-12 13:27:47 +08:00
										 |  |  | 	if ctx.Req.Method != http.MethodGet || ctx.Req.URL.Path != "/metrics" { | 
					
						
							| 
									
										
										
										
											2017-09-07 04:24:10 +08:00
										 |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-20 02:15:18 +08:00
										 |  |  | 	if hs.metricsEndpointBasicAuthEnabled() && !BasicAuthenticatedRequest(ctx.Req, hs.Cfg.MetricsEndpointBasicAuthUsername, hs.Cfg.MetricsEndpointBasicAuthPassword) { | 
					
						
							| 
									
										
										
										
											2024-07-11 20:55:48 +08:00
										 |  |  | 		ctx.Resp.Header().Set("WWW-Authenticate", `Basic realm="Grafana"`) | 
					
						
							| 
									
										
										
										
											2018-11-15 06:37:32 +08:00
										 |  |  | 		ctx.Resp.WriteHeader(http.StatusUnauthorized) | 
					
						
							|  |  |  | 		return | 
					
						
							| 
									
										
										
										
											2018-11-15 04:42:47 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-15 13:33:48 +08:00
										 |  |  | 	promhttp. | 
					
						
							| 
									
										
										
										
											2023-12-07 05:34:23 +08:00
										 |  |  | 		HandlerFor(hs.promGatherer, promhttp.HandlerOpts{EnableOpenMetrics: true}). | 
					
						
							| 
									
										
										
										
											2021-09-01 17:18:30 +08:00
										 |  |  | 		ServeHTTP(ctx.Resp, ctx.Req) | 
					
						
							| 
									
										
										
										
											2017-09-07 04:24:10 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-18 19:03:18 +08:00
										 |  |  | // healthzHandler always return 200 - Ok if Grafana's web server is running
 | 
					
						
							| 
									
										
										
										
											2021-10-11 20:30:59 +08:00
										 |  |  | func (hs *HTTPServer) healthzHandler(ctx *web.Context) { | 
					
						
							| 
									
										
										
										
											2020-10-02 13:14:26 +08:00
										 |  |  | 	notHeadOrGet := ctx.Req.Method != http.MethodGet && ctx.Req.Method != http.MethodHead | 
					
						
							|  |  |  | 	if notHeadOrGet || ctx.Req.URL.Path != "/healthz" { | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-02 03:51:12 +08:00
										 |  |  | 	ctx.Resp.WriteHeader(http.StatusOK) | 
					
						
							|  |  |  | 	if _, err := ctx.Resp.Write([]byte("Ok")); err != nil { | 
					
						
							| 
									
										
										
										
											2020-09-18 19:03:18 +08:00
										 |  |  | 		hs.log.Error("could not write to response", "err", err) | 
					
						
							| 
									
										
										
										
											2017-04-25 23:17:45 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-09-18 19:03:18 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-04-25 23:17:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-23 21:41:03 +08:00
										 |  |  | // swagger:model healthResponse
 | 
					
						
							|  |  |  | type healthResponse struct { | 
					
						
							|  |  |  | 	Database         string `json:"database"` | 
					
						
							|  |  |  | 	Version          string `json:"version,omitempty"` | 
					
						
							|  |  |  | 	Commit           string `json:"commit,omitempty"` | 
					
						
							|  |  |  | 	EnterpriseCommit string `json:"enterpriseCommit,omitempty"` | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // swagger:route GET /health health getHealth
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2020-09-18 19:03:18 +08:00
										 |  |  | // apiHealthHandler will return ok if Grafana's web server is running and it
 | 
					
						
							| 
									
										
										
										
											2020-10-21 17:06:19 +08:00
										 |  |  | // can access the database. If the database cannot be accessed it will return
 | 
					
						
							| 
									
										
										
										
											2020-09-18 19:03:18 +08:00
										 |  |  | // http status code 503.
 | 
					
						
							| 
									
										
										
										
											2024-07-23 21:41:03 +08:00
										 |  |  | //
 | 
					
						
							|  |  |  | // Responses:
 | 
					
						
							|  |  |  | // 200: healthResponse
 | 
					
						
							|  |  |  | // 503: internalServerError
 | 
					
						
							| 
									
										
										
										
											2021-10-11 20:30:59 +08:00
										 |  |  | func (hs *HTTPServer) apiHealthHandler(ctx *web.Context) { | 
					
						
							| 
									
										
										
										
											2020-10-02 13:14:26 +08:00
										 |  |  | 	notHeadOrGet := ctx.Req.Method != http.MethodGet && ctx.Req.Method != http.MethodHead | 
					
						
							|  |  |  | 	if notHeadOrGet || ctx.Req.URL.Path != "/api/health" { | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-23 21:41:03 +08:00
										 |  |  | 	data := healthResponse{ | 
					
						
							|  |  |  | 		Database: "ok", | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-12-13 17:46:27 +08:00
										 |  |  | 	if !hs.Cfg.Anonymous.HideVersion { | 
					
						
							| 
									
										
										
										
											2024-07-23 21:41:03 +08:00
										 |  |  | 		data.Version = hs.Cfg.BuildVersion | 
					
						
							|  |  |  | 		data.Commit = hs.Cfg.BuildCommit | 
					
						
							| 
									
										
										
										
											2023-09-22 19:17:10 +08:00
										 |  |  | 		if hs.Cfg.EnterpriseBuildCommit != "NA" && hs.Cfg.EnterpriseBuildCommit != "" { | 
					
						
							| 
									
										
										
										
											2024-07-23 21:41:03 +08:00
										 |  |  | 			data.EnterpriseCommit = hs.Cfg.EnterpriseBuildCommit | 
					
						
							| 
									
										
										
										
											2023-09-22 19:17:10 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-06-17 13:39:50 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-04-25 23:17:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-11 20:35:03 +08:00
										 |  |  | 	if !hs.databaseHealthy(ctx.Req.Context()) { | 
					
						
							| 
									
										
										
										
											2024-07-23 21:41:03 +08:00
										 |  |  | 		data.Database = "failing" | 
					
						
							| 
									
										
										
										
											2017-05-10 21:23:59 +08:00
										 |  |  | 		ctx.Resp.Header().Set("Content-Type", "application/json; charset=UTF-8") | 
					
						
							| 
									
										
										
										
											2022-12-02 03:51:12 +08:00
										 |  |  | 		ctx.Resp.WriteHeader(http.StatusServiceUnavailable) | 
					
						
							| 
									
										
										
										
											2017-05-10 21:23:59 +08:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		ctx.Resp.Header().Set("Content-Type", "application/json; charset=UTF-8") | 
					
						
							| 
									
										
										
										
											2022-12-02 03:51:12 +08:00
										 |  |  | 		ctx.Resp.WriteHeader(http.StatusOK) | 
					
						
							| 
									
										
										
										
											2017-04-25 23:17:45 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-23 21:41:03 +08:00
										 |  |  | 	dataBytes, err := json.MarshalIndent(data, "", "  ") | 
					
						
							| 
									
										
										
										
											2020-08-18 20:58:08 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		hs.log.Error("Failed to encode data", "err", err) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-09 00:57:53 +08:00
										 |  |  | 	if _, err := ctx.Resp.Write(dataBytes); err != nil { | 
					
						
							|  |  |  | 		hs.log.Error("Failed to write to response", "err", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-04-25 23:17:45 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-08 20:38:43 +08:00
										 |  |  | func (hs *HTTPServer) mapStatic(m *web.Mux, rootDir string, dir string, prefix string, exclude ...string) { | 
					
						
							| 
									
										
										
										
											2021-10-11 20:30:59 +08:00
										 |  |  | 	headers := func(c *web.Context) { | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | 		c.Resp.Header().Set("Cache-Control", "public, max-age=3600") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-08 19:54:00 +08:00
										 |  |  | 	if prefix == "public/build" { | 
					
						
							| 
									
										
										
										
											2021-10-11 20:30:59 +08:00
										 |  |  | 		headers = func(c *web.Context) { | 
					
						
							| 
									
										
										
										
											2018-05-08 19:54:00 +08:00
										 |  |  | 			c.Resp.Header().Set("Cache-Control", "public, max-age=31536000") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | 	if hs.Cfg.Env == setting.Dev { | 
					
						
							| 
									
										
										
										
											2021-10-11 20:30:59 +08:00
										 |  |  | 		headers = func(c *web.Context) { | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | 			c.Resp.Header().Set("Cache-Control", "max-age=0, must-revalidate, no-cache") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-04 17:22:03 +08:00
										 |  |  | 	if prefix == "mockServiceWorker.js" { | 
					
						
							|  |  |  | 		headers = func(c *web.Context) { | 
					
						
							|  |  |  | 			c.Resp.Header().Set("Content-Type", "application/javascript") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | 	m.Use(httpstatic.Static( | 
					
						
							|  |  |  | 		path.Join(rootDir, dir), | 
					
						
							|  |  |  | 		httpstatic.StaticOptions{ | 
					
						
							|  |  |  | 			SkipLogging: true, | 
					
						
							|  |  |  | 			Prefix:      prefix, | 
					
						
							|  |  |  | 			AddHeaders:  headers, | 
					
						
							| 
									
										
										
										
											2022-02-08 20:38:43 +08:00
										 |  |  | 			Exclude:     exclude, | 
					
						
							| 
									
										
										
										
											2016-12-21 21:36:32 +08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 	)) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-11-20 02:15:18 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (hs *HTTPServer) metricsEndpointBasicAuthEnabled() bool { | 
					
						
							|  |  |  | 	return hs.Cfg.MetricsEndpointBasicAuthUsername != "" && hs.Cfg.MetricsEndpointBasicAuthPassword != "" | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2023-05-08 23:11:36 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (hs *HTTPServer) getDefaultCiphers(tlsVersion uint16, protocol string) []uint16 { | 
					
						
							|  |  |  | 	if tlsVersion != tls.VersionTLS12 { | 
					
						
							|  |  |  | 		return nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if protocol == "https" { | 
					
						
							|  |  |  | 		return []uint16{ | 
					
						
							|  |  |  | 			tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, | 
					
						
							|  |  |  | 			tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, | 
					
						
							|  |  |  | 			tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, | 
					
						
							|  |  |  | 			tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, | 
					
						
							|  |  |  | 			tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, | 
					
						
							|  |  |  | 			tls.TLS_RSA_WITH_AES_128_GCM_SHA256, | 
					
						
							|  |  |  | 			tls.TLS_RSA_WITH_AES_256_GCM_SHA384, | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if protocol == "h2" { | 
					
						
							|  |  |  | 		return []uint16{ | 
					
						
							|  |  |  | 			tls.TLS_CHACHA20_POLY1305_SHA256, | 
					
						
							|  |  |  | 			tls.TLS_AES_128_GCM_SHA256, | 
					
						
							|  |  |  | 			tls.TLS_AES_256_GCM_SHA384, | 
					
						
							|  |  |  | 			tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, | 
					
						
							|  |  |  | 			tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, | 
					
						
							|  |  |  | 			tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, | 
					
						
							|  |  |  | 			tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, | 
					
						
							|  |  |  | 			tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, | 
					
						
							|  |  |  | 			tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-03-22 23:13:22 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (hs *HTTPServer) readCertificates() (*tls.Certificate, error) { | 
					
						
							|  |  |  | 	if hs.Cfg.CertFile == "" { | 
					
						
							|  |  |  | 		return nil, errors.New("cert_file cannot be empty when using HTTPS") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if hs.Cfg.KeyFile == "" { | 
					
						
							|  |  |  | 		return nil, errors.New("cert_key cannot be empty when using HTTPS") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if _, err := os.Stat(hs.Cfg.CertFile); os.IsNotExist(err) { | 
					
						
							|  |  |  | 		return nil, fmt.Errorf(`cannot find SSL cert_file at %q`, hs.Cfg.CertFile) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if _, err := os.Stat(hs.Cfg.KeyFile); os.IsNotExist(err) { | 
					
						
							|  |  |  | 		return nil, fmt.Errorf(`cannot find SSL key_file at %q`, hs.Cfg.KeyFile) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-07 06:18:32 +08:00
										 |  |  | 	if hs.Cfg.CertPassword != "" { | 
					
						
							|  |  |  | 		return handleEncryptedCertificates(hs.Cfg) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// previous implementation
 | 
					
						
							| 
									
										
										
										
											2024-03-22 23:13:22 +08:00
										 |  |  | 	tlsCert, err := tls.LoadX509KeyPair(hs.Cfg.CertFile, hs.Cfg.KeyFile) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, fmt.Errorf("could not load SSL certificate: %w", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return &tlsCert, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-07 06:18:32 +08:00
										 |  |  | func handleEncryptedCertificates(cfg *setting.Cfg) (*tls.Certificate, error) { | 
					
						
							|  |  |  | 	certKeyFilePassword := cfg.CertPassword | 
					
						
							|  |  |  | 	certData, err := os.ReadFile(cfg.CertFile) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, fmt.Errorf("failed to read certificate file: %w", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	keyData, err := os.ReadFile(cfg.KeyFile) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, fmt.Errorf("failed to read private key file: %w", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// handle encrypted private key
 | 
					
						
							|  |  |  | 	keyPemBlock, _ := pem.Decode(keyData) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var keyBytes []byte | 
					
						
							|  |  |  | 	// Process the PKCS-encrypted PEM block.
 | 
					
						
							| 
									
										
										
										
											2024-09-20 02:03:06 +08:00
										 |  |  | 	if strings.Contains(keyPemBlock.Type, "ENCRYPTED PRIVATE KEY") { | 
					
						
							| 
									
										
										
										
											2024-08-07 06:18:32 +08:00
										 |  |  | 		// The pkcs8 package only handles the PKCS #5 v2.0 scheme.
 | 
					
						
							|  |  |  | 		decrypted, err := pkcs8.ParsePKCS8PrivateKey(keyPemBlock.Bytes, []byte(certKeyFilePassword)) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return nil, fmt.Errorf("error parsing PKCS8 Private key: %w", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		keyBytes, err = x509.MarshalPKCS8PrivateKey(decrypted) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return nil, fmt.Errorf("error marshaling PKCS8 Private key: %w", err) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2024-09-20 02:03:06 +08:00
										 |  |  | 	} else if strings.Contains(keyPemBlock.Type, "RSA PRIVATE KEY") { | 
					
						
							|  |  |  | 		// Check if the PEM block is encrypted with PKCS#1
 | 
					
						
							|  |  |  | 		// Even if these methods are deprecated, RSA PKCS#1 was requested by some customers and fairly used
 | 
					
						
							|  |  |  | 		// nolint:staticcheck
 | 
					
						
							|  |  |  | 		if !x509.IsEncryptedPEMBlock(keyPemBlock) { | 
					
						
							|  |  |  | 			return nil, fmt.Errorf("password provided but Private key is not recorgnized as encrypted") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		// Only covers encrypted PEM data with a DEK-Info header.
 | 
					
						
							|  |  |  | 		// nolint:staticcheck
 | 
					
						
							|  |  |  | 		keyBytes, err = x509.DecryptPEMBlock(keyPemBlock, []byte(certKeyFilePassword)) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return nil, fmt.Errorf("error decrypting x509 PemBlock: %w", err) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2024-08-07 06:18:32 +08:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		return nil, fmt.Errorf("password provided but Private key is not encrypted or not supported") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var encodedKey bytes.Buffer | 
					
						
							|  |  |  | 	err = pem.Encode(&encodedKey, &pem.Block{Type: keyPemBlock.Type, Bytes: keyBytes}) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, fmt.Errorf("error encoding pem file: %w", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	cert, err := tls.X509KeyPair(certData, encodedKey.Bytes()) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, fmt.Errorf("failed to parse X509 key pair: %w", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return &cert, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-22 23:13:22 +08:00
										 |  |  | func (hs *HTTPServer) configureTLS() error { | 
					
						
							|  |  |  | 	tlsCerts, err := hs.tlsCertificates() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	minTlsVersion, err := util.TlsNameToVersion(hs.Cfg.MinTLSVersion) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	tlsCiphers := hs.getDefaultCiphers(minTlsVersion, string(hs.Cfg.Protocol)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	hs.log.Info("HTTP Server TLS settings", "scheme", hs.Cfg.Protocol, "Min TLS Version", hs.Cfg.MinTLSVersion, | 
					
						
							|  |  |  | 		"configured ciphers", util.TlsCipherIdsToString(tlsCiphers)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	tlsCfg := &tls.Config{ | 
					
						
							|  |  |  | 		Certificates: tlsCerts, | 
					
						
							|  |  |  | 		MinVersion:   minTlsVersion, | 
					
						
							|  |  |  | 		CipherSuites: tlsCiphers, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	hs.httpSrv.TLSConfig = tlsCfg | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if hs.Cfg.Protocol == setting.HTTP2Scheme { | 
					
						
							|  |  |  | 		hs.httpSrv.TLSConfig.NextProtos = []string{"h2", "http/1.1"} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if hs.Cfg.Protocol == setting.HTTPSScheme { | 
					
						
							|  |  |  | 		hs.httpSrv.TLSNextProto = make(map[string]func(*http.Server, *tls.Conn, http.Handler)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (hs *HTTPServer) GetCertificate(*tls.ClientHelloInfo) (*tls.Certificate, error) { | 
					
						
							|  |  |  | 	hs.tlsCerts.certLock.RLock() | 
					
						
							|  |  |  | 	defer hs.tlsCerts.certLock.RUnlock() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	tlsCerts := hs.tlsCerts.certs | 
					
						
							|  |  |  | 	return tlsCerts, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-07 06:18:32 +08:00
										 |  |  | // WatchAndUpdateCerts fsnotify module can be used to detect file changes and based on the event certs can be reloaded
 | 
					
						
							| 
									
										
										
										
											2024-03-22 23:13:22 +08:00
										 |  |  | // since it adds a direct dependency for the optional feature. So that is the reason periodic watching
 | 
					
						
							|  |  |  | // of cert files is chosen. If fsnotify is added as direct dependency in future, then the implementation
 | 
					
						
							|  |  |  | // can be revisited to align to fsnotify.
 | 
					
						
							|  |  |  | func (hs *HTTPServer) WatchAndUpdateCerts(ctx context.Context) { | 
					
						
							|  |  |  | 	ticker := time.NewTicker(hs.Cfg.CertWatchInterval) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for { | 
					
						
							|  |  |  | 		select { | 
					
						
							|  |  |  | 		case <-ticker.C: | 
					
						
							|  |  |  | 			if err := hs.updateCerts(); err != nil { | 
					
						
							|  |  |  | 				hs.log.Error("Not able to reload certificates", "error", err) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		case <-ctx.Done(): | 
					
						
							|  |  |  | 			hs.log.Debug("Stopping the CertWatchInterval ticker") | 
					
						
							|  |  |  | 			ticker.Stop() | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (hs *HTTPServer) updateCerts() error { | 
					
						
							|  |  |  | 	tlsInfo := &hs.tlsCerts | 
					
						
							|  |  |  | 	cMtime, err := getMtime(hs.Cfg.CertFile) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	kMtime, err := getMtime(hs.Cfg.KeyFile) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if cMtime.Compare(tlsInfo.certMtime) != 0 || kMtime.Compare(tlsInfo.keyMtime) != 0 { | 
					
						
							|  |  |  | 		certs, err := hs.readCertificates() | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		tlsInfo.certLock.Lock() | 
					
						
							|  |  |  | 		defer tlsInfo.certLock.Unlock() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		tlsInfo.certs = certs | 
					
						
							|  |  |  | 		tlsInfo.certMtime = cMtime | 
					
						
							|  |  |  | 		tlsInfo.keyMtime = kMtime | 
					
						
							|  |  |  | 		hs.log.Info("Server certificates updated", "cMtime", tlsInfo.certMtime, "kMtime", tlsInfo.keyMtime) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func getMtime(name string) (time.Time, error) { | 
					
						
							|  |  |  | 	fInfo, err := os.Stat(name) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return time.Time{}, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return fInfo.ModTime(), nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (hs *HTTPServer) updateMtimeOfServerCerts() error { | 
					
						
							|  |  |  | 	var err error | 
					
						
							|  |  |  | 	hs.tlsCerts.certMtime, err = getMtime(hs.Cfg.CertFile) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	hs.tlsCerts.keyMtime, err = getMtime(hs.Cfg.KeyFile) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } |