Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 70 additions & 40 deletions dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2538,13 +2538,14 @@ static public GXWebComponent getWebComponent(Object caller, string nameSpace, st
{

string url = name;
Object[] actualParms = null;
name = ObjectSignatureFromUrl(url, ctorParms, ref actualParms);
string completeName, queryParameters;
name = ObjectSignatureFromUrl(url, out completeName, out queryParameters);

if (url.Equals(name))
return new GXErrorWebComponent(name);
GXWebComponent webComp = getWebComponent(caller, nameSpace, name, ctorParms);
webComp.setParms(actualParms);
object[] urlParms = webComp.GetParmsFromUrl(completeName, queryParameters);
webComp.setParms(urlParms);
objComponent = webComp;
}
return objComponent;
Expand All @@ -2561,9 +2562,8 @@ private static string CleanObjectFromUrl(string url)
return url;
}

protected static string ObjectSignatureFromUrl(string url, Object[] ctorParms, ref object[] parms)
internal static string ObjectSignatureFromUrl(string url, out string completeName, out string queryParameters)
{
string parameters;
string name;
try
{
Expand All @@ -2572,7 +2572,7 @@ protected static string ObjectSignatureFromUrl(string url, Object[] ctorParms, r
if (!uri.IsAbsoluteUri)
uri = new Uri("http://gxhost/" + url);
name = uri.GetComponents(UriComponents.Path, UriFormat.UriEscaped);
parameters = uri.GetComponents(UriComponents.Query, UriFormat.UriEscaped);
queryParameters = uri.GetComponents(UriComponents.Query, UriFormat.UriEscaped);
}
catch (Exception)
{
Expand All @@ -2583,35 +2583,15 @@ protected static string ObjectSignatureFromUrl(string url, Object[] ctorParms, r
Regex r = new Regex(regexPattern);
Match m = r.Match(url);
name = m.Groups["p0"].Value;
parameters = m.Groups["q0"].Value;
queryParameters = m.Groups["q0"].Value;
}

completeName = name;
if (string.IsNullOrEmpty(name))
return url;

string completeName = name;
if (name.LastIndexOf('.') > 0)
name = name.Substring(0, name.LastIndexOf('.'));

IGxContext context = null;
foreach (object parm in ctorParms)
{
context = parm as IGxContext;
}

string encKey = GXUtil.ParmsEncryptionKey(context);
if (!String.IsNullOrEmpty(parameters))
parameters = GXUtil.DecryptParm(parameters, encKey);

// Remove "salt" part from parameter
if (!String.IsNullOrEmpty(encKey) && !String.IsNullOrEmpty(parameters) && parameters.StartsWith(completeName))
{
parameters = parameters.Substring(completeName.Length);
}
parms = HttpHelper.GetParameterValues(parameters);
for (int i = 0; i < parms.Length; i++)
parms[i] = GXUtil.UrlDecode((string)parms[i]);

return name;
}

Expand Down Expand Up @@ -2752,7 +2732,12 @@ protected void initialize(int objClass, int objId, int dbgLines, long hash)
protected void trkrng(int lineNro, int lineNro2) => dbgInfo?.TrkRng(lineNro, 0, lineNro2, 0);
protected void trkrng(int lineNro, int colNro, int lineNro2, int colNro2) => dbgInfo?.TrkRng(lineNro, colNro, lineNro2, colNro2);
}

public enum EncryptionType
{
SESSION,
SITE,
NONE
}
public abstract class GXWebComponent : GXHttpHandler
{

Expand Down Expand Up @@ -2783,26 +2768,67 @@ public void setjustcreated()

public void setparmsfromurl(string url)
{
Object[] urlParms = null;
GXHttpHandler.ObjectSignatureFromUrl(url, new Object[] { context }, ref urlParms);
if (urlParms != null)
string parameters, completeName;
ObjectSignatureFromUrl(url, out completeName, out parameters);
if (parameters != null)
{
this.setParms(urlParms);
object[] urlParms = GetParmsFromUrl(completeName, parameters);
setParms(urlParms);
}
}

public void setParms(object[] parms)
{
object[] FixedParms = new object[parms.Length];
ParameterInfo[] pars = GetType().GetMethod("execute").GetParameters();
for (int i = 0; i < pars.Length; i++)
if (parms != null)
{
if (i >= parms.Length)
break;
FixedParms[i] = convertparm(pars, i, parms[i]);
object[] FixedParms = new object[parms.Length];
ParameterInfo[] pars = GetType().GetMethod("execute").GetParameters();
for (int i = 0; i < pars.Length; i++)
{
if (i >= parms.Length)
break;
FixedParms[i] = convertparm(pars, i, parms[i]);
}
mFixedParms = FixedParms;
}
mFixedParms = FixedParms;
}
internal object[] GetParmsFromUrl(string completeName, string queryParameters)
{
if (!string.IsNullOrEmpty(queryParameters))
{

EncryptionType keySourceType = GetEncryptionType();
string encKey;
switch (keySourceType)
{
case EncryptionType.SESSION:
encKey = Crypto.Decrypt64(context.GetCookie("GX_SESSION_ID"), Crypto.GetServerKey());
break;
case EncryptionType.SITE:
encKey = Crypto.GetSiteKey();
break;
default:
encKey = null;
break;
}

queryParameters = GXUtil.DecryptParm(queryParameters, encKey);

// Remove "salt" part from parameter
if (!String.IsNullOrEmpty(encKey) && queryParameters.StartsWith(completeName))
{
queryParameters = queryParameters.Substring(completeName.Length);
}
object[] parms = HttpHelper.GetParameterValues(queryParameters);
for (int i = 0; i < parms.Length; i++)
parms[i] = GXUtil.UrlDecode((string)parms[i]);

return parms;
}
else
{
return Array.Empty<Object>();
}
}

public override object getParm(object[] parms, int index)
Expand All @@ -2826,6 +2852,10 @@ public virtual string Name
set { _prefixId = value; }
}

protected virtual EncryptionType GetEncryptionType()
{
return EncryptionType.NONE;
}
public void ComponentInit()
{
IsMain = false;
Expand Down