Fork github.com/mattn/go-sqlite3 with adjustment for go1.16.2
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

643 lines
15 KiB

  1. // Copyright (C) 2018 G.J.R. Timmer <gjr.timmer@gmail.com>.
  2. //
  3. // Use of this source code is governed by an MIT-style
  4. // license that can be found in the LICENSE file.
  5. // +build sqlite_userauth
  6. package sqlite3
  7. import (
  8. "database/sql"
  9. "fmt"
  10. "os"
  11. "testing"
  12. )
  13. var (
  14. conn *SQLiteConn
  15. create func(t *testing.T, username, password string) (file string, err error)
  16. createWithCrypt func(t *testing.T, username, password, crypt, salt string) (file string, err error)
  17. connect func(t *testing.T, f string, username, password string) (file string, db *sql.DB, c *SQLiteConn, err error)
  18. connectWithCrypt func(t *testing.T, f string, username, password string, crypt string, salt string) (file string, db *sql.DB, c *SQLiteConn, err error)
  19. authEnabled func(db *sql.DB) (exists bool, err error)
  20. addUser func(db *sql.DB, username, password string, admin int) (rv int, err error)
  21. userExists func(db *sql.DB, username string) (rv int, err error)
  22. isAdmin func(db *sql.DB, username string) (rv bool, err error)
  23. modifyUser func(db *sql.DB, username, password string, admin int) (rv int, err error)
  24. deleteUser func(db *sql.DB, username string) (rv int, err error)
  25. )
  26. func init() {
  27. // Create database connection
  28. sql.Register("sqlite3_with_conn",
  29. &SQLiteDriver{
  30. ConnectHook: func(c *SQLiteConn) error {
  31. conn = c
  32. return nil
  33. },
  34. })
  35. create = func(t *testing.T, username, password string) (file string, err error) {
  36. var db *sql.DB
  37. file, db, _, err = connect(t, "", username, password)
  38. db.Close()
  39. return
  40. }
  41. createWithCrypt = func(t *testing.T, username, password, crypt, salt string) (file string, err error) {
  42. var db *sql.DB
  43. file, db, _, err = connectWithCrypt(t, "", "admin", "admin", crypt, salt)
  44. db.Close()
  45. return
  46. }
  47. connect = func(t *testing.T, f string, username, password string) (file string, db *sql.DB, c *SQLiteConn, err error) {
  48. conn = nil // Clear connection
  49. file = f // Copy provided file (f) => file
  50. if file == "" {
  51. // Create dummy file
  52. file = TempFilename(t)
  53. }
  54. params := "?_auth"
  55. if len(username) > 0 {
  56. params = fmt.Sprintf("%s&_auth_user=%s", params, username)
  57. }
  58. if len(password) > 0 {
  59. params = fmt.Sprintf("%s&_auth_pass=%s", params, password)
  60. }
  61. db, err = sql.Open("sqlite3_with_conn", "file:"+file+params)
  62. if err != nil {
  63. defer os.Remove(file)
  64. return file, nil, nil, err
  65. }
  66. // Dummy query to force connection and database creation
  67. // Will return ErrUnauthorized (SQLITE_AUTH) if user authentication fails
  68. if _, err = db.Exec("SELECT 1;"); err != nil {
  69. defer os.Remove(file)
  70. defer db.Close()
  71. return file, nil, nil, err
  72. }
  73. c = conn
  74. return
  75. }
  76. connectWithCrypt = func(t *testing.T, f string, username, password string, crypt string, salt string) (file string, db *sql.DB, c *SQLiteConn, err error) {
  77. conn = nil // Clear connection
  78. file = f // Copy provided file (f) => file
  79. if file == "" {
  80. // Create dummy file
  81. file = TempFilename(t)
  82. }
  83. 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))
  84. if err != nil {
  85. defer os.Remove(file)
  86. return file, nil, nil, err
  87. }
  88. // Dummy query to force connection and database creation
  89. // Will return ErrUnauthorized (SQLITE_AUTH) if user authentication fails
  90. if _, err = db.Exec("SELECT 1;"); err != nil {
  91. defer os.Remove(file)
  92. defer db.Close()
  93. return file, nil, nil, err
  94. }
  95. c = conn
  96. return
  97. }
  98. authEnabled = func(db *sql.DB) (exists bool, err error) {
  99. err = db.QueryRow("select count(type) from sqlite_master WHERE type='table' and name='sqlite_user';").Scan(&exists)
  100. return
  101. }
  102. addUser = func(db *sql.DB, username, password string, admin int) (rv int, err error) {
  103. err = db.QueryRow("select auth_user_add(?, ?, ?);", username, password, admin).Scan(&rv)
  104. return
  105. }
  106. userExists = func(db *sql.DB, username string) (rv int, err error) {
  107. err = db.QueryRow("select count(uname) from sqlite_user where uname=?", username).Scan(&rv)
  108. return
  109. }
  110. isAdmin = func(db *sql.DB, username string) (rv bool, err error) {
  111. err = db.QueryRow("select isAdmin from sqlite_user where uname=?", username).Scan(&rv)
  112. return
  113. }
  114. modifyUser = func(db *sql.DB, username, password string, admin int) (rv int, err error) {
  115. err = db.QueryRow("select auth_user_change(?, ?, ?);", username, password, admin).Scan(&rv)
  116. return
  117. }
  118. deleteUser = func(db *sql.DB, username string) (rv int, err error) {
  119. err = db.QueryRow("select auth_user_delete(?);", username).Scan(&rv)
  120. return
  121. }
  122. }
  123. func TestUserAuthCreateDatabase(t *testing.T) {
  124. f, db, c, err := connect(t, "", "admin", "admin")
  125. if err != nil && c == nil && db == nil {
  126. t.Fatal(err)
  127. }
  128. defer db.Close()
  129. defer os.Remove(f)
  130. enabled, err := authEnabled(db)
  131. if err != nil || !enabled {
  132. t.Fatalf("UserAuth not enabled: %s", err)
  133. }
  134. e, err := userExists(db, "admin")
  135. if err != nil {
  136. t.Fatal(err)
  137. }
  138. if e != 1 {
  139. t.Fatal("UserAuth: admin does not exists")
  140. }
  141. a, err := isAdmin(db, "admin")
  142. if err != nil {
  143. t.Fatal(err)
  144. }
  145. if !a {
  146. t.Fatal("UserAuth: User is not administrator")
  147. }
  148. }
  149. func TestUserAuthCreateDatabaseWithoutArgs(t *testing.T) {
  150. _, db, c, err := connect(t, "", "", "")
  151. if err == nil && c == nil && db == nil {
  152. t.Fatal("Should have failed due to missing _auth_* parameters")
  153. }
  154. _, db, c, err = connect(t, "", "", "admin")
  155. if err == nil && c == nil && db == nil {
  156. t.Fatal("Should have failed due to missing _auth_user parameter")
  157. }
  158. _, db, c, err = connect(t, "", "admin", "")
  159. if err == nil && c == nil && db == nil {
  160. t.Fatal("Should have failed due to missing _auth_pass parameter")
  161. }
  162. }
  163. func TestUserAuthLogin(t *testing.T) {
  164. f1, err := create(t, "admin", "admin")
  165. if err != nil {
  166. t.Fatal(err)
  167. }
  168. defer os.Remove(f1)
  169. f2, db2, c2, err := connect(t, f1, "admin", "admin")
  170. if err != nil {
  171. t.Fatal(err)
  172. }
  173. defer db2.Close()
  174. if f1 != f2 {
  175. t.Fatal("UserAuth: Database file mismatch")
  176. }
  177. // Test lower level authentication
  178. err = c2.Authenticate("admin", "admin")
  179. if err != nil {
  180. t.Fatalf("UserAuth: *SQLiteConn.Authenticate() Failed: %s", err)
  181. }
  182. // Test Login Failed
  183. _, _, _, err = connect(t, f1, "admin", "invalid")
  184. if err == nil {
  185. t.Fatal("Login successful while expecting to fail")
  186. }
  187. if err != ErrUnauthorized {
  188. t.Fatal(err)
  189. }
  190. err = c2.Authenticate("admin", "invalid")
  191. if err == nil {
  192. t.Fatal("Login successful while expecting to fail")
  193. }
  194. if err != ErrUnauthorized {
  195. t.Fatal(err)
  196. }
  197. }
  198. func TestUserAuthAddAdmin(t *testing.T) {
  199. f, db, c, err := connect(t, "", "admin", "admin")
  200. if err != nil && c == nil && db == nil {
  201. t.Fatal(err)
  202. }
  203. defer db.Close()
  204. defer os.Remove(f)
  205. // Add Admin User through SQL call
  206. rv, err := addUser(db, "admin2", "admin2", 1)
  207. if err != nil {
  208. t.Fatal(err)
  209. }
  210. if rv != 0 {
  211. t.Fatal("Failed to add user")
  212. }
  213. // Check if user was created
  214. exists, err := userExists(db, "admin2")
  215. if err != nil {
  216. t.Fatal(err)
  217. }
  218. if exists != 1 {
  219. t.Fatal("UserAuth: 'admin2' does not exists")
  220. }
  221. // Check if user was created as an Administrator
  222. admin, err := isAdmin(db, "admin2")
  223. if err != nil {
  224. t.Fatal(err)
  225. }
  226. if !admin {
  227. t.Fatal("UserAuth: 'admin2' is not administrator")
  228. }
  229. // Test *SQLiteConn
  230. err = c.AuthUserAdd("admin3", "admin3", true)
  231. if err != nil {
  232. t.Fatal(err)
  233. }
  234. // Check if user was created
  235. exists, err = userExists(db, "admin2")
  236. if err != nil {
  237. t.Fatal(err)
  238. }
  239. if exists != 1 {
  240. t.Fatal("UserAuth: 'admin3' does not exists")
  241. }
  242. // Check if the user was created as an Administrator
  243. admin, err = isAdmin(db, "admin3")
  244. if err != nil {
  245. t.Fatal(err)
  246. }
  247. if !admin {
  248. t.Fatal("UserAuth: 'admin3' is not administrator")
  249. }
  250. }
  251. func TestUserAuthAddUser(t *testing.T) {
  252. f1, db1, c, err := connect(t, "", "admin", "admin")
  253. if err != nil && c == nil && db == nil {
  254. t.Fatal(err)
  255. }
  256. defer os.Remove(f1)
  257. // Add user through SQL call
  258. rv, err := addUser(db1, "user", "user", 0)
  259. if err != nil {
  260. t.Fatal(err)
  261. }
  262. if rv != 0 {
  263. t.Fatal("Failed to add user")
  264. }
  265. // Check if user was created
  266. exists, err := userExists(db1, "user")
  267. if err != nil {
  268. t.Fatal(err)
  269. }
  270. if exists != 1 {
  271. t.Fatal("UserAuth: 'user' does not exists")
  272. }
  273. // Check if user was created as an Administrator
  274. admin, err := isAdmin(db1, "user")
  275. if err != nil {
  276. t.Fatal(err)
  277. }
  278. if admin {
  279. t.Fatal("UserAuth: 'user' is administrator")
  280. }
  281. // Test *SQLiteConn
  282. err = c.AuthUserAdd("user2", "user2", false)
  283. if err != nil {
  284. t.Fatal(err)
  285. }
  286. // Check if user was created
  287. exists, err = userExists(db1, "user2")
  288. if err != nil {
  289. t.Fatal(err)
  290. }
  291. if exists != 1 {
  292. t.Fatal("UserAuth: 'user2' does not exists")
  293. }
  294. // Check if the user was created as an Administrator
  295. admin, err = isAdmin(db1, "user2")
  296. if err != nil {
  297. t.Fatal(err)
  298. }
  299. if admin {
  300. t.Fatal("UserAuth: 'user2' is administrator")
  301. }
  302. // Reconnect as normal user
  303. db1.Close()
  304. _, db2, c2, err := connect(t, f1, "user", "user")
  305. if err != nil {
  306. t.Fatal(err)
  307. }
  308. defer db2.Close()
  309. // Try to create admin user while logged in as normal user
  310. rv, err = addUser(db2, "admin2", "admin2", 1)
  311. if err != nil {
  312. t.Fatal(err)
  313. }
  314. if rv != SQLITE_AUTH {
  315. t.Fatal("Created admin user while not allowed")
  316. }
  317. err = c2.AuthUserAdd("admin3", "admin3", true)
  318. if err != ErrAdminRequired {
  319. t.Fatal("Created admin user while not allowed")
  320. }
  321. // Try to create normal user while logged in as normal user
  322. rv, err = addUser(db2, "user3", "user3", 0)
  323. if err != nil {
  324. t.Fatal(err)
  325. }
  326. if rv != SQLITE_AUTH {
  327. t.Fatal("Created user while not allowed")
  328. }
  329. err = c2.AuthUserAdd("user4", "user4", false)
  330. if err != ErrAdminRequired {
  331. t.Fatal("Created user while not allowed")
  332. }
  333. }
  334. func TestUserAuthModifyUser(t *testing.T) {
  335. f1, db1, c1, err := connect(t, "", "admin", "admin")
  336. if err != nil && c1 == nil && db == nil {
  337. t.Fatal(err)
  338. }
  339. defer os.Remove(f1)
  340. // Modify Password for current logged in admin
  341. // through SQL
  342. rv, err := modifyUser(db1, "admin", "admin2", 1)
  343. if err != nil {
  344. t.Fatal(err)
  345. }
  346. if rv != 0 {
  347. t.Fatal("Failed to modify password for admin")
  348. }
  349. // Modify password for current logged in admin
  350. // through *SQLiteConn
  351. err = c1.AuthUserChange("admin", "admin3", true)
  352. if err != nil {
  353. t.Fatal(err)
  354. }
  355. // Modify Administrator Flag
  356. // Because we are current logged in as 'admin'
  357. // Changing our own admin flag should fail.
  358. rv, err = modifyUser(db1, "admin", "admin3", 0)
  359. if err != nil {
  360. t.Fatal(err)
  361. }
  362. if rv != SQLITE_AUTH {
  363. t.Fatal("Successfully changed admin flag while not allowed")
  364. }
  365. // Modify admin flag through (*SQLiteConn)
  366. // Because we are current logged in as 'admin'
  367. // Changing our own admin flag should fail.
  368. err = c1.AuthUserChange("admin", "admin3", false)
  369. if err != ErrAdminRequired {
  370. t.Fatal("Successfully changed admin flag while not allowed")
  371. }
  372. // Add normal user
  373. rv, err = addUser(db1, "user", "password", 0)
  374. if err != nil {
  375. t.Fatal(err)
  376. }
  377. if rv != 0 {
  378. t.Fatal("Failed to add user")
  379. }
  380. rv, err = addUser(db1, "user2", "user2", 0)
  381. if err != nil {
  382. t.Fatal(err)
  383. }
  384. if rv != 0 {
  385. t.Fatal("Failed to add user")
  386. }
  387. // Modify other user password and flag through SQL
  388. rv, err = modifyUser(db1, "user", "pass", 1)
  389. if err != nil {
  390. t.Fatal(err)
  391. }
  392. if rv != 0 {
  393. t.Fatal("Failed to modify password for user")
  394. }
  395. // Modify other user password and flag through *SQLiteConn
  396. err = c1.AuthUserChange("user", "newpass", false)
  397. if err != nil {
  398. t.Fatal(err)
  399. }
  400. // Disconnect database for reconnect
  401. db1.Close()
  402. _, db2, c2, err := connect(t, f1, "user", "newpass")
  403. if err != nil {
  404. t.Fatal(err)
  405. }
  406. defer db2.Close()
  407. // Modify other user password through SQL
  408. rv, err = modifyUser(db2, "user2", "newpass", 0)
  409. if err != nil {
  410. t.Fatal(err)
  411. }
  412. if rv != SQLITE_AUTH {
  413. t.Fatal("Password change successful while not allowed")
  414. }
  415. // Modify other user password and flag through *SQLiteConn
  416. err = c2.AuthUserChange("user2", "invalid", false)
  417. if err != ErrAdminRequired {
  418. t.Fatal("Password change successful while not allowed")
  419. }
  420. }
  421. func TestUserAuthDeleteUser(t *testing.T) {
  422. f1, db1, c, err := connect(t, "", "admin", "admin")
  423. if err != nil && c == nil && db == nil {
  424. t.Fatal(err)
  425. }
  426. defer os.Remove(f1)
  427. // Add Admin User 2
  428. rv, err := addUser(db1, "admin2", "admin2", 1)
  429. if err != nil {
  430. t.Fatal(err)
  431. }
  432. if rv != 0 {
  433. t.Fatal("Failed to add user")
  434. }
  435. rv, err = addUser(db1, "admin3", "admin3", 1)
  436. if err != nil {
  437. t.Fatal(err)
  438. }
  439. if rv != 0 {
  440. t.Fatal("Failed to add user")
  441. }
  442. // Check if user was created
  443. exists, err := userExists(db1, "admin2")
  444. if err != nil {
  445. t.Fatal(err)
  446. }
  447. if exists != 1 {
  448. t.Fatal("UserAuth: 'admin2' does not exists")
  449. }
  450. exists, err = userExists(db1, "admin3")
  451. if err != nil {
  452. t.Fatal(err)
  453. }
  454. if exists != 1 {
  455. t.Fatal("UserAuth: 'admin2' does not exists")
  456. }
  457. // Delete user through SQL
  458. rv, err = deleteUser(db1, "admin2")
  459. if err != nil {
  460. t.Fatal(err)
  461. }
  462. if rv != 0 {
  463. t.Fatal("Failed to delete admin2")
  464. }
  465. // Verify user admin2 deleted
  466. exists, err = userExists(db1, "admin2")
  467. if err != nil {
  468. t.Fatal(err)
  469. }
  470. if exists != 0 {
  471. t.Fatal("UserAuth: 'admin2' still exists")
  472. }
  473. // Delete user through *SQLiteConn
  474. rv, err = deleteUser(db1, "admin3")
  475. if err != nil {
  476. t.Fatal(err)
  477. }
  478. if rv != 0 {
  479. t.Fatal("Failed to delete admin3")
  480. }
  481. // Verify user admin3 deleted
  482. exists, err = userExists(db1, "admin3")
  483. if err != nil {
  484. t.Fatal(err)
  485. }
  486. if exists != 0 {
  487. t.Fatal("UserAuth: 'admin3' still exists")
  488. }
  489. // Add normal user for reconnect and privileges check
  490. rv, err = addUser(db1, "reconnect", "reconnect", 0)
  491. if err != nil {
  492. t.Fatal(err)
  493. }
  494. if rv != 0 {
  495. t.Fatal("Failed to add user")
  496. }
  497. // Add normal user for deletion through SQL
  498. rv, err = addUser(db1, "user", "user", 0)
  499. if err != nil {
  500. t.Fatal(err)
  501. }
  502. if rv != 0 {
  503. t.Fatal("Failed to add user")
  504. }
  505. rv, err = addUser(db1, "user2", "user2", 0)
  506. if err != nil {
  507. t.Fatal(err)
  508. }
  509. if rv != 0 {
  510. t.Fatal("Failed to add user")
  511. }
  512. // Close database for reconnect
  513. db1.Close()
  514. // Reconnect as normal user
  515. _, db2, c2, err := connect(t, f1, "reconnect", "reconnect")
  516. if err != nil {
  517. t.Fatal(err)
  518. }
  519. defer db2.Close()
  520. // Delete user while logged in as normal user
  521. // through SQL
  522. rv, err = deleteUser(db2, "user")
  523. if err != nil {
  524. t.Fatal(err)
  525. }
  526. if rv != SQLITE_AUTH {
  527. t.Fatal("Successfully deleted user wthout proper privileges")
  528. }
  529. // Delete user while logged in as normal user
  530. // through *SQLiteConn
  531. err = c2.AuthUserDelete("user2")
  532. if err != ErrAdminRequired {
  533. t.Fatal("Successfully deleted user wthout proper privileges")
  534. }
  535. }
  536. func TestUserAuthEncoders(t *testing.T) {
  537. cases := map[string]string{
  538. "sha1": "",
  539. "ssha1": "salted",
  540. "sha256": "",
  541. "ssha256": "salted",
  542. "sha384": "",
  543. "ssha384": "salted",
  544. "sha512": "",
  545. "ssha512": "salted",
  546. }
  547. for enc, salt := range cases {
  548. f, err := createWithCrypt(t, "admin", "admin", enc, salt)
  549. if err != nil {
  550. t.Fatal(err)
  551. }
  552. defer os.Remove(f)
  553. _, db, _, err := connectWithCrypt(t, f, "admin", "admin", enc, salt)
  554. if err != nil {
  555. t.Fatal(err)
  556. }
  557. defer db.Close()
  558. if e, err := authEnabled(db); err != nil && !e {
  559. t.Fatalf("UserAuth (%s) not enabled %s", enc, err)
  560. }
  561. }
  562. }