| 
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -5,6 +5,7 @@ import (
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					"log"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					"net/http"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					"os"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					"path/filepath"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					"regexp"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					"text/template"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				)
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -21,16 +22,6 @@ var templates = template.Must(template.ParseGlob(template_dir + "/*.html"))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				// Validation to prevent abitrary paths
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				var validPath = regexp.MustCompile("^/(edit|save|view)/([a-zA-Z0-9]+)$")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				// // Retreives and environment variable or supplies the specified default
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				// func GetDefaultEnv(key, default_value string) string {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				// 	// TODO figure out how to write unit test for this How would you wring
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				// 	value := os.Getenv(key)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				// 	if value == "" {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				// 		value = default_value
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				// 	}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				// 	return value
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				// }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				// A wiki consists of a series of interconnected pages, each of which has a title and a body
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				type Page struct {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					Title string
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -40,8 +31,10 @@ type Page struct {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				// save Saves a page to disk.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				func (p *Page) save() error {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					filename := data_dir + "/" + p.Title + ".txt"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					return os.WriteFile(filename, p.Body, 0600)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					// filename := data_dir + "/" + p.Title + ".txt"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					filename := p.Title + ".txt"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					fullPath := filepath.Join(data_dir, filename)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					return os.WriteFile(fullPath, p.Body, 0600)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				// Not neccessary after makeHandler implemented this.
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -60,8 +53,9 @@ func (p *Page) save() error {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				// file, and returns a pointer to a Page struct containing the title and body.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				// If an error occurs during reading, it returns the error.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				func loadPage(title string) (*Page, error) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					filename := data_dir + "/" + title + ".txt"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					body, err := os.ReadFile(filename)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					// filename := data_dir + "/" + title + ".txt"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					fullPath := filepath.Join(data_dir, title+".txt")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					body, err := os.ReadFile(fullPath)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					if err != nil {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						return nil, err
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
			
			 | 
			 | 
			
				
 
 |