mirror of
				https://github.com/osmarks/mycorrhiza.git
				synced 2025-10-31 07:33:00 +00:00 
			
		
		
		
	Implement registration
This commit is contained in:
		
							
								
								
									
										3
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								Makefile
									
									
									
									
									
								
							| @@ -4,6 +4,9 @@ run: build | ||||
| config_run: build | ||||
| 	./mycorrhiza -config-path "assets/config.ini" metarrhiza | ||||
|  | ||||
| devconfig_run: build | ||||
| 	./mycorrhiza -config-path "assets/devconfig.ini" metarrhiza | ||||
|  | ||||
| build: | ||||
| 	go generate | ||||
| 	go build . | ||||
|   | ||||
| @@ -339,7 +339,6 @@ table { background-color: #eee; } | ||||
|  | ||||
| /* Other stuff */ | ||||
| html { background-color: #ddd;  | ||||
| background-image: url("data:image/svg+xml,%3Csvg width='42' height='44' viewBox='0 0 42 44' xmlns='http://www.w3.org/2000/svg'%3E%3Cg id='Page-1' fill='none' fill-rule='evenodd'%3E%3Cg id='brick-wall' fill='%23bbbbbb' fill-opacity='0.4'%3E%3Cpath d='M0 0h42v44H0V0zm1 1h40v20H1V1zM0 23h20v20H0V23zm22 0h20v20H22V23z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); | ||||
| background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='199' viewBox='0 0 100 199'%3E%3Cg fill='%23bbbbbb' %3E%3Cpath d='M0 199V0h1v1.99L100 199h-1.12L1 4.22V199H0zM100 2h-.12l-1-2H100v2z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E"); | ||||
| } /* heropatterns.com */ | ||||
| header { background-color: #bbb; } | ||||
| @@ -468,8 +467,8 @@ function selectionWrapper(cursorPosition, prefix, postfix = null, el = editTexta | ||||
|         if (postfix == null) { | ||||
|             postfix = prefix | ||||
|         } | ||||
|         text = getSelectedText(el) | ||||
|         result = prefix + text + postfix | ||||
|         let text = getSelectedText(el) | ||||
|         let result = prefix + text + postfix | ||||
|         el.setRangeText(result, start, end, 'select') | ||||
|         el.focus() | ||||
|         placeCursor(end + cursorPosition) | ||||
|   | ||||
							
								
								
									
										19
									
								
								assets/devconfig.ini
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								assets/devconfig.ini
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| WikiName = Mycorrhiza (dev) | ||||
| NaviTitleIcon = 🧑💻 | ||||
|  | ||||
| [Hyphae] | ||||
| HomeHypha = home | ||||
| UserHypha = u | ||||
| HeaderLinksHypha = header-links | ||||
|  | ||||
| [Network] | ||||
| HTTPPort = 1737 | ||||
| URL = http://localhost:1737 | ||||
|  | ||||
| [Authorization] | ||||
| UseFixedAuth = true | ||||
| FixedAuthCredentialsPath = mycocredentials.json | ||||
|  | ||||
| UseRegistration = true | ||||
| RegistrationCredentialsPath = mycoregistration.json | ||||
| LimitRegistration = 3 | ||||
| @@ -30,8 +30,8 @@ function selectionWrapper(cursorPosition, prefix, postfix = null, el = editTexta | ||||
|         if (postfix == null) { | ||||
|             postfix = prefix | ||||
|         } | ||||
|         text = getSelectedText(el) | ||||
|         result = prefix + text + postfix | ||||
|         let text = getSelectedText(el) | ||||
|         let result = prefix + text + postfix | ||||
|         el.setRangeText(result, start, end, 'select') | ||||
|         el.focus() | ||||
|         placeCursor(end + cursorPosition) | ||||
|   | ||||
							
								
								
									
										3
									
								
								flag.go
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								flag.go
									
									
									
									
									
								
							| @@ -59,7 +59,4 @@ func parseCliArgs() { | ||||
| 	util.UserHypha = util.CanonicalName(util.UserHypha) | ||||
| 	util.HeaderLinksHypha = util.CanonicalName(util.HeaderLinksHypha) | ||||
| 	user.AuthUsed = util.UseFixedAuth || util.UseRegistration | ||||
| 	if user.AuthUsed && (util.FixedCredentialsPath != "" || util.RegistrationCredentialsPath != "") { | ||||
| 		user.ReadUsersFromFilesystem() | ||||
| 	} | ||||
| } | ||||
|   | ||||
							
								
								
									
										3
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								main.go
									
									
									
									
									
								
							| @@ -186,6 +186,9 @@ func main() { | ||||
| 	hyphae.Index(WikiDir) | ||||
| 	log.Println("Indexed", hyphae.Count(), "hyphae") | ||||
|  | ||||
| 	if user.AuthUsed && (util.FixedCredentialsPath != "" || util.RegistrationCredentialsPath != "") { | ||||
| 		user.ReadUsersFromFilesystem() | ||||
| 	} | ||||
| 	history.Start(WikiDir) | ||||
| 	shroom.SetHeaderLinks() | ||||
|  | ||||
|   | ||||
| @@ -13,13 +13,20 @@ import ( | ||||
|  | ||||
| // ReadUsersFromFilesystem reads all user information from filesystem and stores it internally. Call it during initialization. | ||||
| func ReadUsersFromFilesystem() { | ||||
| 	rememberUsers(usersFromFixedCredentials()) | ||||
| 	if util.UseFixedAuth { | ||||
| 		rememberUsers(usersFromFixedCredentials()) | ||||
| 	} | ||||
| 	if util.UseRegistration { | ||||
| 		rememberUsers(usersFromRegistrationCredentials()) | ||||
| 	} | ||||
| 	readTokensToUsers() | ||||
| } | ||||
|  | ||||
| func usersFromFixedCredentials() []*User { | ||||
| 	var users []*User | ||||
| 	contents, err := ioutil.ReadFile(util.FixedCredentialsPath) | ||||
| func usersFromFile(path string, source UserSource) (users []*User) { | ||||
| 	contents, err := ioutil.ReadFile(path) | ||||
| 	if os.IsNotExist(err) { | ||||
| 		return | ||||
| 	} | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err) | ||||
| 	} | ||||
| @@ -28,12 +35,23 @@ func usersFromFixedCredentials() []*User { | ||||
| 		log.Fatal(err) | ||||
| 	} | ||||
| 	for _, u := range users { | ||||
| 		u.Source = SourceFixed | ||||
| 		u.Source = source | ||||
| 	} | ||||
| 	return users | ||||
| } | ||||
|  | ||||
| func usersFromFixedCredentials() (users []*User) { | ||||
| 	users = usersFromFile(util.FixedCredentialsPath, SourceFixed) | ||||
| 	log.Println("Found", len(users), "fixed users") | ||||
| 	return users | ||||
| } | ||||
|  | ||||
| func usersFromRegistrationCredentials() (users []*User) { | ||||
| 	users = usersFromFile(registrationCredentialsPath(), SourceRegistration) | ||||
| 	log.Println("Found", len(users), "registered users") | ||||
| 	return users | ||||
| } | ||||
|  | ||||
| func rememberUsers(uu []*User) { | ||||
| 	// uu is used to not shadow the `users` in `users.go`. | ||||
| 	for _, user := range uu { | ||||
| @@ -71,9 +89,49 @@ func tokenStoragePath() string { | ||||
| 	if strings.HasPrefix(dir, util.WikiDir) { | ||||
| 		log.Fatal("Error: Wiki storage directory includes private config files") | ||||
| 	} | ||||
| 	log.Println("Path for saving tokens:", dir) | ||||
| 	return dir | ||||
| } | ||||
|  | ||||
| func registrationCredentialsPath() string { | ||||
| 	path := util.RegistrationCredentialsPath | ||||
| 	if path == "" { | ||||
| 		dir, err := xdg.DataFile("mycorrhiza/registration.json") | ||||
| 		if err != nil { | ||||
| 			// No error handling, because the program will fail later anyway when trying to read file "" | ||||
| 			log.Println("Error: cannot get a file to registration credentials, so no registered users will be saved.") | ||||
| 		} else { | ||||
| 			path = dir | ||||
| 		} | ||||
| 	} | ||||
| 	return path | ||||
| } | ||||
|  | ||||
| func dumpRegistrationCredentials() error { | ||||
| 	tmp := []*User{} | ||||
|  | ||||
| 	for u := range YieldUsers() { | ||||
| 		if u.Source != SourceRegistration { | ||||
| 			continue | ||||
| 		} | ||||
| 		copiedUser := u | ||||
| 		copiedUser.Password = "" | ||||
| 		tmp = append(tmp, copiedUser) | ||||
| 	} | ||||
|  | ||||
| 	blob, err := json.Marshal(tmp) | ||||
| 	if err != nil { | ||||
| 		log.Println(err) | ||||
| 		return err | ||||
| 	} | ||||
| 	err = ioutil.WriteFile(registrationCredentialsPath(), blob, 0644) | ||||
| 	if err != nil { | ||||
| 		log.Println(err) | ||||
| 		return err | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func dumpTokens() { | ||||
| 	tmp := make(map[string]string) | ||||
|  | ||||
|   | ||||
| @@ -60,6 +60,10 @@ func Register(username, password string) error { | ||||
| 		Source:         SourceRegistration, | ||||
| 	} | ||||
| 	users.Store(username, &u) | ||||
| 	err = dumpRegistrationCredentials() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Timur Ismagilov
					Timur Ismagilov