Merge branch 'develop' into chorus

pull/157/head
Matt Baer 5 years ago
commit ca388d6536
  1. 48
      Makefile
  2. 21
      account.go
  3. 11
      admin.go
  4. 7
      app.go
  5. 1
      cmd/writefreely/main.go
  6. 6
      collections.go
  7. 11
      database.go
  8. 2
      export.go
  9. 14
      pad.go
  10. 14
      postrender.go

@ -7,6 +7,7 @@ GOBUILD=$(GOCMD) build $(LDFLAGS)
GOTEST=$(GOCMD) test $(LDFLAGS) GOTEST=$(GOCMD) test $(LDFLAGS)
GOGET=$(GOCMD) get GOGET=$(GOCMD) get
BINARY_NAME=writefreely BINARY_NAME=writefreely
BUILDPATH=build/$(BINARY_NAME)
DOCKERCMD=docker DOCKERCMD=docker
IMAGE_NAME=writeas/writefreely IMAGE_NAME=writeas/writefreely
TMPBIN=./tmp TMPBIN=./tmp
@ -69,39 +70,40 @@ install : build
cd less/; $(MAKE) install $(MFLAGS) cd less/; $(MAKE) install $(MFLAGS)
release : clean ui assets release : clean ui assets
mkdir build mkdir -p $(BUILDPATH)
cp -r templates build cp -r templates $(BUILDPATH)
cp -r pages build cp -r pages $(BUILDPATH)
cp -r static build cp -r static $(BUILDPATH)
mkdir build/keys mkdir $(BUILDPATH)/keys
$(MAKE) build-linux $(MAKE) build-linux
mv build/$(BINARY_NAME)-linux-amd64 build/$(BINARY_NAME) mv build/$(BINARY_NAME)-linux-amd64 $(BUILDPATH)/$(BINARY_NAME)
cd build; tar -cvzf ../$(BINARY_NAME)_$(GITREV)_linux_amd64.tar.gz * tar -cvzf $(BINARY_NAME)_$(GITREV)_linux_amd64.tar.gz -C build $(BINARY_NAME)
rm build/$(BINARY_NAME) rm $(BUILDPATH)/$(BINARY_NAME)
$(MAKE) build-arm7 $(MAKE) build-arm7
mv build/$(BINARY_NAME)-linux-arm-7 build/$(BINARY_NAME) mv build/$(BINARY_NAME)-linux-arm-7 $(BUILDPATH)/$(BINARY_NAME)
cd build; tar -cvzf ../$(BINARY_NAME)_$(GITREV)_linux_arm7.tar.gz * tar -cvzf $(BINARY_NAME)_$(GITREV)_linux_arm7.tar.gz -C build $(BINARY_NAME)
rm build/$(BINARY_NAME) rm $(BUILDPATH)/$(BINARY_NAME)
$(MAKE) build-darwin $(MAKE) build-darwin
mv build/$(BINARY_NAME)-darwin-10.6-amd64 build/$(BINARY_NAME) mv build/$(BINARY_NAME)-darwin-10.6-amd64 $(BUILDPATH)/$(BINARY_NAME)
cd build; tar -cvzf ../$(BINARY_NAME)_$(GITREV)_macos_amd64.tar.gz * tar -cvzf $(BINARY_NAME)_$(GITREV)_macos_amd64.tar.gz -C build $(BINARY_NAME)
rm build/$(BINARY_NAME) rm $(BUILDPATH)/$(BINARY_NAME)
$(MAKE) build-windows $(MAKE) build-windows
mv build/$(BINARY_NAME)-windows-4.0-amd64.exe build/$(BINARY_NAME).exe mv build/$(BINARY_NAME)-windows-4.0-amd64.exe $(BUILDPATH)/$(BINARY_NAME).exe
cd build; zip -r ../$(BINARY_NAME)_$(GITREV)_windows_amd64.zip ./* cd build; zip -r ../$(BINARY_NAME)_$(GITREV)_windows_amd64.zip ./$(BINARY_NAME)
rm $(BUILDPATH)/$(BINARY_NAME)
$(MAKE) build-docker $(MAKE) build-docker
$(MAKE) release-docker $(MAKE) release-docker
# This assumes you're on linux/amd64 # This assumes you're on linux/amd64
release-linux : clean ui release-linux : clean ui
mkdir build mkdir -p $(BUILDPATH)
cp -r templates build cp -r templates $(BUILDPATH)
cp -r pages build cp -r pages $(BUILDPATH)
cp -r static build cp -r static $(BUILDPATH)
mkdir build/keys mkdir $(BUILDPATH)/keys
$(MAKE) build-no-sqlite $(MAKE) build-no-sqlite
mv cmd/writefreely/$(BINARY_NAME) build/$(BINARY_NAME) mv cmd/writefreely/$(BINARY_NAME) $(BUILDPATH)/$(BINARY_NAME)
cd build; tar -cvzf ../$(BINARY_NAME)_$(GITREV)_linux_amd64.tar.gz * tar -cvzf $(BINARY_NAME)_$(GITREV)_linux_amd64.tar.gz -C build $(BINARY_NAME)
release-docker : release-docker :
$(DOCKERCMD) push $(IMAGE_NAME) $(DOCKERCMD) push $(IMAGE_NAME)

@ -13,6 +13,13 @@ package writefreely
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"html/template"
"net/http"
"regexp"
"strings"
"sync"
"time"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/gorilla/sessions" "github.com/gorilla/sessions"
"github.com/guregu/null/zero" "github.com/guregu/null/zero"
@ -23,12 +30,6 @@ import (
"github.com/writeas/writefreely/author" "github.com/writeas/writefreely/author"
"github.com/writeas/writefreely/config" "github.com/writeas/writefreely/config"
"github.com/writeas/writefreely/page" "github.com/writeas/writefreely/page"
"html/template"
"net/http"
"regexp"
"strings"
"sync"
"time"
) )
type ( type (
@ -551,7 +552,7 @@ func getVerboseAuthUser(app *App, token string, u *User, verbose bool) *AuthUser
if err != nil { if err != nil {
log.Error("Login: Unable to get user posts: %v", err) log.Error("Login: Unable to get user posts: %v", err)
} }
colls, err := app.db.GetCollections(u) colls, err := app.db.GetCollections(u, app.cfg.App.Host)
if err != nil { if err != nil {
log.Error("Login: Unable to get user collections: %v", err) log.Error("Login: Unable to get user collections: %v", err)
} }
@ -721,7 +722,7 @@ func viewMyCollectionsAPI(app *App, u *User, w http.ResponseWriter, r *http.Requ
return ErrBadRequestedType return ErrBadRequestedType
} }
p, err := app.db.GetCollections(u) p, err := app.db.GetCollections(u, app.cfg.App.Host)
if err != nil { if err != nil {
return err return err
} }
@ -744,7 +745,7 @@ func viewArticles(app *App, u *User, w http.ResponseWriter, r *http.Request) err
log.Error("unable to fetch flashes: %v", err) log.Error("unable to fetch flashes: %v", err)
} }
c, err := app.db.GetPublishableCollections(u) c, err := app.db.GetPublishableCollections(u, app.cfg.App.Host)
if err != nil { if err != nil {
log.Error("unable to fetch collections: %v", err) log.Error("unable to fetch collections: %v", err)
} }
@ -767,7 +768,7 @@ func viewArticles(app *App, u *User, w http.ResponseWriter, r *http.Request) err
} }
func viewCollections(app *App, u *User, w http.ResponseWriter, r *http.Request) error { func viewCollections(app *App, u *User, w http.ResponseWriter, r *http.Request) error {
c, err := app.db.GetCollections(u) c, err := app.db.GetCollections(u, app.cfg.App.Host)
if err != nil { if err != nil {
log.Error("unable to fetch collections: %v", err) log.Error("unable to fetch collections: %v", err)
return fmt.Errorf("No collections") return fmt.Errorf("No collections")

@ -13,16 +13,17 @@ package writefreely
import ( import (
"database/sql" "database/sql"
"fmt" "fmt"
"net/http"
"runtime"
"strconv"
"time"
"github.com/gogits/gogs/pkg/tool" "github.com/gogits/gogs/pkg/tool"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/writeas/impart" "github.com/writeas/impart"
"github.com/writeas/web-core/auth" "github.com/writeas/web-core/auth"
"github.com/writeas/web-core/log" "github.com/writeas/web-core/log"
"github.com/writeas/writefreely/config" "github.com/writeas/writefreely/config"
"net/http"
"runtime"
"strconv"
"time"
) )
var ( var (
@ -195,7 +196,7 @@ func handleViewAdminUser(app *App, u *User, w http.ResponseWriter, r *http.Reque
p.LastPost = lp.Format("January 2, 2006, 3:04 PM") p.LastPost = lp.Format("January 2, 2006, 3:04 PM")
} }
colls, err := app.db.GetCollections(p.User) colls, err := app.db.GetCollections(p.User, app.cfg.App.Host)
if err != nil { if err != nil {
return impart.HTTPError{http.StatusInternalServerError, fmt.Sprintf("Could not get user's collections: %v", err)} return impart.HTTPError{http.StatusInternalServerError, fmt.Sprintf("Could not get user's collections: %v", err)}
} }

@ -503,9 +503,14 @@ func ConnectToDatabase(app *App) error {
return nil return nil
} }
// FormatVersion constructs the version string for the application
func FormatVersion() string {
return serverSoftware + " " + softwareVer
}
// OutputVersion prints out the version of the application. // OutputVersion prints out the version of the application.
func OutputVersion() { func OutputVersion() {
fmt.Println(serverSoftware + " " + softwareVer) fmt.Println(FormatVersion())
} }
// NewApp creates a new app instance. // NewApp creates a new app instance.

@ -113,6 +113,7 @@ func main() {
// Initialize the application // Initialize the application
var err error var err error
log.Info("Starting %s...", writefreely.FormatVersion())
app, err = writefreely.Initialize(app, *debugPtr) app, err = writefreely.Initialize(app, *debugPtr)
if err != nil { if err != nil {
log.Error("%s", err) log.Error("%s", err)

@ -726,6 +726,8 @@ func handleViewCollection(app *App, w http.ResponseWriter, r *http.Request) erro
return err return err
} }
c.hostName = app.cfg.App.Host
// Serve ActivityStreams data now, if requested // Serve ActivityStreams data now, if requested
if strings.Contains(r.Header.Get("Accept"), "application/activity+json") { if strings.Contains(r.Header.Get("Accept"), "application/activity+json") {
ac := c.PersonObject() ac := c.PersonObject()
@ -766,7 +768,7 @@ func handleViewCollection(app *App, w http.ResponseWriter, r *http.Request) erro
owner = u owner = u
displayPage.CanPin = true displayPage.CanPin = true
pubColls, err := app.db.GetPublishableCollections(owner) pubColls, err := app.db.GetPublishableCollections(owner, app.cfg.App.Host)
if err != nil { if err != nil {
log.Error("unable to fetch collections: %v", err) log.Error("unable to fetch collections: %v", err)
} }
@ -867,7 +869,7 @@ func handleViewCollectionTag(app *App, w http.ResponseWriter, r *http.Request) e
owner = u owner = u
displayPage.CanPin = true displayPage.CanPin = true
pubColls, err := app.db.GetPublishableCollections(owner) pubColls, err := app.db.GetPublishableCollections(owner, app.cfg.App.Host)
if err != nil { if err != nil {
log.Error("unable to fetch collections: %v", err) log.Error("unable to fetch collections: %v", err)
} }

@ -65,8 +65,8 @@ type writestore interface {
ChangeSettings(app *App, u *User, s *userSettings) error ChangeSettings(app *App, u *User, s *userSettings) error
ChangePassphrase(userID int64, sudo bool, curPass string, hashedPass []byte) error ChangePassphrase(userID int64, sudo bool, curPass string, hashedPass []byte) error
GetCollections(u *User) (*[]Collection, error) GetCollections(u *User, hostName string) (*[]Collection, error)
GetPublishableCollections(u *User) (*[]Collection, error) GetPublishableCollections(u *User, hostName string) (*[]Collection, error)
GetMeStats(u *User) userMeStats GetMeStats(u *User) userMeStats
GetTotalCollections() (int64, error) GetTotalCollections() (int64, error)
GetTotalPosts() (int64, error) GetTotalPosts() (int64, error)
@ -1559,7 +1559,7 @@ func (db *datastore) GetPinnedPosts(coll *CollectionObj) (*[]PublicPost, error)
return &posts, nil return &posts, nil
} }
func (db *datastore) GetCollections(u *User) (*[]Collection, error) { func (db *datastore) GetCollections(u *User, hostName string) (*[]Collection, error) {
rows, err := db.Query("SELECT id, alias, title, description, privacy, view_count FROM collections WHERE owner_id = ? ORDER BY id ASC", u.ID) rows, err := db.Query("SELECT id, alias, title, description, privacy, view_count FROM collections WHERE owner_id = ? ORDER BY id ASC", u.ID)
if err != nil { if err != nil {
log.Error("Failed selecting from collections: %v", err) log.Error("Failed selecting from collections: %v", err)
@ -1575,6 +1575,7 @@ func (db *datastore) GetCollections(u *User) (*[]Collection, error) {
log.Error("Failed scanning row: %v", err) log.Error("Failed scanning row: %v", err)
break break
} }
c.hostName = hostName
c.URL = c.CanonicalURL() c.URL = c.CanonicalURL()
c.Public = c.IsPublic() c.Public = c.IsPublic()
@ -1588,8 +1589,8 @@ func (db *datastore) GetCollections(u *User) (*[]Collection, error) {
return &colls, nil return &colls, nil
} }
func (db *datastore) GetPublishableCollections(u *User) (*[]Collection, error) { func (db *datastore) GetPublishableCollections(u *User, hostName string) (*[]Collection, error) {
c, err := db.GetCollections(u) c, err := db.GetCollections(u, hostName)
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -104,7 +104,7 @@ func compileFullExport(app *App, u *User) *ExportUser {
User: u, User: u,
} }
colls, err := app.db.GetCollections(u) colls, err := app.db.GetCollections(u, app.cfg.App.Host)
if err != nil { if err != nil {
log.Error("unable to fetch collections: %v", err) log.Error("unable to fetch collections: %v", err)
} }

@ -11,12 +11,13 @@
package writefreely package writefreely
import ( import (
"net/http"
"strings"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/writeas/impart" "github.com/writeas/impart"
"github.com/writeas/web-core/log" "github.com/writeas/web-core/log"
"github.com/writeas/writefreely/page" "github.com/writeas/writefreely/page"
"net/http"
"strings"
) )
func handleViewPad(app *App, w http.ResponseWriter, r *http.Request) error { func handleViewPad(app *App, w http.ResponseWriter, r *http.Request) error {
@ -47,23 +48,20 @@ func handleViewPad(app *App, w http.ResponseWriter, r *http.Request) error {
} }
var err error var err error
if appData.User != nil { if appData.User != nil {
appData.Blogs, err = app.db.GetPublishableCollections(appData.User) appData.Blogs, err = app.db.GetPublishableCollections(appData.User, app.cfg.App.Host)
if err != nil { if err != nil {
log.Error("Unable to get user's blogs for Pad: %v", err) log.Error("Unable to get user's blogs for Pad: %v", err)
} }
} }
padTmpl := app.cfg.App.Editor padTmpl := app.cfg.App.Editor
if padTmpl == "" { if templates[padTmpl] == nil {
log.Info("No template '%s' found. Falling back to default 'pad' template.", padTmpl)
padTmpl = "pad" padTmpl = "pad"
} }
if action == "" && slug == "" { if action == "" && slug == "" {
// Not editing any post; simply render the Pad // Not editing any post; simply render the Pad
if templates[padTmpl] == nil {
log.Info("No template '%s' found. Falling back to default 'pad' template.", padTmpl)
padTmpl = "pad"
}
if err = templates[padTmpl].ExecuteTemplate(w, "pad", appData); err != nil { if err = templates[padTmpl].ExecuteTemplate(w, "pad", appData); err != nil {
log.Error("Unable to execute template: %v", err) log.Error("Unable to execute template: %v", err)
} }

@ -12,18 +12,19 @@ package writefreely
import ( import (
"fmt" "fmt"
"github.com/microcosm-cc/bluemonday"
stripmd "github.com/writeas/go-strip-markdown"
"github.com/writeas/saturday"
"github.com/writeas/web-core/stringmanip"
"github.com/writeas/writefreely/config"
"github.com/writeas/writefreely/parse"
"html" "html"
"html/template" "html/template"
"regexp" "regexp"
"strings" "strings"
"unicode" "unicode"
"unicode/utf8" "unicode/utf8"
"github.com/microcosm-cc/bluemonday"
stripmd "github.com/writeas/go-strip-markdown"
blackfriday "github.com/writeas/saturday"
"github.com/writeas/web-core/stringmanip"
"github.com/writeas/writefreely/config"
"github.com/writeas/writefreely/parse"
) )
var ( var (
@ -37,6 +38,7 @@ var (
func (p *Post) formatContent(cfg *config.Config, c *Collection, isOwner bool) { func (p *Post) formatContent(cfg *config.Config, c *Collection, isOwner bool) {
baseURL := c.CanonicalURL() baseURL := c.CanonicalURL()
// TODO: redundant
if !isSingleUser { if !isSingleUser {
baseURL = "/" + c.Alias + "/" baseURL = "/" + c.Alias + "/"
} }

Loading…
Cancel
Save