Merge branch 'hotfix-0.13.2' into dependabot/go_modules/github.com/microcosm-cc/bluemonday-1.0.21

pull/593/head
Matt Baer 2 years ago committed by GitHub
commit 61d1537fce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      README.md
  2. 2
      account.go
  3. 2
      activitypub.go
  4. 2
      admin.go
  5. 4
      app.go
  6. 2
      auth.go
  7. 2
      author/author.go
  8. 2
      cache.go
  9. 2
      cmd/writefreely/config.go
  10. 2
      cmd/writefreely/db.go
  11. 2
      cmd/writefreely/keys.go
  12. 2
      cmd/writefreely/main.go
  13. 2
      cmd/writefreely/user.go
  14. 2
      cmd/writefreely/web.go
  15. 2
      collections.go
  16. 4
      config/config.go
  17. 2
      config/data.go
  18. 2
      config/funcs.go
  19. 2
      config/setup.go
  20. 2
      config/validation.go
  21. 3
      database-lib.go
  22. 3
      database-no-sqlite.go
  23. 3
      database-sqlite.go
  24. 12
      database.go
  25. 2
      db/create.go
  26. 2
      errors.go
  27. 2
      export.go
  28. 16
      feed.go
  29. 5
      go.mod
  30. 30
      go.sum
  31. 4
      gopher.go
  32. 4
      handle.go
  33. 2
      hostmeta.go
  34. 2
      instance.go
  35. 2
      invites.go
  36. 2
      key/key.go
  37. 2
      keys.go
  38. 1
      less/core.less
  39. 2
      less/login.less
  40. 2
      migrations/drivers.go
  41. 2
      migrations/migrations.go
  42. 2
      migrations/v1.go
  43. 2
      migrations/v10.go
  44. 2
      migrations/v2.go
  45. 2
      migrations/v3.go
  46. 2
      migrations/v4.go
  47. 2
      migrations/v5.go
  48. 2
      migrations/v6.go
  49. 2
      migrations/v7.go
  50. 2
      migrations/v8.go
  51. 2
      migrations/v9.go
  52. 2
      monetization.go
  53. 2
      nodeinfo.go
  54. 12
      oauth.go
  55. 2
      oauth_generic.go
  56. 31
      oauth_gitea.go
  57. 2
      oauth_signup.go
  58. 2
      oauth_slack.go
  59. 2
      oauth_test.go
  60. 2
      pad.go
  61. 2
      page/page.go
  62. 2
      pages.go
  63. 2
      parse/posts.go
  64. 2
      parse/posts_test.go
  65. 5
      postrender.go
  66. 2
      postrender_test.go
  67. 4
      posts.go
  68. 2
      posts_test.go
  69. 4
      prose/markdownSerializer.js
  70. 2
      read.go
  71. 2
      request.go
  72. 2
      routes.go
  73. 2
      scripts/invalidate-css.sh
  74. 2
      scripts/upgrade-server.sh
  75. 2
      session.go
  76. 2
      sitemap.go
  77. 2
      static/js/modals.js
  78. 2
      static/js/webmonetization.js
  79. 2
      templates.go
  80. 6
      templates/base.tmpl
  81. 2
      templates/edit-meta.tmpl
  82. 2
      templates/pad.tmpl
  83. 4
      templates/user/collection.tmpl
  84. 2
      unregisteredusers.go
  85. 2
      updates.go
  86. 2
      users.go
  87. 2
      webfinger.go

