Skip to content

Commit

Permalink
chore: add skipper for secure (#913)
Browse files Browse the repository at this point in the history
  • Loading branch information
boojack committed Jan 7, 2023
1 parent 96798e1 commit 46c13a4
Show file tree
Hide file tree
Showing 8 changed files with 74 additions and 6 deletions.
6 changes: 6 additions & 0 deletions server/common.go
@@ -1,6 +1,8 @@
package server

import (
"net/http"

"github.com/labstack/echo/v4"
"github.com/usememos/memos/api"
"github.com/usememos/memos/common"
Expand All @@ -16,6 +18,10 @@ func composeResponse(data interface{}) response {
}
}

func DefaultGetRequestSkipper(c echo.Context) bool {
return c.Request().Method == http.MethodGet
}

func (server *Server) DefaultAuthSkipper(c echo.Context) bool {
ctx := c.Request().Context()
path := c.Path()
Expand Down
7 changes: 6 additions & 1 deletion server/resource.go
Expand Up @@ -7,6 +7,7 @@ import (
"net/http"
"net/url"
"strconv"
"strings"
"time"

"github.com/pkg/errors"
Expand Down Expand Up @@ -266,7 +267,11 @@ func (s *Server) registerResourcePublicRoutes(g *echo.Group) {
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Sprintf("Failed to fetch resource ID: %v", resourceID)).SetInternal(err)
}

c.Response().Writer.Header().Set("Content-Type", resource.Type)
if strings.HasPrefix(resource.Type, "text") || strings.HasPrefix(resource.Type, "application") {
c.Response().Writer.Header().Set("Content-Type", echo.MIMETextPlain)
} else {
c.Response().Writer.Header().Set("Content-Type", resource.Type)
}
c.Response().Writer.WriteHeader(http.StatusOK)
c.Response().Writer.Header().Set(echo.HeaderCacheControl, "max-age=31536000, immutable")
c.Response().Writer.Header().Set(echo.HeaderContentSecurityPolicy, "default-src 'self'")
Expand Down
8 changes: 7 additions & 1 deletion server/server.go
Expand Up @@ -64,7 +64,13 @@ func NewServer(ctx context.Context, profile *profile.Profile) (*Server, error) {

e.Use(middleware.CORS())

e.Use(middleware.Secure())
e.Use(middleware.SecureWithConfig(middleware.SecureConfig{
Skipper: DefaultGetRequestSkipper,
XSSProtection: "1; mode=block",
ContentTypeNosniff: "nosniff",
XFrameOptions: "SAMEORIGIN",
HSTSPreloadEnabled: false,
}))

e.Use(middleware.TimeoutWithConfig(middleware.TimeoutConfig{
Skipper: middleware.DefaultSkipper,
Expand Down
5 changes: 2 additions & 3 deletions server/version/version.go
Expand Up @@ -7,10 +7,10 @@ import (

// Version is the service current released version.
// Semantic versioning: https://semver.org/
var Version = "0.9.1"
var Version = "0.10.0"

// DevVersion is the service current development version.
var DevVersion = "0.9.1"
var DevVersion = "0.10.0"

func GetCurrentVersion(mode string) string {
if mode == "dev" {
Expand All @@ -29,7 +29,6 @@ func GetMinorVersion(version string) string {

func GetSchemaVersion(version string) string {
minorVersion := GetMinorVersion(version)

return minorVersion + ".0"
}

Expand Down
33 changes: 33 additions & 0 deletions server/version/version_test.go
@@ -0,0 +1,33 @@
package version

import "testing"

func TestIsVersionGreaterOrEqualThan(t *testing.T) {
tests := []struct {
version string
target string
want bool
}{
{
version: "0.9.1",
target: "0.9.1",
want: true,
},
{
version: "0.10.0",
target: "0.9.1",
want: true,
},
{
version: "0.9.0",
target: "0.9.1",
want: false,
},
}
for _, test := range tests {
result := IsVersionGreaterOrEqualThan(test.version, test.target)
if result != test.want {
t.Errorf("got result %v, want %v.", result, test.want)
}
}
}
9 changes: 9 additions & 0 deletions store/db/migration/prod/0.10/00__activity.sql
@@ -0,0 +1,9 @@
-- activity
CREATE TABLE activity (
id INTEGER PRIMARY KEY AUTOINCREMENT,
creator_id INTEGER NOT NULL,
created_ts BIGINT NOT NULL DEFAULT (strftime('%s', 'now')),
type TEXT NOT NULL DEFAULT '',
level TEXT NOT NULL CHECK (level IN ('INFO', 'WARN', 'ERROR')) DEFAULT 'INFO',
payload TEXT NOT NULL DEFAULT '{}'
);
10 changes: 10 additions & 0 deletions store/db/migration/prod/LATEST__SCHEMA.sql
Expand Up @@ -93,3 +93,13 @@ CREATE TABLE tag (
creator_id INTEGER NOT NULL,
UNIQUE(name, creator_id)
);

-- activity
CREATE TABLE activity (
id INTEGER PRIMARY KEY AUTOINCREMENT,
creator_id INTEGER NOT NULL,
created_ts BIGINT NOT NULL DEFAULT (strftime('%s', 'now')),
type TEXT NOT NULL DEFAULT '',
level TEXT NOT NULL CHECK (level IN ('INFO', 'WARN', 'ERROR')) DEFAULT 'INFO',
payload TEXT NOT NULL DEFAULT '{}'
);
2 changes: 1 addition & 1 deletion web/src/components/EmbedMemoDialog.tsx
Expand Up @@ -34,7 +34,7 @@ const EmbedMemoDialog: React.FC<Props> = (props: Props) => {
<code className="w-full break-all whitespace-pre-wrap">{memoEmbeddedCode()}</code>
</pre>
<p className="w-full text-sm leading-6 flex flex-row justify-between items-center mt-2">
* Only the public memo supports.
<span className="italic opacity-80">* Only the public memo supports.</span>
<span className="btn-primary" onClick={handleCopyCode}>
Copy
</span>
Expand Down

0 comments on commit 46c13a4

Please sign in to comment.