diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 4da61c10d..835816694 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -43,7 +43,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -54,7 +54,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v1 + uses: github/codeql-action/autobuild@v2 # âšī¸ Command-line programs to run using the OS shell. # đ https://git.io/JvXDl @@ -68,4 +68,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/docker-nightly.yaml b/.github/workflows/docker-nightly.yaml index cc686f270..171c33491 100644 --- a/.github/workflows/docker-nightly.yaml +++ b/.github/workflows/docker-nightly.yaml @@ -27,7 +27,7 @@ jobs: - name: Set up QEMU id: qemu - uses: docker/setup-qemu-action@v1 + uses: docker/setup-qemu-action@v2 with: image: tonistiigi/binfmt:latest platforms: all diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 88f02818b..eac65a888 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -12,7 +12,7 @@ jobs: test: strategy: matrix: - go-version: [1.16.x, 1.17.x] + go-version: [1.18.x, 1.19.x] os: [ubuntu-latest, macos-latest, windows-latest] runs-on: ${{ matrix.os }} steps: @@ -27,7 +27,7 @@ jobs: run: go test ./... test-bsds: - runs-on: macos-10.15 + runs-on: macos-latest strategy: matrix: os: diff --git a/Earthfile b/Earthfile index abcaa9ea6..ad1d08c7d 100644 --- a/Earthfile +++ b/Earthfile @@ -1,6 +1,6 @@ VERSION --new-platform 0.6 -FROM --platform=linux/amd64 alpine:latest +FROM --platform=linux/amd64 alpine:3.15.5 ARG version=develop WORKDIR /build @@ -17,9 +17,10 @@ docker-all: crosscompiler: # This image is missing a few platforms, so we'll add them locally FROM --platform=linux/amd64 bdwyertech/go-crosscompile - RUN curl -sfL "https://musl.cc/armv7l-linux-musleabihf-cross.tgz" | tar zxf - -C /usr/ --strip-components=1 - RUN curl -sfL "https://musl.cc/i686-linux-musl-cross.tgz" | tar zxf - -C /usr/ --strip-components=1 - RUN curl -sfL "https://musl.cc/x86_64-linux-musl-cross.tgz" | tar zxf - -C /usr/ --strip-components=1 + RUN apk add --update --no-cache tar gzip >> /dev/null + RUN curl -sfL "https://owncast-infra.nyc3.cdn.digitaloceanspaces.com/build/armv7l-linux-musleabihf-cross.tgz" | tar zxf - -C /usr/ --strip-components=1 + RUN curl -sfL "https://owncast-infra.nyc3.cdn.digitaloceanspaces.com/build/i686-linux-musl-cross.tgz" | tar zxf - -C /usr/ --strip-components=1 + RUN curl -sfL "https://owncast-infra.nyc3.cdn.digitaloceanspaces.com/build/x86_64-linux-musl-cross.tgz" | tar zxf - -C /usr/ --strip-components=1 code: FROM --platform=linux/amd64 +crosscompiler @@ -74,7 +75,7 @@ build: WORKDIR /build # MacOSX disallows static executables, so we omit the static flag on this platform - RUN go build -a -installsuffix cgo -ldflags "$([ "$GOOS"z != darwinz ] && echo "-linkmode external -extldflags -static ") -s -w -X github.com/owncast/owncast/config.GitCommit=$EARTHLY_GIT_HASH -X github.com/owncast/owncast/config.VersionNumber=$version -X github.com/owncast/owncast/config.BuildPlatform=$NAME" -o owncast main.go + RUN go build -a -installsuffix cgo -ldflags "$([ "$GOOS"z != darwinz ] && echo "-linkmode external -extldflags -static ") -s -w -X github.com/owncast/owncast/config.GitCommit=$EARTHLY_GIT_HASH -X github.com/owncast/owncast/config.VersionNumber=$version -X github.com/owncast/owncast/config.BuildPlatform=$NAME" -tags sqlite_omit_load_extension -o owncast main.go SAVE ARTIFACT owncast owncast SAVE ARTIFACT README.md README.md @@ -107,7 +108,7 @@ docker: ARG image=ghcr.io/owncast/owncast ARG tag=develop ARG TARGETPLATFORM - FROM --platform=$TARGETPLATFORM alpine:latest + FROM --platform=$TARGETPLATFORM alpine:3.15.5 RUN apk update && apk add --no-cache ffmpeg ffmpeg-libs ca-certificates unzip && update-ca-certificates WORKDIR /app COPY --platform=$TARGETPLATFORM +package/owncast.zip /app diff --git a/activitypub/inbox/worker.go b/activitypub/inbox/worker.go index ef8aef9f3..a3c2f19e0 100644 --- a/activitypub/inbox/worker.go +++ b/activitypub/inbox/worker.go @@ -22,7 +22,7 @@ import ( func handle(request apmodels.InboxRequest) { if verified, err := Verify(request.Request); err != nil { - log.Errorln("Error in attempting to verify request", err) + log.Debugln("Error in attempting to verify request", err) return } else if !verified { log.Debugln("Request failed verification", err) diff --git a/activitypub/persistence/followers.go b/activitypub/persistence/followers.go index 61f173575..7d9e1298b 100644 --- a/activitypub/persistence/followers.go +++ b/activitypub/persistence/followers.go @@ -24,19 +24,10 @@ func createFederationFollowersTable() { "approved_at" TIMESTAMP, "disabled_at" TIMESTAMP, "request_object" BLOB, - PRIMARY KEY (iri)); - CREATE INDEX iri_index ON ap_followers (iri); - CREATE INDEX approved_at_index ON ap_followers (approved_at);` - - stmt, err := _datastore.DB.Prepare(createTableSQL) - if err != nil { - log.Fatal(err) - } - defer stmt.Close() - _, err = stmt.Exec() - if err != nil { - log.Warnln("error executing sql creating followers table", createTableSQL, err) - } + PRIMARY KEY (iri));` + _datastore.MustExec(createTableSQL) + _datastore.MustExec(`CREATE INDEX IF NOT EXISTS idx_iri ON ap_followers (iri);`) + _datastore.MustExec(`CREATE INDEX IF NOT EXISTS idx_approved_at ON ap_followers (approved_at);`) } // GetFollowerCount will return the number of followers we're keeping track of. diff --git a/activitypub/persistence/persistence.go b/activitypub/persistence/persistence.go index 26628f846..1f631053a 100644 --- a/activitypub/persistence/persistence.go +++ b/activitypub/persistence/persistence.go @@ -202,17 +202,10 @@ func createFederatedActivitiesTable() { "actor" TEXT NOT NULL, "type" TEXT NOT NULL, "timestamp" TIMESTAMP NOT NULL - ); - CREATE INDEX iri_actor_index ON ap_accepted_activities (iri,actor);` + );` - stmt, err := _datastore.DB.Prepare(createTableSQL) - if err != nil { - log.Fatal("error creating inbox table", err) - } - defer stmt.Close() - if _, err := stmt.Exec(); err != nil { - log.Fatal("error creating inbound federated activities table", err) - } + _datastore.MustExec(createTableSQL) + _datastore.MustExec(`CREATE INDEX IF NOT EXISTS idx_iri_actor_index ON ap_accepted_activities (iri,actor);`) } func createFederationOutboxTable() { @@ -223,20 +216,12 @@ func createFederationOutboxTable() { "type" TEXT NOT NULL, "created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP, "live_notification" BOOLEAN DEFAULT FALSE, - PRIMARY KEY (iri)); - CREATE INDEX iri ON ap_outbox (iri); - CREATE INDEX type ON ap_outbox (type); - CREATE INDEX live_notification ON ap_outbox (live_notification);` + PRIMARY KEY (iri));` - stmt, err := _datastore.DB.Prepare(createTableSQL) - if err != nil { - log.Fatal(err) - } - defer stmt.Close() - _, err = stmt.Exec() - if err != nil { - log.Warnln("error executing sql creating outbox table", createTableSQL, err) - } + _datastore.MustExec(createTableSQL) + _datastore.MustExec(`CREATE INDEX IF NOT EXISTS idx_iri ON ap_outbox (iri);`) + _datastore.MustExec(`CREATE INDEX IF NOT EXISTS idx_type ON ap_outbox (type);`) + _datastore.MustExec(`CREATE INDEX IF NOT EXISTS idx_live_notification ON ap_outbox (live_notification);`) } // GetOutboxPostCount will return the number of posts in the outbox. @@ -292,12 +277,6 @@ func AddToOutbox(iri string, itemData []byte, typeString string, isLiveNotificat return tx.Commit() } -// GetObjectByID will return a string representation of a single object by the ID. -func GetObjectByID(id string) (string, error) { - value, err := _datastore.GetQueries().GetObjectFromOutboxByID(context.Background(), id) - return string(value), err -} - // GetObjectByIRI will return a string representation of a single object by the IRI. func GetObjectByIRI(iri string) (string, bool, time.Time, error) { row, err := _datastore.GetQueries().GetObjectFromOutboxByIRI(context.Background(), iri) diff --git a/auth/fediverse/fediverse.go b/auth/fediverse/fediverse.go index 8f00ee120..404af3916 100644 --- a/auth/fediverse/fediverse.go +++ b/auth/fediverse/fediverse.go @@ -19,9 +19,19 @@ type OTPRegistration struct { // to be active at a time. var pendingAuthRequests = make(map[string]OTPRegistration) +const registrationTimeout = time.Minute * 10 + // RegisterFediverseOTP will start the OTP flow for a user, creating a new // code and returning it to be sent to a destination. -func RegisterFediverseOTP(accessToken, userID, userDisplayName, account string) OTPRegistration { +func RegisterFediverseOTP(accessToken, userID, userDisplayName, account string) (OTPRegistration, bool) { + request, requestExists := pendingAuthRequests[accessToken] + + // If a request is already registered and has not expired then return that + // existing request. + if requestExists && time.Since(request.Timestamp) < registrationTimeout { + return request, false + } + code, _ := createCode() r := OTPRegistration{ Code: code, @@ -32,14 +42,14 @@ func RegisterFediverseOTP(accessToken, userID, userDisplayName, account string) } pendingAuthRequests[accessToken] = r - return r + return r, true } // ValidateFediverseOTP will verify a OTP code for a auth request. func ValidateFediverseOTP(accessToken, code string) (bool, *OTPRegistration) { request, ok := pendingAuthRequests[accessToken] - if !ok || request.Code != code || time.Since(request.Timestamp) > time.Minute*10 { + if !ok || request.Code != code || time.Since(request.Timestamp) > registrationTimeout { return false, nil } diff --git a/auth/fediverse/fediverse_test.go b/auth/fediverse/fediverse_test.go index 8c1d58f66..912736d05 100644 --- a/auth/fediverse/fediverse_test.go +++ b/auth/fediverse/fediverse_test.go @@ -10,7 +10,11 @@ const ( ) func TestOTPFlowValidation(t *testing.T) { - r := RegisterFediverseOTP(accessToken, userID, userDisplayName, account) + r, success := RegisterFediverseOTP(accessToken, userID, userDisplayName, account) + + if !success { + t.Error("Registration should be permitted.") + } if r.Code == "" { t.Error("Code is empty") @@ -41,3 +45,16 @@ func TestOTPFlowValidation(t *testing.T) { t.Error("UserDisplayName is not set correctly") } } + +func TestSingleOTPFlowRequest(t *testing.T) { + r1, _ := RegisterFediverseOTP(accessToken, userID, userDisplayName, account) + r2, s2 := RegisterFediverseOTP(accessToken, userID, userDisplayName, account) + + if r1.Code != r2.Code { + t.Error("Only one registration should be permitted.") + } + + if s2 { + t.Error("Second registration should not be permitted.") + } +} diff --git a/auth/persistence.go b/auth/persistence.go index d644d0c25..0ab28cb89 100644 --- a/auth/persistence.go +++ b/auth/persistence.go @@ -6,7 +6,6 @@ import ( "github.com/owncast/owncast/core/data" "github.com/owncast/owncast/core/user" - log "github.com/sirupsen/logrus" "github.com/owncast/owncast/db" ) @@ -24,18 +23,9 @@ func Setup(db *data.Datastore) { "type" TEXT NOT NULL, "timestamp" DATE DEFAULT CURRENT_TIMESTAMP NOT NULL, FOREIGN KEY(user_id) REFERENCES users(id) - );CREATE INDEX auth_token ON auth (token);` - - stmt, err := db.DB.Prepare(createTableSQL) - if err != nil { - log.Fatal(err) - } - defer stmt.Close() - - _, err = stmt.Exec() - if err != nil { - log.Fatalln(err) - } + );` + _datastore.MustExec(createTableSQL) + _datastore.MustExec(`CREATE INDEX IF NOT EXISTS idx_auth_token ON auth (token);`) } // AddAuth will add an external authentication token and type for a user. diff --git a/controllers/auth/fediverse/fediverse.go b/controllers/auth/fediverse/fediverse.go index e335a5a81..6192e712e 100644 --- a/controllers/auth/fediverse/fediverse.go +++ b/controllers/auth/fediverse/fediverse.go @@ -29,7 +29,12 @@ func RegisterFediverseOTPRequest(u user.User, w http.ResponseWriter, r *http.Req } accessToken := r.URL.Query().Get("accessToken") - reg := fediverseauth.RegisterFediverseOTP(accessToken, u.ID, u.DisplayName, req.FediverseAccount) + reg, success := fediverseauth.RegisterFediverseOTP(accessToken, u.ID, u.DisplayName, req.FediverseAccount) + if !success { + controllers.WriteSimpleResponse(w, false, "Could not register auth request. One may already be pending. Try again later.") + return + } + msg := fmt.Sprintf("
This is an automated message from %s. If you did not request this message please ignore or block. Your requested one-time code is:
%s
", data.GetServerName(), reg.Code) if err := activitypub.SendDirectFederatedMessage(msg, reg.Account); err != nil { controllers.WriteSimpleResponse(w, false, "Could not send code to fediverse: "+err.Error()) diff --git a/core/chat/chatclient.go b/core/chat/chatclient.go index fdcd77e38..3e02e7158 100644 --- a/core/chat/chatclient.go +++ b/core/chat/chatclient.go @@ -3,6 +3,7 @@ package chat import ( "bytes" "encoding/json" + "net/http" "sync" "time" @@ -60,6 +61,12 @@ const ( var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, + + // Override default origin check to allow all clients, even those that + // do not match our server. + CheckOrigin: func(r *http.Request) bool { + return true + }, } var ( diff --git a/core/data/data.go b/core/data/data.go index 1abd512bd..b2d71d014 100644 --- a/core/data/data.go +++ b/core/data/data.go @@ -17,7 +17,7 @@ import ( ) const ( - schemaVersion = 5 + schemaVersion = 6 ) var ( diff --git a/core/data/messages.go b/core/data/messages.go index 30516866a..cce63fb6d 100644 --- a/core/data/messages.go +++ b/core/data/messages.go @@ -13,30 +13,26 @@ import ( func CreateMessagesTable(db *sql.DB) { createTableSQL := `CREATE TABLE IF NOT EXISTS messages ( "id" string NOT NULL, - "user_id" INTEGER, + "user_id" TEXT, "body" TEXT, "eventType" TEXT, "hidden_at" DATETIME, "timestamp" DATETIME, - "title" TEXT, - "subtitle" TEXT, - "image" TEXT, - "link" TEXT, + "title" TEXT, + "subtitle" TEXT, + "image" TEXT, + "link" TEXT, PRIMARY KEY (id) - );CREATE INDEX index ON messages (id, user_id, hidden_at, timestamp); - CREATE INDEX id ON messages (id); - CREATE INDEX user_id ON messages (user_id); - CREATE INDEX hidden_at ON messages (hidden_at); - CREATE INDEX timestamp ON messages (timestamp);` + );` + MustExec(createTableSQL, db) - stmt, err := db.Prepare(createTableSQL) - if err != nil { - log.Fatal("error creating chat messages table", err) - } - defer stmt.Close() - if _, err := stmt.Exec(); err != nil { - log.Fatal("error creating chat messages table", err) - } + // Create indexes + MustExec(`CREATE INDEX IF NOT EXISTS user_id_hidden_at_timestamp ON messages (id, user_id, hidden_at, timestamp);`, db) + MustExec(`CREATE INDEX IF NOT EXISTS idx_id ON messages (id);`, db) + MustExec(`CREATE INDEX IF NOT EXISTS idx_user_id ON messages (user_id);`, db) + MustExec(`CREATE INDEX IF NOT EXISTS idx_hidden_at ON messages (hidden_at);`, db) + MustExec(`CREATE INDEX IF NOT EXISTS idx_timestamp ON messages (timestamp);`, db) + MustExec(`CREATE INDEX IF NOT EXISTS idx_messages_hidden_at_timestamp on messages(hidden_at, timestamp);`, db) } // GetMessagesCount will return the number of messages in the database. diff --git a/core/data/migrations.go b/core/data/migrations.go index 3366294cf..817010bff 100644 --- a/core/data/migrations.go +++ b/core/data/migrations.go @@ -29,6 +29,8 @@ func migrateDatabaseSchema(db *sql.DB, from, to int) error { migrateToSchema4(db) case 4: migrateToSchema5(db) + case 5: + migrateToSchema6(db) default: log.Fatalln("missing database migration step") } @@ -42,6 +44,16 @@ func migrateDatabaseSchema(db *sql.DB, from, to int) error { return nil } +func migrateToSchema6(db *sql.DB) { + // Fix chat messages table schema. Since chat is ephemeral we can drop + // the table and recreate it. + // Drop the old messages table + MustExec(`DROP TABLE messages`, db) + + // Recreate it + CreateMessagesTable(db) +} + // nolint:cyclop func migrateToSchema5(db *sql.DB) { // Create the access tokens table. diff --git a/core/data/persistence.go b/core/data/persistence.go index cd182f6e4..a765f0b72 100644 --- a/core/data/persistence.go +++ b/core/data/persistence.go @@ -118,18 +118,9 @@ func (ds *Datastore) Setup() { "key" string NOT NULL PRIMARY KEY, "value" BLOB, "timestamp" DATE DEFAULT CURRENT_TIMESTAMP NOT NULL - );CREATE INDEX IF NOT EXISTS messages_timestamp_index ON messages(timestamp);` + );` - stmt, err := ds.DB.Prepare(createTableSQL) - if err != nil { - log.Fatal(err) - } - defer stmt.Close() - - _, err = stmt.Exec() - if err != nil { - log.Fatalln(err) - } + ds.MustExec(createTableSQL) if !HasPopulatedDefaults() { PopulateDefaults() @@ -173,3 +164,16 @@ func (ds *Datastore) Reset() { func GetDatastore() *Datastore { return _datastore } + +// MustExec will execute a SQL statement on a provided database instance. +func (ds *Datastore) MustExec(s string) { + stmt, err := ds.DB.Prepare(s) + if err != nil { + log.Panic(err) + } + defer stmt.Close() + _, err = stmt.Exec() + if err != nil { + log.Warnln(err) + } +} diff --git a/core/data/users.go b/core/data/users.go index d682776ad..d03593616 100644 --- a/core/data/users.go +++ b/core/data/users.go @@ -41,20 +41,12 @@ func createUsersTable(db *sql.DB) { "type" TEXT DEFAULT 'STANDARD', "last_used" DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) - );CREATE INDEX user_id_disabled_at_index ON users (id, disabled_at); - CREATE INDEX user_id_index ON users (id); - CREATE INDEX user_id_disabled_index ON users (id, disabled_at); - CREATE INDEX user_disabled_at_index ON USERS (disabled_at);` + );` - stmt, err := db.Prepare(createTableSQL) - if err != nil { - log.Fatal(err) - } - defer stmt.Close() - _, err = stmt.Exec() - if err != nil { - log.Warnln(err) - } + MustExec(createTableSQL, db) + MustExec(`CREATE INDEX IF NOT EXISTS idx_user_id ON users (id);`, db) + MustExec(`CREATE INDEX IF NOT EXISTS idx_user_id_disabled ON users (id, disabled_at);`, db) + MustExec(`CREATE INDEX IF NOT EXISTS idx_user_disabled_at ON users (disabled_at);`, db) } // GetUsersCount will return the number of users in the database. diff --git a/core/data/utils.go b/core/data/utils.go new file mode 100644 index 000000000..bec9e09b1 --- /dev/null +++ b/core/data/utils.go @@ -0,0 +1,20 @@ +package data + +import ( + "database/sql" + + log "github.com/sirupsen/logrus" +) + +// MustExec will execute a SQL statement on a provided database instance. +func MustExec(s string, db *sql.DB) { + stmt, err := db.Prepare(s) + if err != nil { + log.Panic(err) + } + defer stmt.Close() + _, err = stmt.Exec() + if err != nil { + log.Warnln(err) + } +} diff --git a/db/query.sql b/db/query.sql index b1fce3e15..cb29c3b14 100644 --- a/db/query.sql +++ b/db/query.sql @@ -29,8 +29,6 @@ SELECT iri, inbox, name, username, image, request, request_object, created_at, a -- name: GetOutboxWithOffset :many SELECT value FROM ap_outbox LIMIT $1 OFFSET $2; --- name: GetObjectFromOutboxByID :one -SELECT value FROM ap_outbox WHERE iri = $1; -- name: GetObjectFromOutboxByIRI :one SELECT value, live_notification, created_at FROM ap_outbox WHERE iri = $1; diff --git a/db/query.sql.go b/db/query.sql.go index 19996759d..4b966b650 100644 --- a/db/query.sql.go +++ b/db/query.sql.go @@ -478,17 +478,6 @@ func (q *Queries) GetNotificationDestinationsForChannel(ctx context.Context, cha return items, nil } -const getObjectFromOutboxByID = `-- name: GetObjectFromOutboxByID :one -SELECT value FROM ap_outbox WHERE iri = $1 -` - -func (q *Queries) GetObjectFromOutboxByID(ctx context.Context, iri string) ([]byte, error) { - row := q.db.QueryRowContext(ctx, getObjectFromOutboxByID, iri) - var value []byte - err := row.Scan(&value) - return value, err -} - const getObjectFromOutboxByIRI = `-- name: GetObjectFromOutboxByIRI :one SELECT value, live_notification, created_at FROM ap_outbox WHERE iri = $1 ` diff --git a/go.mod b/go.mod index 1e22485d4..e15ac2367 100644 --- a/go.mod +++ b/go.mod @@ -4,25 +4,25 @@ go 1.17 require ( github.com/amalfra/etag v1.0.0 - github.com/aws/aws-sdk-go v1.44.28 + github.com/aws/aws-sdk-go v1.44.69 github.com/go-fed/activity v1.0.1-0.20210803212804-d866ba75dd0f github.com/go-fed/httpsig v1.1.0 github.com/go-ole/go-ole v1.2.6 // indirect github.com/gorilla/websocket v1.5.0 github.com/grafov/m3u8 v0.11.1 github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible - github.com/mattn/go-sqlite3 v1.14.13 - github.com/microcosm-cc/bluemonday v1.0.18 + github.com/mattn/go-sqlite3 v1.14.14 + github.com/microcosm-cc/bluemonday v1.0.19 github.com/mssola/user_agent v0.5.3 github.com/nareix/joy5 v0.0.0-20210317075623-2c912ca30590 github.com/oschwald/geoip2-golang v1.7.0 github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 github.com/schollz/sqlite3dump v1.3.1 - github.com/sirupsen/logrus v1.8.1 - github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125 - github.com/yuin/goldmark v1.4.12 + github.com/sirupsen/logrus v1.9.0 + github.com/teris-io/shortid v0.0.0-20220617161101-71ec9f2aa569 + github.com/yuin/goldmark v1.4.13 golang.org/x/mod v0.5.1 - golang.org/x/time v0.0.0-20220411224347-583f2d630306 + golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 mvdan.cc/xurls v1.1.0 ) @@ -35,8 +35,8 @@ require ( github.com/tklauser/numcpus v0.4.0 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 // indirect - golang.org/x/net v0.0.0-20220607020251-c690dde0001d - golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect + golang.org/x/net v0.0.0-20220802222814-0bcc04d9c69b + golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 // indirect ) require github.com/prometheus/client_golang v1.12.2 @@ -57,7 +57,7 @@ require ( require ( github.com/nakabonne/tstorage v0.3.5 - github.com/shirou/gopsutil/v3 v3.22.3 + github.com/shirou/gopsutil/v3 v3.22.7 ) require github.com/SherClockHolmes/webpush-go v1.2.0 diff --git a/go.sum b/go.sum index 303988410..9e65d542b 100644 --- a/go.sum +++ b/go.sum @@ -50,6 +50,10 @@ github.com/aws/aws-sdk-go v1.43.44 h1:t+97cY4ScE/czlNlK5iikUGi7w1fC0uop1OUalDIRT github.com/aws/aws-sdk-go v1.43.44/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.28 h1:h/OAqEqY18wq//v6h4GNPMmCkxuzSDrWuGyrvSiRqf4= github.com/aws/aws-sdk-go v1.44.28/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go v1.44.61 h1:NcpLSS3Z0MiVQIYugx4I40vSIEEAXT0baO684ExNRco= +github.com/aws/aws-sdk-go v1.44.61/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go v1.44.69 h1:3A3DEizrCK6dAbBoRGh8KmoZij7She9snclG1ixY/xQ= +github.com/aws/aws-sdk-go v1.44.69/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= 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/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -140,6 +144,7 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -197,10 +202,14 @@ github.com/mattn/go-sqlite3 v1.14.12 h1:TJ1bhYJPV44phC+IMu1u2K/i5RriLTPe+yc68XDJ github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.13 h1:1tj15ngiFfcZzii7yd82foL+ks+ouQcj8j/TPq3fk1I= github.com/mattn/go-sqlite3 v1.14.13/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.14 h1:qZgc/Rwetq+MtyE18WhzjokPD93dNqLGNT3QJuLvBGw= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/microcosm-cc/bluemonday v1.0.18 h1:6HcxvXDAi3ARt3slx6nTesbvorIc3QeTzBNRvWktHBo= github.com/microcosm-cc/bluemonday v1.0.18/go.mod h1:Z0r70sCuXHig8YpBzCc5eGHAap2K7e/u082ZUpDRRqM= +github.com/microcosm-cc/bluemonday v1.0.19 h1:OI7hoF5FY4pFz2VA//RN8TfM0YJ2dJcl4P4APrCWy6c= +github.com/microcosm-cc/bluemonday v1.0.19/go.mod h1:QNzV2UbLK2/53oIIwTOyLUSABMkjZ4tqiyC1g/DyqxE= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -261,23 +270,34 @@ github.com/schollz/sqlite3dump v1.3.1 h1:QXizJ7XEJ7hggjqjZ3YRtF3+javm8zKtzNByYtE github.com/schollz/sqlite3dump v1.3.1/go.mod h1:mzSTjZpJH4zAb1FN3iNlhWPbbdyeBpOaTW0hukyMHyI= github.com/shirou/gopsutil/v3 v3.22.3 h1:UebRzEomgMpv61e3hgD1tGooqX5trFbdU/ehphbHd00= github.com/shirou/gopsutil/v3 v3.22.3/go.mod h1:D01hZJ4pVHPpCTZ3m3T2+wDF2YAGfd+H4ifUguaQzHM= +github.com/shirou/gopsutil/v3 v3.22.6 h1:FnHOFOh+cYAM0C30P+zysPISzlknLC5Z1G4EAElznfQ= +github.com/shirou/gopsutil/v3 v3.22.6/go.mod h1:EdIubSnZhbAvBS1yJ7Xi+AShB/hxwLHOMz4MCYz7yMs= +github.com/shirou/gopsutil/v3 v3.22.7 h1:flKnuCMfUUrO+oAvwAd6GKZgnPzr098VA/UJ14nhJd4= +github.com/shirou/gopsutil/v3 v3.22.7/go.mod h1:s648gW4IywYzUfE/KjXxUsqrqx/T2xO5VqOXxONeRfI= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spf13/cobra v0.0.4-0.20190109003409-7547e83b2d85/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/pflag v1.0.4-0.20181223182923-24fa6976df40/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125 h1:3SNcvBmEPE1YlB1JpVZouslJpI3GBNoiqW7+wb0Rz7w= github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125/go.mod h1:M8agBzgqHIhgj7wEn9/0hJUZcrvt9VY+Ln+S1I5Mha0= +github.com/teris-io/shortid v0.0.0-20220617161101-71ec9f2aa569 h1:xzABM9let0HLLqFypcxvLmlvEciCHL7+Lv+4vwZqecI= +github.com/teris-io/shortid v0.0.0-20220617161101-71ec9f2aa569/go.mod h1:2Ly+NIftZN4de9zRmENdYbvPQeaVIYKWpLFStLFEBgI= github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw= github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o= @@ -289,6 +309,8 @@ github.com/yuin/goldmark v1.4.11 h1:i45YIzqLnUc2tGaTlJCyUxSG8TvgyGqhqOZOUKIjJ6w= github.com/yuin/goldmark v1.4.11/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg= github.com/yuin/goldmark v1.4.12 h1:6hffw6vALvEDqJ19dOJvJKOoAOKe4NDaTqvd2sktGN0= github.com/yuin/goldmark v1.4.12/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -380,6 +402,12 @@ golang.org/x/net v0.0.0-20220531201128-c960675eff93 h1:MYimHLfoXEpOhqd/zgoA/uoXz golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220607020251-c690dde0001d h1:4SFsTMi4UahlKoloni7L4eYzhFRifURQLw+yv0QDCx8= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220708220712-1185a9018129 h1:vucSRfWwTsoXro7P+3Cjlr6flUMtzCwzlvkxEQtHHB0= +golang.org/x/net v0.0.0-20220708220712-1185a9018129/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220802222814-0bcc04d9c69b h1:3ogNYyK4oIQdIKzTu68hQrr4iuVxF3AxKl9Aj/eDrw0= +golang.org/x/net v0.0.0-20220802222814-0bcc04d9c69b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -442,6 +470,10 @@ golang.org/x/sys v0.0.0-20220325203850-36772127a21f h1:TrmogKRsSOxRMJbLYGrB4SBbW golang.org/x/sys v0.0.0-20220325203850-36772127a21f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 h1:WIoqL4EROvwiPdUtaip4VcDdpZ4kha7wBWZrbVKCIZg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -458,6 +490,10 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220411224347-583f2d630306 h1:+gHMid33q6pen7kv9xvT+JRinntgeXO2AeZVd0AWD3w= golang.org/x/time v0.0.0-20220411224347-583f2d630306/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220609170525-579cf78fd858 h1:Dpdu/EMxGMFgq0CeYMh4fazTD2vtlZRYE7wyynxJb9U= +golang.org/x/time v0.0.0-20220609170525-579cf78fd858/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 h1:ftMN5LMiBFjbzleLqtoBZk7KdJwhuybIU+FckUHgoyQ= +golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -594,6 +630,7 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 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/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/notifications/persistence.go b/notifications/persistence.go index 283e4e551..bc6cecec1 100644 --- a/notifications/persistence.go +++ b/notifications/persistence.go @@ -17,18 +17,10 @@ func createNotificationsTable(db *sql.DB) { "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "channel" TEXT NOT NULL, "destination" TEXT NOT NULL, - "created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP); - CREATE INDEX channel_index ON notifications (channel);` + "created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP);` - stmt, err := db.Prepare(createTableSQL) - if err != nil { - log.Fatal(err) - } - defer stmt.Close() - _, err = stmt.Exec() - if err != nil { - log.Warnln("error executing sql creating followers table", createTableSQL, err) - } + data.MustExec(createTableSQL, db) + data.MustExec(`CREATE INDEX IF NOT EXISTS idx_channel ON notifications (channel);`, db) } // AddNotification saves a new user notification destination. diff --git a/sqlc.json b/sqlc.json deleted file mode 100644 index 780a5b3cf..000000000 --- a/sqlc.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "version": "1", - "packages": [{ - "schema": "db/schema.sql", - "queries": "db/query.sql", - "name": "db", - "path": "db" - }] - } \ No newline at end of file diff --git a/sqlc.yaml b/sqlc.yaml new file mode 100644 index 000000000..a4964736b --- /dev/null +++ b/sqlc.yaml @@ -0,0 +1,6 @@ +version: 1 +packages: + - path: db + name: db + schema: 'db/schema.sql' + queries: 'db/query.sql' diff --git a/static/admin/_next/static/IF0q45tHTUnbAhOX9pFCQ/_middlewareManifest.js b/static/admin/_next/static/IF0q45tHTUnbAhOX9pFCQ/_middlewareManifest.js new file mode 100644 index 000000000..a17fc8bf9 --- /dev/null +++ b/static/admin/_next/static/IF0q45tHTUnbAhOX9pFCQ/_middlewareManifest.js @@ -0,0 +1 @@ +self.__MIDDLEWARE_MANIFEST=[];self.__MIDDLEWARE_MANIFEST_CB&&self.__MIDDLEWARE_MANIFEST_CB() \ No newline at end of file diff --git a/static/admin/_next/static/IF0q45tHTUnbAhOX9pFCQ/_ssgManifest.js b/static/admin/_next/static/IF0q45tHTUnbAhOX9pFCQ/_ssgManifest.js new file mode 100644 index 000000000..0511aa895 --- /dev/null +++ b/static/admin/_next/static/IF0q45tHTUnbAhOX9pFCQ/_ssgManifest.js @@ -0,0 +1 @@ +self.__SSG_MANIFEST=new Set,self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB(); \ No newline at end of file diff --git a/test/automated/api/run.sh b/test/automated/api/run.sh index b2a3a1cda..fde189604 100755 --- a/test/automated/api/run.sh +++ b/test/automated/api/run.sh @@ -18,7 +18,7 @@ fi pushd ../../.. > /dev/null # Build and run owncast from source -go build -o owncast main.go +go build -race -o owncast main.go ./owncast -database $TEMP_DB & SERVER_PID=$!