Vai al contenuto principale

Management API

The Management API covers all policy and grouping (role) operations: get, add, remove, update, filter. Below, e is an Enforcer instance.

Filtered API​

Filtered methods take (fieldIndex int, fieldValues ...string): matching starts at fieldIndex, and fieldValues are the required values at consecutive positions. Use "" in fieldValues as a wildcard for that position.

Esempio:

p, alice, book, read
p, bob, book, read
p, bob, book, write
p, alice, pen, get
p, bob, pen ,get
e.GetFilteredPolicy(1, "book") // returns: [["alice", "book", "read"], ["bob", "book", "read"], ["bob", "book", "write"]]

e.GetFilteredPolicy(1, "book", "read") // returns: [["alice", "book", "read"], ["bob", "book", "read"]]

e.GetFilteredPolicy(0, "alice", "", "read") // returns: [[alice book read]]

e.GetFilteredPolicy(0, "alice") // returns: [["alice", "book", "read"], ["alice", "pen", "get"]]

API Reference​

e, err := NewEnforcer("examples/rbac_model.conf", "examples/rbac_policy.csv")

Enforce()​

Enforce decide se un "soggetto" può accedere a un "oggetto" con l'operazione "azione", i parametri di input sono solitamente: (sub, obj, act).

Ad esempio:

ok, err := e.Enforce(request)

EnforceWithMatcher()​

EnforceWithMatcher utilizza un matcher personalizzato per decidere se un "soggetto" può accedere a un "oggetto" con l'operazione "azione", i parametri di input sono solitamente: (matcher, sub, obj, act), utilizza il matcher del modello di default quando matcher è "".

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

ok, err := e.EnforceWithMatcher(matcher, request)

EnforceEx()​

EnforceEx spiega l'applicazione delle regole informando le regole abbinate.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

ok, reason, err := e.EnforceEx(request)

EnforceExWithMatcher()​

EnforceExWithMatcher utilizza un matcher personalizzato e spiega l'applicazione delle regole informando le regole abbinate.

Ad esempio:

ok, reason, err := e.EnforceExWithMatcher(matcher, request)

BatchEnforce()​

BatchEnforce applica ogni richiesta e restituisce il risultato in un array di bool

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

boolArray, err := e.BatchEnforce(requests)

GetAllSubjects()​

GetAllSubjects ottiene la lista dei soggetti che compaiono nella politica corrente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

allSubjects := e.GetAllSubjects()

GetAllNamedSubjects()​

GetAllNamedSubjects ottiene la lista dei soggetti che compaiono nella politica nominata corrente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

allNamedSubjects := e.GetAllNamedSubjects("p")

GetAllObjects()​

GetAllObjects ottiene la lista degli oggetti che compaiono nella politica corrente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

allObjects := e.GetAllObjects()

GetAllNamedObjects()​

GetAllNamedObjects ottiene la lista degli oggetti che compaiono nella politica nominata corrente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

allNamedObjects := e.GetAllNamedObjects("p")

GetAllActions()​

GetAllActions ottiene la lista delle azioni che compaiono nella politica corrente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

allActions := e.GetAllActions()

GetAllNamedActions()​

GetAllNamedActions ottiene la lista delle azioni che compaiono nella politica nominata corrente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

allNamedActions := e.GetAllNamedActions("p")

GetAllRoles()​

GetAllRoles ottiene la lista dei ruoli che compaiono nella politica corrente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

allRoles = e.GetAllRoles()

GetAllNamedRoles()​

GetAllNamedRoles ottiene la lista dei ruoli che compaiono nella politica nominata corrente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

allNamedRoles := e.GetAllNamedRoles("g")

GetPolicy()​

GetPolicy ottiene tutte le regole di autorizzazione nella politica.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

policy = e.GetPolicy()

GetFilteredPolicy()​

GetFilteredPolicy ottiene tutte le regole di autorizzazione nella policy, è possibile specificare filtri per i campi.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

filteredPolicy := e.GetFilteredPolicy(0, "alice")

GetNamedPolicy()​

GetNamedPolicy ottiene tutte le regole di autorizzazione nella policy nominata.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

namedPolicy := e.GetNamedPolicy("p")

GetFilteredNamedPolicy()​

