gosuki/mozilla/profiles.go

149 lines
3.0 KiB
Go

// TODO: generalize this package to handle any mozilla based browser
package mozilla
import (
"errors"
"fmt"
"path/filepath"
"regexp"
"git.sp4ke.xyz/sp4ke/gomark/logging"
"git.sp4ke.xyz/sp4ke/gomark/profiles"
"github.com/go-ini/ini"
)
type ProfileManager = profiles.ProfileManager
type INIProfileLoader = profiles.INIProfileLoader
type PathGetter = profiles.PathGetter
const (
ProfilesFile = "profiles.ini"
)
var (
log = logging.GetLogger("mozilla")
ReIniProfiles = regexp.MustCompile(`(?i)profile`)
ErrProfilesIni = errors.New("could not parse profiles.ini file")
ErrNoDefaultProfile = errors.New("no default profile found")
// Common default profiles for mozilla/firefox based browsers
DefaultProfileNames = map[string]string{
"firefox-esr": "default-esr",
}
)
type MozProfileManager struct {
BrowserName string
ConfigDir string
ProfilesFile *ini.File
PathGetter PathGetter
ProfileManager
}
func (pm *MozProfileManager) loadProfile() error {
log.Debugf("loading profile from <%s>", pm.PathGetter.Get())
pFile, err := ini.Load(pm.PathGetter.Get())
if err != nil {
return err
}
pm.ProfilesFile = pFile
return nil
}
func (pm *MozProfileManager) GetProfiles() ([]*profiles.Profile, error) {
err := pm.loadProfile()
if err != nil {
return nil, err
}
sections := pm.ProfilesFile.Sections()
var filtered []*ini.Section
var result []*profiles.Profile
for _, section := range sections {
if ReIniProfiles.MatchString(section.Name()) {
filtered = append(filtered, section)
p := &profiles.Profile{
Id: section.Name(),
}
err := section.MapTo(p)
if err != nil {
return nil, err
}
result = append(result, p)
}
}
return result, nil
}
func (pm *MozProfileManager) GetProfilePath(name string) (string, error) {
log.Debugf("using config dir %s", pm.ConfigDir)
p, err := pm.GetProfileByName(name)
if err != nil {
return "", err
}
return filepath.Join(pm.ConfigDir, p.Path), nil
}
func (pm *MozProfileManager) GetProfileByName(name string) (*profiles.Profile, error) {
profs, err := pm.GetProfiles()
if err != nil {
return nil, err
}
for _, p := range profs {
if p.Name == name {
return p, nil
}
}
return nil, fmt.Errorf("profile %s not found", name)
}
// TEST:
func (pm *MozProfileManager) GetDefaultProfile() (*profiles.Profile, error) {
profs, err := pm.GetProfiles()
if err != nil {
return nil, err
}
defaultProfileName, ok := DefaultProfileNames[pm.BrowserName]
if !ok {
defaultProfileName = "default"
}
log.Debugf("looking for profile %s", defaultProfileName)
for _, p := range profs {
if p.Name == defaultProfileName {
return p, nil
}
}
return nil, ErrNoDefaultProfile
}
func (pm *MozProfileManager) ListProfiles() ([]string, error) {
pm.loadProfile()
sections := pm.ProfilesFile.SectionStrings()
var result []string
for _, s := range sections {
if ReIniProfiles.MatchString(s) {
result = append(result, s)
}
}
if len(result) == 0 {
return nil, ErrProfilesIni
}
return result, nil
}