teisipäev, 29. märts 2016

Eesti isikukoodi kontrollsumma arvutamise funktsioon Transact-SQL

-- =============================================
-- Author: Kuido Külm
-- Description: Arvutab Eesti isikukoodi kontrollsumma
-- =============================================
CREATE FUNCTION [dbo].[EST_PERSON_IDCODE_CHECKSUM_S](@isikukood NVARCHAR(11))
RETURNS NVARCHAR(1)
AS
BEGIN
DECLARE  @checksum INT = -1, @sum INT=0, @weight INT=1, @i INT=1,@k INT
WHILE @i <= 10
BEGIN
    SET @k=CAST(SUBSTRING(@isikukood,@i,1) AS INT)*@weight
SET @sum=@sum+@k
IF @weight = 9
 SET @weight=1
ELSE
 SET @weight=@weight+1
SET @i=@i+1
END
SET @checksum=@sum%11
IF @checksum != 10
  RETURN CAST(@checksum AS NVARCHAR(1))

SET @sum=0
SET @weight=3
SET @i=1
WHILE @i <= 10
BEGIN
    SET @k=CAST(SUBSTRING(@isikukood,@i,1) AS INT)*@weight
SET @sum=@sum+@k
IF @weight = 9
 SET @weight=1
ELSE
 SET @weight=@weight+1
SET @i=@i+1
END
SET @checksum=@sum%11
IF @checksum != 10
  RETURN CAST(@checksum AS NVARCHAR(1))

RETURN '0'
END

esmaspäev, 20. aprill 2015

ID-kaardi tarkvara alates versionist 3.10.2 ning IIS6 ja IIS7

