| 
									
										
										
										
											2018-02-09 06:13:58 +08:00
										 |  |  | package sqlstore | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2018-03-20 05:09:49 +08:00
										 |  |  | 	"time" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-09 06:13:58 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/bus" | 
					
						
							|  |  |  | 	m "github.com/grafana/grafana/pkg/models" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func init() { | 
					
						
							|  |  |  | 	bus.AddHandler("sql", GetUserByAuthInfo) | 
					
						
							|  |  |  | 	bus.AddHandler("sql", GetAuthInfo) | 
					
						
							|  |  |  | 	bus.AddHandler("sql", SetAuthInfo) | 
					
						
							|  |  |  | 	bus.AddHandler("sql", DeleteAuthInfo) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func GetUserByAuthInfo(query *m.GetUserByAuthInfoQuery) error { | 
					
						
							| 
									
										
										
										
											2018-03-23 23:58:38 +08:00
										 |  |  | 	user := &m.User{} | 
					
						
							| 
									
										
										
										
											2018-02-09 06:13:58 +08:00
										 |  |  | 	has := false | 
					
						
							|  |  |  | 	var err error | 
					
						
							| 
									
										
										
										
											2018-03-29 09:26:35 +08:00
										 |  |  | 	authQuery := &m.GetAuthInfoQuery{} | 
					
						
							| 
									
										
										
										
											2018-02-09 06:13:58 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Try to find the user by auth module and id first
 | 
					
						
							|  |  |  | 	if query.AuthModule != "" && query.AuthId != "" { | 
					
						
							| 
									
										
										
										
											2018-03-29 09:26:35 +08:00
										 |  |  | 		authQuery.AuthModule = query.AuthModule | 
					
						
							|  |  |  | 		authQuery.AuthId = query.AuthId | 
					
						
							| 
									
										
										
										
											2018-02-09 06:13:58 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		err = GetAuthInfo(authQuery) | 
					
						
							| 
									
										
										
										
											2018-04-17 04:17:01 +08:00
										 |  |  | 		if err != m.ErrUserNotFound { | 
					
						
							| 
									
										
										
										
											2018-02-09 06:13:58 +08:00
										 |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				return err | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 04:17:01 +08:00
										 |  |  | 			// if user id was specified and doesn't match the user_auth entry, remove it
 | 
					
						
							|  |  |  | 			if query.UserId != 0 && query.UserId != authQuery.Result.UserId { | 
					
						
							| 
									
										
										
										
											2018-03-29 09:07:02 +08:00
										 |  |  | 				err = DeleteAuthInfo(&m.DeleteAuthInfoCommand{ | 
					
						
							| 
									
										
										
										
											2018-03-29 06:06:22 +08:00
										 |  |  | 					UserAuth: authQuery.Result, | 
					
						
							| 
									
										
										
										
											2018-02-09 06:13:58 +08:00
										 |  |  | 				}) | 
					
						
							| 
									
										
										
										
											2018-03-29 09:07:02 +08:00
										 |  |  | 				if err != nil { | 
					
						
							|  |  |  | 					sqlog.Error("Error removing user_auth entry", "error", err) | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-03-29 09:26:35 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				authQuery.Result = nil | 
					
						
							| 
									
										
										
										
											2018-04-17 04:17:01 +08:00
										 |  |  | 			} else { | 
					
						
							|  |  |  | 				has, err = x.Id(authQuery.Result.UserId).Get(user) | 
					
						
							|  |  |  | 				if err != nil { | 
					
						
							|  |  |  | 					return err | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if !has { | 
					
						
							|  |  |  | 					// if the user has been deleted then remove the entry
 | 
					
						
							|  |  |  | 					err = DeleteAuthInfo(&m.DeleteAuthInfoCommand{ | 
					
						
							|  |  |  | 						UserAuth: authQuery.Result, | 
					
						
							|  |  |  | 					}) | 
					
						
							|  |  |  | 					if err != nil { | 
					
						
							|  |  |  | 						sqlog.Error("Error removing user_auth entry", "error", err) | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					authQuery.Result = nil | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-02-09 06:13:58 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// If not found, try to find the user by id
 | 
					
						
							|  |  |  | 	if !has && query.UserId != 0 { | 
					
						
							|  |  |  | 		has, err = x.Id(query.UserId).Get(user) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// If not found, try to find the user by email address
 | 
					
						
							|  |  |  | 	if !has && query.Email != "" { | 
					
						
							|  |  |  | 		user = &m.User{Email: query.Email} | 
					
						
							|  |  |  | 		has, err = x.Get(user) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// If not found, try to find the user by login
 | 
					
						
							|  |  |  | 	if !has && query.Login != "" { | 
					
						
							|  |  |  | 		user = &m.User{Login: query.Login} | 
					
						
							|  |  |  | 		has, err = x.Get(user) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// No user found
 | 
					
						
							|  |  |  | 	if !has { | 
					
						
							|  |  |  | 		return m.ErrUserNotFound | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-29 09:26:35 +08:00
										 |  |  | 	// create authInfo record to link accounts
 | 
					
						
							|  |  |  | 	if authQuery.Result == nil && query.AuthModule != "" && query.AuthId != "" { | 
					
						
							|  |  |  | 		cmd2 := &m.SetAuthInfoCommand{ | 
					
						
							|  |  |  | 			UserId:     user.Id, | 
					
						
							|  |  |  | 			AuthModule: query.AuthModule, | 
					
						
							|  |  |  | 			AuthId:     query.AuthId, | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if err := SetAuthInfo(cmd2); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	query.Result = user | 
					
						
							| 
									
										
										
										
											2018-02-09 06:13:58 +08:00
										 |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func GetAuthInfo(query *m.GetAuthInfoQuery) error { | 
					
						
							|  |  |  | 	userAuth := &m.UserAuth{ | 
					
						
							|  |  |  | 		AuthModule: query.AuthModule, | 
					
						
							|  |  |  | 		AuthId:     query.AuthId, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	has, err := x.Get(userAuth) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if !has { | 
					
						
							|  |  |  | 		return m.ErrUserNotFound | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-29 06:06:22 +08:00
										 |  |  | 	query.Result = userAuth | 
					
						
							| 
									
										
										
										
											2018-02-09 06:13:58 +08:00
										 |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func SetAuthInfo(cmd *m.SetAuthInfoCommand) error { | 
					
						
							|  |  |  | 	return inTransaction(func(sess *DBSession) error { | 
					
						
							| 
									
										
										
										
											2018-03-29 09:26:35 +08:00
										 |  |  | 		authUser := &m.UserAuth{ | 
					
						
							| 
									
										
										
										
											2018-02-09 06:13:58 +08:00
										 |  |  | 			UserId:     cmd.UserId, | 
					
						
							|  |  |  | 			AuthModule: cmd.AuthModule, | 
					
						
							|  |  |  | 			AuthId:     cmd.AuthId, | 
					
						
							| 
									
										
										
										
											2018-03-20 05:09:49 +08:00
										 |  |  | 			Created:    time.Now(), | 
					
						
							| 
									
										
										
										
											2018-02-09 06:13:58 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-29 09:26:35 +08:00
										 |  |  | 		_, err := sess.Insert(authUser) | 
					
						
							| 
									
										
										
										
											2018-03-29 09:07:02 +08:00
										 |  |  | 		return err | 
					
						
							| 
									
										
										
										
											2018-02-09 06:13:58 +08:00
										 |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func DeleteAuthInfo(cmd *m.DeleteAuthInfoCommand) error { | 
					
						
							|  |  |  | 	return inTransaction(func(sess *DBSession) error { | 
					
						
							|  |  |  | 		_, err := sess.Delete(cmd.UserAuth) | 
					
						
							| 
									
										
										
										
											2018-03-29 09:07:02 +08:00
										 |  |  | 		return err | 
					
						
							| 
									
										
										
										
											2018-02-09 06:13:58 +08:00
										 |  |  | 	}) | 
					
						
							|  |  |  | } |