GetFilteredNamedPolicy ottiene tutte le regole di autorizzazione nella policy nominata, è possibile specificare filtri per i campi.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

filteredNamedPolicy = e.GetFilteredNamedPolicy("p", 0, "bob")

GetGroupingPolicy()​

GetGroupingPolicy ottiene tutte le regole di ereditarietà del ruolo nella policy.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

groupingPolicy := e.GetGroupingPolicy()

GetFilteredGroupingPolicy()​

GetFilteredGroupingPolicy ottiene tutte le regole di ereditarietà del ruolo nella policy, con filtri sui campi specificabili.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

filteredGroupingPolicy := e.GetFilteredGroupingPolicy(0, "alice")

GetNamedGroupingPolicy()​

GetNamedGroupingPolicy ottiene tutte le regole di ereditarietà del ruolo nella policy.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

namedGroupingPolicy := e.GetNamedGroupingPolicy("g")

GetFilteredNamedGroupingPolicy()​

GetFilteredNamedGroupingPolicy recupera tutte le regole di ereditarietà dei ruoli nella policy.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

namedGroupingPolicy := e.GetFilteredNamedGroupingPolicy("g", 0, "alice")

HasPolicy()​

HasPolicy determina se una regola di autorizzazione esiste.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

hasPolicy := e.HasPolicy("data2_admin", "data2", "read")

HasNamedPolicy()​

HasNamedPolicy determina se una regola di autorizzazione nominata esiste.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

hasNamedPolicy := e.HasNamedPolicy("p", "data2_admin", "data2", "read")

AddPolicy()​

AddPolicy aggiunge una regola di autorizzazione alla policy corrente. Se la regola esiste già, la funzione restituisce false e la regola non verrà aggiunta. Altrimenti la funzione restituisce true aggiungendo la nuova regola.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

added := e.AddPolicy('eve', 'data3', 'read')

AddPolicies()​

AddPolicies aggiunge regole di autorizzazione alla politica corrente. L'operazione è di natura atomica. Quindi, se le regole di autorizzazione consistono in regole che non sono coerenti con la politica corrente, la funzione restituisce false e nessuna regola di politica viene aggiunta alla politica corrente. Se tutte le regole di autorizzazione sono coerenti con le regole di politica, la funzione restituisce true e ogni regola di politica viene aggiunta alla politica corrente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

rules := [][] string {
[]string {"jack", "data4", "read"},
[]string {"katy", "data4", "write"},
[]string {"leyo", "data4", "read"},
[]string {"ham", "data4", "write"},
}

areRulesAdded := e.AddPolicies(rules)

AddPoliciesEx()​

AddPoliciesEx aggiunge regole di autorizzazione alla politica corrente. Se la regola esiste già, la regola non verrà aggiunta. Ma a differenza di AddPolicies, altre regole non esistenti vengono aggiunte invece di restituire false direttamente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

ok, err := e.AddPoliciesEx([][]string{{"user1", "data1", "read"}, {"user2", "data2", "read"}})

AddNamedPolicy()​

AddNamedPolicy aggiunge una regola di autorizzazione alla politica corrente con nome. Se la regola esiste già, la funzione restituisce false e la regola non verrà aggiunta. Altrimenti la funzione restituisce true aggiungendo la nuova regola.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

added := e.AddNamedPolicy("p", "eve", "data3", "read")

AddNamedPolicies()​

AddNamedPolicies aggiunge regole di autorizzazione alla politica corrente con nome. L'operazione è di natura atomica. Quindi, se le regole di autorizzazione consistono in regole che non sono coerenti con la politica corrente, la funzione restituisce false e nessuna regola di politica viene aggiunta alla politica corrente. Se tutte le regole di autorizzazione sono coerenti con le regole di politica, la funzione restituisce true e ogni regola di politica viene aggiunta alla politica corrente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

rules := [][] string {
[]string {"jack", "data4", "read"},
[]string {"katy", "data4", "write"},
[]string {"leyo", "data4", "read"},
[]string {"ham", "data4", "write"},
}

areRulesAdded := e.AddNamedPolicies("p", rules)

AddNamedPoliciesEx()​

AddNamedPoliciesEx aggiunge regole di autorizzazione alla politica corrente con nome. Se la regola esiste già, la regola non verrà aggiunta. Ma a differenza di AddNamedPolicies, altre regole non esistenti vengono aggiunte invece di restituire false direttamente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

