Skip to content

Commit

Permalink
#870 Nuget push
Browse files Browse the repository at this point in the history
  • Loading branch information
zhabis committed Jul 21, 2023
1 parent c89092f commit 04fac45
Show file tree
Hide file tree
Showing 6 changed files with 127 additions and 10 deletions.
4 changes: 2 additions & 2 deletions elm/build/build-packages.cmd
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
@echo on

set VER=3.6.0.3
set HEADLINE=Decipher null check
set VER=3.6.0.5
set HEADLINE=Base64 leading spaces
call build-all Release %VER%

if errorlevel 1 goto BUILD_ERROR
Expand Down
22 changes: 17 additions & 5 deletions src/Azos/Conf/MacroRunner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -151,16 +151,28 @@ public virtual string Macro_decipher(IConfigSectionNode node, string inputValue,
}

var algorithmName = macroParams.ValOf("algo", "alg", "a", "algorithm");//this may be blank
var toString = macroParams.Of("string", "str", "text", "txt").ValueAsBool(false);//true to decode into string vs base:64 byte array
var required = macroParams.Of("req", "require", "required").ValueAsBool(true);
var allowFailure = macroParams.Of("allow-failure").ValueAsBool(false);
var toString = macroParams.Of("string", "str", "text", "txt").ValueAsBool(false);//true to decode into string vs base:64 byte array

var result = Security.TheSafe.DecipherConfigValue(inputValue, toString, algorithmName);
if (inputValue.IsNotNullOrWhiteSpace())
{
var result = Security.TheSafe.DecipherConfigValue(inputValue, toString, algorithmName);

if (result == null && !allowFailure)
{
throw new ConfigException(StringConsts.CONFIG_MACRO_DECIPHER_FAILURE_ERROR.Args(inputValue.TakeFirstChars(8), inputValue.Length, node.RootPath));
}

return result;
}

if (result == null && !macroParams.Of("allow-failure").ValueAsBool(false))
if (required)
{
throw new ConfigException(StringConsts.CONFIG_MACRO_DECIPHER_FAILURE_ERROR.Args(node.RootPath));
throw new ConfigException(StringConsts.CONFIG_MACRO_DECIPHER_RQUIRED_ERROR.Args(node.RootPath));
}

return result;
return null;
}
}