Sellise asja peale juhtusin, kus peale ID-kaardi baastarakvara uuendamist alates versioonist 3.10.2 ei hakanud enam tööle ID-kaardiga autentimine, ehk

 HttpClientCertificate sert = Request.ClientCertificate;
 if (!sert.IsPresent)
 {

sai lati vastuseks, et sertifikaati pole, ehk PIN1 ei küsitud

Asja saab taas töökorda Windows'i serveri registris asukohas HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL võtme SendTrustedIssuerList väärtusega 0 (tüüp REG_DWORD) lisamisega

esmaspäev, 10. veebruar 2014

Nimeruumiga XML faili foreach tsükli läbiketramine ja XPath nimeruumi kasutamine

Mõnikord pannakse XML standardi kohaselt nimeruum dokumendile juurde.
Näiteks ISO20022 kasutamine võib tekitada sellise dokumendi
kus dokumendis on defineeritud ka nimeruum
xmlns="urn:iso:std:iso:20022:tech:xsd:camt.052.001.02"

<?xml version='1.0' encoding='UTF-8'?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.052.001.02">
<BkToCstmrAcctRpt>
<GrpHdr>
<MsgId>2014013002396394670001</MsgId>
</GrpHdr>
<Rpt>
<Id>552859428-EUR-1</Id>

</Rpt>
            <CreDtTm>2014-01-30T16:00:09</CreDtTm>
            <FrToDt>
                <FrDtTm>2014-01-30T00:00:00</FrDtTm>
                <ToDtTm>2014-01-30T16:00:15</ToDtTm>
            </FrToDt>
            <Acct>
                <Id>
                    <IBAN>EE112670221023582381</IBAN>
                </Id>
            <Acct>
             <NtryDtls>
                    <TxDtls>
                        <Refs>
                            <AcctSvcrRef>2014012300101119-1</AcctSvcrRef>
                            <EndToEndId>NOT PROVIDED</EndToEndId>
                        </Refs>
                        <AmtDtls>
                            <InstdAmt>
                                <Amt Ccy="EUR">132.29</Amt>
                            </InstdAmt>
                            <TxAmt>
                                <Amt Ccy="EUR">132.29</Amt>
                            </TxAmt>
                        </AmtDtls>
                        <RltdPties>
                            <Dbtr>
                                <Nm>PAOLO OSCAR GARCIA</Nm>
                                <PstlAdr>
                                    <Ctry>ES</Ctry>
                                    <AdrLine>CL.SAN ROQUE, 61 12-4 12004 CASTELLON DE LA PLANA, CASTELLON/C</AdrLine>
                                </PstlAdr>
                            </Dbtr>
                            <DbtrAcct>
                                <Id>
                                    <IBAN>ES9862342069989523042901</IBAN>
                                </Id>
                            </DbtrAcct>
                        </RltdPties>
                        <RltdAgts>
                            <DbtrAgt>
                                <FinInstnId>
                                    <BIC>EVOBESMMXXX</BIC>
                                </FinInstnId>
                            </DbtrAgt>
                        </RltdAgts>
                        <RmtInf>
                            <Ustrd>1098052330002 PAOLO OSCAR GARCIA</Ustrd>
                        </RmtInf>
                    </TxDtls>
                </NtryDtls>
            </Ntry>
            <Ntry>
                <NtryRef>2014012300203432-1</NtryRef>
                <Amt Ccy="EUR">68.97</Amt>
                <CdtDbtInd>CRDT</CdtDbtInd>
                <Sts>BOOK</Sts>
                <BookgDt>
                    <Dt>2014-01-23</Dt>
                </BookgDt>
                <ValDt>
                    <Dt>2014-01-23</Dt>
                </ValDt>
                <AcctSvcrRef>2014012300203432-1</AcctSvcrRef>
                <BkTxCd>
                    <Domn>
                        <Cd>PMNT</Cd>
                        <Fmly>
                            <Cd>RCDT</Cd>
                            <SubFmlyCd>DMCT</SubFmlyCd>
                        </Fmly>
                    </Domn>
                    <Prtry>
                        <Cd>MK</Cd>
                        <Issr>Swedbank AS</Issr>
                    </Prtry>
                </BkTxCd>
                <NtryDtls>
                    <TxDtls>
                        <Refs>
                            <AcctSvcrRef>2014012300203432-1</AcctSvcrRef>
                            <InstrId>11</InstrId>
                        </Refs>
                        <AmtDtls>
                            <TxAmt>
                                <Amt Ccy="EUR">68.97</Amt>
                            </TxAmt>
                        </AmtDtls>
                        <RltdPties>
                            <Dbtr>
                                <Nm>Paul Hark</Nm>
                                <Id>
                                    <PrvtId>
                                        <Othr>
                                            <Id>3933034216</Id>
                                        </Othr>
                                    </PrvtId>
                                </Id>
                            </Dbtr>
                            <DbtrAcct>
                                <Id>
                                    <IBAN>EE634129278536542306</IBAN>
                                </Id>
                            </DbtrAcct>
                        </RltdPties>
                        <RltdAgts>
                            <DbtrAgt>
                                <FinInstnId>
                                    <BIC>EKRDEE22</BIC>
                                </FinInstnId>
                            </DbtrAgt>
                        </RltdAgts>
                        <RmtInf>
                            <Ustrd>Nooruse 17-2 Arve nr.  109316 Paul Hark</Ustrd>
                            <Strd>
                                <CdtrRefInf>
                                    <Tp>
                                        <CdOrPrtry>
                                            <Cd>SCOR</Cd>
                                        </CdOrPrtry>
                                    </Tp>
                                    <Ref>1093160210005</Ref>
                                </CdtrRefInf>
                            </Strd>
                        </RmtInf>
                    </TxDtls>
                </NtryDtls>
            </Ntry>
</BkToCstmrAcctRpt>
</Document>


Sellise faili lugemina käib nagu ikka

XmlDocument xdoc = new XmlDocument();
xdoc.Load(file);

kuna dokumendil on nimeruum siis tuleb see XmlNamespaceManageri kasutades ära näidata

XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdoc.NameTable);
nsmgr.AddNamespace("bk", "urn:iso:std:iso:20022:tech:xsd:camt.052.001.02");

bk on nüüd nimeruumi alias mida XPathis kasutada tuleb.

Paar asja mis tuleb tähele panna

Esiteks nimeruumi kasutamine XPath otsingus, alias tuleb iga pathi ette kirjutada

bk defineerisime AddNamespace  meetodiga
XmlNode nod = xdoc.SelectSingleNode("//bk:Rpt//bk:Acct//bk:Id//bk:IBAN", nsmgr);
string pkood = nod.InnerText.Trim();

ehk näite põhjal tuleb vastuseks  EE112670221023582381

Teiseks foreach tsüklis tipule viitamine, siin tuleb XPath avaldist alustada punktiga

 XmlNodeList rows = xdoc.SelectNodes("//bk:Ntry", nsmgr);

foreach (XmlNode nrow in rows)
{
 nod = nrow.SelectSingleNode(".//bk:NtryDtls//bk:TxDtls//bk:RltdPties//bk:Dbtr//bk:Nm", nsmgr);
}

kui punkti algusse ei pane siis tsükkel võtab alati esimese leitud XPathi avaldise tulemuse

reede, 29. november 2013

TableAdapteri CommandTimeouti muutmine

Mõnikord juhtub, et andmebaasis pikk päring ja vaja CommandTimeouti pikemaks panna, et veebiserver ära ei katkestaks, seda saab teha partial klassiga

PAST_DUE_ACCOUNTS_S on TableAdapteri klassi nimi millele tuleb uus klass lisada

