| 
									
										
										
										
											2023-05-22 14:36:34 +00:00
										 |  |  | package sub | 
					
						
							| 
									
										
										
										
											2023-04-09 19:43:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"encoding/base64" | 
					
						
							| 
									
										
										
										
											2024-05-22 15:51:55 +00:00
										 |  |  | 	"net" | 
					
						
							| 
									
										
										
										
											2024-08-11 16:26:43 +00:00
										 |  |  | 	"strings" | 
					
						
							| 
									
										
										
										
											2023-04-09 19:43:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/gin-gonic/gin" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type SUBController struct { | 
					
						
							| 
									
										
										
										
											2025-03-15 07:16:59 +00:00
										 |  |  | 	subTitle       string | 
					
						
							| 
									
										
										
										
											2024-02-21 10:47:52 +00:00
										 |  |  | 	subPath        string | 
					
						
							|  |  |  | 	subJsonPath    string | 
					
						
							|  |  |  | 	subEncrypt     bool | 
					
						
							|  |  |  | 	updateInterval string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	subService     *SubService | 
					
						
							|  |  |  | 	subJsonService *SubJsonService | 
					
						
							| 
									
										
										
										
											2023-04-09 19:43:18 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-21 10:47:52 +00:00
										 |  |  | func NewSUBController( | 
					
						
							|  |  |  | 	g *gin.RouterGroup, | 
					
						
							|  |  |  | 	subPath string, | 
					
						
							|  |  |  | 	jsonPath string, | 
					
						
							|  |  |  | 	encrypt bool, | 
					
						
							|  |  |  | 	showInfo bool, | 
					
						
							|  |  |  | 	rModel string, | 
					
						
							|  |  |  | 	update string, | 
					
						
							| 
									
										
										
										
											2024-03-10 21:31:24 +00:00
										 |  |  | 	jsonFragment string, | 
					
						
							| 
									
										
										
										
											2024-08-29 09:27:43 +00:00
										 |  |  | 	jsonNoise string, | 
					
						
							| 
									
										
										
										
											2024-03-12 16:14:51 +00:00
										 |  |  | 	jsonMux string, | 
					
						
							|  |  |  | 	jsonRules string, | 
					
						
							| 
									
										
										
										
											2025-03-15 07:16:59 +00:00
										 |  |  | 	subTitle string, | 
					
						
							| 
									
										
										
										
											2024-03-10 21:31:24 +00:00
										 |  |  | ) *SUBController { | 
					
						
							| 
									
										
										
										
											2024-03-11 12:44:24 +00:00
										 |  |  | 	sub := NewSubService(showInfo, rModel) | 
					
						
							| 
									
										
										
										
											2024-02-21 10:47:52 +00:00
										 |  |  | 	a := &SUBController{ | 
					
						
							| 
									
										
										
										
											2025-03-15 07:16:59 +00:00
										 |  |  | 		subTitle:       subTitle, | 
					
						
							| 
									
										
										
										
											2024-02-21 10:47:52 +00:00
										 |  |  | 		subPath:        subPath, | 
					
						
							|  |  |  | 		subJsonPath:    jsonPath, | 
					
						
							|  |  |  | 		subEncrypt:     encrypt, | 
					
						
							|  |  |  | 		updateInterval: update, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-11 12:44:24 +00:00
										 |  |  | 		subService:     sub, | 
					
						
							| 
									
										
										
										
											2024-08-29 09:27:43 +00:00
										 |  |  | 		subJsonService: NewSubJsonService(jsonFragment, jsonNoise, jsonMux, jsonRules, sub), | 
					
						
							| 
									
										
										
										
											2024-02-21 10:47:52 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-04-09 19:43:18 +00:00
										 |  |  | 	a.initRouter(g) | 
					
						
							|  |  |  | 	return a | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (a *SUBController) initRouter(g *gin.RouterGroup) { | 
					
						
							| 
									
										
										
										
											2024-02-21 10:47:52 +00:00
										 |  |  | 	gLink := g.Group(a.subPath) | 
					
						
							|  |  |  | 	gJson := g.Group(a.subJsonPath) | 
					
						
							| 
									
										
										
										
											2023-04-09 19:43:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-21 10:47:52 +00:00
										 |  |  | 	gLink.GET(":subid", a.subs) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	gJson.GET(":subid", a.subJsons) | 
					
						
							| 
									
										
										
										
											2023-04-09 19:43:18 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (a *SUBController) subs(c *gin.Context) { | 
					
						
							|  |  |  | 	subId := c.Param("subid") | 
					
						
							| 
									
										
										
										
											2024-08-11 16:26:43 +00:00
										 |  |  | 	var host string | 
					
						
							|  |  |  | 	if h, err := getHostFromXFH(c.GetHeader("X-Forwarded-Host")); err == nil { | 
					
						
							|  |  |  | 		host = h | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-05-23 21:51:19 +00:00
										 |  |  | 	if host == "" { | 
					
						
							|  |  |  | 		host = c.GetHeader("X-Real-IP") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if host == "" { | 
					
						
							|  |  |  | 		var err error | 
					
						
							|  |  |  | 		host, _, err = net.SplitHostPort(c.Request.Host) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			host = c.Request.Host | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-21 10:47:52 +00:00
										 |  |  | 	subs, header, err := a.subService.GetSubs(subId, host) | 
					
						
							| 
									
										
										
										
											2023-04-18 18:04:06 +00:00
										 |  |  | 	if err != nil || len(subs) == 0 { | 
					
						
							| 
									
										
										
										
											2023-04-09 19:43:18 +00:00
										 |  |  | 		c.String(400, "Error!") | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		result := "" | 
					
						
							|  |  |  | 		for _, sub := range subs { | 
					
						
							|  |  |  | 			result += sub + "\n" | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2023-04-18 18:04:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-16 21:37:35 +00:00
										 |  |  | 		// Add headers
 | 
					
						
							| 
									
										
										
										
											2024-02-21 10:47:52 +00:00
										 |  |  | 		c.Writer.Header().Set("Subscription-Userinfo", header) | 
					
						
							|  |  |  | 		c.Writer.Header().Set("Profile-Update-Interval", a.updateInterval) | 
					
						
							| 
									
										
										
										
											2025-04-15 12:29:54 +00:00
										 |  |  | 		c.Writer.Header().Set("Profile-Title", "base64:" + base64.StdEncoding.EncodeToString([]byte(a.subTitle))) | 
					
						
							| 
									
										
										
										
											2023-04-18 18:04:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-21 10:47:52 +00:00
										 |  |  | 		if a.subEncrypt { | 
					
						
							| 
									
										
										
										
											2023-08-26 13:24:01 +00:00
										 |  |  | 			c.String(200, base64.StdEncoding.EncodeToString([]byte(result))) | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			c.String(200, result) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2023-04-09 19:43:18 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-02-21 10:47:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (a *SUBController) subJsons(c *gin.Context) { | 
					
						
							|  |  |  | 	subId := c.Param("subid") | 
					
						
							| 
									
										
										
										
											2024-08-11 16:26:43 +00:00
										 |  |  | 	var host string | 
					
						
							|  |  |  | 	if h, err := getHostFromXFH(c.GetHeader("X-Forwarded-Host")); err == nil { | 
					
						
							|  |  |  | 		host = h | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-05-23 21:51:19 +00:00
										 |  |  | 	if host == "" { | 
					
						
							|  |  |  | 		host = c.GetHeader("X-Real-IP") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if host == "" { | 
					
						
							|  |  |  | 		var err error | 
					
						
							|  |  |  | 		host, _, err = net.SplitHostPort(c.Request.Host) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			host = c.Request.Host | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-21 10:47:52 +00:00
										 |  |  | 	jsonSub, header, err := a.subJsonService.GetJson(subId, host) | 
					
						
							|  |  |  | 	if err != nil || len(jsonSub) == 0 { | 
					
						
							|  |  |  | 		c.String(400, "Error!") | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Add headers
 | 
					
						
							|  |  |  | 		c.Writer.Header().Set("Subscription-Userinfo", header) | 
					
						
							|  |  |  | 		c.Writer.Header().Set("Profile-Update-Interval", a.updateInterval) | 
					
						
							| 
									
										
										
										
											2025-04-15 12:29:54 +00:00
										 |  |  | 		c.Writer.Header().Set("Profile-Title", "base64:" + base64.StdEncoding.EncodeToString([]byte(a.subTitle))) | 
					
						
							| 
									
										
										
										
											2024-02-21 10:47:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		c.String(200, jsonSub) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-08-11 16:26:43 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | func getHostFromXFH(s string) (string, error) { | 
					
						
							|  |  |  | 	if strings.Contains(s, ":") { | 
					
						
							|  |  |  | 		realHost, _, err := net.SplitHostPort(s) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return "", err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return realHost, nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return s, nil | 
					
						
							|  |  |  | } |