A true horror. There were elections in Poland recently... and a software which was supposed to help in counting votes hasn't been working. It came out, that one day BEFORE elections it's source code was released to public on GitHub. It is full of security holes... In an availible manual there is a screenshot with actual login info and basically anyone can log in and manipulate results. The code looks like it was written by a single student who learns c#.
... and it doesn't work, also. It is a few days after elections and still no results. Here are some samples:
a constructor of an apparently important class ProtocolForm
public ProtocolForm(ProtocolsList form, XmlDocument header, string protocolDefinition, string candidates, string committee, string validateDefinition, string save, string OU, string licensePath, string version)
this.InitializeComponent();
this.tooltipErrors = new ToolTip();
this.isKLKCan = true;
this.isKLK = true;
this.isKLKPro = true;
this.isKLKWali = true;
...
string[] p = protocolDefinition.Split(new char[]
{
'\\'
});
this.protocolDefinitionName = p[p.Length - 1].Replace('_', '/').Replace(".xml", "");
string[] p2 = candidates.Split(new char[]
{
'\\'
});
this.candidatesName = p2[p2.Length - 1].Replace('_', '/').Replace(".xml", "");
string[] p3 = committee.Split(new char[]
{
'\\'
});
... (~100 lines)
foreach (XmlNode xObwod in headerRoot)
{
if (xObwod.Attributes["nr"].InnerText == obwod)
{
foreach (XmlNode xInst in xObwod)
{
if (xInst.Attributes["kod"].InnerText == inst)
{
foreach (XmlNode xobw in xInst)
{
if (xobw.Attributes["nr"].InnerText == okreg && System.Convert.ToInt32(xInst.Attributes["inst_jns"].InnerText) == System.Convert.ToInt32(this.instJNS))
{
organNazwa = xInst.Attributes["organNazwa"].InnerText;
break;
}
}
}
}
}
}
... (lines lines...)
if (inst == "RDA")
{
if (jns.Length < 6)
{
while (jns.Length < 6)
{
jns = "0" + jns;
}
}
if (jns[2] == '7' || jns[2] == '6')
{
if (jns.Substring(0, 4) == "1465" && organNazwa == "m.st.")
{
this.protocolDefinition = new XmlDocument();
... (~200 lines)
}
catch (XmlException e)
{
MessageBox.Show("Nieprawidłowy XML: " + e.Message, "Błąd");
}
... code code...
}
There are three methods: bool saves(int step) , string generateSaves(int step) and void saves(int step, string errors) . Each has 600 lines and it's copy&paste with some subtle changes. And they say that they lose data...
And a 800-line void getHeader() . Yep, it has a "get" in name and is a void...
{
this.wait.setWaitPanel("Trwa ładowanie nagłówka protokołu", "Proszę czekać");
this.wait.setVisible(true);
this.headerField = new System.Collections.Generic.List<string>();
string title = "Protokół dla ";
try
{
XmlNode nodesList = this.protocolDefinition.SelectSingleNode("/protokol_info");
XmlNode headerRoot = this.header.SelectSingleNode("/akcja_wyborcza/jns");
int x = 0;
int y = 0;
int fullWidth = this.protocolHeader.Size.Width - 20;
XmlNode updateData = this.header.SelectSingleNode("/akcja_wyborcza").Attributes.GetNamedItem("data-ost-aktualizacji");
string[] partfilepath = this.savePath.Split(new char[]
{
'\\'
});
string[] dataPath = partfilepath[partfilepath.Length - 1].Split(new char[]
{
'-'
});
this.jns = dataPath[1].Replace("Jns", "");
this.obwod = dataPath[2].Replace("Obw", "");
this.inst = dataPath[3].Replace("Inst", "");
this.okreg = dataPath[5].Replace("Okr", "");
string[] okreg = this.okreg.Split(new char[]
{
' '
});
this.okreg = okreg[0].Replace(".xml", "");
(lines lines lines)
foreach (XmlNode node in nodesList)
{
XmlNode type = node.Attributes.GetNamedItem("type");
if (!(type.Value == "header"))
{
break;
}
foreach (XmlNode box in node)
{
foreach (XmlNode item in box)
{
if (item.Name == "title")
{
x = 0;
XmlNode bold = item.Attributes.GetNamedItem("bold");
Label lab = new Label();
lab.Text = item.InnerText;
lab.AutoSize = true;
lab.MaximumSize = new System.Drawing.Size(fullWidth, 0);
lab.Font = new System.Drawing.Font(this.myfont, 10f);
lab.Padding = new Padding(10, 0, 10, 0);
if (bold.Value == "true")
{
lab.Font = new System.Drawing.Font(this.myfont, 10f, System.Drawing.FontStyle.Bold);
}
lab.Location = new System.Drawing.Point(x, y);
this.protocolHeader.Controls.Add(lab);
y += lab.Height + 30;
}
if (item.Name == "row")
{
x = 0;
... and after 400 lines, when nesting reaches 16 levels:
if (valueName.Value == "algorytmOKW_R")
{
foreach (XmlNode obw in headerRoot)
{
if (obw.Name == "obw" && obw.Attributes.GetNamedItem("nr") != null && obw.Attributes.GetNamedItem("nr").Value == this.obwod)
{
foreach (XmlNode institutions in obw)
{
if (institutions.Name == "inst" && institutions.Attributes.GetNamedItem("kod") != null && institutions.Attributes.GetNamedItem("kod").Value == this.inst && institutions.Attributes.GetNamedItem("inst_jns") != null && institutions.Attributes.GetNamedItem("inst_jns").Value == this.instJNS)
{
foreach (XmlNode okr in institutions)
{
if (okr.Name == "okr" && okr.Attributes.GetNamedItem("nr") != null && okr.Attributes.GetNamedItem("nr").Value == this.okreg)
{
if (okr.Attributes.GetNamedItem("siedzibaR") != null)
{
Input.Text = okr.Attributes.GetNamedItem("siedzibaR").Value;
}
}
}
}
}
}
}
}
A random gem found by people around (as I said, it was released to public):
public bool isActiveLicense(string license)
{
bool response = false;
try
{
System.Security.Cryptography.X509Certificates.X509Certificate certtmp = new System.Security.Cryptography.X509Certificates.X509Certificate(license);
System.DateTime a = new System.DateTime(1, 1, 1, 0, 0, 0);
System.DateTime fromDate = System.Convert.ToDateTime(certtmp.GetEffectiveDateString());
if (fromDate == a)
{
System.Threading.Thread.Sleep(1000);
fromDate = System.Convert.ToDateTime(certtmp.GetEffectiveDateString());
}
System.DateTime toDate = System.Convert.ToDateTime(certtmp.GetExpirationDateString());
if (toDate == a)
{
System.Threading.Thread.Sleep(1000);
toDate = System.Convert.ToDateTime(certtmp.GetEffectiveDateString());
}
int result = System.DateTime.Compare(fromDate, System.DateTime.Now);
int result2 = System.DateTime.Compare(System.DateTime.Now, toDate);
if (result <= 0 && result2 <= 0)
{
response = true;
}
}
catch (System.Security.Cryptography.CryptographicException)
{
}
return response;
}
And so on... Oh, and I have a bunch of license codes for paid libraries.
PS. I apologise for a long post.
modified 18-Nov-14 18:46pm.
|