1use super::category::*;
2use super::request::*;
3use crate::acl::*;
4use crate::base::*;
5use crate::crypto::*;
6use crate::ndn::*;
7use crate::non::*;
8use crate::SelectFilter;
9use cyfs_base::*;
10
11struct ExpReservedTokenTranslatorHelper;
12
13impl ExpReservedTokenTranslatorHelper {
14 fn is_response_token(token: &str) -> bool {
38 token.starts_with("resp.")
39 }
40
41 fn to_response_token(token: &str) -> String {
42 format!("resp.{}", token)
43 }
44
45 fn from_response_token(token: &str) -> &str {
46 token.trim_start_matches("resp.")
47 }
48
49 fn trans_request_source(token: &str, source: &RequestSourceInfo) -> Option<ExpTokenEvalValue> {
50 let ret = match token {
51 "source.protocol" => ExpTokenEvalValue::from_string(&source.protocol),
52 "source.dec_id" => ExpTokenEvalValue::from_string(&source.dec),
53 "source.zone" => ExpTokenEvalValue::from_opt_string(&source.zone.zone),
54 "source.device" => ExpTokenEvalValue::from_opt_string(&source.zone.device),
55 "source.zone_category" => ExpTokenEvalValue::from_string(&source.zone.zone_category),
56 _ => {
57 return None;
58 }
59 };
60
61 Some(ret)
62 }
63
64 fn trans_non_input_request_common(
65 token: &str,
66 common: &NONInputRequestCommon,
67 ) -> Option<ExpTokenEvalValue> {
68 if let Some(v) =
69 ExpReservedTokenTranslatorHelper::trans_request_source(token, &common.source)
70 {
71 return Some(v);
72 }
73
74
75 let ret = match token {
76 "req_path" => ExpTokenEvalValue::from_opt_glob(&common.req_path),
77 "level" => ExpTokenEvalValue::from_string(&common.level),
78 "target" => ExpTokenEvalValue::from_opt_string(&common.target),
79 "flags" => ExpTokenEvalValue::U32(common.flags),
80 _ => {
81 return None;
82 }
83 };
84
85 Some(ret)
86 }
87
88 fn trans_bdt_interest_referer(
89 token: &str,
90 referer: &BdtDataRefererInfo
91 ) -> Option<ExpTokenEvalValue> {
92 let ret = match token {
93 "target" => ExpTokenEvalValue::from_opt_string(&referer.target),
94 "object_id" => ExpTokenEvalValue::from_string(&referer.object_id),
95 "inner_path" => ExpTokenEvalValue::from_opt_glob(&referer.inner_path),
96 "dec_id" => ExpTokenEvalValue::from_string(&referer.object_id),
97 "req_path" => ExpTokenEvalValue::from_opt_glob(&referer.inner_path),
98 "referer_object" => {
99 if referer.referer_object.len() > 0 {
100 ExpTokenEvalValue::from_glob_list(&referer.referer_object)
101 } else {
102 ExpTokenEvalValue::None
103 }
104 },
105 "flags" => ExpTokenEvalValue::U32(referer.flags),
106 _ => {
107 return None;
108 }
109 };
110
111 Some(ret)
112 }
113
114 fn trans_ndn_input_request_common(
115 token: &str,
116 common: &NDNInputRequestCommon,
117 ) -> Option<ExpTokenEvalValue> {
118 if let Some(v) =
119 ExpReservedTokenTranslatorHelper::trans_request_source(token, &common.source)
120 {
121 return Some(v);
122 }
123
124 let ret = match token {
125 "req_path" => ExpTokenEvalValue::from_opt_glob(&common.req_path),
126 "level" => ExpTokenEvalValue::from_string(&common.level),
127 "referer_object" => {
128 if common.referer_object.len() > 0 {
129 ExpTokenEvalValue::from_glob_list(&common.referer_object)
130 } else {
131 ExpTokenEvalValue::None
132 }
133 }
134 "target" => ExpTokenEvalValue::from_opt_string(&common.target),
135 "flags" => ExpTokenEvalValue::U32(common.flags),
136 _ => {
137 return None;
138 }
139 };
140
141 Some(ret)
142 }
143
144 fn trans_crypto_input_request_common(
145 token: &str,
146 common: &CryptoInputRequestCommon,
147 ) -> Option<ExpTokenEvalValue> {
148 if let Some(v) =
149 ExpReservedTokenTranslatorHelper::trans_request_source(token, &common.source)
150 {
151 return Some(v);
152 }
153
154 let ret = match token {
155 "req_path" => ExpTokenEvalValue::from_opt_glob(&common.req_path),
156 "target" => ExpTokenEvalValue::from_opt_string(&common.target),
157 "flags" => ExpTokenEvalValue::U32(common.flags),
158 _ => {
159 return None;
160 }
161 };
162
163 Some(ret)
164 }
165
166 fn trans_object(token: &str, object: Option<&AnyNamedObject>) -> Option<ExpTokenEvalValue> {
167 let ret = match token {
168 "obj_type" => match object {
169 Some(v) => ExpTokenEvalValue::U16(v.obj_type()),
170 None => ExpTokenEvalValue::None,
171 },
172 "object.dec_id" => match object {
173 Some(v) => ExpTokenEvalValue::from_opt_string(v.dec_id()),
174 None => ExpTokenEvalValue::None,
175 },
176 "object.author" => match object {
177 Some(v) => ExpTokenEvalValue::from_opt_string(&v.author()),
178 None => ExpTokenEvalValue::None,
179 },
180 "object.owner" => match object {
181 Some(v) => ExpTokenEvalValue::from_opt_string(&v.owner()),
182 None => ExpTokenEvalValue::None,
183 },
184
185 _ => return None,
186 };
187
188 Some(ret)
189 }
190
191 fn trans_object_info(token: &str, info: Option<&NONObjectInfo>) -> Option<ExpTokenEvalValue> {
192 let object_id = match info {
193 Some(info) => Some(&info.object_id),
194 None => None,
195 };
196 if let Some(v) = Self::trans_object_id(token, object_id) {
197 return Some(v);
198 }
199
200 let object = match info {
201 Some(info) => info.object.as_deref(),
202 None => None,
203 };
204 if let Some(v) = Self::trans_object(token, object) {
205 return Some(v);
206 }
207
208 None
209 }
210
211 fn trans_select_filter(token: &str, filter: &SelectFilter) -> Option<ExpTokenEvalValue> {
212 let ret = match token {
213 "filter.obj_type" => match filter.obj_type.to_owned() {
214 Some(v) => ExpTokenEvalValue::U16(v),
215 None => ExpTokenEvalValue::None,
216 },
217 "filter.obj_type_code" => match filter.obj_type_code.as_ref() {
218 Some(code) => ExpTokenEvalValue::U16(code.into()),
219 None => ExpTokenEvalValue::None,
220 },
221
222 "filter.dec_id" => ExpTokenEvalValue::from_opt_string(&filter.dec_id),
223 "filter.owner_id" => ExpTokenEvalValue::from_opt_string(&filter.owner_id),
224 "filter.author_id" => ExpTokenEvalValue::from_opt_string(&filter.author_id),
225 "filter.flags" => match filter.flags.to_owned() {
226 Some(v) => ExpTokenEvalValue::U32(v),
227 None => ExpTokenEvalValue::None,
228 },
229 _ => {
230 return None;
231 }
232 };
233
234 Some(ret)
235 }
236
237 fn trans_area(token: &str, area: Option<&Area>) -> Option<ExpTokenEvalValue> {
238 let ret = match token {
239 "area.country" => match area {
240 Some(area) => ExpTokenEvalValue::U16(area.country),
241 None => ExpTokenEvalValue::None,
242 },
243 "area.carrier" => match area {
244 Some(area) => ExpTokenEvalValue::U8(area.carrier),
245 None => ExpTokenEvalValue::None,
246 },
247 "area.city" => match area {
248 Some(area) => ExpTokenEvalValue::U16(area.city),
249 None => ExpTokenEvalValue::None,
250 },
251 "area.inner" => match area {
252 Some(area) => ExpTokenEvalValue::U8(area.inner),
253 None => ExpTokenEvalValue::None,
254 },
255 _ => {
256 return None;
257 }
258 };
259
260 Some(ret)
261 }
262
263 fn trans_object_id(token: &str, object_id: Option<&ObjectId>) -> Option<ExpTokenEvalValue> {
264 let ret = match token {
265 "object_id" => match object_id {
266 Some(object_id) => ExpTokenEvalValue::from_string(object_id),
267 None => ExpTokenEvalValue::None,
268 },
269 "obj_type_code" => match object_id {
270 Some(object_id) => ExpTokenEvalValue::U16(object_id.obj_type_code().into()),
271 None => ExpTokenEvalValue::None,
272 },
273 "obj_category" => match object_id {
274 Some(object_id) => ExpTokenEvalValue::from_string(&object_id.object_category()),
275 None => ExpTokenEvalValue::None,
276 },
277 _ => {
278 if token.starts_with("area.") {
279 let area = if let Some(object_id) = object_id {
280 let info: ObjectIdInfo = object_id.info();
281 if let Some(area) = info.into_area() {
282 Some(area)
283 } else {
284 None
285 }
286 } else {
287 None
288 };
289
290 if let Some(v) = Self::trans_area(token, area.as_ref()) {
291 return Some(v);
292 }
293
294 unreachable!();
295 }
296
297 return None;
298 }
299 };
300
301 Some(ret)
302 }
303
304 fn trans_bucky_error(token: &str, error: &BuckyError) -> Option<ExpTokenEvalValue> {
305 let ret = match token {
306 "error.code" => ExpTokenEvalValue::U32(error.code().into()),
307 "error.msg" => ExpTokenEvalValue::String(error.msg().to_owned()),
308 _ => return None,
309 };
310
311 Some(ret)
312 }
313}
314
315impl ExpReservedTokenTranslator for NONPutObjectInputRequest {
316 fn trans(&self, token: &str) -> ExpTokenEvalValue {
317 if let Some(v) =
318 ExpReservedTokenTranslatorHelper::trans_non_input_request_common(token, &self.common)
319 {
320 return v;
321 }
322
323 if let Some(v) =
324 ExpReservedTokenTranslatorHelper::trans_object_info(token, Some(&self.object))
325 {
326 return v;
327 }
328
329 unreachable!("unknown router put_object reserved token: {}", token);
330 }
331}
332
333impl ExpReservedTokenTranslator for NONPutObjectInputResponse {
334 fn trans(&self, token: &str) -> ExpTokenEvalValue {
335 match token {
336 "result" => ExpTokenEvalValue::from_string(&self.result),
337 "object_update_time" => {
338 ExpTokenEvalValue::U64(self.object_update_time.to_owned().unwrap_or(0))
339 }
340 "object_expires_time" => {
341 ExpTokenEvalValue::U64(self.object_expires_time.to_owned().unwrap_or(0))
342 }
343
344 _ => ExpTokenEvalValue::None,
345 }
346 }
347}
348
349impl ExpReservedTokenTranslator for NONGetObjectInputRequest {
350 fn trans(&self, token: &str) -> ExpTokenEvalValue {
351 match token {
352 "inner_path" => ExpTokenEvalValue::from_opt_glob(&self.inner_path),
353
354 _ => {
355 if let Some(v) =
356 ExpReservedTokenTranslatorHelper::trans_object_id(token, Some(&self.object_id))
357 {
358 return v;
359 }
360
361 if let Some(v) = ExpReservedTokenTranslatorHelper::trans_non_input_request_common(
362 token,
363 &self.common,
364 ) {
365 return v;
366 }
367
368 unreachable!(
369 "unknown router get_object request reserved token: {}",
370 token
371 );
372 }
373 }
374 }
375}
376
377impl ExpReservedTokenTranslator for NONGetObjectInputResponse {
378 fn trans(&self, token: &str) -> ExpTokenEvalValue {
379 if let Some(v) =
380 ExpReservedTokenTranslatorHelper::trans_object_info(token, Some(&self.object))
381 {
382 return v;
383 }
384
385 ExpTokenEvalValue::None
386 }
387}
388
389impl ExpReservedTokenTranslator for NONPostObjectInputRequest {
390 fn trans(&self, token: &str) -> ExpTokenEvalValue {
391 if let Some(v) =
392 ExpReservedTokenTranslatorHelper::trans_non_input_request_common(token, &self.common)
393 {
394 return v;
395 }
396
397 if let Some(v) =
398 ExpReservedTokenTranslatorHelper::trans_object_info(token, Some(&self.object))
399 {
400 return v;
401 }
402 unreachable!(
403 "unknown router post_object request reserved token: {}",
404 token
405 );
406 }
407}
408
409impl ExpReservedTokenTranslator for NONPostObjectInputResponse {
410 fn trans(&self, token: &str) -> ExpTokenEvalValue {
411 if let Some(v) =
412 ExpReservedTokenTranslatorHelper::trans_object_info(token, self.object.as_ref())
413 {
414 return v;
415 }
416
417 ExpTokenEvalValue::None
418 }
419}
420
421impl ExpReservedTokenTranslator for NONSelectObjectInputRequest {
422 fn trans(&self, token: &str) -> ExpTokenEvalValue {
423 if let Some(v) =
424 ExpReservedTokenTranslatorHelper::trans_non_input_request_common(token, &self.common)
425 {
426 return v;
427 }
428
429 if let Some(v) = ExpReservedTokenTranslatorHelper::trans_select_filter(token, &self.filter)
430 {
431 return v;
432 }
433
434 unreachable!(
435 "unknown router select_object request reserved token: {}",
436 token
437 );
438 }
439}
440
441impl ExpReservedTokenTranslator for NONSelectObjectInputResponse {
442 fn trans(&self, token: &str) -> ExpTokenEvalValue {
443 if self.objects.is_empty() {
444 return ExpTokenEvalValue::None;
445 }
446
447 let first = &self.objects[0];
450 if let Some(ret) =
451 ExpReservedTokenTranslatorHelper::trans_object_info(token, first.object.as_ref())
452 {
453 return ret;
454 }
455
456 ExpTokenEvalValue::None
457 }
458}
459
460impl ExpReservedTokenTranslator for NONDeleteObjectInputRequest {
461 fn trans(&self, token: &str) -> ExpTokenEvalValue {
462 if token == "inner_path" {
463 return ExpTokenEvalValue::from_opt_glob(&self.inner_path);
464 }
465 if let Some(v) =
466 ExpReservedTokenTranslatorHelper::trans_object_id(token, Some(&self.object_id))
467 {
468 return v;
469 }
470 if let Some(v) =
471 ExpReservedTokenTranslatorHelper::trans_non_input_request_common(token, &self.common)
472 {
473 return v;
474 }
475
476 unreachable!("unknown router delete_object reserved token: {}", token);
477 }
478}
479
480impl ExpReservedTokenTranslator for NONDeleteObjectInputResponse {
481 fn trans(&self, token: &str) -> ExpTokenEvalValue {
482 if let Some(v) =
483 ExpReservedTokenTranslatorHelper::trans_object_info(token, self.object.as_ref())
484 {
485 return v;
486 }
487
488 ExpTokenEvalValue::None
489 }
490}
491
492impl ExpReservedTokenTranslator for NDNPutDataInputRequest {
494 fn trans(&self, token: &str) -> ExpTokenEvalValue {
495 if let Some(v) =
496 ExpReservedTokenTranslatorHelper::trans_ndn_input_request_common(token, &self.common)
497 {
498 return v;
499 }
500
501 if let Some(v) =
502 ExpReservedTokenTranslatorHelper::trans_object_id(token, Some(&self.object_id))
503 {
504 return v;
505 }
506
507 unreachable!("unknown ndn put_data reserved token: {}", token);
508 }
509}
510
511impl ExpReservedTokenTranslator for NDNPutDataInputResponse {
512 fn trans(&self, token: &str) -> ExpTokenEvalValue {
513 match token {
514 "result" => ExpTokenEvalValue::from_string(&self.result),
515 _ => ExpTokenEvalValue::None,
516 }
517 }
518}
519
520impl ExpReservedTokenTranslator for NDNGetDataInputRequest {
522 fn trans(&self, token: &str) -> ExpTokenEvalValue {
523 match token {
524 "inner_path" => ExpTokenEvalValue::from_opt_glob(&self.inner_path),
525 _ => {
526 if let Some(v) = ExpReservedTokenTranslatorHelper::trans_ndn_input_request_common(
527 token,
528 &self.common,
529 ) {
530 return v;
531 }
532 if let Some(v) =
533 ExpReservedTokenTranslatorHelper::trans_object_id(token, Some(&self.object_id))
534 {
535 return v;
536 }
537
538 unreachable!("unknown ndn get_data reserved token: {}", token);
539 }
540 }
541 }
542}
543
544impl ExpReservedTokenTranslator for NDNGetDataInputResponse {
545 fn trans(&self, token: &str) -> ExpTokenEvalValue {
546 match token {
547 "attr" => match &self.attr {
548 Some(v) => ExpTokenEvalValue::U32(v.flags()),
549 None => ExpTokenEvalValue::None,
550 },
551 "length" => ExpTokenEvalValue::U64(self.length),
552 _ => {
553 if let Some(v) =
554 ExpReservedTokenTranslatorHelper::trans_object_id(token, Some(&self.object_id))
555 {
556 return v;
557 }
558
559 ExpTokenEvalValue::None
560 }
561 }
562 }
563}
564
565impl ExpReservedTokenTranslator for NDNDeleteDataInputRequest {
567 fn trans(&self, token: &str) -> ExpTokenEvalValue {
568 match token {
569 "inner_path" => ExpTokenEvalValue::from_opt_glob(&self.inner_path),
570 _ => {
571 if let Some(v) = ExpReservedTokenTranslatorHelper::trans_ndn_input_request_common(
572 token,
573 &self.common,
574 ) {
575 return v;
576 }
577 if let Some(v) =
578 ExpReservedTokenTranslatorHelper::trans_object_id(token, Some(&self.object_id))
579 {
580 return v;
581 }
582
583 unreachable!("unknown ndn delete_data reserved token: {}", token);
584 }
585 }
586 }
587}
588
589impl ExpReservedTokenTranslator for NDNDeleteDataInputResponse {
590 fn trans(&self, token: &str) -> ExpTokenEvalValue {
591 match token {
592 _ => {
593 if let Some(v) =
594 ExpReservedTokenTranslatorHelper::trans_object_id(token, Some(&self.object_id))
595 {
596 return v;
597 }
598
599 ExpTokenEvalValue::None
600 }
601 }
602 }
603}
604
605impl ExpReservedTokenTranslator for CryptoSignObjectInputRequest {
607 fn trans(&self, token: &str) -> ExpTokenEvalValue {
608 match token {
609 "crypto_flags" => ExpTokenEvalValue::U32(self.flags),
610 _ => {
611 if let Some(v) = ExpReservedTokenTranslatorHelper::trans_crypto_input_request_common(
612 token,
613 &self.common,
614 ) {
615 return v;
616 }
617 if let Some(v) =
618 ExpReservedTokenTranslatorHelper::trans_object_info(token, Some(&self.object))
619 {
620 return v;
621 }
622
623 unreachable!("unknown crypto sign_object reserved token: {}", token);
624 }
625 }
626 }
627}
628
629impl ExpReservedTokenTranslator for CryptoSignObjectInputResponse {
630 fn trans(&self, token: &str) -> ExpTokenEvalValue {
631 match token {
632 "result" => ExpTokenEvalValue::from_string(&self.result),
633 _ => {
634 if let Some(v) =
635 ExpReservedTokenTranslatorHelper::trans_object_info(token, self.object.as_ref())
636 {
637 return v;
638 }
639
640 ExpTokenEvalValue::None
641 }
642 }
643 }
644}
645
646impl ExpReservedTokenTranslator for CryptoVerifyObjectInputRequest {
648 fn trans(&self, token: &str) -> ExpTokenEvalValue {
649 match token {
650 "sign_type" => ExpTokenEvalValue::from_string(&self.sign_type),
651 "sign_object_type" => ExpTokenEvalValue::from_string(&self.sign_object),
652 _ => {
653 if token.starts_with("sign_object") {
654 let sub_token = token.trim_start_matches("sign_object.");
655
656 match &self.sign_object {
657 VerifyObjectType::Object(sign_object) => {
658 if let Some(v) = ExpReservedTokenTranslatorHelper::trans_object_id(
659 sub_token,
660 Some(&sign_object.object_id),
661 ) {
662 return v;
663 }
664
665 let sign_object = sign_object.object.as_ref().map(|v| v.as_ref());
666 if let Some(v) = ExpReservedTokenTranslatorHelper::trans_object(
667 sub_token,
668 sign_object,
669 ) {
670 return v;
671 }
672
673 unreachable!("unknown crypto verify_object reserved token: {}", token);
674 }
675 _ => {
676 return ExpTokenEvalValue::None;
677 }
678 }
679 }
680
681 if let Some(v) = ExpReservedTokenTranslatorHelper::trans_crypto_input_request_common(
682 token,
683 &self.common,
684 ) {
685 return v;
686 }
687 if let Some(v) =
688 ExpReservedTokenTranslatorHelper::trans_object_info(token, Some(&self.object))
689 {
690 return v;
691 }
692
693 unreachable!("unknown crypto verify_object reserved token: {}", token);
694 }
695 }
696 }
697}
698
699impl ExpReservedTokenTranslator for CryptoVerifyObjectInputResponse {
700 fn trans(&self, token: &str) -> ExpTokenEvalValue {
701 match token {
702 "valid" => ExpTokenEvalValue::Bool(self.result.valid),
703 _ => ExpTokenEvalValue::None,
704 }
705 }
706}
707
708impl ExpReservedTokenTranslator for CryptoEncryptDataInputRequest {
710 fn trans(&self, token: &str) -> ExpTokenEvalValue {
711 match token {
712 "encrypt_type" => ExpTokenEvalValue::String(self.encrypt_type.to_string()),
713 "crypto_flags" => ExpTokenEvalValue::U32(self.flags),
714 _ => {
715 if let Some(v) = ExpReservedTokenTranslatorHelper::trans_crypto_input_request_common(
716 token,
717 &self.common,
718 ) {
719 return v;
720 }
721
722 unreachable!("unknown crypto encrypt_data reserved token: {}", token);
723 }
724 }
725 }
726}
727
728impl ExpReservedTokenTranslator for CryptoEncryptDataInputResponse {
729 fn trans(&self, _token: &str) -> ExpTokenEvalValue {
730 ExpTokenEvalValue::None
731 }
732}
733
734impl ExpReservedTokenTranslator for CryptoDecryptDataInputRequest {
736 fn trans(&self, token: &str) -> ExpTokenEvalValue {
737 match token {
738 "decrypt_type" => ExpTokenEvalValue::String(self.decrypt_type.to_string()),
739 "crypto_flags" => ExpTokenEvalValue::U32(self.flags),
740 _ => {
741 if let Some(v) = ExpReservedTokenTranslatorHelper::trans_crypto_input_request_common(
742 token,
743 &self.common,
744 ) {
745 return v;
746 }
747
748 unreachable!("unknown crypto decrypt_data reserved token: {}", token);
749 }
750 }
751 }
752}
753
754impl ExpReservedTokenTranslator for CryptoDecryptDataInputResponse {
755 fn trans(&self, token: &str) -> ExpTokenEvalValue {
756 match token {
757 "result" => ExpTokenEvalValue::from_string(&self.result),
758 _ => {
759 ExpTokenEvalValue::None
760 }
761 }
762 }
763}
764
765impl ExpReservedTokenTranslator for AclHandlerRequest {
767 fn trans(&self, token: &str) -> ExpTokenEvalValue {
768 match token {
769 "protocol" => ExpTokenEvalValue::from_string(&self.protocol),
770 "direction" => ExpTokenEvalValue::from_string(&self.action.direction),
771 "operation" => ExpTokenEvalValue::from_string(&self.action.operation),
772
773 "device" | "source" | "target" | "your" => {
774 ExpTokenEvalValue::from_string(&self.device_id)
775 }
776
777 "inner_path" => ExpTokenEvalValue::from_opt_glob(&self.inner_path),
778 "dec_id" => ExpTokenEvalValue::from_string(&self.dec_id),
779 "req_path" => ExpTokenEvalValue::from_opt_glob(&self.req_path),
780 "referer_object" => {
781 if let Some(referer_object) = &self.referer_object {
782 if referer_object.len() > 0 {
783 ExpTokenEvalValue::from_glob_list(referer_object)
784 } else {
785 ExpTokenEvalValue::None
786 }
787 } else {
788 ExpTokenEvalValue::None
789 }
790 }
791
792 _ => {
793 if let Some(v) = ExpReservedTokenTranslatorHelper::trans_object_id(
794 token,
795 self.object.as_ref().map(|item| &item.object_id),
796 ) {
797 return v;
798 }
799
800 let object = self
801 .object
802 .as_ref()
803 .map(|item| item.object.as_deref())
804 .flatten();
805 if let Some(v) = ExpReservedTokenTranslatorHelper::trans_object(token, object) {
806 return v;
807 }
808
809 unreachable!("unknown router acl request reserved token: {}", token);
810 }
811 }
812 }
813}
814
815impl ExpReservedTokenTranslator for AclHandlerResponse {
816 fn trans(&self, token: &str) -> ExpTokenEvalValue {
817 match token {
818 "access" => ExpTokenEvalValue::from_string(&self.access),
819 _ => ExpTokenEvalValue::None,
820 }
821 }
822}
823
824
825impl ExpReservedTokenTranslator for InterestHandlerRequest {
827 fn trans(&self, token: &str) -> ExpTokenEvalValue {
828 match token {
829 "chunk" => ExpTokenEvalValue::from_string(&self.chunk),
830 "from" => ExpTokenEvalValue::from_opt_string(&self.from),
831 "from_channel" => ExpTokenEvalValue::from_string(&self.from_channel),
832 "group_path" => ExpTokenEvalValue::from_opt_glob(&self.group_path),
833 _ => {
834 if let Some(referer) = &self.referer {
835 if let Some(v) = ExpReservedTokenTranslatorHelper::trans_bdt_interest_referer(token, referer) {
836 return v;
837 }
838 }
839 unreachable!("unknown router interest request reserved token: {}", token);
840 }
841 }
842 }
843}
844
845impl ExpReservedTokenTranslator for InterestHandlerResponse {
846 fn trans(&self, token: &str) -> ExpTokenEvalValue {
847 match token {
848 "type" => ExpTokenEvalValue::String(self.type_str().to_owned()),
849 "upload.groups" => match self {
850 Self::Upload { groups, .. } => ExpTokenEvalValue::from_glob_list(&groups),
851 _ => ExpTokenEvalValue::from_glob_list(&Vec::<String>::new()),
852 },
853 "upload.file_path" => match self {
854 Self::Upload { source, .. } => match source {
855 InterestUploadSource::ChunkStore => ExpTokenEvalValue::None,
856 InterestUploadSource::File { path, .. } => ExpTokenEvalValue::from_opt_glob(&path.to_str())
857 },
858 _ => ExpTokenEvalValue::None,
859 },
860 "upload.file_offset" => match self {
861 Self::Upload { source, .. } => match source {
862 InterestUploadSource::ChunkStore => ExpTokenEvalValue::None,
863 InterestUploadSource::File { offset, .. } => ExpTokenEvalValue::U64(*offset),
864 },
865 _ => ExpTokenEvalValue::None,
866 },
867 "transmit_to" => ExpTokenEvalValue::from_opt_string(&self.transmit_to().clone()),
868 "err" => {
869 if let Some(err) = self.resp_interest().map(|r| r.err.as_u16()) {
870 ExpTokenEvalValue::U32(err as u32)
871 } else {
872 ExpTokenEvalValue::None
873 }
874 },
875 "redirect" => ExpTokenEvalValue::from_opt_string(&self.resp_interest().and_then(|r| r.redirect.clone())),
876 "redirect_referer_target" => ExpTokenEvalValue::from_opt_string(&self.resp_interest().and_then(|r| r.redirect_referer_target.clone())),
877 _ => {
878 unreachable!("unknown router interest response reserved token: {}", token);
879 },
880 }
881 }
882}
883
884impl<REQ, RESP> ExpReservedTokenTranslator for RouterHandlerRequest<REQ, RESP>
885where
886 REQ: Send + Sync + 'static + ExpReservedTokenTranslator + JsonCodec<REQ> + std::fmt::Display,
887 RESP: Send + Sync + 'static + ExpReservedTokenTranslator + JsonCodec<RESP> + std::fmt::Display,
888{
889 fn trans(&self, token: &str) -> ExpTokenEvalValue {
890 if ExpReservedTokenTranslatorHelper::is_response_token(token) {
891 let token = ExpReservedTokenTranslatorHelper::from_response_token(token);
892 if let Some(resp) = &self.response {
893 match resp {
894 Ok(resp) => resp.trans(token),
895 Err(e) => {
896 if let Some(ret) =
897 ExpReservedTokenTranslatorHelper::trans_bucky_error(token, e)
898 {
899 return ret;
900 }
901
902 ExpTokenEvalValue::None
903 }
904 }
905 } else {
906 ExpTokenEvalValue::None
907 }
908 } else {
909 self.request.trans(token)
910 }
911 }
912}
913
914pub struct RouterHandlerReservedTokenList {
915 pub put_object: ExpReservedTokenList,
916 pub get_object: ExpReservedTokenList,
917 pub post_object: ExpReservedTokenList,
918 pub select_object: ExpReservedTokenList,
919 pub delete_object: ExpReservedTokenList,
920
921 pub get_data: ExpReservedTokenList,
922 pub put_data: ExpReservedTokenList,
923 pub delete_data: ExpReservedTokenList,
924
925 pub sign_object: ExpReservedTokenList,
926 pub verify_object: ExpReservedTokenList,
927 pub encrypt_data: ExpReservedTokenList,
928 pub decrypt_data: ExpReservedTokenList,
929
930 pub acl: ExpReservedTokenList,
931 pub interest: ExpReservedTokenList,
932}
933
934impl RouterHandlerReservedTokenList {
935 fn new() -> Self {
936 Self {
937 put_object: Self::gen_put_object(),
938 get_object: Self::gen_get_object(),
939 post_object: Self::gen_post_object(),
940 select_object: Self::gen_select_object(),
941 delete_object: Self::gen_delete_object(),
942
943 get_data: Self::gen_get_data(),
944 put_data: Self::gen_put_data(),
945 delete_data: Self::gen_delete_data(),
946
947 sign_object: Self::gen_sign_object(),
948 verify_object: Self::gen_verify_object(),
949 encrypt_data: Self::gen_encrypt_object(),
950 decrypt_data: Self::gen_decrypt_object(),
951
952 acl: Self::gen_acl(),
953 interest: Self::gen_interest(),
954 }
955 }
956
957 fn add_bdt_interest_referer_tokens(token_list: &mut ExpReservedTokenList) {
958 token_list.add_string("target");
959 token_list.add_string("object_id");
960 token_list.add_glob("inner_path");
961 token_list.add_string("dec_id");
962 token_list.add_glob("req_path");
963 token_list.add_glob("referer_object");
964 token_list.add_u32("flags");
965 }
966
967 fn add_non_input_request_common_tokens(token_list: &mut ExpReservedTokenList) {
968 token_list.add_glob("req_path");
969
970 token_list.add_string("source.dec_id");
971 token_list.add_string("source.device");
972 token_list.add_string("source.zone_category");
973 token_list.add_string("source.zone");
974 token_list.add_string("source.protocol");
975
976 token_list.add_string("level");
977 token_list.add_string("target");
978 token_list.add_u32("flags");
979 }
980
981 fn add_ndn_input_request_common_tokens(token_list: &mut ExpReservedTokenList) {
982 token_list.add_glob("req_path");
983
984 token_list.add_string("source.dec_id");
985 token_list.add_string("source.device");
986 token_list.add_string("source.zone_category");
987 token_list.add_string("source.zone");
988 token_list.add_string("source.protocol");
989
990 token_list.add_string("level");
991 token_list.add_glob("referer_object");
992 token_list.add_string("target");
993 token_list.add_u32("flags");
994 }
995
996 fn add_crypto_input_request_common_tokens(token_list: &mut ExpReservedTokenList) {
997 token_list.add_glob("req_path");
998
999 token_list.add_string("source.dec_id");
1000 token_list.add_string("source.device");
1001 token_list.add_string("source.zone_category");
1002 token_list.add_string("source.zone");
1003 token_list.add_string("source.protocol");
1004
1005 token_list.add_string("target");
1006 token_list.add_u32("flags");
1007 }
1008
1009 fn add_area_tokens(token_list: &mut ExpReservedTokenList) {
1010 token_list.add_u16("area.country");
1011 token_list.add_u8("area.carrier");
1012 token_list.add_u16("area.city");
1013 token_list.add_u8("area.inner");
1014 }
1015
1016 fn add_object_id_tokens(token_list: &mut ExpReservedTokenList) {
1017 token_list.add_string("object_id");
1018 token_list.add_u16("obj_type_code");
1019 token_list.add_string("obj_category");
1020
1021 Self::add_area_tokens(token_list);
1022 }
1023
1024 fn add_object_tokens(token_list: &mut ExpReservedTokenList) {
1025 token_list.add_u16("obj_type");
1026 token_list.add_string("object.dec_id");
1027 token_list.add_string("object.author");
1028 token_list.add_string("object.owner");
1029 }
1030
1031 fn add_object_info_tokens(token_list: &mut ExpReservedTokenList) {
1032 Self::add_object_tokens(token_list);
1033 Self::add_object_id_tokens(token_list);
1034 }
1035
1036 fn add_error_tokens(token_list: &mut ExpReservedTokenList) {
1037 token_list.add_u32("error.code");
1038 token_list.add_string("error.msg");
1039 }
1040
1041 fn add_filter_tokens(token_list: &mut ExpReservedTokenList) {
1042 token_list.add_u16("filter.obj_type");
1043 token_list.add_u16("filter.obj_type_code");
1044 token_list.add_string("filter.dec_id");
1045 token_list.add_string("filter.owner_id");
1046 token_list.add_string("filter.author_id");
1047 token_list.add_u32("filter.flags");
1048 }
1049
1050 fn gen_put_object_request() -> ExpReservedTokenList {
1052 let mut token_list = ExpReservedTokenList::new();
1053
1054 Self::add_non_input_request_common_tokens(&mut token_list);
1055 Self::add_object_info_tokens(&mut token_list);
1056
1057 token_list
1058 }
1059
1060 fn gen_put_object_response() -> ExpReservedTokenList {
1061 let mut token_list = ExpReservedTokenList::new();
1062
1063 token_list.add_string("result");
1064 token_list.add_u64("object_update_time");
1065 token_list.add_u64("object_expires_time");
1066
1067 Self::add_error_tokens(&mut token_list);
1068
1069 token_list.translate_resp();
1070
1071 token_list
1072 }
1073
1074 fn gen_put_object() -> ExpReservedTokenList {
1075 let mut list = Self::gen_put_object_request();
1076 list.append(Self::gen_put_object_response());
1077
1078 list
1079 }
1080
1081 fn gen_get_object_request() -> ExpReservedTokenList {
1083 let mut token_list = ExpReservedTokenList::new();
1084
1085 token_list.add_glob("inner_path");
1086 Self::add_non_input_request_common_tokens(&mut token_list);
1087 Self::add_object_id_tokens(&mut token_list);
1088
1089 token_list
1090 }
1091
1092 fn gen_get_object_response() -> ExpReservedTokenList {
1093 let mut token_list = ExpReservedTokenList::new();
1094
1095 Self::add_object_info_tokens(&mut token_list);
1096 Self::add_error_tokens(&mut token_list);
1097
1098 token_list.translate_resp();
1099
1100 token_list
1101 }
1102
1103 fn gen_get_object() -> ExpReservedTokenList {
1104 let mut list = Self::gen_get_object_request();
1105 list.append(Self::gen_get_object_response());
1106
1107 list
1108 }
1109
1110 fn gen_post_object_request() -> ExpReservedTokenList {
1112 let mut token_list = ExpReservedTokenList::new();
1113
1114 Self::add_non_input_request_common_tokens(&mut token_list);
1115 Self::add_object_info_tokens(&mut token_list);
1116
1117 token_list
1118 }
1119
1120 fn gen_post_object_response() -> ExpReservedTokenList {
1121 let mut token_list = ExpReservedTokenList::new();
1122
1123 Self::add_object_info_tokens(&mut token_list);
1124 Self::add_error_tokens(&mut token_list);
1125
1126 token_list.translate_resp();
1127
1128 token_list
1129 }
1130
1131 fn gen_post_object() -> ExpReservedTokenList {
1132 let mut list = Self::gen_post_object_request();
1133 list.append(Self::gen_post_object_response());
1134
1135 list
1136 }
1137
1138 fn gen_select_object_request() -> ExpReservedTokenList {
1140 let mut token_list = ExpReservedTokenList::new();
1141
1142 Self::add_filter_tokens(&mut token_list);
1143 Self::add_non_input_request_common_tokens(&mut token_list);
1144
1145 token_list
1146 }
1147
1148 fn gen_select_object_response() -> ExpReservedTokenList {
1149 let mut token_list = ExpReservedTokenList::new();
1150
1151 Self::add_object_info_tokens(&mut token_list);
1152 Self::add_error_tokens(&mut token_list);
1153
1154 token_list.translate_resp();
1155
1156 token_list
1157 }
1158
1159 fn gen_select_object() -> ExpReservedTokenList {
1160 let mut list = Self::gen_select_object_request();
1161 list.append(Self::gen_select_object_response());
1162
1163 list
1164 }
1165
1166 fn gen_delete_object_request() -> ExpReservedTokenList {
1168 let mut token_list = ExpReservedTokenList::new();
1169
1170 token_list.add_glob("inner_path");
1171 Self::add_object_id_tokens(&mut token_list);
1172 Self::add_non_input_request_common_tokens(&mut token_list);
1173
1174 token_list
1175 }
1176
1177 fn gen_delete_object_response() -> ExpReservedTokenList {
1178 let mut token_list = ExpReservedTokenList::new();
1179
1180 Self::add_object_info_tokens(&mut token_list);
1181 Self::add_error_tokens(&mut token_list);
1182 token_list.translate_resp();
1183
1184 token_list
1185 }
1186
1187 fn gen_delete_object() -> ExpReservedTokenList {
1188 let mut list = Self::gen_delete_object_request();
1189 list.append(Self::gen_delete_object_response());
1190
1191 list
1192 }
1193
1194 fn gen_get_data_request() -> ExpReservedTokenList {
1196 let mut token_list = ExpReservedTokenList::new();
1197
1198 token_list.add_glob("inner_path");
1199 Self::add_ndn_input_request_common_tokens(&mut token_list);
1200 Self::add_object_id_tokens(&mut token_list);
1201
1202 token_list
1203 }
1204
1205 fn gen_get_data_response() -> ExpReservedTokenList {
1206 let mut token_list = ExpReservedTokenList::new();
1207
1208 Self::add_object_id_tokens(&mut token_list);
1209 token_list.add_u32("attr");
1210 token_list.add_u32("length");
1211 Self::add_error_tokens(&mut token_list);
1212
1213 token_list.translate_resp();
1214
1215 token_list
1216 }
1217
1218 fn gen_get_data() -> ExpReservedTokenList {
1219 let mut list = Self::gen_get_data_request();
1220 list.append(Self::gen_get_data_response());
1221
1222 list
1223 }
1224
1225 fn gen_put_data_request() -> ExpReservedTokenList {
1227 let mut token_list = ExpReservedTokenList::new();
1228
1229 Self::add_ndn_input_request_common_tokens(&mut token_list);
1230 Self::add_object_id_tokens(&mut token_list);
1231 token_list.add_u32("length");
1232
1233 token_list
1234 }
1235
1236 fn gen_put_data_response() -> ExpReservedTokenList {
1237 let mut token_list = ExpReservedTokenList::new();
1238
1239 token_list.add_string("result");
1240 Self::add_error_tokens(&mut token_list);
1241
1242 token_list.translate_resp();
1243
1244 token_list
1245 }
1246
1247 fn gen_put_data() -> ExpReservedTokenList {
1248 let mut list = Self::gen_put_data_request();
1249 list.append(Self::gen_put_data_response());
1250
1251 list
1252 }
1253
1254 fn gen_delete_data_request() -> ExpReservedTokenList {
1256 let mut token_list = ExpReservedTokenList::new();
1257
1258 token_list.add_glob("inner_path");
1259 Self::add_ndn_input_request_common_tokens(&mut token_list);
1260 Self::add_object_id_tokens(&mut token_list);
1261
1262 token_list
1263 }
1264
1265 fn gen_delete_data_response() -> ExpReservedTokenList {
1266 let mut token_list = ExpReservedTokenList::new();
1267
1268 Self::add_object_id_tokens(&mut token_list);
1269 Self::add_error_tokens(&mut token_list);
1270
1271 token_list.translate_resp();
1272
1273 token_list
1274 }
1275
1276 fn gen_delete_data() -> ExpReservedTokenList {
1277 let mut list = Self::gen_delete_data_request();
1278 list.append(Self::gen_delete_data_response());
1279
1280 list
1281 }
1282
1283 fn gen_sign_object_request() -> ExpReservedTokenList {
1285 let mut token_list = ExpReservedTokenList::new();
1286
1287 Self::add_crypto_input_request_common_tokens(&mut token_list);
1288 Self::add_object_info_tokens(&mut token_list);
1289
1290 token_list.add_u32("crypto_flags");
1291
1292 token_list
1293 }
1294
1295 fn gen_sign_object_response() -> ExpReservedTokenList {
1296 let mut token_list = ExpReservedTokenList::new();
1297
1298 token_list.add_string("result");
1299 Self::add_object_info_tokens(&mut token_list);
1300
1301 Self::add_error_tokens(&mut token_list);
1302
1303 token_list.translate_resp();
1304
1305 token_list
1306 }
1307
1308 fn gen_sign_object() -> ExpReservedTokenList {
1309 let mut list = Self::gen_sign_object_request();
1310 list.append(Self::gen_sign_object_response());
1311
1312 list
1313 }
1314
1315 fn gen_verify_object_request() -> ExpReservedTokenList {
1317 let mut token_list = ExpReservedTokenList::new();
1318
1319 Self::add_crypto_input_request_common_tokens(&mut token_list);
1320 Self::add_object_info_tokens(&mut token_list);
1321
1322 token_list.add_string("sign_type");
1323
1324 token_list.add_string("sign_object_type");
1327
1328 let mut sign_object_token_list = ExpReservedTokenList::new();
1329 Self::add_object_info_tokens(&mut sign_object_token_list);
1330 sign_object_token_list.translate("sign_object");
1331
1332 token_list.append(sign_object_token_list);
1333
1334 token_list
1337 }
1338
1339 fn gen_verify_object_response() -> ExpReservedTokenList {
1340 let mut token_list = ExpReservedTokenList::new();
1341
1342 token_list.add_bool("valid");
1343 Self::add_error_tokens(&mut token_list);
1344
1345 token_list.translate_resp();
1346
1347 token_list
1348 }
1349
1350 fn gen_verify_object() -> ExpReservedTokenList {
1351 let mut list = Self::gen_verify_object_request();
1352 list.append(Self::gen_verify_object_response());
1353
1354 list
1355 }
1356
1357 fn gen_encrypt_data_request() -> ExpReservedTokenList {
1359 let mut token_list = ExpReservedTokenList::new();
1360
1361 Self::add_crypto_input_request_common_tokens(&mut token_list);
1362
1363 token_list.add_u32("crypto_flags");
1364 token_list.add_string("encrypt_type");
1365
1366 token_list
1367 }
1368
1369 fn gen_encrypt_data_response() -> ExpReservedTokenList {
1370 let mut token_list = ExpReservedTokenList::new();
1371 token_list.translate_resp();
1372
1373 token_list
1374 }
1375
1376 fn gen_encrypt_object() -> ExpReservedTokenList {
1377 let mut list = Self::gen_encrypt_data_request();
1378 list.append(Self::gen_encrypt_data_response());
1379
1380 list
1381 }
1382
1383 fn gen_decrypt_data_request() -> ExpReservedTokenList {
1385 let mut token_list = ExpReservedTokenList::new();
1386
1387 Self::add_crypto_input_request_common_tokens(&mut token_list);
1388
1389 token_list.add_u32("crypto_flags");
1390 token_list.add_string("decrypt_type");
1391
1392 token_list
1393 }
1394
1395 fn gen_decrypt_data_response() -> ExpReservedTokenList {
1396 let mut token_list = ExpReservedTokenList::new();
1397 token_list.add_string("result");
1398 token_list.translate_resp();
1399
1400 token_list
1401 }
1402
1403 fn gen_decrypt_object() -> ExpReservedTokenList {
1404 let mut list = Self::gen_decrypt_data_request();
1405 list.append(Self::gen_decrypt_data_response());
1406
1407 list
1408 }
1409
1410 fn gen_acl_request() -> ExpReservedTokenList {
1412 let mut token_list = ExpReservedTokenList::new();
1413
1414 token_list.add_string("protocol");
1415 token_list.add_string("direction");
1416 token_list.add_string("operation");
1417
1418 token_list.add_string("device");
1420 token_list.add_string("source");
1421 token_list.add_string("target");
1422 token_list.add_string("your");
1423
1424 Self::add_object_info_tokens(&mut token_list);
1425 token_list.add_glob("inner_path");
1426
1427 token_list.add_string("dec_id");
1428 token_list.add_glob("req_path");
1429
1430 token_list.add_glob("referer_object");
1431
1432 token_list
1433 }
1434
1435 fn gen_acl_response() -> ExpReservedTokenList {
1436 let mut token_list = ExpReservedTokenList::new();
1437
1438 token_list.add_bool("access");
1439 Self::add_error_tokens(&mut token_list);
1440
1441 token_list.translate_resp();
1442
1443 token_list
1444 }
1445
1446 fn gen_acl() -> ExpReservedTokenList {
1447 let mut list = Self::gen_acl_request();
1448 list.append(Self::gen_acl_response());
1449
1450 list
1451 }
1452
1453 fn gen_interest_request() -> ExpReservedTokenList {
1455 let mut token_list = ExpReservedTokenList::new();
1456
1457 token_list.add_string("chunk");
1458 token_list.add_string("from");
1459 Self::add_bdt_interest_referer_tokens(&mut token_list);
1460 token_list.add_string("from_channel");
1461 token_list.add_glob("group_path");
1462 token_list
1463 }
1464
1465 fn gen_interest_response() -> ExpReservedTokenList {
1466 let mut token_list = ExpReservedTokenList::new();
1467
1468 token_list.add_string("type");
1469 token_list.add_string("transmit_to");
1470 token_list.add_u32("err");
1471 token_list.add_glob("redirect");
1472 token_list.add_string("redirect_referer_target");
1473 token_list.add_glob("upload.groups");
1474 token_list.add_glob("upload.file_path");
1475 token_list.add_glob("upload.file_offset");
1476 token_list.translate_resp();
1477
1478 token_list
1479 }
1480
1481 fn gen_interest() -> ExpReservedTokenList {
1482 let mut list = Self::gen_interest_request();
1483 list.append(Self::gen_interest_response());
1484
1485 list
1486 }
1487
1488
1489 pub fn select<REQ, RESP>(&self) -> &ExpReservedTokenList
1490 where
1491 REQ: Send + Sync + 'static + JsonCodec<REQ> + std::fmt::Display,
1492 RESP: Send + Sync + 'static + JsonCodec<RESP> + std::fmt::Display,
1493 RouterHandlerRequest<REQ, RESP>: super::category::RouterHandlerCategoryInfo,
1494 {
1495 let category = extract_router_handler_category::<RouterHandlerRequest<REQ, RESP>>();
1496 match category {
1497 RouterHandlerCategory::GetObject => &self.get_object,
1498 RouterHandlerCategory::PutObject => &self.put_object,
1499 RouterHandlerCategory::PostObject => &self.post_object,
1500 RouterHandlerCategory::SelectObject => &self.select_object,
1501 RouterHandlerCategory::DeleteObject => &self.delete_object,
1502
1503 RouterHandlerCategory::PutData => &self.put_data,
1504 RouterHandlerCategory::GetData => &self.get_data,
1505 RouterHandlerCategory::DeleteData => &self.delete_data,
1506
1507 RouterHandlerCategory::SignObject => &self.sign_object,
1508 RouterHandlerCategory::VerifyObject => &self.verify_object,
1509 RouterHandlerCategory::EncryptData => &self.encrypt_data,
1510 RouterHandlerCategory::DecryptData => &self.decrypt_data,
1511
1512 RouterHandlerCategory::Acl => &self.acl,
1513 RouterHandlerCategory::Interest => &self.interest,
1514 }
1515 }
1516}
1517
1518lazy_static::lazy_static! {
1519 pub static ref ROUTER_HANDLER_RESERVED_TOKEN_LIST: RouterHandlerReservedTokenList = RouterHandlerReservedTokenList::new();
1520}