diff --git a/auth/auth.go b/auth/auth.go index 38f0ddf..e524f6a 100644 --- a/auth/auth.go +++ b/auth/auth.go @@ -2,41 +2,30 @@ package auth import ( "fmt" - "strings" - "astraltech.xyz/calendar/v2/caldav" - ics "github.com/arran4/golang-ical" + "astraltech.xyz/calendar/v2/webserver" ) -func HandleAuthRequest(username string, password string) bool { - calDavData := caldav.GetCalDAVData(username, password) +func HandlePasswordAuth(authData webserver.PasswordAuthData) bool { + fmt.Printf("%s, %s\n", authData.Username, authData.Password) + return false +} - fmt.Printf("Users display name: %s\n", calDavData.DisplayName) - fmt.Printf("Calandar Count: %d\n", len(calDavData.Calandars)) - for i := range len(calDavData.Calandars) { - calDavData.Calandars[i] = caldav.GetCalendarData(calDavData.Calandars[i], username, password) +func HandleOAuth(authData webserver.OAuthAuthData) bool { + fmt.Printf("doing an OAuth") + return false +} - fmt.Printf("Cal %d is named %s\n", i, calDavData.Calandars[i].DisplayName) - fmt.Printf("\tLink to cal: %s\n", calDavData.Calandars[i].Link) - fmt.Printf("\tEvent count: %d\n", len(calDavData.Calandars[i].Events)) - for j := range len(calDavData.Calandars[i].Events) { - cal, err := ics.ParseCalendar(strings.NewReader(calDavData.Calandars[i].Events[j].CalData)) - if err != nil { - fmt.Print(err.Error()) - } - events := cal.Events() - for k := range len(events) { - name := events[k].GetProperty(ics.ComponentProperty(ics.PropertySummary)).Value - start, _ := events[k].GetStartAt() - end, _ := events[k].GetEndAt() - time := end.Sub(start) - fmt.Printf("\t\tEvent name: %s\n", name) - fmt.Printf("\t\t\tEvent start date: %s\n", end.UTC().String()) - fmt.Printf("\t\t\tEvent length date: %s\n", time.String()) - - } - } +func HandleAuthRequest(authType webserver.AuthStyle, authData webserver.AuthData) bool { + if authType == webserver.AuthStylePassword { + passwordAuthData, _ := authData.(webserver.PasswordAuthData) + return HandlePasswordAuth(passwordAuthData) } - return true + if authType == webserver.AuthStyleOAuth { + passwordAuthData, _ := authData.(webserver.OAuthAuthData) + return HandleOAuth(passwordAuthData) + } + + return false } diff --git a/auth/token.go b/auth/token.go index 8832b06..dd1b217 100644 --- a/auth/token.go +++ b/auth/token.go @@ -1 +1,32 @@ package auth + +import ( + "encoding/json" + "os" + + "golang.org/x/oauth2" +) + +type TokenStore struct { + filePath string +} + +func (ts *TokenStore) Save(token *oauth2.Token) error { + data, err := json.Marshal(token) + if err != nil { + return err + } + return os.WriteFile(ts.filePath, data, 0600) +} + +func (ts *TokenStore) Load() (*oauth2.Token, error) { + data, err := os.ReadFile(ts.filePath) + if err != nil { + return nil, err + } + var token oauth2.Token + if err := json.Unmarshal(data, &token); err != nil { + return nil, err + } + return &token, nil +} diff --git a/main/main.go b/main/main.go index afcd6f0..5162cd3 100644 --- a/main/main.go +++ b/main/main.go @@ -14,6 +14,7 @@ func main() { ServiceName: "Astral Calendar", AuthRequestFunction: auth.HandleAuthRequest, }) + webserver.ServeWebpage("/callback", auth.OAuthCallback) webserver.EnableLogoRoute() webserver.EnableStaticRoute() webserver.ServeWebserver() diff --git a/webserver/login_page.go b/webserver/login_page.go index 94d0d6c..6f9bc4c 100644 --- a/webserver/login_page.go +++ b/webserver/login_page.go @@ -10,10 +10,28 @@ type LoginPageData struct { IsHiddenClassList string LoginData CustomizableLoginData } +type AuthStyle int + +const ( + AuthStylePassword AuthStyle = 0 + AuthStyleOAuth AuthStyle = 1 +) + +type AuthData interface{} + +type PasswordAuthData struct { + Username string + Password string +} + +type OAuthAuthData struct { + Username string + Password string +} type CustomizableLoginData struct { ServiceName string - AuthRequestFunction func(string, string) bool + AuthRequestFunction func(AuthStyle, AuthData) bool } var LoginPageDataCustomizations CustomizableLoginData @@ -27,15 +45,27 @@ func loginHandler(w http.ResponseWriter, r *http.Request) { } if r.Method == http.MethodPost { - username := r.FormValue("username") - if strings.Contains(username, "/") { - tmpl.Execute(w, LoginPageData{IsHiddenClassList: "", LoginData: LoginPageDataCustomizations}) - } - password := r.FormValue("password") + action := r.FormValue("action") - auth_success := LoginPageDataCustomizations.AuthRequestFunction(username, password) - if auth_success == false { - tmpl.Execute(w, LoginPageData{IsHiddenClassList: "", LoginData: LoginPageDataCustomizations}) + if action == "password" { + username := r.FormValue("username") + if strings.Contains(username, "/") { + tmpl.Execute(w, LoginPageData{IsHiddenClassList: "", LoginData: LoginPageDataCustomizations}) + } + password := r.FormValue("password") + + auth_success := LoginPageDataCustomizations.AuthRequestFunction(AuthStylePassword, PasswordAuthData{ + Username: username, + Password: password, + }) + if auth_success == false { + tmpl.Execute(w, LoginPageData{IsHiddenClassList: "", LoginData: LoginPageDataCustomizations}) + } + } else { + auth_success := LoginPageDataCustomizations.AuthRequestFunction(AuthStyleOAuth, OAuthAuthData{}) + if auth_success == false { + tmpl.Execute(w, LoginPageData{IsHiddenClassList: "", LoginData: LoginPageDataCustomizations}) + } } } } diff --git a/webserver/pages/login_page.html b/webserver/pages/login_page.html index 6249d85..3af1304 100644 --- a/webserver/pages/login_page.html +++ b/webserver/pages/login_page.html @@ -34,8 +34,8 @@