github.com/cs3org/reva/v2@v2.27.7/tests/integration/grpc/ocm_init_test.go (about) 1 // Copyright 2018-2023 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 grpc_test 20 21 import ( 22 "database/sql" 23 "fmt" 24 "os" 25 "time" 26 27 _ "github.com/go-sql-driver/mysql" 28 "github.com/pkg/errors" 29 30 userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" 31 invitepb "github.com/cs3org/go-cs3apis/cs3/ocm/invite/v1beta1" 32 conversions "github.com/cs3org/reva/v2/pkg/cbox/utils" 33 "github.com/cs3org/reva/v2/tests/helpers" 34 35 . "github.com/onsi/ginkgo/v2" 36 . "github.com/onsi/gomega" 37 ) 38 39 func initData(driver string, tokens []*invitepb.InviteToken, acceptedUsers map[string][]*userpb.User) (map[string]string, func(), error) { 40 variables := map[string]string{ 41 "ocm_driver": driver, 42 } 43 switch driver { 44 case "json": 45 return initJSONData(variables, tokens, acceptedUsers) 46 case "sql": 47 return initSQLData(variables, tokens, acceptedUsers) 48 } 49 50 return nil, nil, errors.New("driver not found") 51 } 52 53 func initJSONData(variables map[string]string, tokens []*invitepb.InviteToken, acceptedUsers map[string][]*userpb.User) (map[string]string, func(), error) { 54 data := map[string]any{} 55 56 if len(tokens) != 0 { 57 m := map[string]*invitepb.InviteToken{} 58 for _, tkn := range tokens { 59 m[tkn.Token] = tkn 60 } 61 data["invites"] = m 62 } 63 64 if len(acceptedUsers) != 0 { 65 data["accepted_users"] = acceptedUsers 66 } 67 68 inviteTokenFile, err := helpers.TempJSONFile(data) 69 if err != nil { 70 return nil, nil, err 71 } 72 cleanup := func() { 73 Expect(os.RemoveAll(inviteTokenFile)).To(Succeed()) 74 } 75 variables["invite_token_file"] = inviteTokenFile 76 return variables, cleanup, nil 77 } 78 79 func initTables(db *sql.DB) error { 80 table1 := ` 81 CREATE TABLE IF NOT EXISTS ocm_tokens ( 82 token VARCHAR(255) NOT NULL PRIMARY KEY, 83 initiator VARCHAR(255) NOT NULL, 84 expiration DATETIME NOT NULL, 85 description VARCHAR(255) DEFAULT NULL 86 )` 87 table2 := ` 88 CREATE TABLE IF NOT EXISTS ocm_remote_users ( 89 initiator VARCHAR(255) NOT NULL, 90 opaque_user_id VARCHAR(255) NOT NULL, 91 idp VARCHAR(255) NOT NULL, 92 email VARCHAR(255) NOT NULL, 93 display_name VARCHAR(255) NOT NULL, 94 PRIMARY KEY (initiator, opaque_user_id, idp) 95 )` 96 if _, err := db.Exec(table1); err != nil { 97 return err 98 } 99 if _, err := db.Exec(table2); err != nil { 100 return err 101 } 102 return nil 103 } 104 105 func dropTables(db *sql.DB) error { 106 drop1 := "DROP TABLE IF EXISTS ocm_tokens" 107 drop2 := "DROP TABLE IF EXISTS ocm_remote_users" 108 if _, err := db.Exec(drop1); err != nil { 109 return err 110 } 111 if _, err := db.Exec(drop2); err != nil { 112 return err 113 } 114 return nil 115 } 116 117 func initSQLData(variables map[string]string, tokens []*invitepb.InviteToken, acceptedUsers map[string][]*userpb.User) (map[string]string, func(), error) { 118 username := os.Getenv("SQL_USERNAME") 119 if username == "" { 120 Fail("SQL_USERNAME not set") 121 } 122 password := os.Getenv("SQL_PASSWORD") 123 if password == "" { 124 Fail("SQL_PASSWORD not set") 125 } 126 address := os.Getenv("SQL_ADDRESS") 127 if address == "" { 128 Fail("SQL_ADDRESS not set") 129 } 130 database := os.Getenv("SQL_DBNAME") 131 if database == "" { 132 Fail("SQL_DBNAME not set") 133 } 134 135 db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s", username, password, address, database)) 136 if err != nil { 137 return nil, nil, err 138 } 139 if err := initTables(db); err != nil { 140 return nil, nil, err 141 } 142 cleanup := func() { 143 Expect(dropTables(db)).To(Succeed()) 144 } 145 146 variables["db_username"] = username 147 variables["db_password"] = password 148 variables["db_address"] = address 149 variables["db_name"] = database 150 151 if err := initTokens(db, tokens); err != nil { 152 return nil, nil, err 153 } 154 if err := initAcceptedUsers(db, acceptedUsers); err != nil { 155 return nil, nil, err 156 } 157 158 return variables, cleanup, nil 159 } 160 161 func initTokens(db *sql.DB, tokens []*invitepb.InviteToken) error { 162 query := "INSERT INTO ocm_tokens (token, initiator, expiration, description) VALUES (?,?,?,?)" 163 for _, token := range tokens { 164 if _, err := db.Exec(query, token.Token, conversions.FormatUserID(token.UserId), time.Unix(int64(token.Expiration.Seconds), 0), token.Description); err != nil { 165 return err 166 } 167 } 168 return nil 169 } 170 171 func initAcceptedUsers(db *sql.DB, acceptedUsers map[string][]*userpb.User) error { 172 query := "INSERT INTO ocm_remote_users (initiator, opaque_user_id, idp, email, display_name) VALUES (?,?,?,?,?)" 173 for initiator, users := range acceptedUsers { 174 for _, user := range users { 175 if _, err := db.Exec(query, initiator, user.Id.OpaqueId, user.Id.Idp, user.Mail, user.DisplayName); err != nil { 176 return err 177 } 178 } 179 } 180 return nil 181 }