srnd

package
v0.0.0-...-b588ea4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 27, 2015 License: MIT Imports: 38 Imported by: 0

Documentation

Overview

daemon.go

database.go

expiration.go content expiration

frontend.go srnd frontend interfaces

frontend_http.go

srnd http frontend implementation

markup.go memeposting markup parser

message.go

mod.go post moderation

model.go template model implementation

nntp.go -- nntp interface for peering

policy.go

postgres db backend

templates.go template model interfaces

tls.go -- tls related functions

tools.go -- srndv2 cli tool functions

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func CheckConfig

func CheckConfig()

check for config files generate defaults on demand

func CheckFile

func CheckFile(fname string) bool

func DelFile

func DelFile(fname string)

func EnsureDir

func EnsureDir(dirname string)

ensure a directory exists

func GenFeedsConfig

func GenFeedsConfig() error

generate default feeds.ini

func GenSRNdConfig

func GenSRNdConfig() error

generate default srnd.ini

func HashMessageID

func HashMessageID(msgid string) string

message id hash

func IsDir

func IsDir(dirname string) bool

func NewLineWriter

func NewLineWriter(wr io.Writer, delim string) io.Writer

func OpenFileWriter

func OpenFileWriter(fname string) (io.WriteCloser, error)

func RunModEngine

func RunModEngine(mod ModEngine, regen RegenFunc)

run a mod engine logic mainloop

func ShortHashMessageID

func ShortHashMessageID(msgid string) string

short message id hash >>hash

func ThumbnailTool

func ThumbnailTool()

run thumbnailer with 4 threads

func ValidMessageID

func ValidMessageID(id string) bool

TODO make this work better

func Version

func Version() string

Types

type APIConfig

type APIConfig struct {
	// contains filtered or unexported fields
}

type AdminFunc

type AdminFunc func(param map[string]interface{}) (string, error)

does an action for the administrator takes in json

type ArticleEntry

type ArticleEntry [2]string

a ( MessageID , newsgroup ) tuple

func (ArticleEntry) MessageID

func (self ArticleEntry) MessageID() string

func (ArticleEntry) Newsgroup

func (self ArticleEntry) Newsgroup() string

type ArticleHeaders

type ArticleHeaders map[string][]string

func (ArticleHeaders) Get

func (self ArticleHeaders) Get(key, fallback string) string

func (ArticleHeaders) Has

func (self ArticleHeaders) Has(key string) bool

func (ArticleHeaders) Set

func (self ArticleHeaders) Set(key, val string)

type ArticleStore

type ArticleStore interface {
	MessageReader
	MessageWriter

	// get the filepath for an attachment
	AttachmentFilepath(fname string) string
	// get the filepath for an attachment's thumbnail
	ThumbnailFilepath(fname string) string
	// do we have this article?
	HasArticle(msgid string) bool
	// create a file for a message
	CreateFile(msgid string) io.WriteCloser
	// create a file for a temp message, returns nil if it's already open
	CreateTempFile(msgid string) io.WriteCloser
	// get the filename of a message
	GetFilename(msgid string) string
	// get the filename of a temp message
	GetTempFilename(msgid string) string
	// Get a message given its messageid
	GetMessage(msgid string) NNTPMessage
	// get a temp message given its messageid
	// temp message is deleted once read
	ReadTempMessage(msgid string) NNTPMessage
	// store a post
	StorePost(nntp NNTPMessage) error
	// get article headers only
	GetHeaders(msgid string) ArticleHeaders
	// get our temp directory for articles
	TempDir() string
	// get a list of all the attachments we have
	GetAllAttachments() ([]string, error)
	// generate a thumbnail
	GenerateThumbnail(fname string) error
}

type AttachmentModel

type AttachmentModel interface {
	BaseModel

	Thumbnail() string
	Source() string
	Filename() string
}

for attachments

type AttachmentSaver

type AttachmentSaver interface {
	// save an attachment given its original filename
	// pass in a reader that reads the content of the attachment
	Save(filename string, r io.Reader) error
}

