diff --git a/Makefile b/Makefile index e310918..c69f2b7 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,10 @@ VERSION := $(shell git describe --always --dirty=-dev) BUILD := $(shell date --iso-8601=seconds --utc) GOFILES = $(shell find . -type f -name '*.go') -STATICFILES = $(shell find boardvoting/static/ -type f) -TEMPLATES = $(shell find boardvoting/templates/ -type f) -DBMIGRATIONS = $(shell find boardvoting/migrations/ -type f) all: cacert-boardvoting -boardvoting/assets.go: $(DBMIGRATIONS) $(STATICFILES) $(TEMPLATES) $(DBMIGRATIONS) boardvoting/main.go - go generate -v ./boardvoting - -cacert-boardvoting: ${GOFILES} boardvoting/assets.go +cacert-boardvoting: ${GOFILES} go build -o $@ -x -ldflags " -X 'main.version=${VERSION}' -X 'main.build=${BUILD}'" clean: diff --git a/boardvoting.go b/boardvoting.go index f1d9933..d452636 100644 --- a/boardvoting.go +++ b/boardvoting.go @@ -23,6 +23,7 @@ import ( "crypto/tls" "crypto/x509" "database/sql" + "embed" "encoding/base64" "encoding/pem" "flag" @@ -36,14 +37,14 @@ import ( "strings" "time" - "github.com/Masterminds/sprig" + "github.com/Masterminds/sprig/v3" "github.com/gorilla/csrf" "github.com/gorilla/sessions" _ "github.com/mattn/go-sqlite3" log "github.com/sirupsen/logrus" + "github.com/vearutop/statigz" + "github.com/vearutop/statigz/brotli" "gopkg.in/yaml.v2" - - "git.cacert.org/cacert-boardvoting/boardvoting" ) var configFile string @@ -63,6 +64,9 @@ const ( sessionCookieName = "votesession" ) +//go:embed boardvoting/templates +var fsTemplates embed.FS + func renderTemplate(w http.ResponseWriter, r *http.Request, templates []string, context interface{}) { funcMaps := sprig.FuncMap() funcMaps["nl2br"] = func(text string) template.HTML { @@ -81,7 +85,7 @@ func renderTemplate(w http.ResponseWriter, r *http.Request, templates []string, assetBytes []byte ) - if assetBytes, err = boardvoting.Asset(fmt.Sprintf("templates/%s", t)); err != nil { + if assetBytes, err = fsTemplates.ReadFile(fmt.Sprintf("boardvoting/templates/%s", t)); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return @@ -122,6 +126,11 @@ func authenticateRequest(w http.ResponseWriter, r *http.Request, handler func(ht continue } + log.Infof( + "got a client certificate for the following email addresses: %s", + strings.Join(cert.EmailAddresses, ", "), + ) + for _, emailAddress := range cert.EmailAddresses { emailLower := strings.ToLower(emailAddress) emailsTried[emailLower] = true @@ -136,6 +145,9 @@ func authenticateRequest(w http.ResponseWriter, r *http.Request, handler func(ht if voter != nil { requestContext := context.WithValue(r.Context(), ctxVoter, voter) requestContext = context.WithValue(requestContext, ctxAuthenticatedCert, cert) + + log.Infof("authenticated as %s", voter.Name) + handler(w, r.WithContext(requestContext)) return @@ -920,6 +932,7 @@ func readConfig() { } store = sessions.NewCookieStore(cookieSecret) + store.Options.Secure = true log.Info("Read configuration") } @@ -965,12 +978,15 @@ func setupJobs(ctx context.Context) { }() } +//go:embed boardvoting/static +var staticAssets embed.FS + func setupHandlers() { http.Handle("/motions/", http.StripPrefix("/motions/", motionsHandler{})) http.Handle("/newmotion/", motionsHandler{}) http.Handle("/proxy/", &decisionVoteHandler{}) http.Handle("/vote/", &decisionVoteHandler{}) - http.Handle("/static/", http.FileServer(boardvoting.GetAssetFS())) + http.Handle("/boardvoting/static/", statigz.FileServer(staticAssets, brotli.AddEncoding, statigz.EncodeOnInit)) http.Handle("/", http.RedirectHandler("/motions/", http.StatusMovedPermanently)) } diff --git a/boardvoting/main.go b/boardvoting/main.go deleted file mode 100644 index 0997faa..0000000 --- a/boardvoting/main.go +++ /dev/null @@ -1,182 +0,0 @@ -/* -Copyright 2017-2021 Jan Dittberner - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this program except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Assets for the CAcert board voting software. -package boardvoting - -//go:generate go-bindata -pkg $GOPACKAGE -o assets.go ./migrations/... ./static/... ./templates/... - -import ( - "bytes" - "errors" - "io" - "io/ioutil" - "net/http" - "os" - "path/filepath" - "strings" - "time" -) - -const defaultFileMode = 0400 - -var defaultFileTimestamp = time.Now() - -// Simulated asset file system. -type AssetFS struct { - Asset func(path string) ([]byte, error) - AssetDir func(path string) ([]string, error) - AssetInfo func(path string) (os.FileInfo, error) -} - -type FakeFile struct { - Path string - Dir bool - Len int64 - Timestamp time.Time -} - -func (f *FakeFile) Name() string { - _, name := filepath.Split(f.Path) - - return name -} - -func (f *FakeFile) Size() int64 { return f.Len } - -func (f *FakeFile) Mode() os.FileMode { - mode := os.FileMode(defaultFileMode) - - if f.Dir { - return mode | os.ModeDir - } - - return mode -} - -func (f *FakeFile) ModTime() time.Time { return f.Timestamp } -func (f *FakeFile) IsDir() bool { return f.Dir } -func (f *FakeFile) Sys() interface{} { return nil } - -type AssetFile struct { - *bytes.Reader - io.Closer - FakeFile -} - -func NewAssetFile(name string, content []byte, timestamp time.Time) *AssetFile { - if timestamp.IsZero() { - timestamp = defaultFileTimestamp - } - - return &AssetFile{ - bytes.NewReader(content), - ioutil.NopCloser(nil), - FakeFile{name, false, int64(len(content)), timestamp}, - } -} - -func (f *AssetFile) Readdir(int) ([]os.FileInfo, error) { - return nil, errors.New("not a directory") -} - -func (f *AssetFile) Size() int64 { - return f.FakeFile.Size() -} - -func (f *AssetFile) Stat() (os.FileInfo, error) { - return f, nil -} - -type AssetDirectory struct { - AssetFile - ChildrenRead int - Children []os.FileInfo -} - -func (f *AssetDirectory) Readdir(count int) ([]os.FileInfo, error) { - if count <= 0 { - return f.Children, nil - } - - if f.ChildrenRead+count > len(f.Children) { - count = len(f.Children) - f.ChildrenRead - } - - rv := f.Children[f.ChildrenRead : f.ChildrenRead+count] - f.ChildrenRead += count - - return rv, nil -} - -// Simulate os.Stat for a simulated asset directory. -func (f *AssetDirectory) Stat() (os.FileInfo, error) { - return f, nil -} - -// Return a new asset directory. -func NewAssetDirectory(name string, children []string, fs *AssetFS) *AssetDirectory { - fileInfos := make([]os.FileInfo, 0, len(children)) - - for _, child := range children { - _, err := fs.AssetDir(filepath.Join(name, child)) - fileInfos = append(fileInfos, &FakeFile{child, err == nil, 0, time.Time{}}) - } - - return &AssetDirectory{ - AssetFile{ - bytes.NewReader(nil), - ioutil.NopCloser(nil), - FakeFile{name, true, 0, time.Time{}}, - }, - 0, - fileInfos} -} - -// Open named simulated file. -func (f *AssetFS) Open(name string) (http.File, error) { - if len(name) > 0 && name[0] == '/' { - name = name[1:] - } - - if b, err := f.Asset(name); err == nil { - timestamp := defaultFileTimestamp - - if f.AssetInfo != nil { - if info, err := f.AssetInfo(name); err == nil { - timestamp = info.ModTime() - } - } - - return NewAssetFile(name, b, timestamp), nil - } - - children, err := f.AssetDir(name) - if err == nil { - return NewAssetDirectory(name, children, f), nil - } - - if strings.Contains(err.Error(), "not found") { - return nil, os.ErrNotExist - } - - return nil, err -} - -// Get the simulated asset filesystem initialized with generated values. -func GetAssetFS() *AssetFS { - return &AssetFS{Asset: Asset, AssetDir: AssetDir, AssetInfo: AssetInfo} -} diff --git a/boardvoting/migrations/2017042101_0.1.0_original.down.sql b/boardvoting/migrations/2017042101_0.1.0_original.down.sql new file mode 100644 index 0000000..932ea00 --- /dev/null +++ b/boardvoting/migrations/2017042101_0.1.0_original.down.sql @@ -0,0 +1,5 @@ +-- SQL section 'Down' is executed when this migration is rolled back +DROP TABLE votes; +DROP TABLE decisions; +DROP TABLE emails; +DROP TABLE voters; diff --git a/boardvoting/migrations/2017042101_0.1.0_original.up.sql b/boardvoting/migrations/2017042101_0.1.0_original.up.sql new file mode 100644 index 0000000..a89a859 --- /dev/null +++ b/boardvoting/migrations/2017042101_0.1.0_original.up.sql @@ -0,0 +1,5 @@ +-- SQL in section 'Up' is executed when this migration is applied +CREATE TABLE IF NOT EXISTS votes (decision INT4, voter INT4, vote INT4, voted DATETIME, notes text default ''); +CREATE TABLE IF NOT EXISTS emails (voter INT4, address VARCHAR(255)); +CREATE TABLE IF NOT EXISTS voters (id INTEGER PRIMARY KEY, name VARCHAR(255), enabled INTEGER default 0, reminder VARCHAR(255)); +CREATE TABLE IF NOT EXISTS decisions (id INTEGER PRIMARY KEY, proposed DATETIME, proponent INTEGER, title VARCHAR(255), content TEXT, quorum INTEGER, majority INTEGER, status INTEGER, due DATETIME, modified DATETIME, tag varchar(255), votetype INT4 DEFAULT 0 NOT NULL); diff --git a/boardvoting/migrations/2017042102_fix_duplicates.down.sql b/boardvoting/migrations/2017042102_fix_duplicates.down.sql new file mode 100644 index 0000000..a225136 --- /dev/null +++ b/boardvoting/migrations/2017042102_fix_duplicates.down.sql @@ -0,0 +1,3 @@ +-- SQL section 'Down' is executed when this migration is rolled back + +-- There is no useful backward migration \ No newline at end of file diff --git a/boardvoting/migrations/2017042102_fix_duplicates.up.sql b/boardvoting/migrations/2017042102_fix_duplicates.up.sql new file mode 100644 index 0000000..ac28a2b --- /dev/null +++ b/boardvoting/migrations/2017042102_fix_duplicates.up.sql @@ -0,0 +1 @@ +-- SQL in section 'Up' is executed when this migration is applied -- Peter Yuill has a duplicate entry in the voters table he has ids 17 and 31 UPDATE votes SET voter=17 WHERE voter=31; UPDATE decisions SET proponent=17 WHERE proponent=31; DELETE FROM emails WHERE voter=31; DELETE FROM voters WHERE id=31; \ No newline at end of file diff --git a/boardvoting/migrations/2017042103_add_constraints.down.sql b/boardvoting/migrations/2017042103_add_constraints.down.sql new file mode 100644 index 0000000..dd5d71f --- /dev/null +++ b/boardvoting/migrations/2017042103_add_constraints.down.sql @@ -0,0 +1,83 @@ +-- SQL section 'Down' is executed when this migration is rolled back + +CREATE TABLE votes_orig ( + decision INT4, + voter INT4, + vote INT4, + voted DATETIME, + notes TEXT DEFAULT '' +); +INSERT INTO votes_orig (decision, voter, vote, voted, notes) + SELECT + decision, + voter, + vote, + voted, + notes + FROM votes; +DROP TABLE votes; +ALTER TABLE votes_orig + RENAME TO votes; + +CREATE TABLE decisions_orig ( + id INTEGER PRIMARY KEY, + proposed DATETIME, + proponent INTEGER, + title VARCHAR(255), + content TEXT, + quorum INTEGER, + majority INTEGER, + status INTEGER, + due DATETIME, + modified DATETIME, + tag VARCHAR(255), + votetype INT4 DEFAULT 0 NOT NULL +); +INSERT INTO decisions_orig (id, proposed, proponent, title, content, status, due, modified, tag, votetype) + SELECT + id, + proposed, + proponent, + title, + content, + status, + due, + modified, + tag, + votetype + FROM + decisions; +DROP INDEX decisions_proposed_idx; +DROP TABLE decisions; +ALTER TABLE decisions_orig + RENAME TO decisions; + +CREATE TABLE emails_orig ( + voter INT4, + address VARCHAR(255) +); +INSERT INTO emails_orig (voter, address) + SELECT + voter, + address + FROM emails; +DROP TABLE emails; +ALTER TABLE emails_orig + RENAME TO emails; + +CREATE TABLE voters_orig ( + id INTEGER PRIMARY KEY, + name VARCHAR(255), + enabled INTEGER DEFAULT 0, + reminder VARCHAR(255) +); +INSERT INTO voters_orig (id, name, enabled, reminder) + SELECT + id, + name, + enabled, + reminder + FROM voters; +DROP TABLE voters; +ALTER TABLE voters_orig + RENAME TO voters; \ No newline at end of file diff --git a/boardvoting/migrations/2017042103_add_constraints.up.sql b/boardvoting/migrations/2017042103_add_constraints.up.sql new file mode 100644 index 0000000..fc112d5 --- /dev/null +++ b/boardvoting/migrations/2017042103_add_constraints.up.sql @@ -0,0 +1,83 @@ +-- SQL in section 'Up' is executed when this migration is applied +CREATE TABLE voters_new ( + id INTEGER PRIMARY KEY, + name VARCHAR(255) NOT NULL, + enabled BOOLEAN NOT NULL, + reminder VARCHAR(255) +); +INSERT INTO voters_new (id, name, enabled, reminder) + SELECT + id, + name, + enabled, + reminder + FROM voters; +DROP TABLE voters; +ALTER TABLE voters_new + RENAME TO voters; + +CREATE TABLE emails_new ( + voter INTEGER NOT NULL REFERENCES voters (id), + address VARCHAR(255) UNIQUE NOT NULL +); +INSERT INTO emails_new (voter, address) + SELECT + voter, + address + FROM emails; +DROP TABLE emails; +ALTER TABLE emails_new + RENAME TO emails; + +CREATE TABLE decisions_new ( + id INTEGER PRIMARY KEY, + proposed DATETIME NOT NULL, + proponent INTEGER NOT NULL REFERENCES voters (id), + title VARCHAR(255) NOT NULL, + content TEXT NOT NULL, + status INTEGER NOT NULL CHECK (status IN (-2, -1, 0, 1)), + due DATETIME NOT NULL, + modified DATETIME NOT NULL, + tag VARCHAR(255) UNIQUE NOT NULL, + votetype INTEGER DEFAULT 0 NOT NULL CHECK (votetype IN (0, 1)) +); +INSERT INTO decisions_new ( + id, proposed, proponent, title, content, status, due, modified, tag, votetype +) + SELECT + id, + proposed, + proponent, + title, + content, + status, + due, + modified, + tag, + votetype + FROM decisions; +DROP TABLE decisions; +ALTER TABLE decisions_new + RENAME TO decisions; +CREATE INDEX decisions_proposed_idx + ON decisions (proposed); + +CREATE TABLE votes_new ( + decision INTEGER REFERENCES decisions (id), + voter INTEGER REFERENCES voters (id), + vote INTEGER NOT NULL CHECK (vote IN (-1, 0, 1)), + voted DATETIME NOT NULL, + notes TEXT NOT NULL DEFAULT '', + PRIMARY KEY (decision, voter) +); +INSERT INTO votes_new (decision, voter, vote, voted, notes) + SELECT + decision, + voter, + vote, + voted, + notes + FROM votes; +DROP TABLE votes; +ALTER TABLE votes_new + RENAME TO votes; diff --git a/boardvoting/migrations/20170421134856_0.1.0_original.sql b/boardvoting/migrations/20170421134856_0.1.0_original.sql deleted file mode 100644 index 5fa3800..0000000 --- a/boardvoting/migrations/20170421134856_0.1.0_original.sql +++ /dev/null @@ -1,30 +0,0 @@ -/* - Copyright 2017-2019 Jan Dittberner - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this program except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - --- +migrate Up --- SQL in section 'Up' is executed when this migration is applied -CREATE TABLE IF NOT EXISTS votes (decision INT4, voter INT4, vote INT4, voted DATETIME, notes text default ''); -CREATE TABLE IF NOT EXISTS emails (voter INT4, address VARCHAR(255)); -CREATE TABLE IF NOT EXISTS voters (id INTEGER PRIMARY KEY, name VARCHAR(255), enabled INTEGER default 0, reminder VARCHAR(255)); -CREATE TABLE IF NOT EXISTS decisions (id INTEGER PRIMARY KEY, proposed DATETIME, proponent INTEGER, title VARCHAR(255), content TEXT, quorum INTEGER, majority INTEGER, status INTEGER, due DATETIME, modified DATETIME, tag varchar(255), votetype INT4 DEFAULT 0 NOT NULL); - - --- +migrate Down --- SQL section 'Down' is executed when this migration is rolled back -DROP TABLE votes; -DROP TABLE decisions; -DROP TABLE emails; -DROP TABLE voters; diff --git a/boardvoting/migrations/20170421143052_fix_duplicates.sql b/boardvoting/migrations/20170421143052_fix_duplicates.sql deleted file mode 100644 index bb207a3..0000000 --- a/boardvoting/migrations/20170421143052_fix_duplicates.sql +++ /dev/null @@ -1,30 +0,0 @@ -/* - Copyright 2017-2019 Jan Dittberner - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this program except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - --- +migrate Up --- SQL in section 'Up' is executed when this migration is applied - --- Peter Yuill has a duplicate entry in the voters table he has ids 17 and 31 - -UPDATE votes SET voter=17 WHERE voter=31; -UPDATE decisions SET proponent=17 WHERE proponent=31; -DELETE FROM emails WHERE voter=31; -DELETE FROM voters WHERE id=31; - --- +migrate Down --- SQL section 'Down' is executed when this migration is rolled back - --- There is no useful backward migration \ No newline at end of file diff --git a/boardvoting/migrations/20170421143114_add_constraints.sql b/boardvoting/migrations/20170421143114_add_constraints.sql deleted file mode 100644 index 6f7e823..0000000 --- a/boardvoting/migrations/20170421143114_add_constraints.sql +++ /dev/null @@ -1,185 +0,0 @@ -/* - Copyright 2017-2019 Jan Dittberner - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this program except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - --- +migrate Up --- SQL in section 'Up' is executed when this migration is applied -CREATE TABLE voters_new ( - id INTEGER PRIMARY KEY, - name VARCHAR(255) NOT NULL, - enabled BOOLEAN NOT NULL, - reminder VARCHAR(255) -); -INSERT INTO voters_new (id, name, enabled, reminder) - SELECT - id, - name, - enabled, - reminder - FROM voters; -DROP TABLE voters; -ALTER TABLE voters_new - RENAME TO voters; - -CREATE TABLE emails_new ( - voter INTEGER NOT NULL REFERENCES voters (id), - address VARCHAR(255) UNIQUE NOT NULL -); -INSERT INTO emails_new (voter, address) - SELECT - voter, - address - FROM emails; -DROP TABLE emails; -ALTER TABLE emails_new - RENAME TO emails; - -CREATE TABLE decisions_new ( - id INTEGER PRIMARY KEY, - proposed DATETIME NOT NULL, - proponent INTEGER NOT NULL REFERENCES voters (id), - title VARCHAR(255) NOT NULL, - content TEXT NOT NULL, - status INTEGER NOT NULL CHECK (status IN (-2, -1, 0, 1)), - due DATETIME NOT NULL, - modified DATETIME NOT NULL, - tag VARCHAR(255) UNIQUE NOT NULL, - votetype INTEGER DEFAULT 0 NOT NULL CHECK (votetype IN (0, 1)) -); -INSERT INTO decisions_new ( - id, proposed, proponent, title, content, status, due, modified, tag, votetype -) - SELECT - id, - proposed, - proponent, - title, - content, - status, - due, - modified, - tag, - votetype - FROM decisions; -DROP TABLE decisions; -ALTER TABLE decisions_new - RENAME TO decisions; -CREATE INDEX decisions_proposed_idx - ON decisions (proposed); - -CREATE TABLE votes_new ( - decision INTEGER REFERENCES decisions (id), - voter INTEGER REFERENCES voters (id), - vote INTEGER NOT NULL CHECK (vote IN (-1, 0, 1)), - voted DATETIME NOT NULL, - notes TEXT NOT NULL DEFAULT '', - PRIMARY KEY (decision, voter) -); -INSERT INTO votes_new (decision, voter, vote, voted, notes) - SELECT - decision, - voter, - vote, - voted, - notes - FROM votes; -DROP TABLE votes; -ALTER TABLE votes_new - RENAME TO votes; - --- +goose Down --- SQL section 'Down' is executed when this migration is rolled back - -CREATE TABLE votes_orig ( - decision INT4, - voter INT4, - vote INT4, - voted DATETIME, - notes TEXT DEFAULT '' -); -INSERT INTO votes_orig (decision, voter, vote, voted, notes) - SELECT - decision, - voter, - vote, - voted, - notes - FROM votes; -DROP TABLE votes; -ALTER TABLE votes_orig - RENAME TO votes; - -CREATE TABLE decisions_orig ( - id INTEGER PRIMARY KEY, - proposed DATETIME, - proponent INTEGER, - title VARCHAR(255), - content TEXT, - quorum INTEGER, - majority INTEGER, - status INTEGER, - due DATETIME, - modified DATETIME, - tag VARCHAR(255), - votetype INT4 DEFAULT 0 NOT NULL -); -INSERT INTO decisions_orig (id, proposed, proponent, title, content, status, due, modified, tag, votetype) - SELECT - id, - proposed, - proponent, - title, - content, - status, - due, - modified, - tag, - votetype - FROM - decisions; -DROP INDEX decisions_proposed_idx; -DROP TABLE decisions; -ALTER TABLE decisions_orig - RENAME TO decisions; - -CREATE TABLE emails_orig ( - voter INT4, - address VARCHAR(255) -); -INSERT INTO emails_orig (voter, address) - SELECT - voter, - address - FROM emails; -DROP TABLE emails; -ALTER TABLE emails_orig - RENAME TO emails; - -CREATE TABLE voters_orig ( - id INTEGER PRIMARY KEY, - name VARCHAR(255), - enabled INTEGER DEFAULT 0, - reminder VARCHAR(255) -); -INSERT INTO voters_orig (id, name, enabled, reminder) - SELECT - id, - name, - enabled, - reminder - FROM voters; -DROP TABLE voters; -ALTER TABLE voters_orig - RENAME TO voters; \ No newline at end of file diff --git a/boardvoting/migrations/2020041401_add_roles_table.down.sql b/boardvoting/migrations/2020041401_add_roles_table.down.sql new file mode 100644 index 0000000..ac8203f --- /dev/null +++ b/boardvoting/migrations/2020041401_add_roles_table.down.sql @@ -0,0 +1,2 @@ +-- SQL section 'Down' is executed when this migration is rolled back +DROP TABLE user_roles; \ No newline at end of file diff --git a/boardvoting/migrations/2020041401_add_roles_table.up.sql b/boardvoting/migrations/2020041401_add_roles_table.up.sql new file mode 100644 index 0000000..628ced1 --- /dev/null +++ b/boardvoting/migrations/2020041401_add_roles_table.up.sql @@ -0,0 +1,13 @@ +-- SQL in section 'Up' is executed when this migration is applied +CREATE TABLE user_roles +( + id INTEGER PRIMARY KEY AUTOINCREMENT, + voter_id VARCHAR(255) NOT NULL REFERENCES voters (id), + role VARCHAR(8) NOT NULL, + created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE (voter_id, role) +); +INSERT INTO user_roles (voter_id, role) +SELECT id, 'VOTER' +FROM voters +WHERE enabled = true; diff --git a/boardvoting/migrations/20200414225500_add_roles_table.sql b/boardvoting/migrations/20200414225500_add_roles_table.sql deleted file mode 100644 index c36b66c..0000000 --- a/boardvoting/migrations/20200414225500_add_roles_table.sql +++ /dev/null @@ -1,34 +0,0 @@ -/* - Copyright 2020 Jan Dittberner - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this program except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - --- +migrate Up --- SQL in section 'Up' is executed when this migration is applied -CREATE TABLE user_roles -( - id INTEGER PRIMARY KEY AUTOINCREMENT, - voter_id VARCHAR(255) NOT NULL REFERENCES voters (id), - role VARCHAR(8) NOT NULL, - created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - UNIQUE (voter_id, role) -); -INSERT INTO user_roles (voter_id, role) -SELECT id, 'VOTER' -FROM voters -WHERE enabled = true; - --- +migrate Down --- SQL section 'Down' is executed when this migration is rolled back -DROP TABLE user_roles; \ No newline at end of file diff --git a/boardvoting/migrations/2021022801_remove_old_migration_tables.down.sql b/boardvoting/migrations/2021022801_remove_old_migration_tables.down.sql new file mode 100644 index 0000000..0a0b6f2 --- /dev/null +++ b/boardvoting/migrations/2021022801_remove_old_migration_tables.down.sql @@ -0,0 +1 @@ +-- no useful backward migration \ No newline at end of file diff --git a/boardvoting/migrations/2021022801_remove_old_migration_tables.up.sql b/boardvoting/migrations/2021022801_remove_old_migration_tables.up.sql new file mode 100644 index 0000000..e8921d2 --- /dev/null +++ b/boardvoting/migrations/2021022801_remove_old_migration_tables.up.sql @@ -0,0 +1,2 @@ +-- remove tables of other migration systems +DROP TABLE IF EXISTS gorp_migrations; \ No newline at end of file diff --git a/boardvoting/templates/header.html b/boardvoting/templates/header.html index acf8d18..efd447c 100644 --- a/boardvoting/templates/header.html +++ b/boardvoting/templates/header.html @@ -4,16 +4,16 @@