mirror of
				https://github.com/coredns/coredns.git
				synced 2025-11-04 03:03:14 -05:00 
			
		
		
		
	
		
			
	
	
		
			95 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			95 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package https
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"path/filepath"
							 | 
						||
| 
								 | 
							
									"strings"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"github.com/miekg/coredns/core/assets"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// storage is used to get file paths in a consistent,
							 | 
						||
| 
								 | 
							
								// cross-platform way for persisting Let's Encrypt assets
							 | 
						||
| 
								 | 
							
								// on the file system.
							 | 
						||
| 
								 | 
							
								var storage = Storage(filepath.Join(assets.Path(), "letsencrypt"))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Storage is a root directory and facilitates
							 | 
						||
| 
								 | 
							
								// forming file paths derived from it.
							 | 
						||
| 
								 | 
							
								type Storage string
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Sites gets the directory that stores site certificate and keys.
							 | 
						||
| 
								 | 
							
								func (s Storage) Sites() string {
							 | 
						||
| 
								 | 
							
									return filepath.Join(string(s), "sites")
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Site returns the path to the folder containing assets for domain.
							 | 
						||
| 
								 | 
							
								func (s Storage) Site(domain string) string {
							 | 
						||
| 
								 | 
							
									return filepath.Join(s.Sites(), domain)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// SiteCertFile returns the path to the certificate file for domain.
							 | 
						||
| 
								 | 
							
								func (s Storage) SiteCertFile(domain string) string {
							 | 
						||
| 
								 | 
							
									return filepath.Join(s.Site(domain), domain+".crt")
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// SiteKeyFile returns the path to domain's private key file.
							 | 
						||
| 
								 | 
							
								func (s Storage) SiteKeyFile(domain string) string {
							 | 
						||
| 
								 | 
							
									return filepath.Join(s.Site(domain), domain+".key")
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// SiteMetaFile returns the path to the domain's asset metadata file.
							 | 
						||
| 
								 | 
							
								func (s Storage) SiteMetaFile(domain string) string {
							 | 
						||
| 
								 | 
							
									return filepath.Join(s.Site(domain), domain+".json")
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Users gets the directory that stores account folders.
							 | 
						||
| 
								 | 
							
								func (s Storage) Users() string {
							 | 
						||
| 
								 | 
							
									return filepath.Join(string(s), "users")
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// User gets the account folder for the user with email.
							 | 
						||
| 
								 | 
							
								func (s Storage) User(email string) string {
							 | 
						||
| 
								 | 
							
									if email == "" {
							 | 
						||
| 
								 | 
							
										email = emptyEmail
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return filepath.Join(s.Users(), email)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// UserRegFile gets the path to the registration file for
							 | 
						||
| 
								 | 
							
								// the user with the given email address.
							 | 
						||
| 
								 | 
							
								func (s Storage) UserRegFile(email string) string {
							 | 
						||
| 
								 | 
							
									if email == "" {
							 | 
						||
| 
								 | 
							
										email = emptyEmail
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									fileName := emailUsername(email)
							 | 
						||
| 
								 | 
							
									if fileName == "" {
							 | 
						||
| 
								 | 
							
										fileName = "registration"
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return filepath.Join(s.User(email), fileName+".json")
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// UserKeyFile gets the path to the private key file for
							 | 
						||
| 
								 | 
							
								// the user with the given email address.
							 | 
						||
| 
								 | 
							
								func (s Storage) UserKeyFile(email string) string {
							 | 
						||
| 
								 | 
							
									if email == "" {
							 | 
						||
| 
								 | 
							
										email = emptyEmail
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									fileName := emailUsername(email)
							 | 
						||
| 
								 | 
							
									if fileName == "" {
							 | 
						||
| 
								 | 
							
										fileName = "private"
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return filepath.Join(s.User(email), fileName+".key")
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// emailUsername returns the username portion of an
							 | 
						||
| 
								 | 
							
								// email address (part before '@') or the original
							 | 
						||
| 
								 | 
							
								// input if it can't find the "@" symbol.
							 | 
						||
| 
								 | 
							
								func emailUsername(email string) string {
							 | 
						||
| 
								 | 
							
									at := strings.Index(email, "@")
							 | 
						||
| 
								 | 
							
									if at == -1 {
							 | 
						||
| 
								 | 
							
										return email
							 | 
						||
| 
								 | 
							
									} else if at == 0 {
							 | 
						||
| 
								 | 
							
										return email[1:]
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return email[:at]
							 | 
						||
| 
								 | 
							
								}
							 |