| 
									
										
										
										
											2019-01-05 22:44:33 +00:00
										 |  |  | package rules | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2020-11-20 10:51:28 +00:00
										 |  |  | 	"path/filepath" | 
					
						
							| 
									
										
										
										
											2019-01-05 22:44:33 +00:00
										 |  |  | 	"regexp" | 
					
						
							|  |  |  | 	"strings" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Checker is a Rules checker.
 | 
					
						
							|  |  |  | type Checker interface { | 
					
						
							|  |  |  | 	Check(path string) bool | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Rule is a allow/disallow rule.
 | 
					
						
							|  |  |  | type Rule struct { | 
					
						
							|  |  |  | 	Regex  bool    `json:"regex"` | 
					
						
							|  |  |  | 	Allow  bool    `json:"allow"` | 
					
						
							|  |  |  | 	Path   string  `json:"path"` | 
					
						
							|  |  |  | 	Regexp *Regexp `json:"regexp"` | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 10:51:28 +00:00
										 |  |  | // MatchHidden matches paths with a basename
 | 
					
						
							|  |  |  | // that begins with a dot.
 | 
					
						
							|  |  |  | func MatchHidden(path string) bool { | 
					
						
							|  |  |  | 	return strings.HasPrefix(filepath.Base(path), ".") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-05 22:44:33 +00:00
										 |  |  | // Matches matches a path against a rule.
 | 
					
						
							|  |  |  | func (r *Rule) Matches(path string) bool { | 
					
						
							|  |  |  | 	if r.Regex { | 
					
						
							|  |  |  | 		return r.Regexp.MatchString(path) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return strings.HasPrefix(path, r.Path) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Regexp is a wrapper to the native regexp type where we
 | 
					
						
							|  |  |  | // save the raw expression.
 | 
					
						
							|  |  |  | type Regexp struct { | 
					
						
							|  |  |  | 	Raw    string `json:"raw"` | 
					
						
							|  |  |  | 	regexp *regexp.Regexp | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // MatchString checks if a string matches the regexp.
 | 
					
						
							|  |  |  | func (r *Regexp) MatchString(s string) bool { | 
					
						
							|  |  |  | 	if r.regexp == nil { | 
					
						
							|  |  |  | 		r.regexp = regexp.MustCompile(r.Raw) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return r.regexp.MatchString(s) | 
					
						
							|  |  |  | } |