eh
This commit is contained in:
		@@ -35,8 +35,8 @@ type httpModUI struct {
 | 
				
			|||||||
	cache            CacheHandler
 | 
						cache            CacheHandler
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func createHttpModUI(frontend *httpFrontend) httpModUI {
 | 
					func createHttpModUI(frontend *httpFrontend) *httpModUI {
 | 
				
			||||||
	return httpModUI{frontend.regenAll, frontend.Regen, frontend.RegenerateBoard, frontend.deleteThreadMarkup, frontend.deleteBoardMarkup, make(chan NNTPMessage), frontend.daemon, frontend.daemon.store, frontend.store, frontend.prefix, frontend.prefix + "mod/", frontend.GetCacheHandler()}
 | 
						return &httpModUI{frontend.regenAll, frontend.Regen, frontend.RegenerateBoard, frontend.deleteThreadMarkup, frontend.deleteBoardMarkup, make(chan NNTPMessage), frontend.daemon, frontend.daemon.store, frontend.store, frontend.prefix, frontend.prefix + "mod/", frontend.GetCacheHandler()}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -44,7 +44,7 @@ func extractGroup(param map[string]interface{}) string {
 | 
				
			|||||||
	return extractParam(param, "newsgroup")
 | 
						return extractParam(param, "newsgroup")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (self httpModUI) getAdminFunc(funcname string) AdminFunc {
 | 
					func (self *httpModUI) getAdminFunc(funcname string) AdminFunc {
 | 
				
			||||||
	if funcname == "template.reload" {
 | 
						if funcname == "template.reload" {
 | 
				
			||||||
		return func(param map[string]interface{}) (interface{}, error) {
 | 
							return func(param map[string]interface{}) (interface{}, error) {
 | 
				
			||||||
			tname, ok := param["template"]
 | 
								tname, ok := param["template"]
 | 
				
			||||||
@@ -390,7 +390,7 @@ func (self httpModUI) HandleAdminCommand(wr http.ResponseWriter, r *http.Request
 | 
				
			|||||||
	}, wr, r)
 | 
						}, wr, r)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (self httpModUI) CheckPubkey(pubkey, scope string) (bool, error) {
 | 
					func (self *httpModUI) CheckPubkey(pubkey, scope string) (bool, error) {
 | 
				
			||||||
	is_admin, err := self.daemon.database.CheckAdminPubkey(pubkey)
 | 
						is_admin, err := self.daemon.database.CheckAdminPubkey(pubkey)
 | 
				
			||||||
	if is_admin {
 | 
						if is_admin {
 | 
				
			||||||
		// admin can do what they want
 | 
							// admin can do what they want
 | 
				
			||||||
@@ -413,7 +413,7 @@ func (self httpModUI) CheckPubkey(pubkey, scope string) (bool, error) {
 | 
				
			|||||||
	return false, err
 | 
						return false, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (self httpModUI) CheckKey(privkey, scope string) (bool, error) {
 | 
					func (self *httpModUI) CheckKey(privkey, scope string) (bool, error) {
 | 
				
			||||||
	privkey_bytes, err := hex.DecodeString(privkey)
 | 
						privkey_bytes, err := hex.DecodeString(privkey)
 | 
				
			||||||
	if err == nil {
 | 
						if err == nil {
 | 
				
			||||||
		pk, _ := naclSeedToKeyPair(privkey_bytes)
 | 
							pk, _ := naclSeedToKeyPair(privkey_bytes)
 | 
				
			||||||
@@ -424,17 +424,17 @@ func (self httpModUI) CheckKey(privkey, scope string) (bool, error) {
 | 
				
			|||||||
	return false, err
 | 
						return false, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (self httpModUI) MessageChan() chan NNTPMessage {
 | 
					func (self *httpModUI) MessageChan() chan NNTPMessage {
 | 
				
			||||||
	return self.modMessageChan
 | 
						return self.modMessageChan
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (self httpModUI) getSession(r *http.Request) *sessions.Session {
 | 
					func (self *httpModUI) getSession(r *http.Request) *sessions.Session {
 | 
				
			||||||
	s, _ := self.store.Get(r, "nntpchan-mod")
 | 
						s, _ := self.store.Get(r, "nntpchan-mod")
 | 
				
			||||||
	return s
 | 
						return s
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// get the session's private key as bytes or nil if we don't have it
 | 
					// get the session's private key as bytes or nil if we don't have it
 | 
				
			||||||
func (self httpModUI) getSessionPrivkeyBytes(r *http.Request) []byte {
 | 
					func (self *httpModUI) getSessionPrivkeyBytes(r *http.Request) []byte {
 | 
				
			||||||
	s := self.getSession(r)
 | 
						s := self.getSession(r)
 | 
				
			||||||
	k, ok := s.Values["privkey"]
 | 
						k, ok := s.Values["privkey"]
 | 
				
			||||||
	if ok {
 | 
						if ok {
 | 
				
			||||||
@@ -451,7 +451,7 @@ func (self httpModUI) getSessionPrivkeyBytes(r *http.Request) []byte {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// returns true if the session is okay for a scope
 | 
					// returns true if the session is okay for a scope
 | 
				
			||||||
// otherwise redirect to login page
 | 
					// otherwise redirect to login page
 | 
				
			||||||
func (self httpModUI) checkSession(r *http.Request, scope string) bool {
 | 
					func (self *httpModUI) checkSession(r *http.Request, scope string) bool {
 | 
				
			||||||
	s := self.getSession(r)
 | 
						s := self.getSession(r)
 | 
				
			||||||
	k, ok := s.Values["privkey"]
 | 
						k, ok := s.Values["privkey"]
 | 
				
			||||||
	if ok {
 | 
						if ok {
 | 
				
			||||||
@@ -464,11 +464,11 @@ func (self httpModUI) checkSession(r *http.Request, scope string) bool {
 | 
				
			|||||||
	return false
 | 
						return false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (self httpModUI) writeTemplate(wr http.ResponseWriter, r *http.Request, name string) {
 | 
					func (self *httpModUI) writeTemplate(wr http.ResponseWriter, r *http.Request, name string) {
 | 
				
			||||||
	self.writeTemplateParam(wr, r, name, nil)
 | 
						self.writeTemplateParam(wr, r, name, nil)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (self httpModUI) writeTemplateParam(wr http.ResponseWriter, r *http.Request, name string, param map[string]interface{}) {
 | 
					func (self *httpModUI) writeTemplateParam(wr http.ResponseWriter, r *http.Request, name string, param map[string]interface{}) {
 | 
				
			||||||
	if param == nil {
 | 
						if param == nil {
 | 
				
			||||||
		param = make(map[string]interface{})
 | 
							param = make(map[string]interface{})
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -481,7 +481,7 @@ func (self httpModUI) writeTemplateParam(wr http.ResponseWriter, r *http.Request
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// do a function as authenticated
 | 
					// do a function as authenticated
 | 
				
			||||||
// pass in the request path to the handler
 | 
					// pass in the request path to the handler
 | 
				
			||||||
func (self httpModUI) asAuthed(scope string, handler func(string), wr http.ResponseWriter, r *http.Request) {
 | 
					func (self *httpModUI) asAuthed(scope string, handler func(string), wr http.ResponseWriter, r *http.Request) {
 | 
				
			||||||
	if self.checkSession(r, scope) {
 | 
						if self.checkSession(r, scope) {
 | 
				
			||||||
		handler(r.URL.Path)
 | 
							handler(r.URL.Path)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
@@ -490,7 +490,7 @@ func (self httpModUI) asAuthed(scope string, handler func(string), wr http.Respo
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// do stuff to a certain message if with have it and are authed
 | 
					// do stuff to a certain message if with have it and are authed
 | 
				
			||||||
func (self httpModUI) asAuthedWithMessage(scope string, handler func(ArticleEntry, *http.Request) map[string]interface{}, wr http.ResponseWriter, req *http.Request) {
 | 
					func (self *httpModUI) asAuthedWithMessage(scope string, handler func(ArticleEntry, *http.Request) map[string]interface{}, wr http.ResponseWriter, req *http.Request) {
 | 
				
			||||||
	self.asAuthed(scope, func(path string) {
 | 
						self.asAuthed(scope, func(path string) {
 | 
				
			||||||
		// get the long hash
 | 
							// get the long hash
 | 
				
			||||||
		if strings.Count(path, "/") > 2 {
 | 
							if strings.Count(path, "/") > 2 {
 | 
				
			||||||
@@ -523,7 +523,7 @@ func (self httpModUI) asAuthedWithMessage(scope string, handler func(ArticleEntr
 | 
				
			|||||||
	}, wr, req)
 | 
						}, wr, req)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (self httpModUI) HandlePostSpam(wr http.ResponseWriter, r *http.Request) {
 | 
					func (self *httpModUI) HandlePostSpam(wr http.ResponseWriter, r *http.Request) {
 | 
				
			||||||
	if r.Method != "POST" {
 | 
						if r.Method != "POST" {
 | 
				
			||||||
		wr.WriteHeader(405)
 | 
							wr.WriteHeader(405)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
@@ -557,13 +557,13 @@ func (self httpModUI) HandlePostSpam(wr http.ResponseWriter, r *http.Request) {
 | 
				
			|||||||
	json.NewEncoder(wr).Encode(resp)
 | 
						json.NewEncoder(wr).Encode(resp)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (self httpModUI) HandleAddPubkey(wr http.ResponseWriter, r *http.Request) {
 | 
					func (self *httpModUI) HandleAddPubkey(wr http.ResponseWriter, r *http.Request) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (self httpModUI) HandleDelPubkey(wr http.ResponseWriter, r *http.Request) {
 | 
					func (self *httpModUI) HandleDelPubkey(wr http.ResponseWriter, r *http.Request) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (self httpModUI) HandleUnbanAddress(wr http.ResponseWriter, r *http.Request) {
 | 
					func (self *httpModUI) HandleUnbanAddress(wr http.ResponseWriter, r *http.Request) {
 | 
				
			||||||
	self.asAuthed("ban", func(path string) {
 | 
						self.asAuthed("ban", func(path string) {
 | 
				
			||||||
		// extract the ip address
 | 
							// extract the ip address
 | 
				
			||||||
		// TODO: ip ranges and prefix detection
 | 
							// TODO: ip ranges and prefix detection
 | 
				
			||||||
@@ -593,7 +593,7 @@ func (self httpModUI) HandleUnbanAddress(wr http.ResponseWriter, r *http.Request
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// handle ban logic
 | 
					// handle ban logic
 | 
				
			||||||
func (self httpModUI) handleBanAddress(msg ArticleEntry, r *http.Request) map[string]interface{} {
 | 
					func (self *httpModUI) handleBanAddress(msg ArticleEntry, r *http.Request) map[string]interface{} {
 | 
				
			||||||
	// get the article headers
 | 
						// get the article headers
 | 
				
			||||||
	resp := make(map[string]interface{})
 | 
						resp := make(map[string]interface{})
 | 
				
			||||||
	msgid := msg.MessageID()
 | 
						msgid := msg.MessageID()
 | 
				
			||||||
@@ -657,7 +657,7 @@ func (self httpModUI) handleBanAddress(msg ArticleEntry, r *http.Request) map[st
 | 
				
			|||||||
	return resp
 | 
						return resp
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (self httpModUI) handleDeletePost(msg ArticleEntry, r *http.Request) map[string]interface{} {
 | 
					func (self *httpModUI) handleDeletePost(msg ArticleEntry, r *http.Request) map[string]interface{} {
 | 
				
			||||||
	var mm ModMessage
 | 
						var mm ModMessage
 | 
				
			||||||
	resp := make(map[string]interface{})
 | 
						resp := make(map[string]interface{})
 | 
				
			||||||
	msgid := msg.MessageID()
 | 
						msgid := msg.MessageID()
 | 
				
			||||||
@@ -706,16 +706,16 @@ func (self httpModUI) handleDeletePost(msg ArticleEntry, r *http.Request) map[st
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ban the address of a poster
 | 
					// ban the address of a poster
 | 
				
			||||||
func (self httpModUI) HandleBanAddress(wr http.ResponseWriter, r *http.Request) {
 | 
					func (self *httpModUI) HandleBanAddress(wr http.ResponseWriter, r *http.Request) {
 | 
				
			||||||
	self.asAuthedWithMessage("ban", self.handleBanAddress, wr, r)
 | 
						self.asAuthedWithMessage("ban", self.handleBanAddress, wr, r)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// delete a post
 | 
					// delete a post
 | 
				
			||||||
func (self httpModUI) HandleDeletePost(wr http.ResponseWriter, r *http.Request) {
 | 
					func (self *httpModUI) HandleDeletePost(wr http.ResponseWriter, r *http.Request) {
 | 
				
			||||||
	self.asAuthedWithMessage("login", self.handleDeletePost, wr, r)
 | 
						self.asAuthedWithMessage("login", self.handleDeletePost, wr, r)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (self httpModUI) HandleLogin(wr http.ResponseWriter, r *http.Request) {
 | 
					func (self *httpModUI) HandleLogin(wr http.ResponseWriter, r *http.Request) {
 | 
				
			||||||
	privkey := r.FormValue("privkey")
 | 
						privkey := r.FormValue("privkey")
 | 
				
			||||||
	msg := "failed login: "
 | 
						msg := "failed login: "
 | 
				
			||||||
	if len(privkey) == 0 {
 | 
						if len(privkey) == 0 {
 | 
				
			||||||
@@ -736,13 +736,13 @@ func (self httpModUI) HandleLogin(wr http.ResponseWriter, r *http.Request) {
 | 
				
			|||||||
	self.writeTemplateParam(wr, r, "modlogin_result", map[string]interface{}{"message": msg, csrf.TemplateTag: csrf.TemplateField(r)})
 | 
						self.writeTemplateParam(wr, r, "modlogin_result", map[string]interface{}{"message": msg, csrf.TemplateTag: csrf.TemplateField(r)})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (self httpModUI) HandleKeyGen(wr http.ResponseWriter, r *http.Request) {
 | 
					func (self *httpModUI) HandleKeyGen(wr http.ResponseWriter, r *http.Request) {
 | 
				
			||||||
	pk, sk := newNaclSignKeypair()
 | 
						pk, sk := newNaclSignKeypair()
 | 
				
			||||||
	tripcode := makeTripcode(pk)
 | 
						tripcode := makeTripcode(pk)
 | 
				
			||||||
	self.writeTemplateParam(wr, r, "keygen", map[string]interface{}{"public": pk, "secret": sk, "tripcode": tripcode})
 | 
						self.writeTemplateParam(wr, r, "keygen", map[string]interface{}{"public": pk, "secret": sk, "tripcode": tripcode})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (self httpModUI) ServeModPage(wr http.ResponseWriter, r *http.Request) {
 | 
					func (self *httpModUI) ServeModPage(wr http.ResponseWriter, r *http.Request) {
 | 
				
			||||||
	if self.checkSession(r, "login") {
 | 
						if self.checkSession(r, "login") {
 | 
				
			||||||
		wr.Header().Set("X-CSRF-Token", csrf.Token(r))
 | 
							wr.Header().Set("X-CSRF-Token", csrf.Token(r))
 | 
				
			||||||
		// we are logged in
 | 
							// we are logged in
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user