You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							51 lines
						
					
					
						
							1.2 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							51 lines
						
					
					
						
							1.2 KiB
						
					
					
				| package auth | |
| 
 | |
| import ( | |
| 	"fmt" | |
| 
 | |
| 	"github.com/seaweedfs/seaweedfs/weed/sftpd/user" | |
| 	"golang.org/x/crypto/ssh" | |
| ) | |
| 
 | |
| // PublicKeyAuthenticator handles public key-based authentication | |
| type PublicKeyAuthenticator struct { | |
| 	userStore user.Store | |
| 	enabled   bool | |
| } | |
| 
 | |
| // NewPublicKeyAuthenticator creates a new public key authenticator | |
| func NewPublicKeyAuthenticator(userStore user.Store, enabled bool) *PublicKeyAuthenticator { | |
| 	return &PublicKeyAuthenticator{ | |
| 		userStore: userStore, | |
| 		enabled:   enabled, | |
| 	} | |
| } | |
| 
 | |
| // Enabled returns whether public key authentication is enabled | |
| func (a *PublicKeyAuthenticator) Enabled() bool { | |
| 	return a.enabled | |
| } | |
| 
 | |
| // Authenticate validates a public key for a user | |
| func (a *PublicKeyAuthenticator) Authenticate(conn ssh.ConnMetadata, key ssh.PublicKey) (*ssh.Permissions, error) { | |
| 	username := conn.User() | |
| 
 | |
| 	// Check if public key auth is enabled | |
| 	if !a.enabled { | |
| 		return nil, fmt.Errorf("public key authentication disabled") | |
| 	} | |
| 
 | |
| 	// Convert key to string format for comparison | |
| 	keyData := string(key.Marshal()) | |
| 
 | |
| 	// Validate public key | |
| 	if a.userStore.ValidatePublicKey(username, keyData) { | |
| 		return &ssh.Permissions{ | |
| 			Extensions: map[string]string{ | |
| 				"username": username, | |
| 			}, | |
| 		}, nil | |
| 	} | |
| 
 | |
| 	return nil, fmt.Errorf("authentication failed") | |
| }
 |