-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Drop userauth implementation #1344
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 9 commits
2e342f9
92826e1
001b07b
d312ff8
baf33b1
73c099e
eefa0ad
c59d385
9b66c7b
81d7823
f2f252e
71ef36e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -1568,9 +1568,11 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { | |||||||||||||||
} | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
// Preform Authentication | ||||||||||||||||
if err := conn.Authenticate(authUser, authPass); err != nil { | ||||||||||||||||
return nil, err | ||||||||||||||||
if conn.AuthEnabled() { | ||||||||||||||||
// Preform Authentication | ||||||||||||||||
if err := conn.Authenticate(authUser, authPass); err != nil { | ||||||||||||||||
return nil, err | ||||||||||||||||
} | ||||||||||||||||
} | ||||||||||||||||
|
if conn.AuthEnabled() { | |
// Preform Authentication | |
if err := conn.Authenticate(authUser, authPass); err != nil { | |
return nil, err | |
} | |
} | |
// Authentication is disabled as AuthEnabled() always returns false. |
Copilot uses AI. Check for mistakes.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No, we need to remain this code for users who uses Authenticate method.
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -16,53 +16,10 @@ package sqlite3 | |
#else | ||
#include <sqlite3.h> | ||
#endif | ||
#include <stdlib.h> | ||
|
||
static int | ||
_sqlite3_user_authenticate(sqlite3* db, const char* zUsername, const char* aPW, int nPW) | ||
{ | ||
return sqlite3_user_authenticate(db, zUsername, aPW, nPW); | ||
} | ||
|
||
static int | ||
_sqlite3_user_add(sqlite3* db, const char* zUsername, const char* aPW, int nPW, int isAdmin) | ||
{ | ||
return sqlite3_user_add(db, zUsername, aPW, nPW, isAdmin); | ||
} | ||
|
||
static int | ||
_sqlite3_user_change(sqlite3* db, const char* zUsername, const char* aPW, int nPW, int isAdmin) | ||
{ | ||
return sqlite3_user_change(db, zUsername, aPW, nPW, isAdmin); | ||
} | ||
|
||
static int | ||
_sqlite3_user_delete(sqlite3* db, const char* zUsername) | ||
{ | ||
return sqlite3_user_delete(db, zUsername); | ||
} | ||
|
||
static int | ||
_sqlite3_auth_enabled(sqlite3* db) | ||
{ | ||
int exists = -1; | ||
|
||
sqlite3_stmt *stmt; | ||
sqlite3_prepare_v2(db, "select count(type) from sqlite_master WHERE type='table' and name='sqlite_user';", -1, &stmt, NULL); | ||
|
||
while ( sqlite3_step(stmt) == SQLITE_ROW) { | ||
exists = sqlite3_column_int(stmt, 0); | ||
} | ||
|
||
sqlite3_finalize(stmt); | ||
|
||
return exists; | ||
} | ||
*/ | ||
import "C" | ||
import ( | ||
"errors" | ||
"unsafe" | ||
) | ||
|
||
const ( | ||
|
@@ -88,15 +45,7 @@ var ( | |
// If the SQLITE_USER table is not present in the database file, then | ||
// this interface is a harmless no-op returning SQLITE_OK. | ||
func (c *SQLiteConn) Authenticate(username, password string) error { | ||
rv := c.authenticate(username, password) | ||
switch rv { | ||
case C.SQLITE_ERROR, C.SQLITE_AUTH: | ||
return ErrUnauthorized | ||
case C.SQLITE_OK: | ||
return nil | ||
default: | ||
return c.lastError() | ||
} | ||
return ErrUnauthorized | ||
} | ||
|
||
// authenticate provides the actual authentication to SQLite. | ||
|
@@ -109,17 +58,7 @@ func (c *SQLiteConn) Authenticate(username, password string) error { | |
// C.SQLITE_ERROR (1) | ||
// C.SQLITE_AUTH (23) | ||
func (c *SQLiteConn) authenticate(username, password string) int { | ||
// Allocate C Variables | ||
cuser := C.CString(username) | ||
cpass := C.CString(password) | ||
|
||
// Free C Variables | ||
defer func() { | ||
C.free(unsafe.Pointer(cuser)) | ||
C.free(unsafe.Pointer(cpass)) | ||
}() | ||
|
||
return int(C._sqlite3_user_authenticate(c.db, cuser, cpass, C.int(len(password)))) | ||
return 1 | ||
} | ||
|
||
// AuthUserAdd can be used (by an admin user only) | ||
|
@@ -131,20 +70,7 @@ func (c *SQLiteConn) authenticate(username, password string) int { | |
// for any ATTACH-ed databases. Any call to AuthUserAdd by a | ||
// non-admin user results in an error. | ||
func (c *SQLiteConn) AuthUserAdd(username, password string, admin bool) error { | ||
isAdmin := 0 | ||
if admin { | ||
isAdmin = 1 | ||
} | ||
|
||
rv := c.authUserAdd(username, password, isAdmin) | ||
switch rv { | ||
case C.SQLITE_ERROR, C.SQLITE_AUTH: | ||
return ErrAdminRequired | ||
case C.SQLITE_OK: | ||
return nil | ||
default: | ||
return c.lastError() | ||
} | ||
return ErrUnauthorized | ||
|
||
} | ||
|
||
// authUserAdd enables the User Authentication if not enabled. | ||
|
@@ -162,17 +88,7 @@ func (c *SQLiteConn) AuthUserAdd(username, password string, admin bool) error { | |
// C.SQLITE_ERROR (1) | ||
// C.SQLITE_AUTH (23) | ||
func (c *SQLiteConn) authUserAdd(username, password string, admin int) int { | ||
// Allocate C Variables | ||
cuser := C.CString(username) | ||
cpass := C.CString(password) | ||
|
||
// Free C Variables | ||
defer func() { | ||
C.free(unsafe.Pointer(cuser)) | ||
C.free(unsafe.Pointer(cpass)) | ||
}() | ||
|
||
return int(C._sqlite3_user_add(c.db, cuser, cpass, C.int(len(password)), C.int(admin))) | ||
return 1 | ||
} | ||
|
||
// AuthUserChange can be used to change a users | ||
|
@@ -181,20 +97,7 @@ func (c *SQLiteConn) authUserAdd(username, password string, admin int) int { | |
// credentials or admin privilege setting. No user may change their own | ||
// admin privilege setting. | ||
func (c *SQLiteConn) AuthUserChange(username, password string, admin bool) error { | ||
isAdmin := 0 | ||
if admin { | ||
isAdmin = 1 | ||
} | ||
|
||
rv := c.authUserChange(username, password, isAdmin) | ||
switch rv { | ||
case C.SQLITE_ERROR, C.SQLITE_AUTH: | ||
return ErrAdminRequired | ||
case C.SQLITE_OK: | ||
return nil | ||
default: | ||
return c.lastError() | ||
} | ||
return ErrUnauthorized | ||
} | ||
|
||
// authUserChange allows to modify a user. | ||
|
@@ -215,17 +118,7 @@ func (c *SQLiteConn) AuthUserChange(username, password string, admin bool) error | |
// C.SQLITE_ERROR (1) | ||
// C.SQLITE_AUTH (23) | ||
func (c *SQLiteConn) authUserChange(username, password string, admin int) int { | ||
// Allocate C Variables | ||
cuser := C.CString(username) | ||
cpass := C.CString(password) | ||
|
||
// Free C Variables | ||
defer func() { | ||
C.free(unsafe.Pointer(cuser)) | ||
C.free(unsafe.Pointer(cpass)) | ||
}() | ||
|
||
return int(C._sqlite3_user_change(c.db, cuser, cpass, C.int(len(password)), C.int(admin))) | ||
return 1 | ||
} | ||
|
||
// AuthUserDelete can be used (by an admin user only) | ||
|
@@ -234,15 +127,7 @@ func (c *SQLiteConn) authUserChange(username, password string, admin int) int { | |
// the database cannot be converted into a no-authentication-required | ||
// database. | ||
func (c *SQLiteConn) AuthUserDelete(username string) error { | ||
rv := c.authUserDelete(username) | ||
switch rv { | ||
case C.SQLITE_ERROR, C.SQLITE_AUTH: | ||
return ErrAdminRequired | ||
case C.SQLITE_OK: | ||
return nil | ||
default: | ||
return c.lastError() | ||
} | ||
return ErrUnauthorized | ||
} | ||
|
||
// authUserDelete can be used to delete a user. | ||
|
@@ -258,25 +143,12 @@ func (c *SQLiteConn) AuthUserDelete(username string) error { | |
// C.SQLITE_ERROR (1) | ||
// C.SQLITE_AUTH (23) | ||
func (c *SQLiteConn) authUserDelete(username string) int { | ||
// Allocate C Variables | ||
cuser := C.CString(username) | ||
|
||
// Free C Variables | ||
defer func() { | ||
C.free(unsafe.Pointer(cuser)) | ||
}() | ||
|
||
return int(C._sqlite3_user_delete(c.db, cuser)) | ||
return 1 | ||
} | ||
|
||
// AuthEnabled checks if the database is protected by user authentication | ||
func (c *SQLiteConn) AuthEnabled() (exists bool) { | ||
rv := c.authEnabled() | ||
if rv == 1 { | ||
exists = true | ||
} | ||
|
||
return | ||
return false | ||
} | ||
|
||
// authEnabled perform the actual check for user authentication. | ||
|
@@ -289,7 +161,7 @@ func (c *SQLiteConn) AuthEnabled() (exists bool) { | |
// 0 - Disabled | ||
// 1 - Enabled | ||
func (c *SQLiteConn) authEnabled() int { | ||
return int(C._sqlite3_auth_enabled(c.db)) | ||
return 0 | ||
} | ||
|
||
// EOF |
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think we can add this check. Now
AuthEnabled()
always returns false even if you use the build tag. Therefore, anyone who had been relying on it just would skip auth instead of getting the error.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If enable sqlite_userauth tag, sqlite3 driver always fail since conn.Authenticate return error eventthough user/pass is not set. This means declaring to developers not to use sqlite_userauth. Is this what you intended?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes. If the user doesn't need this extension, then the fix is simple - stop passing the build tag they don't need.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
please take a look.