Regex implementation (yet to be implemented)

This commit is contained in:
Ben 2025-07-26 23:57:34 -07:00
parent 902f6513ff
commit 9a7834c330
Signed by: webmaster
GPG key ID: A5FCBAF34E6E8B50
5 changed files with 72 additions and 3 deletions

View file

@ -16,8 +16,7 @@ var flagsParsed bool = false;
/* what JSON file to read config values from */
var confLocation = flag.String("conf", "./config.txt", "Config file to read from")
/* Returns nil if flags are not parsed yet
@return set boolean will be true if argument is not nil */
/* @return set boolean will be true if argument is not nil */
func GetConfLocation() (location string, set bool) {
if confLocation == nil {return "", false}
return *confLocation, true;

View file

@ -1,5 +1,8 @@
package conf
/* This file contains the Config object and its methods, which handle reading
from a config file and matching requests to the whitelist. */
import (
"bufio"
"errors"
@ -7,11 +10,14 @@ import (
"strings"
)
// import "fmt"
/* Object to handle what is in a JSON config */
type Config struct {
configData map[string][]string;
}
/* Opens and reads a file at the path */
func NewConfig(filePath string) (newConfig *Config, err error) {
// Open file
file, err := os.Open(filePath)
@ -34,4 +40,5 @@ func NewConfig(filePath string) (newConfig *Config, err error) {
return &Config{configData: newConfigData}, nil;
}
/* Gets a reference copy to the config data */
func (config Config) GetConfigData() map[string][]string {return config.configData;}

View file

@ -18,5 +18,5 @@ There is a regex-like behavior to these paths using the `*` and `?` characters.
The `*` character matches to any number of path segments. The `?` character matches to only one segment. Here's some examples:
* `HZJWwB0TAjz6pjAHosII5ofR /+16028675309/*` will allow the bearer token to access any endpoint with the phone number `+16028675309`
* `HZJWwB0TAjz6pjAHosII5ofR /+16028675309/*` will allow the bearer token to access any endpoint with the phone number `+16028675309`.
* `HZJWwB0TAjz6pjAHosII5ofR /+16028675309/direct/?/send` will allow the bearer token to send a direct message to anyone on that phone number.

62
conf/regex.go Normal file
View file

@ -0,0 +1,62 @@
package conf
/* This file contains regex helper functions for parsing configs */
import (
"strings"
)
/* Splits and normalises */
func splitPath(path string) []string {
return strings.Split(strings.Trim(path, "/"), "/")
}
/* Attempts to match a request path to a set of whitelisted paths
@return false for anything other than a valid match */
func match(request string, matchTo []string) bool {
requestSplit := splitPath(request)
for _, matchToAttempt := range matchTo {
matchToAttemptSplit := splitPath(matchToAttempt);
if matchSegments(requestSplit, matchToAttemptSplit) {
return true;
}
}
return false;
}
/* Returns false for anything other than a valid match */
func matchSegments(request []string, matchTo []string) bool {
/* This is a recursive function which, at each recursion level, matches the
path segments that are in the front of the request and matchTo lists
It matches identical strings, anything to &, and splits in two when
matching anything to *, to account for consuming or not consuming the *
at the current recursion level. */
// Recursion base case for perfect match
if len(request) == 0 && len(matchTo) == 0 {return true}
// End of path for one but not the other
if (len(request) & len(matchTo)) == 0 {return false}
// Grab current path segments
requestCurrent := request[0];
matchToCurrent := matchTo[0];
// & character and direct match have the same behavior
if (matchToCurrent == "&") || (requestCurrent == matchToCurrent) {
return matchSegments(request[1:], matchTo[1:]);
}
// * character
if (matchToCurrent == "*") {
// These are split for performance
// Usually the * only refers to 1 or 2 things so putting consumption
// first is probably a better choice
if (matchSegments(request[1:], matchTo[1:])) {return true}
if (matchSegments(request[1:], matchTo)) {return true}
return false;
}
// Code will reach here if there's no match for the current segment
return false;
}

View file

@ -17,6 +17,7 @@ func main() {
if !confLocationSet {log.Default().Print("No config value!"); return;}
log.Default().Print("Reading config value from ", configLocation);
// Set up config
config, err := conf.NewConfig(configLocation);
if err != nil {log.Default().Print("Error reading config: ", err); return;}
fmt.Println(config.GetConfigData())