diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ea38748..30ec4bb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,7 +4,7 @@ Welcome! We're glad you're interested in contributing to WriteFreely. For **questions**, **help**, **feature requests**, and **general discussion**, please use [our forum](https://discuss.write.as). -For **bug reports**, please [open a GitHub issue](https://github.com/writeas/writefreely/issues/new). See our guide on [submitting bug reports](https://writefreely.org/contribute#bugs). +For **bug reports**, please [open a GitHub issue](https://github.com/writefreely/writefreely/issues/new). See our guide on [submitting bug reports](https://writefreely.org/contribute#bugs). ## Getting Started @@ -80,9 +80,9 @@ We highly value commit messages that follow established form within the project. When in doubt, look to our existing git history for examples of good commit messages. Here are a few: -* [Rename Suspend status to Silence](https://github.com/writeas/writefreely/commit/7e014ca65958750ab703e317b1ce8cfc4aad2d6e) -* [Show 404 when remote user not found](https://github.com/writeas/writefreely/commit/867eb53b3596bd7b3f2be3c53a3faf857f4cd36d) -* [Fix post deletion on Pleroma](https://github.com/writeas/writefreely/commit/fe82cbb96e3d5c57cfde0db76c28c4ea6dabfe50) +* [Rename Suspend status to Silence](https://github.com/writefreely/writefreely/commit/7e014ca65958750ab703e317b1ce8cfc4aad2d6e) +* [Show 404 when remote user not found](https://github.com/writefreely/writefreely/commit/867eb53b3596bd7b3f2be3c53a3faf857f4cd36d) +* [Fix post deletion on Pleroma](https://github.com/writefreely/writefreely/commit/fe82cbb96e3d5c57cfde0db76c28c4ea6dabfe50) ### Submitting pull requests diff --git a/Dockerfile b/Dockerfile index f4b5a0d..1021ec4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,8 +5,8 @@ RUN apk add --update nodejs nodejs-npm make g++ git RUN npm install -g less less-plugin-clean-css RUN go get -u github.com/go-bindata/go-bindata/... -RUN mkdir -p /go/src/github.com/writeas/writefreely -WORKDIR /go/src/github.com/writeas/writefreely +RUN mkdir -p /go/src/github.com/writefreely/writefreely +WORKDIR /go/src/github.com/writefreely/writefreely COPY . . @@ -16,11 +16,11 @@ RUN make build \ && make ui RUN mkdir /stage && \ cp -R /go/bin \ - /go/src/github.com/writeas/writefreely/templates \ - /go/src/github.com/writeas/writefreely/static \ - /go/src/github.com/writeas/writefreely/pages \ - /go/src/github.com/writeas/writefreely/keys \ - /go/src/github.com/writeas/writefreely/cmd \ + /go/src/github.com/writefreely/writefreely/templates \ + /go/src/github.com/writefreely/writefreely/static \ + /go/src/github.com/writefreely/writefreely/pages \ + /go/src/github.com/writefreely/writefreely/keys \ + /go/src/github.com/writefreely/writefreely/cmd \ /stage # Final image diff --git a/Makefile b/Makefile index a240a27..663faf6 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ GITREV=`git describe | cut -c 2-` -LDFLAGS=-ldflags="-X 'github.com/writeas/writefreely.softwareVer=$(GITREV)'" +LDFLAGS=-ldflags="-X 'github.com/writefreely/writefreely.softwareVer=$(GITREV)'" GOCMD=go GOINSTALL=$(GOCMD) install $(LDFLAGS) diff --git a/README.md b/README.md index 163eab7..02c8300 100644 --- a/README.md +++ b/README.md @@ -4,17 +4,17 @@


- + Latest release Build status - + - - Go Report Card + + Go Report Card @@ -62,7 +62,7 @@ The quickest way to deploy WriteFreely is with [Write.as](https://write.as/write WriteFreely deploys as a static binary on any platform and architecture that Go supports. Just use our built-in SQLite support, or add a MySQL database, and you'll be up and running! -For common platforms, start with our [pre-built binaries](https://github.com/writeas/writefreely/releases/) and head over to our [installation guide](https://writefreely.org/start) to get started. +For common platforms, start with our [pre-built binaries](https://github.com/writefreely/writefreely/releases/) and head over to our [installation guide](https://writefreely.org/start) to get started. ### Packages @@ -80,10 +80,10 @@ Start hacking on WriteFreely with our [developer setup guide](https://writefreel ## Contributing -We gladly welcome contributions to WriteFreely, whether in the form of [code](https://github.com/writeas/writefreely/blob/master/CONTRIBUTING.md#contributing-to-writefreely), [bug reports](https://github.com/writeas/writefreely/issues/new?template=bug_report.md), [feature requests](https://discuss.write.as/c/feedback/feature-requests), [translations](https://poeditor.com/join/project/TIZ6HFRFdE), or [documentation](https://github.com/writefreely/documentation) improvements. +We gladly welcome contributions to WriteFreely, whether in the form of [code](https://github.com/writefreely/writefreely/blob/master/CONTRIBUTING.md#contributing-to-writefreely), [bug reports](https://github.com/writefreely/writefreely/issues/new?template=bug_report.md), [feature requests](https://discuss.write.as/c/feedback/feature-requests), [translations](https://poeditor.com/join/project/TIZ6HFRFdE), or [documentation](https://github.com/writefreely/documentation) improvements. -Before contributing anything, please read our [Contributing Guide](https://github.com/writeas/writefreely/blob/master/CONTRIBUTING.md#contributing-to-writefreely). It describes the correct channels for submitting contributions and any potential requirements. +Before contributing anything, please read our [Contributing Guide](https://github.com/writefreely/writefreely/blob/master/CONTRIBUTING.md#contributing-to-writefreely). It describes the correct channels for submitting contributions and any potential requirements. ## License -Copyright © 2018-2020 [A Bunch Tell LLC](https://abunchtell.com) and contributing authors. Licensed under the [AGPL](https://github.com/writeas/writefreely/blob/develop/LICENSE). +Copyright © 2018-2021 [A Bunch Tell LLC](https://abunchtell.com) and contributing authors. Licensed under the [AGPL](https://github.com/writefreely/writefreely/blob/develop/LICENSE). diff --git a/account.go b/account.go index 9b90942..ba3c391 100644 --- a/account.go +++ b/account.go @@ -1,5 +1,5 @@ /* - * Copyright © 2018-2020 A Bunch Tell LLC. + * Copyright © 2018-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -27,10 +27,9 @@ import ( "github.com/writeas/web-core/auth" "github.com/writeas/web-core/data" "github.com/writeas/web-core/log" - - "github.com/writeas/writefreely/author" - "github.com/writeas/writefreely/config" - "github.com/writeas/writefreely/page" + "github.com/writefreely/writefreely/author" + "github.com/writefreely/writefreely/config" + "github.com/writefreely/writefreely/page" ) type ( diff --git a/activitypub.go b/activitypub.go index 0e69075..8d4176f 100644 --- a/activitypub.go +++ b/activitypub.go @@ -1,5 +1,5 @@ /* - * Copyright © 2018-2020 A Bunch Tell LLC. + * Copyright © 2018-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -21,6 +21,7 @@ import ( "net/http" "net/http/httputil" "net/url" + "path/filepath" "strconv" "time" @@ -41,6 +42,19 @@ const ( apCacheTime = time.Minute ) +var instanceColl *Collection + +func initActivityPub(app *App) { + ur, _ := url.Parse(app.cfg.App.Host) + instanceColl = &Collection{ + ID: 0, + Alias: ur.Host, + Title: ur.Host, + db: app.db, + hostName: app.cfg.App.Host, + } +} + type RemoteUser struct { ID int64 ActorID string @@ -76,12 +90,17 @@ func handleFetchCollectionActivities(app *App, w http.ResponseWriter, r *http.Re vars := mux.Vars(r) alias := vars["alias"] + if alias == "" { + alias = filepath.Base(r.RequestURI) + } // TODO: enforce visibility // Get base Collection data var c *Collection var err error - if app.cfg.App.SingleUser { + if alias == r.Host { + c = instanceColl + } else if app.cfg.App.SingleUser { c, err = app.db.GetCollectionByID(1) } else { c, err = app.db.GetCollection(alias) @@ -89,16 +108,19 @@ func handleFetchCollectionActivities(app *App, w http.ResponseWriter, r *http.Re if err != nil { return err } - silenced, err := app.db.IsUserSilenced(c.OwnerID) - if err != nil { - log.Error("fetch collection activities: %v", err) - return ErrInternalGeneral - } - if silenced { - return ErrCollectionNotFound - } c.hostName = app.cfg.App.Host + if !c.IsInstanceColl() { + silenced, err := app.db.IsUserSilenced(c.OwnerID) + if err != nil { + log.Error("fetch collection activities: %v", err) + return ErrInternalGeneral + } + if silenced { + return ErrCollectionNotFound + } + } + p := c.PersonObject() setCacheControl(w, apCacheTime) @@ -546,6 +568,22 @@ func resolveIRI(hostName, url string) ([]byte, error) { r.Header.Add("Accept", "application/activity+json") r.Header.Set("User-Agent", ServerUserAgent(hostName)) + p := instanceColl.PersonObject() + h := sha256.New() + h.Write([]byte{}) + r.Header.Add("Digest", "SHA-256="+base64.StdEncoding.EncodeToString(h.Sum(nil))) + + // Sign using the 'Signature' header + privKey, err := activitypub.DecodePrivateKey(p.GetPrivKey()) + if err != nil { + return nil, err + } + signer := httpsig.NewSigner(p.PublicKey.ID, privKey, httpsig.RSASHA256, []string{"(request-target)", "date", "host", "digest"}) + err = signer.SignSigHeader(r) + if err != nil { + log.Error("Can't sign: %v", err) + } + if debugging { dump, err := httputil.DumpRequestOut(r, true) if err != nil { @@ -624,6 +662,16 @@ func deleteFederatedPost(app *App, p *PublicPost, collID int64) error { } func federatePost(app *App, p *PublicPost, collID int64, isUpdate bool) error { + // If app is private, do not federate + if app.cfg.App.Private { + return nil + } + + // Do not federate posts from private or protected blogs + if p.Collection.Visibility == CollPrivate || p.Collection.Visibility == CollProtected { + return nil + } + if debugging { if isUpdate { log.Info("Federating updated post!") @@ -631,6 +679,7 @@ func federatePost(app *App, p *PublicPost, collID int64, isUpdate bool) error { log.Info("Federating new post!") } } + actor := p.Collection.PersonObject(collID) na := p.ActivityObject(app) diff --git a/admin.go b/admin.go index ce8dead..4d8d1d6 100644 --- a/admin.go +++ b/admin.go @@ -1,5 +1,5 @@ /* - * Copyright © 2018-2020 A Bunch Tell LLC. + * Copyright © 2018-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -24,8 +24,8 @@ import ( "github.com/writeas/web-core/auth" "github.com/writeas/web-core/log" "github.com/writeas/web-core/passgen" - "github.com/writeas/writefreely/appstats" - "github.com/writeas/writefreely/config" + "github.com/writefreely/writefreely/appstats" + "github.com/writefreely/writefreely/config" ) var ( diff --git a/app.go b/app.go index 2aed437..ed4e096 100644 --- a/app.go +++ b/app.go @@ -1,5 +1,5 @@ /* - * Copyright © 2018-2019 A Bunch Tell LLC. + * Copyright © 2018-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -35,11 +35,11 @@ import ( "github.com/writeas/web-core/auth" "github.com/writeas/web-core/converter" "github.com/writeas/web-core/log" - "github.com/writeas/writefreely/author" - "github.com/writeas/writefreely/config" - "github.com/writeas/writefreely/key" - "github.com/writeas/writefreely/migrations" - "github.com/writeas/writefreely/page" + "github.com/writefreely/writefreely/author" + "github.com/writefreely/writefreely/config" + "github.com/writefreely/writefreely/key" + "github.com/writefreely/writefreely/migrations" + "github.com/writefreely/writefreely/page" "golang.org/x/crypto/acme/autocert" ) @@ -389,6 +389,8 @@ func Initialize(apper Apper, debug bool) (*App, error) { return nil, fmt.Errorf("connect to DB: %s", err) } + initActivityPub(apper.App()) + // Handle local timeline, if enabled if apper.App().cfg.App.LocalTimeline { log.Info("Initializing local timeline...") diff --git a/author/author.go b/author/author.go index 0114905..7431ac5 100644 --- a/author/author.go +++ b/author/author.go @@ -1,5 +1,5 @@ /* - * Copyright © 2018-2020 A Bunch Tell LLC. + * Copyright © 2018-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -11,7 +11,7 @@ package author import ( - "github.com/writeas/writefreely/config" + "github.com/writefreely/writefreely/config" "os" "path/filepath" "regexp" diff --git a/cmd/writefreely/config.go b/cmd/writefreely/config.go index c5ff455..32e3801 100644 --- a/cmd/writefreely/config.go +++ b/cmd/writefreely/config.go @@ -1,5 +1,5 @@ /* - * Copyright © 2020 A Bunch Tell LLC. + * Copyright © 2020-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -11,9 +11,8 @@ package main import ( - "github.com/writeas/writefreely" - "github.com/urfave/cli/v2" + "github.com/writefreely/writefreely" ) var ( diff --git a/cmd/writefreely/db.go b/cmd/writefreely/db.go index badc805..ccae418 100644 --- a/cmd/writefreely/db.go +++ b/cmd/writefreely/db.go @@ -1,5 +1,5 @@ /* - * Copyright © 2020 A Bunch Tell LLC. + * Copyright © 2020-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -11,9 +11,8 @@ package main import ( - "github.com/writeas/writefreely" - "github.com/urfave/cli/v2" + "github.com/writefreely/writefreely" ) var ( diff --git a/cmd/writefreely/keys.go b/cmd/writefreely/keys.go index 9028f51..680cd4d 100644 --- a/cmd/writefreely/keys.go +++ b/cmd/writefreely/keys.go @@ -1,5 +1,5 @@ /* - * Copyright © 2020 A Bunch Tell LLC. + * Copyright © 2020-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -11,9 +11,8 @@ package main import ( - "github.com/writeas/writefreely" - "github.com/urfave/cli/v2" + "github.com/writefreely/writefreely" ) var ( diff --git a/cmd/writefreely/main.go b/cmd/writefreely/main.go index 45dfb80..992d611 100644 --- a/cmd/writefreely/main.go +++ b/cmd/writefreely/main.go @@ -1,5 +1,5 @@ /* - * Copyright © 2018-2020 A Bunch Tell LLC. + * Copyright © 2018-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -15,11 +15,10 @@ import ( "os" "strings" - "github.com/writeas/web-core/log" - "github.com/writeas/writefreely" - "github.com/gorilla/mux" "github.com/urfave/cli/v2" + "github.com/writeas/web-core/log" + "github.com/writefreely/writefreely" ) func main() { diff --git a/cmd/writefreely/user.go b/cmd/writefreely/user.go index 58ecbfb..8429513 100644 --- a/cmd/writefreely/user.go +++ b/cmd/writefreely/user.go @@ -1,5 +1,5 @@ /* - * Copyright © 2020 A Bunch Tell LLC. + * Copyright © 2020-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -13,9 +13,8 @@ package main import ( "fmt" - "github.com/writeas/writefreely" - "github.com/urfave/cli/v2" + "github.com/writefreely/writefreely" ) var ( diff --git a/cmd/writefreely/web.go b/cmd/writefreely/web.go index a687548..02ae1c9 100644 --- a/cmd/writefreely/web.go +++ b/cmd/writefreely/web.go @@ -1,5 +1,5 @@ /* - * Copyright © 2020 A Bunch Tell LLC. + * Copyright © 2020-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -11,11 +11,10 @@ package main import ( - "github.com/writeas/web-core/log" - "github.com/writeas/writefreely" - "github.com/gorilla/mux" "github.com/urfave/cli/v2" + "github.com/writeas/web-core/log" + "github.com/writefreely/writefreely" ) var ( diff --git a/collections.go b/collections.go index e1ebe48..a51df88 100644 --- a/collections.go +++ b/collections.go @@ -1,5 +1,5 @@ /* - * Copyright © 2018-2020 A Bunch Tell LLC. + * Copyright © 2018-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -30,9 +30,9 @@ import ( "github.com/writeas/web-core/bots" "github.com/writeas/web-core/log" waposts "github.com/writeas/web-core/posts" - "github.com/writeas/writefreely/author" - "github.com/writeas/writefreely/config" - "github.com/writeas/writefreely/page" + "github.com/writefreely/writefreely/author" + "github.com/writefreely/writefreely/config" + "github.com/writefreely/writefreely/page" ) type ( @@ -180,6 +180,11 @@ func (c *Collection) NewFormat() *CollectionFormat { return cf } +func (c *Collection) IsInstanceColl() bool { + ur, _ := url.Parse(c.hostName) + return c.Alias == ur.Host +} + func (c *Collection) IsUnlisted() bool { return c.Visibility == 0 } @@ -235,7 +240,7 @@ func (c *Collection) DisplayCanonicalURL() string { func (c *Collection) RedirectingCanonicalURL(isRedir bool) string { if c.hostName == "" { // If this is true, the human programmers screwed up. So ask for a bug report and fail, fail, fail - log.Error("[PROGRAMMER ERROR] WARNING: Collection.hostName is empty! Federation and many other things will fail! If you're seeing this in the wild, please report this bug and let us know what you were doing just before this: https://github.com/writeas/writefreely/issues/new?template=bug_report.md") + log.Error("[PROGRAMMER ERROR] WARNING: Collection.hostName is empty! Federation and many other things will fail! If you're seeing this in the wild, please report this bug and let us know what you were doing just before this: https://github.com/writefreely/writefreely/issues/new?template=bug_report.md") } if isSingleUser { return c.hostName + "/" diff --git a/config/config.go b/config/config.go index 3a5588b..8ee03ba 100644 --- a/config/config.go +++ b/config/config.go @@ -110,6 +110,10 @@ type ( AuthEndpoint string `ini:"auth_endpoint"` Scope string `ini:"scope"` AllowDisconnect bool `ini:"allow_disconnect"` + MapUserID string `ini:"map_user_id"` + MapUsername string `ini:"map_username"` + MapDisplayName string `ini:"map_display_name"` + MapEmail string `ini:"map_email"` } // AppCfg holds values that affect how the application functions diff --git a/database.go b/database.go index 54939fe..86fa271 100644 --- a/database.go +++ b/database.go @@ -1,5 +1,5 @@ /* - * Copyright © 2018-2020 A Bunch Tell LLC. + * Copyright © 2018-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -15,7 +15,7 @@ import ( "database/sql" "fmt" "github.com/writeas/web-core/silobridge" - wf_db "github.com/writeas/writefreely/db" + wf_db "github.com/writefreely/writefreely/db" "net/http" "strings" "time" @@ -32,9 +32,9 @@ import ( "github.com/writeas/web-core/id" "github.com/writeas/web-core/log" "github.com/writeas/web-core/query" - "github.com/writeas/writefreely/author" - "github.com/writeas/writefreely/config" - "github.com/writeas/writefreely/key" + "github.com/writefreely/writefreely/author" + "github.com/writefreely/writefreely/config" + "github.com/writefreely/writefreely/key" ) const ( @@ -638,13 +638,17 @@ func (db *datastore) CreatePost(userID, collID int64, post *SubmittedPost) (*Pos ownerCollID.Int64 = collID ownerCollID.Valid = true var slugVal string - if post.Title != nil && *post.Title != "" { - slugVal = getSlug(*post.Title, post.Language.String) - if slugVal == "" { + if post.Slug != nil && *post.Slug != "" { + slugVal = *post.Slug + } else { + if post.Title != nil && *post.Title != "" { + slugVal = getSlug(*post.Title, post.Language.String) + if slugVal == "" { + slugVal = getSlug(*post.Content, post.Language.String) + } + } else { slugVal = getSlug(*post.Content, post.Language.String) } - } else { - slugVal = getSlug(*post.Content, post.Language.String) } if slugVal == "" { slugVal = friendlyID diff --git a/docker-compose.yml b/docker-compose.yml index ef73a9b..652ce57 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,7 +12,7 @@ networks: services: writefreely-web: container_name: "writefreely-web" - image: "writefreely:latest" + image: "writeas/writefreely:latest" volumes: - "web-keys:/go/keys" diff --git a/go.mod b/go.mod index cea1b01..fc60c07 100644 --- a/go.mod +++ b/go.mod @@ -1,10 +1,10 @@ -module github.com/writeas/writefreely +module github.com/writefreely/writefreely require ( github.com/clbanning/mxj v1.8.4 // indirect github.com/dustin/go-humanize v1.0.0 github.com/fatih/color v1.10.0 - github.com/go-sql-driver/mysql v1.5.0 + github.com/go-sql-driver/mysql v1.6.0 github.com/go-test/deep v1.0.1 // indirect github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e // indirect github.com/gorilla/feeds v1.1.1 @@ -12,14 +12,14 @@ require ( github.com/gorilla/schema v1.2.0 github.com/gorilla/sessions v1.2.0 github.com/guregu/null v3.5.0+incompatible - github.com/hashicorp/go-multierror v1.1.0 + github.com/hashicorp/go-multierror v1.1.1 github.com/ikeikeikeike/go-sitemap-generator/v2 v2.0.2 github.com/jtolds/gls v4.2.1+incompatible // indirect github.com/kylemcc/twitter-text-go v0.0.0-20180726194232-7f582f6736ec github.com/lunixbochs/vtclean v1.0.0 // indirect github.com/manifoldco/promptui v0.8.0 github.com/mattn/go-sqlite3 v1.14.6 - github.com/microcosm-cc/bluemonday v1.0.4 + github.com/microcosm-cc/bluemonday v1.0.5 github.com/mitchellh/go-wordwrap v1.0.1 github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d github.com/pkg/errors v0.8.1 // indirect @@ -40,7 +40,7 @@ require ( github.com/writeas/nerds v1.0.0 github.com/writeas/saturday v1.7.2-0.20200427193424-392b95a03320 github.com/writeas/slug v1.2.0 - github.com/writeas/web-core v1.2.1-0.20210306215149-e05f572eb21f + github.com/writeas/web-core v1.3.0 github.com/writefreely/go-nodeinfo v1.2.0 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 golang.org/x/net v0.0.0-20200707034311-ab3426394381 // indirect diff --git a/go.sum b/go.sum index 5d70617..c3efefd 100644 --- a/go.sum +++ b/go.sum @@ -34,8 +34,8 @@ github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga github.com/go-fed/httpsig v0.1.0/go.mod h1:T56HUNYZUQ1AGUzhAYPugZfp36sKApVnGBgKlIY+aIE= github.com/go-fed/httpsig v0.1.1-0.20200204213531-0ef28562fabe h1:U71giCx5NjRn4Lb71UuprPHqhjxGv3Jqonb9fgcaJH8= github.com/go-fed/httpsig v0.1.1-0.20200204213531-0ef28562fabe/go.mod h1:T56HUNYZUQ1AGUzhAYPugZfp36sKApVnGBgKlIY+aIE= -github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-test/deep v1.0.1 h1:UQhStjbkDClarlmv0am7OXXO4/GaPdCGiUiMTvi28sg= github.com/go-test/deep v1.0.1/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/gofrs/uuid v3.3.0+incompatible h1:8K4tyRfvU1CYPgJsveYFQMhpFd/wXNM7iK6rR7UHz84= @@ -62,8 +62,8 @@ github.com/guregu/null v3.5.0+incompatible/go.mod h1:ePGpQaN9cw0tj45IR5E5ehMvsFl github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/ikeikeikeike/go-sitemap-generator/v2 v2.0.2 h1:wIdDEle9HEy7vBPjC6oKz6ejs3Ut+jmsYvuOoAW2pSM= github.com/ikeikeikeike/go-sitemap-generator/v2 v2.0.2/go.mod h1:WtaVKD9TeruTED9ydiaOJU08qGoEPP/LyzTKiD3jEsw= github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpRVWLVmUEE= @@ -91,8 +91,8 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/microcosm-cc/bluemonday v1.0.4 h1:p0L+CTpo/PLFdkoPcJemLXG+fpMD7pYOoDEq1axMbGg= -github.com/microcosm-cc/bluemonday v1.0.4/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w= +github.com/microcosm-cc/bluemonday v1.0.5 h1:cF59UCKMmmUgqN1baLvqU/B1ZsMori+duLVTLpgiG3w= +github.com/microcosm-cc/bluemonday v1.0.5/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ= @@ -149,8 +149,8 @@ github.com/writeas/saturday v1.7.2-0.20200427193424-392b95a03320 h1:PozPZ29CQ/xt github.com/writeas/saturday v1.7.2-0.20200427193424-392b95a03320/go.mod h1:ETE1EK6ogxptJpAgUbcJD0prAtX48bSloie80+tvnzQ= github.com/writeas/slug v1.2.0 h1:EMQ+cwLiOcA6EtFwUgyw3Ge18x9uflUnOnR6bp/J+/g= github.com/writeas/slug v1.2.0/go.mod h1:RE8shOqQP3YhsfsQe0L3RnuejfQ4Mk+JjY5YJQFubfQ= -github.com/writeas/web-core v1.2.1-0.20210306215149-e05f572eb21f h1:5D0iyxiaFGC1OKt/VM1W5ptCBfyG82Llej5aMPhy1w8= -github.com/writeas/web-core v1.2.1-0.20210306215149-e05f572eb21f/go.mod h1:DzNxa0YLV/wNeeWeHFPNa/nHmyJBFIIzXN/m9PpDm5c= +github.com/writeas/web-core v1.3.0 h1:oEVJBPZhrFMf9eya+DvFUX1i8NZGZe1eu5sQXnhuzKw= +github.com/writeas/web-core v1.3.0/go.mod h1:DzNxa0YLV/wNeeWeHFPNa/nHmyJBFIIzXN/m9PpDm5c= github.com/writefreely/go-nodeinfo v1.2.0 h1:La+YbTCvmpTwFhBSlebWDDL81N88Qf/SCAvRLR7F8ss= github.com/writefreely/go-nodeinfo v1.2.0/go.mod h1:UTvE78KpcjYOlRHupZIiSEFcXHioTXuacCbHU+CAcPg= golang.org/x/crypto v0.0.0-20180527072434-ab813273cd59/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= diff --git a/gopher.go b/gopher.go index 30391f1..56d3fd6 100644 --- a/gopher.go +++ b/gopher.go @@ -14,6 +14,7 @@ import ( "bytes" "fmt" "io" + "regexp" "strings" "github.com/prologic/go-gopher" @@ -28,6 +29,11 @@ func initGopher(apper Apper) { gopher.ListenAndServe(fmt.Sprintf(":%d", apper.App().Config().Server.GopherPort), nil) } +// Utility function to strip the URL from the hostname provided by app.cfg.App.Host +func stripHostProtocol(app *App) string { + return string(regexp.MustCompile("^.*://").ReplaceAll([]byte(app.cfg.App.Host), []byte(""))) +} + func handleGopher(app *App, w gopher.ResponseWriter, r *gopher.Request) error { parts := strings.Split(r.Selector, "/") if app.cfg.App.SingleUser { @@ -51,6 +57,8 @@ func handleGopher(app *App, w gopher.ResponseWriter, r *gopher.Request) error { for _, c := range *colls { w.WriteItem(&gopher.Item{ + Host: stripHostProtocol(app), + Port: app.cfg.Server.GopherPort, Type: gopher.DIRECTORY, Description: c.DisplayTitle(), Selector: "/" + c.Alias + "/", @@ -99,6 +107,8 @@ func handleGopherCollection(app *App, w gopher.ResponseWriter, r *gopher.Request for _, p := range *posts { w.WriteItem(&gopher.Item{ + Port: app.cfg.Server.GopherPort, + Host: stripHostProtocol(app), Type: gopher.FILE, Description: p.CreatedDate() + " - " + p.DisplayTitle(), Selector: baseSel + p.Slug.String, diff --git a/handle.go b/handle.go index 5e15137..01d5728 100644 --- a/handle.go +++ b/handle.go @@ -1,5 +1,5 @@ /* - * Copyright © 2018-2019 A Bunch Tell LLC. + * Copyright © 2018-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -24,8 +24,8 @@ import ( "github.com/prologic/go-gopher" "github.com/writeas/impart" "github.com/writeas/web-core/log" - "github.com/writeas/writefreely/config" - "github.com/writeas/writefreely/page" + "github.com/writefreely/writefreely/config" + "github.com/writefreely/writefreely/page" ) // UserLevel represents the required user level for accessing an endpoint @@ -602,7 +602,7 @@ func (h *Handler) AllReader(f handlerFunc) http.HandlerFunc { }() // Allow any origin, as public endpoints are handled in here - w.Header().Set("Access-Control-Allow-Origin", "*"); + w.Header().Set("Access-Control-Allow-Origin", "*") if h.app.App().cfg.App.Private { // This instance is private, so ensure it's being accessed by a valid user diff --git a/invites.go b/invites.go index 4e3eff4..60aa482 100644 --- a/invites.go +++ b/invites.go @@ -1,5 +1,5 @@ /* - * Copyright © 2019-2020 A Bunch Tell LLC. + * Copyright © 2019-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -21,7 +21,7 @@ import ( "github.com/writeas/impart" "github.com/writeas/nerds/store" "github.com/writeas/web-core/log" - "github.com/writeas/writefreely/page" + "github.com/writefreely/writefreely/page" ) type Invite struct { diff --git a/keys.go b/keys.go index 5cc63a3..e53d811 100644 --- a/keys.go +++ b/keys.go @@ -1,5 +1,5 @@ /* - * Copyright © 2018-2019 A Bunch Tell LLC. + * Copyright © 2018-2019, 2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -12,7 +12,7 @@ package writefreely import ( "github.com/writeas/web-core/log" - "github.com/writeas/writefreely/key" + "github.com/writefreely/writefreely/key" "io/ioutil" "os" "path/filepath" diff --git a/migrations/v4.go b/migrations/v4.go index 7d73f96..c69dce1 100644 --- a/migrations/v4.go +++ b/migrations/v4.go @@ -1,5 +1,5 @@ /* - * Copyright © 2019-2020 A Bunch Tell LLC. + * Copyright © 2019-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -14,7 +14,7 @@ import ( "context" "database/sql" - wf_db "github.com/writeas/writefreely/db" + wf_db "github.com/writefreely/writefreely/db" ) func oauth(db *datastore) error { diff --git a/migrations/v5.go b/migrations/v5.go index f93d067..1fe3e30 100644 --- a/migrations/v5.go +++ b/migrations/v5.go @@ -1,5 +1,5 @@ /* - * Copyright © 2019-2020 A Bunch Tell LLC. + * Copyright © 2019-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -14,7 +14,7 @@ import ( "context" "database/sql" - wf_db "github.com/writeas/writefreely/db" + wf_db "github.com/writefreely/writefreely/db" ) func oauthSlack(db *datastore) error { diff --git a/migrations/v7.go b/migrations/v7.go index 3090cd9..5737b21 100644 --- a/migrations/v7.go +++ b/migrations/v7.go @@ -1,10 +1,20 @@ +/* + * Copyright © 2020-2021 A Bunch Tell LLC. + * + * This file is part of WriteFreely. + * + * WriteFreely is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, included + * in the LICENSE file in this source code package. + */ + package migrations import ( "context" "database/sql" - wf_db "github.com/writeas/writefreely/db" + wf_db "github.com/writefreely/writefreely/db" ) func oauthAttach(db *datastore) error { diff --git a/migrations/v8.go b/migrations/v8.go index 2318c4e..28af523 100644 --- a/migrations/v8.go +++ b/migrations/v8.go @@ -1,5 +1,5 @@ /* - * Copyright © 2020 A Bunch Tell LLC. + * Copyright © 2020-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -14,7 +14,7 @@ import ( "context" "database/sql" - wf_db "github.com/writeas/writefreely/db" + wf_db "github.com/writefreely/writefreely/db" ) func oauthInvites(db *datastore) error { diff --git a/nodeinfo.go b/nodeinfo.go index 944a5df..f0c0b5e 100644 --- a/nodeinfo.go +++ b/nodeinfo.go @@ -1,5 +1,5 @@ /* - * Copyright © 2018 A Bunch Tell LLC. + * Copyright © 2018-2019, 2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -12,8 +12,8 @@ package writefreely import ( "github.com/writeas/web-core/log" - "github.com/writeas/writefreely/config" "github.com/writefreely/go-nodeinfo" + "github.com/writefreely/writefreely/config" "strings" ) @@ -45,7 +45,7 @@ func nodeInfoConfig(db *datastore, cfg *config.Config) *nodeinfo.Config { Private: cfg.App.Private, Software: nodeinfo.SoftwareMeta{ HomePage: softwareURL, - GitHub: "https://github.com/writeas/writefreely", + GitHub: "https://github.com/writefreely/writefreely", Follow: "https://writing.exchange/@write_as", }, MaxBlogs: cfg.App.MaxBlogs, diff --git a/oauth.go b/oauth.go index 6cbddff..e28e21a 100644 --- a/oauth.go +++ b/oauth.go @@ -1,5 +1,5 @@ /* - * Copyright © 2019-2020 A Bunch Tell LLC. + * Copyright © 2019-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -25,7 +25,7 @@ import ( "github.com/gorilla/sessions" "github.com/writeas/impart" "github.com/writeas/web-core/log" - "github.com/writeas/writefreely/config" + "github.com/writefreely/writefreely/config" ) // OAuthButtons holds display information for different OAuth providers we support. @@ -266,6 +266,10 @@ func configureGenericOauth(parentHandler *Handler, r *mux.Router, app *App) { HttpClient: config.DefaultHTTPClient(), CallbackLocation: callbackLocation, Scope: config.OrDefaultString(app.Config().GenericOauth.Scope, "read_user"), + MapUserID: config.OrDefaultString(app.Config().GenericOauth.MapUserID, "user_id"), + MapUsername: config.OrDefaultString(app.Config().GenericOauth.MapUsername, "username"), + MapDisplayName: config.OrDefaultString(app.Config().GenericOauth.MapDisplayName, "-"), + MapEmail: config.OrDefaultString(app.Config().GenericOauth.MapEmail, "email"), } configureOauthRoutes(parentHandler, r, app, oauthClient, callbackProxy) } diff --git a/oauth_generic.go b/oauth_generic.go index cb82ad0..ba8b97e 100644 --- a/oauth_generic.go +++ b/oauth_generic.go @@ -16,6 +16,10 @@ type genericOauthClient struct { InspectLocation string CallbackLocation string Scope string + MapUserID string + MapUsername string + MapDisplayName string + MapEmail string HttpClient HttpClient } @@ -104,13 +108,19 @@ func (c genericOauthClient) inspectOauthAccessToken(ctx context.Context, accessT return nil, errors.New("unable to inspect access token") } - var inspectResponse InspectResponse - if err := limitedJsonUnmarshal(resp.Body, infoRequestMaxLen, &inspectResponse); err != nil { + // since we don't know what the JSON from the server will look like, we create a + // generic interface and then map manually to values set in the config + var genericInterface map[string]interface{} + if err := limitedJsonUnmarshal(resp.Body, infoRequestMaxLen, &genericInterface); err != nil { return nil, err } - if inspectResponse.Error != "" { - return nil, errors.New(inspectResponse.Error) - } + + // map each relevant field in inspectResponse to the mapped field from the config + var inspectResponse InspectResponse + inspectResponse.UserID, _ = genericInterface[c.MapUserID].(string) + inspectResponse.Username, _ = genericInterface[c.MapUsername].(string) + inspectResponse.DisplayName, _ = genericInterface[c.MapDisplayName].(string) + inspectResponse.Email, _ = genericInterface[c.MapEmail].(string) return &inspectResponse, nil } diff --git a/oauth_signup.go b/oauth_signup.go index cbe4f60..b1256be 100644 --- a/oauth_signup.go +++ b/oauth_signup.go @@ -1,5 +1,5 @@ /* - * Copyright © 2020 A Bunch Tell LLC. + * Copyright © 2020-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -17,7 +17,7 @@ import ( "github.com/writeas/impart" "github.com/writeas/web-core/auth" "github.com/writeas/web-core/log" - "github.com/writeas/writefreely/page" + "github.com/writefreely/writefreely/page" "html/template" "net/http" "strings" diff --git a/oauth_test.go b/oauth_test.go index f454f1a..cc5f108 100644 --- a/oauth_test.go +++ b/oauth_test.go @@ -1,3 +1,13 @@ +/* + * Copyright © 2019-2021 A Bunch Tell LLC. + * + * This file is part of WriteFreely. + * + * WriteFreely is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, included + * in the LICENSE file in this source code package. + */ + package writefreely import ( @@ -7,7 +17,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/writeas/impart" "github.com/writeas/nerds/store" - "github.com/writeas/writefreely/config" + "github.com/writefreely/writefreely/config" "net/http" "net/http/httptest" "net/url" diff --git a/pad.go b/pad.go index 0354cd3..b64c282 100644 --- a/pad.go +++ b/pad.go @@ -1,5 +1,5 @@ /* - * Copyright © 2018-2019 A Bunch Tell LLC. + * Copyright © 2018-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -17,7 +17,7 @@ import ( "github.com/gorilla/mux" "github.com/writeas/impart" "github.com/writeas/web-core/log" - "github.com/writeas/writefreely/page" + "github.com/writefreely/writefreely/page" ) func handleViewPad(app *App, w http.ResponseWriter, r *http.Request) error { diff --git a/page/page.go b/page/page.go index 15f09a9..2cfb6cc 100644 --- a/page/page.go +++ b/page/page.go @@ -1,5 +1,5 @@ /* - * Copyright © 2018 A Bunch Tell LLC. + * Copyright © 2018-2019, 2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -12,7 +12,7 @@ package page import ( - "github.com/writeas/writefreely/config" + "github.com/writefreely/writefreely/config" "strings" ) diff --git a/pages.go b/pages.go index d8f034b..f871882 100644 --- a/pages.go +++ b/pages.go @@ -1,5 +1,5 @@ /* - * Copyright © 2018-2019 A Bunch Tell LLC. + * Copyright © 2018-2019, 2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -12,7 +12,7 @@ package writefreely import ( "database/sql" - "github.com/writeas/writefreely/config" + "github.com/writefreely/writefreely/config" "time" ) diff --git a/pages/500.tmpl b/pages/500.tmpl index c436280..e148fb5 100644 --- a/pages/500.tmpl +++ b/pages/500.tmpl @@ -2,7 +2,7 @@ {{define "content"}}

Server error 😵

-

Please contact the human authors of this software and remind them of their many shortcomings.

+

Please contact the human authors of this software and remind them of their many shortcomings.

Be gentle, though. They are fragile mortal beings.

Also, unlike the AI that will soon replace them, you will need to include an error log from the server in your report. (Utterly primitive, we know.)

– {{.SiteName}} 🤖

diff --git a/postrender.go b/postrender.go index ccfc565..55d0cdf 100644 --- a/postrender.go +++ b/postrender.go @@ -1,5 +1,5 @@ /* - * Copyright © 2018-2020 A Bunch Tell LLC. + * Copyright © 2018-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -28,8 +28,8 @@ import ( blackfriday "github.com/writeas/saturday" "github.com/writeas/web-core/log" "github.com/writeas/web-core/stringmanip" - "github.com/writeas/writefreely/config" - "github.com/writeas/writefreely/parse" + "github.com/writefreely/writefreely/config" + "github.com/writefreely/writefreely/parse" ) var ( @@ -60,6 +60,14 @@ func (p *PublicPost) formatContent(cfg *config.Config, isOwner bool) { } func (p *Post) augmentContent(c *Collection) { + if p.PinnedPosition.Valid { + // Don't augment posts that are pinned + return + } + if strings.Index(p.Content, "") > -1 { + // Don't augment posts with the special "nosig" shortcode + return + } // Add post signatures if c.Signature != "" { p.Content += "\n\n" + c.Signature diff --git a/posts.go b/posts.go index fbf7f3e..107f0c1 100644 --- a/posts.go +++ b/posts.go @@ -1,5 +1,5 @@ /* - * Copyright © 2018-2020 A Bunch Tell LLC. + * Copyright © 2018-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -36,8 +36,8 @@ import ( "github.com/writeas/web-core/i18n" "github.com/writeas/web-core/log" "github.com/writeas/web-core/tags" - "github.com/writeas/writefreely/page" - "github.com/writeas/writefreely/parse" + "github.com/writefreely/writefreely/page" + "github.com/writefreely/writefreely/parse" ) const ( @@ -1176,6 +1176,11 @@ func (p *PublicPost) ActivityObject(app *App) *activitystreams.Object { }) } } + if len(p.Images) > 0 { + for _, i := range p.Images { + o.Attachment = append(o.Attachment, activitystreams.NewImageAttachment(i)) + } + } // Find mentioned users mentionedUsers := make(map[string]string) diff --git a/posts_test.go b/posts_test.go index e423fd3..0c9bc95 100644 --- a/posts_test.go +++ b/posts_test.go @@ -1,3 +1,13 @@ +/* + * Copyright © 2020-2021 A Bunch Tell LLC. + * + * This file is part of WriteFreely. + * + * WriteFreely is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, included + * in the LICENSE file in this source code package. + */ + package writefreely_test import ( @@ -5,7 +15,7 @@ import ( "github.com/guregu/null/zero" "github.com/stretchr/testify/assert" - "github.com/writeas/writefreely" + "github.com/writefreely/writefreely" ) func TestPostSummary(t *testing.T) { diff --git a/read.go b/read.go index 6505155..b11e657 100644 --- a/read.go +++ b/read.go @@ -1,5 +1,5 @@ /* - * Copyright © 2018-2020 A Bunch Tell LLC. + * Copyright © 2018-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -25,7 +25,7 @@ import ( "github.com/writeas/impart" "github.com/writeas/web-core/log" "github.com/writeas/web-core/memo" - "github.com/writeas/writefreely/page" + "github.com/writefreely/writefreely/page" ) const ( diff --git a/routes.go b/routes.go index bb1785f..d3c56ca 100644 --- a/routes.go +++ b/routes.go @@ -1,5 +1,5 @@ /* - * Copyright © 2018-2019 A Bunch Tell LLC. + * Copyright © 2018-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -12,6 +12,7 @@ package writefreely import ( "net/http" + "net/url" "path/filepath" "strings" @@ -125,9 +126,13 @@ func InitRoutes(apper Apper, r *mux.Router) *mux.Router { write.HandleFunc("/api/markdown", handler.All(handleRenderMarkdown)).Methods("POST") + instanceURL, _ := url.Parse(apper.App().Config().App.Host) + host := instanceURL.Host + // Handle collections write.HandleFunc("/api/collections", handler.All(newCollection)).Methods("POST") apiColls := write.PathPrefix("/api/collections/").Subrouter() + apiColls.HandleFunc("/"+host, handler.AllReader(fetchCollection)).Methods("GET") apiColls.HandleFunc("/{alias:[0-9a-zA-Z\\-]+}", handler.AllReader(fetchCollection)).Methods("GET") apiColls.HandleFunc("/{alias:[0-9a-zA-Z\\-]+}", handler.All(existingCollection)).Methods("POST", "DELETE") apiColls.HandleFunc("/{alias}/posts", handler.AllReader(fetchCollectionPosts)).Methods("GET") diff --git a/static/js/README.md b/static/js/README.md index 9d25cfc..7e387db 100644 --- a/static/js/README.md +++ b/static/js/README.md @@ -17,7 +17,7 @@ Then [download an archive](https://github.com/highlightjs/highlight.js/releases) version=9.13.1 -cd $GOPATH/src/github.com/writeas/writefreely/static/js/highlightjs +cd $GOPATH/src/github.com/writefreely/writefreely/static/js/highlightjs for f in $(ls ~/Downloads/highlight.js/src/languages); do # Use minified versions f=$(echo $f | sed 's/\.js/.min.js/') diff --git a/templates.go b/templates.go index 846c5d8..3871258 100644 --- a/templates.go +++ b/templates.go @@ -1,5 +1,5 @@ /* - * Copyright © 2018 A Bunch Tell LLC. + * Copyright © 2018-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -23,7 +23,7 @@ import ( "github.com/dustin/go-humanize" "github.com/writeas/web-core/l10n" "github.com/writeas/web-core/log" - "github.com/writeas/writefreely/config" + "github.com/writefreely/writefreely/config" ) var ( diff --git a/templates/include/footer.tmpl b/templates/include/footer.tmpl index 0f258e7..c6f4b87 100644 --- a/templates/include/footer.tmpl +++ b/templates/include/footer.tmpl @@ -13,7 +13,7 @@ {{else}} writer's guide developers - source code + source code writefreely {{.Version}} {{end}} @@ -33,7 +33,7 @@
diff --git a/templates/include/post-render.tmpl b/templates/include/post-render.tmpl index c4ed082..beb98aa 100644 --- a/templates/include/post-render.tmpl +++ b/templates/include/post-render.tmpl @@ -68,7 +68,7 @@ var jss = [hlbaseUri + "highlight.min.js"]; // Check what we need to load for (i=0; i < lb.length; i++) { - lang = lb[i].className.replace('language-',''); + lang = lb[i].className.replace('language-','').toLowerCase(); // Support the aliases specified above if (aliasmap[lang]) lang = aliasmap[lang]; lurl = hlbaseUri + "highlightjs/" + lang + ".min.js"; diff --git a/templates/pad.tmpl b/templates/pad.tmpl index cef69b5..049ac27 100644 --- a/templates/pad.tmpl +++ b/templates/pad.tmpl @@ -194,8 +194,13 @@ body: post.content, title: post.title, font: font, - lang: lang - }; + {{ if or .Post.Slug .Post.Id }} + }; + {{ else }} + lang: lang + }; + {{ end }} + {{ if .Post.Slug }} var url = "/api/collections/{{.EditCollection.Alias}}/posts/{{.Post.Id}}"; {{ else if .Post.Id }} diff --git a/users.go b/users.go index 9b5c99c..add76cd 100644 --- a/users.go +++ b/users.go @@ -1,5 +1,5 @@ /* - * Copyright © 2018 A Bunch Tell LLC. + * Copyright © 2018-2019, 2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -16,7 +16,7 @@ import ( "github.com/guregu/null/zero" "github.com/writeas/web-core/data" "github.com/writeas/web-core/log" - "github.com/writeas/writefreely/key" + "github.com/writefreely/writefreely/key" ) type UserStatus int diff --git a/webfinger.go b/webfinger.go index 993272f..6c1341f 100644 --- a/webfinger.go +++ b/webfinger.go @@ -1,5 +1,5 @@ /* - * Copyright © 2018-2020 A Bunch Tell LLC. + * Copyright © 2018-2021 A Bunch Tell LLC. * * This file is part of WriteFreely. * @@ -19,7 +19,7 @@ import ( "github.com/writeas/go-webfinger" "github.com/writeas/impart" "github.com/writeas/web-core/log" - "github.com/writeas/writefreely/config" + "github.com/writefreely/writefreely/config" ) type wfResolver struct { @@ -32,7 +32,9 @@ var wfUserNotFoundErr = impart.HTTPError{http.StatusNotFound, "User not found."} func (wfr wfResolver) FindUser(username string, host, requestHost string, r []webfinger.Rel) (*webfinger.Resource, error) { var c *Collection var err error - if wfr.cfg.App.SingleUser { + if username == host { + c = instanceColl + } else if wfr.cfg.App.SingleUser { c, err = wfr.db.GetCollectionByID(1) } else { c, err = wfr.db.GetCollection(username) @@ -41,15 +43,18 @@ func (wfr wfResolver) FindUser(username string, host, requestHost string, r []we log.Error("Unable to get blog: %v", err) return nil, err } - silenced, err := wfr.db.IsUserSilenced(c.OwnerID) - if err != nil { - log.Error("webfinger find user: check is silenced: %v", err) - return nil, err - } - if silenced { - return nil, wfUserNotFoundErr - } c.hostName = wfr.cfg.App.Host + + if !c.IsInstanceColl() { + silenced, err := wfr.db.IsUserSilenced(c.OwnerID) + if err != nil { + log.Error("webfinger find user: check is silenced: %v", err) + return nil, err + } + if silenced { + return nil, wfUserNotFoundErr + } + } if wfr.cfg.App.SingleUser { // Ensure handle matches user-chosen one on single-user blogs if username != c.Alias {