type BaseModel

type BaseModel interface {

	// site url prefix
	Prefix() string

	// render to a writer
	RenderTo(wr io.Writer) error
}

base model type

type BoardModel

type BoardModel interface {
	BaseModel
	NavbarModel

	Frontend() string
	Name() string
	Threads() []ThreadModel

	// JUST update this thread
	// if we don't have it already loaded do nothing
	UpdateThread(message_id string, db Database) BoardModel

	// get a thread model with this id
	// returns nil if we don't have it
	GetThread(message_id string) ThreadModel

	// deprecated, use GetThread
	HasThread(message_id string) bool

	// update the board's contents
	// return the updated model
	Update(db Database) BoardModel
}

board interface for 1 page on a board

type Database

type Database interface {
	Close()
	CreateTables()
	HasNewsgroup(group string) bool
	HasArticle(message_id string) bool
	HasArticleLocal(message_id string) bool
	RegisterNewsgroup(group string)
	RegisterArticle(article NNTPMessage)
	GetAllArticlesInGroup(group string, send chan ArticleEntry)
	GetAllArticles() []ArticleEntry

	// check if a newsgroup is banned
	NewsgroupBanned(group string) (bool, error)

	// ban / unban newsgroup
	BanNewsgroup(group string) error
	UnbanNewsgroup(group string) error

	// delete an entire newsgroup
	// delete from the article store too
	NukeNewsgroup(group string, store ArticleStore)

	// return true if this is root post has expired
	IsExpired(root_message_id string) bool

	// get an article's MessageID given the hash of the MessageID
	// return an article entry or nil when it doesn't exist + and error if it happened
	GetMessageIDByHash(hash string) (ArticleEntry, error)

	// get root message_id, newsgroup, pageno for a post regardless if it's rootpost or not
	GetInfoForMessage(msgid string) (string, string, int64, error)

	// what page is the thread with this root post on?
	// return newsgroup, pageno
	GetPageForRootMessage(root_message_id string) (string, int64, error)

	// record that a message given a message id was posted signed by this pubkey
	RegisterSigned(message_id, pubkey string) error

	// get the number of articles we have
	ArticleCount() int64

	// return true if this thread has any replies
	ThreadHasReplies(root_message_id string) bool

	// get the number of posts in a certain newsgroup since N seconds ago
	// if N <= 0 then count all we have now
	CountPostsInGroup(group string, time_frame int64) int64

	// get all replies to a thread
	// if last > 0 then get that many of the last replies
	GetThreadReplies(root_message_id string, last int) []string

	// count the number of replies to this thread
	CountThreadReplies(root_message_id string) int64

	// get all attachments for this message
	GetPostAttachments(message_id string) []string

	// get all attachments for this message
	GetPostAttachmentModels(prefix, message_id string) []AttachmentModel

	// return true if this newsgroup has posts
	GroupHasPosts(newsgroup string) bool

	// get all active threads on a board
	// send each thread's ArticleEntry down a channel
	GetGroupThreads(newsgroup string, send chan ArticleEntry)

	// get every message id for root posts that need to be expired in a newsgroup
	// threadcount is the upperbound limit to how many root posts we keep
	GetRootPostsForExpiration(newsgroup string, threadcount int) []string

	// get the number of pages a board has
	GetGroupPageCount(newsgroup string) int64

	// get board page number N
	// prefix and frontend are injected
	GetGroupForPage(prefix, frontend, newsgroup string, pageno, perpage int) BoardModel

	// get the root posts of the last N bumped threads in a given newsgroup or globally for ukko
	GetLastBumpedThreads(newsgroup string, threadcount int) []ArticleEntry

	// get the PostModels for replies to a thread
	// prefix is injected into the post models
	GetThreadReplyPostModels(prefix, rootMessageID string, limit int) []PostModel

	// get a post model for a post
	// prefix is injected into the post model
	GetPostModel(prefix, messageID string) PostModel

	// add a public key to the database
	AddModPubkey(pubkey string) error

	// mark that a mod with this pubkey can act on all boards
	MarkModPubkeyGlobal(pubkey string) error

	// revoke mod with this pubkey the privilege of being able to act on all boards
	UnMarkModPubkeyGlobal(pubkey string) error

	// check if this mod pubkey can moderate at a global level
	CheckModPubkeyGlobal(pubkey string) bool

	// check if a mod with this pubkey has permission to moderate at all
	CheckModPubkey(pubkey string) bool

	// check if a mod with this pubkey can moderate on the given newsgroup
	CheckModPubkeyCanModGroup(pubkey, newsgroup string) bool

	// add a pubkey to be able to mod a newsgroup
	MarkModPubkeyCanModGroup(pubkey, newsgroup string) error

	// remote a pubkey to they can't mod a newsgroup
	UnMarkModPubkeyCanModGroup(pubkey, newsgroup string) error

	// ban an article
	BanArticle(messageID, reason string) error

	// check if an article is banned or not
	ArticleBanned(messageID string) bool

	// Get ip address given the encrypted version
	// return emtpy string if we don't have it
	GetIPAddress(encAddr string) (string, error)

	// check if an ip is banned from our local
	CheckIPBanned(addr string) (bool, error)

	// check if an encrypted ip is banned from our local
	CheckEncIPBanned(encAddr string) (bool, error)

	// ban an ip address from the local
	BanAddr(addr string) error

	// unban an ip address from the local
	UnbanAddr(addr string) error

	// ban an encrypted ip address from the remote
	BanEncAddr(encAddr string) error

	// return the encrypted version of an IPAddress
	// if it's not already there insert it into the database
	GetEncAddress(addr string) (string, error)

	// get the decryption key for an encrypted address
	// return empty string if we don't have it
	GetEncKey(encAddr string) (string, error)

	// delete an article from the database
	DeleteArticle(msg_id string) error

	// detele the existance of a thread from the threads table, does NOT remove replies
	DeleteThread(root_msg_id string) error

	// get threads per page for a newsgroup
	GetThreadsPerPage(group string) (int, error)

	// get pages per board for a newsgroup
	GetPagesPerBoard(group string) (int, error)

	// get every newsgroup we know of
	GetAllNewsgroups() []string

	// get all post models in a newsgroup
	// ordered from oldest to newest
	GetPostsInGroup(group string) ([]PostModel, error)

	// get the numerical id of the last , first article for a given group
	GetLastAndFirstForGroup(group string) (int64, int64, error)

	// get a message id give a newsgroup and the nntp id
	GetMessageIDForNNTPID(group string, id int64) (string, error)
}

