github.com/0chain/gosdk@v1.17.11/winsdk/sdk.go (about)

     1  package main
     2  
     3  /*
     4  #include <stdlib.h>
     5  */
     6  import (
     7  	"C"
     8  )
     9  
    10  import (
    11  	"encoding/json"
    12  	"errors"
    13  	"os"
    14  	"path"
    15  
    16  	"github.com/0chain/gosdk/zboxapi"
    17  	"github.com/0chain/gosdk/zboxcore/client"
    18  	l "github.com/0chain/gosdk/zboxcore/logger"
    19  	"github.com/0chain/gosdk/zboxcore/sdk"
    20  	"github.com/0chain/gosdk/zboxcore/zboxutil"
    21  	"github.com/0chain/gosdk/zcncore"
    22  
    23  	"github.com/0chain/gosdk/core/conf"
    24  	"github.com/0chain/gosdk/core/encryption"
    25  	"github.com/0chain/gosdk/core/logger"
    26  	"github.com/0chain/gosdk/core/sys"
    27  	"github.com/0chain/gosdk/core/zcncrypto"
    28  )
    29  
    30  var log logger.Logger
    31  
    32  func main() {
    33  }
    34  
    35  // SetLogFile - set log file
    36  // ## Inputs
    37  //   - file: the full path of log file
    38  //
    39  //export SetLogFile
    40  func SetLogFile(file *C.char) *C.char {
    41  	defer func() {
    42  		if r := recover(); r != nil {
    43  			log.Error("win: crash ", r)
    44  		}
    45  	}()
    46  
    47  	f, err := os.OpenFile(C.GoString(file), os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
    48  	if err != nil {
    49  		return WithJSON(false, err)
    50  	}
    51  
    52  	sdk.GetLogger().SetLevel(logger.DEBUG)
    53  	sdk.GetLogger().SetLogFile(f, true)
    54  
    55  	zcncore.GetLogger().SetLevel(logger.DEBUG)
    56  	zcncore.GetLogger().SetLogFile(f, true)
    57  
    58  	zboxutil.GetLogger().SetLevel(logger.DEBUG)
    59  	zboxutil.GetLogger().SetLogFile(f, true)
    60  
    61  	zboxapi.GetLogger().SetLevel(logger.DEBUG)
    62  	zboxapi.GetLogger().SetLogFile(f, true)
    63  
    64  	log.SetLogFile(f, true)
    65  	log.SetLevel(logger.DEBUG)
    66  
    67  	return WithJSON(true, nil)
    68  }
    69  
    70  // InitSDKs - init zcncore sdk and zboxapi client from config
    71  //   - configJson
    72  //     {
    73  //     "block_worker": "https://dev.0chain.net/dns",
    74  //     "signature_scheme": "bls0chain",
    75  //     "min_submit": 50,
    76  //     "min_confirmation": 50,
    77  //     "confirmation_chain_length": 3,
    78  //     "max_txn_query": 5,
    79  //     "query_sleep_time": 5,
    80  //     "preferred_blobbers": ["https://dev.0chain.net/blobber02","https://dev.0chain.net/blobber03"],
    81  //     "chain_id":"0afc093ffb509f059c55478bc1a60351cef7b4e9c008a53a6cc8241ca8617dfe",
    82  //     "ethereum_node":"https://ropsten.infura.io/v3/xxxxxxxxxxxxxxx",
    83  //     "zbox_host":"https://0box.dev.0chain.net",
    84  //     "zbox_app_type":"vult",
    85  //     "sharder_consensous": 2,
    86  //     }
    87  //
    88  //export InitSDKs
    89  func InitSDKs(configJson *C.char) *C.char {
    90  	defer func() {
    91  		if r := recover(); r != nil {
    92  			log.Error("win: crash ", r)
    93  		}
    94  	}()
    95  
    96  	l.Logger.Info("Start InitSDKs")
    97  
    98  	configJs := C.GoString(configJson)
    99  
   100  	configObj := &conf.Config{}
   101  
   102  	l.Logger.Info("cfg: ", configJs)
   103  	err := json.Unmarshal([]byte(configJs), configObj)
   104  	if err != nil {
   105  		l.Logger.Error(err)
   106  		return WithJSON(false, err)
   107  	}
   108  
   109  	err = zcncore.InitZCNSDK(configObj.BlockWorker, configObj.SignatureScheme, func(cc *zcncore.ChainConfig) error {
   110  		cc.BlockWorker = configObj.BlockWorker
   111  		cc.ChainID = configObj.ChainID
   112  		cc.ConfirmationChainLength = configObj.ConfirmationChainLength
   113  		cc.MinConfirmation = configObj.MinConfirmation
   114  		cc.EthNode = configObj.EthereumNode
   115  		cc.MinSubmit = configObj.MinSubmit
   116  		cc.SharderConsensous = configObj.SharderConsensous
   117  		cc.SignatureScheme = configObj.SignatureScheme
   118  
   119  		return nil
   120  	})
   121  	if err != nil {
   122  		l.Logger.Error(err, configJs)
   123  		return WithJSON(false, err)
   124  	}
   125  
   126  	l.Logger.Info("InitZCNSDK success")
   127  	l.Logger.Info(configObj.BlockWorker)
   128  	l.Logger.Info(configObj.ChainID)
   129  	l.Logger.Info(configObj.SignatureScheme)
   130  	l.Logger.Info(configObj.PreferredBlobbers)
   131  
   132  	if zboxApiClient == nil {
   133  		zboxApiClient = zboxapi.NewClient()
   134  	}
   135  
   136  	zboxApiClient.SetRequest(configObj.ZboxHost, configObj.ZboxAppType)
   137  	l.Logger.Info("Init ZBoxAPI Client success")
   138  
   139  	return WithJSON(true, nil)
   140  }
   141  
   142  // InitWallet - init wallet for storage sdk and zboxapi client
   143  //   - clientJson
   144  //     {
   145  //     "client_id":"8f6ce6457fc04cfb4eb67b5ce3162fe2b85f66ef81db9d1a9eaa4ffe1d2359e0",
   146  //     "client_key":"c8c88854822a1039c5a74bdb8c025081a64b17f52edd463fbecb9d4a42d15608f93b5434e926d67a828b88e63293b6aedbaf0042c7020d0a96d2e2f17d3779a4",
   147  //     "keys":[
   148  //     {
   149  //     "public_key":"c8c88854822a1039c5a74bdb8c025081a64b17f52edd463fbecb9d4a42d15608f93b5434e926d67a828b88e63293b6aedbaf0042c7020d0a96d2e2f17d3779a4",
   150  //     "private_key":"72f480d4b1e7fb76e04327b7c2348a99a64f0ff2c5ebc3334a002aa2e66e8506"
   151  //     }],
   152  //     "mnemonics":"abandon mercy into make powder fashion butter ignore blade vanish plastic shock learn nephew matrix indoor surge document motor group barely offer pottery antenna",
   153  //     "version":"1.0",
   154  //     "date_created":"1668667145",
   155  //     "nonce":0
   156  //     }
   157  //
   158  //export InitWallet
   159  func InitWallet(clientJson *C.char) *C.char {
   160  	defer func() {
   161  		if r := recover(); r != nil {
   162  			log.Error("win: crash ", r)
   163  		}
   164  	}()
   165  	l.Logger.Info("Start InitStorageSDK")
   166  
   167  	clientJs := C.GoString(clientJson)
   168  
   169  	configObj, err := conf.GetClientConfig()
   170  	if err != nil {
   171  		l.Logger.Error(err)
   172  		return WithJSON(false, err)
   173  	}
   174  
   175  	err = sdk.InitStorageSDK(clientJs, configObj.BlockWorker, configObj.ChainID, configObj.SignatureScheme, configObj.PreferredBlobbers, 0)
   176  	if err != nil {
   177  		l.Logger.Error(err, clientJs)
   178  		return WithJSON(false, err)
   179  	}
   180  	l.Logger.Info("InitStorageSDK success")
   181  
   182  	c := client.GetClient()
   183  	if c != nil {
   184  		zboxApiClient.SetWallet(client.GetClientID(), client.GetClientPrivateKey(), client.GetClientPublicKey())
   185  		l.Logger.Info("InitZboxApiClient success")
   186  	} else {
   187  		l.Logger.Info("InitZboxApiClient skipped")
   188  	}
   189  
   190  	l.Logger.Info("InitSDKs successful")
   191  	return WithJSON(true, nil)
   192  }
   193  
   194  var ErrInvalidSignatureScheme = errors.New("invalid_signature_scheme")
   195  
   196  // SignRequest sign data with private key and scheme
   197  //
   198  //	return
   199  //		{
   200  //			"error":"",
   201  //			"result":"xxx",
   202  //		}
   203  //
   204  //export SignRequest
   205  func SignRequest(privateKey, signatureScheme, data *C.char) *C.char {
   206  	defer func() {
   207  		if r := recover(); r != nil {
   208  			log.Error("win: crash ", r)
   209  		}
   210  	}()
   211  	key := C.GoString(privateKey)
   212  	scheme := C.GoString(signatureScheme)
   213  	d := C.GoString(data)
   214  
   215  	hash := encryption.Hash(d)
   216  
   217  	return WithJSON(sys.Sign(hash, scheme, []sys.KeyPair{{
   218  		PrivateKey: key,
   219  	}}))
   220  }
   221  
   222  // VerifySignature verify signature with public key, schema and data
   223  // return
   224  //
   225  //	{
   226  //		"error":"",
   227  //		"result":true,
   228  //	}
   229  //
   230  //export VerifySignature
   231  func VerifySignature(publicKey, signatureScheme string, data string, signature string) *C.char {
   232  	defer func() {
   233  		if r := recover(); r != nil {
   234  			log.Error("win: crash ", r)
   235  		}
   236  	}()
   237  	hash := encryption.Hash(data)
   238  
   239  	signScheme := zcncrypto.NewSignatureScheme(signatureScheme)
   240  	if signScheme != nil {
   241  		err := signScheme.SetPublicKey(publicKey)
   242  		if err != nil {
   243  			return WithJSON(false, err)
   244  		}
   245  		return WithJSON(signScheme.Verify(signature, hash))
   246  	}
   247  	return WithJSON(false, ErrInvalidSignatureScheme)
   248  }
   249  
   250  // CryptoJsEncrypt encrypt message with AES+CCB
   251  //
   252  //	return
   253  //		{
   254  //			"error":"",
   255  //			"result":"xxx",
   256  //		}
   257  //
   258  //export CryptoJsEncrypt
   259  func CryptoJsEncrypt(passphrase, message *C.char) *C.char {
   260  	defer func() {
   261  		if r := recover(); r != nil {
   262  			log.Error("win: crash ", r)
   263  		}
   264  	}()
   265  	pass := C.GoString(passphrase)
   266  	msg := C.GoString(message)
   267  
   268  	return WithJSON(zcncore.CryptoJsEncrypt(pass, msg))
   269  }
   270  
   271  // CryptoJsDecrypt decrypt message with AES+CCB
   272  //
   273  //	return
   274  //		{
   275  //			"error":"",
   276  //			"result":"xxx",
   277  //		}
   278  //
   279  //export CryptoJsDecrypt
   280  func CryptoJsDecrypt(passphrase, encryptedMessage *C.char) *C.char {
   281  	defer func() {
   282  		if r := recover(); r != nil {
   283  			log.Error("win: crash ", r)
   284  		}
   285  	}()
   286  	pass := C.GoString(passphrase)
   287  	msg := C.GoString(encryptedMessage)
   288  
   289  	return WithJSON(zcncore.CryptoJsDecrypt(pass, msg))
   290  }
   291  
   292  // GetPublicEncryptionKey get public encryption key by mnemonic
   293  //
   294  //	return
   295  //		{
   296  //			"error":"",
   297  //			"result":"xxxx",
   298  //		}
   299  //
   300  //export GetPublicEncryptionKey
   301  func GetPublicEncryptionKey(mnemonics *C.char) *C.char {
   302  	defer func() {
   303  		if r := recover(); r != nil {
   304  			log.Error("win: crash ", r)
   305  		}
   306  	}()
   307  	m := C.GoString(mnemonics)
   308  	return WithJSON(zcncore.GetPublicEncryptionKey(m))
   309  }
   310  
   311  // GetLookupHash get lookup hash with allocation id and path
   312  // ## Inputs:
   313  //   - allocationID
   314  //   - path
   315  //     return
   316  //     {
   317  //     "error":"",
   318  //     "result":"xxxx",
   319  //     }
   320  //
   321  //export GetLookupHash
   322  func GetLookupHash(allocationID *C.char, path *C.char) *C.char {
   323  	defer func() {
   324  		if r := recover(); r != nil {
   325  			log.Error("win: crash ", r)
   326  		}
   327  	}()
   328  	hash := getLookupHash(C.GoString(allocationID), C.GoString(path))
   329  	return WithJSON(hash, nil)
   330  }
   331  
   332  // SetFFmpeg set the full file name of ffmpeg.exe
   333  // ## Inputs:
   334  //   - fullFileName
   335  //     return
   336  //     {
   337  //     "error":"",
   338  //     "result":true,
   339  //     }
   340  //
   341  //export SetFFmpeg
   342  func SetFFmpeg(fullFileName *C.char) *C.char {
   343  	defer func() {
   344  		if r := recover(); r != nil {
   345  			log.Error("win: crash ", r)
   346  		}
   347  	}()
   348  	f := C.GoString(fullFileName)
   349  
   350  	_, err := os.Stat(f)
   351  	if os.IsNotExist(err) {
   352  		return WithJSON(false, err)
   353  	}
   354  	sdk.CmdFFmpeg = C.GoString(fullFileName)
   355  	return WithJSON(true, nil)
   356  }
   357  
   358  // GetFileContentType get content/MIME type of file
   359  // ## Inputs:
   360  //   - fullFileName
   361  //     return
   362  //     {
   363  //     "error":"",
   364  //     "result":true,
   365  //     }
   366  //
   367  //export GetFileContentType
   368  func GetFileContentType(file *C.char) *C.char {
   369  	defer func() {
   370  		if r := recover(); r != nil {
   371  			log.Error("win: crash ", r)
   372  		}
   373  	}()
   374  	fileName := C.GoString(file)
   375  	f, err := os.Open(fileName)
   376  	if err != nil {
   377  		log.Error("win: ", err)
   378  		return WithJSON("", err)
   379  	}
   380  	defer f.Close()
   381  
   382  	mime, err := zboxutil.GetFileContentType(path.Ext(fileName), f)
   383  	if err != nil {
   384  		return WithJSON("", err)
   385  	}
   386  
   387  	return WithJSON(mime, nil)
   388  }