package main import ( "smesh.lol/web/common/helpers" "smesh.lol/web/common/jsbridge/ext" ) // Per-host, per-method permission store. // Policies: "allow", "deny", "ask" (default). type permission struct { Host string Method string Policy string } var permissions []permission func init() { ext.StorageGet("smesh-permissions", func(data string) { if data != "" { parsePermissions(data) } }) } func getPermission(host, method string) string { for _, p := range permissions { if p.Host == host && p.Method == method { return p.Policy } } return "ask" } func setPermission(host, method, policy string) { for i, p := range permissions { if p.Host == host && p.Method == method { permissions[i].Policy = policy savePermissions() return } } permissions = append(permissions, permission{Host: host, Method: method, Policy: policy}) savePermissions() } func getPermissionsJSON() string { s := "[" for i, p := range permissions { if i > 0 { s += "," } s += "{\"host\":" + helpers.JsonString(p.Host) + ",\"method\":" + helpers.JsonString(p.Method) + ",\"policy\":" + helpers.JsonString(p.Policy) + "}" } return "{\"result\":" + s + "]}" } func savePermissions() { s := "[" for i, p := range permissions { if i > 0 { s += "," } s += "{\"host\":" + helpers.JsonString(p.Host) + ",\"method\":" + helpers.JsonString(p.Method) + ",\"policy\":" + helpers.JsonString(p.Policy) + "}" } ext.StorageSet("smesh-permissions", s+"]") } func parsePermissions(s string) { permissions = nil i := 0 for i < len(s) && s[i] != '[' { i++ } i++ for i < len(s) { for i < len(s) && s[i] != '{' && s[i] != ']' { i++ } if i >= len(s) || s[i] == ']' { break } end := i + 1 depth := 1 for end < len(s) && depth > 0 { if s[end] == '{' { depth++ } else if s[end] == '}' { depth-- } else if s[end] == '"' { end++ for end < len(s) && s[end] != '"' { if s[end] == '\\' { end++ } end++ } } end++ } obj := s[i:end] host := helpers.JsonGetString(obj, "host") method := helpers.JsonGetString(obj, "method") policy := helpers.JsonGetString(obj, "policy") if host != "" && method != "" && policy != "" { permissions = append(permissions, permission{Host: host, Method: method, Policy: policy}) } i = end } }