From 7be17a3a571440ed8472b8b40b289cbe42115465 Mon Sep 17 00:00:00 2001 From: yabwon Date: Wed, 8 Sep 2021 11:55:54 +0200 Subject: [PATCH] GSM, version 0.14: GSM, version 0.14: - new parameter `encodingRestricted` added - testing extended (runs for up to 600 macros, ~15kb each) --- README.md | 4 +-- packages/README.md | 4 +-- packages/SHA256_for_packages.txt | 3 +++ packages/gsm.md | 42 ++++++++++++++++++------------- packages/gsm.zip | Bin 15192 -> 15408 bytes 5 files changed, 31 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index e7a25ab..dd2f76f 100644 --- a/README.md +++ b/README.md @@ -162,12 +162,12 @@ SHA256 digest for BasePlus: C9D26CAC2504634EF25F02B5BD04596B2F873E3C25E8CEDDD7F4 [Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md "Documentation for BasePlus") -- **GSM** (Generate Secure Macros)\[0.13\], package allows +- **GSM** (Generate Secure Macros)\[0.14\], package allows to create secured macros stored in SAS Proc FCMP functions. The dataset with functions can be shared between different operating systems and allows to generate macros on site without showing their code. -SHA256 digest for GSM: 2FC239B5A2216D073826125999BFD64FBA32BFEA3EE6EA2B22EC64E8C1B04144 +SHA256 digest for GSM: 93D88D4465B68984E938212241DE55C7B12EBC20601538553AC9E1AC0628C006 [Documentation for GSM](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/gsm.md "Documentation for GSM") diff --git a/packages/README.md b/packages/README.md index 8196de5..aa9ec2c 100644 --- a/packages/README.md +++ b/packages/README.md @@ -110,12 +110,12 @@ SHA256 digest for BasePlus: C9D26CAC2504634EF25F02B5BD04596B2F873E3C25E8CEDDD7F4 --- -- **GSM** (Generate Secure Macros)\[0.13\], package allows +- **GSM** (Generate Secure Macros)\[0.14\], package allows to create secured macros stored in SAS Proc FCMP functions. The dataset with functions can be shared between different operating systems and allows to generate macros on site without showing their code. -SHA256 digest for GSM: 2FC239B5A2216D073826125999BFD64FBA32BFEA3EE6EA2B22EC64E8C1B04144 +SHA256 digest for GSM: 93D88D4465B68984E938212241DE55C7B12EBC20601538553AC9E1AC0628C006 [Documentation for GSM](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/gsm.md "Documentation for GSM") diff --git a/packages/SHA256_for_packages.txt b/packages/SHA256_for_packages.txt index 0ca9136..d3e54d2 100644 --- a/packages/SHA256_for_packages.txt +++ b/packages/SHA256_for_packages.txt @@ -1,3 +1,6 @@ +/* 20210908 */ +GSM: 93D88D4465B68984E938212241DE55C7B12EBC20601538553AC9E1AC0628C006 + /* 20210818 */ BasePlus: C9D26CAC2504634EF25F02B5BD04596B2F873E3C25E8CEDDD7F496A78B184E9F diff --git a/packages/gsm.md b/packages/gsm.md index 80f6391..0bdc973 100644 --- a/packages/gsm.md +++ b/packages/gsm.md @@ -8,7 +8,7 @@ --- -# The GSM package [ver. 0.13] ############################################### +# The GSM package [ver. 0.14] ############################################### The **GSM** (a.k.a. *Generate Secure Macros*) package allows to create secured macros stored in SAS Proc FCMP functions. @@ -44,12 +44,12 @@ See examples for more details. *How to use it:* - - Copy all files with your macros into a directory. + - Copy all files with your secured macros code into a directory. Best approach is to have one file for one macro. - - Copy a path the directory. + - Copy a path to the directory. - Run the following code: ``` - %GSM(, cmplib=) + %GSM(, cmplib=) ``` - Share generated `ZIP` file (unzip and run the code). @@ -68,7 +68,7 @@ Required SAS Components: * SAS package generated by generatePackage, version 20210528 * The SHA256 hash digest for package BasePlus: -`2FC239B5A2216D073826125999BFD64FBA32BFEA3EE6EA2B22EC64E8C1B04144` +`93D88D4465B68984E938212241DE55C7B12EBC20601538553AC9E1AC0628C006` ## >>> `%GSM()` macro: <<< ####################### @@ -114,27 +114,33 @@ The basic syntax is the following, the `<...>` means optional parameters: <,cmplib=work.generateMacros> <,source2=> <,outpath=> + <,encodingRestricted=> ) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Arguments description**: -1. `path` - *Required*, indicates a directory which contains files with macros. - Only files with `sas` extension are used. +1. `path` - *Required*, indicates a directory which contains files with macros. + Only files with `sas` extension are used. -* `trim=` - *Optional*, the default value is `0`. - If set to `1` then lines of macro code are trimmed. - If set to `2` then lines of macro code are stripped. +* `trim=` - *Optional*, the default value is `0`. + If set to `1` then lines of macro code are trimmed. + If set to `2` then lines of macro code are stripped. -* `cmplib=` - *Optional*, the default value is `work.generateMacros`. - Names the dataset which will contain generated functions. +* `cmplib=` - *Optional*, the default value is `work.generateMacros`. + Names the dataset which will contain generated functions. -* `source2=` - *Optional*, the default value is null. - Indicate if `%includ`-ed files are printed out. - Any value other than null enables printing. +* `source2=` - *Optional*, the default value is null. + Indicate if `%includ`-ed files are printed out. + Any value other than null enables printing. -* `outpath=` - *Optional*, the default value is set the same as the `path`. - Points a directory in which a result (a zip file) is generated. +* `outpath=` - *Optional*, the default value is set the same as the `path`. + Points a directory in which a result (a zip file) is generated. + +* `encodingRestricted=` - *Optional*, the default value is `0`. + If set to 1 then if User session encoding is different from + encoding of the session which generates the dataset then + the generateMacros() function will not execute macro code. --- @@ -237,7 +243,7 @@ The basic syntax is the following, the `<...>` means optional parameters: ## License #################################################################### -Copyright (c) 2021 Bartosz Jablonski +Copyright (c) Bartosz Jablonski, since 2021 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/gsm.zip b/packages/gsm.zip index bb0273f637c5b0f2b47f803916097e0a1b69c6c3..836b08a2e9378876278eca0f8ca52db8fd5bcca7 100644 GIT binary patch delta 11835 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 delta 11654 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 MhzecI`w#Gc0ZrNO4FCWD