package main import ( "encoding/json" "local/args" "local/oauth2" "local/storage" "net/http" "strings" ) type Config struct { EmailUser string EmailPass string EmailIMAP string TodoAddr string TodoToken string TodoList string TodoTag string Storage storage.DB } var config Config func NewConfig() Config { as := args.NewArgSet() as.Append(args.STRING, "emailuser", "email username", "breellocaldev@gmail.com") as.Append(args.STRING, "emailpass", "email password", "ML3WQRFSqe9rQ8qNkm") as.Append(args.STRING, "emailimap", "email imap", "imap.gmail.com:993") as.Append(args.STRING, "todoaddr", "todo addr", "https://todo-server.remote.blapointe.com") as.Append(args.STRING, "todopass", "todo pass", "gJtEXbbLHLf54yS9EdujtVN2n6Y") as.Append(args.STRING, "todotoken", "todo token", "") as.Append(args.STRING, "todolist", "todo list", "") as.Append(args.STRING, "todotag", "todo tag", "expense") as.Append(args.STRING, "authaddr", "auth addr", "https://auth.remote.blapointe.com") as.Append(args.STRING, "store", "store type", "map") as.Append(args.STRING, "storeaddr", "store addr", "/tmp/store") as.Append(args.STRING, "storeuser", "store user", "") as.Append(args.STRING, "storepass", "store pass", "") if err := as.Parse(); err != nil { panic(err) } token := as.GetString("todotoken") if len(token) == 0 { c := &http.Client{CheckRedirect: func(r *http.Request, via []*http.Request) error { return http.ErrUseLastResponse }} body := "username=" + as.GetString("todopass") req, err := http.NewRequest("POST", as.GetString("authaddr")+"/authorize/todo-server?"+oauth2.REDIRECT+"=127.0.0.1", strings.NewReader(body)) if err != nil { panic(err) } req.Header.Set("Content-Type", "application/x-www-form-urlencoded") resp, err := c.Do(req) if err != nil { panic(err) } defer resp.Body.Close() cookie := resp.Header.Get("Set-Cookie") token = cookie[strings.Index(cookie, "=")+1:] token = strings.Split(token, "; ")[0] } list := as.GetString("todolist") if len(list) == 0 { req, err := http.NewRequest("GET", as.GetString("todoaddr")+"/ajax.php?loadLists", nil) if err != nil { panic(err) } req.Header.Set("Cookie", oauth2.COOKIE+"="+token) resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() var r struct { List []struct { ID string `json:"id"` } `json:"list"` } if err := json.NewDecoder(resp.Body).Decode(&r); err != nil { panic(err) } if len(r.List) == 0 { panic("no lists found") } list = r.List[0].ID } storage, err := storage.New(storage.TypeFromString(as.GetString("store")), as.GetString("storeaddr"), as.GetString("storeuser"), as.GetString("storepass")) if err != nil { panic(err) } config = Config{ EmailUser: as.GetString("emailuser"), EmailPass: as.GetString("emailpass"), EmailIMAP: as.GetString("emailimap"), TodoAddr: as.GetString("todoaddr"), TodoToken: token, TodoList: list, TodoTag: as.GetString("todotag"), Storage: storage, } return config }