1use bytes::{BufMut, Bytes};
3
4use crate::{
5 DecodeBorrow, Encode, ProtocolError, UnknownTaggedFields,
6 primitives::{
7 fixed::{get_i16, get_i32, get_i64, put_i16, put_i32, put_i64},
8 string_bytes::{
9 compact_string_len, put_bytes, put_compact_bytes, put_compact_string, put_string,
10 string_len,
11 },
12 string_bytes_borrowed::{
13 get_bytes_borrowed, get_compact_bytes_borrowed, get_compact_string_borrowed,
14 get_string_borrowed,
15 },
16 },
17 tagged_fields::{WriteTaggedFields, read_tagged_fields, tagged_fields_len},
18};
19pub const API_KEY: i16 = 41;
20pub const MIN_VERSION: i16 = 1;
21pub const MAX_VERSION: i16 = 3;
22pub const FLEXIBLE_MIN: i16 = 2;
23#[inline]
24#[must_use]
25pub fn is_flexible(version: i16) -> bool {
26 version >= FLEXIBLE_MIN
27}
28#[derive(Debug, Clone, PartialEq, Eq, Default)]
29pub struct DescribeDelegationTokenResponse<'a> {
30 pub error_code: i16,
31 pub tokens: Vec<DescribedDelegationToken<'a>>,
32 pub throttle_time_ms: i32,
33 pub unknown_tagged_fields: UnknownTaggedFields,
34}
35impl DescribeDelegationTokenResponse<'_> {
36 #[must_use]
40 pub fn to_owned(
41 &self,
42 ) -> crate::owned::describe_delegation_token_response::DescribeDelegationTokenResponse {
43 crate::owned::describe_delegation_token_response::DescribeDelegationTokenResponse {
44 error_code: (self.error_code),
45 tokens: (self.tokens)
46 .iter()
47 .map(DescribedDelegationToken::to_owned)
48 .collect(),
49 throttle_time_ms: (self.throttle_time_ms),
50 unknown_tagged_fields: self.unknown_tagged_fields.clone(),
51 }
52 }
53}
54impl Encode for DescribeDelegationTokenResponse<'_> {
55 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
56 if !(MIN_VERSION..=MAX_VERSION).contains(&version) {
57 return Err(ProtocolError::UnsupportedVersion {
58 api_key: API_KEY,
59 version,
60 });
61 }
62 let flex = is_flexible(version);
63 if version >= 0 {
64 put_i16(buf, self.error_code);
65 }
66 if version >= 0 {
67 {
68 crate::primitives::array::put_array_len(buf, (self.tokens).len(), flex);
69 for it in &self.tokens {
70 it.encode(buf, version)?;
71 }
72 };
73 }
74 if version >= 0 {
75 put_i32(buf, self.throttle_time_ms);
76 }
77 if flex {
78 let tagged = WriteTaggedFields::new();
79 tagged.write(buf, &self.unknown_tagged_fields);
80 }
81 Ok(())
82 }
83 fn encoded_len(&self, version: i16) -> usize {
84 let flex = is_flexible(version);
85 let mut n: usize = 0;
86 if version >= 0 {
87 n += 2;
88 }
89 if version >= 0 {
90 n += {
91 let prefix =
92 crate::primitives::array::array_len_prefix_len((self.tokens).len(), flex);
93 let body: usize = (self.tokens).iter().map(|it| it.encoded_len(version)).sum();
94 prefix + body
95 };
96 }
97 if version >= 0 {
98 n += 4;
99 }
100 if flex {
101 let known_pairs: Vec<(u32, usize)> = Vec::new();
102 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
103 }
104 n
105 }
106}
107impl<'de> DecodeBorrow<'de> for DescribeDelegationTokenResponse<'de> {
108 fn decode_borrow(buf: &mut &'de [u8], version: i16) -> Result<Self, ProtocolError> {
109 if !(MIN_VERSION..=MAX_VERSION).contains(&version) {
110 return Err(ProtocolError::UnsupportedVersion {
111 api_key: API_KEY,
112 version,
113 });
114 }
115 let flex = is_flexible(version);
116 let mut out = Self::default();
117 if version >= 0 {
118 out.error_code = get_i16(buf)?;
119 }
120 if version >= 0 {
121 out.tokens = {
122 let n = crate::primitives::array::get_array_len(buf, flex)?;
123 let mut v = Vec::with_capacity(n);
124 for _ in 0..n {
125 v.push(DescribedDelegationToken::decode_borrow(buf, version)?);
126 }
127 v
128 };
129 }
130 if version >= 0 {
131 out.throttle_time_ms = get_i32(buf)?;
132 }
133 if flex {
134 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
135 }
136 Ok(out)
137 }
138}
139#[cfg(test)]
140impl DescribeDelegationTokenResponse<'_> {
141 #[must_use]
142 pub fn populated(version: i16) -> Self {
143 let mut m = Self::default();
144 if version >= 0 {
145 m.error_code = 1i16;
146 }
147 if version >= 0 {
148 m.tokens = vec![DescribedDelegationToken::populated(version)];
149 }
150 if version >= 0 {
151 m.throttle_time_ms = 1i32;
152 }
153 m
154 }
155}
156#[derive(Debug, Clone, PartialEq, Eq, Default)]
157pub struct DescribedDelegationToken<'a> {
158 pub principal_type: &'a str,
159 pub principal_name: &'a str,
160 pub token_requester_principal_type: &'a str,
161 pub token_requester_principal_name: &'a str,
162 pub issue_timestamp: i64,
163 pub expiry_timestamp: i64,
164 pub max_timestamp: i64,
165 pub token_id: &'a str,
166 pub hmac: &'a [u8],
167 pub renewers: Vec<DescribedDelegationTokenRenewer<'a>>,
168 pub unknown_tagged_fields: UnknownTaggedFields,
169}
170impl<'a> DescribedDelegationToken<'a> {
171 #[must_use]
175 pub fn to_owned(
176 &self,
177 ) -> crate::owned::describe_delegation_token_response::DescribedDelegationToken {
178 crate::owned::describe_delegation_token_response::DescribedDelegationToken {
179 principal_type: (self.principal_type).to_string(),
180 principal_name: (self.principal_name).to_string(),
181 token_requester_principal_type: (self.token_requester_principal_type).to_string(),
182 token_requester_principal_name: (self.token_requester_principal_name).to_string(),
183 issue_timestamp: (self.issue_timestamp),
184 expiry_timestamp: (self.expiry_timestamp),
185 max_timestamp: (self.max_timestamp),
186 token_id: (self.token_id).to_string(),
187 hmac: Bytes::copy_from_slice(self.hmac),
188 renewers: (self.renewers)
189 .iter()
190 .map(DescribedDelegationTokenRenewer::to_owned)
191 .collect(),
192 unknown_tagged_fields: self.unknown_tagged_fields.clone(),
193 }
194 }
195 fn encode_field_0<B: BufMut>(&self, buf: &mut B, version: i16, flex: bool) {
196 if version >= 0 {
197 if flex {
198 let () = put_compact_string(buf, self.principal_type);
199 } else {
200 let () = put_string(buf, self.principal_type);
201 }
202 }
203 }
204 fn encode_field_1<B: BufMut>(&self, buf: &mut B, version: i16, flex: bool) {
205 if version >= 0 {
206 if flex {
207 let () = put_compact_string(buf, self.principal_name);
208 } else {
209 let () = put_string(buf, self.principal_name);
210 }
211 }
212 }
213 fn encode_field_2<B: BufMut>(&self, buf: &mut B, version: i16, flex: bool) {
214 if version >= 3 {
215 if flex {
216 let () = put_compact_string(buf, self.token_requester_principal_type);
217 } else {
218 let () = put_string(buf, self.token_requester_principal_type);
219 }
220 }
221 }
222 fn encode_field_3<B: BufMut>(&self, buf: &mut B, version: i16, flex: bool) {
223 if version >= 3 {
224 if flex {
225 let () = put_compact_string(buf, self.token_requester_principal_name);
226 } else {
227 let () = put_string(buf, self.token_requester_principal_name);
228 }
229 }
230 }
231 fn encode_field_4<B: BufMut>(&self, buf: &mut B, version: i16, _flex: bool) {
232 if version >= 0 {
233 put_i64(buf, self.issue_timestamp);
234 }
235 }
236 fn encode_field_5<B: BufMut>(&self, buf: &mut B, version: i16, _flex: bool) {
237 if version >= 0 {
238 put_i64(buf, self.expiry_timestamp);
239 }
240 }
241 fn encode_field_6<B: BufMut>(&self, buf: &mut B, version: i16, _flex: bool) {
242 if version >= 0 {
243 put_i64(buf, self.max_timestamp);
244 }
245 }
246 fn encode_field_7<B: BufMut>(&self, buf: &mut B, version: i16, flex: bool) {
247 if version >= 0 {
248 if flex {
249 let () = put_compact_string(buf, self.token_id);
250 } else {
251 let () = put_string(buf, self.token_id);
252 }
253 }
254 }
255 fn encode_field_8<B: BufMut>(&self, buf: &mut B, version: i16, flex: bool) {
256 if version >= 0 {
257 if flex {
258 let () = put_compact_bytes(buf, self.hmac);
259 } else {
260 let () = put_bytes(buf, self.hmac);
261 }
262 }
263 }
264 fn encode_field_9<B: BufMut>(
265 &self,
266 buf: &mut B,
267 version: i16,
268 flex: bool,
269 ) -> Result<(), ProtocolError> {
270 if version >= 0 {
271 {
272 crate::primitives::array::put_array_len(buf, (self.renewers).len(), flex);
273 for it in &self.renewers {
274 it.encode(buf, version)?;
275 }
276 };
277 }
278 Ok(())
279 }
280 fn encode_tagged_fields<B: BufMut>(&self, buf: &mut B, _version: i16, flex: bool) {
281 if flex {
282 let tagged = WriteTaggedFields::new();
283 tagged.write(buf, &self.unknown_tagged_fields);
284 }
285 }
286 fn decode_field_0(
287 out: &mut Self,
288 buf: &mut &'a [u8],
289 version: i16,
290 flex: bool,
291 ) -> Result<(), ProtocolError> {
292 if version >= 0 {
293 out.principal_type = if flex {
294 get_compact_string_borrowed(buf)?
295 } else {
296 get_string_borrowed(buf)?
297 };
298 }
299 Ok(())
300 }
301 fn decode_field_1(
302 out: &mut Self,
303 buf: &mut &'a [u8],
304 version: i16,
305 flex: bool,
306 ) -> Result<(), ProtocolError> {
307 if version >= 0 {
308 out.principal_name = if flex {
309 get_compact_string_borrowed(buf)?
310 } else {
311 get_string_borrowed(buf)?
312 };
313 }
314 Ok(())
315 }
316 fn decode_field_2(
317 out: &mut Self,
318 buf: &mut &'a [u8],
319 version: i16,
320 flex: bool,
321 ) -> Result<(), ProtocolError> {
322 if version >= 3 {
323 out.token_requester_principal_type = if flex {
324 get_compact_string_borrowed(buf)?
325 } else {
326 get_string_borrowed(buf)?
327 };
328 }
329 Ok(())
330 }
331 fn decode_field_3(
332 out: &mut Self,
333 buf: &mut &'a [u8],
334 version: i16,
335 flex: bool,
336 ) -> Result<(), ProtocolError> {
337 if version >= 3 {
338 out.token_requester_principal_name = if flex {
339 get_compact_string_borrowed(buf)?
340 } else {
341 get_string_borrowed(buf)?
342 };
343 }
344 Ok(())
345 }
346 fn decode_field_4(
347 out: &mut Self,
348 buf: &mut &'a [u8],
349 version: i16,
350 _flex: bool,
351 ) -> Result<(), ProtocolError> {
352 if version >= 0 {
353 out.issue_timestamp = get_i64(buf)?;
354 }
355 Ok(())
356 }
357 fn decode_field_5(
358 out: &mut Self,
359 buf: &mut &'a [u8],
360 version: i16,
361 _flex: bool,
362 ) -> Result<(), ProtocolError> {
363 if version >= 0 {
364 out.expiry_timestamp = get_i64(buf)?;
365 }
366 Ok(())
367 }
368 fn decode_field_6(
369 out: &mut Self,
370 buf: &mut &'a [u8],
371 version: i16,
372 _flex: bool,
373 ) -> Result<(), ProtocolError> {
374 if version >= 0 {
375 out.max_timestamp = get_i64(buf)?;
376 }
377 Ok(())
378 }
379 fn decode_field_7(
380 out: &mut Self,
381 buf: &mut &'a [u8],
382 version: i16,
383 flex: bool,
384 ) -> Result<(), ProtocolError> {
385 if version >= 0 {
386 out.token_id = if flex {
387 get_compact_string_borrowed(buf)?
388 } else {
389 get_string_borrowed(buf)?
390 };
391 }
392 Ok(())
393 }
394 fn decode_field_8(
395 out: &mut Self,
396 buf: &mut &'a [u8],
397 version: i16,
398 flex: bool,
399 ) -> Result<(), ProtocolError> {
400 if version >= 0 {
401 out.hmac = if flex {
402 get_compact_bytes_borrowed(buf)?
403 } else {
404 get_bytes_borrowed(buf)?
405 };
406 }
407 Ok(())
408 }
409 fn decode_field_9(
410 out: &mut Self,
411 buf: &mut &'a [u8],
412 version: i16,
413 flex: bool,
414 ) -> Result<(), ProtocolError> {
415 if version >= 0 {
416 out.renewers = {
417 let n = crate::primitives::array::get_array_len(buf, flex)?;
418 let mut v = Vec::with_capacity(n);
419 for _ in 0..n {
420 v.push(DescribedDelegationTokenRenewer::decode_borrow(
421 buf, version,
422 )?);
423 }
424 v
425 };
426 }
427 Ok(())
428 }
429 fn decode_tagged_fields(
430 out: &mut Self,
431 buf: &mut &'a [u8],
432 _version: i16,
433 flex: bool,
434 ) -> Result<(), ProtocolError> {
435 if flex {
436 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
437 }
438 Ok(())
439 }
440}
441impl Encode for DescribedDelegationToken<'_> {
442 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
443 let flex = version >= 2;
444 self.encode_field_0(buf, version, flex);
445 self.encode_field_1(buf, version, flex);
446 self.encode_field_2(buf, version, flex);
447 self.encode_field_3(buf, version, flex);
448 self.encode_field_4(buf, version, flex);
449 self.encode_field_5(buf, version, flex);
450 self.encode_field_6(buf, version, flex);
451 self.encode_field_7(buf, version, flex);
452 self.encode_field_8(buf, version, flex);
453 self.encode_field_9(buf, version, flex)?;
454 self.encode_tagged_fields(buf, version, flex);
455 Ok(())
456 }
457 fn encoded_len(&self, version: i16) -> usize {
458 let flex = version >= 2;
459 let mut n: usize = 0;
460 if version >= 0 {
461 n += if flex {
462 compact_string_len(self.principal_type)
463 } else {
464 string_len(self.principal_type)
465 };
466 }
467 if version >= 0 {
468 n += if flex {
469 compact_string_len(self.principal_name)
470 } else {
471 string_len(self.principal_name)
472 };
473 }
474 if version >= 3 {
475 n += if flex {
476 compact_string_len(self.token_requester_principal_type)
477 } else {
478 string_len(self.token_requester_principal_type)
479 };
480 }
481 if version >= 3 {
482 n += if flex {
483 compact_string_len(self.token_requester_principal_name)
484 } else {
485 string_len(self.token_requester_principal_name)
486 };
487 }
488 if version >= 0 {
489 n += 8;
490 }
491 if version >= 0 {
492 n += 8;
493 }
494 if version >= 0 {
495 n += 8;
496 }
497 if version >= 0 {
498 n += if flex {
499 compact_string_len(self.token_id)
500 } else {
501 string_len(self.token_id)
502 };
503 }
504 if version >= 0 {
505 n += if flex {
506 crate::primitives::varint::uvarint_len(
507 u32::try_from((self.hmac).len() + 1).unwrap(),
508 ) + (self.hmac).len()
509 } else {
510 4 + (self.hmac).len()
511 };
512 }
513 if version >= 0 {
514 n += {
515 let prefix =
516 crate::primitives::array::array_len_prefix_len((self.renewers).len(), flex);
517 let body: usize = (self.renewers)
518 .iter()
519 .map(|it| it.encoded_len(version))
520 .sum();
521 prefix + body
522 };
523 }
524 if flex {
525 let known_pairs: Vec<(u32, usize)> = Vec::new();
526 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
527 }
528 n
529 }
530}
531impl<'de> DecodeBorrow<'de> for DescribedDelegationToken<'de> {
532 fn decode_borrow(buf: &mut &'de [u8], version: i16) -> Result<Self, ProtocolError> {
533 let flex = version >= 2;
534 let mut out = Self::default();
535 Self::decode_field_0(&mut out, buf, version, flex)?;
536 Self::decode_field_1(&mut out, buf, version, flex)?;
537 Self::decode_field_2(&mut out, buf, version, flex)?;
538 Self::decode_field_3(&mut out, buf, version, flex)?;
539 Self::decode_field_4(&mut out, buf, version, flex)?;
540 Self::decode_field_5(&mut out, buf, version, flex)?;
541 Self::decode_field_6(&mut out, buf, version, flex)?;
542 Self::decode_field_7(&mut out, buf, version, flex)?;
543 Self::decode_field_8(&mut out, buf, version, flex)?;
544 Self::decode_field_9(&mut out, buf, version, flex)?;
545 Self::decode_tagged_fields(&mut out, buf, version, flex)?;
546 Ok(out)
547 }
548}
549#[cfg(test)]
550impl DescribedDelegationToken<'_> {
551 #[must_use]
552 pub fn populated(version: i16) -> Self {
553 let mut m = Self::default();
554 if version >= 0 {
555 m.principal_type = "x";
556 }
557 if version >= 0 {
558 m.principal_name = "x";
559 }
560 if version >= 3 {
561 m.token_requester_principal_type = "x";
562 }
563 if version >= 3 {
564 m.token_requester_principal_name = "x";
565 }
566 if version >= 0 {
567 m.issue_timestamp = 1i64;
568 }
569 if version >= 0 {
570 m.expiry_timestamp = 1i64;
571 }
572 if version >= 0 {
573 m.max_timestamp = 1i64;
574 }
575 if version >= 0 {
576 m.token_id = "x";
577 }
578 if version >= 0 {
579 m.hmac = &b"x"[..];
580 }
581 if version >= 0 {
582 m.renewers = vec![DescribedDelegationTokenRenewer::populated(version)];
583 }
584 m
585 }
586}
587#[derive(Debug, Clone, PartialEq, Eq, Default)]
588pub struct DescribedDelegationTokenRenewer<'a> {
589 pub principal_type: &'a str,
590 pub principal_name: &'a str,
591 pub unknown_tagged_fields: UnknownTaggedFields,
592}
593impl DescribedDelegationTokenRenewer<'_> {
594 #[must_use]
598 pub fn to_owned(
599 &self,
600 ) -> crate::owned::describe_delegation_token_response::DescribedDelegationTokenRenewer {
601 crate::owned::describe_delegation_token_response::DescribedDelegationTokenRenewer {
602 principal_type: (self.principal_type).to_string(),
603 principal_name: (self.principal_name).to_string(),
604 unknown_tagged_fields: self.unknown_tagged_fields.clone(),
605 }
606 }
607}
608impl Encode for DescribedDelegationTokenRenewer<'_> {
609 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
610 let flex = version >= 2;
611 if version >= 0 {
612 if flex {
613 let () = put_compact_string(buf, self.principal_type);
614 } else {
615 let () = put_string(buf, self.principal_type);
616 }
617 }
618 if version >= 0 {
619 if flex {
620 let () = put_compact_string(buf, self.principal_name);
621 } else {
622 let () = put_string(buf, self.principal_name);
623 }
624 }
625 if flex {
626 let tagged = WriteTaggedFields::new();
627 tagged.write(buf, &self.unknown_tagged_fields);
628 }
629 Ok(())
630 }
631 fn encoded_len(&self, version: i16) -> usize {
632 let flex = version >= 2;
633 let mut n: usize = 0;
634 if version >= 0 {
635 n += if flex {
636 compact_string_len(self.principal_type)
637 } else {
638 string_len(self.principal_type)
639 };
640 }
641 if version >= 0 {
642 n += if flex {
643 compact_string_len(self.principal_name)
644 } else {
645 string_len(self.principal_name)
646 };
647 }
648 if flex {
649 let known_pairs: Vec<(u32, usize)> = Vec::new();
650 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
651 }
652 n
653 }
654}
655impl<'de> DecodeBorrow<'de> for DescribedDelegationTokenRenewer<'de> {
656 fn decode_borrow(buf: &mut &'de [u8], version: i16) -> Result<Self, ProtocolError> {
657 let flex = version >= 2;
658 let mut out = Self::default();
659 if version >= 0 {
660 out.principal_type = if flex {
661 get_compact_string_borrowed(buf)?
662 } else {
663 get_string_borrowed(buf)?
664 };
665 }
666 if version >= 0 {
667 out.principal_name = if flex {
668 get_compact_string_borrowed(buf)?
669 } else {
670 get_string_borrowed(buf)?
671 };
672 }
673 if flex {
674 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
675 }
676 Ok(out)
677 }
678}
679#[cfg(test)]
680impl DescribedDelegationTokenRenewer<'_> {
681 #[must_use]
682 pub fn populated(version: i16) -> Self {
683 let mut m = Self::default();
684 if version >= 0 {
685 m.principal_type = "x";
686 }
687 if version >= 0 {
688 m.principal_name = "x";
689 }
690 m
691 }
692}