github.com/cs3org/reva/v2@v2.27.7/pkg/user/manager/owncloudsql/accounts/accounts_test.go (about)

     1  // Copyright 2018-2021 CERN
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  //
    15  // In applying this license, CERN does not waive the privileges and immunities
    16  // granted to it by virtue of its status as an Intergovernmental Organization
    17  // or submit itself to any jurisdiction.
    18  
    19  package accounts_test
    20  
    21  import (
    22  	"context"
    23  	"database/sql"
    24  	"os"
    25  
    26  	_ "github.com/mattn/go-sqlite3"
    27  
    28  	"github.com/cs3org/reva/v2/pkg/user/manager/owncloudsql/accounts"
    29  
    30  	. "github.com/onsi/ginkgo/v2"
    31  	. "github.com/onsi/gomega"
    32  )
    33  
    34  var _ = Describe("Accounts", func() {
    35  	var (
    36  		conn       *accounts.Accounts
    37  		testDbFile *os.File
    38  		sqldb      *sql.DB
    39  	)
    40  
    41  	BeforeEach(func() {
    42  		var err error
    43  		testDbFile, err = os.CreateTemp("", "example")
    44  		Expect(err).ToNot(HaveOccurred())
    45  
    46  		dbData, err := os.ReadFile("test.sqlite")
    47  		Expect(err).ToNot(HaveOccurred())
    48  
    49  		_, err = testDbFile.Write(dbData)
    50  		Expect(err).ToNot(HaveOccurred())
    51  		err = testDbFile.Close()
    52  		Expect(err).ToNot(HaveOccurred())
    53  
    54  		sqldb, err = sql.Open("sqlite3", testDbFile.Name())
    55  		Expect(err).ToNot(HaveOccurred())
    56  
    57  	})
    58  
    59  	AfterEach(func() {
    60  		os.Remove(testDbFile.Name())
    61  	})
    62  
    63  	Describe("GetAccountByClaim", func() {
    64  
    65  		Context("without any joins", func() {
    66  
    67  			BeforeEach(func() {
    68  				var err error
    69  				conn, err = accounts.New("sqlite3", sqldb, false, false, false)
    70  				Expect(err).ToNot(HaveOccurred())
    71  			})
    72  
    73  			It("gets existing account by userid", func() {
    74  				userID := "admin"
    75  				account, err := conn.GetAccountByClaim(context.Background(), "userid", userID)
    76  				Expect(err).ToNot(HaveOccurred())
    77  				Expect(account).ToNot(BeNil())
    78  				Expect(account.ID).To(Equal(uint64(1)))
    79  				Expect(account.Email.String).To(Equal("admin@example.org"))
    80  				Expect(account.UserID).To(Equal("admin"))
    81  				Expect(account.DisplayName.String).To(Equal("admin"))
    82  				Expect(account.Quota.String).To(Equal("100 GB"))
    83  				Expect(account.LastLogin).To(Equal(1619082575))
    84  				Expect(account.Backend).To(Equal(`OC\User\Database`))
    85  				Expect(account.Home).To(Equal("/mnt/data/files/admin"))
    86  				Expect(account.State).To(Equal(int8(1)))
    87  				Expect(account.Username.String).To(Equal("admin"))
    88  				Expect(account.OwnCloudUUID.String).To(Equal("admin"))
    89  			})
    90  
    91  			It("gets existing account by mail", func() {
    92  				value := "admin@example.org"
    93  				account, err := conn.GetAccountByClaim(context.Background(), "mail", value)
    94  				Expect(err).ToNot(HaveOccurred())
    95  				Expect(account).ToNot(BeNil())
    96  				Expect(account.ID).To(Equal(uint64(1)))
    97  				Expect(account.Email.String).To(Equal("admin@example.org"))
    98  				Expect(account.UserID).To(Equal("admin"))
    99  				Expect(account.DisplayName.String).To(Equal("admin"))
   100  				Expect(account.Quota.String).To(Equal("100 GB"))
   101  				Expect(account.LastLogin).To(Equal(1619082575))
   102  				Expect(account.Backend).To(Equal(`OC\User\Database`))
   103  				Expect(account.Home).To(Equal("/mnt/data/files/admin"))
   104  				Expect(account.State).To(Equal(int8(1)))
   105  				Expect(account.Username.String).To(Equal("admin"))
   106  				Expect(account.OwnCloudUUID.String).To(Equal("admin"))
   107  			})
   108  
   109  			It("falls back to user_id colum when getting by username", func() {
   110  				value := "admin"
   111  				account, err := conn.GetAccountByClaim(context.Background(), "username", value)
   112  				Expect(err).ToNot(HaveOccurred())
   113  				Expect(account).ToNot(BeNil())
   114  				Expect(account.ID).To(Equal(uint64(1)))
   115  				Expect(account.Email.String).To(Equal("admin@example.org"))
   116  				Expect(account.UserID).To(Equal("admin"))
   117  				Expect(account.DisplayName.String).To(Equal("admin"))
   118  				Expect(account.Quota.String).To(Equal("100 GB"))
   119  				Expect(account.LastLogin).To(Equal(1619082575))
   120  				Expect(account.Backend).To(Equal(`OC\User\Database`))
   121  				Expect(account.Home).To(Equal("/mnt/data/files/admin"))
   122  				Expect(account.State).To(Equal(int8(1)))
   123  				Expect(account.Username.String).To(Equal("admin"))
   124  				Expect(account.OwnCloudUUID.String).To(Equal("admin"))
   125  			})
   126  
   127  			It("errors on unsupported claim", func() {
   128  				_, err := conn.GetAccountByClaim(context.Background(), "invalid", "invalid")
   129  				Expect(err).To(HaveOccurred())
   130  			})
   131  		})
   132  
   133  		Context("with username joins", func() {
   134  
   135  			BeforeEach(func() {
   136  				var err error
   137  				conn, err = accounts.New("sqlite3", sqldb, true, false, false)
   138  				Expect(err).ToNot(HaveOccurred())
   139  			})
   140  
   141  			It("gets existing account by userid", func() {
   142  				userID := "admin"
   143  				account, err := conn.GetAccountByClaim(context.Background(), "userid", userID)
   144  				Expect(err).ToNot(HaveOccurred())
   145  				Expect(account).ToNot(BeNil())
   146  				Expect(account.ID).To(Equal(uint64(1)))
   147  				Expect(account.Email.String).To(Equal("admin@example.org"))
   148  				Expect(account.UserID).To(Equal("admin"))
   149  				Expect(account.DisplayName.String).To(Equal("admin"))
   150  				Expect(account.Quota.String).To(Equal("100 GB"))
   151  				Expect(account.LastLogin).To(Equal(1619082575))
   152  				Expect(account.Backend).To(Equal(`OC\User\Database`))
   153  				Expect(account.Home).To(Equal("/mnt/data/files/admin"))
   154  				Expect(account.State).To(Equal(int8(1)))
   155  				Expect(account.Username.String).To(Equal("Administrator"))
   156  				Expect(account.OwnCloudUUID.String).To(Equal("admin"))
   157  			})
   158  
   159  			It("gets existing account by mail", func() {
   160  				value := "admin@example.org"
   161  				account, err := conn.GetAccountByClaim(context.Background(), "mail", value)
   162  				Expect(err).ToNot(HaveOccurred())
   163  				Expect(account).ToNot(BeNil())
   164  				Expect(account.ID).To(Equal(uint64(1)))
   165  				Expect(account.Email.String).To(Equal("admin@example.org"))
   166  				Expect(account.UserID).To(Equal("admin"))
   167  				Expect(account.DisplayName.String).To(Equal("admin"))
   168  				Expect(account.Quota.String).To(Equal("100 GB"))
   169  				Expect(account.LastLogin).To(Equal(1619082575))
   170  				Expect(account.Backend).To(Equal(`OC\User\Database`))
   171  				Expect(account.Home).To(Equal("/mnt/data/files/admin"))
   172  				Expect(account.State).To(Equal(int8(1)))
   173  				Expect(account.Username.String).To(Equal("Administrator"))
   174  				Expect(account.OwnCloudUUID.String).To(Equal("admin"))
   175  			})
   176  
   177  			It("gets existing account by username", func() {
   178  				value := "Administrator"
   179  				account, err := conn.GetAccountByClaim(context.Background(), "username", value)
   180  				Expect(err).ToNot(HaveOccurred())
   181  				Expect(account).ToNot(BeNil())
   182  				Expect(account.ID).To(Equal(uint64(1)))
   183  				Expect(account.Email.String).To(Equal("admin@example.org"))
   184  				Expect(account.UserID).To(Equal("admin"))
   185  				Expect(account.DisplayName.String).To(Equal("admin"))
   186  				Expect(account.Quota.String).To(Equal("100 GB"))
   187  				Expect(account.LastLogin).To(Equal(1619082575))
   188  				Expect(account.Backend).To(Equal(`OC\User\Database`))
   189  				Expect(account.Home).To(Equal("/mnt/data/files/admin"))
   190  				Expect(account.State).To(Equal(int8(1)))
   191  				Expect(account.Username.String).To(Equal("Administrator"))
   192  				Expect(account.OwnCloudUUID.String).To(Equal("admin"))
   193  			})
   194  
   195  			It("errors on unsupported claim", func() {
   196  				_, err := conn.GetAccountByClaim(context.Background(), "invalid", "invalid")
   197  				Expect(err).To(HaveOccurred())
   198  			})
   199  		})
   200  
   201  		Context("with uuid joins", func() {
   202  
   203  			BeforeEach(func() {
   204  				var err error
   205  				conn, err = accounts.New("sqlite3", sqldb, false, true, false)
   206  				Expect(err).ToNot(HaveOccurred())
   207  			})
   208  
   209  			It("gets existing account by uuid", func() {
   210  				userID := "7015b5ec-7723-4560-bb96-85e18a947314"
   211  				account, err := conn.GetAccountByClaim(context.Background(), "userid", userID)
   212  				Expect(err).ToNot(HaveOccurred())
   213  				Expect(account).ToNot(BeNil())
   214  				Expect(account.ID).To(Equal(uint64(1)))
   215  				Expect(account.Email.String).To(Equal("admin@example.org"))
   216  				Expect(account.UserID).To(Equal("admin"))
   217  				Expect(account.DisplayName.String).To(Equal("admin"))
   218  				Expect(account.Quota.String).To(Equal("100 GB"))
   219  				Expect(account.LastLogin).To(Equal(1619082575))
   220  				Expect(account.Backend).To(Equal(`OC\User\Database`))
   221  				Expect(account.Home).To(Equal("/mnt/data/files/admin"))
   222  				Expect(account.State).To(Equal(int8(1)))
   223  				Expect(account.Username.String).To(Equal("admin"))
   224  				Expect(account.OwnCloudUUID.String).To(Equal("7015b5ec-7723-4560-bb96-85e18a947314"))
   225  			})
   226  
   227  			It("gets existing account by mail", func() {
   228  				value := "admin@example.org"
   229  				account, err := conn.GetAccountByClaim(context.Background(), "mail", value)
   230  				Expect(err).ToNot(HaveOccurred())
   231  				Expect(account).ToNot(BeNil())
   232  				Expect(account.ID).To(Equal(uint64(1)))
   233  				Expect(account.Email.String).To(Equal("admin@example.org"))
   234  				Expect(account.UserID).To(Equal("admin"))
   235  				Expect(account.DisplayName.String).To(Equal("admin"))
   236  				Expect(account.Quota.String).To(Equal("100 GB"))
   237  				Expect(account.LastLogin).To(Equal(1619082575))
   238  				Expect(account.Backend).To(Equal(`OC\User\Database`))
   239  				Expect(account.Home).To(Equal("/mnt/data/files/admin"))
   240  				Expect(account.State).To(Equal(int8(1)))
   241  				Expect(account.Username.String).To(Equal("admin"))
   242  				Expect(account.OwnCloudUUID.String).To(Equal("7015b5ec-7723-4560-bb96-85e18a947314"))
   243  			})
   244  
   245  			It("gets existing account by username", func() {
   246  				value := "admin"
   247  				account, err := conn.GetAccountByClaim(context.Background(), "username", value)
   248  				Expect(err).ToNot(HaveOccurred())
   249  				Expect(account).ToNot(BeNil())
   250  				Expect(account.ID).To(Equal(uint64(1)))
   251  				Expect(account.Email.String).To(Equal("admin@example.org"))
   252  				Expect(account.UserID).To(Equal("admin"))
   253  				Expect(account.DisplayName.String).To(Equal("admin"))
   254  				Expect(account.Quota.String).To(Equal("100 GB"))
   255  				Expect(account.LastLogin).To(Equal(1619082575))
   256  				Expect(account.Backend).To(Equal(`OC\User\Database`))
   257  				Expect(account.Home).To(Equal("/mnt/data/files/admin"))
   258  				Expect(account.State).To(Equal(int8(1)))
   259  				Expect(account.Username.String).To(Equal("admin"))
   260  				Expect(account.OwnCloudUUID.String).To(Equal("7015b5ec-7723-4560-bb96-85e18a947314"))
   261  			})
   262  
   263  			It("errors on unsupported claim", func() {
   264  				_, err := conn.GetAccountByClaim(context.Background(), "invalid", "invalid")
   265  				Expect(err).To(HaveOccurred())
   266  			})
   267  		})
   268  
   269  		Context("with username and uuid joins", func() {
   270  
   271  			BeforeEach(func() {
   272  				var err error
   273  				conn, err = accounts.New("sqlite3", sqldb, true, true, false)
   274  				Expect(err).ToNot(HaveOccurred())
   275  			})
   276  
   277  			It("gets existing account by uuid", func() {
   278  				userID := "7015b5ec-7723-4560-bb96-85e18a947314"
   279  				account, err := conn.GetAccountByClaim(context.Background(), "userid", userID)
   280  				Expect(err).ToNot(HaveOccurred())
   281  				Expect(account.ID).To(Equal(uint64(1)))
   282  				Expect(account.Email.String).To(Equal("admin@example.org"))
   283  				Expect(account.UserID).To(Equal("admin"))
   284  				Expect(account.DisplayName.String).To(Equal("admin"))
   285  				Expect(account.Quota.String).To(Equal("100 GB"))
   286  				Expect(account.LastLogin).To(Equal(1619082575))
   287  				Expect(account.Backend).To(Equal(`OC\User\Database`))
   288  				Expect(account.Home).To(Equal("/mnt/data/files/admin"))
   289  				Expect(account.State).To(Equal(int8(1)))
   290  				Expect(account.Username.String).To(Equal("Administrator"))
   291  				Expect(account.OwnCloudUUID.String).To(Equal("7015b5ec-7723-4560-bb96-85e18a947314"))
   292  			})
   293  
   294  			It("gets existing account by mail", func() {
   295  				value := "admin@example.org"
   296  				account, err := conn.GetAccountByClaim(context.Background(), "mail", value)
   297  				Expect(err).ToNot(HaveOccurred())
   298  				Expect(account).ToNot(BeNil())
   299  				Expect(account.ID).To(Equal(uint64(1)))
   300  				Expect(account.Email.String).To(Equal("admin@example.org"))
   301  				Expect(account.UserID).To(Equal("admin"))
   302  				Expect(account.DisplayName.String).To(Equal("admin"))
   303  				Expect(account.Quota.String).To(Equal("100 GB"))
   304  				Expect(account.LastLogin).To(Equal(1619082575))
   305  				Expect(account.Backend).To(Equal(`OC\User\Database`))
   306  				Expect(account.Home).To(Equal("/mnt/data/files/admin"))
   307  				Expect(account.State).To(Equal(int8(1)))
   308  				Expect(account.Username.String).To(Equal("Administrator"))
   309  				Expect(account.OwnCloudUUID.String).To(Equal("7015b5ec-7723-4560-bb96-85e18a947314"))
   310  			})
   311  
   312  			It("gets existing account by username", func() {
   313  				value := "Administrator"
   314  				account, err := conn.GetAccountByClaim(context.Background(), "username", value)
   315  				Expect(err).ToNot(HaveOccurred())
   316  				Expect(account).ToNot(BeNil())
   317  				Expect(account.ID).To(Equal(uint64(1)))
   318  				Expect(account.Email.String).To(Equal("admin@example.org"))
   319  				Expect(account.UserID).To(Equal("admin"))
   320  				Expect(account.DisplayName.String).To(Equal("admin"))
   321  				Expect(account.Quota.String).To(Equal("100 GB"))
   322  				Expect(account.LastLogin).To(Equal(1619082575))
   323  				Expect(account.Backend).To(Equal(`OC\User\Database`))
   324  				Expect(account.Home).To(Equal("/mnt/data/files/admin"))
   325  				Expect(account.State).To(Equal(int8(1)))
   326  				Expect(account.Username.String).To(Equal("Administrator"))
   327  				Expect(account.OwnCloudUUID.String).To(Equal("7015b5ec-7723-4560-bb96-85e18a947314"))
   328  			})
   329  
   330  			It("errors on unsupported claim", func() {
   331  				_, err := conn.GetAccountByClaim(context.Background(), "invalid", "invalid")
   332  				Expect(err).To(HaveOccurred())
   333  			})
   334  		})
   335  
   336  	})
   337  
   338  	Describe("FindAccounts", func() {
   339  
   340  		Context("with username and uuid joins", func() {
   341  
   342  			BeforeEach(func() {
   343  				var err error
   344  				conn, err = accounts.New("sqlite3", sqldb, true, true, false)
   345  				Expect(err).ToNot(HaveOccurred())
   346  			})
   347  
   348  			It("finds the existing admin account", func() {
   349  				accounts, err := conn.FindAccounts(context.Background(), "admin")
   350  				Expect(err).ToNot(HaveOccurred())
   351  				Expect(len(accounts)).To(Equal(1))
   352  				Expect(accounts[0]).ToNot(BeNil())
   353  				Expect(accounts[0].ID).To(Equal(uint64(1)))
   354  				Expect(accounts[0].Email.String).To(Equal("admin@example.org"))
   355  				Expect(accounts[0].UserID).To(Equal("admin"))
   356  				Expect(accounts[0].DisplayName.String).To(Equal("admin"))
   357  				Expect(accounts[0].Quota.String).To(Equal("100 GB"))
   358  				Expect(accounts[0].LastLogin).To(Equal(1619082575))
   359  				Expect(accounts[0].Backend).To(Equal(`OC\User\Database`))
   360  				Expect(accounts[0].Home).To(Equal("/mnt/data/files/admin"))
   361  				Expect(accounts[0].State).To(Equal(int8(1)))
   362  				Expect(accounts[0].Username.String).To(Equal("Administrator"))
   363  				Expect(accounts[0].OwnCloudUUID.String).To(Equal("7015b5ec-7723-4560-bb96-85e18a947314"))
   364  			})
   365  
   366  			It("handles query without results", func() {
   367  				accounts, err := conn.FindAccounts(context.Background(), "__notexisting__")
   368  				Expect(err).ToNot(HaveOccurred())
   369  				Expect(len(accounts)).To(Equal(0))
   370  			})
   371  		})
   372  
   373  		Context("with username joins", func() {
   374  
   375  			BeforeEach(func() {
   376  				var err error
   377  				conn, err = accounts.New("sqlite3", sqldb, true, false, false)
   378  				Expect(err).ToNot(HaveOccurred())
   379  			})
   380  
   381  			It("finds the existing admin account", func() {
   382  				accounts, err := conn.FindAccounts(context.Background(), "admin")
   383  				Expect(err).ToNot(HaveOccurred())
   384  				Expect(len(accounts)).To(Equal(1))
   385  				Expect(accounts[0]).ToNot(BeNil())
   386  				Expect(accounts[0].ID).To(Equal(uint64(1)))
   387  				Expect(accounts[0].Email.String).To(Equal("admin@example.org"))
   388  				Expect(accounts[0].UserID).To(Equal("admin"))
   389  				Expect(accounts[0].DisplayName.String).To(Equal("admin"))
   390  				Expect(accounts[0].Quota.String).To(Equal("100 GB"))
   391  				Expect(accounts[0].LastLogin).To(Equal(1619082575))
   392  				Expect(accounts[0].Backend).To(Equal(`OC\User\Database`))
   393  				Expect(accounts[0].Home).To(Equal("/mnt/data/files/admin"))
   394  				Expect(accounts[0].State).To(Equal(int8(1)))
   395  				Expect(accounts[0].Username.String).To(Equal("Administrator"))
   396  				Expect(accounts[0].OwnCloudUUID.String).To(Equal("admin"))
   397  			})
   398  
   399  			It("handles query without results", func() {
   400  				accounts, err := conn.FindAccounts(context.Background(), "__notexisting__")
   401  				Expect(err).ToNot(HaveOccurred())
   402  				Expect(len(accounts)).To(Equal(0))
   403  			})
   404  		})
   405  
   406  		Context("without any joins", func() {
   407  
   408  			BeforeEach(func() {
   409  				var err error
   410  				conn, err = accounts.New("sqlite3", sqldb, false, false, false)
   411  				Expect(err).ToNot(HaveOccurred())
   412  			})
   413  
   414  			It("finds the existing admin account", func() {
   415  				accounts, err := conn.FindAccounts(context.Background(), "admin")
   416  				Expect(err).ToNot(HaveOccurred())
   417  				Expect(len(accounts)).To(Equal(1))
   418  				Expect(accounts[0]).ToNot(BeNil())
   419  				Expect(accounts[0].ID).To(Equal(uint64(1)))
   420  				Expect(accounts[0].Email.String).To(Equal("admin@example.org"))
   421  				Expect(accounts[0].UserID).To(Equal("admin"))
   422  				Expect(accounts[0].DisplayName.String).To(Equal("admin"))
   423  				Expect(accounts[0].Quota.String).To(Equal("100 GB"))
   424  				Expect(accounts[0].LastLogin).To(Equal(1619082575))
   425  				Expect(accounts[0].Backend).To(Equal(`OC\User\Database`))
   426  				Expect(accounts[0].Home).To(Equal("/mnt/data/files/admin"))
   427  				Expect(accounts[0].State).To(Equal(int8(1)))
   428  				Expect(accounts[0].Username.String).To(Equal("admin"))
   429  				Expect(accounts[0].OwnCloudUUID.String).To(Equal("admin"))
   430  			})
   431  
   432  			It("handles query without results", func() {
   433  				accounts, err := conn.FindAccounts(context.Background(), "__notexisting__")
   434  				Expect(err).ToNot(HaveOccurred())
   435  				Expect(len(accounts)).To(Equal(0))
   436  			})
   437  		})
   438  	})
   439  
   440  	Describe("GetAccountGroups", func() {
   441  		BeforeEach(func() {
   442  			var err error
   443  			conn, err = accounts.New("sqlite3", sqldb, true, true, false)
   444  			Expect(err).ToNot(HaveOccurred())
   445  		})
   446  		It("get admin group for admin account", func() {
   447  			accounts, err := conn.GetAccountGroups(context.Background(), "admin")
   448  			Expect(err).ToNot(HaveOccurred())
   449  			Expect(len(accounts)).To(Equal(1))
   450  			Expect(accounts[0]).To(Equal("admin"))
   451  		})
   452  		It("handles not existing account", func() {
   453  			accounts, err := conn.GetAccountGroups(context.Background(), "__notexisting__")
   454  			Expect(err).ToNot(HaveOccurred())
   455  			Expect(len(accounts)).To(Equal(0))
   456  		})
   457  	})
   458  })