ok, err := e.AddNamedPoliciesEx("p", [][]string{{"user1", "data1", "read"}, {"user2", "data2", "read"}})

SelfAddPoliciesEx()​

SelfAddPoliciesEx aggiunge regole di autorizzazione alla politica corrente con nome specifico con autoNotifyWatcher disabilitato. Se la regola esiste già, la regola non verrà aggiunta. Ma a differenza di SelfAddPolicies, altre regole non esistenti vengono aggiunte invece di restituire false direttamente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

ok, err := e.SelfAddPoliciesEx("p", "p", [][]string{{"user1", "data1", "read"}, {"user2", "data2", "read"}})

RemovePolicy()​

RemovePolicy rimuove una regola di autorizzazione dalla politica corrente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

removed := e.RemovePolicy("alice", "data1", "read")

RemovePolicies()​

RemovePolicies rimuove regole di autorizzazione dalla politica corrente. L'operazione è di natura atomica. Pertanto, se le regole di autorizzazione consistono in regole che non sono coerenti con la politica corrente, la funzione restituisce false e nessuna regola di politica viene rimossa dalla politica corrente. Se tutte le regole di autorizzazione sono coerenti con le regole di politica, la funzione restituisce true e ogni regola di politica viene rimossa dalla politica corrente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

rules := [][] string {
[]string {"jack", "data4", "read"},
[]string {"katy", "data4", "write"},
[]string {"leyo", "data4", "read"},
[]string {"ham", "data4", "write"},
}

areRulesRemoved := e.RemovePolicies(rules)

RemoveFilteredPolicy()​

RemoveFilteredPolicy rimuove una regola di autorizzazione dalla politica corrente, i filtri dei campi possono essere specificati. RemovePolicy rimuove una regola di autorizzazione dalla politica corrente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

removed := e.RemoveFilteredPolicy(0, "alice", "data1", "read")

RemoveNamedPolicy()​

RemoveNamedPolicy rimuove una regola di autorizzazione dalla politica nominata corrente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

removed := e.RemoveNamedPolicy("p", "alice", "data1", "read")

RemoveNamedPolicies()​

RemoveNamedPolicies rimuove le regole di autorizzazione dalla politica corrente con nome. L'operazione è di natura atomica. Pertanto, se le regole di autorizzazione consistono in regole che non sono coerenti con la politica corrente, la funzione restituisce false e nessuna regola di politica viene rimossa dalla politica corrente. Se tutte le regole di autorizzazione sono coerenti con le regole di politica, la funzione restituisce true e ogni regola di politica viene rimossa dalla politica corrente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

rules := [][] string {
[]string {"jack", "data4", "read"},
[]string {"katy", "data4", "write"},
[]string {"leyo", "data4", "read"},
[]string {"ham", "data4", "write"},
}

areRulesRemoved := e.RemoveNamedPolicies("p", rules)

RemoveFilteredNamedPolicy()​

RemoveFilteredNamedPolicy rimuove una regola di autorizzazione dalla politica corrente con nome, i filtri dei campi possono essere specificati.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

removed := e.RemoveFilteredNamedPolicy("p", 0, "alice", "data1", "read")

HasGroupingPolicy()​

HaPoliticaDiGruppo determina se esiste una regola di ereditarietà del ruolo.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

has := e.HasGroupingPolicy("alice", "data2_admin")

HasNamedGroupingPolicy()​

HaPoliticaDiGruppoNominata determina se esiste una regola di ereditarietà del ruolo nominata.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

has := e.HasNamedGroupingPolicy("g", "alice", "data2_admin")

AddGroupingPolicy()​

AggiungiPoliticaDiGruppo aggiunge una regola di ereditarietà del ruolo alla politica corrente. Se la regola esiste già, la funzione restituisce false e la regola non verrà aggiunta. Altrimenti la funzione restituisce true aggiungendo la nuova regola.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

added := e.AddGroupingPolicy("group1", "data2_admin")

AddGroupingPolicies()​

