mirror of
				https://github.com/casdoor/casdoor.git
				synced 2025-10-31 17:37:50 +08:00 
			
		
		
		
	Use new providerItem.
This commit is contained in:
		| @ -179,6 +179,7 @@ func (c *ApiController) Login() { | ||||
| 	} else if form.Provider != "" { | ||||
| 		application := object.GetApplication(fmt.Sprintf("admin/%s", form.Application)) | ||||
| 		provider := object.GetProvider(fmt.Sprintf("admin/%s", form.Provider)) | ||||
| 		providerItem := application.GetProviderItem(provider.Name) | ||||
|  | ||||
| 		idProvider := idp.GetIdProvider(provider.Type, provider.ClientId, provider.ClientSecret, form.RedirectUri) | ||||
| 		if idProvider == nil { | ||||
| @ -231,6 +232,8 @@ func (c *ApiController) Login() { | ||||
| 			} | ||||
|  | ||||
| 			if user != nil { | ||||
| 				// Sign in via OAuth | ||||
|  | ||||
| 				//if object.IsForbidden(userId) { | ||||
| 				//	c.forbiddenAccountResp(userId) | ||||
| 				//	return | ||||
| @ -243,16 +246,30 @@ func (c *ApiController) Login() { | ||||
|  | ||||
| 				resp = c.HandleLoggedIn(user, &form) | ||||
| 			} else { | ||||
| 				// Sign up via OAuth | ||||
|  | ||||
| 				//if userId := object.GetUserIdByField(application, "email", userInfo.Email); userId != "" { | ||||
| 				//	resp = c.HandleLoggedIn(userId, &form) | ||||
| 				// | ||||
| 				//	object.LinkUserAccount(userId, provider.Type, userInfo.Id) | ||||
| 				//} | ||||
|  | ||||
| 				// sign up via OAuth | ||||
| 				if !application.EnableSignUp { | ||||
| 					resp = &Response{Status: "error", Msg: fmt.Sprintf("The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support", provider.Type, userInfo.Username, userInfo.DisplayName)} | ||||
| 					c.Data["json"] = resp | ||||
| 					c.ServeJSON() | ||||
| 					return | ||||
| 				} | ||||
|  | ||||
| 				if !providerItem.CanSignUp { | ||||
| 					resp = &Response{Status: "error", Msg: fmt.Sprintf("The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account via %s, please use another way to sign up", provider.Type, userInfo.Username, userInfo.DisplayName, provider.Type)} | ||||
| 					c.Data["json"] = resp | ||||
| 					c.ServeJSON() | ||||
| 					return | ||||
| 				} | ||||
|  | ||||
| 				properties := map[string]string{} | ||||
| 				properties["no"] = strconv.Itoa(len(object.GetUsers(application.Organization)) + 2) | ||||
| 				if provider.EnableSignUp { | ||||
| 				user := &object.User{ | ||||
| 					Owner:         application.Organization, | ||||
| 					Name:          userInfo.Username, | ||||
| @ -276,17 +293,6 @@ func (c *ApiController) Login() { | ||||
| 				object.LinkUserAccount(user, provider.Type, userInfo.Id) | ||||
|  | ||||
| 				resp = c.HandleLoggedIn(user, &form) | ||||
| 				} else if !application.EnableSignUp { | ||||
| 					resp = &Response{Status: "error", Msg: fmt.Sprintf("The account for provider: %s and username: %s does not exist and is not allowed to sign up as new account, please contact your IT support", provider.Type, userInfo.Username)} | ||||
| 					c.Data["json"] = resp | ||||
| 					c.ServeJSON() | ||||
| 					return | ||||
| 				} else { | ||||
| 					resp = &Response{Status: "error", Msg: fmt.Sprintf("The account for provider: %s and username: %s does not exist, please create an account first", provider.Type, userInfo.Username)} | ||||
| 					c.Data["json"] = resp | ||||
| 					c.ServeJSON() | ||||
| 					return | ||||
| 				} | ||||
| 			} | ||||
| 			//resp = &Response{Status: "ok", Msg: "", Data: res} | ||||
| 		} else { // form.Method != "signup" | ||||
|  | ||||
| @ -31,8 +31,7 @@ type Application struct { | ||||
| 	Organization    string          `xorm:"varchar(100)" json:"organization"` | ||||
| 	EnablePassword  bool            `json:"enablePassword"` | ||||
| 	EnableSignUp    bool            `json:"enableSignUp"` | ||||
| 	Providers       []ProviderItem `xorm:"varchar(1000)" json:"providers"` | ||||
| 	ProviderObjs    []*Provider    `xorm:"-" json:"providerObjs"` | ||||
| 	Providers       []*ProviderItem `xorm:"varchar(1000)" json:"providers"` | ||||
| 	OrganizationObj *Organization   `xorm:"-" json:"organizationObj"` | ||||
|  | ||||
| 	ClientId       string   `xorm:"varchar(100)" json:"clientId"` | ||||
| @ -54,8 +53,17 @@ func GetApplications(owner string) []*Application { | ||||
| 	return applications | ||||
| } | ||||
|  | ||||
| func extendApplicationWithProviders(application *Application) { | ||||
| 	providers := GetProviders(application.Owner) | ||||
| func (application *Application) GetProviderItem(providerName string) *ProviderItem { | ||||
| 	for _, providerItem := range application.Providers { | ||||
| 		if providerItem.Name == providerName { | ||||
| 			return providerItem | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func getProviderMap(owner string) map[string]*Provider { | ||||
| 	providers := GetProviders(owner) | ||||
| 	m := map[string]*Provider{} | ||||
| 	for _, provider := range providers { | ||||
| 		if provider.Category != "OAuth" { | ||||
| @ -66,11 +74,14 @@ func extendApplicationWithProviders(application *Application) { | ||||
| 		provider.ProviderUrl = "" | ||||
| 		m[provider.Name] = provider | ||||
| 	} | ||||
| 	return m | ||||
| } | ||||
|  | ||||
| 	application.ProviderObjs = []*Provider{} | ||||
| func extendApplicationWithProviders(application *Application) { | ||||
| 	m := getProviderMap(application.Owner) | ||||
| 	for _, providerItem := range application.Providers { | ||||
| 		if provider, ok := m[providerItem.Name]; ok { | ||||
| 			application.ProviderObjs = append(application.ProviderObjs, provider) | ||||
| 			providerItem.Provider = provider | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @ -143,6 +154,10 @@ func UpdateApplication(id string, application *Application) bool { | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	for _, providerItem := range application.Providers { | ||||
| 		providerItem.Provider = nil | ||||
| 	} | ||||
|  | ||||
| 	affected, err := adapter.Engine.ID(core.PK{owner, name}).AllCols().Update(application) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| @ -154,6 +169,9 @@ func UpdateApplication(id string, application *Application) bool { | ||||
| func AddApplication(application *Application) bool { | ||||
| 	application.ClientId = util.GenerateClientId() | ||||
| 	application.ClientSecret = util.GenerateClientSecret() | ||||
| 	for _, providerItem := range application.Providers { | ||||
| 		providerItem.Provider = nil | ||||
| 	} | ||||
|  | ||||
| 	affected, err := adapter.Engine.Insert(application) | ||||
| 	if err != nil { | ||||
|  | ||||
| @ -66,7 +66,7 @@ func initBuiltInApplication() { | ||||
| 		Organization:   "built-in", | ||||
| 		EnablePassword: true, | ||||
| 		EnableSignUp:   true, | ||||
| 		Providers:      []ProviderItem{}, | ||||
| 		Providers:      []*ProviderItem{}, | ||||
| 		RedirectUris:   []string{}, | ||||
| 		ExpireInHours:  168, | ||||
| 	} | ||||
|  | ||||
| @ -24,6 +24,8 @@ type ProviderItem struct { | ||||
| 	CanSignUp bool      `json:"canSignUp"` | ||||
| 	CanSignIn bool      `json:"canSignIn"` | ||||
| 	CanUnbind bool      `json:"canUnbind"` | ||||
| 	AlertType string    `json:"alertType"` | ||||
| 	Provider  *Provider `json:"provider"` | ||||
| } | ||||
|  | ||||
| type Provider struct { | ||||
| @ -36,7 +38,6 @@ type Provider struct { | ||||
| 	Type         string `xorm:"varchar(100)" json:"type"` | ||||
| 	ClientId     string `xorm:"varchar(100)" json:"clientId"` | ||||
| 	ClientSecret string `xorm:"varchar(100)" json:"clientSecret"` | ||||
| 	EnableSignUp bool   `json:"enableSignUp"` | ||||
|  | ||||
| 	Host    string `xorm:"varchar(100)" json:"host"` | ||||
| 	Port    int    `json:"port"` | ||||
|  | ||||
| @ -162,15 +162,15 @@ class ApplicationListPage extends React.Component { | ||||
|             <List | ||||
|               size="small" | ||||
|               dataSource={providers} | ||||
|               renderItem={(row, i) => { | ||||
|               renderItem={(providerItem, i) => { | ||||
|                 return ( | ||||
|                   <List.Item> | ||||
|                     <div style={{display: "inline"}}> | ||||
|                       <Tooltip placement="topLeft" title="Edit"> | ||||
|                         <Button style={{marginRight: "5px"}} icon={<EditOutlined />} size="small" onClick={() => Setting.goToLinkSoft(this, `/providers/${row}`)} /> | ||||
|                         <Button style={{marginRight: "5px"}} icon={<EditOutlined />} size="small" onClick={() => Setting.goToLinkSoft(this, `/providers/${providerItem.name}`)} /> | ||||
|                       </Tooltip> | ||||
|                       <Link to={`/providers/${row}`}> | ||||
|                         {row} | ||||
|                       <Link to={`/providers/${providerItem.name}`}> | ||||
|                         {providerItem.name} | ||||
|                       </Link> | ||||
|                     </div> | ||||
|                   </List.Item> | ||||
|  | ||||
| @ -179,16 +179,6 @@ class ProviderEditPage extends React.Component { | ||||
|             }} /> | ||||
|           </Col> | ||||
|         </Row> | ||||
|         <Row style={{marginTop: '20px'}} > | ||||
|           <Col style={{marginTop: '5px'}} span={2}> | ||||
|             {i18next.t("application:Enable signup")}: | ||||
|           </Col> | ||||
|           <Col span={1} > | ||||
|             <Switch checked={this.state.provider.enableSignUp} onChange={checked => { | ||||
|               this.updateProviderField('enableSignUp', checked); | ||||
|             }} /> | ||||
|           </Col> | ||||
|         </Row> | ||||
|         { | ||||
|           this.state.provider.category === "Email" ? ( | ||||
|             <React.Fragment> | ||||
|  | ||||
| @ -38,7 +38,7 @@ class ProviderTable extends React.Component { | ||||
|   } | ||||
|  | ||||
|   addRow(table) { | ||||
|     let row = {name: "", canSignUp: false, canSignIn: true, canUnbind: true}; | ||||
|     let row = {name: "Please select a provider", canSignUp: false, canSignIn: true, canUnbind: true, alertType: "None"}; | ||||
|     if (table === undefined) { | ||||
|       table = []; | ||||
|     } | ||||
| @ -73,9 +73,11 @@ class ProviderTable extends React.Component { | ||||
|                     value={text} | ||||
|                     onChange={value => { | ||||
|                       this.updateField(table, index, 'name', value); | ||||
|                       const provider = this.props.providers.filter(provider => provider.name === value)[0]; | ||||
|                       this.updateField(table, index, 'provider', provider); | ||||
|                     }} > | ||||
|               { | ||||
|                 this.props.providers.map((provider, index) => <Option key={index} value={provider.name}>{provider.name}</Option>) | ||||
|                 this.props.providers.filter(provider => table.filter(providerItem => providerItem.name === provider.name).length === 0).map((provider, index) => <Option key={index} value={provider.name}>{provider.name}</Option>) | ||||
|               } | ||||
|             </Select> | ||||
|           ) | ||||
| @ -125,6 +127,27 @@ class ProviderTable extends React.Component { | ||||
|           ) | ||||
|         } | ||||
|       }, | ||||
|       { | ||||
|         title: i18next.t("provider:alertType"), | ||||
|         dataIndex: 'alertType', | ||||
|         key: 'alertType', | ||||
|         width: '120px', | ||||
|         render: (text, record, index) => { | ||||
|           return ( | ||||
|             <Select virtual={false} style={{width: '100%'}} value={text} onChange={(value => { | ||||
|               this.updateField(table, index, 'alertType', value); | ||||
|             })}> | ||||
|               { | ||||
|                 [ | ||||
|                   {id: 'None', name: 'None'}, | ||||
|                   {id: 'Once', name: 'Once'}, | ||||
|                   {id: 'Always', name: 'Always'}, | ||||
|                 ].map((item, index) => <Option key={index} value={item.id}>{item.name}</Option>) | ||||
|               } | ||||
|             </Select> | ||||
|           ) | ||||
|         } | ||||
|       }, | ||||
|       { | ||||
|         title: i18next.t("general:Action"), | ||||
|         key: 'action', | ||||
|  | ||||
| @ -38,24 +38,36 @@ function isLocalhost() { | ||||
|   return hostname === "localhost"; | ||||
| } | ||||
|  | ||||
| export function isProviderVisible(provider) { | ||||
|   if (provider.type !== "GitHub") { | ||||
| export function isProviderVisible(providerItem) { | ||||
|   if (providerItem.provider === undefined || providerItem.provider === null) { | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
|   if (providerItem.provider.type !== "GitHub") { | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   if (isLocalhost()) { | ||||
|     return provider.name.includes("localhost"); | ||||
|     return providerItem.provider.name.includes("localhost"); | ||||
|   } else { | ||||
|     return !provider.name.includes("localhost"); | ||||
|     return !providerItem.provider.name.includes("localhost"); | ||||
|   } | ||||
| } | ||||
|  | ||||
| export function isProviderVisibleForSignUp(provider) { | ||||
|   if (provider.enableSignUp === false) { | ||||
| export function isProviderVisibleForSignUp(providerItem) { | ||||
|   if (providerItem.canSignUp === false) { | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
|   return isProviderVisible(provider); | ||||
|   return isProviderVisible(providerItem); | ||||
| } | ||||
|  | ||||
| export function isProviderVisibleForSignIn(providerItem) { | ||||
|   if (providerItem.canSignIn === false) { | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
|   return isProviderVisible(providerItem); | ||||
| } | ||||
|  | ||||
| export function parseJson(s) { | ||||
|  | ||||
| @ -344,7 +344,7 @@ class UserEditPage extends React.Component { | ||||
|               <Col span={22} > | ||||
|                 <div style={{marginBottom: 20}}> | ||||
|                   { | ||||
|                     this.state.application?.providerObjs.filter(provider => Setting.isProviderVisible(provider)).map((provider, index) => this.renderIdp(provider)) | ||||
|                     this.state.application?.providers.filter(providerItem => Setting.isProviderVisible(providerItem)).map((providerItem, index) => this.renderIdp(providerItem.provider)) | ||||
|                   } | ||||
|                 </div> | ||||
|               </Col> | ||||
|  | ||||
| @ -224,8 +224,8 @@ class LoginPage extends React.Component { | ||||
|           </Form.Item> | ||||
|           <Form.Item> | ||||
|             { | ||||
|               application.providerObjs.filter(provider => Setting.isProviderVisibleForSignUp(provider)).map(provider => { | ||||
|                 return this.renderProviderLogo(provider, application, 30, 5, "small"); | ||||
|               application.providers.filter(providerItem => Setting.isProviderVisibleForSignIn(providerItem)).map(providerItem => { | ||||
|                 return this.renderProviderLogo(providerItem.provider, application, 30, 5, "small"); | ||||
|               }) | ||||
|             } | ||||
|           </Form.Item> | ||||
| @ -245,8 +245,8 @@ class LoginPage extends React.Component { | ||||
|           </div> | ||||
|           <br/> | ||||
|           { | ||||
|             application.providerObjs.filter(provider => Setting.isProviderVisibleForSignUp(provider)).map(provider => { | ||||
|               return this.renderProviderLogo(provider, application, 40, 10, "big"); | ||||
|             application.providers.filter(providerItem => Setting.isProviderVisibleForSignIn(providerItem)).map(providerItem => { | ||||
|               return this.renderProviderLogo(providerItem.provider, application, 40, 10, "big"); | ||||
|             }) | ||||
|           } | ||||
|           { | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Yang Luo
					Yang Luo