aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormattn <mattn.jp@gmail.com>2018-06-13 10:15:40 +0900
committerGitHub <noreply@github.com>2018-06-13 10:15:40 +0900
commit1013924b6663dc068e1b9d3313299dcf829811ca (patch)
tree027631e7683b5ba57dfaa044ba7826acf29e5308
parentMerge pull request #596 from mattn/fix/travis (diff)
parentAdd Tests for Crypt Encoders (diff)
downloadgolite-1013924b6663dc068e1b9d3313299dcf829811ca.tar.gz
golite-1013924b6663dc068e1b9d3313299dcf829811ca.tar.xz
Merge pull request #592 from GJRTimmer/fix/test/coverage
fix/test/coverage
-rw-r--r--sqlite3.goconvey8
-rw-r--r--sqlite3_func_crypt_test.go57
-rw-r--r--sqlite3_go18_test.go1
-rw-r--r--sqlite3_opt_userauth_test.go1779
-rw-r--r--upgrade/profile.goconvey2
5 files changed, 565 insertions, 1282 deletions
diff --git a/sqlite3.goconvey b/sqlite3.goconvey
deleted file mode 100644
index 295b895..0000000
--- a/sqlite3.goconvey
+++ /dev/null
@@ -1,8 +0,0 @@
-// GoConvey Test Profile
-
-// Activate Coverage
--cover
-
--tags=sqlite_userauth
-
-// EOF \ No newline at end of file
diff --git a/sqlite3_func_crypt_test.go b/sqlite3_func_crypt_test.go
new file mode 100644
index 0000000..0329ca8
--- /dev/null
+++ b/sqlite3_func_crypt_test.go
@@ -0,0 +1,57 @@
+// Copyright (C) 2018 G.J.R. Timmer <gjr.timmer@gmail.com>.
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file.
+
+package sqlite3
+
+import (
+ "fmt"
+ "strings"
+ "testing"
+)
+
+// TestCryptEncoders to increase coverage
+func TestCryptEncoders(t *testing.T) {
+ tests := []struct {
+ enc string
+ salt string
+ expected string
+ }{
+ {"sha1", "", "d033e22ae348aeb5660fc2140aec35850c4da997"},
+ {"sha256", "", "8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918"},
+ {"sha384", "", "9ca694a90285c034432c9550421b7b9dbd5c0f4b6673f05f6dbce58052ba20e4248041956ee8c9a2ec9f10290cdc0782"},
+ {"sha512", "", "c7ad44cbad762a5da0a452f9e854fdc1e0e7a52a38015f23f3eab1d80b931dd472634dfac71cd34ebc35d16ab7fb8a90c81f975113d6c7538dc69dd8de9077ec"},
+ {"ssha1", "salt", "9bc7aa55f08fdad935c3f8362d3f48bcf70eb280"},
+ {"ssha256", "salt", "f9a81477552594c79f2abc3fc099daa896a6e3a3590a55ffa392b6000412e80b"},
+ {"ssha384", "salt", "9ed776b477fcfc1b5e584989e8d770f5e17d98a7643546a63c2b07d4ab00f1348f6b8e73103d3a23554f727136e8c215"},
+ {"ssha512", "salt", "3c4a79782143337be4492be072abcfe979dd703c00541a8c39a0f3df4bab2029c050cf46fddc47090b5b04ac537b3e78189e3de16e601e859f95c51ac9f6dafb"},
+ }
+
+ for _, e := range tests {
+ var fn func(pass []byte, hash interface{}) []byte
+ switch e.enc {
+ case "sha1":
+ fn = CryptEncoderSHA1
+ case "ssha1":
+ fn = CryptEncoderSSHA1(e.salt)
+ case "sha256":
+ fn = CryptEncoderSHA256
+ case "ssha256":
+ fn = CryptEncoderSSHA256(e.salt)
+ case "sha384":
+ fn = CryptEncoderSHA384
+ case "ssha384":
+ fn = CryptEncoderSSHA384(e.salt)
+ case "sha512":
+ fn = CryptEncoderSHA512
+ case "ssha512":
+ fn = CryptEncoderSSHA512(e.salt)
+ }
+
+ h := fn([]byte("admin"), nil)
+ if strings.Compare(fmt.Sprintf("%x", h), e.expected) != 0 {
+ t.Fatalf("Invalid %s hash: expected: %s; got: %x", strings.ToUpper(e.enc), e.expected, h)
+ }
+ }
+}
diff --git a/sqlite3_go18_test.go b/sqlite3_go18_test.go
index 44fc4df..741ed90 100644
--- a/sqlite3_go18_test.go
+++ b/sqlite3_go18_test.go
@@ -80,7 +80,6 @@ func randStringBytes(n int) string {
}
func initDatabase(t *testing.T, db *sql.DB, rowCount int64) {
- t.Logf("Executing db initializing statements")
for _, query := range testTableStatements {
_, err := db.Exec(query)
if err != nil {
diff --git a/sqlite3_opt_userauth_test.go b/sqlite3_opt_userauth_test.go
index 1a29575..b4ac4a9 100644
--- a/sqlite3_opt_userauth_test.go
+++ b/sqlite3_opt_userauth_test.go
@@ -12,19 +12,20 @@ import (
"fmt"
"os"
"testing"
-
- . "github.com/smartystreets/goconvey/convey"
)
var (
- conn *SQLiteConn
- connect func(t *testing.T, f string, username, password string) (file string, db *sql.DB, c *SQLiteConn, err error)
- authEnabled func(db *sql.DB) (exists bool, err error)
- addUser func(db *sql.DB, username, password string, admin int) (rv int, err error)
- userExists func(db *sql.DB, username string) (rv int, err error)
- isAdmin func(db *sql.DB, username string) (rv bool, err error)
- modifyUser func(db *sql.DB, username, password string, admin int) (rv int, err error)
- deleteUser func(db *sql.DB, username string) (rv int, err error)
+ conn *SQLiteConn
+ create func(t *testing.T, username, password string) (file string, err error)
+ createWithCrypt func(t *testing.T, username, password, crypt, salt string) (file string, err error)
+ connect func(t *testing.T, f string, username, password string) (file string, db *sql.DB, c *SQLiteConn, err error)
+ connectWithCrypt func(t *testing.T, f string, username, password string, crypt string, salt string) (file string, db *sql.DB, c *SQLiteConn, err error)
+ authEnabled func(db *sql.DB) (exists bool, err error)
+ addUser func(db *sql.DB, username, password string, admin int) (rv int, err error)
+ userExists func(db *sql.DB, username string) (rv int, err error)
+ isAdmin func(db *sql.DB, username string) (rv bool, err error)
+ modifyUser func(db *sql.DB, username, password string, admin int) (rv int, err error)
+ deleteUser func(db *sql.DB, username string) (rv int, err error)
)
func init() {
@@ -37,6 +38,20 @@ func init() {
},
})
+ create = func(t *testing.T, username, password string) (file string, err error) {
+ var db *sql.DB
+ file, db, _, err = connect(t, "", username, password)
+ db.Close()
+ return
+ }
+
+ createWithCrypt = func(t *testing.T, username, password, crypt, salt string) (file string, err error) {
+ var db *sql.DB
+ file, db, _, err = connectWithCrypt(t, "", "admin", "admin", crypt, salt)
+ db.Close()
+ return
+ }
+
connect = func(t *testing.T, f string, username, password string) (file string, db *sql.DB, c *SQLiteConn, err error) {
conn = nil // Clear connection
file = f // Copy provided file (f) => file
@@ -63,6 +78,32 @@ func init() {
return
}
+ connectWithCrypt = func(t *testing.T, f string, username, password string, crypt string, salt string) (file string, db *sql.DB, c *SQLiteConn, err error) {
+ conn = nil // Clear connection
+ file = f // Copy provided file (f) => file
+ if file == "" {
+ // Create dummy file
+ file = TempFilename(t)
+ }
+
+ db, err = sql.Open("sqlite3_with_conn", "file:"+file+fmt.Sprintf("?_auth&_auth_user=%s&_auth_pass=%s&_auth_crypt=%s&_auth_salt=%s", username, password, crypt, salt))
+ if err != nil {
+ defer os.Remove(file)
+ return file, nil, nil, err
+ }
+
+ // Dummy query to force connection and database creation
+ // Will return ErrUnauthorized (SQLITE_AUTH) if user authentication fails
+ if _, err = db.Exec("SELECT 1;"); err != nil {
+ defer os.Remove(file)
+ defer db.Close()
+ return file, nil, nil, err
+ }
+ c = conn
+
+ return
+ }
+
authEnabled = func(db *sql.DB) (exists bool, err error) {
err = db.QueryRow("select count(type) from sqlite_master WHERE type='table' and name='sqlite_user';").Scan(&exists)
return
@@ -94,1289 +135,485 @@ func init() {
}
}
-func TestUserAuthentication(t *testing.T) {
- Convey("Create Database", t, func() {
- f, db, c, err := connect(t, "", "admin", "admin")
- So(db, ShouldNotBeNil)
- So(c, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer db.Close()
- defer os.Remove(f)
+func TestUserAuthCreateDatabase(t *testing.T) {
+ f, db, c, err := connect(t, "", "admin", "admin")
+ if err != nil && c == nil && db == nil {
+ t.Fatal(err)
+ }
+ defer db.Close()
+ defer os.Remove(f)
- b, err := authEnabled(db)
- So(b, ShouldEqual, true)
- So(err, ShouldBeNil)
-
- e, err := userExists(db, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
- })
-
- Convey("Authorization Success", t, func() {
- f1, db1, c1, err := connect(t, "", "admin", "admin")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
- db1.Close()
-
- // Preform authentication
- f2, db2, c2, err := connect(t, f1, "admin", "admin")
- So(f2, ShouldNotBeBlank)
- So(f1, ShouldEqual, f2)
- So(db2, ShouldNotBeNil)
- So(c2, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer db2.Close()
- })
-
- Convey("Authorization Success (*SQLiteConn)", t, func() {
- f1, db1, c1, err := connect(t, "", "admin", "admin")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
- defer db1.Close()
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Test lower level authentication
- err = c1.Authenticate("admin", "admin")
- So(err, ShouldBeNil)
- })
-
- Convey("Authorization Failed", t, func() {
- f1, db1, c1, err := connect(t, "", "admin", "admin")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
- db1.Close()
-
- // Perform Invalid Authentication when we connect
- // to a database
- f2, db2, c2, err := connect(t, f1, "admin", "invalid")
- So(f2, ShouldNotBeBlank)
- So(f1, ShouldEqual, f2)
- So(db2, ShouldBeNil)
- So(c2, ShouldBeNil)
- So(err, ShouldEqual, ErrUnauthorized)
- })
-
- Convey("Authorization Failed (*SQLiteConn)", t, func() {
- f1, db1, c1, err := connect(t, "", "admin", "admin")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
- defer db1.Close()
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Test lower level authentication
- // We require a successful *SQLiteConn to test this.
- err = c1.Authenticate("admin", "invalid")
- So(err, ShouldNotBeNil)
- So(err, ShouldEqual, ErrUnauthorized)
- })
+ enabled, err := authEnabled(db)
+ if err != nil || !enabled {
+ t.Fatalf("UserAuth not enabled: %s", err)
+ }
+
+ e, err := userExists(db, "admin")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if e != 1 {
+ t.Fatal("UserAuth: admin does not exists")
+ }
+ a, err := isAdmin(db, "admin")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !a {
+ t.Fatal("UserAuth: User is not administrator")
+ }
}
-func TestUserAuthenticationAddUser(t *testing.T) {
- Convey("Add Admin User", t, func() {
- f, db, c, err := connect(t, "", "admin", "admin")
- So(db, ShouldNotBeNil)
- So(c, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f)
- defer db.Close()
+func TestUserAuthLogin(t *testing.T) {
+ f1, err := create(t, "admin", "admin")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.Remove(f1)
- e, err := userExists(db, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Add Admin User
- rv, err := addUser(db, "admin2", "admin2", 1)
- So(rv, ShouldEqual, 0) // 0 == C.SQLITE_OK
- So(err, ShouldBeNil)
-
- e, err = userExists(db, "admin2")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err = isAdmin(db, "admin2")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
- })
-
- Convey("Add Admin User (*SQLiteConn)", t, func() {
- f, db, c, err := connect(t, "", "admin", "admin")
- So(db, ShouldNotBeNil)
- So(c, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f)
- defer db.Close()
+ f2, db2, c2, err := connect(t, f1, "admin", "admin")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer db2.Close()
+ if f1 != f2 {
+ t.Fatal("UserAuth: Database file mismatch")
+ }
- e, err := userExists(db, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
+ // Test lower level authentication
+ err = c2.Authenticate("admin", "admin")
+ if err != nil {
+ t.Fatalf("UserAuth: *SQLiteConn.Authenticate() Failed: %s", err)
+ }
- a, err := isAdmin(db, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
+ // Test Login Failed
+ _, _, _, err = connect(t, f1, "admin", "invalid")
+ if err == nil {
+ t.Fatal("Login successful while expecting to fail")
+ }
+ if err != ErrUnauthorized {
+ t.Fatal(err)
+ }
+ err = c2.Authenticate("admin", "invalid")
+ if err == nil {
+ t.Fatal("Login successful while expecting to fail")
+ }
+ if err != ErrUnauthorized {
+ t.Fatal(err)
+ }
+}
- // Test lower level AuthUserAdd
- err = c.AuthUserAdd("admin2", "admin2", true)
- So(err, ShouldBeNil)
+func TestUserAuthAddAdmin(t *testing.T) {
+ f, db, c, err := connect(t, "", "admin", "admin")
+ if err != nil && c == nil && db == nil {
+ t.Fatal(err)
+ }
+ defer db.Close()
+ defer os.Remove(f)
- e, err = userExists(db, "admin2")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
+ // Add Admin User through SQL call
+ rv, err := addUser(db, "admin2", "admin2", 1)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if rv != 0 {
+ t.Fatal("Failed to add user")
+ }
- a, err = isAdmin(db, "admin2")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
- })
+ // Check if user was created
+ exists, err := userExists(db, "admin2")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if exists != 1 {
+ t.Fatal("UserAuth: 'admin2' does not exists")
+ }
- Convey("Add Normal User", t, func() {
- f, db, c, err := connect(t, "", "admin", "admin")
- So(db, ShouldNotBeNil)
- So(c, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f)
- defer db.Close()
+ // Check if user was created as an Administrator
+ admin, err := isAdmin(db, "admin2")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !admin {
+ t.Fatal("UserAuth: 'admin2' is not administrator")
+ }
- e, err := userExists(db, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Add Normal User
- rv, err := addUser(db, "user", "user", 0)
- So(rv, ShouldEqual, 0) // 0 == C.SQLITE_OK
- So(err, ShouldBeNil)
-
- e, err = userExists(db, "user")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err = isAdmin(db, "user")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, false)
- })
-
- Convey("Add Normal User (*SQLiteConn)", t, func() {
- f, db, c, err := connect(t, "", "admin", "admin")
- So(db, ShouldNotBeNil)
- So(c, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f)
- defer db.Close()
+ // Test *SQLiteConn
+ err = c.AuthUserAdd("admin3", "admin3", true)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Check if user was created
+ exists, err = userExists(db, "admin2")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if exists != 1 {
+ t.Fatal("UserAuth: 'admin3' does not exists")
+ }
+
+ // Check if the user was created as an Administrator
+ admin, err = isAdmin(db, "admin3")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !admin {
+ t.Fatal("UserAuth: 'admin3' is not administrator")
+ }
+}
+
+func TestUserAuthAddUser(t *testing.T) {
+ f1, db1, c, err := connect(t, "", "admin", "admin")
+ if err != nil && c == nil && db == nil {
+ t.Fatal(err)
+ }
+ defer os.Remove(f1)
+
+ // Add user through SQL call
+ rv, err := addUser(db1, "user", "user", 0)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if rv != 0 {
+ t.Fatal("Failed to add user")
+ }
+
+ // Check if user was created
+ exists, err := userExists(db1, "user")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if exists != 1 {
+ t.Fatal("UserAuth: 'user' does not exists")
+ }
+
+ // Check if user was created as an Administrator
+ admin, err := isAdmin(db1, "user")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if admin {
+ t.Fatal("UserAuth: 'user' is administrator")
+ }
+
+ // Test *SQLiteConn
+ err = c.AuthUserAdd("user2", "user2", false)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Check if user was created
+ exists, err = userExists(db1, "user2")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if exists != 1 {
+ t.Fatal("UserAuth: 'user2' does not exists")
+ }
+
+ // Check if the user was created as an Administrator
+ admin, err = isAdmin(db1, "user2")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if admin {
+ t.Fatal("UserAuth: 'user2' is administrator")
+ }
+
+ // Reconnect as normal user
+ db1.Close()
+ _, db2, c2, err := connect(t, f1, "user", "user")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer db2.Close()
+
+ // Try to create admin user while logged in as normal user
+ rv, err = addUser(db2, "admin2", "admin2", 1)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if rv != SQLITE_AUTH {
+ t.Fatal("Created admin user while not allowed")
+ }
+
+ err = c2.AuthUserAdd("admin3", "admin3", true)
+ if err != ErrAdminRequired {
+ t.Fatal("Created admin user while not allowed")
+ }
- e, err := userExists(db, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Test lower level AuthUserAdd
- err = c.AuthUserAdd("user", "user", false)
- So(err, ShouldBeNil)
-
- e, err = userExists(db, "user")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err = isAdmin(db, "user")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, false)
- })
-
- Convey("Add Admin User Insufficient Privileges", t, func() {
- f1, db1, c1, err := connect(t, "", "admin", "admin")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Add Normal User
- rv, err := addUser(db1, "user", "user", 0)
- So(rv, ShouldEqual, 0) // 0 == C.SQLITE_OK
- So(err, ShouldBeNil)
-
- e, err = userExists(db1, "user")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err = isAdmin(db1, "user")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, false)
- db1.Close()
-
- // Reconnect as normal user
- f2, db2, c2, err := connect(t, f1, "user", "user")
- So(f2, ShouldNotBeBlank)
- So(f1, ShouldEqual, f2)
- So(db2, ShouldNotBeNil)
- So(c2, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer db2.Close()
-
- // Add Admin User
- // Because 'user' is not admin
- // Adding an admin user should now fail
- // because we have insufficient privileges
- rv, err = addUser(db2, "admin2", "admin2", 1)
- So(rv, ShouldEqual, SQLITE_AUTH)
- So(err, ShouldBeNil)
- })
-
- Convey("Add Admin User Insufficient Privileges (*SQLiteConn)", t, func() {
- f1, db1, c1, err := connect(t, "", "admin", "admin")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Add Normal User
- rv, err := addUser(db1, "user", "user", 0)
- So(rv, ShouldEqual, 0) // 0 == C.SQLITE_OK
- So(err, ShouldBeNil)
-
- e, err = userExists(db1, "user")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err = isAdmin(db1, "user")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, false)
- db1.Close()
-
- // Reconnect as normal user
- f2, db2, c2, err := connect(t, f1, "user", "user")
- So(f2, ShouldNotBeBlank)
- So(f1, ShouldEqual, f2)
- So(db2, ShouldNotBeNil)
- So(c2, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer db2.Close()
-
- // Add Admin User
- // Because 'user' is not admin
- // Adding an admin user should now fail
- // because we have insufficient privileges
- err = c2.AuthUserAdd("admin2", "admin2", true)
- So(err, ShouldNotBeNil)
- So(err, ShouldEqual, ErrAdminRequired)
- })
-
- Convey("Add Normal User Insufficient Privileges", t, func() {
- f1, db1, c1, err := connect(t, "", "admin", "admin")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Add Normal User
- rv, err := addUser(db1, "user", "user", 0)
- So(rv, ShouldEqual, 0) // 0 == C.SQLITE_OK
- So(err, ShouldBeNil)
-
- e, err = userExists(db1, "user")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err = isAdmin(db1, "user")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, false)
- db1.Close()
-
- // Reconnect as normal user
- f2, db2, c2, err := connect(t, f1, "user", "user")
- So(f2, ShouldNotBeBlank)
- So(f1, ShouldEqual, f2)
- So(db2, ShouldNotBeNil)
- So(c2, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer db2.Close()
-
- // Add Normal User
- // Because 'user' is not admin
- // Adding an normal user should now fail
- // because we have insufficient privileges
- rv, err = addUser(db2, "user2", "user2", 0)
- So(rv, ShouldEqual, SQLITE_AUTH)
- So(err, ShouldBeNil)
- })
-
- Convey("Add Normal User Insufficient Privileges (*SQLiteConn)", t, func() {
- f1, db1, c1, err := connect(t, "", "admin", "admin")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Add Normal User
- rv, err := addUser(db1, "user", "user", 0)
- So(rv, ShouldEqual, 0) // 0 == C.SQLITE_OK
- So(err, ShouldBeNil)
-
- e, err = userExists(db1, "user")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err = isAdmin(db1, "user")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, false)
- db1.Close()
-
- // Reconnect as normal user
- f2, db2, c2, err := connect(t, f1, "user", "user")
- So(f2, ShouldNotBeBlank)
- So(f1, ShouldEqual, f2)
- So(db2, ShouldNotBeNil)
- So(c2, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer db2.Close()
-
- // Add Normal User
- // Because 'user' is not admin
- // Adding an normal user should now fail
- // because we have insufficient privileges
- // Test lower level AuthUserAdd
- err = c2.AuthUserAdd("user2", "user2", false)
- So(err, ShouldNotBeNil)
- So(err, ShouldEqual, ErrAdminRequired)
- })
+ // Try to create normal user while logged in as normal user
+ rv, err = addUser(db2, "user3", "user3", 0)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if rv != SQLITE_AUTH {
+ t.Fatal("Created user while not allowed")
+ }
+
+ err = c2.AuthUserAdd("user4", "user4", false)
+ if err != ErrAdminRequired {
+ t.Fatal("Created user while not allowed")
+ }
}
-func TestUserAuthenticationModifyUser(t *testing.T) {
- Convey("Modify Current Connection Password", t, func() {
- f1, db1, c1, err := connect(t, "", "admin", "admin")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Modify Password
- rv, err := modifyUser(db1, "admin", "admin2", 1)
- So(err, ShouldBeNil)
- So(rv, ShouldEqual, 0)
- db1.Close()
-
- // Reconnect with new password
- f2, db2, c2, err := connect(t, f1, "admin", "admin2")
- So(f2, ShouldNotBeBlank)
- So(f1, ShouldEqual, f2)
- So(db2, ShouldNotBeNil)
- So(c2, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer db2.Close()
- })
-
- Convey("Modify Current Connection Password (*SQLiteConn)", t, func() {
- f1, db1, c1, err := connect(t, "", "admin", "admin")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
- defer db1.Close()
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Modify password through (*SQLiteConn)
- err = c1.AuthUserChange("admin", "admin2", true)
- So(err, ShouldBeNil)
-
- // Reconnect with new password
- f2, db2, c2, err := connect(t, f1, "admin", "admin2")
- So(f2, ShouldNotBeBlank)
- So(f1, ShouldEqual, f2)
- So(db2, ShouldNotBeNil)
- So(c2, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer db2.Close()
- })
-
- Convey("Modify Current Connection Admin Flag", t, func() {
- f1, db1, c1, err := connect(t, "", "admin", "admin")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
- defer db1.Close()
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Modify Administrator Flag
- // Because we are current logged in as 'admin'
- // Changing our own admin flag should fail.
- rv, err := modifyUser(db1, "admin", "admin", 0)
- So(err, ShouldBeNil)
- So(rv, ShouldEqual, SQLITE_AUTH)
- })
-
- Convey("Modify Current Connection Admin Flag (*SQLiteConn)", t, func() {
- f1, db1, c1, err := connect(t, "", "admin", "admin")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
- defer db1.Close()
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Modify admin flag through (*SQLiteConn)
- // Because we are current logged in as 'admin'
- // Changing our own admin flag should fail.
- err = c1.AuthUserChange("admin", "admin", false)
- So(err, ShouldNotBeNil)
- So(err, ShouldEqual, ErrAdminRequired)
- })
-
- Convey("Modify Other User Password", t, func() {
- f1, db1, c1, err := connect(t, "", "admin", "admin")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Add Normal User
- rv, err := addUser(db1, "user", "user", 0)
- So(rv, ShouldEqual, 0) // 0 == C.SQLITE_OK
- So(err, ShouldBeNil)
-
- // Verify User
- e, err = userExists(db1, "user")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err = isAdmin(db1, "user")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, false)
-
- // Modify Password for user
- rv, err = modifyUser(db1, "user", "user2", 0)
- So(err, ShouldBeNil)
- So(rv, ShouldEqual, 0)
- db1.Close()
-
- // Reconnect as normal user with new password
- f2, db2, c2, err := connect(t, f1, "user", "user2")
- So(f2, ShouldNotBeBlank)
- So(f1, ShouldEqual, f2)
- So(db2, ShouldNotBeNil)
- So(c2, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer db2.Close()
- })
-
- Convey("Modify Other User Password (*SQLiteConn)", t, func() {
- f1, db1, c1, err := connect(t, "", "admin", "admin")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Add Normal User
- rv, err := addUser(db1, "user", "user", 0)
- So(rv, ShouldEqual, 0) // 0 == C.SQLITE_OK
- So(err, ShouldBeNil)
-
- // Verify User
- e, err = userExists(db1, "user")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err = isAdmin(db1, "user")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, false)
-
- // Modify user password through (*SQLiteConn)
- // Because we are still logged in as admin
- // this should succeed.
- err = c1.AuthUserChange("admin", "admin", false)
- So(err, ShouldNotBeNil)
- })
-
- Convey("Modify Other User Admin Flag", t, func() {
- f1, db1, c1, err := connect(t, "", "admin", "admin")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Add Normal User
- rv, err := addUser(db1, "user", "user", 0)
- So(rv, ShouldEqual, 0) // 0 == C.SQLITE_OK
- So(err, ShouldBeNil)
-
- // Verify User
- e, err = userExists(db1, "user")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err = isAdmin(db1, "user")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, false)
-
- // Modify Password for user
- // Because we are logged in as admin
- // This call should succeed.
- rv, err = modifyUser(db1, "user", "user", 1)
- So(err, ShouldBeNil)
- So(rv, ShouldEqual, 0)
- db1.Close()
-
- // Reconnect as normal user with new password
- f2, db2, c2, err := connect(t, f1, "user", "user")
- So(f2, ShouldNotBeBlank)
- So(f1, ShouldEqual, f2)
- So(db2, ShouldNotBeNil)
- So(c2, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer db2.Close()
- })
-
- Convey("Modify Other User Admin Flag (*SQLiteConn)", t, func() {
- f1, db1, c1, err := connect(t, "", "admin", "admin")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Add Normal User
- rv, err := addUser(db1, "user", "user", 0)
- So(rv, ShouldEqual, 0) // 0 == C.SQLITE_OK
- So(err, ShouldBeNil)
-
- // Verify User
- e, err = userExists(db1, "user")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err = isAdmin(db1, "user")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, false)
-
- // Modify user password through (*SQLiteConn)
- // Because we are still logged in as admin
- // this should succeed.
- err = c1.AuthUserChange("user", "user", true)
- So(err, ShouldBeNil)
- })
-
- Convey("Modify Other User Password as Non-Admin", t, func() {
- f1, db1, c1, err := connect(t, "", "admin", "admin")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Add Normal User
- rv, err := addUser(db1, "user", "user", 0)
- So(rv, ShouldEqual, 0) // 0 == C.SQLITE_OK
- So(err, ShouldBeNil)
-
- // Add Normal User
- rv, err = addUser(db1, "user2", "user2", 0)
- So(rv, ShouldEqual, 0) // 0 == C.SQLITE_OK
- So(err, ShouldBeNil)
-
- // Verify 'user'
- e, err = userExists(db1, "user")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err = isAdmin(db1, "user")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, false)
-
- // Verify 'user2'
- e, err = userExists(db1, "user2")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err = isAdmin(db1, "user2")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, false)
- db1.Close()
-
- // Reconnect as normal user
- f2, db2, c2, err := connect(t, f1, "user", "user")
- So(f2, ShouldNotBeBlank)
- So(f1, ShouldEqual, f2)
- So(db2, ShouldNotBeNil)
- So(c2, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer db2.Close()
-
- // Modify password for user as normal user
- // Because 'user' is not admin
- // Modifying password as a normal user should now fail
- // because we have insufficient privileges
- rv, err = modifyUser(db2, "user2", "invalid", 0)
- So(err, ShouldBeNil)
- So(rv, ShouldEqual, SQLITE_AUTH)
- })
-
- Convey("Modify Other User Password as Non-Admin", t, func() {
- f1, db1, c1, err := connect(t, "", "admin", "admin")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Add Normal User
- rv, err := addUser(db1, "user", "user", 0)
- So(rv, ShouldEqual, 0) // 0 == C.SQLITE_OK
- So(err, ShouldBeNil)
-
- // Add Normal User
- rv, err = addUser(db1, "user2", "user2", 0)
- So(rv, ShouldEqual, 0) // 0 == C.SQLITE_OK
- So(err, ShouldBeNil)
-
- // Verify 'user'
- e, err = userExists(db1, "user")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err = isAdmin(db1, "user")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, false)
-
- // Verify 'user2'
- e, err = userExists(db1, "user2")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err = isAdmin(db1, "user2")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, false)
- db1.Close()
-
- // Reconnect as normal user
- f2, db2, c2, err := connect(t, f1, "user", "user")
- So(f2, ShouldNotBeBlank)
- So(f1, ShouldEqual, f2)
- So(db2, ShouldNotBeNil)
- So(c2, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer db2.Close()
-
- // Modify user password through (*SQLiteConn)
- // for 'user2'
- // Because 'user' is not admin
- // Modifying password as a normal user should now fail
- // because we have insufficient privileges
- err = c2.AuthUserChange("user2", "invalid", false)
- So(err, ShouldNotBeNil)
- So(err, ShouldEqual, ErrAdminRequired)
- })
+func TestUserAuthModifyUser(t *testing.T) {
+ f1, db1, c1, err := connect(t, "", "admin", "admin")
+ if err != nil && c1 == nil && db == nil {
+ t.Fatal(err)
+ }
+ defer os.Remove(f1)
+
+ // Modify Password for current logged in admin
+ // through SQL
+ rv, err := modifyUser(db1, "admin", "admin2", 1)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if rv != 0 {
+ t.Fatal("Failed to modify password for admin")
+ }
+
+ // Modify password for current logged in admin
+ // through *SQLiteConn
+ err = c1.AuthUserChange("admin", "admin3", true)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Modify Administrator Flag
+ // Because we are current logged in as 'admin'
+ // Changing our own admin flag should fail.
+ rv, err = modifyUser(db1, "admin", "admin3", 0)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if rv != SQLITE_AUTH {
+ t.Fatal("Successfully changed admin flag while not allowed")
+ }
+
+ // Modify admin flag through (*SQLiteConn)
+ // Because we are current logged in as 'admin'
+ // Changing our own admin flag should fail.
+ err = c1.AuthUserChange("admin", "admin3", false)
+ if err != ErrAdminRequired {
+ t.Fatal("Successfully changed admin flag while not allowed")
+ }
+
+ // Add normal user
+ rv, err = addUser(db1, "user", "password", 0)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if rv != 0 {
+ t.Fatal("Failed to add user")
+ }
+
+ rv, err = addUser(db1, "user2", "user2", 0)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if rv != 0 {
+ t.Fatal("Failed to add user")
+ }
+
+ // Modify other user password and flag through SQL
+ rv, err = modifyUser(db1, "user", "pass", 1)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if rv != 0 {
+ t.Fatal("Failed to modify password for user")
+ }
+
+ // Modify other user password and flag through *SQLiteConn
+ err = c1.AuthUserChange("user", "newpass", false)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Disconnect database for reconnect
+ db1.Close()
+ _, db2, c2, err := connect(t, f1, "user", "newpass")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer db2.Close()
+
+ // Modify other user password through SQL
+ rv, err = modifyUser(db2, "user2", "newpass", 0)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if rv != SQLITE_AUTH {
+ t.Fatal("Password change succesful while not allowed")
+ }
+
+ // Modify other user password and flag through *SQLiteConn
+ err = c2.AuthUserChange("user2", "invalid", false)
+ if err != ErrAdminRequired {
+ t.Fatal("Password change succesful while not allowed")
+ }
}
-func TestUserAuthenticationDeleteUser(t *testing.T) {
- Convey("Delete User as Admin", t, func() {
- f1, db1, c1, err := connect(t, "", "admin", "admin")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Add Normal User
- rv, err := addUser(db1, "user", "user", 0)
- So(rv, ShouldEqual, 0) // 0 == C.SQLITE_OK
- So(err, ShouldBeNil)
-
- // Verify 'user'
- e, err = userExists(db1, "user")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err = isAdmin(db1, "user")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, false)
-
- rv, err = deleteUser(db1, "user")
- So(err, ShouldBeNil)
- So(rv, ShouldEqual, 0)
-
- e, err = userExists(db1, "user")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 0)
- })
-
- Convey("Delete User as Admin (*SQLiteConn)", t, func() {
- f1, db1, c1, err := connect(t, "", "admin", "admin")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Add Normal User
- rv, err := addUser(db1, "user", "user", 0)
- So(rv, ShouldEqual, 0) // 0 == C.SQLITE_OK
- So(err, ShouldBeNil)
-
- // Verify 'user'
- e, err = userExists(db1, "user")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err = isAdmin(db1, "user")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, false)
-
- err = c1.AuthUserDelete("user")
- So(err, ShouldBeNil)
-
- e, err = userExists(db1, "user")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 0)
- })
-
- Convey("Delete User as Non-Admin", t, func() {
- f1, db1, c1, err := connect(t, "", "admin", "admin")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Add Normal User
- rv, err := addUser(db1, "user", "user", 0)
- So(rv, ShouldEqual, 0) // 0 == C.SQLITE_OK
- So(err, ShouldBeNil)
-
- // Add Normal User
- rv, err = addUser(db1, "user2", "user2", 0)
- So(rv, ShouldEqual, 0) // 0 == C.SQLITE_OK
- So(err, ShouldBeNil)
-
- // Verify 'user'
- e, err = userExists(db1, "user")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err = isAdmin(db1, "user")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, false)
-
- // Verify 'user2'
- e, err = userExists(db1, "user2")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err = isAdmin(db1, "user2")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, false)
- db1.Close()
-
- // Reconnect as normal user
- f2, db2, c2, err := connect(t, f1, "user", "user")
- So(f2, ShouldNotBeBlank)
- So(f1, ShouldEqual, f2)
- So(db2, ShouldNotBeNil)
- So(c2, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer db2.Close()
-
- rv, err = deleteUser(db2, "user2")
- So(err, ShouldBeNil)
- So(rv, ShouldEqual, SQLITE_AUTH)
- })
-
- Convey("Delete User as Non-Admin (*SQLiteConn)", t, func() {
- f1, db1, c1, err := connect(t, "", "admin", "admin")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
-
- // Add Normal User
- rv, err := addUser(db1, "user", "user", 0)
- So(rv, ShouldEqual, 0) // 0 == C.SQLITE_OK
- So(err, ShouldBeNil)
-
- // Add Normal User
- rv, err = addUser(db1, "user2", "user2", 0)
- So(rv, ShouldEqual, 0) // 0 == C.SQLITE_OK
- So(err, ShouldBeNil)
-
- // Verify 'user'
- e, err = userExists(db1, "user")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err = isAdmin(db1, "user")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, false)
-
- // Verify 'user2'
- e, err = userExists(db1, "user2")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err = isAdmin(db1, "user2")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, false)
- db1.Close()
-
- // Reconnect as normal user
- f2, db2, c2, err := connect(t, f1, "user", "user")
- So(f2, ShouldNotBeBlank)
- So(f1, ShouldEqual, f2)
- So(db2, ShouldNotBeNil)
- So(c2, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer db2.Close()
-
- err = c2.AuthUserDelete("user2")
- So(err, ShouldNotBeNil)
- So(err, ShouldEqual, ErrAdminRequired)
- })
+func TestUserAuthDeleteUser(t *testing.T) {
+ f1, db1, c, err := connect(t, "", "admin", "admin")
+ if err != nil && c == nil && db == nil {
+ t.Fatal(err)
+ }
+ defer os.Remove(f1)
+
+ // Add Admin User 2
+ rv, err := addUser(db1, "admin2", "admin2", 1)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if rv != 0 {
+ t.Fatal("Failed to add user")
+ }
+
+ rv, err = addUser(db1, "admin3", "admin3", 1)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if rv != 0 {
+ t.Fatal("Failed to add user")
+ }
+
+ // Check if user was created
+ exists, err := userExists(db1, "admin2")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if exists != 1 {
+ t.Fatal("UserAuth: 'admin2' does not exists")
+ }
+
+ exists, err = userExists(db1, "admin3")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if exists != 1 {
+ t.Fatal("UserAuth: 'admin2' does not exists")
+ }
+
+ // Delete user through SQL
+ rv, err = deleteUser(db1, "admin2")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if rv != 0 {
+ t.Fatal("Failed to delete admin2")
+ }
+
+ // Verify user admin2 deleted
+ exists, err = userExists(db1, "admin2")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if exists != 0 {
+ t.Fatal("UserAuth: 'admin2' still exists")
+ }
+
+ // Delete user through *SQLiteConn
+ rv, err = deleteUser(db1, "admin3")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if rv != 0 {
+ t.Fatal("Failed to delete admin3")
+ }
+
+ // Verify user admin3 deleted
+ exists, err = userExists(db1, "admin3")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if exists != 0 {
+ t.Fatal("UserAuth: 'admin3' still exists")
+ }
+
+ // Add normal user for reconnect and privileges check
+ rv, err = addUser(db1, "reconnect", "reconnect", 0)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if rv != 0 {
+ t.Fatal("Failed to add user")
+ }
+
+ // Add normal user for deletion through SQL
+ rv, err = addUser(db1, "user", "user", 0)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if rv != 0 {
+ t.Fatal("Failed to add user")
+ }
+
+ rv, err = addUser(db1, "user2", "user2", 0)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if rv != 0 {
+ t.Fatal("Failed to add user")
+ }
+
+ // Close database for reconnect
+ db1.Close()
+
+ // Reconnect as normal user
+ _, db2, c2, err := connect(t, f1, "reconnect", "reconnect")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer db2.Close()
+
+ // Delete user while logged in as normal user
+ // through SQL
+ rv, err = deleteUser(db2, "user")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if rv != SQLITE_AUTH {
+ t.Fatal("Successfully deleted user wthout proper privileges")
+ }
+
+ // Delete user while logged in as normal user
+ // through *SQLiteConn
+ err = c2.AuthUserDelete("user2")
+ if err != ErrAdminRequired {
+ t.Fatal("Successfully deleted user wthout proper privileges")
+ }
}
-func TestUserAuthenticationEncoder(t *testing.T) {
- connectWithCrypt := func(t *testing.T, f string, username, password string, crypt string, salt string) (file string, db *sql.DB, c *SQLiteConn, err error) {
- conn = nil // Clear connection
- file = f // Copy provided file (f) => file
- if file == "" {
- // Create dummy file
- file = TempFilename(t)
- }
+func TestUserAuthEncoders(t *testing.T) {
+ cases := map[string]string{
+ "sha1": "",
+ "ssha1": "salted",
+ "sha256": "",
+ "ssha256": "salted",
+ "sha384": "",
+ "ssha384": "salted",
+ "sha512": "",
+ "ssha512": "salted",
+ }
- db, err = sql.Open("sqlite3_with_conn", "file:"+file+fmt.Sprintf("?_auth&_auth_user=%s&_auth_pass=%s&_auth_crypt=%s&_auth_salt=%s", username, password, crypt, salt))
+ for enc, salt := range cases {
+ f, err := createWithCrypt(t, "admin", "admin", enc, salt)
if err != nil {
- defer os.Remove(file)
- return file, nil, nil, err
+ t.Fatal(err)
}
+ defer os.Remove(f)
- // Dummy query to force connection and database creation
- // Will return ErrUnauthorized (SQLITE_AUTH) if user authentication fails
- if _, err = db.Exec("SELECT 1;"); err != nil {
- defer os.Remove(file)
- defer db.Close()
- return file, nil, nil, err
+ _, db, _, err := connectWithCrypt(t, f, "admin", "admin", enc, salt)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer db.Close()
+ if e, err := authEnabled(db); err != nil && !e {
+ t.Fatalf("UserAuth (%s) not enabled %s", enc, err)
}
- c = conn
-
- return
}
-
- Convey("SHA1 Encoder", t, func() {
- f1, db1, c1, err := connectWithCrypt(t, "", "admin", "admin", "sha1", "")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
- db1.Close()
-
- // Preform authentication
- f2, db2, c2, err := connectWithCrypt(t, f1, "admin", "admin", "sha1", "")
- So(f2, ShouldNotBeBlank)
- So(f1, ShouldEqual, f2)
- So(db2, ShouldNotBeNil)
- So(c2, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer db2.Close()
- })
-
- Convey("SSHA1 Encoder", t, func() {
- f1, db1, c1, err := connectWithCrypt(t, "", "admin", "admin", "ssha1", "salted")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
- db1.Close()
-
- // Preform authentication
- f2, db2, c2, err := connectWithCrypt(t, f1, "admin", "admin", "ssha1", "salted")
- So(f2, ShouldNotBeBlank)
- So(f1, ShouldEqual, f2)
- So(db2, ShouldNotBeNil)
- So(c2, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer db2.Close()
- })
-
- Convey("SHA256 Encoder", t, func() {
- f1, db1, c1, err := connectWithCrypt(t, "", "admin", "admin", "sha256", "")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
- db1.Close()
-
- // Preform authentication
- f2, db2, c2, err := connectWithCrypt(t, f1, "admin", "admin", "sha256", "")
- So(f2, ShouldNotBeBlank)
- So(f1, ShouldEqual, f2)
- So(db2, ShouldNotBeNil)
- So(c2, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer db2.Close()
- })
-
- Convey("SSHA256 Encoder", t, func() {
- f1, db1, c1, err := connectWithCrypt(t, "", "admin", "admin", "ssha256", "salted")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
- db1.Close()
-
- // Preform authentication
- f2, db2, c2, err := connectWithCrypt(t, f1, "admin", "admin", "ssha256", "salted")
- So(f2, ShouldNotBeBlank)
- So(f1, ShouldEqual, f2)
- So(db2, ShouldNotBeNil)
- So(c2, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer db2.Close()
- })
-
- Convey("SHA384 Encoder", t, func() {
- f1, db1, c1, err := connectWithCrypt(t, "", "admin", "admin", "sha384", "")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
- db1.Close()
-
- // Preform authentication
- f2, db2, c2, err := connectWithCrypt(t, f1, "admin", "admin", "sha384", "")
- So(f2, ShouldNotBeBlank)
- So(f1, ShouldEqual, f2)
- So(db2, ShouldNotBeNil)
- So(c2, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer db2.Close()
- })
-
- Convey("SSHA384 Encoder", t, func() {
- f1, db1, c1, err := connectWithCrypt(t, "", "admin", "admin", "ssha384", "salted")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
- db1.Close()
-
- // Preform authentication
- f2, db2, c2, err := connectWithCrypt(t, f1, "admin", "admin", "ssha384", "salted")
- So(f2, ShouldNotBeBlank)
- So(f1, ShouldEqual, f2)
- So(db2, ShouldNotBeNil)
- So(c2, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer db2.Close()
- })
-
- Convey("SHA512 Encoder", t, func() {
- f1, db1, c1, err := connectWithCrypt(t, "", "admin", "admin", "sha512", "")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
- db1.Close()
-
- // Preform authentication
- f2, db2, c2, err := connectWithCrypt(t, f1, "admin", "admin", "sha512", "")
- So(f2, ShouldNotBeBlank)
- So(f1, ShouldEqual, f2)
- So(db2, ShouldNotBeNil)
- So(c2, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer db2.Close()
- })
-
- Convey("SSHA512 Encoder", t, func() {
- f1, db1, c1, err := connectWithCrypt(t, "", "admin", "admin", "ssha512", "salted")
- So(f1, ShouldNotBeBlank)
- So(db1, ShouldNotBeNil)
- So(c1, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer os.Remove(f1)
-
- e, err := userExists(db1, "admin")
- So(err, ShouldBeNil)
- So(e, ShouldEqual, 1)
-
- a, err := isAdmin(db1, "admin")
- So(err, ShouldBeNil)
- So(a, ShouldEqual, true)
- db1.Close()
-
- // Preform authentication
- f2, db2, c2, err := connectWithCrypt(t, f1, "admin", "admin", "ssha512", "salted")
- So(f2, ShouldNotBeBlank)
- So(f1, ShouldEqual, f2)
- So(db2, ShouldNotBeNil)
- So(c2, ShouldNotBeNil)
- So(err, ShouldBeNil)
- defer db2.Close()
- })
}
diff --git a/upgrade/profile.goconvey b/upgrade/profile.goconvey
deleted file mode 100644
index 55049ab..0000000
--- a/upgrade/profile.goconvey
+++ /dev/null
@@ -1,2 +0,0 @@
-// Goconvey Profile
-IGNORE