@ -86,4 +86,4 @@ Before contributing anything, please read our [Contributing Guide](https://githu
## License ## 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). Copyright © 2018-2022 [Musing Studio LLC](https://musing.studio) and contributing authors. Licensed under the [AGPL](https://github.com/writefreely/writefreely/blob/develop/LICENSE).

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2021 A Bunch Tell LLC. * Copyright © 2018-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2021 A Bunch Tell LLC. * Copyright © 2018-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2021 A Bunch Tell LLC. * Copyright © 2018-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2021 A Bunch Tell LLC. * Copyright © 2018-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *
@ -56,7 +56,7 @@ var (
debugging bool debugging bool
// Software version can be set from git env using -ldflags // Software version can be set from git env using -ldflags
softwareVer = "0.13.1" softwareVer = "0.13.2"
// DEPRECATED VARS // DEPRECATED VARS
isSingleUser bool isSingleUser bool

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018 A Bunch Tell LLC. * Copyright © 2018 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2021 A Bunch Tell LLC. * Copyright © 2018-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018 A Bunch Tell LLC. * Copyright © 2018 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2020-2021 A Bunch Tell LLC. * Copyright © 2020-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2020-2021 A Bunch Tell LLC. * Copyright © 2020-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2020-2021 A Bunch Tell LLC. * Copyright © 2020-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2021 A Bunch Tell LLC. * Copyright © 2018-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2020-2021 A Bunch Tell LLC. * Copyright © 2020-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2020-2021 A Bunch Tell LLC. * Copyright © 2020-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2021 A Bunch Tell LLC. * Copyright © 2018-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2021 A Bunch Tell LLC. * Copyright © 2018-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *
@ -15,9 +15,9 @@ import (
"net/url" "net/url"
"strings" "strings"
"github.com/go-ini/ini"
"github.com/writeas/web-core/log" "github.com/writeas/web-core/log"
"golang.org/x/net/idna" "golang.org/x/net/idna"
"gopkg.in/ini.v1"
) )
const ( const (

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018 A Bunch Tell LLC. * Copyright © 2018 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018, 2020-2021 A Bunch Tell LLC. * Copyright © 2018, 2020-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018 A Bunch Tell LLC. * Copyright © 2018 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018 A Bunch Tell LLC. * Copyright © 2018 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,7 +1,8 @@
//go:build wflib
// +build wflib // +build wflib
/* /*
* Copyright © 2019-2020 A Bunch Tell LLC. * Copyright © 2019-2020 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,7 +1,8 @@
//go:build !sqlite && !wflib
// +build !sqlite,!wflib // +build !sqlite,!wflib
/* /*
* Copyright © 2019-2020 A Bunch Tell LLC. * Copyright © 2019-2020 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,7 +1,8 @@
//go:build sqlite && !wflib
// +build sqlite,!wflib // +build sqlite,!wflib
/* /*
* Copyright © 2019-2020 A Bunch Tell LLC. * Copyright © 2019-2020 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2021 A Bunch Tell LLC. * Copyright © 2018-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *
@ -661,7 +661,7 @@ func (db *datastore) CreatePost(userID, collID int64, post *SubmittedPost) (*Pos
// SQLite stores datetimes in UTC, so convert time.Now() to it here // SQLite stores datetimes in UTC, so convert time.Now() to it here
created = created.UTC() created = created.UTC()
} }
if post.Created != nil { if post.Created != nil && *post.Created != "" {
created, err = time.Parse("2006-01-02T15:04:05Z", *post.Created) created, err = time.Parse("2006-01-02T15:04:05Z", *post.Created)
if err != nil { if err != nil {
log.Error("Unable to parse Created time '%s': %v", *post.Created, err) log.Error("Unable to parse Created time '%s': %v", *post.Created, err)
@ -924,7 +924,7 @@ func (db *datastore) UpdateCollection(c *SubmittedCollection, alias string) erro
} }
} }
if !skipUpdate { if !skipUpdate {
_, err = db.Exec("INSERT INTO collectionattributes (collection_id, attribute, value) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE value = ?", collID, "monetization_pointer", *c.Monetization, *c.Monetization) _, err = db.Exec("INSERT INTO collectionattributes (collection_id, attribute, value) VALUES (?, ?, ?) "+db.upsert("collection_id", "attribute")+" value = ?", collID, "monetization_pointer", *c.Monetization, *c.Monetization)
if err != nil { if err != nil {
log.Error("Unable to insert monetization_pointer value: %v", err) log.Error("Unable to insert monetization_pointer value: %v", err)
return err return err
@ -1688,7 +1688,7 @@ func (db *datastore) GetPublicCollections(hostName string) (*[]Collection, error
FROM collections c FROM collections c
LEFT JOIN users u ON u.id = c.owner_id LEFT JOIN users u ON u.id = c.owner_id
WHERE c.privacy = 1 AND u.status = 0 WHERE c.privacy = 1 AND u.status = 0
ORDER BY id ASC`) ORDER BY title ASC`)
if err != nil { if err != nil {
log.Error("Failed selecting public collections: %v", err) log.Error("Failed selecting public collections: %v", err)
return nil, impart.HTTPError{http.StatusInternalServerError, "Couldn't retrieve public collections."} return nil, impart.HTTPError{http.StatusInternalServerError, "Couldn't retrieve public collections."}
@ -1833,7 +1833,7 @@ func (db *datastore) GetAnonymousPosts(u *User, page int) (*[]PublicPost, error)
if page > 0 { if page > 0 {
limitStr = fmt.Sprintf(" LIMIT %d, %d", start, pagePosts) limitStr = fmt.Sprintf(" LIMIT %d, %d", start, pagePosts)
} }
rows, err := db.Query("SELECT id, view_count, title, created, updated, content FROM posts WHERE owner_id = ? AND collection_id IS NULL ORDER BY created DESC"+limitStr, u.ID) rows, err := db.Query("SELECT id, view_count, title, language, created, updated, content FROM posts WHERE owner_id = ? AND collection_id IS NULL ORDER BY created DESC"+limitStr, u.ID)
if err != nil { if err != nil {
log.Error("Failed selecting from posts: %v", err) log.Error("Failed selecting from posts: %v", err)
return nil, impart.HTTPError{http.StatusInternalServerError, "Couldn't retrieve user anonymous posts."} return nil, impart.HTTPError{http.StatusInternalServerError, "Couldn't retrieve user anonymous posts."}
@ -1843,7 +1843,7 @@ func (db *datastore) GetAnonymousPosts(u *User, page int) (*[]PublicPost, error)
posts := []PublicPost{} posts := []PublicPost{}
for rows.Next() { for rows.Next() {
p := Post{} p := Post{}
err = rows.Scan(&p.ID, &p.ViewCount, &p.Title, &p.Created, &p.Updated, &p.Content) err = rows.Scan(&p.ID, &p.ViewCount, &p.Title, &p.Language, &p.Created, &p.Updated, &p.Content)
if err != nil { if err != nil {
log.Error("Failed scanning row: %v", err) log.Error("Failed scanning row: %v", err)
break break

@ -1,5 +1,5 @@
/* /*
* Copyright © 2019-2020 A Bunch Tell LLC. * Copyright © 2019-2020 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2020 A Bunch Tell LLC. * Copyright © 2018-2020 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2019 A Bunch Tell LLC. * Copyright © 2018-2019 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2020 A Bunch Tell LLC. * Copyright © 2018-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *
@ -15,7 +15,7 @@ import (
"net/http" "net/http"
"time" "time"
. "github.com/gorilla/feeds" "github.com/gorilla/feeds"
"github.com/gorilla/mux" "github.com/gorilla/mux"
stripmd "github.com/writeas/go-strip-markdown/v2" stripmd "github.com/writeas/go-strip-markdown/v2"
"github.com/writeas/web-core/log" "github.com/writeas/web-core/log"
@ -87,11 +87,11 @@ func ViewFeed(app *App, w http.ResponseWriter, req *http.Request) error {
siteURL += "tag:" + tag siteURL += "tag:" + tag
} }
feed := &Feed{ feed := &feeds.Feed{
Title: collectionTitle, Title: collectionTitle,
Link: &Link{Href: siteURL}, Link: &feeds.Link{Href: siteURL},
Description: coll.Description, Description: coll.Description,
Author: &Author{author, ""}, Author: &feeds.Author{author, ""},
Created: time.Now(), Created: time.Now(),
} }
@ -103,13 +103,13 @@ func ViewFeed(app *App, w http.ResponseWriter, req *http.Request) error {
// Create the item for the feed // Create the item for the feed
title = p.PlainDisplayTitle() title = p.PlainDisplayTitle()
permalink = fmt.Sprintf("%s%s", baseUrl, p.Slug.String) permalink = fmt.Sprintf("%s%s", baseUrl, p.Slug.String)
feed.Items = append(feed.Items, &Item{ feed.Items = append(feed.Items, &feeds.Item{
Id: fmt.Sprintf("%s%s", basePermalinkUrl, p.Slug.String), Id: fmt.Sprintf("%s%s", basePermalinkUrl, p.Slug.String),
Title: title, Title: title,
Link: &Link{Href: permalink}, Link: &feeds.Link{Href: permalink},
Description: "<![CDATA[" + stripmd.Strip(p.Content) + "]]>", Description: "<![CDATA[" + stripmd.Strip(p.Content) + "]]>",
Content: string(p.HTMLContent), Content: string(p.HTMLContent),
Author: &Author{author, ""}, Author: &feeds.Author{author, ""},
Created: p.Created, Created: p.Created,
Updated: p.Updated, Updated: p.Updated,
}) })

@ -1,10 +1,10 @@
module github.com/writefreely/writefreely module github.com/writefreely/writefreely
require ( require (
git.mills.io/prologic/go-gopher v0.0.0-20210712135410-b7ebb55feece
github.com/clbanning/mxj v1.8.4 // indirect github.com/clbanning/mxj v1.8.4 // indirect
github.com/dustin/go-humanize v1.0.0 github.com/dustin/go-humanize v1.0.0
github.com/fatih/color v1.10.0 github.com/fatih/color v1.10.0
github.com/go-ini/ini v1.66.4
github.com/go-sql-driver/mysql v1.6.0 github.com/go-sql-driver/mysql v1.6.0
github.com/go-test/deep v1.0.1 // indirect github.com/go-test/deep v1.0.1 // indirect
github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e // indirect github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e // indirect
@ -28,7 +28,7 @@ require (
github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 // indirect github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 // indirect
github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c // indirect github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c // indirect
github.com/stretchr/testify v1.7.0 github.com/stretchr/testify v1.7.0
github.com/urfave/cli/v2 v2.3.0 github.com/urfave/cli/v2 v2.5.1
github.com/writeas/activity v0.1.2 github.com/writeas/activity v0.1.2
github.com/writeas/activityserve v0.0.0-20200409150223-d7ab3eaa4481 github.com/writeas/activityserve v0.0.0-20200409150223-d7ab3eaa4481
github.com/writeas/go-strip-markdown/v2 v2.1.1 github.com/writeas/go-strip-markdown/v2 v2.1.1
@ -40,6 +40,7 @@ require (
github.com/writeas/saturday v1.7.2-0.20200427193424-392b95a03320 github.com/writeas/saturday v1.7.2-0.20200427193424-392b95a03320
github.com/writeas/slug v1.2.0 github.com/writeas/slug v1.2.0
github.com/writeas/web-core v1.3.1-0.20210330164422-95a3a717ed8f github.com/writeas/web-core v1.3.1-0.20210330164422-95a3a717ed8f
github.com/writefreely/go-gopher v0.0.0-20220429181814-40127126f83b
github.com/writefreely/go-nodeinfo v1.2.0 github.com/writefreely/go-nodeinfo v1.2.0
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9
golang.org/x/net v0.0.0-20221002022538-bcab6841153b golang.org/x/net v0.0.0-20221002022538-bcab6841153b

@ -1,8 +1,6 @@
code.as/core/socks v1.0.0 h1:SPQXNp4SbEwjOAP9VzUahLHak8SDqy5n+9cm9tpjZOs= code.as/core/socks v1.0.0 h1:SPQXNp4SbEwjOAP9VzUahLHak8SDqy5n+9cm9tpjZOs=
code.as/core/socks v1.0.0/go.mod h1:BAXBy5O9s2gmw6UxLqNJcVbWY7C/UPs+801CcSsfWOY= code.as/core/socks v1.0.0/go.mod h1:BAXBy5O9s2gmw6UxLqNJcVbWY7C/UPs+801CcSsfWOY=
git.mills.io/prologic/go-gopher v0.0.0-20210712135410-b7ebb55feece h1:0esmnntqeuM1iBgHH0HOeSynsLA1l28p2K3h/WZuIfQ= github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
git.mills.io/prologic/go-gopher v0.0.0-20210712135410-b7ebb55feece/go.mod h1:EMXlYOIbYJQhPTtIltgaaHtCYDawV/HL0dYf8ShzAck=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
github.com/beevik/etree v1.1.0 h1:T0xke/WvNtMoCqgzPhkX2r4rjY3GDZFi+FjpRZY2Jbs= github.com/beevik/etree v1.1.0 h1:T0xke/WvNtMoCqgzPhkX2r4rjY3GDZFi+FjpRZY2Jbs=
@ -18,8 +16,8 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn
github.com/clbanning/mxj v1.8.3/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/clbanning/mxj v1.8.3/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng=
github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I= github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I=
github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@ -34,6 +32,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.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 h1:U71giCx5NjRn4Lb71UuprPHqhjxGv3Jqonb9fgcaJH8=
github.com/go-fed/httpsig v0.1.1-0.20200204213531-0ef28562fabe/go.mod h1:T56HUNYZUQ1AGUzhAYPugZfp36sKApVnGBgKlIY+aIE= github.com/go-fed/httpsig v0.1.1-0.20200204213531-0ef28562fabe/go.mod h1:T56HUNYZUQ1AGUzhAYPugZfp36sKApVnGBgKlIY+aIE=
github.com/go-ini/ini v1.66.4 h1:dKjMqkcbkzfddhIhyglTPgMoJnkvmG+bSLrU9cTHc5M=
github.com/go-ini/ini v1.66.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= 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-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 h1:UQhStjbkDClarlmv0am7OXXO4/GaPdCGiUiMTvi28sg=
@ -99,14 +99,18 @@ github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQ
github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= 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= github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ=
github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U= github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U=
github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ=
github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be h1:ta7tUOvsPHVHGom5hKW5VXNc2xZIkfCKP8iaqOyYtUQ= github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be h1:ta7tUOvsPHVHGom5hKW5VXNc2xZIkfCKP8iaqOyYtUQ=
github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be/go.mod h1:MIDFMn7db1kT65GmV94GzpX9Qdi7N/pQlwb+AN8wh+Q= github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be/go.mod h1:MIDFMn7db1kT65GmV94GzpX9Qdi7N/pQlwb+AN8wh+Q=
github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0=
github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM=
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 h1:Jpy1PXuP99tXNrhbq2BaPz9B+jNAvH1JPQQpG/9GCXY= github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 h1:Jpy1PXuP99tXNrhbq2BaPz9B+jNAvH1JPQQpG/9GCXY=
@ -116,8 +120,9 @@ github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:X
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= github.com/urfave/cli v1.22.8 h1:9ic0a+f2TCJ5tSbVRX/FSSCIHJacFLYxcuNexNMJF8Q=
github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/urfave/cli/v2 v2.5.1 h1:YKwdkyA0xTBzOaP2G0DVxBnCheHGP+Y9VbKAs4K1Ess=
github.com/urfave/cli/v2 v2.5.1/go.mod h1:oDzoM7pVwz6wHn5ogWgFUU1s4VJayeQS+aEZDqXIEJs=
github.com/writeas/activity v0.1.2 h1:Y12B5lIrabfqKE7e7HFCWiXrlfXljr9tlkFm2mp7DgY= github.com/writeas/activity v0.1.2 h1:Y12B5lIrabfqKE7e7HFCWiXrlfXljr9tlkFm2mp7DgY=
github.com/writeas/activity v0.1.2/go.mod h1:mYYgiewmEM+8tlifirK/vl6tmB2EbjYaxwb+ndUw5T0= github.com/writeas/activity v0.1.2/go.mod h1:mYYgiewmEM+8tlifirK/vl6tmB2EbjYaxwb+ndUw5T0=
github.com/writeas/activityserve v0.0.0-20200409150223-d7ab3eaa4481 h1:BiSivIxLQFcKoUorpNN3rNwwFG5bITPnqUSyIccfdh0= github.com/writeas/activityserve v0.0.0-20200409150223-d7ab3eaa4481 h1:BiSivIxLQFcKoUorpNN3rNwwFG5bITPnqUSyIccfdh0=
@ -148,6 +153,8 @@ 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/slug v1.2.0/go.mod h1:RE8shOqQP3YhsfsQe0L3RnuejfQ4Mk+JjY5YJQFubfQ=
github.com/writeas/web-core v1.3.1-0.20210330164422-95a3a717ed8f h1:ItBZYzdIbBmmqn8BZGWww00MBFgcUKy5ei0gJrzRDFk= github.com/writeas/web-core v1.3.1-0.20210330164422-95a3a717ed8f h1:ItBZYzdIbBmmqn8BZGWww00MBFgcUKy5ei0gJrzRDFk=
github.com/writeas/web-core v1.3.1-0.20210330164422-95a3a717ed8f/go.mod h1:DzNxa0YLV/wNeeWeHFPNa/nHmyJBFIIzXN/m9PpDm5c= github.com/writeas/web-core v1.3.1-0.20210330164422-95a3a717ed8f/go.mod h1:DzNxa0YLV/wNeeWeHFPNa/nHmyJBFIIzXN/m9PpDm5c=
github.com/writefreely/go-gopher v0.0.0-20220429181814-40127126f83b h1:h3NzB8OZ50NNi5k9yrFeyFszt3LyqyVK4+xUHFYY8B0=
github.com/writefreely/go-gopher v0.0.0-20220429181814-40127126f83b/go.mod h1:T2UVVzt+R5KSSZe2xRSytnwc2M9AoDegi7foeIsik+M=
github.com/writefreely/go-nodeinfo v1.2.0 h1:La+YbTCvmpTwFhBSlebWDDL81N88Qf/SCAvRLR7F8ss= 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= 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= golang.org/x/crypto v0.0.0-20180527072434-ab813273cd59/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@ -176,11 +183,10 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/ini.v1 v1.55.0 h1:E8yzL5unfpW3M6fz/eB7Cb5MQAYSZ7GKo4Qth+N2sgQ=
gopkg.in/ini.v1 v1.55.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.55.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU=
gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0 h1:POO/ycCATvegFmVuPpQzZFJ+pGZeX22Ufu6fibxDVjU= gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0 h1:POO/ycCATvegFmVuPpQzZFJ+pGZeX22Ufu6fibxDVjU=
gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg=
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

@ -1,5 +1,5 @@
/* /*
* Copyright © 2020 A Bunch Tell LLC. * Copyright © 2020 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *
@ -18,8 +18,8 @@ import (
"regexp" "regexp"
"strings" "strings"
"git.mills.io/prologic/go-gopher"
"github.com/writeas/web-core/log" "github.com/writeas/web-core/log"
"github.com/writefreely/go-gopher"
) )
func initGopher(apper Apper) { func initGopher(apper Apper) {

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2021 A Bunch Tell LLC. * Copyright © 2018-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *
@ -20,10 +20,10 @@ import (
"strings" "strings"
"time" "time"
"git.mills.io/prologic/go-gopher"
"github.com/gorilla/sessions" "github.com/gorilla/sessions"
"github.com/writeas/impart" "github.com/writeas/impart"
"github.com/writeas/web-core/log" "github.com/writeas/web-core/log"
"github.com/writefreely/go-gopher"
"github.com/writefreely/writefreely/config" "github.com/writefreely/writefreely/config"
"github.com/writefreely/writefreely/page" "github.com/writefreely/writefreely/page"
) )

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2019 A Bunch Tell LLC. * Copyright © 2018-2019 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018 A Bunch Tell LLC. * Copyright © 2018 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2019-2021 A Bunch Tell LLC. * Copyright © 2019-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2019, 2021 A Bunch Tell LLC. * Copyright © 2019, 2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2019, 2021 A Bunch Tell LLC. * Copyright © 2018-2019, 2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -695,6 +695,7 @@ table.downloads {
select.inputform, textarea.inputform { select.inputform, textarea.inputform {
border: 1px solid #999; border: 1px solid #999;
background: white;
} }
input, button, select.inputform, textarea.inputform, a.btn { input, button, select.inputform, textarea.inputform, a.btn {

@ -1,5 +1,5 @@
/* /*
* Copyright © 2020 A Bunch Tell LLC. * Copyright © 2020 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2019 A Bunch Tell LLC. * Copyright © 2019 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2019 A Bunch Tell LLC. * Copyright © 2019 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2019 A Bunch Tell LLC. * Copyright © 2019 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2020 A Bunch Tell LLC. * Copyright © 2020 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2019 A Bunch Tell LLC. * Copyright © 2019 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2019 A Bunch Tell LLC. * Copyright © 2019 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2019-2021 A Bunch Tell LLC. * Copyright © 2019-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2019-2021 A Bunch Tell LLC. * Copyright © 2019-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2019-2020 A Bunch Tell LLC. * Copyright © 2019-2020 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2020-2021 A Bunch Tell LLC. * Copyright © 2020-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2020-2021 A Bunch Tell LLC. * Copyright © 2020-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2020 A Bunch Tell LLC. * Copyright © 2020 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2020-2021 A Bunch Tell LLC. * Copyright © 2020-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2019, 2021 A Bunch Tell LLC. * Copyright © 2018-2019, 2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2019-2021 A Bunch Tell LLC. * Copyright © 2019-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *
@ -293,10 +293,15 @@ func configureGiteaOauth(parentHandler *Handler, r *mux.Router, app *App) {
ClientID: app.Config().GiteaOauth.ClientID, ClientID: app.Config().GiteaOauth.ClientID,
ClientSecret: app.Config().GiteaOauth.ClientSecret, ClientSecret: app.Config().GiteaOauth.ClientSecret,
ExchangeLocation: app.Config().GiteaOauth.Host + "/login/oauth/access_token", ExchangeLocation: app.Config().GiteaOauth.Host + "/login/oauth/access_token",
InspectLocation: app.Config().GiteaOauth.Host + "/api/v1/user", InspectLocation: app.Config().GiteaOauth.Host + "/login/oauth/userinfo",
AuthLocation: app.Config().GiteaOauth.Host + "/login/oauth/authorize", AuthLocation: app.Config().GiteaOauth.Host + "/login/oauth/authorize",
HttpClient: config.DefaultHTTPClient(), HttpClient: config.DefaultHTTPClient(),
CallbackLocation: callbackLocation, CallbackLocation: callbackLocation,
Scope: "openid profile email",
MapUserID: "sub",
MapUsername: "login",
MapDisplayName: "full_name",
MapEmail: "email",
} }
configureOauthRoutes(parentHandler, r, app, oauthClient, callbackProxy) configureOauthRoutes(parentHandler, r, app, oauthClient, callbackProxy)
} }
@ -355,7 +360,7 @@ func (h oauthHandler) viewOauthCallback(app *App, w http.ResponseWriter, r *http
} }
if localUserID != -1 && attachUserID > 0 { if localUserID != -1 && attachUserID > 0 {
if err = addSessionFlash(app, w, r, "This Slack account is already attached to another user.", nil); err != nil { if err = addSessionFlash(app, w, r, "This OAuth account is already attached to another user.", nil); err != nil {
return impart.HTTPError{Status: http.StatusInternalServerError, Message: err.Error()} return impart.HTTPError{Status: http.StatusInternalServerError, Message: err.Error()}
} }
return impart.HTTPError{http.StatusFound, "/me/settings"} return impart.HTTPError{http.StatusFound, "/me/settings"}
@ -376,6 +381,7 @@ func (h oauthHandler) viewOauthCallback(app *App, w http.ResponseWriter, r *http
} }
if attachUserID > 0 { if attachUserID > 0 {
log.Info("attaching to user %d", attachUserID) log.Info("attaching to user %d", attachUserID)
log.Info("OAuth userid: %s", tokenInfo.UserID)
err = h.DB.RecordRemoteUserID(r.Context(), attachUserID, tokenInfo.UserID, provider, clientID, tokenResponse.AccessToken) err = h.DB.RecordRemoteUserID(r.Context(), attachUserID, tokenInfo.UserID, provider, clientID, tokenResponse.AccessToken)
if err != nil { if err != nil {
return impart.HTTPError{http.StatusInternalServerError, err.Error()} return impart.HTTPError{http.StatusInternalServerError, err.Error()}

@ -1,5 +1,5 @@
/* /*
* Copyright © 2020-2021 A Bunch Tell LLC and respective authors. * Copyright © 2020-2021 Musing Studio LLC and respective authors.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -3,6 +3,8 @@ package writefreely
import ( import (
"context" "context"
"errors" "errors"
"fmt"
"github.com/writeas/web-core/log"
"net/http" "net/http"
"net/url" "net/url"
"strings" "strings"
@ -15,6 +17,11 @@ type giteaOauthClient struct {
ExchangeLocation string ExchangeLocation string
InspectLocation string InspectLocation string
CallbackLocation string CallbackLocation string
Scope string
MapUserID string
MapUsername string
MapDisplayName string
MapEmail string
HttpClient HttpClient HttpClient HttpClient
} }
@ -46,7 +53,7 @@ func (c giteaOauthClient) buildLoginURL(state string) (string, error) {
q.Set("redirect_uri", c.CallbackLocation) q.Set("redirect_uri", c.CallbackLocation)
q.Set("response_type", "code") q.Set("response_type", "code")
q.Set("state", state) q.Set("state", state)
// q.Set("scope", "read_user") q.Set("scope", c.Scope)
u.RawQuery = q.Encode() u.RawQuery = q.Encode()
return u.String(), nil return u.String(), nil
} }
@ -55,7 +62,7 @@ func (c giteaOauthClient) exchangeOauthCode(ctx context.Context, code string) (*
form := url.Values{} form := url.Values{}
form.Add("grant_type", "authorization_code") form.Add("grant_type", "authorization_code")
form.Add("redirect_uri", c.CallbackLocation) form.Add("redirect_uri", c.CallbackLocation)
// form.Add("scope", "read_user") form.Add("scope", c.Scope)
form.Add("code", code) form.Add("code", code)
req, err := http.NewRequest("POST", c.ExchangeLocation, strings.NewReader(form.Encode())) req, err := http.NewRequest("POST", c.ExchangeLocation, strings.NewReader(form.Encode()))
if err != nil { if err != nil {
@ -103,12 +110,24 @@ func (c giteaOauthClient) inspectOauthAccessToken(ctx context.Context, accessTok
return nil, errors.New("unable to inspect access token") return nil, errors.New("unable to inspect access token")
} }
var inspectResponse InspectResponse // since we don't know what the JSON from the server will look like, we create a
if err := limitedJsonUnmarshal(resp.Body, infoRequestMaxLen, &inspectResponse); err != nil { // 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 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)
// log.Info("Userid from Gitea: %s", inspectResponse.UserID)
if inspectResponse.UserID == "" {
log.Error("[CONFIGURATION ERROR] Gitea OAuth provider returned empty UserID value (`%s`).\n Do you need to configure a different `map_user_id` value for this provider?", c.MapUserID)
return nil, fmt.Errorf("no UserID (`%s`) value returned", c.MapUserID)
} }
inspectResponse.Username, _ = genericInterface[c.MapUsername].(string)
inspectResponse.DisplayName, _ = genericInterface[c.MapDisplayName].(string)
inspectResponse.Email, _ = genericInterface[c.MapEmail].(string)
return &inspectResponse, nil return &inspectResponse, nil
} }

@ -1,5 +1,5 @@
/* /*
* Copyright © 2020-2021 A Bunch Tell LLC. * Copyright © 2020-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2019-2020 A Bunch Tell LLC. * Copyright © 2019-2020 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2019-2021 A Bunch Tell LLC. * Copyright © 2019-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2021 A Bunch Tell LLC. * Copyright © 2018-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2019, 2021 A Bunch Tell LLC. * Copyright © 2018-2019, 2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2019, 2021 A Bunch Tell LLC. * Copyright © 2018-2019, 2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2020 A Bunch Tell LLC. * Copyright © 2018-2020 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018 A Bunch Tell LLC. * Copyright © 2018 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2021 A Bunch Tell LLC. * Copyright © 2018-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *
@ -201,6 +201,9 @@ func applyBasicMarkdown(data []byte) string {
md := blackfriday.Markdown(append([]byte("# "), data...), blackfriday.HtmlRenderer(htmlFlags, "", ""), mdExtensions) md := blackfriday.Markdown(append([]byte("# "), data...), blackfriday.HtmlRenderer(htmlFlags, "", ""), mdExtensions)
// Remove H1 markup // Remove H1 markup
md = bytes.TrimSpace(md) // blackfriday.Markdown adds a newline at the end of the <h1> md = bytes.TrimSpace(md) // blackfriday.Markdown adds a newline at the end of the <h1>
if len(md) == 0 {
return ""
}
md = md[len("<h1>") : len(md)-len("</h1>")] md = md[len("<h1>") : len(md)-len("</h1>")]
// Strip out bad HTML // Strip out bad HTML
policy := bluemonday.UGCPolicy() policy := bluemonday.UGCPolicy()

@ -1,5 +1,5 @@
/* /*
* Copyright © 2021 A Bunch Tell LLC. * Copyright © 2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2021 A Bunch Tell LLC. * Copyright © 2018-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *
@ -1247,6 +1247,8 @@ func getSlug(title, lang string) string {
func getSlugFromPost(title, body, lang string) string { func getSlugFromPost(title, body, lang string) string {
if title == "" { if title == "" {
// Remove Markdown, so e.g. link URLs and image alt text don't make it into the slug
body = strings.TrimSpace(stripmd.StripOptions(body, stripmd.Options{SkipImages: true}))
title = postTitle(body, body) title = postTitle(body, body)
} }
title = parse.PostLede(title, false) title = parse.PostLede(title, false)

@ -1,5 +1,5 @@
/* /*
* Copyright © 2020-2021 A Bunch Tell LLC. * Copyright © 2020-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -92,8 +92,8 @@ export const writeFreelyMarkdownSerializer = new MarkdownSerializer(
}, },
{ {
em: { em: {
open: "*", open: "_",
close: "*", close: "_",
mixable: true, mixable: true,
expelEnclosingWhitespace: true, expelEnclosingWhitespace: true,
}, },

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2021 A Bunch Tell LLC. * Copyright © 2018-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018 A Bunch Tell LLC. * Copyright © 2018 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2021 A Bunch Tell LLC. * Copyright © 2018-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# #
# Copyright © 2020 A Bunch Tell LLC. # Copyright © 2020 Musing Studio LLC.
# #
# This file is part of WriteFreely. # This file is part of WriteFreely.
# #

@ -11,7 +11,7 @@
## have not installed the binary `writefreely` in another location. ## ## have not installed the binary `writefreely` in another location. ##
############################################################################### ###############################################################################
# #
# Copyright © 2019-2020 A Bunch Tell LLC. # Copyright © 2019-2020 Musing Studio LLC.
# #
# This file is part of WriteFreely. # This file is part of WriteFreely.
# #

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2019 A Bunch Tell LLC. * Copyright © 2018-2019 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2019 A Bunch Tell LLC. * Copyright © 2018-2019 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2016-2021 A Bunch Tell LLC. * Copyright © 2016-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2020-2021 A Bunch Tell LLC. * Copyright © 2020-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2021 A Bunch Tell LLC. * Copyright © 2018-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -2,8 +2,8 @@
<html> <html>
<head> <head>
{{ template "head" . }} {{ template "head" . }}
<link rel="stylesheet" type="text/css" href="{{.Host}}/css/{{.Theme}}.css" /> <link rel="stylesheet" type="text/css" href="/css/{{.Theme}}.css" />
<link rel="shortcut icon" href="{{.Host}}/favicon.ico" /> <link rel="shortcut icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="application-name" content="{{.SiteName}}"> <meta name="application-name" content="{{.SiteName}}">
@ -86,7 +86,7 @@
{{end}} {{end}}
</script> </script>
{{else}} {{else}}
{{if .WebFonts}}<link href="{{.Host}}/css/fonts.css" rel="stylesheet" type="text/css" />{{end}} {{if .WebFonts}}<link href="/css/fonts.css" rel="stylesheet" type="text/css" />{{end}}
{{end}} {{end}}
</body> </body>
</html>{{end}} </html>{{end}}

@ -65,7 +65,7 @@
{{end}} {{end}}
<dt><label for="lang">Language</label></dt> <dt><label for="lang">Language</label></dt>
<dd> <dd>
<select name="lang" id="lang" dir="auto"> <select name="lang" id="lang" dir="auto" class="inputform">
<option value=""></option> <option value=""></option>
<option value="ab"{{if eq "ab" .Post.Language.String}} selected="selected"{{end}}>аҧсуа бызшәа, аҧсшәа</option> <option value="ab"{{if eq "ab" .Post.Language.String}} selected="selected"{{end}}>аҧсуа бызшәа, аҧсшәа</option>
<option value="aa"{{if eq "aa" .Post.Language.String}} selected="selected"{{end}}>Afaraf</option> <option value="aa"{{if eq "aa" .Post.Language.String}} selected="selected"{{end}}>Afaraf</option>

@ -24,7 +24,7 @@
{{if not .SingleUser}}<h1><a href="/me/c/" title="View blogs"><img class="ic-24dp" src="/img/ic_blogs_dark@2x.png" /></a></h1>{{end}} {{if not .SingleUser}}<h1><a href="/me/c/" title="View blogs"><img class="ic-24dp" src="/img/ic_blogs_dark@2x.png" /></a></h1>{{end}}
<nav id="target" {{if .SingleUser}}style="margin-left:0"{{end}}><ul> <nav id="target" {{if .SingleUser}}style="margin-left:0"{{end}}><ul>
{{if .Editing}}<li>{{if .EditCollection}}<a href="{{.EditCollection.CanonicalURL}}">{{.EditCollection.Title}}</a>{{else}}<a>Draft</a>{{end}}</li> {{if .Editing}}<li>{{if .EditCollection}}<a href="{{.EditCollection.CanonicalURL}}">{{.EditCollection.Title}}</a>{{else}}<a>Draft</a>{{end}}</li>
{{else}}<li class="has-submenu"><a id="publish-to"><span id="target-name">Draft</span> <img class="ic-18dp" src="/img/ic_down_arrow_dark@2x.png" /></a> {{else}}<li class="has-submenu"><a href="#" id="publish-to" onclick="return false"><span id="target-name">Draft</span> <img class="ic-18dp" src="/img/ic_down_arrow_dark@2x.png" /></a>
<ul> <ul>
<li class="menu-heading">Publish to...</li> <li class="menu-heading">Publish to...</li>
{{if .Blogs}}{{range $idx, $el := .Blogs}} {{if .Blogs}}{{range $idx, $el := .Blogs}}

@ -1,7 +1,3 @@
{{define "upgrade"}}
<p><a href="/me/plan?to=/me/c/{{.Alias}}">Upgrade</a> for <span>$40 / year</span> to edit.</p>
{{end}}
{{define "collection"}} {{define "collection"}}
{{template "header" .}} {{template "header" .}}

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2019 A Bunch Tell LLC. * Copyright © 2018-2019 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2019-2020 A Bunch Tell LLC. * Copyright © 2019-2020 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2019, 2021 A Bunch Tell LLC. * Copyright © 2018-2019, 2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright © 2018-2021 A Bunch Tell LLC. * Copyright © 2018-2021 Musing Studio LLC.
* *
* This file is part of WriteFreely. * This file is part of WriteFreely.
* *

Loading…
Cancel
Save