func signInHandler(ctx *app.Context) { modal := ctx.FormValue("modal") != "" d := data(ctx) if !modal && !d.allowDirectSignIn() && d.hasEnabledSocialSignin() { // Redirect to the only available social sign-in ctx.MustRedirectReverse(false, d.enabledSocialAccountTypes()[0].HandlerName) return } from := ctx.FormValue(app.SignInFromParameterName) signIn := SignIn{From: from} form := form.New(ctx, &signIn) if d.allowDirectSignIn() && form.Submitted() && form.IsValid() { ctx.MustSignIn(asGondolaUser(reflect.ValueOf(signIn.User))) ctx.RedirectBack() return } user, _ := newEmptyUser(ctx) data := map[string]interface{}{ "SocialAccountTypes": d.enabledSocialAccountTypes(), "From": from, "SignInForm": form, "SignUpForm": SignUpForm(ctx, user), "AllowDirectSignIn": d.allowDirectSignIn(), "AllowRegistration": d.allowRegistration(), } tmpl := SignInTemplateName if modal && SignInModalTemplateName != "" { tmpl = SignInModalTemplateName } ctx.MustExecute(tmpl, data) }
func windowCallbackHandler(ctx *app.Context, user reflect.Value, callback string) { inWindow := ctx.FormValue("window") != "" if user.IsValid() { ctx.MustSignIn(asGondolaUser(user)) } if inWindow { var payload []byte if user.IsValid() { var err error payload, err = JSONEncode(ctx, user.Interface()) if err != nil { panic(err) } } ctx.MustExecute("js-callback.html", map[string]interface{}{ "Callback": callback, "Payload": payload, }) } else { if user.IsValid() { redirectToFrom(ctx) } else { ctx.MustRedirectReverse(false, app.SignInHandlerName) } } }
func signInFacebookTokenHandler(ctx *app.Context, client *oauth2.Client, token *oauth2.Token) { user, err := userFromFacebookToken(ctx, token) if err != nil { panic(err) } ctx.MustSignIn(asGondolaUser(user)) redirectToFrom(ctx) }
func signInGoogleTokenHandler(ctx *app.Context, client *oauth2.Client, token *oauth2.Token) { d := data(ctx) googleApp := d.opts.GoogleApp.Clone(ctx) user, err := userFromGoogleToken(ctx, googleApp, token) if err != nil { panic(err) } ctx.MustSignIn(asGondolaUser(user)) redirectToFrom(ctx) }
func jsSignInGoogleHandler(ctx *app.Context) { code := ctx.RequireFormValue(oauth2.Code) redir := "postmessage" // this is the redir value used for G+ JS sign in d := data(ctx) googleApp := d.opts.GoogleApp.Clone(ctx) token, err := googleApp.Exchange(redir, code) if err != nil { panic(err) } user, err := userFromGoogleToken(ctx, googleApp, token) if err != nil { panic(err) } ctx.MustSignIn(asGondolaUser(user)) writeJSONEncoded(ctx, user) }
func jsSignInHandler(ctx *app.Context) { d := data(ctx) if !d.allowDirectSignIn() { ctx.NotFound("") return } signIn := SignIn{} form := form.New(ctx, &signIn) if form.Submitted() && form.IsValid() { user := reflect.ValueOf(signIn.User) ctx.MustSignIn(asGondolaUser(user)) writeJSONEncoded(ctx, user) return } FormErrors(ctx, form) }
func jsSignInFacebookHandler(ctx *app.Context) { req := ctx.FormValue("req") fbApp := data(ctx).opts.FacebookApp.Clone(ctx) resp, err := fbApp.ParseSignedRequest(req) if err != nil { panic(err) } // Let it crash if the data does not have the // specified format, this will make it easier // to find it if it happens. code := resp["code"].(string) token, err := fbApp.Exchange("", code) user, err := userFromFacebookToken(ctx, token) if err != nil { panic(err) } ctx.MustSignIn(asGondolaUser(user)) writeJSONEncoded(ctx, user) }
func ResetHandler(ctx *app.Context) { d := data(ctx) if !d.allowDirectSignIn() { ctx.NotFound("") return } payload := ctx.FormValue("p") var valid bool var expired bool var f *form.Form var user reflect.Value var err error var done bool if payload != "" { user, err = decodeResetPayload(ctx, payload) if err == nil && user.IsValid() { valid = true } else { if err == errResetExpired { expired = true } } } if valid { passwordForm := &PasswordForm{User: user} f = form.New(ctx, passwordForm) if f.Submitted() && f.IsValid() { ctx.Orm().MustSave(user.Interface()) ctx.MustSignIn(asGondolaUser(user)) done = true } } data := map[string]interface{}{ "Valid": valid, "Expired": expired, "Done": done, "User": user, "PasswordForm": f, "Payload": payload, } ctx.MustExecute(ResetTemplateName, data) }
func saveNewUser(ctx *app.Context, user reflect.Value) { setUserValue(user, "Password", password.New(string(getUserValue(user, "Password").(password.Password)))) setUserValue(user, "Created", time.Now().UTC()) ctx.Orm().MustInsert(user.Interface()) ctx.MustSignIn(asGondolaUser(user)) }