func NewDatabase

func NewDatabase(db_type, schema, host, port, user, password string) Database

func NewPostgresDatabase

func NewPostgresDatabase(host, port, user, password string) Database

type ExpirationCore

type ExpirationCore interface {
	// do expiration for a group
	ExpireGroup(newsgroup string, keep int)
	// Delete a single post and all children
	DeletePost(messageID string)
	// run our mainloop
	Mainloop()
}

content expiration interface

type FeedConfig

type FeedConfig struct {
	// contains filtered or unexported fields
}

type FeedPolicy

type FeedPolicy struct {
	// contains filtered or unexported fields
}

func (*FeedPolicy) AllowsNewsgroup

func (self *FeedPolicy) AllowsNewsgroup(newsgroup string) bool

do we allow this newsgroup?

type Frontend

type Frontend interface {

	// channel that is for the nntpd to poll for new posts from this frontend
	NewPostsChan() chan NNTPMessage

	// channel that is for the frontend to pool for new posts from the nntpd
	PostsChan() chan NNTPMessage

	// run mainloop
	Mainloop()

	// do we want posts from a newsgroup?
	AllowNewsgroup(group string) bool

	// trigger a manual regen of indexes for a root post
	Regen(msg ArticleEntry)
}

frontend interface for any type of frontend

func MuxFrontends