Expand Down
8 changes: 6 additions & 2 deletions src/Azos/Data/StringValueConversion.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,13 @@ public static byte[] AsByteArray(this string val, byte[] dflt = null)
if (val == null) return dflt;
try
{
if (val.Length > BASE64_VALUE_PREFIX.Length && val.StartsWith(BASE64_VALUE_PREFIX, StringComparison.OrdinalIgnoreCase))
if (val.Length > BASE64_VALUE_PREFIX.Length)
{
return val.Substring(BASE64_VALUE_PREFIX.Length).FromWebSafeBase64();
var pp = val.GetPrefixedPart(BASE64_VALUE_PREFIX, StringComparison.OrdinalIgnoreCase);
if (pp.part.IsNotNullOrWhiteSpace())
{
return pp.part.FromWebSafeBase64();
}
}

var result = new List<byte>();
Expand Down
34 changes: 34 additions & 0 deletions src/Azos/StrUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -554,6 +554,40 @@ public static KeyValuePair<string, string> SplitKVP(this string src, char delimi
return new KeyValuePair<string, string>(src, string.Empty);
}

/// <summary>
/// Returns an index of a starting segment (a prefix) in a string, bypassing all of
/// the following white characters (space, tab, return, LF) before the prefix.
/// Returns -1 if the string does not have a prefix or is null or whitespace
/// </summary>
public static int IndexOfPrefix(this string str, string pfx, StringComparison comp = StringComparison.Ordinal)
{
if (str.IsNullOrWhiteSpace()) return -1;
if (pfx.IsNullOrWhiteSpace()) return -1;

for(var i=0; i < str.Length; i++)
{
var c = str[i];
if (c is ' ' or '\t' or '\r' or '\n') continue;
if (str.IndexOf(pfx, i, comp) == i) return i;
return -1;
}

return -1;
}

/// <summary>
/// Tries to find a prefix bypassing whitespace characters in the beginning, then returns a prefixed remaining part
/// along with prefix index start. Returns (-1, null) if not found <seealso cref="IndexOfPrefix(string, string, StringComparison)"/>
/// </summary>
public static (int idxPfx, string part) GetPrefixedPart(this string str, string pfx, StringComparison comp = StringComparison.Ordinal)
{
var idx = str.IndexOfPrefix(pfx, comp);
if (idx < 0) return (-1, null);
var part = str.Substring(idx + pfx.Length);
return (idx, part);
}


/// <summary>
/// Provides string to byte[] conversion using a rented buffer.
/// You must release the common buffer back by calling TextBytes.Dispose().
Expand Down
3 changes: 2 additions & 1 deletion src/Azos/StringConsts_eng.cs
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,8 @@ Revise app container allocation logic which is usually at the app entry point.
public const string CONFIG_NO_PROVIDER_LOAD_FORMAT_ERROR =
"No configuration provider can open content supplied in this format: ";

public const string CONFIG_MACRO_DECIPHER_FAILURE_ERROR = "Could not `::decipher` the value around `{0}`. Check safe keys";
public const string CONFIG_MACRO_DECIPHER_FAILURE_ERROR = "Could not `::decipher` the value `{0}...`[{1}] around `{2}`. Check safe keys";
public const string CONFIG_MACRO_DECIPHER_RQUIRED_ERROR = "Missing required value for `::decipher` around `{0}`";

public const string CONFIG_VARS_EVAL_ERROR =
"Configuration variable '{0}' evaluation error: {1}";
Expand Down
66 changes: 66 additions & 0 deletions src/testing/Azos.Tests.Nub/StrUtilsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -293,5 +293,71 @@ public void SplitKVP_8()
[Run] public void TakeLastSegment_4() => Aver.AreEqual("here", "snake.zhaba/here".TakeLastSegment('/'));
[Run] public void TakeLastSegment_5() => Aver.AreEqual("zhaba/here", "snake.zhaba/here".TakeLastSegment('.'));


[Run]
public void IndexOfPrefix_0()
{
string v = null;
string p = null;
Aver.AreEqual(-1, v.IndexOfPrefix(p));

p = "a";
Aver.AreEqual(-1, v.IndexOfPrefix(p));

v = "abc";
p = null;
Aver.AreEqual(-1, v.IndexOfPrefix(p));

v = " ";
p = null;
Aver.AreEqual(-1, v.IndexOfPrefix(p));

v = null;
p = " ";
Aver.AreEqual(-1, v.IndexOfPrefix(p));
}

[Run]
public void IndexOfPrefix_1()
{
Aver.AreEqual(-1, " base64:fada".IndexOfPrefix("base65"));
Aver.AreEqual(-1, " base64:fada".IndexOfPrefix("base64="));
Aver.AreEqual(0, "base64:fada".IndexOfPrefix("base64"));
Aver.AreEqual(0, "base64:fada".IndexOfPrefix("base64:"));
Aver.AreEqual(0, "base64:fada".IndexOfPrefix("base64:fada"));
Aver.AreEqual(-1, "base64:fada".IndexOfPrefix("base64:fadaBa"));

Aver.AreEqual(3, " base64:fada".IndexOfPrefix("base64:"));
Aver.AreEqual(11, " \t \r\r \n base64:fada".IndexOfPrefix("base64:"));
Aver.AreEqual(11, " \t \r\r \n base64:fada".IndexOfPrefix("base64"));
}

[Run]
public void GetPrefixedPart_1()
{
Aver.AreEqual(-1, " base64:fada".GetPrefixedPart("base65").idxPfx);
Aver.AreEqual(-1, " base64:fada".GetPrefixedPart("base64=").idxPfx);

Aver.AreEqual(0, "base64:fada".GetPrefixedPart("base64").idxPfx);
Aver.AreEqual(":fada", "base64:fada".GetPrefixedPart("base64").part);

Aver.AreEqual(0, "base64:fada".GetPrefixedPart("base64:").idxPfx);
Aver.AreEqual("fada", "base64:fada".GetPrefixedPart("base64:").part);

Aver.AreEqual(0, "base64:fada".GetPrefixedPart("base64:fada").idxPfx);
Aver.AreEqual("", "base64:fada".GetPrefixedPart("base64:fada").part);

Aver.AreEqual(-1, "base64:fada".GetPrefixedPart("base64:fadaBa").idxPfx);

Aver.AreEqual(3, " base64:fada".GetPrefixedPart("base64:").idxPfx);
Aver.AreEqual("fada", " base64:fada".GetPrefixedPart("base64:").part);

Aver.AreEqual(11, " \t \r\r \n base64:fada".GetPrefixedPart("base64:").idxPfx);
Aver.AreEqual("fada", " \t \r\r \n base64:fada".GetPrefixedPart("base64:").part);

Aver.AreEqual(11, " \t \r\r \n base64:fada".GetPrefixedPart("base64").idxPfx);
Aver.AreEqual(":fada", " \t \r\r \n base64:fada".GetPrefixedPart("base64").part);
}

}
}

0 comments on commit 04fac45

Please sign in to comment.