System.Data.SqlClient.SqlCommand

/// <summary>
/// Definitions (and values) for SQL Server Signature queries
/// </summary>
class SigSigningProvider_SQLServer_Server
{
    #define.SystemDataSqlDbType('System.Data.SqlDbType')
    #define.NVarChar('NVarChar')
    #define.DateTime('DateTime')
    #define.VarBinary('VarBinary')
    #define.Int('Int')
    #define.SystemConvert('System.Convert')
    #define.ToBase64String('ToBase64String')
    #define.FromBase64String('FromBase64String')

    #define.ElementNameSignatureList('signaturelist')
    #define.ElementNameSignature('signature')
    #define.AttrNameStart('start')
    #define.AttrNameLength('length')

    #define.PosStart(1)
    #define.PosLength(2)
    #define.PosSignature(3)

    System.Data.SqlClient.SqlConnection conn;
}
/// Verify if there is a valid certificate for the <paramref name="_signeeId" />
/// </summary>
/// <param name="_signeeId">
/// Certificate signee
/// </param>
/// <returns type="boolean">
/// true, if a vaild certificate is found for signee; otherwise false
/// </returns>
/// <exception cref="Exception::Error">
/// SQL Server was unable to validate certificate
/// </exception>
public boolean hasValidCertificateSQL(SIGSQLCertSubject _signeeId)
{
    #LocalMacro.SelectStmt
        ' SELECT COUNT(*) FROM sys.certificates '
        + ' WHERE subject = @s'
        + ' AND start_date <= @f'
        + ' AND expiry_date > @t'
        + ' AND pvt_key_encryption_type = N\'PW\''
    #EndMacro
    #define.ParmNameSubject('@s')
    #define.ParmNameStartDate('@f')
    #define.ParmNameExpiryDate('@t')

    System.Data.SqlClient.SqlCommand                cmd;
    System.Data.SqlClient.SqlParameter              param;
    System.Data.SqlDbType                           type;
    System.Data.SqlClient.SqlParameterCollection    params;
    str                                             stmtText;
    int                                             intRes;
    boolean                                         ret = false;
    utcdatetime                                     utcToday;
    str                                             errMsg;
    ;

    utcToday = DateTimeUtil::newDateTime(systemdateget(),0);
    stmtText = #SelectStmt;

    try
    {
        new InteropPermission(InteropKind::ClrInterop).assert();
        conn.Open();
        cmd = conn.CreateCommand();
        cmd.set_CommandText(stmtText);

        params = cmd.get_Parameters();
        type = CLRInterop::parseClrEnum(#SystemDataSqlDbType,#NVarChar);
        param = params.Add(#ParmNameSubject,type);
        param.set_Value(_signeeId);

        type = CLRInterop::parseClrEnum(#SystemDataSqlDbType,#DateTime);
        param = params.Add(#ParmNameStartDate,type);
        param.set_Value(utcToday);

        param = params.Add(#ParmNameExpiryDate,type);
        param.set_Value(utcToday);

        intRes = cmd.ExecuteScalar();
        ret = (intRes > 0);
        conn.Close();
    }
    catch
    {
        errMsg = AifUtil::getClrErrorMessage();
        try
        {
            conn.Close();
        }
        catch
        {
            ret = false;
        }
        throw error(errMsg ? errMsg : "@SYP1558");
    }
    return ret;
}
//---------------------------------------
/// <summary>
/// Revoke permission to certificate
/// </summary>
/// <param name="_id">
/// Certificate Id for certificate to have permissions revoked
/// </param>
public void revokeCertificateSQL(SIGCertificateId _id)
{
    #LocalMacro.RevokeStmt
        'ALTER CERTIFICATE \%1 REMOVE PRIVATE KEY'
    #EndMacro
    System.Data.SqlClient.SqlCommand    cmd;
    str                                 stmtText;
    str                                 name;
    str                                 subject;
    ;

    name = this.getNameForId(_id);
    if (!name)
    {
        return;
    }
    subject = this.getSubjectForId(_id);
    if (subject != curuserid()
        && (!hasSecuritykeyAccess(securitykeynum(AdminSetup), AccessType::Delete)))
    {
        return;
    }
    stmtText = strfmt(#RevokeStmt,name);

    try
    {
        new InteropPermission(InteropKind::ClrInterop).assert();
        conn.Open();
        cmd = conn.CreateCommand();
        cmd.set_CommandText(stmtText);

        cmd.ExecuteNonQuery();
        conn.Close();
    }
    catch
    {
        try
        {
            conn.Close();
        }
        catch
        {
            stmtText = '';
        }
    }
}
//----------------------------------------------
/// <summary>
/// Retrieve certificate name base on certificate Id (<paramref name="_id" />
/// </summary>
/// <param name="_id">
/// Certificate Id
/// </param>
/// <returns type="str">
/// Certificate name
/// </returns>
public str getSubjectForId(SIGCertificateId _id)
{
    #LocalMacro.SelectStmt
        ' SELECT subject'
        + ' FROM sys.certificates '
        + ' WHERE certificate_id = @id'
    #EndMacro
    #define.ParmNameId('@id')

    System.Data.SqlClient.SqlCommand                cmd;
    System.Data.SqlClient.SqlParameter              param;
    System.Data.SqlDbType                           type;
    System.Data.SqlClient.SqlParameterCollection    params;
    str                                             stmtText;
    str                                             subject;
    ;

    stmtText = #SelectStmt;

    try
    {
        new InteropPermission(InteropKind::ClrInterop).assert();
        conn.Open();
        cmd = conn.CreateCommand();
        cmd.set_CommandText(stmtText);

        params = cmd.get_Parameters();
        type = CLRInterop::parseClrEnum(#SystemDataSqlDbType,#Int);
        param = params.Add(#ParmNameId,type);
        param.set_Value(_id);

        subject = cmd.ExecuteScalar();
        conn.Close();
    }
    catch
    {
        try
        {
            conn.Close();
        }
        catch
        {
            subject = '';
        }
    }
    return subject;
}
//------------------------------------------------
/// <summary>
/// Revoke permission to certificate
/// </summary>
/// <param name="_id">
/// Certificate Id for certificate to have permissions revoked
/// </param>
public void revokeCertificateSQL(SIGCertificateId _id)
{
    #LocalMacro.RevokeStmt
        'ALTER CERTIFICATE \%1 REMOVE PRIVATE KEY'
    #EndMacro
    System.Data.SqlClient.SqlCommand    cmd;
    str                                 stmtText;
    str                                 name;
    str                                 subject;
    ;

    name = this.getNameForId(_id);
    if (!name)
    {
        return;
    }
    subject = this.getSubjectForId(_id);
    if (subject != curuserid()
        && (!hasSecuritykeyAccess(securitykeynum(AdminSetup), AccessType::Delete)))
    {
        return;
    }
    stmtText = strfmt(#RevokeStmt,name);

    try
    {
        new InteropPermission(InteropKind::ClrInterop).assert();
        conn.Open();
        cmd = conn.CreateCommand();
        cmd.set_CommandText(stmtText);

        cmd.ExecuteNonQuery();
        conn.Close();
    }
    catch
    {
        try
        {
            conn.Close();
        }
        catch
        {
            stmtText = '';
        }
    }
}


转载于:https://my.oschina.net/fandyx/blog/374800

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值