// staletea // Copyright (C) 2019 Jonas Franz // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . package web import ( "code.gitea.io/sdk/gitea" "context" "gitea.com/jonasfranz/staletea/auth" "gitea.com/jonasfranz/staletea/config" "gitea.com/jonasfranz/staletea/models" "gitea.com/jonasfranz/staletea/utils" "github.com/gin-contrib/sessions" "github.com/gin-gonic/gin" "net/http" ) func handleLogin(ctx *gin.Context) { session := sessions.Default(ctx) state, err := utils.NewSecret(32) if err != nil { _ = ctx.AbortWithError(500, err) return } session.Set("state", state) if err := session.Save(); err != nil { _ = ctx.AbortWithError(http.StatusInternalServerError, err) return } redirectURL := auth.Config().AuthCodeURL(state) ctx.Redirect(http.StatusTemporaryRedirect, redirectURL) } func handleCallback(ctx *gin.Context) { session := sessions.Default(ctx) state := ctx.Query("state") savedState := session.Get("state") if savedState == nil { ctx.String(http.StatusUnauthorized, "Invalid state") return } session.Delete("state") if parsedState, ok := savedState.(string); !ok || parsedState != state { ctx.String(http.StatusUnauthorized, "Invalid state") return } token, err := auth.Config().Exchange(ctx, ctx.Query("code")) if err != nil { _ = ctx.AbortWithError(http.StatusUnauthorized, err) return } client := gitea.NewClient(config.GiteaURL.Get().(string), "") client.SetHTTPClient(auth.Config().Client(context.Background(), token)) user, err := client.GetMyUserInfo() if err != nil { _ = ctx.AbortWithError(http.StatusUnauthorized, err) return } storedUser := &models.User{ ID: user.ID, Username: user.UserName, Token: token, } if err := models.InsertOrUpdateUser(storedUser); err != nil { _ = ctx.AbortWithError(http.StatusInternalServerError, err) return } session.Set("user", storedUser) if err := session.Save(); err != nil { _ = ctx.AbortWithError(http.StatusInternalServerError, err) return } ctx.Redirect(http.StatusTemporaryRedirect, config.BaseURL.Get().(string)) }