mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-04 06:22:25 -06:00 
			
		
		
		
	
		
			
	
	
		
			77 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			77 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package oauth2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"crypto/sha256"
							 | 
						||
| 
								 | 
							
									"encoding/base64"
							 | 
						||
| 
								 | 
							
									"strings"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ResponseType the type of authorization request
							 | 
						||
| 
								 | 
							
								type ResponseType string
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// define the type of authorization request
							 | 
						||
| 
								 | 
							
								const (
							 | 
						||
| 
								 | 
							
									Code  ResponseType = "code"
							 | 
						||
| 
								 | 
							
									Token ResponseType = "token"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (rt ResponseType) String() string {
							 | 
						||
| 
								 | 
							
									return string(rt)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// GrantType authorization model
							 | 
						||
| 
								 | 
							
								type GrantType string
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// define authorization model
							 | 
						||
| 
								 | 
							
								const (
							 | 
						||
| 
								 | 
							
									AuthorizationCode   GrantType = "authorization_code"
							 | 
						||
| 
								 | 
							
									PasswordCredentials GrantType = "password"
							 | 
						||
| 
								 | 
							
									ClientCredentials   GrantType = "client_credentials"
							 | 
						||
| 
								 | 
							
									Refreshing          GrantType = "refresh_token"
							 | 
						||
| 
								 | 
							
									Implicit            GrantType = "__implicit"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (gt GrantType) String() string {
							 | 
						||
| 
								 | 
							
									if gt == AuthorizationCode ||
							 | 
						||
| 
								 | 
							
										gt == PasswordCredentials ||
							 | 
						||
| 
								 | 
							
										gt == ClientCredentials ||
							 | 
						||
| 
								 | 
							
										gt == Refreshing {
							 | 
						||
| 
								 | 
							
										return string(gt)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return ""
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// CodeChallengeMethod PCKE method
							 | 
						||
| 
								 | 
							
								type CodeChallengeMethod string
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const (
							 | 
						||
| 
								 | 
							
									// CodeChallengePlain PCKE Method
							 | 
						||
| 
								 | 
							
									CodeChallengePlain CodeChallengeMethod = "plain"
							 | 
						||
| 
								 | 
							
									// CodeChallengeS256 PCKE Method
							 | 
						||
| 
								 | 
							
									CodeChallengeS256 CodeChallengeMethod = "S256"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (ccm CodeChallengeMethod) String() string {
							 | 
						||
| 
								 | 
							
									if ccm == CodeChallengePlain ||
							 | 
						||
| 
								 | 
							
										ccm == CodeChallengeS256 {
							 | 
						||
| 
								 | 
							
										return string(ccm)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return ""
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Validate code challenge
							 | 
						||
| 
								 | 
							
								func (ccm CodeChallengeMethod) Validate(cc, ver string) bool {
							 | 
						||
| 
								 | 
							
									switch ccm {
							 | 
						||
| 
								 | 
							
									case CodeChallengePlain:
							 | 
						||
| 
								 | 
							
										return cc == ver
							 | 
						||
| 
								 | 
							
									case CodeChallengeS256:
							 | 
						||
| 
								 | 
							
										s256 := sha256.Sum256([]byte(ver))
							 | 
						||
| 
								 | 
							
										// trim padding
							 | 
						||
| 
								 | 
							
										a := strings.TrimRight(base64.URLEncoding.EncodeToString(s256[:]), "=")
							 | 
						||
| 
								 | 
							
										b := strings.TrimRight(cc, "=")
							 | 
						||
| 
								 | 
							
										return a == b
							 | 
						||
| 
								 | 
							
									default:
							 | 
						||
| 
								 | 
							
										return false
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |