{
+ let flow = path.into_inner();
+ if !state.tokens.contains_key(&flow) {
+ return Ok(HttpResponse::NotFound().body("Login flow not found"));
+ }
+
+ state.completed_flows.insert(
+ flow,
+ NextcloudSuccessResponse {
+ server: req.full_url().origin().unicode_serialization(),
+ login_name: user.id.to_owned(),
+ app_password: generate_app_token(),
+ },
+ );
+ Ok(HttpResponse::Ok()
+ .content_type(ContentType::html())
+ .body(format!(
+ "Hello {}!
Login completed, you may close this page.
",
+ user.displayname.unwrap_or(user.id)
+ )))
+}
+
+pub fn configure_nextcloud_login(
+ cfg: &mut ServiceConfig,
+ nextcloud_flows_state: Arc,
+ auth_provider: Arc,
+) {
+ cfg.service(
+ web::scope("")
+ .wrap(AuthenticationMiddleware::new(auth_provider.clone()))
+ .app_data(Data::from(nextcloud_flows_state))
+ .app_data(Data::from(auth_provider.clone()))
+ .service(web::resource("/index.php/login/v2").post(post_nextcloud_login))
+ .service(
+ web::resource("/login/v2/poll/{flow}")
+ .name("nc_login_poll")
+ .post(post_nextcloud_poll::),
+ )
+ .service(
+ web::resource("/login/v2/flow/{flow}")
+ .name("nc_login_flow")
+ .get(get_nextcloud_flow),
+ ),
+ );
+}