Documentation ¶
Overview ¶
Package internal contains code that is not exposed to the outside world.
It contains functions for deleting a feed, and for creating a new feed.
Index ¶
- Constants
- Variables
- func AvailableFeatures() []string
- func BaseFromURL(uri string) string
- func CORSMiddleware(next httprouter.Handle) httprouter.Handle
- func ChunkTwts(twts types.Twts, chunkSize int) []types.Twts
- func CleanTwt(text string) string
- func CmdExists(cmd string) bool
- func CreateFeed(conf *Config, db Store, user *User, name string, force bool) error
- func CustomRelTime(a, b time.Time, albl, blbl string) string
- func CustomTime(then time.Time) string
- func DecodeHash(hash string) ([]byte, error)
- func DeleteFeed(conf *Config, archive Archiver, cache *Cache, db Store, name string) error
- func DeleteLastTwt(conf *Config, user *User) error
- func DeleteUser(conf *Config, archive Archiver, cache *Cache, db Store, username string) error
- func DivMod(n, d int) (q, r int)
- func DownloadImage(conf *Config, url string, resource, name string, opts *ImageOptions) (string, error)
- func ExtractHashFromSubject(subject string) string
- func FastHash(data []byte) string
- func FastHashFile(fn string) (string, error)
- func FastHashString(s string) string
- func FeedExists(conf *Config, username string) bool
- func FileExists(name string) bool
- func FilterTwtsBy(twts types.Twts, filters ...FilterFunc) (res types.Twts)
- func FirstNTwts(twts types.Twts, n int) types.Twts
- func FirstTwt(twts types.Twts) types.Twt
- func FormatForDateTime(t time.Time, timeFormat string) string
- func FormatMentionsAndTags(conf *Config, text string, format TwtTextFormat) string
- func FormatRequest(r *http.Request) string
- func FormatTwtContextFactory(conf *Config, cache *Cache, archive Archiver) func(twt types.Twt, u *User) template.HTML
- func FormatTwtFactory(conf *Config, cache *Cache, archive Archiver) func(types.Twt, types.TwtTextFormat, *User) template.HTML
- func GenerateAvatar(conf *Config, domainNick string) (image.Image, error)
- func GenerateRandomToken() string
- func GenerateWhoFollowsToken(feedurl string) string
- func GetAllFeeds(conf *Config) ([]string, error)
- func GetAllTwts(conf *Config, name string) (types.Twts, error)
- func GetArchivedFeeds(conf *Config, feed string) ([]string, error)
- func GetConvLength(conf *Config, cache *Cache, archive Archiver) func(twt types.Twt, u *User) int
- func GetExternalAvatar(conf *Config, twter types.Twter)
- func GetFeedCount(conf *Config, name string) (int, error)
- func GetFeedTypeClass(conf *Config, cache *Cache) func(uri string) string
- func GetForkLength(conf *Config, cache *Cache, archive Archiver) func(twt types.Twt, u *User) int
- func GetLastTwt(conf *Config, twter types.Twter) (twt types.Twt, offset int, err error)
- func GetLastTwtFrom(conf *Config, twter types.Twter, fn string) (twt types.Twt, offset int, err error)
- func GetLookupMatches(conf *Config, nick string, uri string) (avatar, domain string)
- func GetMediaNamesFromText(text string) []string
- func GetOrMigrateUserPasswordHash(db Store, user *User) []byte
- func GetPreviousArchivedFeed(conf *Config, twter types.Twter, feed, fn string) (string, error)
- func GetRootTwtFactory(conf *Config, cache *Cache, archive Archiver) func(twt types.Twt, u *User) types.Twt
- func GetTwtConvSubjectHash(cache *Cache, archive Archiver, twt types.Twt) (string, string)
- func GroupByFeed(twt types.Twt) []string
- func GroupBySubject(twt types.Twt) []string
- func GroupByTag(twt types.Twt) (res []string)
- func GroupTwtsBy(twts types.Twts, g GroupFunc) (res map[string]types.Twts)
- func HasExternalAvatarChanged(conf *Config, twter types.Twter) bool
- func HasString(a []string, x string) bool
- func HostnameFromURL(uri string) string
- func Indent(text, indent string) string
- func InitJobs(conf *Config)
- func IntPow(x, y int) int
- func IsAdminUserFactory(conf *Config) func(user *User) bool
- func IsAudio(fn string) bool
- func IsFeatureEnabled(fs *FeatureFlags, name string) bool
- func IsGifImage(fn string) bool
- func IsImage(fn string) bool
- func IsLocalURLFactory(conf *Config) func(url string) bool
- func IsSpecialFeed(feed string) bool
- func IsVideo(fn string) bool
- func LastSeenRelTime(a, b time.Time, albl, blbl string) string
- func LastSeenTime(then time.Time) string
- func LastTwt(twts types.Twts) types.Twt
- func LineCount(r io.Reader) (int, error)
- func MapKeys[K comparable, V any](kv map[K]V) []K
- func MapStrings(xs []string, f func(s string) string) []string
- func MapValues[K comparable, V any](kv map[K]V) []V
- func MemoryUsage() string
- func MergeFeed(conf *Config, feed string, body []byte, delete bool) (types.Twts, error)
- func MergeFollowers(old, new types.Followers) types.Followers
- func NewCachedFeedLookup(cache *Cache) types.FeedLookup
- func NewLocalFeedLookup(conf *Config, db Store) types.FeedLookup
- func NewMultiFeedLookup(feedLookupFns ...types.FeedLookup) types.FeedLookup
- func NewRemoteFeedLookup(conf *Config) types.FeedLookup
- func NewSessionStore(store Store, sessionCacheTTL time.Duration) sessions.Store
- func NewStats(name string) *expvar.Map
- func NewUserCreator(config *Config, db Store) auth.UserCreator
- func NewUserFollowedAsFeedLookup(user *User) types.FeedLookup
- func NewWebFingerResolver(conf *Config, db Store) webfinger.Resolver
- func NormalizeFeedName(name string) string
- func NormalizeURL(url string) string
- func NormalizeUsername(username string) string
- func ParseArchivedFeedIds(fns []string) ([]int, error)
- func PreprocessMedia(user *User, conf *Config, u *url.URL, title, alt, renderAs string, ...) string
- func PrettyURL(uri string) string
- func ProcessImage(conf *Config, ifn string, resource, name string, opts *ImageOptions) (string, error)
- func ReadArchivedTwt(p string) (types.Twt, error)
- func ReadFeedPreamble(fn string) string
- func ReceiveAudio(r io.Reader, maxLimit int64) (string, error)
- func ReceiveImage(r io.Reader, maxLimit int64) (string, error)
- func ReceiveVideo(r io.Reader, maxLimit int64) (string, error)
- func RedirectRefererURL(r *http.Request, conf *Config, defaultURL string) string
- func RemoveString(xs []string, e string) []string
- func RenderAudio(conf *Config, uri, title, renderAs string, full bool) string
- func RenderCSS(css string) (template.CSS, error)
- func RenderHTML(tpl string, ctx *Context) (string, error)
- func RenderImage(user *User, conf *Config, uri, caption, alt, renderAs string, full bool) string
- func RenderJS(js string) (template.JS, error)
- func RenderLogo(logo string, podName string) (template.HTML, error)
- func RenderPlainText(tpl string, ctx interface{}) (string, error)
- func RenderVideo(conf *Config, uri, title, renderAs string, full bool) string
- func ReplaceExt(fn, newExt string) string
- func ReplaceTwt(conf *Config, user *User, toReplace, replaceWith types.Twt) error
- func RequestGemini(conf *Config, uri string) (*gemini.Response, error)
- func RequestGopher(conf *Config, uri string) (*gopher.Response, error)
- func RequestHTTP(conf *Config, method, url string, headers http.Header) (*http.Response, error)
- func ResizeGif(srcFile string, width int, height int) (*gif.GIF, error)
- func ResourceExists(conf *Config, url string) bool
- func RewriteFeed(fn string, twts types.Twts, f FilterTwt) error
- func RotateFeed(conf *Config, feed string) error
- func RunCmd(timeout time.Duration, command string, args ...string) error
- func SafeParseInt(s string, d int) int
- func SaveFeedSources(feedsources *FeedSources, path string) error
- func SaveGif(gifImg *gif.GIF, desFile string) error
- func SendCandidatesForDeletionEmail(conf *Config, candidates []DeletionCandidate) error
- func SendEmail(conf *Config, recipients []string, replyTo, subject string, body string) error
- func SendMagicLinkAuthEmail(conf *Config, user *User, email, token string) error
- func SendNewUserEmail(conf *Config, username string) error
- func SendPasswordResetEmail(conf *Config, user *User, email, token string) error
- func SendReportAbuseEmail(conf *Config, nick, url, name, email, category, message string) error
- func SendSupportRequestEmail(conf *Config, name, email, subject, message string) error
- func Slugify(uri string) string
- func StoreUploadedImage(conf *Config, r io.Reader, resource, name string, opts *ImageOptions) (string, error)
- func TextWithEllipsis(text string, maxLength int) string
- func TranscodeAudio(conf *Config, ifn string, resource, name string, opts *AudioOptions) (string, error)
- func TranscodeVideo(conf *Config, ifn string, resource, name string, opts *VideoOptions) (string, error)
- func TwtMatchesAll(twt types.Twt, filters []FilterFunc) bool
- func URLForAvatar(baseURL, username, avatarHash string) string
- func URLForConvFactory(conf *Config, cache *Cache, archive Archiver) func(twt types.Twt) string
- func URLForExternalAvatar(conf *Config, uri string) string
- func URLForExternalProfile(conf *Config, nick, uri string) string
- func URLForFollowers(baseURL, username string) string
- func URLForFollowing(baseURL, username string) string
- func URLForForkFactory(conf *Config, cache *Cache, archive Archiver) func(twt types.Twt) string
- func URLForInbox(baseURL, username string) string
- func URLForMedia(baseURL, name string) string
- func URLForOutbox(baseURL, username string) string
- func URLForPage(baseURL, page string) string
- func URLForRootConvFactory(conf *Config, cache *Cache, archive Archiver, withPager bool) func(twt types.Twt, user *User) string
- func URLForTag(baseURL, tag string) string
- func URLForTag2(baseURL, tag string) string
- func URLForTask(baseURL, uuid string) string
- func URLForTwt(baseURL, hash string) string
- func URLForUser(baseURL, username string) string
- func URLForWhoFollows(baseURL string, feed types.FetchFeedRequest, feedFollowers int) string
- func UniqStrings(xs []string) []string
- func UniqTwts(twts types.Twts) (res types.Twts)
- func UniqueKeyFor(kv map[string]string, k string) string
- func UnparseTwtFactory(conf *Config, cache *Cache, archive Archiver) func(twt types.Twt) string
- func UserURL(url string) string
- func ValidateFeed(conf *Config, profile types.Profile, uri string) (*types.Twter, error)
- func ValidateFeedName(path string, name string) error
- func ValidateIndieRedirectURL(clientID, redirectURI string) error
- func ValidateUsername(username string) error
- func WebMention(target, source string) error
- type API
- func (a *API) AdminDeleteFeedEndpoint() httprouter.Handle
- func (a *API) AdminDeleteUserEndpoint() httprouter.Handle
- func (a *API) AuthEndpoint() httprouter.Handle
- func (a *API) CacheDelete() httprouter.Handle
- func (a *API) CacheReset() httprouter.Handle
- func (a *API) ConversationEndpoint() httprouter.Handle
- func (a *API) CreateToken(user *User, r *http.Request) (*Token, error)
- func (a *API) DebugCacheEndpoint() httprouter.Handle
- func (a *API) DebugDBEndpoint() httprouter.Handle
- func (a *API) DebugHeapEndpoint() httprouter.Handle
- func (a *API) DebugWebSubEndpoint() httprouter.Handle
- func (a *API) DiscoverEndpoint() httprouter.Handle
- func (a *API) ExternalProfileEndpoint() httprouter.Handle
- func (a *API) FetchTwtsEndpoint() httprouter.Handle
- func (a *API) FollowEndpoint() httprouter.Handle
- func (a *API) MentionsEndpoint() httprouter.Handle
- func (a *API) MuteEndpoint() httprouter.Handle
- func (a *API) OldUploadMediaEndpoint() httprouter.Handle
- func (a *API) PingEndpoint() httprouter.Handle
- func (a *API) PodConfigEndpoint() httprouter.Handle
- func (a *API) PostEndpoint() httprouter.Handle
- func (a *API) ProfileEndpoint() httprouter.Handle
- func (a *API) RegisterEndpoint() httprouter.Handle
- func (a *API) ReportEndpoint() httprouter.Handle
- func (a *API) SettingsEndpoint() httprouter.Handle
- func (a *API) SupportEndpoint() httprouter.Handle
- func (a *API) SyncEndpoint() httprouter.Handle
- func (a *API) TimelineEndpoint() httprouter.Handle
- func (a *API) UnfollowEndpoint() httprouter.Handle
- func (a *API) UnmuteEndpoint() httprouter.Handle
- func (a *API) UploadMediaEndpoint() httprouter.Handle
- func (a *API) WhoAmIEndpoint() httprouter.Handle
- type ActiveUsersJob
- type Alternative
- type Alternatives
- type AppendTwtFunc
- type Archiver
- type AudioOptions
- type AudioTask
- type BitcaskStore
- func (bs *BitcaskStore) Backup(fn string) error
- func (bs *BitcaskStore) Close() error
- func (bs *BitcaskStore) DB() *bitcask.Bitcask
- func (bs *BitcaskStore) DelFeed(name string) error
- func (bs *BitcaskStore) DelSession(sid string) error
- func (bs *BitcaskStore) DelUser(username string) error
- func (bs *BitcaskStore) GetAllFeeds() ([]*Feed, error)
- func (bs *BitcaskStore) GetAllSessions() ([]*sessions.Session, error)
- func (bs *BitcaskStore) GetAllUsers() ([]*User, error)
- func (bs *BitcaskStore) GetFeed(name string) (*Feed, error)
- func (bs *BitcaskStore) GetSession(sid string) (*sessions.Session, error)
- func (bs *BitcaskStore) GetUser(username string) (*User, error)
- func (bs *BitcaskStore) HasFeed(name string) bool
- func (bs *BitcaskStore) HasSession(sid string) bool
- func (bs *BitcaskStore) HasUser(username string) bool
- func (bs *BitcaskStore) LenFeeds() int64
- func (bs *BitcaskStore) LenSessions() int64
- func (bs *BitcaskStore) LenUsers() int64
- func (bs *BitcaskStore) Merge() error
- func (bs *BitcaskStore) Restore(fn string) error
- func (bs *BitcaskStore) SearchFeeds(prefix string) []string
- func (bs *BitcaskStore) SearchUsers(prefix string) []string
- func (bs *BitcaskStore) SetFeed(name string, feed *Feed) error
- func (bs *BitcaskStore) SetSession(sid string, sess *sessions.Session) error
- func (bs *BitcaskStore) SetUser(username string, user *User) error
- func (bs *BitcaskStore) Sync() error
- func (bs *BitcaskStore) SyncSession(sess *sessions.Session) error
- type Cache
- func (cache *Cache) Converge(archive Archiver)
- func (cache *Cache) DeleteFeed(uri string)
- func (cache *Cache) DeleteFeeds(feeds types.FetchFeedRequests)
- func (cache *Cache) DeletePeer(uri string)
- func (cache *Cache) DeleteUserViews(u *User)
- func (cache *Cache) DetectClientFromRequest(req *http.Request, profile types.Profile) error
- func (cache *Cache) DetectClientFromResponse(res *http.Response) error
- func (cache *Cache) DetectPodFromUserAgent(ua TwtxtUserAgent) error
- func (cache *Cache) FeedCount() int
- func (cache *Cache) FetchFeeds(conf *Config, archive Archiver, index *Index, feeds types.FetchFeedRequests, ...)
- func (cache *Cache) FindTwter(s string) (found *types.Twter)
- func (cache *Cache) FollowedBy(user *User, uri string) bool
- func (cache *Cache) GetAll(refresh bool) types.Twts
- func (cache *Cache) GetByURL(u *User, url string, fffs ...FilterFuncFactory) types.Twts
- func (cache *Cache) GetByUser(u *User, refresh bool, fffs ...FilterFuncFactory) types.Twts
- func (cache *Cache) GetByUserView(u *User, view string, refresh bool, fffs ...FilterFuncFactory) types.Twts
- func (cache *Cache) GetByView(key string) types.Twts
- func (cache *Cache) GetCachedFeed(url string) *Cached
- func (cache *Cache) GetFollowerByURI(user *User, uri string) *types.Follower
- func (cache *Cache) GetFollowers(profile types.Profile) types.Followers
- func (cache *Cache) GetMentions(u *User, refresh bool, fffs ...FilterFuncFactory) types.Twts
- func (cache *Cache) GetOldFollowers(profile types.Profile) map[string]string
- func (cache *Cache) GetOrSetCachedFeed(url string) (*Cached, bool)
- func (cache *Cache) GetPeer(uri string) (*Pod, error)
- func (cache *Cache) GetPeers() (peers Peers)
- func (cache *Cache) GetTwter(uri string) *types.Twter
- func (cache *Cache) InjectFeed(url string, twt types.Twt)
- func (cache *Cache) IsCached(url string) bool
- func (cache *Cache) Lookup(hash string) (types.Twt, bool)
- func (cache *Cache) MarshalJSON() ([]byte, error)
- func (cache *Cache) PruneFollowers(olderThan time.Duration)
- func (cache *Cache) Refresh()
- func (cache *Cache) Reset()
- func (cache *Cache) Save() error
- func (cache *Cache) SetTwter(uri string, twter *types.Twter)
- func (cache *Cache) ShouldRefreshFeed(uri string) bool
- func (cache *Cache) SnipeFeed(url string, twt types.Twt)
- func (cache *Cache) TrustPeer(uri string, trusted bool) error
- func (cache *Cache) TrustedPeerCount() int
- func (cache *Cache) TwtCount() int
- func (cache *Cache) UpdateFeed(url, lastmodified string, twts types.Twts)
- type Cached
- func (cached *Cached) Availability() float64
- func (cached *Cached) GetLastFetched() time.Time
- func (cached *Cached) GetLastModified() string
- func (cached *Cached) GetTwts() types.Twts
- func (cached *Cached) IncFetches()
- func (cached *Cached) Inject(twt types.Twt)
- func (cached *Cached) SetError(err error)
- func (cached *Cached) SetLastFetched()
- func (cached *Cached) Snipe(twt types.Twt)
- func (cached *Cached) Update(lastModified string, twts types.Twts)
- type CandidatesByScore
- type CandidatesForDeletionEmailContext
- type Config
- func (c *Config) BlockedFeed(uri string) bool
- func (c *Config) ExternalURL(nick, uri string) string
- func (c *Config) IsLocalURL(url string) bool
- func (c *Config) IsShadowed(uri string) bool
- func (c *Config) LocalURL() *url.URL
- func (c *Config) PermittedImage(domain string) (bool, bool)
- func (c *Config) RandomTwtPrompt() string
- func (c *Config) RequestTimeout() time.Duration
- func (c *Config) Settings() *Settings
- func (c *Config) TemplatesFS() fs.FS
- func (c *Config) URLForAvatar(name, hash string) string
- func (c *Config) URLForMedia(name string) string
- func (c *Config) URLForTag(tag string) string
- func (c *Config) URLForUser(user string) string
- func (c *Config) UserURL(url string) string
- func (c *Config) Validate() error
- type Context
- type ContextKey
- type CreateAdminFeedsJob
- type DeleteOldSessionsJob
- type DeletionCandidate
- type DiskArchiver
- func (a *DiskArchiver) Archive(twt types.Twt, overwrite bool) error
- func (a *DiskArchiver) Count() int64
- func (a *DiskArchiver) Del(hash string) error
- func (a *DiskArchiver) Get(hash string) (types.Twt, error)
- func (a *DiskArchiver) Has(hash string) bool
- func (a *DiskArchiver) Walk() <-chan types.Twt
- type DummyArchiver
- type EmbedRule
- type ErrAudioUploadFailed
- type ErrCommandFailed
- type ErrCommandKilled
- type ErrTranscodeFailed
- type ErrTranscodeTimeout
- type ErrVideoUploadFailed
- type FeatureFlags
- func (f *FeatureFlags) AsStrings() []string
- func (f *FeatureFlags) Disable(feature FeatureType)
- func (f *FeatureFlags) DisableAll(features []FeatureType)
- func (f *FeatureFlags) Enable(feature FeatureType)
- func (f *FeatureFlags) EnableAll(features []FeatureType)
- func (f *FeatureFlags) IsEnabled(feature FeatureType) bool
- func (f *FeatureFlags) MarshalJSON() ([]byte, error)
- func (f *FeatureFlags) MarshalYAML() (interface{}, error)
- func (f *FeatureFlags) Reset()
- func (f *FeatureFlags) String() string
- func (f *FeatureFlags) UnmarshalJSON(b []byte) error
- func (f *FeatureFlags) UnmarshalYAML(unmarshal func(interface{}) error) error
- type FeatureType
- type Feed
- func (f *Feed) AddFollower(nick, uri string)
- func (f *Feed) Bytes() ([]byte, error)
- func (f *Feed) DelFollower(nick, uri string)
- func (f *Feed) FollowedBy(url string) bool
- func (f *Feed) Profile(baseURL string, viewer *User) types.Profile
- func (f *Feed) Source() types.FetchFeedRequests
- func (f *Feed) Twter(conf *Config) types.Twter
- type FeedContext
- type FeedSource
- type FeedSourceMap
- type FeedSources
- type FilterFunc
- func FilterExcludeMe(_ *Cache, u *User) FilterFunc
- func FilterLocalOnly(c *Cache, _ *User) FilterFunc
- func FilterMediaOnly(c *Cache, _ *User) FilterFunc
- func FilterMentionsMe(_ *Cache, u *User) FilterFunc
- func FilterNoBots(c *Cache, _ *User) FilterFunc
- func FilterNoOp(_ *Cache, _ *User) FilterFunc
- func FilterNoRSS(c *Cache, _ *User) FilterFunc
- func FilterNoReplies(c *Cache, u *User) FilterFunc
- func FilterOutFeedsAndBotsFactory(cache *Cache) FilterFunc
- type FilterFuncFactory
- type FilterTwt
- type FilterTwtsFunc
- type FixAdminFeedsJob
- type FrontMatter
- type GroupFunc
- type HApp
- type ImageOptions
- type ImageTask
- type Index
- func (i *Index) Archive(_ types.Twt, overwrite bool) error
- func (i *Index) Batch(batch *index.Batch) error
- func (i *Index) Count() int64
- func (i *Index) Del(_ string) error
- func (i *Index) Get(hash string) (types.Twt, error)
- func (i *Index) Has(hash string) bool
- func (i *Index) Index(twt types.Twt, commit bool) (*bluge.Document, error)
- func (i *Index) Indexed(twt types.Twt) (bool, error)
- func (i *Index) Search(qs string, page int, sortBy []string) (*SearchResult, error)
- func (i *Index) Walk() <-chan types.Twt
- type IndexOption
- type Job
- func NewActiveUsersJob(conf *Config, cache *Cache, index *Index, archive Archiver, db Store) Job
- func NewCreateAdminFeedsJob(conf *Config, cache *Cache, index *Index, archive Archiver, db Store) Job
- func NewDeleteOldSessionsJob(conf *Config, cache *Cache, index *Index, archive Archiver, db Store) Job
- func NewFixAdminFeedsJob(conf *Config, cache *Cache, index *Index, archive Archiver, db Store) Job
- func NewPruneFollowersJob(conf *Config, cache *Cache, index *Index, archive Archiver, db Store) Job
- func NewPruneUsersJob(conf *Config, cache *Cache, index *Index, archive Archiver, db Store) Job
- func NewRotateFeedsJob(conf *Config, cache *Cache, index *Index, archive Archiver, db Store) Job
- func NewSyncStoreJob(conf *Config, cache *Cache, index *Index, archive Archiver, db Store) Job
- func NewUpdateFeedSourcesJob(conf *Config, cache *Cache, index *Index, archive Archiver, db Store) Job
- func NewUpdateFeedsJob(conf *Config, cache *Cache, index *Index, archive Archiver, db Store) Job
- type JobFactory
- type JobSpec
- type Link
- type Links
- type MagicLinkAuthContext
- type Meta
- type Middleware
- type MultiUserAgent
- type NewUserEmailContext
- type Option
- func WithAPISessionTime(duration time.Duration) Option
- func WithAPISigningKey(key string) Option
- func WithAdminEmail(adminEmail string) Option
- func WithAdminName(adminName string) Option
- func WithAdminUser(adminUser string) Option
- func WithAuth(auth string) Option
- func WithAuthHeader(authHeader string) Option
- func WithBaseURL(baseURL string) Option
- func WithBlockedFeeds(blockedFeeds []string) Option
- func WithCookieSecret(secret string) Option
- func WithData(data string) Option
- func WithDebug(debug bool) Option
- func WithDescription(description string) Option
- func WithDisableArchive(disableArchive bool) Option
- func WithDisableFfmpeg(disableFfmpeg bool) Option
- func WithDisableGzip(disableGzip bool) Option
- func WithDisableLogger(disableLogger bool) Option
- func WithDisableMedia(disablemedia bool) Option
- func WithDisableSupport(disableSupport bool) Option
- func WithEmbedRules(embedRules string) Option
- func WithEnabledFeatures(features []FeatureType) Option
- func WithFeedSources(feedSources []string) Option
- func WithFetchInterval(fetchInterval string) Option
- func WithFrontPage(frontpage string) Option
- func WithMagicLinkSecret(secret string) Option
- func WithMaxCacheFetchers(maxCacheFetchers int) Option
- func WithMaxCacheItems(maxCacheItems int) Option
- func WithMaxCacheTTL(maxCacheTTL time.Duration) Option
- func WithMaxFeedSize(size int64) Option
- func WithMaxFetchLimit(limit int64) Option
- func WithMaxTwtLength(maxTwtLength int) Option
- func WithMaxUploadSize(maxUploadSize int64) Option
- func WithName(name string) Option
- func WithOpenProfiles(openProfiles bool) Option
- func WithOpenRegistrations(openRegistrations bool) Option
- func WithPermittedImages(permittedImages []string) Option
- func WithSMTPFrom(from string) Option
- func WithSMTPHost(host string) Option
- func WithSMTPPass(pass string) Option
- func WithSMTPPort(port int) Option
- func WithSMTPUser(user string) Option
- func WithSessionCacheTTL(cacheTTL time.Duration) Option
- func WithSessionExpiry(expiry time.Duration) Option
- func WithStore(store string) Option
- func WithTLS(tls bool) Option
- func WithTLSCert(tlsCert string) Option
- func WithTLSKey(tlsKey string) Option
- func WithTheme(theme string) Option
- func WithTranscoderTimeout(timeout time.Duration) Option
- func WithTwtsPerPage(twtsPerPage int) Option
- type Page
- type PasswordResetEmailContext
- type Peers
- type Pod
- type PodInfo
- type PruneFollowersJob
- type PruneUsersJob
- type ReportAbuseEmailContext
- type Result
- type RotateFeedsJob
- type Router
- func (r *Router) DELETE(path string, handle httprouter.Handle)
- func (r *Router) File(path, name string)
- func (r *Router) GET(path string, handle httprouter.Handle)
- func (r *Router) Group(path string, m ...Middleware) *Router
- func (r *Router) HEAD(path string, handle httprouter.Handle)
- func (r *Router) Handle(method, path string, handle httprouter.Handle)
- func (r *Router) Handler(method, path string, handler http.Handler)
- func (r *Router) HandlerFunc(method, path string, handler http.HandlerFunc)
- func (r *Router) OPTIONS(path string, handle httprouter.Handle)
- func (r *Router) PATCH(path string, handle httprouter.Handle)
- func (r *Router) POST(path string, handle httprouter.Handle)
- func (r *Router) PUT(path string, handle httprouter.Handle)
- func (r *Router) ServeFiles(path string, root http.FileSystem)
- func (r *Router) ServeFilesWithCacheControl(path string, root fs.FS)
- func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request)
- func (r *Router) Static(path, root string)
- func (r *Router) Use(m ...Middleware) *Router
- type SearchResult
- type Server
- func (s *Server) AddCronJob(spec string, job cron.Job) error
- func (s *Server) AddRoute(method, path string, handler http.Handler)
- func (s *Server) AddShutdownHook(f func())
- func (s *Server) AddUserHandler() httprouter.Handle
- func (s *Server) AvatarHandler() httprouter.Handle
- func (s *Server) BookmarkHandler() httprouter.Handle
- func (s *Server) BookmarksHandler() httprouter.Handle
- func (s *Server) CaptchaHandler() httprouter.Handle
- func (s *Server) ConversationHandler() httprouter.Handle
- func (s *Server) DelFeedHandler() httprouter.Handle
- func (s *Server) DelUserHandler() httprouter.Handle
- func (s *Server) DeleteFeedHandler() httprouter.Handle
- func (s *Server) DeleteHandler() httprouter.Handle
- func (s *Server) DeletePeerHandler() httprouter.Handle
- func (s *Server) DeleteTwtHandler() httprouter.Handle
- func (s *Server) DiscoverHandler() httprouter.Handle
- func (s *Server) ExternalAvatarHandler() httprouter.Handle
- func (s *Server) ExternalFollowingHandler() httprouter.Handle
- func (s *Server) ExternalHandler() httprouter.Handle
- func (s *Server) FeedHandler() httprouter.Handle
- func (s *Server) FeedsHandler() httprouter.Handle
- func (s *Server) FollowHandler() httprouter.Handle
- func (s *Server) FollowersHandler() httprouter.Handle
- func (s *Server) FollowingHandler() httprouter.Handle
- func (s *Server) ImportHandler() httprouter.Handle
- func (s *Server) IndieAuthCallbackHandler() httprouter.Handle
- func (s *Server) IndieAuthHandler() httprouter.Handle
- func (s *Server) IndieAuthVerifyHandler() httprouter.Handle
- func (s *Server) ListenAndServe() error
- func (s *Server) LoginEmailHandler() httprouter.Handle
- func (s *Server) LoginHandler() httprouter.Handle
- func (s *Server) LogoutHandler() httprouter.Handle
- func (s *Server) LookupHandler() httprouter.Handle
- func (s *Server) MagicLinkAuthHandler() httprouter.Handle
- func (s *Server) ManageFeedHandler() httprouter.Handle
- func (s *Server) ManageJobsHandler() httprouter.Handle
- func (s *Server) ManagePeersHandler() httprouter.Handle
- func (s *Server) ManagePodHandler() httprouter.Handle
- func (s *Server) ManageUsersHandler() httprouter.Handle
- func (s *Server) MediaHandler() httprouter.Handle
- func (s *Server) MentionsHandler() httprouter.Handle
- func (s *Server) MuteHandler() httprouter.Handle
- func (s *Server) MutedHandler() httprouter.Handle
- func (s *Server) NewPasswordHandler() httprouter.Handle
- func (s *Server) NotFoundHandler(w http.ResponseWriter, r *http.Request)
- func (s *Server) NotifyHandler() httprouter.Handle
- func (s *Server) PageHandler(name string) httprouter.Handle
- func (s *Server) PermalinkHandler() httprouter.Handle
- func (s *Server) PodConfigHandler() httprouter.Handle
- func (s *Server) PodInfoHandler() httprouter.Handle
- func (s *Server) PodLogoHandler() httprouter.Handle
- func (s *Server) PostHandler() httprouter.Handle
- func (s *Server) ProfileHandler() httprouter.Handle
- func (s *Server) RefreshCacheHandler() httprouter.Handle
- func (s *Server) RegisterHandler() httprouter.Handle
- func (s *Server) ReportHandler() httprouter.Handle
- func (s *Server) ResetPasswordHandler() httprouter.Handle
- func (s *Server) ResetPasswordMagicLinkHandler() httprouter.Handle
- func (s *Server) RobotsHandler() httprouter.Handle
- func (s *Server) RstUserHandler() httprouter.Handle
- func (s *Server) Run() (err error)
- func (s *Server) SearchHandler() httprouter.Handle
- func (s *Server) SettingsAddLinkHandler() httprouter.Handle
- func (s *Server) SettingsHandler() httprouter.Handle
- func (s *Server) SettingsRemoveLinkHandler() httprouter.Handle
- func (s *Server) Shutdown(ctx context.Context) error
- func (s *Server) SupportHandler() httprouter.Handle
- func (s *Server) SyndicationHandler() httprouter.Handle
- func (s *Server) TaskHandler() httprouter.Handle
- func (s *Server) TimelineHandler() httprouter.Handle
- func (s *Server) TrustPeerHandler() httprouter.Handle
- func (s *Server) TwtxtHandler() httprouter.Handle
- func (s *Server) UnfollowHandler() httprouter.Handle
- func (s *Server) UnmuteHandler() httprouter.Handle
- func (s *Server) UploadMediaHandler() httprouter.Handle
- func (s *Server) UserConfigHandler() httprouter.Handle
- func (s *Server) WebFingerHandler() httprouter.Handle
- func (s *Server) WebMentionHandler() httprouter.Handle
- func (s *Server) WebSubHandler() httprouter.Handle
- func (s *Server) WhoFollowsHandler() httprouter.Handle
- type SessionStore
- func (s *SessionStore) DelSession(sid string) error
- func (s *SessionStore) GetAllSessions() ([]*sessions.Session, error)
- func (s *SessionStore) GetSession(sid string) (*sessions.Session, error)
- func (s *SessionStore) HasSession(sid string) bool
- func (s *SessionStore) LenSessions() int64
- func (s *SessionStore) SetSession(sid string, sess *sessions.Session) error
- func (s *SessionStore) SyncSession(sess *sessions.Session) error
- type Settings
- type SingleUserAgent
- type SoftwareConfig
- type Store
- type StoreFactory
- type SupportRequestEmailContext
- type SyncStoreJob
- type TTLCache
- func (cache *TTLCache) Dec(k string) int
- func (cache *TTLCache) Del(k string)
- func (cache *TTLCache) Get(k string) int
- func (cache *TTLCache) GetString(k string) string
- func (cache *TTLCache) Inc(k string) int
- func (cache *TTLCache) Reset(k string) int
- func (cache *TTLCache) Set(k string, v int) int
- func (cache *TTLCache) SetString(k string, v string) string
- type TemplateManager
- type TimeVar
- type Token
- type Translator
- type TwtTextFormat
- type TwtxtUserAgent
- type URI
- type URLProcessor
- type UpdateFeedSourcesJob
- type UpdateFeedsJob
- type User
- func (u *User) AddFollower(nick, uri string)
- func (u *User) AddLink(title, url string)
- func (u *User) Bookmark(hash string)
- func (u *User) Bookmarked(hash string) bool
- func (u *User) Bytes() ([]byte, error)
- func (u *User) DelFollower(nick, uri string)
- func (u *User) DisplayTimeFormat() string
- func (u *User) Filter(twts []types.Twt) (filtered []types.Twt)
- func (u *User) Follow(alias, uri string) error
- func (u *User) FollowAndValidate(conf *Config, uri string) error
- func (u *User) FollowedBy(url string) bool
- func (u *User) Follows(url string) bool
- func (u *User) FollowsAs(url string) string
- func (u *User) HasMuted(value string) bool
- func (u *User) Is(url string) bool
- func (u *User) IsZero() bool
- func (u *User) Mute(key, value string)
- func (u *User) OwnsFeed(name string) bool
- func (u *User) Profile(baseURL string, viewer *User) types.Profile
- func (u *User) RemoveLink(title string)
- func (u *User) Reply(twt types.Twt) string
- func (u *User) Source() types.FetchFeedRequests
- func (u *User) Sources() types.FetchFeedRequests
- func (u *User) String() string
- func (u *User) Twter(conf *Config) types.Twter
- func (u *User) Unfollow(conf *Config, alias string) error
- func (u *User) Unmute(key string)
- type VideoOptions
- type VideoTask
- type YarndUserAgent
Constants ¶
const ( // IndexDir ... IndexDir = "index" // DefaultResultsPerPage ... DefaultResultsPerPage = 50 )
const ( // InvalidConfigValue is the constant value for invalid config values // which must be changed for production configurations before successful // startup InvalidConfigValue = "INVALID CONFIG VALUE - PLEASE CHANGE THIS VALUE" // DefaultDebug is the default debug mode DefaultDebug = false // DefaultData is the default data directory for storage DefaultData = "./data" // DefaultTLS is the default for whether to enable TLS DefaultTLS = false // DefaultTLSKey is the default path to a TLS private key (if blank uses Let's Encrypt) DefaultTLSKey = "" // DefaultTLSCert is the default path to a TLS certificate (if blank uses Let's Encrypt) DefaultTLSCert = "" // DefaultAuth is the default auther for authenticating sessions DefaultAuth = "session" // DefaultRedirectURL is the default redirect url for the auther DefaultRedirectURL = "/" // DefaultAuthHeader is the default auth header to use for proxy auth DefaultAuthHeader = "X-User" // DefaultStore is the default data store used for accounts, sessions, etc DefaultStore = "bitcask://yarn.db" // DefaultBaseURL is the default Base URL for the app used to construct feed URLs DefaultBaseURL = "http://0.0.0.0:8000" // DefaultAdminUser is the default username to grant admin privileges to DefaultAdminUser = "admin" // DefaultAdminName is the default name of the admin user used in support requests DefaultAdminName = "Administrator" // DefaultAdminEmail is the default email of the admin user used in support requests DefaultAdminEmail = "support@yarn.social" // DefaultName is the default instance name DefaultName = "yarn.local" // DefaultMetaxxx are the default set of <meta> tags used on non-specific views DefaultMetaTitle = "" DefaultMetaAuthor = "Yarn.social" DefaultMetaKeywords = "twtxt, twt, yarn, blog, micro-blog, microblogging, social, media, decentralised, pod" DefaultMetaDescription = "" /* 147-byte string literal not displayed */ // DefaultTheme is the default theme to use for templates and static assets // (en empty value means to use the builtin default theme) DefaultTheme = "" // DefaultLang is the default language to use ('en' or 'zh-cn') DefaultLang = "auto" // DefaultOpenRegistrations is the default for open user registrations DefaultOpenRegistrations = false // DefaultDisableSupport is the default for disabling support (affects support and abuse functionality) DefaultDisableSupport = false // DefaultFrontPage is the default behaviour of the pod's front page (anonymous discover view) DefaultFrontPage = localViewKey // DefaultDisableGzip is the default for disabling Gzip compression DefaultDisableGzip = false // DefaultDisableLogger is the default for disabling the Logger (access logs) DefaultDisableLogger = false // DefaultDisableMedia is the default for disabling Media support DefaultDisableMedia = false // DefaultDisableFfmpeg is the default for disabling ffmpeg support DefaultDisableFfmpeg = false // DefaultDisableArchive is the default for disabling on-disk archive support DefaultDisableArchive = false // DefaultCookieSecret is the server's default cookie secret DefaultCookieSecret = InvalidConfigValue // DefaultTwtsPerPage is the server's default twts per page to display DefaultTwtsPerPage = 50 // DefaultMaxTwtLength is the default maximum length of posts permitted DefaultMaxTwtLength = 1024 // DefaultMaxCacheTTL is the default maximum cache ttl of twts in memory DefaultMaxCacheTTL = time.Hour * 24 * 14 // 2 weeks // DefaultFetchInterval is the default interval used by the global feed cache // to control when to actually fetch and update feeds. DefaultFetchInterval = "@every 5m" // DefaultMaxCacheItems is the default maximum cache items (per feed source) // of twts in memory DefaultMaxCacheItems = DefaultTwtsPerPage * 3 // We get bored after paging thorughh > 3 pages :D // DefaultOpenProfiles is the default for whether or not to have open user profiles DefaultOpenProfiles = false // DefaultMaxUploadSize is the default maximum upload size permitted DefaultMaxUploadSize = 1 << 24 // ~16MB (enough for high-res photos) // DefaultSessionCacheTTL is the server's default session cache ttl DefaultSessionCacheTTL = 1 * time.Hour // DefaultSessionExpiry is the server's default session expiry time DefaultSessionExpiry = 240 * time.Hour // 10 days // DefaultTranscoderTimeout is the default vodeo transcoding timeout DefaultTranscoderTimeout = 10 * time.Minute // 10mins // DefaultMagicLinkSecret is the jwt magic link secret DefaultMagicLinkSecret = InvalidConfigValue // Default Messaging settings DefaultSMTPBind = "0.0.0.0:8025" DefaultPOP3Bind = "0.0.0.0:8110" // Default SMTP configuration DefaultSMTPHost = InvalidConfigValue DefaultSMTPPort = 0 DefaultSMTPUser = InvalidConfigValue DefaultSMTPPass = InvalidConfigValue DefaultSMTPFrom = InvalidConfigValue // DefaultMaxFetchLimit is the maximum fetch fetch limit in bytes DefaultMaxFetchLimit = 1 << 20 // ~1MB (or more than enough for months) // DefaultMaxFeedSize is the maximum feed size before a feed is rotated (should be smaller than MaxFetchLimit) DefaultMaxFeedSize = DefaultMaxFetchLimit / 2 // DefaultAPISessionTime is the server's default session time for API tokens DefaultAPISessionTime = 240 * time.Hour // 10 days // DefaultAPISigningKey is the default API JWT signing key for tokens DefaultAPISigningKey = InvalidConfigValue // MinimumCacheFetchInterval is the smallest allowable cache fetch interval for // production pods, an attempt to configure a pod with a smaller value than this // results in a configuration validation error. MinimumCacheFetchInterval = 59 * time.Second // DefaultMediaResolution is the default resolution used to downscale media (iamges) // (the original is also preserved and accessible via adding the query string ?full=1) DefaultMediaResolution = 850 // 850px width (maintaining aspect ratio) // DefaultAvatarResolution is the default resolution used to downscale avatars (profiles) DefaultAvatarResolution = 360 // 360px width (maintaining aspect ratio) )
const ( DayAgo = time.Hour * 24 WeekAgo = DayAgo * 7 MonthAgo = DayAgo * 30 YearAgo = MonthAgo * 12 )
const (
// ArchiveDir is the name of the archive directory
ArchiveDir = "archive"
)
const ( // MaxFailedLogins is the default maximum tolerable number of failed login attempts // TODO: Make this configurable via Pod Settings MaxFailedLogins = 3 // By default 3 failed login attempts per 5 minutes )
Variables ¶
var ( // ErrInvalidCredentials is returned for invalid credentials against /auth ErrInvalidCredentials = errors.New("error: invalid credentials") // ErrInvalidToken is returned for expired or invalid tokens used in Authorizeation headers ErrInvalidToken = errors.New("error: invalid token") )
var ( // ErrTwtAlreadyArchived is returned when a twt is already archived ErrTwtAlreadyArchived = errors.New("error: twt already archived") // ErrTwtNotArchived is returned when a twt is not archived ErrTwtNotArchived = errors.New("error: twt not found in archived") // ErrInvalidTwtHash is returned when a twt hash is invalid ErrInvalidTwtHash = errors.New("error: invalid twt hash") )
var ( Jobs map[string]JobSpec StartupJobs map[string]JobSpec )
var ( ErrFeedAlreadyExists = errors.New("error: feed already exists by that name") ErrAlreadyFollows = errors.New("error: you already follow this feed") ErrTooManyFeeds = errors.New("error: you have too many feeds") )
var ( // DefaultLogo is the default logo (SVG) //go:embed logo.svg DefaultLogo string // DefaultCSS should be empty DefaultCSS string // DefaultJS should be empty DefaultJS string // Default Alert type and message DefaultAlertFloat bool DefaultAlertGuest bool DefaultAlertType = "safe" DefaultAlertMessage string // DefaultFeedSources is the default list of external feed sources DefaultFeedSources = []string{ "https://feeds.twtxt.net/we-are-feeds.txt", } // DefaultTwtPrompts are the set of default prompts for twt text(s) DefaultTwtPrompts = []string{ `What's on your mind? 🤔`, `Share something insightful! 💡`, `Good day to you! 👌 What's new? 🥳`, `Did something cool lately? 🤔 Share it! 🤗`, `Hi! 👋 Don't forget to post a Twt today! 😉`, `Let's have a Yarn! ✋`, } // DefaultPermittedImages is the default list of image domains // to permit for external images to display them inline DefaultPermittedImages = []string{ `imgur\.com`, `giphy\.com`, `imgs\.xkcd\.com`, `reactiongifs\.com`, `githubusercontent\.com`, } // DefaultBlockedFeeds is the default list of feed uris that are // blocked and prohibuted from being fetched by the global feed cache DefaultBlockedFeeds = []string{ `port70\.dk`, `enotty\.dk`, `gopher\.floodgap\.com`, `lublin\.se`, } DefaultEmbedRules = "" // DefaultMaxCacheFetchers is the default maximun number of fetchers used // by the global feed cache during update cycles. This controls how quickly // feeds are updated in each feed cache cycle. The default is the number of // available CPUs on the system. DefaultMaxCacheFetchers = runtime.NumCPU() // DefaultDisplayDatesInTimezone is the default timezone date and times are display in at the Pod level for // anonymous or unauthenticated users or users who have not changed their timezone rpefernece. DefaultDisplayDatesInTimezone = "UTC" // DefaultDisplayTimePreference is the default Pod level time representation (12hr or 24h) overridable by Users. DefaultDisplayTimePreference = "12h" // DefaultOpenLinksInPreference is the default Pod level behaviour for opening external links (overridable by Users). DefaultOpenLinksInPreference = "newwindow" // DisplayImagesPreference is the default Pod-level image display behaviour // (inline or lightbox) for displaying images (overridable by Users). DefaultDisplayImagesPreference = "inline" // DisplayMedia is the default for whether or not to display media at all or just link it DefaultDisplayMedia = true // OriginalMedia is the default for whether to link or display original media or not OriginalMedia bool )
var ( ErrInvalidStore = errors.New("error: invalid store") ErrUserNotFound = errors.New("error: user not found") ErrFeedNotFound = errors.New("error: feed not found") )
var ( ErrInvalidFeedName = errors.New("error: invalid feed name") ErrBadRequest = errors.New("error: request failed with non-200 response") ErrFeedNameTooLong = errors.New("error: feed name is too long") ErrInvalidUsername = errors.New("error: invalid username") ErrUsernameTooLong = errors.New("error: username is too long") ErrInvalidUserAgent = errors.New("error: invalid twtxt user agent") ErrReservedUsername = errors.New("error: username is reserved") ErrInvalidImage = errors.New("error: invalid image") ErrInvalidAudio = errors.New("error: invalid audio") ErrInvalidVideo = errors.New("error: invalid video") ErrInvalidVideoSize = errors.New("error: invalid video size") )
var (
ErrConfigPathMissing = errors.New("error: config file missing")
)
var (
ErrFeedImposter = errors.New("error: imposter detected, you do not own this feed")
)
var (
ErrSendingEmail = errors.New("error: unable to send email")
)
var ValidAuthers = []string{"proxy", "session"}
Functions ¶
func AvailableFeatures ¶
func AvailableFeatures() []string
func BaseFromURL ¶
func CORSMiddleware ¶
func CORSMiddleware(next httprouter.Handle) httprouter.Handle
func ChunkTwts ¶
ChunkTwts splits a slice of Twts into smaller slices of a given size, and returns those chunks. It is useful for splitting a large list of Twts into smaller batches, for example when processing a large list of Twts in parallel.
func CleanTwt ¶
CleanTwt cleans a twt's text, replacing new lines with spaces and stripping surrounding spaces.
func CreateFeed ¶
func CustomTime ¶
func DecodeHash ¶
func DeleteFeed ¶
DeleteFeed ...
func DeleteLastTwt ¶
func DeleteUser ¶
DeleteUser ...
func DownloadImage ¶
func ExtractHashFromSubject ¶
func FastHashFile ¶
func FastHashString ¶
func FeedExists ¶
func FileExists ¶
func FilterTwtsBy ¶
func FilterTwtsBy(twts types.Twts, filters ...FilterFunc) (res types.Twts)
FilterTwtsBy filters a slice of Twts by applying a series of filter functions. It returns a new slice containing only the Twts that satisfy all of the filter criteria provided. Each Twt is checked against all the filters, and only those that match all filters are included in the result.
func FirstNTwts ¶
FirstNTwts returns the first n Twts from the given slice of Twts. If n is greater than the length of the slice, the entire slice is returned. Otherwise, it returns a new slice containing the first n Twts from the given slice.
func FirstTwt ¶
FirstTwt returns the first Twt from the given slice of Twts. If the slice is empty, it returns a NilTwt.
func FormatMentionsAndTags ¶
func FormatMentionsAndTags(conf *Config, text string, format TwtTextFormat) string
FormatMentionsAndTags turns `@<nick URL>` into `<a href="URL">@nick</a>` and `#<tag URL>` into `<a href="URL">#tag</a>` and a `!<hash URL>` into a `<a href="URL">!hash</a>`.
func FormatRequest ¶
FormatRequest generates ascii representation of a request
func FormatTwtContextFactory ¶
func FormatTwtContextFactory(conf *Config, cache *Cache, archive Archiver) func(twt types.Twt, u *User) template.HTML
FormatTwtContextFactory formats a twt's context into a valid HTML snippet A Twt's Context is defined as the content of the Root Twt of the Conversation rendered in plain text up to a maximu length with an elipsis if longer...
func FormatTwtFactory ¶
func FormatTwtFactory(conf *Config, cache *Cache, archive Archiver) func(types.Twt, types.TwtTextFormat, *User) template.HTML
FormatTwtFactory formats a twt into a valid HTML snippet
func GenerateRandomToken ¶
func GenerateRandomToken() string
func GenerateWhoFollowsToken ¶
func GetAllFeeds ¶
func GetArchivedFeeds ¶
GetArchivedFeeds ...
func GetConvLength ¶
func GetExternalAvatar ¶
func GetForkLength ¶
func GetLastTwt ¶
func GetLastTwtFrom ¶
func GetLookupMatches ¶
func GetMediaNamesFromText ¶
func GetOrMigrateUserPasswordHash ¶
GetOrMigrateUserPasswordHash returns the User's Passsword Hash if available or the older but deprecated Password. The only difference really is we're switching from a `string` to a `[]byte` slice. This function is only used to transparently migrate a Yarn.social Pod's User database without any operator intervention. XXX: `User.Password“ field is Deprecated in favor of `User.PasswordHash“ TODO: Remove once all (most?) pods are on yarnd v0.17+
func GetPreviousArchivedFeed ¶
func GetRootTwtFactory ¶
func GetTwtConvSubjectHash ¶
func GroupByFeed ¶
GroupByFeed groups a Twt by its author's feed URL.
If the Twt does not have a valid feed URL, it will be returned as a nil slice. Otherwise, the feed URL is normalized and returned as a slice containing a single string.
func GroupBySubject ¶
GroupBySubject groups a Twt by its subject string. If the Twt does not have a subject, it will be returned as a nil slice. Otherwise, the subject is normalized to lower case and returned as a slice containing a single string.
func GroupByTag ¶
GroupByTag groups a Twt by its tags. It returns a slice of unique tag strings in lowercase. If a tag appears multiple times, it is only included once in the result.
func GroupTwtsBy ¶
GroupTwtsBy groups a slice of Twts into a map based on a specified grouping function. The function takes a slice of Twts and a GroupFunc, which defines the grouping criteria. For each Twt, the GroupFunc returns a list of keys, and the Twt is added to the corresponding entry in the resulting map. The map's keys are the group identifiers, and the values are slices of Twts belonging to each group.
func HostnameFromURL ¶
func IsAdminUserFactory ¶
IsAdminUserFactory returns a function that returns true if the user provided is the configured pod administrator, false otherwise.
func IsFeatureEnabled ¶
func IsFeatureEnabled(fs *FeatureFlags, name string) bool
func IsGifImage ¶
func IsLocalURLFactory ¶
func IsSpecialFeed ¶
IsSpecialFeed returns true if the feed is one of the special feeds an admin feed or automated feed.
func LastSeenTime ¶
func LastTwt ¶
LastTwt returns the last Twt from the given slice of Twts. If the slice is empty, it returns a NilTwt.
func MapKeys ¶
func MapKeys[K comparable, V any](kv map[K]V) []K
func MapValues ¶
func MapValues[K comparable, V any](kv map[K]V) []V
func MemoryUsage ¶
func MemoryUsage() string
MemoryUsage returns information about thememory used by the runtime
func NewCachedFeedLookup ¶
func NewCachedFeedLookup(cache *Cache) types.FeedLookup
NewCachedFeedLookup matches an @-mention based on cahced feeds in the cache and returns the first matching Twter that matches. this should be used as the last lookup function as there could be multiple feeds in the cache with similar Twter feed names.
func NewLocalFeedLookup ¶
func NewLocalFeedLookup(conf *Config, db Store) types.FeedLookup
NewLocalFeedLookup matches an @-mention based on a local feed on the current pod which may be another user or a user's fefed (sometimes called a persona). This should be used lower in the priority when used with a multi feed lookup.
func NewMultiFeedLookup ¶
func NewMultiFeedLookup(feedLookupFns ...types.FeedLookup) types.FeedLookup
NewMultiFeedLookup is used to chain together multiple feed lookup functions together where the first lookup that returns a non-zero Twter is used to expand the @-mention(2) before writing to the feed.
func NewRemoteFeedLookup ¶
func NewRemoteFeedLookup(conf *Config) types.FeedLookup
NewRemoteFeedLookup matches an @-mention based on a remote lookup and should be the last lookup function used in a multi feed lookup as the operation is time consuming as it performe outbound network requests to resolve the @-metniond(s).
func NewSessionStore ¶
func NewUserCreator ¶
func NewUserCreator(config *Config, db Store) auth.UserCreator
func NewUserFollowedAsFeedLookup ¶
func NewUserFollowedAsFeedLookup(user *User) types.FeedLookup
NewUserFollowedAsFeedLookup matches an @-mention based on the user's following list of feeds and the aliases used to follow those feeds.
func NormalizeFeedName ¶
func NormalizeURL ¶
func NormalizeUsername ¶
func ParseArchivedFeedIds ¶
ParseArchivedFeedIds ...
func PreprocessMedia ¶
func PreprocessMedia(user *User, conf *Config, u *url.URL, title, alt, renderAs string, display, full bool) string
PreprocessMedia ...
func ProcessImage ¶
func ReadArchivedTwt ¶
ReadArchivedTwt reads a JSON file containing a twt and decodes it returning the twt and an error if any.
func ReadFeedPreamble ¶
func RedirectRefererURL ¶
RedirectRefererURL constructs a Redirect URL from the given Request URL and possibly Referer, if the Referer's Base URL matches the Pod's Base URL will return the Referer URL otherwise the defaultURL. This is primarily used to redirect a user from a successful /login back to the page they were on.
func RemoveString ¶
func RenderAudio ¶
RenderAudio ...
func RenderImage ¶
RenderImage ...
func RenderLogo ¶
RenderLogo ...
func RenderPlainText ¶
RenderPlainText ...
func RenderVideo ¶
RenderVideo ...
func ReplaceExt ¶
func RequestGemini ¶
func RequestGopher ¶
func RequestHTTP ¶
func ResourceExists ¶
func RotateFeed ¶
func SaveFeedSources ¶
func SaveFeedSources(feedsources *FeedSources, path string) error
func SendCandidatesForDeletionEmail ¶
func SendCandidatesForDeletionEmail(conf *Config, candidates []DeletionCandidate) error
func SendMagicLinkAuthEmail ¶
func SendNewUserEmail ¶
func SendPasswordResetEmail ¶
func SendReportAbuseEmail ¶
func SendSupportRequestEmail ¶
func StoreUploadedImage ¶
func TextWithEllipsis ¶
TextWithEllipsis formats a a string with at most `maxLength` characters using an ellipsis (...) tto indicate more content...
func TranscodeAudio ¶
func TranscodeVideo ¶
func TwtMatchesAll ¶
func TwtMatchesAll(twt types.Twt, filters []FilterFunc) bool
TwtMatchesAll returns true if all filters in the given slice match the given Twt. Otherwise, it returns false.
func URLForAvatar ¶
func URLForConvFactory ¶
func URLForExternalAvatar ¶
func URLForExternalProfile ¶
func URLForFollowers ¶
func URLForFollowing ¶
func URLForForkFactory ¶
func URLForInbox ¶
func URLForMedia ¶
func URLForOutbox ¶
func URLForPage ¶
func URLForRootConvFactory ¶
func URLForTag2 ¶
func URLForTask ¶
func URLForUser ¶
func URLForWhoFollows ¶
func URLForWhoFollows(baseURL string, feed types.FetchFeedRequest, feedFollowers int) string
func UniqStrings ¶
func UniqTwts ¶
UniqTwts returns a slice of unique Twts. It filters out any duplicates in the given slice of Twts by checking their hashes. If a Twt has been seen before, it is not included in the result.
func UnparseTwtFactory ¶
UnparseTwtFactory is the opposite of CleanTwt and ExpandMentions/ExpandTags
func ValidateFeed ¶
func ValidateFeedName ¶
func ValidateIndieRedirectURL ¶
ValidateIndieRedirectURL ...
func ValidateUsername ¶
ValidateUsername validates the username before allowing it to be created. This ensures usernames match a defined pattern and that some usernames that are reserved are never used by users.
func WebMention ¶
Types ¶
type API ¶
type API struct {
// contains filtered or unexported fields
}
API ...
func NewAPI ¶
func NewAPI(router *Router, config *Config, cache *Cache, index *Index, archive Archiver, db Store, pm *passwd.Passwd, tasks *tasks.Dispatcher) *API
NewAPI ...
func (*API) AdminDeleteFeedEndpoint ¶
func (a *API) AdminDeleteFeedEndpoint() httprouter.Handle
AdminDeleteFeedEndpoint ...
func (*API) AdminDeleteUserEndpoint ¶
func (a *API) AdminDeleteUserEndpoint() httprouter.Handle
AdminDeleteUserEndpoint ...
func (*API) ConversationEndpoint ¶
func (a *API) ConversationEndpoint() httprouter.Handle
ConversationEndpoint ...
func (*API) CreateToken ¶
CreateToken ...
func (*API) DebugCacheEndpoint ¶
func (a *API) DebugCacheEndpoint() httprouter.Handle
DebugCacheEndpoint ...
func (*API) DebugHeapEndpoint ¶
func (a *API) DebugHeapEndpoint() httprouter.Handle
DebugHeapEndpoint ...
func (*API) DebugWebSubEndpoint ¶
func (a *API) DebugWebSubEndpoint() httprouter.Handle
DebugWebSubEndpoint ...
func (*API) DiscoverEndpoint ¶
func (a *API) DiscoverEndpoint() httprouter.Handle
DiscoverEndpoint ...
func (*API) ExternalProfileEndpoint ¶
func (a *API) ExternalProfileEndpoint() httprouter.Handle
ExternalProfileEndpoint ...
func (*API) FetchTwtsEndpoint ¶
func (a *API) FetchTwtsEndpoint() httprouter.Handle
FetchTwtsEndpoint ...
func (*API) MentionsEndpoint ¶
func (a *API) MentionsEndpoint() httprouter.Handle
MentionsEndpoint ...
func (*API) OldUploadMediaEndpoint ¶
func (a *API) OldUploadMediaEndpoint() httprouter.Handle
OldUploadMediaEndpoint ... TODO: Remove when the api_old_upload_media counter nears zero XXX: Used for Goryon < v1.0.3
func (*API) PodConfigEndpoint ¶
func (a *API) PodConfigEndpoint() httprouter.Handle
PodConfigEndpoint ...
func (*API) RegisterEndpoint ¶
func (a *API) RegisterEndpoint() httprouter.Handle
RegisterEndpoint ...
func (*API) SettingsEndpoint ¶
func (a *API) SettingsEndpoint() httprouter.Handle
SettingsEndpoint ...
func (*API) TimelineEndpoint ¶
func (a *API) TimelineEndpoint() httprouter.Handle
TimelineEndpoint ...
func (*API) UnfollowEndpoint ¶
func (a *API) UnfollowEndpoint() httprouter.Handle
UnfollowEndpoint ...
func (*API) UploadMediaEndpoint ¶
func (a *API) UploadMediaEndpoint() httprouter.Handle
UploadMediaEndpoint handles the uploading of media files to the server. It supports image, audio, and video files by determining the content type of the uploaded file. The function processes the file accordingly and dispatches a task for further processing. For older clients (pre v1.0.3), it redirects to the OldUploadMediaEndpoint. The function also ensures the request body does not exceed the maximum upload size defined in the configuration, returning appropriate HTTP responses for errors encountered during file handling or task dispatching.
func (*API) WhoAmIEndpoint ¶
func (a *API) WhoAmIEndpoint() httprouter.Handle
WhoAmIEndpoint returns an HTTP handler that responds with the username of the currently logged-in user in a JSON format. If the user is not logged in, it returns an HTTP 401 Unauthorized error. This endpoint helps clients determine the identity of the authenticated user.
type ActiveUsersJob ¶
type ActiveUsersJob struct {
// contains filtered or unexported fields
}
func (*ActiveUsersJob) Run ¶
func (job *ActiveUsersJob) Run()
func (*ActiveUsersJob) String ¶
func (job *ActiveUsersJob) String() string
type Alternative ¶
type Alternatives ¶
type Alternatives []Alternative
type AppendTwtFunc ¶
type AppendTwtFunc func(user *User, feed *Feed, text string, args ...interface{}) (types.Twt, error)
func AppendTwtFactory ¶
func AppendTwtFactory(conf *Config, cache *Cache, db Store) AppendTwtFunc
type Archiver ¶
type Archiver interface { Del(hash string) error Has(hash string) bool Get(hash string) (types.Twt, error) Archive(twt types.Twt, overwrite bool) error Walk() <-chan types.Twt Count() int64 }
Archiver is an interface for retrieving old twts from an archive storage such as an on-disk hash layout with one directory per 2-letter part of the hash sequence.
func NewDiskArchiver ¶
NewDiskArchiver creates a new Archiver that stores twts on disk in a directory structure of:
./path/[0-9a-f]{2,}/[0-9a-f]+.json
The path is created if it does not exist.
func NewDummyArchiver ¶
NewDummyArchiver creates a new Archiver that implements the minimum interface for an Archiver using dummy implementation stubs that do nothing. It is useful for testing and development purposes.
type AudioOptions ¶
type AudioTask ¶
AudioTask is a task to transcode an audio file
func NewAudioTask ¶
NewAudioTask returns a new AudioTask instance.
The returned task is a Go routine safe object, but it's not safe to access the underlying fields directly. Instead, use the methods and functions provided by the tasks package and this package for interacting with the task.
func (*AudioTask) Run ¶
Run executes the audio transcoding task. It sets the task state to running, logs the start of the process, and defines audio options for transcoding. The function calls TranscodeAudio to perform the transcoding operation. If an error occurs, it logs the error and marks the task as failed. On success, it logs the completion and stores the resulting media URI.
type BitcaskStore ¶
type BitcaskStore struct {
// contains filtered or unexported fields
}
BitcaskStore ...
func (*BitcaskStore) DelFeed ¶
func (bs *BitcaskStore) DelFeed(name string) error
func (*BitcaskStore) DelSession ¶
func (bs *BitcaskStore) DelSession(sid string) error
func (*BitcaskStore) DelUser ¶
func (bs *BitcaskStore) DelUser(username string) error
func (*BitcaskStore) GetAllFeeds ¶
func (bs *BitcaskStore) GetAllFeeds() ([]*Feed, error)
func (*BitcaskStore) GetAllSessions ¶
func (bs *BitcaskStore) GetAllSessions() ([]*sessions.Session, error)
func (*BitcaskStore) GetAllUsers ¶
func (bs *BitcaskStore) GetAllUsers() ([]*User, error)
func (*BitcaskStore) GetSession ¶
func (bs *BitcaskStore) GetSession(sid string) (*sessions.Session, error)
func (*BitcaskStore) HasFeed ¶
func (bs *BitcaskStore) HasFeed(name string) bool
func (*BitcaskStore) HasSession ¶
func (bs *BitcaskStore) HasSession(sid string) bool
func (*BitcaskStore) HasUser ¶
func (bs *BitcaskStore) HasUser(username string) bool
func (*BitcaskStore) LenFeeds ¶
func (bs *BitcaskStore) LenFeeds() int64
func (*BitcaskStore) LenSessions ¶
func (bs *BitcaskStore) LenSessions() int64
LenSessions returns the number of sessions in the store.
func (*BitcaskStore) LenUsers ¶
func (bs *BitcaskStore) LenUsers() int64
func (*BitcaskStore) SearchFeeds ¶
func (bs *BitcaskStore) SearchFeeds(prefix string) []string
func (*BitcaskStore) SearchUsers ¶
func (bs *BitcaskStore) SearchUsers(prefix string) []string
func (*BitcaskStore) SetSession ¶
func (bs *BitcaskStore) SetSession(sid string, sess *sessions.Session) error
func (*BitcaskStore) SyncSession ¶
func (bs *BitcaskStore) SyncSession(sess *sessions.Session) error
type Cache ¶
type Cache struct { Version int List *Cached Map map[string]types.Twt Peers map[string]*Pod Feeds map[string]*Cached Views map[string]*Cached Followers map[string]types.Followers Twters map[string]*types.Twter // contains filtered or unexported fields }
Cache represents the cache of twts
func FromOldCacheFile ¶
FromOldCacheFile attempts to load an old version of the on-disk cache stored at /path/to/data/cache -- If you change the way the `*Cache` is stored on disk by modifying `Cache.Store()` or any of the data structures, please modify this function to support loading the previous version of the on-disk cache.
func LoadCacheFromFile ¶
LoadCacheFromFile ...
func NewCache ¶
NewCache initializes a new Cache instance from the given configuration. It sets the Version to the current feed cache version, and initializes the various data structures for storing cached twts, peers, feeds, views, followers, and twters.
func (*Cache) DeleteFeeds ¶
func (cache *Cache) DeleteFeeds(feeds types.FetchFeedRequests)
DeleteFeeds ...
func (*Cache) DeletePeer ¶
func (*Cache) DetectClientFromRequest ¶
DetectClientFromRequest ...
func (*Cache) DetectClientFromResponse ¶
DetectClientFromResponse ...
func (*Cache) DetectPodFromUserAgent ¶
func (cache *Cache) DetectPodFromUserAgent(ua TwtxtUserAgent) error
DetectPodFromUserAgent ...
func (*Cache) FetchFeeds ¶
func (cache *Cache) FetchFeeds(conf *Config, archive Archiver, index *Index, feeds types.FetchFeedRequests, publicFollowers map[types.FetchFeedRequest][]string)
FetchFeeds ...
func (*Cache) FindTwter ¶
FindTwter locates a valid cached Twter by searching the Cache for previously fetched feeds and their Twter(s) using basic string matching TODO: Add Fuzzy matching?
func (*Cache) GetByUserView ¶
func (cache *Cache) GetByUserView(u *User, view string, refresh bool, fffs ...FilterFuncFactory) types.Twts
GetByUserView ...
func (*Cache) GetCachedFeed ¶
GetCachedFeed ...
func (*Cache) GetFollowerByURI ¶
GetFollowerByURI ...
func (*Cache) GetFollowers ¶
GetFollowers ...
func (*Cache) GetMentions ¶
GetMentions ... XXX: To be removed once FeatureFilterAndLists is promoted TODO: Remove my when FeatureFilterAndLists is the default
func (*Cache) GetOldFollowers ¶
GetOldFollowers ... XXX: Returns a map[string]string of nick -> url for APIv1 compat TODO: Remove when Mobile App is upgraded
func (*Cache) GetOrSetCachedFeed ¶
GetOrSetCachedFeed ...
func (*Cache) GetTwter ¶
GetTwter retrieves a cached Twter from the Cache by its URI. It locks the read mutex so it is thread-safe.
func (*Cache) MarshalJSON ¶
MarshalJSON encodes the Cache object into a JSON format. It serializes the version, list of cached items, map of twts, peers, feeds, views, followers, and twters. The function acquires a read lock to ensure thread-safe access to the cache's data structures during the serialization process. Returns a byte slice containing the JSON representation of the cache or an error if the encoding fails.
func (*Cache) PruneFollowers ¶
PruneFollowers ...
func (*Cache) Refresh ¶
func (cache *Cache) Refresh()
Refresh updates the cache by aggregating all tweets from the feeds, removing duplicates, and sorting them. It generates default views for local and discover timelines, groups tweets by tags and subjects, and constructs new versions of the List, Map, and Views. It also cleans up any dead peers from the cache.
func (*Cache) SetTwter ¶
SetTwter caches a Twter object in the cache map if its HashingURI matches the provided URI. It locks the cache for writing to ensure thread safety. If the URI does not match the Twter's HashingURI, the Twter is not cached, as it may indicate that the fetched feed URI is incorrect or refers to an archived feed. This helps maintain the integrity of the cached data by ensuring that only valid and correctly fetched Twters are stored.
func (*Cache) ShouldRefreshFeed ¶
ShouldRefreshFeed ...
func (*Cache) TrustedPeerCount ¶
type Cached ¶
type Cached struct { Twts types.Twts Errors int64 Fetches int64 LastError string LastFetched time.Time LastModified string // contains filtered or unexported fields }
Cached represents a cached feed
func NewCachedTwts ¶
NewCachedTwts constructs a cached feed with the given slice of twts and a last modified timestamp
func (*Cached) Availability ¶
Availability returns the feed's availability (success rate) in terms of successful fetches / total attempted fetches as a percentage (0-100).
func (*Cached) GetLastFetched ¶
GetLastFetched returns the last time the cached feed was fetched. It acquires a read lock to ensure thread-safe access to the LastFetched field.
func (*Cached) GetLastModified ¶
GetLastModified returns the last modified time of the cached feed as a string. It acquires a read lock to ensure thread-safe access to the LastModified field.
func (*Cached) GetTwts ¶
GetTwts returns a copy of the slice of Twts stored in the Cached object. It acquires a read lock to ensure thread-safe access to the Twts.
func (*Cached) IncFetches ¶
func (cached *Cached) IncFetches()
IncFetches increments the overall successful fetches counter and resets the last error.
func (*Cached) Inject ¶
Inject injects a single twt into the cache, maintaining the cache's sorted property and removing duplicates.
func (*Cached) SetLastFetched ¶
func (cached *Cached) SetLastFetched()
SetLastFetched sets the last fetched time of the cached feed to the current time. This is called after a successful fetch.
type CandidatesByScore ¶
type CandidatesByScore []DeletionCandidate
func (CandidatesByScore) Len ¶
func (c CandidatesByScore) Len() int
func (CandidatesByScore) Less ¶
func (c CandidatesByScore) Less(i, j int) bool
func (CandidatesByScore) Swap ¶
func (c CandidatesByScore) Swap(i, j int)
type CandidatesForDeletionEmailContext ¶
type CandidatesForDeletionEmailContext struct { Pod string BaseURL string AdminUser string Candidates []DeletionCandidate }
type Config ¶
type Config struct { Version SoftwareConfig Debug bool TLS bool TLSKey string TLSCert string Auth string `json:"-"` AuthHeader string `json:"-"` Data string `json:"-"` Name string Logo string CSS string JS string Description string Store string `json:"-"` StartPage string FrontPage string FrontPageCompact bool Theme string `json:"-"` AlertFloat bool AlertGuest bool AlertMessage string AlertType string Lang string BaseURL string AdminUser string `json:"-"` AdminName string `json:"-"` AdminEmail string `json:"-"` FeedSources []string CookieSecret string `json:"-"` TwtPrompts []string TwtsPerPage int MaxUploadSize int64 MaxTwtLength int MediaResolution int AvatarResolution int MaxCacheTTL time.Duration FetchInterval string MaxCacheItems int OpenProfiles bool OpenRegistrations bool DisableSupport bool DisableGzip bool DisableLogger bool DisableMedia bool DisableFfmpeg bool DisableArchive bool SessionExpiry time.Duration SessionCacheTTL time.Duration TranscoderTimeout time.Duration MagicLinkSecret string `json:"-"` SMTPHost string `json:"-"` SMTPPort int `json:"-"` SMTPUser string `json:"-"` SMTPPass string `json:"-"` SMTPFrom string `json:"-"` MaxCacheFetchers int MaxFetchLimit int64 MaxFeedSize int64 APISessionTime time.Duration `json:"-"` APISigningKey string `json:"-"` PermittedImages []string `json:"-"` BlockedFeeds []string `json:"-"` EmbedRules string `json:"-"` Features *FeatureFlags // Pod Level Settings (overridable by Users) DisplayDatesInTimezone string DisplayTimePreference string OpenLinksInPreference string DisplayImagesPreference string DisplayMedia bool OriginalMedia bool VisibilityCompact bool VisibilityReadmore bool LinkVerification bool StripTrackingParam bool CustomPrimaryColor string CustomSecondaryColor string // contains filtered or unexported fields }
Config contains the server configuration parameters
func (*Config) BlockedFeed ¶
BlockedFeed returns true if the feed uri matches any blocked feeds per the pod's configuration, the pod itself cannot be blocked.
func (*Config) ExternalURL ¶
func (*Config) IsLocalURL ¶
func (*Config) IsShadowed ¶
IsShadowed returns true if a feed has been Shadow Banned by the Pod Owner/Operator (poderator) This is currently functionally equivilent to Blocklisting a feed and uses the same configuration
func (*Config) PermittedImage ¶
PermittedImage returns true if the domain name of an image's url provided is a whiltelisted domain as per the configuration
func (*Config) RandomTwtPrompt ¶
RandomTwtPrompt returns a random Twt Prompt for display by the UI
func (*Config) RequestTimeout ¶
RequestTimeout returns the configured timeout for outgoing HTTP requests. If not defined, it defaults to 30 seconds.
func (*Config) Settings ¶
Settings returns a `Settings` struct containing pod settings that can then be persisted to disk to override some configuration options.
func (*Config) TemplatesFS ¶
func (*Config) URLForAvatar ¶
func (*Config) URLForMedia ¶
func (*Config) URLForUser ¶
type Context ¶
type Context struct { Debug bool IsHTMX bool Request *http.Request Filters []string Logo template.HTML CSS template.CSS JS template.JS BaseURL string InstanceName string SoftwareVersion SoftwareConfig TwtsPerPage int TwtPrompt string MaxTwtLength int AvatarResolution int MediaResolution int RegisterDisabled bool SupportDisabled bool OpenProfiles bool FrontPage string FrontPageCompact bool DisableMedia bool DisableFfmpeg bool PermittedImages []string BlockedFeeds []string EmbedRules string EnabledFeatures []string AlertFloat bool AlertGuest bool AlertMessage string AlertType string Timezones []*timezones.Zoneinfo Subject string Username string User *User LastTwt types.Twt Profile types.Profile Authenticated bool IsAdmin bool DisplayDatesInTimezone string DisplayTimePreference string OpenLinksInPreference string DisplayImagesPreference string DisplayMedia bool OriginalMedia bool VisibilityCompact bool VisibilityReadmore bool LinkVerification bool StripTrackingParam bool CustomPrimaryColor string CustomSecondaryColor string Error bool Message string Callback string Lang string // language AcceptLangs string // accept languages StartPage string Theme string // not to be confused with the config.Theme Commit string Page string View string Content template.HTML Title string Meta Meta Links Links Alternatives Alternatives Twter types.Twter Twts types.Twts Root types.Twt Pager *paginator.Paginator LocalFeeds []*Feed UserFeeds []*Feed FeedSources FeedSourceMap // Discovered Pods peering with us Peers Peers // Background Jobs Jobs []*cron.Entry // Search SearchQuery string SearchSort []string // Tools Bookmarklet string // Report abuse ReportNick string ReportURL string // Reset Password Token PasswordResetToken string // CSRF Token CSRFToken string // Login Referer Referer string // Prompt text PromptTitle string PromptMessage string PromptCallback string PromptApprove string PromptCancel string PromptTarget string }
Context is a "god" object that holds a bunch of data mostly used in templates TODO: Refactor the shit out of this so we don't have this giant big object!!!
func NewContext ¶
NewContext returns a new request scoped context object mostly used by templates.
func (*Context) Translate ¶
func (ctx *Context) Translate(translator *Translator, data ...interface{})
type ContextKey ¶
type ContextKey int
ContextKey is the type of the context key
const ( // TokenContextKey is the context key TokenContextKey ContextKey = iota // UserContextKey is the context key UserContextKey )
type CreateAdminFeedsJob ¶
type CreateAdminFeedsJob struct {
// contains filtered or unexported fields
}
func (*CreateAdminFeedsJob) Run ¶
func (job *CreateAdminFeedsJob) Run()
func (*CreateAdminFeedsJob) String ¶
func (job *CreateAdminFeedsJob) String() string
type DeleteOldSessionsJob ¶
type DeleteOldSessionsJob struct {
// contains filtered or unexported fields
}
func (*DeleteOldSessionsJob) Run ¶
func (job *DeleteOldSessionsJob) Run()
func (*DeleteOldSessionsJob) String ¶
func (job *DeleteOldSessionsJob) String() string
type DeletionCandidate ¶
type DiskArchiver ¶
type DiskArchiver struct {
// contains filtered or unexported fields
}
DiskArchiver implements Archiver using an on-disk hash layout directory structure with one directory per 2-letter hash sequence with a single JSON encoded file per twt.
func (*DiskArchiver) Archive ¶
func (a *DiskArchiver) Archive(twt types.Twt, overwrite bool) error
Archive writes a twt to the archive.
If overwrite is false, then the function will not overwrite an existing archived twt. Instead, it will return ErrTwtAlreadyArchived.
Returns an error if the hash is invalid, the file cannot be written, or there is an error reading or writing the file.
func (*DiskArchiver) Count ¶
func (a *DiskArchiver) Count() int64
Count returns the number of JSON files in the archive directory. This function uses a filter to count only files with a ".json" extension.
func (*DiskArchiver) Del ¶
func (a *DiskArchiver) Del(hash string) error
Del removes a twt from the archive.
Returns an error if the hash is invalid, the file does not exist, or there is an error removing the file.
func (*DiskArchiver) Get ¶
func (a *DiskArchiver) Get(hash string) (types.Twt, error)
Get retrieves a twt from the archive.
Returns an error if the hash is invalid, the file does not exist, or there is an error reading the file.
func (*DiskArchiver) Has ¶
func (a *DiskArchiver) Has(hash string) bool
Has returns true if the given twt hash has been archived and false otherwise.
func (*DiskArchiver) Walk ¶
func (a *DiskArchiver) Walk() <-chan types.Twt
Walk returns a channel of twts that are read from the archive directory. The channel is closed when all twts have been read.
The function will spawn up to runtime.NumCPU() goroutines to read twts from disk in parallel.
type DummyArchiver ¶
type DummyArchiver struct{}
DummyArchiver implements Archiver using dummy implementation stubs
func (*DummyArchiver) Archive ¶
func (a *DummyArchiver) Archive(_ types.Twt, _ bool) error
Archive archives a twt in the dummy archiver (does nothing)
func (*DummyArchiver) Count ¶
func (a *DummyArchiver) Count() int64
Count returns the number of twts in the dummy archiver (always 0)
func (*DummyArchiver) Del ¶
func (a *DummyArchiver) Del(_ string) error
Del removes a twt from the dummy archiver (does nothing)
func (*DummyArchiver) Get ¶
func (a *DummyArchiver) Get(_ string) (types.Twt, error)
Get retrieves a twt from the dummy archiver (always returns nil)
func (*DummyArchiver) Has ¶
func (a *DummyArchiver) Has(_ string) bool
Has checks if a twt is present in the dummy archiver (always false)
func (*DummyArchiver) Walk ¶
func (a *DummyArchiver) Walk() <-chan types.Twt
Walk returns a channel containing all twts in the dummy archiver (always closed)
type ErrAudioUploadFailed ¶
type ErrAudioUploadFailed struct {
Err error
}
func (*ErrAudioUploadFailed) Error ¶
func (e *ErrAudioUploadFailed) Error() string
func (*ErrAudioUploadFailed) Unwrap ¶
func (e *ErrAudioUploadFailed) Unwrap() error
type ErrCommandFailed ¶
func (*ErrCommandFailed) Error ¶
func (e *ErrCommandFailed) Error() string
func (*ErrCommandFailed) Is ¶
func (e *ErrCommandFailed) Is(target error) bool
func (*ErrCommandFailed) Unwrap ¶
func (e *ErrCommandFailed) Unwrap() error
type ErrCommandKilled ¶
func (*ErrCommandKilled) Error ¶
func (e *ErrCommandKilled) Error() string
func (*ErrCommandKilled) Is ¶
func (e *ErrCommandKilled) Is(target error) bool
func (*ErrCommandKilled) Unwrap ¶
func (e *ErrCommandKilled) Unwrap() error
type ErrTranscodeFailed ¶
type ErrTranscodeFailed struct {
Err error
}
func (*ErrTranscodeFailed) Error ¶
func (e *ErrTranscodeFailed) Error() string
func (*ErrTranscodeFailed) Unwrap ¶
func (e *ErrTranscodeFailed) Unwrap() error
type ErrTranscodeTimeout ¶
type ErrTranscodeTimeout struct {
Err error
}
func (*ErrTranscodeTimeout) Error ¶
func (e *ErrTranscodeTimeout) Error() string
func (*ErrTranscodeTimeout) Unwrap ¶
func (e *ErrTranscodeTimeout) Unwrap() error
type ErrVideoUploadFailed ¶
type ErrVideoUploadFailed struct {
Err error
}
func (*ErrVideoUploadFailed) Error ¶
func (e *ErrVideoUploadFailed) Error() string
func (*ErrVideoUploadFailed) Unwrap ¶
func (e *ErrVideoUploadFailed) Unwrap() error
type FeatureFlags ¶
FeatureFlags describes a set of Pods optional Features and whether they are enabled or disabled
func NewFeatureFlags ¶
func NewFeatureFlags() *FeatureFlags
func (*FeatureFlags) AsStrings ¶
func (f *FeatureFlags) AsStrings() []string
func (*FeatureFlags) Disable ¶
func (f *FeatureFlags) Disable(feature FeatureType)
func (*FeatureFlags) DisableAll ¶
func (f *FeatureFlags) DisableAll(features []FeatureType)
func (*FeatureFlags) Enable ¶
func (f *FeatureFlags) Enable(feature FeatureType)
func (*FeatureFlags) EnableAll ¶
func (f *FeatureFlags) EnableAll(features []FeatureType)
func (*FeatureFlags) IsEnabled ¶
func (f *FeatureFlags) IsEnabled(feature FeatureType) bool
func (*FeatureFlags) MarshalJSON ¶
func (f *FeatureFlags) MarshalJSON() ([]byte, error)
func (*FeatureFlags) MarshalYAML ¶
func (f *FeatureFlags) MarshalYAML() (interface{}, error)
func (*FeatureFlags) Reset ¶
func (f *FeatureFlags) Reset()
func (*FeatureFlags) String ¶
func (f *FeatureFlags) String() string
func (*FeatureFlags) UnmarshalJSON ¶
func (f *FeatureFlags) UnmarshalJSON(b []byte) error
func (*FeatureFlags) UnmarshalYAML ¶
func (f *FeatureFlags) UnmarshalYAML(unmarshal func(interface{}) error) error
type FeatureType ¶
type FeatureType int
const ( // FeatureInvalid is the invalid feature (0) FeatureInvalid FeatureType = iota FeatureFoo FeatureFilterAndLists FeatureWebFinger FeatureSearch )
func FeatureFromString ¶
func FeatureFromString(s string) (FeatureType, error)
func FeaturesFromStrings ¶
func FeaturesFromStrings(xs []string) ([]FeatureType, error)
func (FeatureType) String ¶
func (f FeatureType) String() string
type Feed ¶
type Feed struct { Name string Description string URL string CreatedAt time.Time AvatarHash string `defaulf:""` Followers map[string]string `default:"{}"` // contains filtered or unexported fields }
Feed ...
func (*Feed) AddFollower ¶
func (*Feed) DelFollower ¶
func (*Feed) FollowedBy ¶
func (*Feed) Source ¶
func (f *Feed) Source() types.FetchFeedRequests
type FeedContext ¶
type FeedContext struct { Debug bool InstanceName string SoftwareVersion SoftwareConfig Profile types.Profile Twter types.Twter Prev string Authenticated bool Username string IsAdmin bool User *User }
func NewFeedContext ¶
func NewFeedContext(s *Server, req *http.Request) *FeedContext
type FeedSource ¶
func ParseFeedSource ¶
func ParseFeedSource(url string, scanner *bufio.Scanner) (feedsources []FeedSource, err error)
type FeedSourceMap ¶
type FeedSourceMap map[string][]FeedSource
type FeedSources ¶
type FeedSources struct {
Sources FeedSourceMap `json:"sources"`
}
func FetchFeedSources ¶
func FetchFeedSources(conf *Config, sources []string) *FeedSources
func LoadFeedSources ¶
func LoadFeedSources(path string) (*FeedSources, error)
type FilterFunc ¶
FilterFunc ...
func FilterExcludeMe ¶
func FilterExcludeMe(_ *Cache, u *User) FilterFunc
FilterExcludeMe returns a FilterFunc that filters out twts from the given user's own feeds. This is useful for showing a user their mentions timeline, or their local timeline, without including their own twts.
func FilterLocalOnly ¶
func FilterLocalOnly(c *Cache, _ *User) FilterFunc
FilterLocalOnly returns a FilterFunc that filters out Twts from non-local sources. It uses the configuration in the provided Cache to determine if a Twt's URI is considered local to the system. This filter is useful for displaying only local content in a timeline or feed.
func FilterMediaOnly ¶
func FilterMediaOnly(c *Cache, _ *User) FilterFunc
FilterMediaOnly returns a FilterFunc that filters out Twts that do not have at least one link that matches a media type that is supported by the system. The system considers the following media types to be supported:
- .png - .jpg - .jpeg - .gif - .mp4
Additionally, the system will check the provided Cache for embed rules that match the link target. If any of the rules match, the Twt will be considered to have media.
func FilterMentionsMe ¶
func FilterMentionsMe(_ *Cache, u *User) FilterFunc
FilterMentionsMe returns a FilterFunc that filters out twts that mention the given user. The filter will return true if the twt mentions the user's primary feed, or any of their secondary feeds that are specified in the user's feeds field.
func FilterNoBots ¶
func FilterNoBots(c *Cache, _ *User) FilterFunc
FilterNoBots returns a FilterFunc that filters out twts from bots.
func FilterNoOp ¶
func FilterNoOp(_ *Cache, _ *User) FilterFunc
FilterNoOp returns a FilterFunc that returns true for all Twts. This filter does nothing.
func FilterNoRSS ¶
func FilterNoRSS(c *Cache, _ *User) FilterFunc
FilterNoRSS returns a FilterFunc that filters out twts from RSS feeds.
func FilterNoReplies ¶
func FilterNoReplies(c *Cache, u *User) FilterFunc
FilterNoReplies returns a FilterFunc that filters out replies to non-local Twts. It uses the configuration in the provided Cache to determine if a Twt's URI is considered local to the system. It also uses the Cache to determine if a given Twt is a reply to a local Twt. If the Twt is not a reply to a local Twt, it will be filtered out. This filter is useful for displaying only local content in a timeline or feed.
func FilterOutFeedsAndBotsFactory ¶
func FilterOutFeedsAndBotsFactory(cache *Cache) FilterFunc
FilterOutFeedsAndBotsFactory returns a FilterFunc that filters out twts from feeds and bots.
type FilterFuncFactory ¶
type FilterFuncFactory func(c *Cache, u *User) FilterFunc
FilterFuncFactory ...
func GetFilterFuncFactories ¶
func GetFilterFuncFactories(fs []string) (filters []FilterFuncFactory)
GetFilterFuncFactories takes a list of strings, where each string is the name of a filter function factory (e.g. "mentionsme", "excludeme", etc). It returns a list of FilterFuncFactory functions that can be used to filter Twts.
The following filter factories are supported:
- "mentionsme": FilterMentionsMe - "excludeme": FilterExcludeMe - "localonly": FilterLocalOnly - "noreplies": FilterNoReplies - "norss": FilterNoRSS - "mediaonly": FilterMediaOnly - "nobots": FilterNoBots
type FilterTwtsFunc ¶
func FilterTwtsFactory ¶
func FilterTwtsFactory(conf *Config) FilterTwtsFunc
FilterTwtsFactory returns a function that filters out Twts from users/feeds that a User has chosen to mute or are otherwise shadowed by the Pod (as decided by a Pod Owner/Operator).
type FixAdminFeedsJob ¶
type FixAdminFeedsJob struct {
// contains filtered or unexported fields
}
func (*FixAdminFeedsJob) Run ¶
func (job *FixAdminFeedsJob) Run()
func (*FixAdminFeedsJob) String ¶
func (job *FixAdminFeedsJob) String() string
type FrontMatter ¶
type ImageOptions ¶
type ImageTask ¶
func NewImageTask ¶
type Index ¶
type Index struct {
// contains filtered or unexported fields
}
Index ...
type IndexOption ¶
IndexOption ...
type Job ¶
func NewActiveUsersJob ¶
func NewCreateAdminFeedsJob ¶
func NewDeleteOldSessionsJob ¶
func NewFixAdminFeedsJob ¶
func NewPruneFollowersJob ¶
func NewPruneUsersJob ¶
func NewRotateFeedsJob ¶
func NewSyncStoreJob ¶
func NewUpdateFeedSourcesJob ¶
type JobFactory ¶
type JobSpec ¶
type JobSpec struct { Schedule string Factory JobFactory }
JobSpec ...
func NewJobSpec ¶
func NewJobSpec(schedule string, factory JobFactory) JobSpec
type MagicLinkAuthContext ¶
type MultiUserAgent ¶
type MultiUserAgent struct { WhoFollowsURL string SupportURL string // contains filtered or unexported fields }
MultiUserAgent is a multi-user Twtxt client, currently only `yarnd` is such a client.
func (*MultiUserAgent) Followers ¶
func (ua *MultiUserAgent) Followers(conf *Config) types.Followers
func (*MultiUserAgent) IsPublicURL ¶
func (ua *MultiUserAgent) IsPublicURL() bool
func (*MultiUserAgent) PodBaseURL ¶
func (ua *MultiUserAgent) PodBaseURL() string
func (*MultiUserAgent) String ¶
func (ua *MultiUserAgent) String() string
type NewUserEmailContext ¶
type Option ¶
Option is a function that takes a config struct and modifies it
func WithAPISessionTime ¶
WithAPISessionTime sets the API session time for tokens
func WithAPISigningKey ¶
WithAPISigningKey sets the API JWT signing key for tokens
func WithAdminEmail ¶
WithAdminEmail sets the Admin email used to contact the pod operator
func WithAdminName ¶
WithAdminName sets the Admin name used to identify the pod operator
func WithAdminUser ¶
WithAdminUser sets the Admin user used for granting special features to
func WithAuthHeader ¶
WithAuthHeader sets the auth header to use for proxy auth
func WithBaseURL ¶
WithBaseURL sets the Base URL used for constructing feed URLs
func WithBlockedFeeds ¶
WithBlockedFeeds sets the list of feed uris blocked and prohibited from being fetched by the global feed cache
func WithCookieSecret ¶
WithCookieSecret sets the server's cookie secret
func WithDescription ¶
WithDescription sets the instance's description
func WithDisableArchive ¶
WithDisableArchive sets the disable archive flag
func WithDisableFfmpeg ¶
WithDisableFfmpeg sets the disable ffmpeg flag
func WithDisableGzip ¶
WithDisableGzip sets the disable Gzip flag
func WithDisableLogger ¶
WithDisableLogger sets the disable Logger flag
func WithDisableMedia ¶
WithDisableMedia sets the disable Media flag
func WithDisableSupport ¶
WithDisableSupport disables support (support and abuse)
func WithEmbedRules ¶
WithEmbedRules parses the json of URL-to-embed rewriting rules
func WithEnabledFeatures ¶
func WithEnabledFeatures(features []FeatureType) Option
WithEnabledFeatures enables the selected features
func WithFeedSources ¶
WithFeedSources sets the feed sources to use for external feeds
func WithFetchInterval ¶
WithFetchInterval sets the cache fetch interval Accepts a string as parsed by `time.ParseDuration`
func WithFrontPage ¶
WithFrontPage sets the behaviour of the pod's front page (anonymous discover view)
func WithMagicLinkSecret ¶
WithMagicLinkSecret sets the MagicLinkSecert used to create password reset tokens
func WithMaxCacheFetchers ¶
WithMaxCacheFetchers sets the maximum number of fetchers for the feed cache
func WithMaxCacheItems ¶
WithMaxCacheItems sets the maximum cache items (per feed source) of twts in memory
func WithMaxCacheTTL ¶
WithMaxCacheTTL sets the maximum cache ttl of twts in memory
func WithMaxFeedSize ¶
WithMaxFeedSize sets the maximum feed size before a feed is rotated
func WithMaxFetchLimit ¶
WithMaxFetchLimit sets the maximum feed fetch limit in bytes
func WithMaxTwtLength ¶
WithMaxTwtLength sets the maximum length of posts permitted on the server
func WithMaxUploadSize ¶
WithMaxUploadSize sets the maximum upload size permitted by the server
func WithOpenProfiles ¶
WithOpenProfiles sets whether or not to have open user profiles
func WithOpenRegistrations ¶
WithOpenRegistrations sets the open registrations flag
func WithPermittedImages ¶
WithPermittedImages sets the list of image domains permitted for external iamges to display inline
func WithSMTPFrom ¶
WithSMTPFrom sets the SMTPFrom address to use for sending email
func WithSMTPHost ¶
WithSMTPHost sets the SMTPHost to use for sending email
func WithSMTPPass ¶
WithSMTPPass sets the SMTPPass to use for sending email
func WithSMTPPort ¶
WithSMTPPort sets the SMTPPort to use for sending email
func WithSMTPUser ¶
WithSMTPUser sets the SMTPUser to use for sending email
func WithSessionCacheTTL ¶
WithSessionCacheTTL sets the server's session cache ttl
func WithSessionExpiry ¶
WithSessionExpiry sets the server's session expiry time
func WithTLSCert ¶
WithTLSCert sets the path to a TLS certificate
func WithTLSKey ¶
WithTLSKey sets the path to a TLS private key
func WithTranscoderTimeout ¶
WithTranscoderTimeout sets the video transcoding timeout
func WithTwtsPerPage ¶
WithTwtsPerPage sets the server's twts per page
type Pod ¶
type Pod struct { URI string `json:"-"` Name string `json:"name"` Logo string `json:"logo"` Description string `json:"description"` SoftwareVersion string `json:"software_version"` BuildInformation string `json:"build_info"` // lastSeen records the timestamp of when we last saw this pod. LastSeen time.Time `json:"last_seen"` // Trusted indicates if the pod operator accepted this pod as a trusted // peer or not. Only when accepted, Pod Gossiping will take this peer into // consideration. Trusted bool `json:"trusted"` // lastUpdated is used to periodically re-check the peering pod's /info endpoint in case of changes. LastUpdated time.Time `json:"-"` }
Pod represents a peer pod
func (*Pod) GetTwt ¶
GetTwt requests a twt from the peer pod by its hash and returns the decoded twt or an error. If the peer pod is not trusted, it returns an error.
func (*Pod) IsZero ¶
IsZero returns true if the Pod is nil or both its Name and SoftwareVersion are empty strings, indicating that the Pod is uninitialized or has no meaningful data.
func (*Pod) ShouldRefresh ¶
ShouldRefresh returns true if the Pod should be refreshed (i.e. its /info should be requested and updated) based on the last time it was updated.
type PodInfo ¶
type PodInfo Pod
PodInfo is an alias for Pod XXX: Type aliases for backwards compatibility with Cache v19
type PruneFollowersJob ¶
type PruneFollowersJob struct {
// contains filtered or unexported fields
}
func (*PruneFollowersJob) Run ¶
func (job *PruneFollowersJob) Run()
func (*PruneFollowersJob) String ¶
func (job *PruneFollowersJob) String() string
type PruneUsersJob ¶
type PruneUsersJob struct {
// contains filtered or unexported fields
}
func (*PruneUsersJob) Run ¶
func (job *PruneUsersJob) Run()
func (*PruneUsersJob) String ¶
func (job *PruneUsersJob) String() string
type ReportAbuseEmailContext ¶
type Result ¶
type Result struct { ID string Type types.FeedType Feed string Nick string Avatar string Author string Hash string Text string Conv string Tags []string Links []string Mentions []string Subject string Created time.Time Hit int Score float64 Locations search.FieldTermLocationMap }
Result ...
type RotateFeedsJob ¶
type RotateFeedsJob struct {
// contains filtered or unexported fields
}
func (*RotateFeedsJob) Run ¶
func (job *RotateFeedsJob) Run()
func (*RotateFeedsJob) String ¶
func (job *RotateFeedsJob) String() string
type Router ¶
type Router struct { httprouter.Router // contains filtered or unexported fields }
Router ...
func (*Router) DELETE ¶
func (r *Router) DELETE(path string, handle httprouter.Handle)
DELETE is a shortcut for Router.Handle("DELETE", path, handle)
func (*Router) GET ¶
func (r *Router) GET(path string, handle httprouter.Handle)
GET is a shortcut for Router.Handle("GET", path, handle)
func (*Router) Group ¶
func (r *Router) Group(path string, m ...Middleware) *Router
Group returns new *Router with given path and middlewares. It should be used for handles which have same path prefix or common middlewares.
func (*Router) HEAD ¶
func (r *Router) HEAD(path string, handle httprouter.Handle)
HEAD is a shortcut for Router.Handle("HEAD", path, handle)
func (*Router) Handle ¶
func (r *Router) Handle(method, path string, handle httprouter.Handle)
Handle registers a new request handle combined with middlewares.
func (*Router) HandlerFunc ¶
func (r *Router) HandlerFunc(method, path string, handler http.HandlerFunc)
HandlerFunc is an adapter for http.HandlerFunc.
func (*Router) OPTIONS ¶
func (r *Router) OPTIONS(path string, handle httprouter.Handle)
OPTIONS is a shortcut for Router.Handle("OPTIONS", path, handle)
func (*Router) PATCH ¶
func (r *Router) PATCH(path string, handle httprouter.Handle)
PATCH is a shortcut for Router.Handle("PATCH", path, handle)
func (*Router) POST ¶
func (r *Router) POST(path string, handle httprouter.Handle)
POST is a shortcut for Router.Handle("POST", path, handle)
func (*Router) PUT ¶
func (r *Router) PUT(path string, handle httprouter.Handle)
PUT is a shortcut for Router.Handle("PUT", path, handle)
func (*Router) ServeFiles ¶
func (r *Router) ServeFiles(path string, root http.FileSystem)
ServeFiles ...
func (*Router) ServeFilesWithCacheControl ¶
ServeFilesWithCacheControl ...
func (*Router) Use ¶
func (r *Router) Use(m ...Middleware) *Router
Use appends new middleware to current Router.
type SearchResult ¶
SearchResult ...
type Server ¶
type Server struct { // Factory Functions AppendTwt AppendTwtFunc FilterTwts FilterTwtsFunc // contains filtered or unexported fields }
Server ...
func (*Server) AddCronJob ¶
AddCronJob ...
func (*Server) AddUserHandler ¶
func (s *Server) AddUserHandler() httprouter.Handle
AddUserHandler ...
func (*Server) BookmarkHandler ¶
func (s *Server) BookmarkHandler() httprouter.Handle
BookmarkHandler ...
func (*Server) BookmarksHandler ¶
func (s *Server) BookmarksHandler() httprouter.Handle
BookmarksHandler ...
func (*Server) CaptchaHandler ¶
func (s *Server) CaptchaHandler() httprouter.Handle
CaptchaHandler ...
func (*Server) ConversationHandler ¶
func (s *Server) ConversationHandler() httprouter.Handle
ConversationHandler ...
func (*Server) DelFeedHandler ¶
func (s *Server) DelFeedHandler() httprouter.Handle
DelFeedHandler ...
func (*Server) DelUserHandler ¶
func (s *Server) DelUserHandler() httprouter.Handle
DelUserHandler ...
func (*Server) DeleteFeedHandler ¶
func (s *Server) DeleteFeedHandler() httprouter.Handle
DeleteFeedHandler...
func (*Server) DeletePeerHandler ¶
func (s *Server) DeletePeerHandler() httprouter.Handle
func (*Server) DeleteTwtHandler ¶
func (s *Server) DeleteTwtHandler() httprouter.Handle
DeleteTwtHandler ...
func (*Server) DiscoverHandler ¶
func (s *Server) DiscoverHandler() httprouter.Handle
DiscoverHandler returns a handler that renders the discover page.
The handler shows a view of all twts that the user has access to, filtered by the user's current filter settings. The handler also shows the current user's last twt, if they are logged in.
The handler will return a 500 error if there is an internal error loading the twts, or if the user is not authenticated and the feature FeatureFilterAndLists is not enabled.
func (*Server) ExternalAvatarHandler ¶
func (s *Server) ExternalAvatarHandler() httprouter.Handle
ExternalAvatarHandler ...
func (*Server) ExternalFollowingHandler ¶
func (s *Server) ExternalFollowingHandler() httprouter.Handle
ExternalFollowingHandler ...
func (*Server) ExternalHandler ¶
func (s *Server) ExternalHandler() httprouter.Handle
ExternalHandler ...
func (*Server) FollowersHandler ¶
func (s *Server) FollowersHandler() httprouter.Handle
FollowersHandler handles HTTP requests to retrieve and display the list of followers for the authenticated user. It responds with a JSON encoded list of followers if the "Accept" header specifies "application/json". Otherwise, it renders an HTML page displaying the followers. The handler utilizes the cache to efficiently fetch the list of followers and updates the user's profile context accordingly. If an error occurs during JSON encoding, it responds with a "Bad Request" status.
func (*Server) FollowingHandler ¶
func (s *Server) FollowingHandler() httprouter.Handle
FollowingHandler handles HTTP requests for retrieving and displaying the list of users that a specified user is following. It supports both JSON and plain text responses based on the "Accept" header in the request. The handler checks if the requested user's following list is publicly visible or if the requester is the user themselves. If the user is not found or access is restricted, it renders appropriate error responses. Otherwise, it encodes the following list in the requested format and sends it back to the client.
func (*Server) IndieAuthCallbackHandler ¶
func (s *Server) IndieAuthCallbackHandler() httprouter.Handle
IndieAuthCallbackHandler ...
func (*Server) IndieAuthHandler ¶
func (s *Server) IndieAuthHandler() httprouter.Handle
IndieAuthHandler ...
func (*Server) IndieAuthVerifyHandler ¶
func (s *Server) IndieAuthVerifyHandler() httprouter.Handle
IndieAuthVerifyHandler ...
func (*Server) LoginEmailHandler ¶
func (s *Server) LoginEmailHandler() httprouter.Handle
LoginEmailHandler ...
func (*Server) MagicLinkAuthHandler ¶
func (s *Server) MagicLinkAuthHandler() httprouter.Handle
MagicLinkAuthHandler ...
func (*Server) ManageFeedHandler ¶
func (s *Server) ManageFeedHandler() httprouter.Handle
ManageFeedHandler...
func (*Server) ManageJobsHandler ¶
func (s *Server) ManageJobsHandler() httprouter.Handle
ManageJobsHandler ...
func (*Server) ManagePeersHandler ¶
func (s *Server) ManagePeersHandler() httprouter.Handle
ManagePeersHandler ...
func (*Server) ManagePodHandler ¶
func (s *Server) ManagePodHandler() httprouter.Handle
ManagePodHandler ...
func (*Server) ManageUsersHandler ¶
func (s *Server) ManageUsersHandler() httprouter.Handle
ManageUsersHandler ...
func (*Server) MentionsHandler ¶
func (s *Server) MentionsHandler() httprouter.Handle
MentionsHandler handles HTTP requests for displaying a user's mentions. It retrieves mentions for the authenticated user, applying any specified filters and paginates the results. The mentions are rendered as an HTML response, displaying them in the order of creation. If an error occurs during sorting or paging, an error page is displayed. The handler supports both the feature flag for filtered views and non-filtered fallback.
func (*Server) NewPasswordHandler ¶
func (s *Server) NewPasswordHandler() httprouter.Handle
NewPasswordHandler ...
func (*Server) NotFoundHandler ¶
func (s *Server) NotFoundHandler(w http.ResponseWriter, r *http.Request)
func (*Server) PageHandler ¶
func (s *Server) PageHandler(name string) httprouter.Handle
PageHandler ...
func (*Server) PermalinkHandler ¶
func (s *Server) PermalinkHandler() httprouter.Handle
PermalinkHandler ...
func (*Server) PodConfigHandler ¶
func (s *Server) PodConfigHandler() httprouter.Handle
PodConfigHandler ...
func (*Server) PodInfoHandler ¶
func (s *Server) PodInfoHandler() httprouter.Handle
PodInfoHandler ...
func (*Server) PodLogoHandler ¶
func (s *Server) PodLogoHandler() httprouter.Handle
PodLogoHandler ...
func (*Server) PostHandler ¶
func (s *Server) PostHandler() httprouter.Handle
PostHandler handles the creation/modification/deletion of a twt.
TODO: Support deleting/patching last feed (`postas`) twt too.
func (*Server) ProfileHandler ¶
func (s *Server) ProfileHandler() httprouter.Handle
ProfileHandler ...
func (*Server) RefreshCacheHandler ¶
func (s *Server) RefreshCacheHandler() httprouter.Handle
RefreshCacheHandler ...
func (*Server) RegisterHandler ¶
func (s *Server) RegisterHandler() httprouter.Handle
RegisterHandler ...
func (*Server) ResetPasswordHandler ¶
func (s *Server) ResetPasswordHandler() httprouter.Handle
ResetPasswordHandler ...
func (*Server) ResetPasswordMagicLinkHandler ¶
func (s *Server) ResetPasswordMagicLinkHandler() httprouter.Handle
ResetPasswordMagicLinkHandler ...
func (*Server) RstUserHandler ¶
func (s *Server) RstUserHandler() httprouter.Handle
RstUserHandler ...
func (*Server) SettingsAddLinkHandler ¶
func (s *Server) SettingsAddLinkHandler() httprouter.Handle
SettingsAddLinkHandler ...
func (*Server) SettingsHandler ¶
func (s *Server) SettingsHandler() httprouter.Handle
SettingsHandler ...
func (*Server) SettingsRemoveLinkHandler ¶
func (s *Server) SettingsRemoveLinkHandler() httprouter.Handle
SettingsRemoveLinkHandler ...
func (*Server) SupportHandler ¶
func (s *Server) SupportHandler() httprouter.Handle
SupportHandler ...
func (*Server) SyndicationHandler ¶
func (s *Server) SyndicationHandler() httprouter.Handle
SyndicationHandler ...
func (*Server) TimelineHandler ¶
func (s *Server) TimelineHandler() httprouter.Handle
TimelineHandler handles HTTP requests for displaying the user's timeline. It supports both authenticated and unauthenticated requests by determining the appropriate set of twts to display based on the user's authentication status and configured front page settings. The function also applies any specified filters to the timeline entries and paginates the results. The timeline is rendered as an HTML response, and it handles errors in fetching and sorting the twts, displaying an error page if necessary.
func (*Server) TrustPeerHandler ¶
func (s *Server) TrustPeerHandler() httprouter.Handle
func (*Server) UnfollowHandler ¶
func (s *Server) UnfollowHandler() httprouter.Handle
UnfollowHandler ...
func (*Server) UploadMediaHandler ¶
func (s *Server) UploadMediaHandler() httprouter.Handle
UploadMediaHandler ...
func (*Server) UserConfigHandler ¶
func (s *Server) UserConfigHandler() httprouter.Handle
UserConfigHandler ...
func (*Server) WebFingerHandler ¶
func (s *Server) WebFingerHandler() httprouter.Handle
WebFingerHandler ...
func (*Server) WebMentionHandler ¶
func (s *Server) WebMentionHandler() httprouter.Handle
WebMentionHandler ...
func (*Server) WhoFollowsHandler ¶
func (s *Server) WhoFollowsHandler() httprouter.Handle
WhoFollowsHandler ...
type SessionStore ¶
type SessionStore struct {
// contains filtered or unexported fields
}
SessionStore ...
func (*SessionStore) DelSession ¶
func (s *SessionStore) DelSession(sid string) error
func (*SessionStore) GetAllSessions ¶
func (s *SessionStore) GetAllSessions() ([]*sessions.Session, error)
func (*SessionStore) GetSession ¶
func (s *SessionStore) GetSession(sid string) (*sessions.Session, error)
func (*SessionStore) HasSession ¶
func (s *SessionStore) HasSession(sid string) bool
func (*SessionStore) LenSessions ¶
func (s *SessionStore) LenSessions() int64
func (*SessionStore) SetSession ¶
func (s *SessionStore) SetSession(sid string, sess *sessions.Session) error
func (*SessionStore) SyncSession ¶
func (s *SessionStore) SyncSession(sess *sessions.Session) error
type Settings ¶
type Settings struct { Name string `yaml:"pod_name"` Logo string `yaml:"pod_logo"` CSS string `yaml:"pod_css"` JS string `yaml:"pod_js"` Description string `yaml:"pod_description"` AlertFloat bool `yaml:"pod_alert_float"` AlertGuest bool `yaml:"pod_alert_guest"` AlertMessage string `yaml:"pod_alert_message"` AlertType string `yaml:"pod_alert_type"` MaxTwtLength int `yaml:"max_twt_length"` TwtsPerPage int `yaml:"twts_per_page"` MediaResolution int `yaml:"media_resolution"` AvatarResolution int `yaml:"avatar_resolution"` OpenProfiles bool `yaml:"open_profiles"` OpenRegistrations bool `yaml:"open_registrations"` DisableSupport bool `yaml:"disable_support"` FrontPage string `yaml:"front_page"` FrontPageCompact bool `yaml:"front_page_compact"` // XXX: Deprecated fields (See: https://git.mills.io/yarnsocial/yarn/pulls/711) // TODO: Remove post v0.14.x BlacklistedFeeds []string `yaml:"blacklisted_feeds"` WhitelistedImages []string `yaml:"whitelisted_images"` BlockedFeeds []string `yaml:"blocked_feeds"` PermittedImages []string `yaml:"permitted_images"` EmbedRules string `yaml:"embed_rules"` Features *FeatureFlags `yaml:"features"` // Pod Level Settings (overridable by Users) DisplayDatesInTimezone string `yaml:"display_dates_in_timezone"` DisplayTimePreference string `yaml:"display_time_preference"` OpenLinksInPreference string `yaml:"open_links_in_preference"` DisplayImagesPreference string `yaml:"display_images_preference"` DisplayMedia bool `yaml:"display_media"` OriginalMedia bool `yaml:"original_media"` VisibilityCompact bool `yaml:"visibility_compact"` VisibilityReadmore bool `yaml:"visibility_readmore"` LinkVerification bool `yaml:"link_verification"` StripTrackingParam bool `yaml:"strip_trackingparam"` CustomPrimaryColor string `yaml:"custom_primarycolor"` CustomSecondaryColor string `yaml:"custom_secondarycolor"` }
Settings contains Pod Settings that can be customised via the Web UI
func LoadSettings ¶
LoadSettings loads pod settings from the given path
type SingleUserAgent ¶
SingleUserAgent is a single Twtxt User Agent whether it be `tt`, `jenny` or a single-user `yarnd` client.
func (*SingleUserAgent) Followers ¶
func (ua *SingleUserAgent) Followers(conf *Config) types.Followers
func (*SingleUserAgent) IsPublicURL ¶
func (ua *SingleUserAgent) IsPublicURL() bool
func (*SingleUserAgent) PodBaseURL ¶
func (ua *SingleUserAgent) PodBaseURL() string
func (*SingleUserAgent) String ¶
func (ua *SingleUserAgent) String() string
type SoftwareConfig ¶
type SoftwareConfig struct { Software string FullVersion string Version string Commit string Build string Author string License string Copyright string }
SoftwareConfig contains the server version information
type Store ¶
type Store interface { DB() *bitcask.Bitcask Backup(string) error Restore(string) error Merge() error Close() error Sync() error DelFeed(name string) error HasFeed(name string) bool GetFeed(name string) (*Feed, error) SetFeed(name string, user *Feed) error LenFeeds() int64 SearchFeeds(prefix string) []string GetAllFeeds() ([]*Feed, error) DelUser(username string) error HasUser(username string) bool GetUser(username string) (*User, error) SetUser(username string, user *User) error LenUsers() int64 SearchUsers(prefix string) []string GetAllUsers() ([]*User, error) GetSession(sid string) (*sessions.Session, error) SetSession(sid string, sess *sessions.Session) error HasSession(sid string) bool DelSession(sid string) error SyncSession(sess *sessions.Session) error LenSessions() int64 GetAllSessions() ([]*sessions.Session, error) }
type StoreFactory ¶
type SyncStoreJob ¶
type SyncStoreJob struct {
// contains filtered or unexported fields
}
func (*SyncStoreJob) Run ¶
func (job *SyncStoreJob) Run()
func (*SyncStoreJob) String ¶
func (job *SyncStoreJob) String() string
type TTLCache ¶
func NewTTLCache ¶
type TemplateManager ¶
func NewTemplateManager ¶
func NewTemplateManager(conf *Config, translator *Translator, cache *Cache, archive Archiver) (*TemplateManager, error)
func (*TemplateManager) Add ¶
func (m *TemplateManager) Add(name string, template *template.Template)
func (*TemplateManager) ExecPartial ¶
func (*TemplateManager) LoadTemplates ¶
func (m *TemplateManager) LoadTemplates() error
type Token ¶
type Token struct { Signature string Value string UserAgent string CreatedAt time.Time ExpiresAt time.Time }
Token ...
type Translator ¶
func NewTranslator ¶
func NewTranslator() (*Translator, error)
type TwtTextFormat ¶
type TwtTextFormat int
TwtTextFormat represents the format of which the twt text gets formatted to
const ( // MarkdownFmt to use markdown format MarkdownFmt TwtTextFormat = iota // HTMLFmt to use HTML format HTMLFmt // TextFmt to use for og:description TextFmt )
type TwtxtUserAgent ¶
type TwtxtUserAgent interface { fmt.Stringer // IsPod returns true if the Twtxt client's User-Agent appears to be a Yarn.social pod (single or multi-user). IsPod() bool // PodBaseURL returns the base URL of the client's User-Agent if it appears to be a Yarn.social pod (single or multi-user). PodBaseURL() string // IsPublicURL returns true if the Twtxt client's User-Agent is from what appears to be the public internet. IsPublicURL() bool // Followers returns a list of followers for this client follows, in the case of a // single user agent, it is simply a list of itself, with a multi-user agent the // client (i.e: a `yarnd` pod) is aksed who followers the user/feed by requesting // the whoFollows resource Followers(conf *Config) types.Followers }
TwtxtUserAgent ...
func ParseUserAgent ¶
func ParseUserAgent(ua string) (TwtxtUserAgent, error)
type URLProcessor ¶
type URLProcessor struct { Images []string // contains filtered or unexported fields }
func (*URLProcessor) RenderNodeHook ¶
func (up *URLProcessor) RenderNodeHook(w io.Writer, node ast.Node, entering bool) (ast.WalkStatus, bool)
type UpdateFeedSourcesJob ¶
type UpdateFeedSourcesJob struct {
// contains filtered or unexported fields
}
func (*UpdateFeedSourcesJob) Run ¶
func (job *UpdateFeedSourcesJob) Run()
func (*UpdateFeedSourcesJob) String ¶
func (job *UpdateFeedSourcesJob) String() string
type UpdateFeedsJob ¶
type UpdateFeedsJob struct {
// contains filtered or unexported fields
}
func (*UpdateFeedsJob) Run ¶
func (job *UpdateFeedsJob) Run()
func (*UpdateFeedsJob) String ¶
func (job *UpdateFeedsJob) String() string
type User ¶
type User struct { Username string // XXX: `User.Password“ field is Deprecated in favor of `User.PasswordHash“ // TODO: Remove once all (most?) pods are on yarnd v0.17+ Password string `json:",omitempty"` PasswordHash []byte Tagline string URL string CreatedAt time.Time LastSeenAt time.Time StartPage string `default:"#origin"` Theme string `default:"auto"` Lang string `default:""` Recovery string `default:""` AvatarHash string `default:""` DisplayDatesInTimezone string `default:"UTC"` DisplayTimePreference string `default:"24h"` OpenLinksInPreference string `default:"newwindow"` DisplayTimelinePreference string `default:"list"` DisplayImagesPreference string `default:"inline"` DisplayMedia bool `default:"true"` OriginalMedia bool `default:"false"` VisibilityCompact bool `default:"false"` VisibilityReadmore bool `default:"false"` LinkVerification bool `default:"false"` StripTrackingParam bool `default:"false"` CustomPrimaryColor string `default:""` CustomSecondaryColor string `default:""` IsFollowingPubliclyVisible bool `default:"true"` IsBookmarksPubliclyVisible bool `default:"true"` Feeds []string `default:"[]"` Bookmarks map[string]string `default:"{}"` Followers map[string]string `default:"{}"` Following map[string]string `default:"{}"` Links map[string]string `default:"{}"` Muted map[string]string `default:"{}"` // contains filtered or unexported fields }
User ...
func GetUserFromTwter ¶
func (*User) AddFollower ¶
func (*User) Bookmarked ¶
func (*User) DelFollower ¶
func (*User) DisplayTimeFormat ¶
func (*User) FollowedBy ¶
func (*User) RemoveLink ¶
func (*User) Reply ¶
Reply generates a reply mention string for a given twt. If the user follows the original twt's author and it's not the user themselves, it adds the author's alias or URI as the first mention. If the author is not followed, it uses the author's domain nickname. Returns an empty string if the twt's author is the user.
func (*User) Source ¶
func (u *User) Source() types.FetchFeedRequests
func (*User) Sources ¶
func (u *User) Sources() types.FetchFeedRequests
type VideoOptions ¶
type VideoTask ¶
func NewVideoTask ¶
type YarndUserAgent ¶
type YarndUserAgent struct { Name string SupportURL string // contains filtered or unexported fields }
YarndUserAgent is a generic `yarnd` client.
func (*YarndUserAgent) Followers ¶
func (ua *YarndUserAgent) Followers(conf *Config) types.Followers
func (*YarndUserAgent) IsPublicURL ¶
func (ua *YarndUserAgent) IsPublicURL() bool
func (*YarndUserAgent) PodBaseURL ¶
func (ua *YarndUserAgent) PodBaseURL() string
func (*YarndUserAgent) String ¶
func (ua *YarndUserAgent) String() string
Source Files ¶
- actions.go
- api.go
- archive.go
- audio_task.go
- bitcask_store.go
- bookmark_handlers.go
- cache.go
- config.go
- context.go
- conversation_handler.go
- email.go
- errors.go
- external_handlers.go
- features.go
- feed.go
- feeds_handlers.go
- feedsources.go
- follow_handlers.go
- handlers.go
- image_task.go
- index.go
- indieauth_handlers.go
- init.go
- jobs.go
- lists_handler.go
- login_handlers.go
- logout_handler.go
- manage_handlers.go
- media_handlers.go
- middleware.go
- models.go
- mute_handlers.go
- options.go
- page_handlers.go
- password_handlers.go
- permalink_handler.go
- post_handler.go
- profile_handler.go
- register_handler.go
- robots.go
- router.go
- search_handler.go
- server.go
- session_store.go
- settings_handlers.go
- stats.go
- store.go
- support_handlers.go
- templates.go
- tokencache.go
- translator.go
- ttlcache.go
- twtxt_handlers.go
- user_creator.go
- utils.go
- video_task.go
- view_handlers.go
- webfinger_handlers.go
- webfinger_resolver.go
- websub_handlers.go
- whofollows_handler.go