AddGroupingPolicies aggiunge regole di ereditarietà del ruolo alla politica corrente. L'operazione è di natura atomica. Quindi, se le regole di autorizzazione consistono in regole che non sono coerenti con la politica corrente, la funzione restituisce false e nessuna regola di politica viene aggiunta alla politica corrente. Se tutte le regole di autorizzazione sono coerenti con le regole di politica, la funzione restituisce true e ogni regola di politica viene aggiunta alla politica corrente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

rules := [][] string {
[]string {"ham", "data4_admin"},
[]string {"jack", "data5_admin"},
}

areRulesAdded := e.AddGroupingPolicies(rules)

AddGroupingPoliciesEx()​

AddGroupingPoliciesEx aggiunge regole di ereditarietà del ruolo alla politica corrente. Se la regola esiste già, la regola non verrà aggiunta. Ma a differenza di AddGroupingPolicies, altre regole inesistenti vengono aggiunte invece di restituire false direttamente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

ok, err := e.AddGroupingPoliciesEx([][]string{{"user1", "member"}, {"user2", "member"}})

AddNamedGroupingPolicy()​

AddNamedGroupingPolicy aggiunge una regola di ereditarietà del ruolo nominato alla politica corrente. Se la regola esiste già, la funzione restituisce false e la regola non verrà aggiunta. Altrimenti la funzione restituisce true aggiungendo la nuova regola.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

added := e.AddNamedGroupingPolicy("g", "group1", "data2_admin")

AddNamedGroupingPolicies()​

AddNamedGroupingPolicies aggiunge regole di ereditarietà del ruolo nominato alla politica corrente. L'operazione è di natura atomica. Quindi, se le regole di autorizzazione consistono in regole che non sono coerenti con la politica corrente, la funzione restituisce false e nessuna regola di politica viene aggiunta alla politica corrente. Se tutte le regole di autorizzazione sono coerenti con le regole di politica, la funzione restituisce true e ogni regola di politica viene aggiunta alla politica corrente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

rules := [][] string {
[]string {"ham", "data4_admin"},
[]string {"jack", "data5_admin"},
}

areRulesAdded := e.AddNamedGroupingPolicies("g", rules)

AddNamedGroupingPoliciesEx()​

AddNamedGroupingPoliciesEx aggiunge regole di ereditarietà di ruolo denominate alla politica corrente. Se la regola esiste già, la regola non verrà aggiunta. Ma a differenza di AddNamedGroupingPolicies, altre regole non esistenti vengono aggiunte invece di restituire false direttamente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

ok, err := e.AddNamedGroupingPoliciesEx("g", [][]string{{"user1", "member"}, {"user2", "member"}})

RemoveGroupingPolicy()​

RemoveGroupingPolicy rimuove una regola di ereditarietà di ruolo dalla politica corrente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

removed := e.RemoveGroupingPolicy("alice", "data2_admin")

RemoveGroupingPolicies()​

RemoveGroupingPolicies rimuove le regole di ereditarietà del ruolo dalla politica corrente. L'operazione è di natura atomica. Pertanto, se le regole di autorizzazione consistono in regole che non sono coerenti con la politica corrente, la funzione restituisce false e nessuna regola di politica viene rimossa dalla politica corrente. Se tutte le regole di autorizzazione sono coerenti con le regole di politica, la funzione restituisce true e ogni regola di politica viene rimossa dalla politica corrente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

rules := [][] string {
[]string {"ham", "data4_admin"},
[]string {"jack", "data5_admin"},
}

areRulesRemoved := e.RemoveGroupingPolicies(rules)

RemoveFilteredGroupingPolicy()​

RemoveFilteredGroupingPolicy rimuove una regola di ereditarietà del ruolo dalla politica corrente, è possibile specificare filtri sui campi.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

removed := e.RemoveFilteredGroupingPolicy(0, "alice")

RemoveNamedGroupingPolicy()​

RimuoviPoliticaDiGruppoNominata rimuove una regola di ereditarietà del ruolo dalla politica nominata corrente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

removed := e.RemoveNamedGroupingPolicy("g", "alice")

RemoveNamedGroupingPolicies()​

RimuoviPoliticheDiGruppoNominate rimuove regole di ereditarietà del ruolo nominate dalla politica corrente. L'operazione è di natura atomica. Pertanto, se le regole di autorizzazione consistono in regole che non sono coerenti con la politica corrente, la funzione restituisce false e nessuna regola di politica viene rimossa dalla politica corrente. Se tutte le regole di autorizzazione sono coerenti con le regole di politica, la funzione restituisce true e ogni regola di politica viene rimossa dalla politica corrente.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

