public override void Attach(DatabaseParameterBuffer dpb, string dataSource, int port, string database, byte[] cryptKey) { try { SendAttachToBuffer(dpb, database); XdrStream.Flush(); var response = ReadResponse(); while (response is CryptKeyCallbackReponse cryptResponse) { XdrStream.Write(IscCodes.op_crypt_key_callback); XdrStream.WriteBuffer(cryptKey); XdrStream.Flush(); response = ReadResponse(); } ProcessAttachResponse(response as GenericResponse); } catch (IscException) { SafelyDetach(); throw; } catch (IOException ex) { SafelyDetach(); throw IscException.ForErrorCode(IscCodes.isc_net_write_err, ex); } AfterAttachActions(); }
public override void AttachWithTrustedAuth(DatabaseParameterBuffer dpb, string dataSource, int port, string database) { lock (SyncObject) { try { using (SspiHelper sspiHelper = new SspiHelper()) { byte[] authData = sspiHelper.InitializeClientSecurity(); SendTrustedAuthToBuffer(dpb, authData); SendAttachToBuffer(dpb, database); XdrStream.Flush(); IResponse response = ReadResponse(); ProcessTrustedAuthResponse(sspiHelper, ref response); ProcessAttachResponse((GenericResponse)response); } } catch (IscException) { SafelyDetach(); throw; } catch (IOException ex) { SafelyDetach(); throw IscException.ForErrorCode(IscCodes.isc_net_write_err, ex); } AfterAttachActions(); } }
public override void CreateDatabase(DatabaseParameterBuffer dpb, string dataSource, int port, string database, byte[] cryptKey) { try { SendCreateToBuffer(dpb, database); XdrStream.Flush(); try { var response = ReadResponse(); response = ProcessCryptCallbackResponseIfNeeded(response, cryptKey); ProcessCreateResponse(response as GenericResponse); Detach(); } catch (IscException) { try { CloseConnection(); } catch { } throw; } } catch (IOException ex) { throw IscException.ForErrorCode(IscCodes.isc_net_write_err, ex); } }
protected void ProcessTrustedAuthResponse(SspiHelper sspiHelper, ref IResponse response) { while (response is AuthResponse) { byte[] authData = sspiHelper.GetClientSecurity(((AuthResponse)response).Data); XdrStream.Write(IscCodes.op_trusted_auth); XdrStream.WriteBuffer(authData); XdrStream.Flush(); response = ReadResponse(); } }
public IResponse ProcessCryptCallbackResponseIfNeeded(IResponse response, byte[] cryptKey) { while (response is CryptKeyCallbackResponse cryptResponse) { XdrStream.Write(IscCodes.op_crypt_key_callback); XdrStream.WriteBuffer(cryptKey); XdrStream.Flush(); response = ReadResponse(); } return(response); }
protected override void SendCreateToBuffer(DatabaseParameterBuffer dpb, string database) { XdrStream.Write(IscCodes.op_create); XdrStream.Write(0); if (AuthData != null) { dpb.Append(IscCodes.isc_dpb_specific_auth_data, AuthData); } dpb.Append(IscCodes.isc_dpb_utf8_filename, 0); XdrStream.WriteBuffer(Encoding.UTF8.GetBytes(database)); XdrStream.WriteBuffer(dpb.ToArray()); }
protected override void SendCreateToBuffer(DatabaseParameterBuffer dpb, string database) { XdrStream.Write(IscCodes.op_create); XdrStream.Write(0); if (!string.IsNullOrEmpty(Password)) { dpb.Append(IscCodes.isc_dpb_password, Password); } dpb.Append(IscCodes.isc_dpb_utf8_filename, 0); XdrStream.WriteBuffer(Encoding.UTF8.GetBytes(database)); XdrStream.WriteBuffer(dpb.ToArray()); }
public override void CancelOperation(int kind) { try { SendCancelOperationToBuffer(kind); XdrStream.Flush(); // no response, this is async } catch (IOException ex) { throw IscException.ForErrorCode(IscCodes.isc_network_error, ex); } }
public override void CreateDatabaseWithTrustedAuth(DatabaseParameterBuffer dpb, string dataSource, int port, string database, byte[] cryptKey) { using (var sspiHelper = new SspiHelper()) { var authData = sspiHelper.InitializeClientSecurity(); SendTrustedAuthToBuffer(dpb, authData); SendCreateToBuffer(dpb, database); XdrStream.Flush(); var response = ReadResponse(); ProcessTrustedAuthResponse(sspiHelper, ref response); ProcessCreateResponse((GenericResponse)response); } }
protected override byte[] WriteParameters() { if (_parameters == null) { return(null); } using (var xdr = new XdrStream(_database.Charset)) { try { var bits = new BitArray(_parameters.Count); for (var i = 0; i < _parameters.Count; i++) { var field = _parameters[i]; bits.Set(i, field.DbValue.IsDBNull()); } var buffer = new byte[(int)Math.Ceiling(_parameters.Count / 8d)]; for (var i = 0; i < buffer.Length * 8; i++) { var index = i / 8; // LSB buffer[index] = (byte)((buffer[index] >> 1) | (bits.Length > i && bits[i] ? 1 << 7 : 0)); } xdr.WriteOpaque(buffer); for (var i = 0; i < _parameters.Count; i++) { var field = _parameters[i]; if (field.DbValue.IsDBNull()) { continue; } WriteRawParameter(xdr, field); } return(xdr.ToArray()); } catch (IOException ex) { throw IscException.ForErrorCode(IscCodes.isc_net_write_err, ex); } } }
public override void Attach(DatabaseParameterBuffer dpb, string dataSource, int port, string database, byte[] cryptKey) { try { SendAttachToBuffer(dpb, database); XdrStream.Flush(); var response = ReadResponse(); response = ProcessCryptCallbackResponseIfNeeded(response, cryptKey); ProcessAttachResponse(response as GenericResponse); } catch (IscException) { SafelyDetach(); throw; } catch (IOException ex) { SafelyDetach(); throw IscException.ForErrorCode(IscCodes.isc_network_error, ex); } AfterAttachActions(); }
protected void SendCancelOperationToBuffer(int kind) { XdrStream.Write(IscCodes.op_cancel); XdrStream.Write(kind); }