town/request/gemini.go

70 lines
1.6 KiB
Go

package request
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
email "git.tilde.town/tildetown/town/email"
)
const geminiHomeDocBase = "/home/gemini/users"
func ProcessGemini(requestRootPath string) error {
rp := filepath.Join(requestRootPath, "gemini")
files, err := ioutil.ReadDir(rp)
if err != nil {
return fmt.Errorf("failed to list directory %s: %w", rp, err)
}
usernames := []string{}
for _, file := range files {
usernames = append(usernames, file.Name())
}
if len(usernames) == 0 {
return nil
}
for _, username := range usernames {
err := linkGemini(username)
if err != nil {
fmt.Fprintf(os.Stderr, "failed to process gemini request for %s: %s\n", username, err.Error())
}
os.Remove(filepath.Join(rp, username))
}
return nil
}
func linkGemini(username string) error {
pgPath := filepath.Join("/home", username, "public_gemini")
if !pathExists(pgPath) {
return fmt.Errorf("public_gemini missing for %s", username)
}
geminiPath := filepath.Join(geminiHomeDocBase, username)
if !pathExists(geminiPath) {
err := os.Symlink(pgPath, geminiPath)
if err != nil {
return fmt.Errorf("failed to link public_gemini for %s: %w", username, err)
}
}
body := fmt.Sprintf(`hi %s!
you requested a gemini space on the town. this space has been activated and anything you do in your public_gemini directory should now be reflected by the server.
if you did _not_ request this, please let an admin know.`, username)
return email.SendLocalEmail(username, "gemini", body)
}
func pathExists(path string) bool {
_, err := os.Stat(path)
return err == nil
}