Compare commits
4 Commits
0a97f610a4
...
dc418771a7
| Author | SHA1 | Date | |
|---|---|---|---|
| dc418771a7 | |||
| c2068db050 | |||
| c42b1cd66b | |||
| b404ae95fb |
@ -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("admin_numbers.txt")
|
as, _ := utils.NewAdminStore(ctx, "admin_numbers")
|
||||||
as.Seed()
|
as.Seed()
|
||||||
|
|
||||||
cfg := engine.Config{
|
cfg := engine.Config{
|
||||||
@ -94,6 +94,7 @@ 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 {
|
||||||
|
|||||||
@ -8,6 +8,7 @@ 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 {
|
||||||
@ -28,6 +29,7 @@ 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
|
||||||
}
|
}
|
||||||
@ -53,8 +55,12 @@ 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, accountService)
|
ussdHandlers, err := ussd.NewHandlers(ls.Parser, *ls.UserdataStore, ls.AdminStore, accountService)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -103,6 +109,8 @@ 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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,80 +1,85 @@
|
|||||||
package utils
|
package utils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"context"
|
||||||
"log"
|
"encoding/json"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"git.grassecon.net/urdt/ussd/initializers"
|
"git.defalsify.org/vise.git/db"
|
||||||
|
fsdb "git.defalsify.org/vise.git/db/fs"
|
||||||
|
"git.defalsify.org/vise.git/logging"
|
||||||
)
|
)
|
||||||
|
|
||||||
type AdminStore struct {
|
var (
|
||||||
filePath string
|
logg = logging.NewVanilla().WithDomain("adminstore")
|
||||||
|
)
|
||||||
|
|
||||||
|
type Admin struct {
|
||||||
|
PhoneNumber string `json:"phonenumber"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates a new Admin store
|
type Config struct {
|
||||||
func NewAdminStore(filePath string) *AdminStore {
|
Admins []Admin `json:"admins"`
|
||||||
return &AdminStore{filePath: filePath}
|
}
|
||||||
|
|
||||||
|
type AdminStore struct {
|
||||||
|
ctx context.Context
|
||||||
|
fsStore db.Db
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewAdminStore(ctx context.Context, fileName string) (*AdminStore, error) {
|
||||||
|
fsStore, err := getFsStore(ctx, fileName)
|
||||||
|
if err != nil {
|
||||||
|
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 adminNumbers []int64
|
var config Config
|
||||||
|
|
||||||
numbersEnv := initializers.GetEnv("ADMIN_NUMBERS", "")
|
store := as.fsStore
|
||||||
for _, numStr := range strings.Split(numbersEnv, ",") {
|
defer store.Close()
|
||||||
if num, err := strconv.ParseInt(strings.TrimSpace(numStr), 10, 64); err == nil {
|
|
||||||
adminNumbers = append(adminNumbers, num)
|
data, err := os.ReadFile("admin_numbers.json")
|
||||||
} else {
|
|
||||||
log.Printf("Skipping invalid number: %s", numStr)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
file, err := os.Create(as.filePath)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer file.Close()
|
if err := json.Unmarshal(data, &config); err != nil {
|
||||||
|
return err
|
||||||
writer := bufio.NewWriter(file)
|
}
|
||||||
for _, num := range adminNumbers {
|
for _, admin := range config.Admins {
|
||||||
_, err := writer.WriteString(strconv.FormatInt(num, 10) + "\n")
|
err := store.Put(as.ctx, []byte(admin.PhoneNumber), []byte("1"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
logg.Printf(logging.LVL_DEBUG, "Failed to insert admin number", admin.PhoneNumber)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return writer.Flush()
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (as *AdminStore) load() ([]int64, error) {
|
// Checks if the given sessionId is listed as an admin.
|
||||||
file, err := os.Open(as.filePath)
|
func (as *AdminStore) IsAdmin(sessionId string) (bool, error) {
|
||||||
|
_, err := as.fsStore.Get(as.ctx, []byte(sessionId))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
if db.IsNotFound(err) {
|
||||||
}
|
logg.Printf(logging.LVL_INFO, "Returning false because session id was not found")
|
||||||
defer file.Close()
|
return false, nil
|
||||||
|
} else {
|
||||||
var numbers []int64
|
return false, err
|
||||||
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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
INCMP _ 0
|
LOAD verify_new_pin 6
|
||||||
LOAD verify_new_pin 0
|
|
||||||
RELOAD verify_new_pin
|
RELOAD verify_new_pin
|
||||||
|
INCMP _ 0
|
||||||
INCMP * confirm_others_new_pin
|
INCMP * confirm_others_new_pin
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user