func MuxFrontends(fronts ...Frontend) Frontend

func NewHTTPFrontend

func NewHTTPFrontend(daemon *NNTPDaemon, config map[string]string, url string) Frontend

create a new http based frontend

func NewNNTPFrontend

func NewNNTPFrontend(d *NNTPDaemon, bindaddr string) Frontend

type GroupModel

type GroupModel []BoardModel

newsgroup model every page on a newsgroup

func (GroupModel) Update

func (self GroupModel) Update(page int, db Database) GroupModel

update a certain page does nothing if out of bounds

func (GroupModel) UpdateAll

func (self GroupModel) UpdateAll(db Database) GroupModel

TODO: optimize using 1 query? update every page return updated model

type LinkModel

type LinkModel interface {
	Text() string
	LinkURL() string
}

type MessageReader

type MessageReader interface {
	// read a message from a reader
	ReadMessage(r io.Reader) (NNTPMessage, error)
}

type MessageWriter

type MessageWriter interface {
	// write a message to a writer
	WriteMessage(nntp NNTPMessage, wr io.Writer) error
}

type ModEngine

type ModEngine interface {
	// chan to send the mod engine posts
	// assumes ctl newsgroup only
	MessageChan() chan NNTPMessage

	// delete post of a poster
	DeletePost(msgid string, regen RegenFunc) error
	// ban a cidr
	BanAddress(cidr string) error
	// do we allow this public key to delete?
	AllowDelete(pubkey string) bool
	// do we allow this public key to ban?
	AllowBan(pubkey string) bool
}

type ModEvent

type ModEvent interface {
	// turn it into a string for putting into an article
	String() string
	// what type of mod event
	Action() string
	// what reason for the event
	Reason() string
	// what is the event acting on
	Target() string
	// scope of the event, regex of newsgroup
	Scope() string
	// when this mod event expires, unix nano
	Expires() int64
}

func ParseModEvent

func ParseModEvent(line string) ModEvent

type ModMessage

type ModMessage []ModEvent

moderation message wraps multiple mod events is turned into an NNTPMessage later

func (ModMessage) WriteTo

func (self ModMessage) WriteTo(wr io.Writer, delim []byte) (err error)

write this mod message's body

type ModUI

type ModUI interface {

	// channel for daemon to poll for nntp articles from the mod ui
	MessageChan() chan NNTPMessage

	// check if this key is allowed to access
	// return true if it can otherwise false
	CheckKey(privkey string) (bool, error)

	// serve the base page
	ServeModPage(wr http.ResponseWriter, r *http.Request)
	// handle a login POST request
	HandleLogin(wr http.ResponseWriter, r *http.Request)
	// handle a delete article request
	HandleDeletePost(wr http.ResponseWriter, r *http.Request)
	// handle a ban address request
	HandleBanAddress(wr http.ResponseWriter, r *http.Request)
	// handle an unban address request
	HandleUnbanAddress(wr http.ResponseWriter, r *http.Request)
	// handle add a pubkey
	HandleAddPubkey(wr http.ResponseWriter, r *http.Request)
	// handle removing a pubkey
	HandleDelPubkey(wr http.ResponseWriter, r *http.Request)
	// handle key generation
	HandleKeyGen(wr http.ResponseWriter, r *http.Request)
	// handle admin command
	HandleAdminCommand(wr http.ResponseWriter, r *http.Request)
}

interface for moderation ui

type NNTPAttachment

type NNTPAttachment interface {
	// the name of the file
	Filename() string
	// the filepath to the saved file
	Filepath() string
	// the mime type of the attachment
	Mime() string
	// the file extension of the attachment
	Extension() string
	// write this attachment out to a writer
	WriteTo(wr io.Writer) error
	// get the sha512 hash of the attachment
	Hash() []byte
	// do we need to generate a thumbnail?
	NeedsThumbnail() bool
	// mime header
	Header() textproto.MIMEHeader
	// make into a model
	ToModel(prefix string) AttachmentModel
}

type NNTPDaemon

