Skip to content

Commit

Permalink
SHIBUI-2571
Browse files Browse the repository at this point in the history
Intermediate work commit - feature incomplete
  • Loading branch information
chasegawa committed Jun 2, 2023
1 parent a9c8bca commit ed2d206
Show file tree
Hide file tree
Showing 10 changed files with 136 additions and 30 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package edu.internet2.tier.shibboleth.admin.ui.beacon;

import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(chain = true)
public class BeaconDetail {
private String msgType = "TIERBEACON";
private String msgName = "TIER";
Expand All @@ -14,8 +16,4 @@ public class BeaconDetail {
private String tbMaintainer = "Unicon";

private ShibuiDetail shibui;
}

// "tbProduct": "ShibUI (shibui.beacon.productName)",
// "tbProductVersion": "1.17.4 (can we get this from the app?)",
// "tbTIERRelease": "(if the TAP container: 1.17.4; if the Unicon package, INTERNAL_1.17.4)",
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,19 @@
package edu.internet2.tier.shibboleth.admin.ui.beacon;

import lombok.Builder;
import lombok.Data;

import java.util.List;

@Data
@Builder
public class ShibuiDetail {


// "shibui": {
// "authMechanisms": [
// "pac4j-saml"
// ],
// "numberOfMetadataSources": 25,
// "numberOfMetadataProviders": 3,
// "numberOfFilters": 0,
// "dailyLogins": 12,
// "numberOfGroups": 15,
// "numberOfRoles": 5,
// "installationID": "4813c762-4a90-40a2-9c01-81bf67647da4"
// }
private List<String> authMechanisms;
private int numberOfMetadataSources;
private int numberOfMetadataProviders;
private int numberOfFilters;
private int dailyLogins;
private int numberOfGroups;
private int numberOfRoles;
private String installationID;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects;
import edu.internet2.tier.shibboleth.admin.ui.repository.BeaconConfigurationRepository;
import edu.internet2.tier.shibboleth.admin.ui.repository.EntityDescriptorRepository;
import edu.internet2.tier.shibboleth.admin.ui.repository.FilterRepository;
import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository;
import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolversPositionOrderContainerRepository;
import edu.internet2.tier.shibboleth.admin.ui.scheduled.EntityDescriptorFilesScheduledTasks;
Expand Down Expand Up @@ -270,8 +271,10 @@ public String getBeaconCronValue(BeaconConfigurationRepository repo)
}

@Bean
public IBeaconDataService getBeaconDataService(@Value("${shibui.beacon.productName:ShibUi}") String productName, InfoEndpoint info, @Value("#{environment.TIERVERSION}") String tierVersion) {
BeaconDataServiceImpl result = new BeaconDataServiceImpl(productName, info);
public IBeaconDataService getBeaconDataService(@Value("${shibui.beacon.productName:ShibUi}") String productName, InfoEndpoint info, @Value("#{environment.TIERVERSION}") String tierVersion,
EntityDescriptorRepository entityDescriptorRepository, MetadataResolverRepository metadataResolverRepository, FilterRepository filterRepository,
GroupsRepository groupsRepository, RoleRepository roleRepository, BeaconConfigurationRepository beaconConfigurationRepository, UserService userService) {
BeaconDataServiceImpl result = new BeaconDataServiceImpl(productName, info, tierVersion, entityDescriptorRepository, metadataResolverRepository, filterRepository, groupsRepository, roleRepository, beaconConfigurationRepository, userService);
return result;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package edu.internet2.tier.shibboleth.admin.ui.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import edu.internet2.tier.shibboleth.admin.ui.service.IBeaconDataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Profile({"dev", "very-dangerous"})
@RestController
@RequestMapping(value = "/api/beacon")
public class BeaconController {

@Autowired
private IBeaconDataService service;


@GetMapping(value = "/detail")
public ResponseEntity<?> getDetail() throws JsonProcessingException {
return ResponseEntity.ok(service.getBeaconData());
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package edu.internet2.tier.shibboleth.admin.ui.domain;

import lombok.Data;
import lombok.Setter;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Transient;

@Data
@Entity
Expand All @@ -15,6 +17,15 @@ public class BeaconConfiguration {

private String sendCron;

// Comma separated list of the auth mechanisms used.
@Setter
@Transient
private static String authMechanisms = "unset";

public static String getAuthMechanisms() {
return authMechanisms;
}

/**
* enforce that id will only ever be 1
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,6 @@ public interface EntityDescriptorRepository extends JpaRepository<EntityDescript
" and e.approved = false")
List<EntityDescriptorProjection> getEntityDescriptorsNeedingApproval(@Param("groupIds") List<String> groupIds);

@Query("SELECT COUNT(ed) FROM EntityDescriptor ed WHERE ed.serviceEnabled = true")
int getActiveEntityCount();
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package edu.internet2.tier.shibboleth.admin.ui.repository;

import edu.internet2.tier.shibboleth.admin.ui.domain.filters.MetadataFilter;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;

public interface FilterRepository extends CrudRepository<MetadataFilter, Long> {
MetadataFilter findByResourceId(String resourceId);
}

@Query("SELECT COUNT(f) FROM MetadataFilter f WHERE f.filterEnabled = true")
int getActiveFilterCount();
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package edu.internet2.tier.shibboleth.admin.ui.repository;

import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;

/**
Expand All @@ -11,4 +12,7 @@ public interface MetadataResolverRepository extends CrudRepository<MetadataResol
MetadataResolver findByName(String name);

MetadataResolver findByResourceId(String resourceId);
}

@Query("SELECT COUNT(mr) FROM MetadataResolver mr WHERE mr.enabled = true")
int getActiveMetadataProviderCount();
}
Original file line number Diff line number Diff line change
@@ -1,33 +1,78 @@
package edu.internet2.tier.shibboleth.admin.ui.service;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import edu.internet2.tier.shibboleth.admin.ui.beacon.BeaconDetail;
import edu.internet2.tier.shibboleth.admin.ui.beacon.ShibuiDetail;
import edu.internet2.tier.shibboleth.admin.ui.domain.BeaconConfiguration;
import edu.internet2.tier.shibboleth.admin.ui.repository.BeaconConfigurationRepository;
import edu.internet2.tier.shibboleth.admin.ui.repository.EntityDescriptorRepository;
import edu.internet2.tier.shibboleth.admin.ui.repository.FilterRepository;
import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository;
import edu.internet2.tier.shibboleth.admin.ui.security.repository.GroupsRepository;
import edu.internet2.tier.shibboleth.admin.ui.security.repository.RoleRepository;
import edu.internet2.tier.shibboleth.admin.ui.security.service.UserService;
import lombok.SneakyThrows;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.actuate.info.InfoEndpoint;

import java.util.Arrays;
import java.util.Map;

public class BeaconDataServiceImpl implements IBeaconDataService {
private ObjectMapper mapper;
private String productName;
private String tierVersion;
private String version;

public BeaconDataServiceImpl(String productName, InfoEndpoint info) {
private EntityDescriptorRepository entityDescriptorRepository;
private MetadataResolverRepository metadataResolverRepository;
private FilterRepository filterRepository;
private GroupsRepository groupsRepository;
private RoleRepository roleRepository;
private BeaconConfigurationRepository beaconConfigurationRepository;
private UserService userService;

public BeaconDataServiceImpl(String productName, InfoEndpoint info, String tierVersion, EntityDescriptorRepository entityDescriptorRepository,
MetadataResolverRepository metadataResolverRepository, FilterRepository filterRepository, GroupsRepository groupsRepository,
RoleRepository roleRepository, BeaconConfigurationRepository beaconConfigurationRepository, UserService userService) {
mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // skip any null values

this.productName = productName;
version = info.info().get("build") == null ? "unknown" : ((Map)info.info().get("build")).get("version").toString();
this.version = info.info().get("build") == null ? "unknown" : ((Map)info.info().get("build")).get("version").toString();
this.tierVersion = StringUtils.isBlank(tierVersion) ? "NA" : tierVersion;

this.entityDescriptorRepository = entityDescriptorRepository;
this.metadataResolverRepository = metadataResolverRepository;
this.filterRepository = filterRepository;
this.groupsRepository = groupsRepository;
this.roleRepository = roleRepository;
this.beaconConfigurationRepository = beaconConfigurationRepository;
this.userService = userService;
}

@Override
@SneakyThrows
public String getBeaconData() throws JsonProcessingException {
BeaconDetail detail = new BeaconDetail();
detail.setTbProduct(productName);
detail.setTbProductVersion(version);
public String getBeaconData() {
BeaconDetail detail = new BeaconDetail().setTbProduct(productName).setTbProductVersion(version).setTbTIERRelease(tierVersion).setShibui(getShibuiDetailData());

return mapper.writeValueAsString(detail);
}

private ShibuiDetail getShibuiDetailData() {
BeaconConfiguration configuration = beaconConfigurationRepository.getReferenceById(1);

ShibuiDetail detail = ShibuiDetail.builder()
.installationID(configuration.getInstallationId())
.authMechanisms(Arrays.asList(BeaconConfiguration.getAuthMechanisms().split(",")))
.numberOfMetadataSources(entityDescriptorRepository.getActiveEntityCount())
.numberOfMetadataProviders(metadataResolverRepository.getActiveMetadataProviderCount())
.numberOfFilters(filterRepository.getActiveFilterCount())
.dailyLogins(userService.getDailyLoginCount())
.numberOfGroups((int) groupsRepository.count())
.numberOfRoles((int) roleRepository.count())
.build();
return detail;
}
}
16 changes: 16 additions & 0 deletions delete.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"git": {
"branch": "feature/shibui-2571",
"commit": {
"id": "b547925",
"time": "2023-05-23T20:32:38Z"
}
},
"build": {
"artifact": "shibui",
"name": "backend",
"time": "2023-05-24T17:15:28.585Z",
"version": "1.18.0-SNAPSHOT",
"group": "edu.internet2.tier.shibboleth.admin.ui"
}
}

0 comments on commit ed2d206

Please sign in to comment.