@@ -11,9 +11,10 @@ import (
1111 "time"
1212
1313 mssqlhelper "github.com/hashicorp/vault/helper/testhelpers/mssql"
14- dbplugin "github.com/hashicorp/vault/sdk/database/dbplugin/v5"
14+ "github.com/hashicorp/vault/sdk/database/dbplugin/v5"
1515 dbtesting "github.com/hashicorp/vault/sdk/database/dbplugin/v5/testing"
1616 "github.com/hashicorp/vault/sdk/helper/dbtxn"
17+ "github.com/stretchr/testify/assert"
1718)
1819
1920func TestInitialize (t * testing.T ) {
@@ -43,6 +44,15 @@ func TestInitialize(t *testing.T) {
4344 },
4445 },
4546 "contained_db set" : {
47+ dbplugin.InitializeRequest {
48+ Config : map [string ]interface {}{
49+ "connection_url" : connURL ,
50+ "contained_db" : true ,
51+ },
52+ VerifyConnection : true ,
53+ },
54+ },
55+ "contained_db set string" : {
4656 dbplugin.InitializeRequest {
4757 Config : map [string ]interface {}{
4858 "connection_url" : connURL ,
@@ -253,7 +263,10 @@ func TestUpdateUser_password(t *testing.T) {
253263 dbtesting .AssertInitializeCircleCiTest (t , db , initReq )
254264 defer dbtesting .AssertClose (t , db )
255265
256- createTestMSSQLUser (t , connURL , dbUser , initPassword , testMSSQLLogin )
266+ err := createTestMSSQLUser (connURL , dbUser , initPassword , testMSSQLLogin )
267+ if err != nil {
268+ t .Fatalf ("Failed to create user: %s" , err )
269+ }
257270
258271 assertCredsExist (t , connURL , dbUser , initPassword )
259272
@@ -317,7 +330,10 @@ func TestDeleteUser(t *testing.T) {
317330 dbtesting .AssertInitializeCircleCiTest (t , db , initReq )
318331 defer dbtesting .AssertClose (t , db )
319332
320- createTestMSSQLUser (t , connURL , dbUser , initPassword , testMSSQLLogin )
333+ err := createTestMSSQLUser (connURL , dbUser , initPassword , testMSSQLLogin )
334+ if err != nil {
335+ t .Fatalf ("Failed to create user: %s" , err )
336+ }
321337
322338 assertCredsExist (t , connURL , dbUser , initPassword )
323339
@@ -341,6 +357,44 @@ func TestDeleteUser(t *testing.T) {
341357 assertCredsDoNotExist (t , connURL , dbUser , initPassword )
342358}
343359
360+ func TestSQLSanitization (t * testing.T ) {
361+ cleanup , connURL := mssqlhelper .PrepareMSSQLTestContainer (t )
362+ defer cleanup ()
363+
364+ injectionString := "vaultuser]"
365+ dbUser := "vaultuser"
366+ initPassword := "p4$sw0rd"
367+
368+ initReq := dbplugin.InitializeRequest {
369+ Config : map [string ]interface {}{
370+ "connection_url" : connURL ,
371+ },
372+ VerifyConnection : true ,
373+ }
374+
375+ db := new ()
376+
377+ dbtesting .AssertInitializeCircleCiTest (t , db , initReq )
378+ defer dbtesting .AssertClose (t , db )
379+
380+ err := createTestMSSQLUser (connURL , dbUser , initPassword , testMSSQLLogin )
381+ if err != nil {
382+ t .Fatalf ("Failed to create user: %s" , err )
383+ }
384+
385+ assertCredsExist (t , connURL , dbUser , initPassword )
386+
387+ deleteReq := dbplugin.DeleteUserRequest {
388+ Username : injectionString ,
389+ }
390+
391+ ctx , cancel := context .WithTimeout (context .Background (), 5 * time .Second )
392+ defer cancel ()
393+ _ , err = db .DeleteUser (ctx , deleteReq )
394+
395+ assert .EqualError (t , err , "mssql: Cannot alter the login 'vaultuser]', because it does not exist or you do not have permission." )
396+ }
397+
344398func assertCredsExist (t testing.TB , connURL , username , password string ) {
345399 t .Helper ()
346400 err := testCredsExist (connURL , username , password )
@@ -369,18 +423,18 @@ func testCredsExist(connURL, username, password string) error {
369423 return db .Ping ()
370424}
371425
372- func createTestMSSQLUser (t * testing. T , connURL string , username , password , query string ) {
426+ func createTestMSSQLUser (connURL string , username , password , query string ) error {
373427 db , err := sql .Open ("mssql" , connURL )
374428 defer db .Close ()
375429 if err != nil {
376- t . Fatal ( err )
430+ return err
377431 }
378432
379433 // Start a transaction
380434 ctx := context .Background ()
381435 tx , err := db .BeginTx (ctx , nil )
382436 if err != nil {
383- t . Fatal ( err )
437+ return err
384438 }
385439 defer func () {
386440 _ = tx .Rollback ()
@@ -391,24 +445,20 @@ func createTestMSSQLUser(t *testing.T, connURL string, username, password, query
391445 "password" : password ,
392446 }
393447 if err := dbtxn .ExecuteTxQuery (ctx , tx , m , query ); err != nil {
394- t . Fatal ( err )
448+ return err
395449 }
396450 // Commit the transaction
397451 if err := tx .Commit (); err != nil {
398- t . Fatal ( err )
452+ return err
399453 }
454+ return nil
400455}
401456
402457const testMSSQLRole = `
403458CREATE LOGIN [{{name}}] WITH PASSWORD = '{{password}}';
404459CREATE USER [{{name}}] FOR LOGIN [{{name}}];
405460GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::dbo TO [{{name}}];`
406461
407- const testMSSQLDrop = `
408- DROP USER [{{name}}];
409- DROP LOGIN [{{name}}];
410- `
411-
412462const testMSSQLLogin = `
413463CREATE LOGIN [{{name}}] WITH PASSWORD = '{{password}}';
414464`
0 commit comments