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  }