Skip to content

Commit 801835a

Browse files
committed
Add new SASL messages to protocol
1 parent 588ecc8 commit 801835a

File tree

2 files changed

+173
-93
lines changed

2 files changed

+173
-93
lines changed

postgres-protocol/src/message/backend.rs

+110-38
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ pub enum Message {
2020
AuthenticationOk,
2121
AuthenticationScmCredential,
2222
AuthenticationSspi,
23+
AuthenticationGssContinue(AuthenticationGssContinueBody),
24+
AuthenticationSasl(AuthenticationSaslBody),
25+
AuthenticationSaslContinue(AuthenticationSaslContinueBody),
26+
AuthenticationSaslFinal(AuthenticationSaslFinalBody),
2327
BackendKeyData(BackendKeyDataBody),
2428
BindComplete,
2529
CloseComplete,
@@ -81,17 +85,15 @@ impl Message {
8185
let channel = try!(buf.read_cstr());
8286
let message = try!(buf.read_cstr());
8387
Message::NotificationResponse(NotificationResponseBody {
84-
process_id: process_id,
85-
channel: channel,
86-
message: message,
87-
})
88+
process_id: process_id,
89+
channel: channel,
90+
message: message,
91+
})
8892
}
8993
b'c' => Message::CopyDone,
9094
b'C' => {
9195
let tag = try!(buf.read_cstr());
92-
Message::CommandComplete(CommandCompleteBody {
93-
tag: tag,
94-
})
96+
Message::CommandComplete(CommandCompleteBody { tag: tag })
9597
}
9698
b'd' => {
9799
let storage = buf.read_all();
@@ -101,9 +103,9 @@ impl Message {
101103
let len = try!(buf.read_u16::<BigEndian>());
102104
let storage = buf.read_all();
103105
Message::DataRow(DataRowBody {
104-
storage: storage,
105-
len: len,
106-
})
106+
storage: storage,
107+
len: len,
108+
})
107109
}
108110
b'E' => {
109111
let storage = buf.read_all();
@@ -114,36 +116,34 @@ impl Message {
114116
let len = try!(buf.read_u16::<BigEndian>());
115117
let storage = buf.read_all();
116118
Message::CopyInResponse(CopyInResponseBody {
117-
format: format,
118-
len: len,
119-
storage: storage,
120-
})
119+
format: format,
120+
len: len,
121+
storage: storage,
122+
})
121123
}
122124
b'H' => {
123125
let format = try!(buf.read_u8());
124126
let len = try!(buf.read_u16::<BigEndian>());
125127
let storage = buf.read_all();
126128
Message::CopyOutResponse(CopyOutResponseBody {
127-
format: format,
128-
len: len,
129-
storage: storage,
130-
})
129+
format: format,
130+
len: len,
131+
storage: storage,
132+
})
131133
}
132134
b'I' => Message::EmptyQueryResponse,
133135
b'K' => {
134136
let process_id = try!(buf.read_i32::<BigEndian>());
135137
let secret_key = try!(buf.read_i32::<BigEndian>());
136138
Message::BackendKeyData(BackendKeyDataBody {
137-
process_id: process_id,
138-
secret_key: secret_key,
139-
})
139+
process_id: process_id,
140+
secret_key: secret_key,
141+
})
140142
}
141143
b'n' => Message::NoData,
142144
b'N' => {
143145
let storage = buf.read_all();
144-
Message::NoticeResponse(NoticeResponseBody {
145-
storage: storage,
146-
})
146+
Message::NoticeResponse(NoticeResponseBody { storage: storage })
147147
}
148148
b'R' => {
149149
match try!(buf.read_i32::<BigEndian>()) {
@@ -154,12 +154,28 @@ impl Message {
154154
let mut salt = [0; 4];
155155
try!(buf.read_exact(&mut salt));
156156
Message::AuthenticationMd5Password(AuthenticationMd5PasswordBody {
157-
salt: salt,
158-
})
157+
salt: salt,
158+
})
159159
}
160160
6 => Message::AuthenticationScmCredential,
161161
7 => Message::AuthenticationGss,
162+
8 => {
163+
let storage = buf.read_all();
164+
Message::AuthenticationGssContinue(AuthenticationGssContinueBody(storage))
165+
}
162166
9 => Message::AuthenticationSspi,
167+
10 => {
168+
let storage = buf.read_all();
169+
Message::AuthenticationSasl(AuthenticationSaslBody(storage))
170+
}
171+
11 => {
172+
let storage = buf.read_all();
173+
Message::AuthenticationSaslContinue(AuthenticationSaslContinueBody(storage))
174+
}
175+
12 => {
176+
let storage = buf.read_all();
177+
Message::AuthenticationSaslFinal(AuthenticationSaslFinalBody(storage))
178+
}
163179
tag => {
164180
return Err(io::Error::new(io::ErrorKind::InvalidInput,
165181
format!("unknown authentication tag `{}`", tag)));
@@ -171,31 +187,29 @@ impl Message {
171187
let name = try!(buf.read_cstr());
172188
let value = try!(buf.read_cstr());
173189
Message::ParameterStatus(ParameterStatusBody {
174-
name: name,
175-
value: value,
176-
})
190+
name: name,
191+
value: value,
192+
})
177193
}
178194
b't' => {
179195
let len = try!(buf.read_u16::<BigEndian>());
180196
let storage = buf.read_all();
181197
Message::ParameterDescription(ParameterDescriptionBody {
182-
storage: storage,
183-
len: len,
184-
})
198+
storage: storage,
199+
len: len,
200+
})
185201
}
186202
b'T' => {
187203
let len = try!(buf.read_u16::<BigEndian>());
188204
let storage = buf.read_all();
189205
Message::RowDescription(RowDescriptionBody {
190-
storage: storage,
191-
len: len,
192-
})
206+
storage: storage,
207+
len: len,
208+
})
193209
}
194210
b'Z' => {
195211
let status = try!(buf.read_u8());
196-
Message::ReadyForQuery(ReadyForQueryBody {
197-
status: status,
198-
})
212+
Message::ReadyForQuery(ReadyForQueryBody { status: status })
199213
}
200214
tag => {
201215
return Err(io::Error::new(io::ErrorKind::InvalidInput,
@@ -269,6 +283,64 @@ impl AuthenticationMd5PasswordBody {
269283
}
270284
}
271285

286+
pub struct AuthenticationGssContinueBody(Bytes);
287+
288+
impl AuthenticationGssContinueBody {
289+
#[inline]
290+
pub fn data(&self) -> &[u8] {
291+
&self.0
292+
}
293+
}
294+
295+
pub struct AuthenticationSaslBody(Bytes);
296+
297+
impl AuthenticationSaslBody {
298+
#[inline]
299+
pub fn mechanisms<'a>(&'a self) -> SaslMechanisms<'a> {
300+
SaslMechanisms(&self.0)
301+
}
302+
}
303+
304+
pub struct SaslMechanisms<'a>(&'a [u8]);
305+
306+
impl<'a> FallibleIterator for SaslMechanisms<'a> {
307+
type Item = &'a str;
308+
type Error = io::Error;
309+
310+
#[inline]
311+
fn next(&mut self) -> io::Result<Option<&'a str>> {
312+
let value_end = try!(find_null(self.0, 0));
313+
if value_end == 0 {
314+
if self.0.len() != 1 {
315+
return Err(io::Error::new(io::ErrorKind::InvalidData, "invalid message length"));
316+
}
317+
Ok(None)
318+
} else {
319+
let value = try!(get_str(&self.0[..value_end]));
320+
self.0 = &self.0[value_end + 1..];
321+
Ok(Some(value))
322+
}
323+
}
324+
}
325+
326+
pub struct AuthenticationSaslContinueBody(Bytes);
327+
328+
impl AuthenticationSaslContinueBody {
329+
#[inline]
330+
pub fn data(&self) -> &[u8] {
331+
&self.0
332+
}
333+
}
334+
335+
pub struct AuthenticationSaslFinalBody(Bytes);
336+
337+
impl AuthenticationSaslFinalBody {
338+
#[inline]
339+
pub fn data(&self) -> &[u8] {
340+
&self.0
341+
}
342+
}
343+
272344
pub struct BackendKeyDataBody {
273345
process_id: i32,
274346
secret_key: i32,

0 commit comments

Comments
 (0)