type NNTPDaemon struct {
	// contains filtered or unexported fields
}

func (NNTPDaemon) End

func (self NNTPDaemon) End()

func (NNTPDaemon) Run

func (self NNTPDaemon) Run()

run daemon

func (NNTPDaemon) Setup

func (self NNTPDaemon) Setup() NNTPDaemon

type NNTPMessage

type NNTPMessage interface {
	// this message's messsge id
	MessageID() string
	// the parent message's messageid if it's specified
	Reference() string
	// the newsgroup this post is in
	Newsgroup() string
	// the name of the poster
	Name() string
	// any email address associated with the post
	Email() string
	// the subject of the post
	Subject() string
	// when this was posted
	Posted() int64
	// the path header
	Path() string
	// append something to path
	// return message with new path
	AppendPath(part string) NNTPMessage
	// the type of this message usually a mimetype
	ContentType() string
	// was this post a sage?
	Sage() bool
	// was this post a root post?
	OP() bool
	// all attachments
	Attachments() []NNTPAttachment
	// all headers
	Headers() ArticleHeaders
	// write out everything
	WriteTo(wr io.Writer, delim string) error
	// write out body
	WriteBody(wr io.Writer, delim string) error
	// attach a file
	Attach(att NNTPAttachment) NNTPMessage
	// get the plaintext message if it exists
	Message() string
	// pack the whole message and prepare for write
	Pack()
	// get the inner nntp article that is signed and valid, returns nil if not present or invalid
	Signed() NNTPMessage
	// get the pubkey for this message if it was signed, otherwise empty string
	Pubkey() string
	// get the origin encrypted address, i2p destination or empty string for onion posters
	Addr() string
}
type NavbarModel interface {
	Navbar() string
}

interface for models that have a navbar

type PostModel

type PostModel interface {
	BaseModel

	CSSClass() string

	MessageID() string
	PostHash() string
	ShortHash() string
	PostURL() string
	Frontend() string
	Subject() string
	Name() string
	Date() string
	OP() bool
	Attachments() []AttachmentModel
	Board() string
	Sage() bool
	Pubkey() string
	Reference() string

	RenderBody() string
	RenderPost() string

	IsI2P() bool
	IsTor() bool
	IsClearnet() bool

	// truncate body to a certain size
	// return copy
	Truncate() PostModel
}

for individual posts

func PostModelFromMessage

func PostModelFromMessage(parent, prefix string, nntp NNTPMessage) PostModel

type PostgresDatabase

type PostgresDatabase struct {
	// contains filtered or unexported fields
}

func (PostgresDatabase) AddModPubkey

func (self PostgresDatabase) AddModPubkey(pubkey string) error

func (PostgresDatabase) ArticleBanned

func (self PostgresDatabase) ArticleBanned(messageID string) (result bool)

func (PostgresDatabase) ArticleCount

func (self PostgresDatabase) ArticleCount() (count int64)

count articles we have

func (PostgresDatabase) BanAddr

func (self PostgresDatabase) BanAddr(addr string) (err error)

func (PostgresDatabase) BanArticle

func (self PostgresDatabase) BanArticle(messageID, reason string) error

func (PostgresDatabase) BanEncAddr

func (self PostgresDatabase) BanEncAddr(encaddr string) (err error)

func (PostgresDatabase) BanNewsgroup

func (self PostgresDatabase) BanNewsgroup(group string) (err error)

func (PostgresDatabase) CheckEncIPBanned

func (self PostgresDatabase) CheckEncIPBanned(encaddr string) (banned bool, err error)

func (PostgresDatabase) CheckIPBanned

func (self PostgresDatabase) CheckIPBanned(addr string) (banned bool, err error)

func (PostgresDatabase) CheckModPubkey

func (self PostgresDatabase) CheckModPubkey(pubkey string) bool

func (PostgresDatabase) CheckModPubkeyCanModGroup

func (self PostgresDatabase) CheckModPubkeyCanModGroup(pubkey, newsgroup string) bool

