| 
									
										
										
										
											2023-01-04 20:48:00 +08:00
										 |  |  | package clients | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"context" | 
					
						
							| 
									
										
										
										
											2023-01-26 17:50:44 +08:00
										 |  |  | 	"time" | 
					
						
							| 
									
										
										
										
											2023-01-04 20:48:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-12 14:26:53 +08:00
										 |  |  | 	"github.com/grafana/authlib/claims" | 
					
						
							| 
									
										
										
										
											2024-06-13 12:11:35 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/apimachinery/errutil" | 
					
						
							| 
									
										
										
										
											2024-07-25 17:52:14 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/apimachinery/identity" | 
					
						
							| 
									
										
										
										
											2023-01-04 20:48:00 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/authn" | 
					
						
							| 
									
										
										
										
											2023-01-26 17:50:44 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/login" | 
					
						
							| 
									
										
										
										
											2023-01-04 20:48:00 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/org" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/services/rendering" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var ( | 
					
						
							| 
									
										
										
										
											2023-08-22 18:52:24 +08:00
										 |  |  | 	errInvalidRenderKey = errutil.Unauthorized("render-auth.invalid-key", errutil.WithPublicMessage("Invalid Render Key")) | 
					
						
							| 
									
										
										
										
											2023-01-04 20:48:00 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ( | 
					
						
							|  |  |  | 	renderCookieName = "renderKey" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-26 17:50:44 +08:00
										 |  |  | var _ authn.ContextAwareClient = new(Render) | 
					
						
							| 
									
										
										
										
											2023-01-04 20:48:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-12 16:15:14 +08:00
										 |  |  | func ProvideRender(renderService rendering.Service) *Render { | 
					
						
							|  |  |  | 	return &Render{renderService} | 
					
						
							| 
									
										
										
										
											2023-01-04 20:48:00 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type Render struct { | 
					
						
							|  |  |  | 	renderService rendering.Service | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-26 17:50:44 +08:00
										 |  |  | func (c *Render) Name() string { | 
					
						
							|  |  |  | 	return authn.ClientRender | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-04 20:48:00 +08:00
										 |  |  | func (c *Render) Authenticate(ctx context.Context, r *authn.Request) (*authn.Identity, error) { | 
					
						
							|  |  |  | 	key := getRenderKey(r) | 
					
						
							|  |  |  | 	renderUsr, ok := c.renderService.GetRenderUser(ctx, key) | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							| 
									
										
										
										
											2023-02-24 18:26:55 +08:00
										 |  |  | 		return nil, errInvalidRenderKey.Errorf("found no render user for key: %s", key) | 
					
						
							| 
									
										
										
										
											2023-01-04 20:48:00 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if renderUsr.UserID <= 0 { | 
					
						
							| 
									
										
										
										
											2024-03-12 16:15:14 +08:00
										 |  |  | 		return &authn.Identity{ | 
					
						
							| 
									
										
										
										
											2024-08-12 14:26:53 +08:00
										 |  |  | 			ID:              identity.NewTypedID(claims.TypeRenderService, 0), | 
					
						
							| 
									
										
										
										
											2024-03-12 16:15:14 +08:00
										 |  |  | 			OrgID:           renderUsr.OrgID, | 
					
						
							|  |  |  | 			OrgRoles:        map[int64]org.RoleType{renderUsr.OrgID: org.RoleType(renderUsr.OrgRole)}, | 
					
						
							|  |  |  | 			ClientParams:    authn.ClientParams{SyncPermissions: true}, | 
					
						
							|  |  |  | 			LastSeenAt:      time.Now(), | 
					
						
							|  |  |  | 			AuthenticatedBy: login.RenderModule, | 
					
						
							|  |  |  | 		}, nil | 
					
						
							| 
									
										
										
										
											2023-01-04 20:48:00 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-01-26 17:50:44 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-12 16:15:14 +08:00
										 |  |  | 	return &authn.Identity{ | 
					
						
							| 
									
										
										
										
											2024-08-12 14:26:53 +08:00
										 |  |  | 		ID:              identity.NewTypedID(claims.TypeUser, renderUsr.UserID), | 
					
						
							| 
									
										
										
										
											2024-03-12 16:15:14 +08:00
										 |  |  | 		LastSeenAt:      time.Now(), | 
					
						
							|  |  |  | 		AuthenticatedBy: login.RenderModule, | 
					
						
							|  |  |  | 		ClientParams:    authn.ClientParams{FetchSyncedUser: true, SyncPermissions: true}, | 
					
						
							|  |  |  | 	}, nil | 
					
						
							| 
									
										
										
										
											2023-01-04 20:48:00 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-15 16:54:50 +08:00
										 |  |  | func (c *Render) IsEnabled() bool { | 
					
						
							|  |  |  | 	return true | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-04 20:48:00 +08:00
										 |  |  | func (c *Render) Test(ctx context.Context, r *authn.Request) bool { | 
					
						
							|  |  |  | 	if r.HTTPRequest == nil { | 
					
						
							|  |  |  | 		return false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return getRenderKey(r) != "" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-26 17:50:44 +08:00
										 |  |  | func (c *Render) Priority() uint { | 
					
						
							|  |  |  | 	return 10 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-04 20:48:00 +08:00
										 |  |  | func getRenderKey(r *authn.Request) string { | 
					
						
							|  |  |  | 	cookie, err := r.HTTPRequest.Cookie(renderCookieName) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return "" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return cookie.Value | 
					
						
							|  |  |  | } |