rules := [][] string {
[]string {"ham", "data4_admin"},
[]string {"jack", "data5_admin"},
}

areRulesRemoved := e.RemoveNamedGroupingPolicies("g", rules)

RemoveFilteredNamedGroupingPolicy()​

RemoveFilteredNamedGroupingPolicy rimuove una regola di ereditarietà del ruolo dalla politica nominata corrente, è possibile specificare filtri sui campi.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

removed := e.RemoveFilteredNamedGroupingPolicy("g", 0, "alice")

UpdatePolicy()​

UpdatePolicy aggiorna una vecchia politica a una nuova politica.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

updated, err := e.UpdatePolicy([]string{"eve", "data3", "read"}, []string{"eve", "data3", "write"})

UpdatePolicies()​

UpdatePolicies aggiorna tutte le vecchie politiche a nuove politiche.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

updated, err := e.UpdatePolicies([][]string{{"eve", "data3", "read"}, {"jack", "data3", "read"}}, [][]string{{"eve", "data3", "write"}, {"jack", "data3", "write"}})

UpdateNamedPolicy()​

UpdateNamedPolicy update a old policy to new policy in the named policy.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

updated, err := e.UpdateNamedPolicy("p", []string{"eve", "data3", "read"}, []string{"eve", "data3", "write"})

UpdateNamedPolicies()​

UpdateNamedPolicies updates all old policies to new policies in the named policy.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

updated, err := e.UpdateNamedPolicies("p", [][]string{{"eve", "data3", "read"}, {"jack", "data3", "read"}}, [][]string{{"eve", "data3", "write"}, {"jack", "data3", "write"}})

UpdateFilteredPolicies()​

UpdateFilteredPolicies updates all old policies that match the filter to new policies.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

updated, err := e.UpdateFilteredPolicies([][]string{{"eve", "data3", "write"}}, 0, "eve", "data3", "read")

AddFunction()​

AddFunction aggiunge una funzione personalizzata.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

func CustomFunction(key1 string, key2 string) bool {
if key1 == "/alice_data2/myid/using/res_id" && key2 == "/alice_data/:resource" {
return true
} else if key1 == "/alice_data2/myid/using/res_id" && key2 == "/alice_data2/:id/using/:resId" {
return true
} else {
return false
}
}

func CustomFunctionWrapper(args ...interface{}) (interface{}, error) {
key1 := args[0].(string)
key2 := args[1].(string)

return bool(CustomFunction(key1, key2)), nil
}

e.AddFunction("keyMatchCustom", CustomFunctionWrapper)

LoadFilteredPolicy()​

LoadFilteredPolicy carica politiche filtrate dal file/database.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

err := e.LoadFilteredPolicy()

LoadIncrementalFilteredPolicy()​

LoadIncrementalFilteredPolicy aggiunge una politica filtrata dal file/database.

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

err := e.LoadIncrementalFilteredPolicy()

UpdateGroupingPolicy()​

UpdateGroupingPolicy aggiorna oldRule a newRule nella sezione g

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

succeed, err : = e.UpdateGroupingPolicy([]string{"data3_admin", "data4_admin"}, []string{"admin", "data4_admin"})

UpdateNamedGroupingPolicy()​

AggiornaPoliticaDiGruppoNominata aggiorna la vecchia regola nominata ptype alla nuova regola nella sezione g

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

succeed, err : = e.UpdateGroupingPolicy("g1",[]string{"data3_admin", "data4_admin"}, []string{"admin", "data4_admin"})

SetFieldIndex()​

ImpostaIndiceCampo supporta la personalizzazione del nome convenzionale e della posizione di sub, obj, domain e priority.

[policy_definition]
p = customized_priority, obj, act, eft, subject

GetImplicitUsersForResource restituisce utenti impliciti basati sul risorsa.

e.SetFieldIndex("p", constant.PriorityIndex, 0)
e.SetFieldIndex("p", constant.SubjectIndex, 4)

Comments are powered by giscus and GitHub Discussions. They load from giscus.app and GitHub only after you click the button below.