func (PostgresDatabase) CheckModPubkeyGlobal

func (self PostgresDatabase) CheckModPubkeyGlobal(pubkey string) bool

func (PostgresDatabase) Close

func (self PostgresDatabase) Close()

finalize all transactions close database connections

func (PostgresDatabase) CountPostsInGroup

func (self PostgresDatabase) CountPostsInGroup(newsgroup string, time_frame int64) (result int64)

func (PostgresDatabase) CountThreadReplies

func (self PostgresDatabase) CountThreadReplies(root_message_id string) (repls int64)

func (PostgresDatabase) CreateTables

func (self PostgresDatabase) CreateTables()

func (PostgresDatabase) DeleteArticle

func (self PostgresDatabase) DeleteArticle(msgid string) (err error)

func (PostgresDatabase) DeleteThread

func (self PostgresDatabase) DeleteThread(msgid string) (err error)

func (PostgresDatabase) GetAllArticles

func (self PostgresDatabase) GetAllArticles() (articles []ArticleEntry)

get all articles send result down a channel

func (PostgresDatabase) GetAllArticlesInGroup

func (self PostgresDatabase) GetAllArticlesInGroup(group string, recv chan ArticleEntry)

get all articles in a newsgroup send result down a channel

func (PostgresDatabase) GetAllNewsgroups

func (self PostgresDatabase) GetAllNewsgroups() (groups []string)

func (PostgresDatabase) GetEncAddress

func (self PostgresDatabase) GetEncAddress(addr string) (encaddr string, err error)

func (PostgresDatabase) GetEncKey

func (self PostgresDatabase) GetEncKey(encAddr string) (enckey string, err error)

func (PostgresDatabase) GetGroupForMessage

func (self PostgresDatabase) GetGroupForMessage(message_id string) (group string, err error)

func (PostgresDatabase) GetGroupForPage

func (self PostgresDatabase) GetGroupForPage(prefix, frontend, newsgroup string, pageno, perpage int) BoardModel

only fetches root posts does not update the thread contents

func (PostgresDatabase) GetGroupPageCount

func (self PostgresDatabase) GetGroupPageCount(newsgroup string) int64

func (PostgresDatabase) GetGroupThreads

func (self PostgresDatabase) GetGroupThreads(group string, recv chan ArticleEntry)

func (PostgresDatabase) GetIPAddress

func (self PostgresDatabase) GetIPAddress(encaddr string) (addr string, err error)

func (PostgresDatabase) GetInfoForMessage

func (self PostgresDatabase) GetInfoForMessage(msgid string) (root string, newsgroup string, page int64, err error)

func (PostgresDatabase) GetLastAndFirstForGroup

func (self PostgresDatabase) GetLastAndFirstForGroup(group string) (last, first int64, err error)

func (PostgresDatabase) GetLastBumpedThreads

func (self PostgresDatabase) GetLastBumpedThreads(newsgroup string, threads int) (roots []ArticleEntry)

func (PostgresDatabase) GetMessageIDByHash

func (self PostgresDatabase) GetMessageIDByHash(hash string) (article ArticleEntry, err error)

func (PostgresDatabase) GetMessageIDForNNTPID

func (self PostgresDatabase) GetMessageIDForNNTPID(group string, id int64) (msgid string, err error)

func (PostgresDatabase) GetPageForRootMessage

func (self PostgresDatabase) GetPageForRootMessage(root_message_id string) (group string, page int64, err error)

func (PostgresDatabase) GetPagesPerBoard

func (self PostgresDatabase) GetPagesPerBoard(group string) (int, error)

func (PostgresDatabase) GetPostAttachmentModels

func (self PostgresDatabase) GetPostAttachmentModels(prefix, messageID string) (atts []AttachmentModel)

func (PostgresDatabase) GetPostAttachments

func (self PostgresDatabase) GetPostAttachments(messageID string) (atts []string)

func (PostgresDatabase) GetPostModel

func (self PostgresDatabase) GetPostModel(prefix, messageID string) PostModel

