| 618 | } |
| 619 | |
| 620 | async fn get_activation( |
| 621 | &self, |
| 622 | request: Request<api::GetDeviceActivationRequest>, |
| 623 | ) -> Result<Response<api::GetDeviceActivationResponse>, Status> { |
| 624 | let req = request.get_ref(); |
| 625 | let dev_eui = EUI64::from_str(&req.dev_eui).map_err(|e| e.status())?; |
| 626 | |
| 627 | self.validator |
| 628 | .validate( |
| 629 | request.extensions(), |
| 630 | validator::ValidateDeviceAccess::new(validator::Flag::Read, dev_eui), |
| 631 | ) |
| 632 | .await?; |
| 633 | |
| 634 | let d = device::get(&dev_eui).await.map_err(|e| e.status())?; |
| 635 | let ds = match d.get_device_session() { |
| 636 | Ok(v) => v, |
| 637 | Err(StorageError::NotFound(_)) => { |
| 638 | return Ok(Response::new(api::GetDeviceActivationResponse { |
| 639 | device_activation: None, |
| 640 | join_server_context: None, |
| 641 | })); |
| 642 | } |
| 643 | Err(e) => { |
| 644 | return Err(e.status()); |
| 645 | } |
| 646 | }; |
| 647 | |
| 648 | let mut resp = Response::new(api::GetDeviceActivationResponse { |
| 649 | device_activation: Some(api::DeviceActivation { |
| 650 | dev_eui: d.dev_eui.to_string(), |
| 651 | dev_addr: d.get_dev_addr().map_err(|e| e.status())?.to_string(), |
| 652 | app_s_key: match &ds.app_s_key { |
| 653 | Some(v) => hex::encode(&v.aes_key), |
| 654 | None => "".to_string(), |
| 655 | }, |
| 656 | nwk_s_enc_key: hex::encode(&ds.nwk_s_enc_key), |
| 657 | s_nwk_s_int_key: hex::encode(&ds.s_nwk_s_int_key), |
| 658 | f_nwk_s_int_key: hex::encode(&ds.f_nwk_s_int_key), |
| 659 | f_cnt_up: d.f_cnt_up as u32, |
| 660 | n_f_cnt_down: ds.n_f_cnt_down, |
| 661 | a_f_cnt_down: ds.a_f_cnt_down, |
| 662 | }), |
| 663 | join_server_context: if !ds.js_session_key_id.is_empty() { |
| 664 | Some(common::JoinServerContext { |
| 665 | app_s_key: None, |
| 666 | session_key_id: hex::encode(&ds.js_session_key_id), |
| 667 | }) |
| 668 | } else if let Some(app_s_key) = &ds.app_s_key { |
| 669 | if !app_s_key.kek_label.is_empty() { |
| 670 | Some(common::JoinServerContext { |
| 671 | app_s_key: Some(common::KeyEnvelope { |
| 672 | kek_label: app_s_key.kek_label.clone(), |
| 673 | aes_key: app_s_key.aes_key.clone(), |
| 674 | }), |
| 675 | session_key_id: "".into(), |
| 676 | }) |
| 677 | } else { |