Merge pull request 'alias-fqdn' (#9) from alias-fqdn into master
Reviewed-on: #9
This commit is contained in:
commit
d2f75c693a
@ -18,3 +18,6 @@ DATA_URL_BASE=http://localhost:5006
|
|||||||
#Language
|
#Language
|
||||||
DEFAULT_LANGUAGE=eng
|
DEFAULT_LANGUAGE=eng
|
||||||
LANGUAGES=eng, swa
|
LANGUAGES=eng, swa
|
||||||
|
|
||||||
|
#Alias search domains
|
||||||
|
ALIAS_SEARCH_DOMAINS=sarafu.local, sarafu.eth
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package config
|
package config
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
apiconfig "git.grassecon.net/grassrootseconomics/sarafu-api/config"
|
apiconfig "git.grassecon.net/grassrootseconomics/sarafu-api/config"
|
||||||
viseconfig "git.grassecon.net/grassrootseconomics/visedriver/config"
|
viseconfig "git.grassecon.net/grassrootseconomics/visedriver/config"
|
||||||
"git.grassecon.net/grassrootseconomics/visedriver/env"
|
"git.grassecon.net/grassrootseconomics/visedriver/env"
|
||||||
@ -24,6 +26,7 @@ const (
|
|||||||
defaultSSHPort uint = 7122
|
defaultSSHPort uint = 7122
|
||||||
defaultHTTPHost string = "127.0.0.1"
|
defaultHTTPHost string = "127.0.0.1"
|
||||||
defaultHTTPPort uint = 7123
|
defaultHTTPPort uint = 7123
|
||||||
|
defaultDomain = "sarafu.local"
|
||||||
)
|
)
|
||||||
|
|
||||||
func LoadConfig() error {
|
func LoadConfig() error {
|
||||||
@ -39,6 +42,17 @@ func LoadConfig() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SearchDomains() []string {
|
||||||
|
var ParsedDomains []string
|
||||||
|
SearchDomains := env.GetEnv("ALIAS_SEARCH_DOMAINS", defaultDomain)
|
||||||
|
SearchDomainList := strings.Split(env.GetEnv("ALIAS_SEARCH_DOMAINS", SearchDomains), ",")
|
||||||
|
for _, domain := range SearchDomainList {
|
||||||
|
ParsedDomains = append(ParsedDomains, strings.ReplaceAll(domain, " ", ""))
|
||||||
|
}
|
||||||
|
return ParsedDomains
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
func Language() string {
|
func Language() string {
|
||||||
return viseconfig.DefaultLanguage
|
return viseconfig.DefaultLanguage
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,9 @@ import (
|
|||||||
"git.grassecon.net/grassrootseconomics/common/person"
|
"git.grassecon.net/grassrootseconomics/common/person"
|
||||||
"git.grassecon.net/grassrootseconomics/common/phone"
|
"git.grassecon.net/grassrootseconomics/common/phone"
|
||||||
"git.grassecon.net/grassrootseconomics/common/pin"
|
"git.grassecon.net/grassrootseconomics/common/pin"
|
||||||
|
"git.grassecon.net/grassrootseconomics/sarafu-api/models"
|
||||||
"git.grassecon.net/grassrootseconomics/sarafu-api/remote"
|
"git.grassecon.net/grassrootseconomics/sarafu-api/remote"
|
||||||
|
"git.grassecon.net/grassrootseconomics/sarafu-vise/config"
|
||||||
"git.grassecon.net/grassrootseconomics/sarafu-vise/profile"
|
"git.grassecon.net/grassrootseconomics/sarafu-vise/profile"
|
||||||
"git.grassecon.net/grassrootseconomics/sarafu-vise/store"
|
"git.grassecon.net/grassrootseconomics/sarafu-vise/store"
|
||||||
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
|
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
|
||||||
@ -662,6 +664,10 @@ func (h *MenuHandlers) SaveFirstname(ctx context.Context, sym string, input []by
|
|||||||
logg.ErrorCtxf(ctx, "failed to write firstName entry with", "key", storedb.DATA_FIRST_NAME, "value", temporaryFirstName, "error", err)
|
logg.ErrorCtxf(ctx, "failed to write firstName entry with", "key", storedb.DATA_FIRST_NAME, "value", temporaryFirstName, "error", err)
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
err := h.constructAccountAlias(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
res.FlagSet = append(res.FlagSet, flag_firstname_set)
|
res.FlagSet = append(res.FlagSet, flag_firstname_set)
|
||||||
} else {
|
} else {
|
||||||
if firstNameSet {
|
if firstNameSet {
|
||||||
@ -1076,6 +1082,11 @@ func (h *MenuHandlers) GetProfileInfo(ctx context.Context, sym string, input []b
|
|||||||
gender := getEntryOrDefault(store.ReadEntry(ctx, sessionId, storedb.DATA_GENDER))
|
gender := getEntryOrDefault(store.ReadEntry(ctx, sessionId, storedb.DATA_GENDER))
|
||||||
location := getEntryOrDefault(store.ReadEntry(ctx, sessionId, storedb.DATA_LOCATION))
|
location := getEntryOrDefault(store.ReadEntry(ctx, sessionId, storedb.DATA_LOCATION))
|
||||||
offerings := getEntryOrDefault(store.ReadEntry(ctx, sessionId, storedb.DATA_OFFERINGS))
|
offerings := getEntryOrDefault(store.ReadEntry(ctx, sessionId, storedb.DATA_OFFERINGS))
|
||||||
|
alias := getEntryOrDefault(store.ReadEntry(ctx, sessionId, storedb.DATA_ACCOUNT_ALIAS))
|
||||||
|
|
||||||
|
if alias != defaultValue {
|
||||||
|
alias = strings.Split(alias, ".")[0]
|
||||||
|
}
|
||||||
|
|
||||||
// Construct the full name
|
// Construct the full name
|
||||||
name := person.ConstructName(firstName, familyName, defaultValue)
|
name := person.ConstructName(firstName, familyName, defaultValue)
|
||||||
@ -1092,18 +1103,18 @@ func (h *MenuHandlers) GetProfileInfo(ctx context.Context, sym string, input []b
|
|||||||
switch language.Code {
|
switch language.Code {
|
||||||
case "eng":
|
case "eng":
|
||||||
res.Content = fmt.Sprintf(
|
res.Content = fmt.Sprintf(
|
||||||
"Name: %s\nGender: %s\nAge: %s\nLocation: %s\nYou provide: %s\n",
|
"Name: %s\nGender: %s\nAge: %s\nLocation: %s\nYou provide: %s\nYour alias: %s\n",
|
||||||
name, gender, age, location, offerings,
|
name, gender, age, location, offerings, alias,
|
||||||
)
|
)
|
||||||
case "swa":
|
case "swa":
|
||||||
res.Content = fmt.Sprintf(
|
res.Content = fmt.Sprintf(
|
||||||
"Jina: %s\nJinsia: %s\nUmri: %s\nEneo: %s\nUnauza: %s\n",
|
"Jina: %s\nJinsia: %s\nUmri: %s\nEneo: %s\nUnauza: %s\nLakabu yako: %s\n",
|
||||||
name, gender, age, location, offerings,
|
name, gender, age, location, offerings, alias,
|
||||||
)
|
)
|
||||||
default:
|
default:
|
||||||
res.Content = fmt.Sprintf(
|
res.Content = fmt.Sprintf(
|
||||||
"Name: %s\nGender: %s\nAge: %s\nLocation: %s\nYou provide: %s\n",
|
"Name: %s\nGender: %s\nAge: %s\nLocation: %s\nYou provide: %s\nYour alias: %s\n",
|
||||||
name, gender, age, location, offerings,
|
name, gender, age, location, offerings, alias,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1159,6 +1170,10 @@ func (h *MenuHandlers) UpdateAllProfileItems(ctx context.Context, sym string, in
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
err = h.constructAccountAlias(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
return res, nil
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1399,16 +1414,16 @@ func (h *MenuHandlers) FetchCommunityBalance(ctx context.Context, sym string, in
|
|||||||
// TODO: split up functino
|
// TODO: split up functino
|
||||||
func (h *MenuHandlers) ValidateRecipient(ctx context.Context, sym string, input []byte) (resource.Result, error) {
|
func (h *MenuHandlers) ValidateRecipient(ctx context.Context, sym string, input []byte) (resource.Result, error) {
|
||||||
var res resource.Result
|
var res resource.Result
|
||||||
|
var AliasAddressResult string
|
||||||
|
var AliasAddress *models.AliasAddress
|
||||||
store := h.userdataStore
|
store := h.userdataStore
|
||||||
|
|
||||||
sessionId, ok := ctx.Value("SessionId").(string)
|
sessionId, ok := ctx.Value("SessionId").(string)
|
||||||
if !ok {
|
if !ok {
|
||||||
return res, fmt.Errorf("missing session")
|
return res, fmt.Errorf("missing session")
|
||||||
}
|
}
|
||||||
|
|
||||||
flag_invalid_recipient, _ := h.flagManager.GetFlag("flag_invalid_recipient")
|
flag_invalid_recipient, _ := h.flagManager.GetFlag("flag_invalid_recipient")
|
||||||
flag_invalid_recipient_with_invite, _ := h.flagManager.GetFlag("flag_invalid_recipient_with_invite")
|
flag_invalid_recipient_with_invite, _ := h.flagManager.GetFlag("flag_invalid_recipient_with_invite")
|
||||||
flag_api_error, _ := h.flagManager.GetFlag("flag_api_call_error")
|
|
||||||
|
|
||||||
recipient := string(input)
|
recipient := string(input)
|
||||||
|
|
||||||
@ -1468,21 +1483,32 @@ func (h *MenuHandlers) ValidateRecipient(ctx context.Context, sym string, input
|
|||||||
}
|
}
|
||||||
|
|
||||||
case "alias":
|
case "alias":
|
||||||
// Call the API to validate and retrieve the address for the alias
|
if strings.Contains(recipient, ".") {
|
||||||
r, aliasErr := h.accountService.CheckAliasAddress(ctx, recipient)
|
AliasAddress, err = h.accountService.CheckAliasAddress(ctx, recipient)
|
||||||
if aliasErr != nil {
|
if err == nil {
|
||||||
res.FlagSet = append(res.FlagSet, flag_api_error)
|
AliasAddressResult = AliasAddress.Address
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//Perform a search for each search domain,break on first match
|
||||||
|
for _, domain := range config.SearchDomains() {
|
||||||
|
fqdn := fmt.Sprintf("%s.%s", recipient, domain)
|
||||||
|
AliasAddress, err = h.accountService.CheckAliasAddress(ctx, fqdn)
|
||||||
|
if err == nil {
|
||||||
|
AliasAddressResult = AliasAddress.Address
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if AliasAddressResult == "" {
|
||||||
res.Content = recipient
|
res.Content = recipient
|
||||||
|
res.FlagSet = append(res.FlagSet, flag_invalid_recipient)
|
||||||
logg.ErrorCtxf(ctx, "failed on CheckAliasAddress", "error", aliasErr)
|
return res, nil
|
||||||
|
} else {
|
||||||
|
err = store.WriteEntry(ctx, sessionId, storedb.DATA_RECIPIENT, []byte(AliasAddressResult))
|
||||||
|
if err != nil {
|
||||||
|
logg.ErrorCtxf(ctx, "failed to write recipient entry with", "key", storedb.DATA_RECIPIENT, "value", AliasAddressResult, "error", err)
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Alias validation succeeded, save the Ethereum address
|
|
||||||
err = store.WriteEntry(ctx, sessionId, storedb.DATA_RECIPIENT, []byte(r.Address))
|
|
||||||
if err != nil {
|
|
||||||
logg.ErrorCtxf(ctx, "failed to write recipient entry with", "key", storedb.DATA_RECIPIENT, "value", r.Address, "error", err)
|
|
||||||
return res, err
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2015,7 +2041,6 @@ func (h *MenuHandlers) GetVoucherDetails(ctx context.Context, sym string, input
|
|||||||
if !ok {
|
if !ok {
|
||||||
return res, fmt.Errorf("missing session")
|
return res, fmt.Errorf("missing session")
|
||||||
}
|
}
|
||||||
|
|
||||||
flag_api_error, _ := h.flagManager.GetFlag("flag_api_call_error")
|
flag_api_error, _ := h.flagManager.GetFlag("flag_api_call_error")
|
||||||
|
|
||||||
// get the active address
|
// get the active address
|
||||||
@ -2242,3 +2267,46 @@ func (h *MenuHandlers) persistLanguageCode(ctx context.Context, code string) err
|
|||||||
}
|
}
|
||||||
return h.persistInitialLanguageCode(ctx, sessionId, code)
|
return h.persistInitialLanguageCode(ctx, sessionId, code)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *MenuHandlers) constructAccountAlias(ctx context.Context) error {
|
||||||
|
var alias string
|
||||||
|
store := h.userdataStore
|
||||||
|
sessionId, ok := ctx.Value("SessionId").(string)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("missing session")
|
||||||
|
}
|
||||||
|
firstName, err := store.ReadEntry(ctx, sessionId, storedb.DATA_FIRST_NAME)
|
||||||
|
if err != nil {
|
||||||
|
if db.IsNotFound(err) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
familyName, err := store.ReadEntry(ctx, sessionId, storedb.DATA_FAMILY_NAME)
|
||||||
|
if err != nil {
|
||||||
|
if db.IsNotFound(err) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
pubKey, err := store.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY)
|
||||||
|
if err != nil {
|
||||||
|
if db.IsNotFound(err) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
aliasInput := fmt.Sprintf("%s%s", firstName, familyName)
|
||||||
|
aliasResult, err := h.accountService.RequestAlias(ctx, string(pubKey), aliasInput)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("Failed to retrieve alias: %s", err.Error())
|
||||||
|
}
|
||||||
|
alias = aliasResult.Alias
|
||||||
|
//Store the alias
|
||||||
|
err = store.WriteEntry(ctx, sessionId, storedb.DATA_ACCOUNT_ALIAS, []byte(alias))
|
||||||
|
if err != nil {
|
||||||
|
logg.ErrorCtxf(ctx, "failed to write account alias", "key", storedb.DATA_ACCOUNT_ALIAS, "value", alias, "error", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
@ -1679,7 +1679,7 @@ func TestValidateRecipient(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Test with alias recepient",
|
name: "Test with alias recepient",
|
||||||
input: []byte("alias123"),
|
input: []byte("alias123.sarafu.local"),
|
||||||
expectedResult: resource.Result{},
|
expectedResult: resource.Result{},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -1797,37 +1797,37 @@ func TestGetProfile(t *testing.T) {
|
|||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "Test with full profile information in eng",
|
name: "Test with full profile information in eng",
|
||||||
keys: []storedb.DataTyp{storedb.DATA_FAMILY_NAME, storedb.DATA_FIRST_NAME, storedb.DATA_GENDER, storedb.DATA_OFFERINGS, storedb.DATA_LOCATION, storedb.DATA_YOB},
|
keys: []storedb.DataTyp{storedb.DATA_FAMILY_NAME, storedb.DATA_FIRST_NAME, storedb.DATA_GENDER, storedb.DATA_OFFERINGS, storedb.DATA_LOCATION, storedb.DATA_YOB, storedb.DATA_ACCOUNT_ALIAS},
|
||||||
profileInfo: []string{"Doee", "John", "Male", "Bananas", "Kilifi", "1976"},
|
profileInfo: []string{"Doee", "John", "Male", "Bananas", "Kilifi", "1976", "DoeJohn"},
|
||||||
languageCode: "eng",
|
languageCode: "eng",
|
||||||
result: resource.Result{
|
result: resource.Result{
|
||||||
Content: fmt.Sprintf(
|
Content: fmt.Sprintf(
|
||||||
"Name: %s\nGender: %s\nAge: %s\nLocation: %s\nYou provide: %s\n",
|
"Name: %s\nGender: %s\nAge: %s\nLocation: %s\nYou provide: %s\nYour alias: %s\n",
|
||||||
"John Doee", "Male", "49", "Kilifi", "Bananas",
|
"John Doee", "Male", "49", "Kilifi", "Bananas", "DoeJohn",
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Test with with profile information in swa",
|
name: "Test with with profile information in swa",
|
||||||
keys: []storedb.DataTyp{storedb.DATA_FAMILY_NAME, storedb.DATA_FIRST_NAME, storedb.DATA_GENDER, storedb.DATA_OFFERINGS, storedb.DATA_LOCATION, storedb.DATA_YOB},
|
keys: []storedb.DataTyp{storedb.DATA_FAMILY_NAME, storedb.DATA_FIRST_NAME, storedb.DATA_GENDER, storedb.DATA_OFFERINGS, storedb.DATA_LOCATION, storedb.DATA_YOB, storedb.DATA_ACCOUNT_ALIAS},
|
||||||
profileInfo: []string{"Doee", "John", "Male", "Bananas", "Kilifi", "1976"},
|
profileInfo: []string{"Doee", "John", "Male", "Bananas", "Kilifi", "1976", "DoeJohn"},
|
||||||
languageCode: "swa",
|
languageCode: "swa",
|
||||||
result: resource.Result{
|
result: resource.Result{
|
||||||
Content: fmt.Sprintf(
|
Content: fmt.Sprintf(
|
||||||
"Jina: %s\nJinsia: %s\nUmri: %s\nEneo: %s\nUnauza: %s\n",
|
"Jina: %s\nJinsia: %s\nUmri: %s\nEneo: %s\nUnauza: %s\nLakabu yako: %s\n",
|
||||||
"John Doee", "Male", "49", "Kilifi", "Bananas",
|
"John Doee", "Male", "49", "Kilifi", "Bananas", "DoeJohn",
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Test with with profile information with language that is not yet supported",
|
name: "Test with with profile information with language that is not yet supported",
|
||||||
keys: []storedb.DataTyp{storedb.DATA_FAMILY_NAME, storedb.DATA_FIRST_NAME, storedb.DATA_GENDER, storedb.DATA_OFFERINGS, storedb.DATA_LOCATION, storedb.DATA_YOB},
|
keys: []storedb.DataTyp{storedb.DATA_FAMILY_NAME, storedb.DATA_FIRST_NAME, storedb.DATA_GENDER, storedb.DATA_OFFERINGS, storedb.DATA_LOCATION, storedb.DATA_YOB, storedb.DATA_ACCOUNT_ALIAS},
|
||||||
profileInfo: []string{"Doee", "John", "Male", "Bananas", "Kilifi", "1976"},
|
profileInfo: []string{"Doee", "John", "Male", "Bananas", "Kilifi", "1976", "DoeJohn"},
|
||||||
languageCode: "nor",
|
languageCode: "nor",
|
||||||
result: resource.Result{
|
result: resource.Result{
|
||||||
Content: fmt.Sprintf(
|
Content: fmt.Sprintf(
|
||||||
"Name: %s\nGender: %s\nAge: %s\nLocation: %s\nYou provide: %s\n",
|
"Name: %s\nGender: %s\nAge: %s\nLocation: %s\nYou provide: %s\nYour alias: %s\n",
|
||||||
"John Doee", "Male", "49", "Kilifi", "Bananas",
|
"John Doee", "Male", "49", "Kilifi", "Bananas", "DoeJohn",
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -427,7 +427,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"input": "1234",
|
"input": "1234",
|
||||||
"expectedContent": "My profile:\nName: foo bar\nGender: male\nAge: 80\nLocation: Kilifi\nYou provide: Bananas\n\n0:Back\n9:Quit"
|
"expectedContent": "My profile:\nName: foo bar\nGender: male\nAge: 80\nLocation: Kilifi\nYou provide: Bananas\nYour alias: \n\n0:Back\n9:Quit"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"input": "0",
|
"input": "0",
|
||||||
|
@ -12,5 +12,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func New(ctx context.Context, storageService storage.StorageService) remote.AccountService {
|
func New(ctx context.Context, storageService storage.StorageService) remote.AccountService {
|
||||||
return &httpremote.HTTPAccountService{}
|
return &httpremote.HTTPAccountService{
|
||||||
|
SS: storageService,
|
||||||
|
UseApi: false,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,6 +61,8 @@ const (
|
|||||||
DATA_SELECTED_LANGUAGE_CODE
|
DATA_SELECTED_LANGUAGE_CODE
|
||||||
//ISO 639 code for the language initially selected.
|
//ISO 639 code for the language initially selected.
|
||||||
DATA_INITIAL_LANGUAGE_CODE
|
DATA_INITIAL_LANGUAGE_CODE
|
||||||
|
//Fully qualified account alias string
|
||||||
|
DATA_ACCOUNT_ALIAS
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
Loading…
Reference in New Issue
Block a user