public partial class PAST_DUE_ACCOUNTS_STableAdapter
{
        public void SetCommandTimeout(int timeout)
        {
        foreach (IDbCommand command in CommandCollection)
        command.CommandTimeout = timeout;
        }
}

kolmapäev, 4. september 2013

IIS8 kliendi sertfikaadiga veebilehe autentimine

Kui on veebirakendusel mõnele aspx lehele peale seatud Client Certificates - Require, ehk
lehele ligipääsuks tuleb ID-kaardiga autentida. Kui hakkab pilduma viga 403-Forbidden: Access is denied


Siis asja töölesaamiseks kontrolli ka, et IIS-i URL Authorization role komponent oleks installitud




esmaspäev, 2. september 2013

IIS8 tõstutundlikkus ehk Ambiguous match found

IIS8 peal selline asi enam läbi ei lähe

Veebirakendus on .NET. 4.0 tehtud ja veebilehel on kontroll ID-ga "LTA"

<asp:Literal ID="LTA" runat="server" Text="0.0"></asp:Literal>

ja code-behindis on defineeritud muutuja

private decimal lta = 0.0M;
this.LTA.Text=String.Format("{0:F2}", this.lta);

ehk on nii lta kui LTA mille peale projekt VisualStudio2010 õnnelikult kompileerub, kuid kävitamisel veebilehe avamisel saab vea Ambiguous match found.

Lahenduseks see, et ühe muutuja nime tuleb muuta
<asp:Literal ID="LiTA" runat="server" Text="0.0"></asp:Literal>
 this.LiTA.Text=String.Format("{0:F2}", this.lta);

reede, 23. august 2013

Reavahetuse näitamine SQL SERVER andmeväljast asp:Label-is

Veebivormi kaudu tekstiboksi sisse reavahetusi sisestades võib tekkida soov pärast need reavahetused säilitada veebis taaskuvamisel

MS SQL SERVER säilitab andmeväljas reavahetusi kui CHAR(10) sümbolit (\n). Andmebaasi väljast saab reavahetust leida PATINDEX('%'+CHAR(10)+'%', ...) funktsiooni abil

SELECT [message_text]
      ,PATINDEX('%'+CHAR(10)+'%',message_text) AS esimene_reavahetus
  FROM [dbo].[MESSAGES]


Kui nüüd vaja reavahetust ka HTML koodina näidata või teha seda nii, et asendad andmebaasi CHAR(10) väärtuse HTML reavahe märgendiga <br />

näiteks kasutab asp:Label mille paneb veel asp:Panel sisse kerimisribade pärast

<asp:Panel runat="server" ID="PanelSisu" Height="250px" ScrollBars="Vertical">
              <asp:Label ID="tbMessageBody" runat="server" ReadOnly="True"></asp:Label>
</asp:Panel> 
Miskipärast aga iga kord SQL SERVER-i CHAR(10) ja C# \n omavahel hästi ei ühildu.

Reeglina peaks töötama järgmine konstruktsioon

string msd = table.Rows[0]["message_text"].ToString();
msd = msd.Replace(Environment.NewLine, "<br />");

aga IIS6 miskipärast ei tööta. Üks mitte eriti ilus lahendus on see, et proovib erinevad variandid läbi. Sobib siis kui regulaaravaldsed pole just tugevaim külg.


string msd = table.Rows[0]["message_text"].ToString();
Regex regex = new Regex(@"(\r\n|\r|\n|\n\r)+"); //IIS6 peale ei tööta, IIS8 töötab
msd = regex.Replace(msd, "<br />");
msd = msd.Replace(Environment.NewLine, "<br />"); //see newline mõnikord ei tööta hästi IIS6
msd = Regex.Replace(msd, @"\r\n?|\n", "<br />");  //IIS6 peale töötab

Viisakas on muidugi väljund ennem AntiXSS teegi funktsioonist GetSafeHtmlFragment läbi lasta.
GetSafeHtmlFragment aga sööb reavahe <br /> märgendi ära.

Üle nurga lahendus võib olla selline, et pöörab reavahe mingiks vähetõenäolise stringijadaks. Näiteks  "#####" ja peale GetSafeHtmlFragment funktsiooni asendab "#####" "<br />" märgendiga


string msd = table.Rows[0]["message_text"].ToString();
Regex regex = new Regex(@"(\r\n|\r|\n|\n\r)+");
msd = regex.Replace(msd, "#####");
msd = msd.Replace(Environment.NewLine, "#####"); //see newline mõnikord ei tööta hästi IIS6
msd = Regex.Replace(msd, @"\r\n?|\n", "#####");  //IIS6 peale töötab
this.tbMessageBody.Text = Microsoft.Security.Application.Sanitizer.GetSafeHtmlFragment(msd).Replace("#####", "<br />");