96 lines
2.6 KiB
Go
Raw Normal View History

2022-02-13 23:39:27 +08:00
// Copyright 2021 The Casdoor Authors. All Rights Reserved.
2021-04-18 23:14:46 +08:00
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package controllers
import (
"encoding/json"
2022-01-20 14:11:46 +08:00
"github.com/casdoor/casdoor/object"
2021-04-18 23:14:46 +08:00
)
type LinkForm struct {
ProviderType string `json:"providerType"`
User object.User `json:"user"`
2021-04-18 23:14:46 +08:00
}
2021-08-07 22:02:56 +08:00
// Unlink ...
// @router /unlink [post]
// @Tag Login API
2021-04-18 23:14:46 +08:00
func (c *ApiController) Unlink() {
2021-05-17 23:25:28 +08:00
userId, ok := c.RequireSignedIn()
if !ok {
2021-04-18 23:14:46 +08:00
return
}
var form LinkForm
err := json.Unmarshal(c.Ctx.Input.RequestBody, &form)
if err != nil {
panic(err)
}
providerType := form.ProviderType
// the user will be unlinked from the provider
unlinkedUser := form.User
2021-04-18 23:14:46 +08:00
user := object.GetUser(userId)
if user.Id != unlinkedUser.Id && !user.IsGlobalAdmin {
// if the user is not the same as the one we are unlinking, we need to make sure the user is the global admin.
c.ResponseError("You are not the global admin, you can't unlink other users")
return
}
if user.Id == unlinkedUser.Id && !user.IsGlobalAdmin {
// if the user is unlinking themselves, should check the provider can be unlinked, if not, we should return an error.
application := object.GetApplicationByUser(user)
if application == nil {
c.ResponseError("You can't unlink yourself, you are not a member of any application")
return
}
if len(application.Providers) == 0 {
c.ResponseError("This application has no providers")
return
}
provider := application.GetProviderItemByType(providerType)
if provider == nil {
c.ResponseError("This application has no providers of type " + providerType)
return
}
if !provider.CanUnlink {
c.ResponseError("This provider can't be unlinked")
return
}
}
// only two situations can happen here
// 1. the user is the global admin
// 2. the user is unlinking themselves and provider can be unlinked
value := object.GetUserField(&unlinkedUser, providerType)
2021-04-18 23:14:46 +08:00
if value == "" {
2021-08-08 11:06:45 +08:00
c.ResponseError("Please link first", value)
2021-04-18 23:14:46 +08:00
return
}
object.ClearUserOAuthProperties(&unlinkedUser, providerType)
2021-05-30 18:35:05 +08:00
object.LinkUserAccount(&unlinkedUser, providerType, "")
2021-08-08 16:00:19 +08:00
c.ResponseOk()
2021-04-18 23:14:46 +08:00
}