Compare commits

..

No commits in common. "dc418771a79dbb8653fc3251554b0d1591574d4d" and "0a97f610a47746c25cc7748ebbf29937e3bc11a2" have entirely different histories.

6 changed files with 58 additions and 73 deletions

View File

@ -49,7 +49,7 @@ func main() {
ctx = context.WithValue(ctx, "Database", database) ctx = context.WithValue(ctx, "Database", database)
pfp := path.Join(scriptDir, "pp.csv") pfp := path.Join(scriptDir, "pp.csv")
as, _ := utils.NewAdminStore(ctx, "admin_numbers") as := utils.NewAdminStore("admin_numbers.txt")
as.Seed() as.Seed()
cfg := engine.Config{ cfg := engine.Config{
@ -94,7 +94,6 @@ func main() {
lhs, err := handlers.NewLocalHandlerService(pfp, true, dbResource, cfg, rs) lhs, err := handlers.NewLocalHandlerService(pfp, true, dbResource, cfg, rs)
lhs.SetDataStore(&userdatastore) lhs.SetDataStore(&userdatastore)
lhs.SetAdminStore(as)
lhs.SetPersister(pe) lhs.SetPersister(pe)
if err != nil { if err != nil {

View File

@ -8,7 +8,6 @@ import (
"git.defalsify.org/vise.git/resource" "git.defalsify.org/vise.git/resource"
"git.grassecon.net/urdt/ussd/internal/handlers/server" "git.grassecon.net/urdt/ussd/internal/handlers/server"
"git.grassecon.net/urdt/ussd/internal/handlers/ussd" "git.grassecon.net/urdt/ussd/internal/handlers/ussd"
"git.grassecon.net/urdt/ussd/internal/utils"
) )
type HandlerService interface { type HandlerService interface {
@ -29,7 +28,6 @@ type LocalHandlerService struct {
DbRs *resource.DbResource DbRs *resource.DbResource
Pe *persist.Persister Pe *persist.Persister
UserdataStore *db.Db UserdataStore *db.Db
AdminStore *utils.AdminStore
Cfg engine.Config Cfg engine.Config
Rs resource.Resource Rs resource.Resource
} }
@ -55,12 +53,8 @@ func (ls *LocalHandlerService) SetDataStore(db *db.Db) {
ls.UserdataStore = db ls.UserdataStore = db
} }
func (ls *LocalHandlerService) SetAdminStore(adminstore *utils.AdminStore) {
ls.AdminStore = adminstore
}
func (ls *LocalHandlerService) GetHandler(accountService server.AccountServiceInterface) (*ussd.Handlers, error) { func (ls *LocalHandlerService) GetHandler(accountService server.AccountServiceInterface) (*ussd.Handlers, error) {
ussdHandlers, err := ussd.NewHandlers(ls.Parser, *ls.UserdataStore, ls.AdminStore, accountService) ussdHandlers, err := ussd.NewHandlers(ls.Parser, *ls.UserdataStore, accountService)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -109,8 +103,6 @@ func (ls *LocalHandlerService) GetHandler(accountService server.AccountServiceIn
ls.DbRs.AddLocalFunc("validate_blocked_number", ussdHandlers.ValidateBlockedNumber) ls.DbRs.AddLocalFunc("validate_blocked_number", ussdHandlers.ValidateBlockedNumber)
ls.DbRs.AddLocalFunc("retrieve_blocked_number", ussdHandlers.RetrieveBlockedNumber) ls.DbRs.AddLocalFunc("retrieve_blocked_number", ussdHandlers.RetrieveBlockedNumber)
ls.DbRs.AddLocalFunc("reset_unregistered_number", ussdHandlers.ResetUnregisteredNumber) ls.DbRs.AddLocalFunc("reset_unregistered_number", ussdHandlers.ResetUnregisteredNumber)
ls.DbRs.AddLocalFunc("reset_others_pin", ussdHandlers.ResetOthersPin)
ls.DbRs.AddLocalFunc("save_others_temporary_pin", ussdHandlers.SaveOthersTemporaryPin)
return ussdHandlers, nil return ussdHandlers, nil
} }

View File

@ -1,85 +1,80 @@
package utils package utils
import ( import (
"context" "bufio"
"encoding/json" "log"
"os" "os"
"strconv"
"strings"
"git.defalsify.org/vise.git/db" "git.grassecon.net/urdt/ussd/initializers"
fsdb "git.defalsify.org/vise.git/db/fs"
"git.defalsify.org/vise.git/logging"
) )
var (
logg = logging.NewVanilla().WithDomain("adminstore")
)
type Admin struct {
PhoneNumber string `json:"phonenumber"`
}
type Config struct {
Admins []Admin `json:"admins"`
}
type AdminStore struct { type AdminStore struct {
ctx context.Context filePath string
fsStore db.Db
} }
func NewAdminStore(ctx context.Context, fileName string) (*AdminStore, error) { // Creates a new Admin store
fsStore, err := getFsStore(ctx, fileName) func NewAdminStore(filePath string) *AdminStore {
if err != nil { return &AdminStore{filePath: filePath}
return nil, err
}
return &AdminStore{ctx: ctx, fsStore: fsStore}, nil
}
func getFsStore(ctx context.Context, connectStr string) (db.Db, error) {
fsStore := fsdb.NewFsDb()
err := fsStore.Connect(ctx, connectStr)
fsStore.SetPrefix(db.DATATYPE_USERDATA)
if err != nil {
return nil, err
}
return fsStore, nil
} }
// Seed initializes a list of phonenumbers with admin privileges // Seed initializes a list of phonenumbers with admin privileges
func (as *AdminStore) Seed() error { func (as *AdminStore) Seed() error {
var config Config var adminNumbers []int64
store := as.fsStore numbersEnv := initializers.GetEnv("ADMIN_NUMBERS", "")
defer store.Close() for _, numStr := range strings.Split(numbersEnv, ",") {
if num, err := strconv.ParseInt(strings.TrimSpace(numStr), 10, 64); err == nil {
data, err := os.ReadFile("admin_numbers.json") adminNumbers = append(adminNumbers, num)
} else {
log.Printf("Skipping invalid number: %s", numStr)
}
}
file, err := os.Create(as.filePath)
if err != nil { if err != nil {
return err return err
} }
if err := json.Unmarshal(data, &config); err != nil { defer file.Close()
return err
} writer := bufio.NewWriter(file)
for _, admin := range config.Admins { for _, num := range adminNumbers {
err := store.Put(as.ctx, []byte(admin.PhoneNumber), []byte("1")) _, err := writer.WriteString(strconv.FormatInt(num, 10) + "\n")
if err != nil { if err != nil {
logg.Printf(logging.LVL_DEBUG, "Failed to insert admin number", admin.PhoneNumber)
return err return err
} }
} }
return nil return writer.Flush()
} }
// Checks if the given sessionId is listed as an admin. func (as *AdminStore) load() ([]int64, error) {
func (as *AdminStore) IsAdmin(sessionId string) (bool, error) { file, err := os.Open(as.filePath)
_, err := as.fsStore.Get(as.ctx, []byte(sessionId))
if err != nil { if err != nil {
if db.IsNotFound(err) { return nil, err
logg.Printf(logging.LVL_INFO, "Returning false because session id was not found") }
return false, nil defer file.Close()
} else {
return false, err var numbers []int64
scanner := bufio.NewScanner(file)
for scanner.Scan() {
num, err := strconv.ParseInt(scanner.Text(), 10, 64)
if err != nil {
return nil, err
}
numbers = append(numbers, num)
}
return numbers, scanner.Err()
}
func (as *AdminStore) IsAdmin(phoneNumber int64) (bool, error) {
phoneNumbers, err := as.load()
if err != nil {
return false, err
}
for _, phonenumber := range phoneNumbers {
if phonenumber == phoneNumber {
return true, nil
} }
} }
return false, nil
return true, nil
} }

View File

@ -1,9 +1,9 @@
LOAD retrieve_blocked_number 0 LOAD retrieve_blocked_number 0
MAP retrieve_blocked_number MAP retrieve_blocked_number
CATCH invalid_others_pin flag_valid_pin 0 CATCH invalid_others_pin flag_valid_pin 0
LOAD save_temporary_pin 6
RELOAD save_temporary_pin
CATCH pin_reset_result flag_account_authorized 1 CATCH pin_reset_result flag_account_authorized 1
LOAD save_others_temporary_pin 6
RELOAD save_others_temporary_pin
MOUT back 0 MOUT back 0
HALT HALT
INCMP _ 0 INCMP _ 0

View File

@ -2,7 +2,7 @@ LOAD retrieve_blocked_number 0
MAP retrieve_blocked_number MAP retrieve_blocked_number
MOUT back 0 MOUT back 0
HALT HALT
LOAD verify_new_pin 6
RELOAD verify_new_pin
INCMP _ 0 INCMP _ 0
LOAD verify_new_pin 0
RELOAD verify_new_pin
INCMP * confirm_others_new_pin INCMP * confirm_others_new_pin

View File

@ -1,6 +1,5 @@
LOAD retrieve_blocked_number 0 LOAD retrieve_blocked_number 0
MAP retrieve_blocked_number MAP retrieve_blocked_number
LOAD reset_others_pin 6
MOUT back 0 MOUT back 0
MOUT quit 9 MOUT quit 9
HALT HALT