func (PostgresDatabase) GetPostsInGroup

func (self PostgresDatabase) GetPostsInGroup(newsgroup string) (models []PostModel, err error)

func (PostgresDatabase) GetRootPostsForExpiration

func (self PostgresDatabase) GetRootPostsForExpiration(newsgroup string, threadcount int) (roots []string)

func (PostgresDatabase) GetThreadReplies

func (self PostgresDatabase) GetThreadReplies(rootpost string, limit int) (repls []string)

func (PostgresDatabase) GetThreadReplyPostModels

func (self PostgresDatabase) GetThreadReplyPostModels(prefix, rootpost string, limit int) (repls []PostModel)

func (PostgresDatabase) GetThreadsPerPage

func (self PostgresDatabase) GetThreadsPerPage(group string) (int, error)

func (PostgresDatabase) GroupHasPosts

func (self PostgresDatabase) GroupHasPosts(group string) bool

func (PostgresDatabase) HasArticle

func (self PostgresDatabase) HasArticle(message_id string) bool

check if an article exists

func (PostgresDatabase) HasArticleLocal

func (self PostgresDatabase) HasArticleLocal(message_id string) bool

check if an article exists locally

func (PostgresDatabase) HasNewsgroup

func (self PostgresDatabase) HasNewsgroup(group string) bool

check if a newsgroup exists

func (PostgresDatabase) IsExpired

func (self PostgresDatabase) IsExpired(root_message_id string) bool

func (PostgresDatabase) MarkModPubkeyCanModGroup

func (self PostgresDatabase) MarkModPubkeyCanModGroup(pubkey, group string) (err error)

func (PostgresDatabase) MarkModPubkeyGlobal

func (self PostgresDatabase) MarkModPubkeyGlobal(pubkey string) (err error)

func (PostgresDatabase) NewsgroupBanned

func (self PostgresDatabase) NewsgroupBanned(group string) (banned bool, err error)

func (PostgresDatabase) NukeNewsgroup

func (self PostgresDatabase) NukeNewsgroup(group string, store ArticleStore)

func (PostgresDatabase) RegisterArticle

func (self PostgresDatabase) RegisterArticle(message NNTPMessage)

register a message with the database

func (PostgresDatabase) RegisterNewsgroup

func (self PostgresDatabase) RegisterNewsgroup(group string)

register a new newsgroup

func (PostgresDatabase) RegisterSigned

func (self PostgresDatabase) RegisterSigned(message_id, pubkey string) (err error)

func (PostgresDatabase) ThreadHasReplies

func (self PostgresDatabase) ThreadHasReplies(rootpost string) bool

func (PostgresDatabase) UnMarkModPubkeyCanModGroup

func (self PostgresDatabase) UnMarkModPubkeyCanModGroup(pubkey, group string) (err error)

func (PostgresDatabase) UnMarkModPubkeyGlobal

func (self PostgresDatabase) UnMarkModPubkeyGlobal(pubkey string) (err error)

func (PostgresDatabase) UnbanAddr

func (self PostgresDatabase) UnbanAddr(addr string) (err error)

assumes it is there

func (PostgresDatabase) UnbanNewsgroup

func (self PostgresDatabase) UnbanNewsgroup(group string) (err error)

type RegenFunc

type RegenFunc func(newsgroup, msgid, root string, page int)

regenerate pages function

type SRNdConfig

type SRNdConfig struct {
	// contains filtered or unexported fields
}

func ReadConfig

func ReadConfig() *SRNdConfig

read config files

func (*SRNdConfig) Validate

func (self *SRNdConfig) Validate()

fatals on failed validation

type ThreadModel

type ThreadModel interface {
	BaseModel
	NavbarModel

	OP() PostModel
	Replies() []PostModel
	Board() string
	BoardURL() string
	// return a short version of the thread
	// does not include all replies
	Truncate() ThreadModel
	// update the thread's replies
	// return the updated model
	Update(db Database) ThreadModel
}

for threads

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL