//* Licensed Materials - Property of * //* IBM * //* Miracle A/S * //* Alexandra Instituttet A/S * //* * //* eu.abc4trust.pabce.1.34 * //* * //* (C) Copyright IBM Corp. 2014. All Rights Reserved. * //* (C) Copyright Miracle A/S, Denmark. 2014. All Rights Reserved. * //* (C) Copyright Alexandra Instituttet A/S, Denmark. 2014. All * //* Rights Reserved. * //* US Government Users Restricted Rights - Use, duplication or * //* disclosure restricted by GSA ADP Schedule Contract with IBM Corp. * //* * //* This file is licensed under the Apache License, Version 2.0 (the * //* "License"); you may not use this file except in compliance with * //* the License. You may obtain a copy of the License at: * //* http://www.apache.org/licenses/LICENSE-2.0 * //* Unless required by applicable law or agreed to in writing, * //* software distributed under the License is distributed on an * //* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * //* KIND, either express or implied. See the License for the * //* specific language governing permissions and limitations * //* under the License. * //*/**/**************************************************************** package eu.abc4trust.ri.servicehelper.user; import java.net.URI; import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import com.google.inject.Inject; import eu.abc4trust.returnTypes.SitdReturn; import eu.abc4trust.returnTypes.SptdReturn; import eu.abc4trust.ui.idSelection.IdentitySelection; import eu.abc4trust.xml.Attribute; import eu.abc4trust.xml.CandidateIssuanceToken; import eu.abc4trust.xml.CandidateIssuanceTokenList; import eu.abc4trust.xml.CandidatePresentationToken; import eu.abc4trust.xml.CandidatePresentationTokenList; import eu.abc4trust.xml.CredentialDescription; import eu.abc4trust.xml.CredentialDescriptions; import eu.abc4trust.xml.CredentialDescriptionsEntry; import eu.abc4trust.xml.CredentialUidList; import eu.abc4trust.xml.FriendlyDescription; import eu.abc4trust.xml.InspectorChoiceList; import eu.abc4trust.xml.InspectorDescription; import eu.abc4trust.xml.InspectorDescriptions; import eu.abc4trust.xml.InspectorDescriptionsEntry; import eu.abc4trust.xml.IssuanceTokenDescription; import eu.abc4trust.xml.PolicyDescription; import eu.abc4trust.xml.PolicyDescriptions; import eu.abc4trust.xml.PolicyDescriptionsEntry; import eu.abc4trust.xml.PresentationTokenDescription; import eu.abc4trust.xml.PseudonymChoiceList; import eu.abc4trust.xml.PseudonymDescription; import eu.abc4trust.xml.PseudonymDescriptionValue; import eu.abc4trust.xml.PseudonymDescriptions; import eu.abc4trust.xml.PseudonymDescriptionsEntry; import eu.abc4trust.xml.PseudonymMetadata; import eu.abc4trust.xml.SelectIssuanceTokenDescription; import eu.abc4trust.xml.SelectPresentationTokenDescription; import eu.abc4trust.xml.Token; import eu.abc4trust.xml.URISet; public class IdentitySelectionWrapper implements IdentitySelection { public boolean done; public boolean canceled = false; public SelectIssuanceTokenDescription selectIssuanceTokenDescription; public SelectPresentationTokenDescription selectPresentationTokenDescription; private SitdReturn issToken; public List<Attribute> selfClaimedAttributes; public List<IssuanceTokenDescription> issuancetokens; public boolean hasIssuanceChoices; private boolean issuanceTokenSelected; private SptdReturn presToken; public Map<URI, PolicyDescription> policies; public Map<URI, CredentialDescription> credentialDescriptions; public Map<URI, PseudonymDescription> pseudonyms; public Map<URI, InspectorDescription> inspectors; // public List<IssuanceTokenDescription> tokens; public List<PresentationTokenDescription> presentationtokens; public List<List<URI>> credentialUids; public List<Set<List<URI>>> pseudonymChoice; public List<List<Set<URI>>> inspectorChoice; private boolean hasPresentationChoices; private boolean presentationTokenSelected; private Exception e; @Inject public IdentitySelectionWrapper() { this.done = false; this.presToken = null; this.issToken = null; this.hasPresentationChoices = false; this.presentationTokenSelected = false; } public void setException(Exception e){ this.e = e; } public Exception getException(){ return this.e; } public boolean hasPresentationChoices(){ return this.hasPresentationChoices; } public boolean hasIssuanceChoices(){ return this.hasIssuanceChoices; } @Override public SptdReturn selectPresentationTokenDescription( Map<URI, PolicyDescription> policies, Map<URI, CredentialDescription> credentialDescriptions, Map<URI, PseudonymDescription> pseudonyms, Map<URI, InspectorDescription> inspectors, List<PresentationTokenDescription> tokens, List<List<URI>> credentialUids, List<Set<List<URI>>> pseudonymChoice, List<List<Set<URI>>> inspectorChoice) { System.out.println("selectPresentationTokenDescription called!!!!!!"); this.policies = policies; this.credentialDescriptions = credentialDescriptions; // TODO(enr): Fix pseudonyms, inspectors and policies this.pseudonyms = pseudonyms; this.inspectors = inspectors; this.presentationtokens = tokens; this.credentialUids = credentialUids; // TODO(enr): Fix this this.pseudonymChoice = pseudonymChoice; this.inspectorChoice = inspectorChoice; this.hasPresentationChoices = true; try { this.selectPresentationTokenDescription = new SelectPresentationTokenDescription(); this.selectPresentationTokenDescription.setPolicyDescriptions(this.createPolicyDescriptions(policies)); this.selectPresentationTokenDescription.setCredentialDescriptions(this.createCredentialDescriptions(credentialDescriptions)); this.selectPresentationTokenDescription.setPseudonymDescriptions(this.createPseudonymDescriptions(pseudonyms)); this.selectPresentationTokenDescription.setInspectorDescriptions(this.createInspectorDescriptions(inspectors)); this.selectPresentationTokenDescription.setCandidatePresentationTokenList(this.createCandidatePresentationTokenList(tokens, credentialUids, pseudonymChoice, inspectorChoice, credentialDescriptions)); if(this.selectPresentationTokenDescription.getInspectorDescriptions()!=null && this.selectPresentationTokenDescription.getInspectorDescriptions().getEntry().size()==0 && inspectorsInPolicy(inspectorChoice).size()>0) { this.selectPresentationTokenDescription.setInspectorDescriptions(this.createFakeInspectorDescriptions(inspectorsInPolicy(inspectorChoice))); } } catch(Exception e) { System.err.println("FAILED TO CREAT JSON"); e.printStackTrace(); } try{// The idSelectionWrapper is ready to produce JSON, going to sleep until a choice has been made System.out.println(">> idSelectionwrapper going to sleep, waiting for a choice made by the user"); while(!this.presentationTokenSelected) { Thread.sleep(200); } }catch(InterruptedException e){ System.out.println("idSelection got interrupted"); } if(this.canceled) { // TODO: Throw Exception } System.out.println(">> idSelectionwrapper got a choice from the user and is now done"); // The idSelectionWrapper has got a choice it can return // NOT HERE - mark done in UserService! // done = true; return this.presToken; } public void selectPresentationToken(int chosenPresentationToken, Map<URI, PseudonymMetadata> metadataToChange, List<URI> chosenPseudonyms, List<URI> chosenInspectors){ // The UI gave the idSelectionWrapper some input, time to wake up this.presToken = new SptdReturn(chosenPresentationToken, metadataToChange, chosenPseudonyms, chosenInspectors); this.presentationTokenSelected = true; if(chosenPresentationToken==-1) { this.canceled = true; } } @Override public SitdReturn selectIssuanceTokenDescription( Map<URI, PolicyDescription> policies, Map<URI, CredentialDescription> credentialDescriptions, Map<URI, PseudonymDescription> pseudonyms, Map<URI, InspectorDescription> inspectors, List<IssuanceTokenDescription> tokens, List<List<URI>> credentialUids, List<Attribute> selfClaimedAttributes, List<Set<List<URI>>> pseudonymChoice, List<List<Set<URI>>> inspectorChoice){ System.out.println("ABC engine called selectIssuanceTokenDescription in idSelectionWrapper"); /* System.out.println("=== selectIssuanceTokenDescription"); System.out.println("*** - policies : " + policies.size()); System.out.println("*** - credentialDescriptions : " + credentialDescriptions.size()); System.out.println("*** - pseudonyms : " + pseudonyms.size()); System.out.println("*** - inspectors : " + inspectors.size()); System.out.println("### - tokens : " + tokens.size()); System.out.println("*** - credentialUids : " + credentialUids.size()); System.out.println("*** - selfClaimedAttributes : " + selfClaimedAttributes.size()); System.out.println("*** - pseudonymChoice : " + pseudonymChoice.size()); System.out.println("*** - inspectorChoice : " + inspectorChoice.size()); */ this.policies = policies; this.credentialDescriptions = credentialDescriptions; this.pseudonyms = pseudonyms; this.inspectors = inspectors; this.issuancetokens = tokens; this.credentialUids = credentialUids; this.selfClaimedAttributes = selfClaimedAttributes; this.pseudonymChoice = pseudonymChoice; this.inspectorChoice = inspectorChoice; this.hasIssuanceChoices = true; try { this.selectIssuanceTokenDescription = new SelectIssuanceTokenDescription(); this.selectIssuanceTokenDescription.setPolicyDescriptions(this.createPolicyDescriptions(policies)); this.selectIssuanceTokenDescription.setCredentialDescriptions(this.createCredentialDescriptions(credentialDescriptions)); this.selectIssuanceTokenDescription.setPseudonymDescriptions(this.createPseudonymDescriptions(pseudonyms)); this.selectIssuanceTokenDescription.setInspectorDescriptions(this.createInspectorDescriptions(inspectors)); this.selectIssuanceTokenDescription.setCandidateIssuanceTokenList(this.createCandidateIssuanceTokenList(tokens, credentialUids, pseudonymChoice, inspectorChoice, credentialDescriptions)); if(this.selectIssuanceTokenDescription.getInspectorDescriptions().getEntry().size()==0 && inspectorsInPolicy(inspectorChoice).size()>0) { this.selectIssuanceTokenDescription.setInspectorDescriptions(this.createFakeInspectorDescriptions(inspectorsInPolicy(inspectorChoice))); } } catch(Exception e){ System.out.println("idSelectionWrapper failed to generate selectIssuanceTokenDescription"); e.printStackTrace(); } try{// The idSelectionWrapper is ready to produce JSON, going to sleep until a choice has been made System.out.println("idselectionwrapper/issuance going to sleep"); while(!this.issuanceTokenSelected) { Thread.sleep(200); } }catch(InterruptedException e){ System.out.println("idSelection/issuance got interrupted"); } System.out.println("idselectionwrapper/issuance waking up!"); if(this.canceled) { // TODO: Throw Exception } // The idSelectionWrapper has got a choice it can return // NOT HERE - mark done in UserService! // done = true; return this.issToken; } public void selectIssuanceToken(int chosenIssuanceToken, Map<URI, PseudonymMetadata> metadataToChange, List<URI> chosenPseudonyms, List<URI> chosenInspectors, List<Object> chosenAttributeValues){ // The UI gave the idSelectionWrapper some input, time to wake up this.issToken = new SitdReturn(chosenIssuanceToken, metadataToChange, chosenPseudonyms, chosenInspectors, chosenAttributeValues); this.issuanceTokenSelected = true; if(chosenIssuanceToken==-1) { this.canceled = true; } } @SuppressWarnings("unused") private InspectorChoiceList createInspectorChoiceList(List<Set<URI>> list) { InspectorChoiceList icl = new InspectorChoiceList(); for(Set<URI> set : list) { URISet uriSet = new URISet(); uriSet.getURI().addAll(Arrays.asList(set.toArray(new URI[0]))); icl.getURISet().add(uriSet); } return icl; } @SuppressWarnings("unused") private PseudonymChoiceList createPseudonymChoiceList(Set<List<URI>> set) { PseudonymChoiceList pcl = new PseudonymChoiceList(); Iterator<List<URI>> iterator = set.iterator(); while(iterator.hasNext()) { URISet uriSet = new URISet(); uriSet.getURI().addAll(iterator.next()); pcl.getURISet().add(uriSet); } return pcl; } private PolicyDescriptions createPolicyDescriptions(Map<URI, PolicyDescription> policies) { System.out.println("setting policydescriptions # of policies: "+policies.size()); PolicyDescriptions pd = new PolicyDescriptions(); for(URI key : policies.keySet()) { PolicyDescriptionsEntry entry = new PolicyDescriptionsEntry(); entry.setKey(key); // FriendlyDescription description = new FriendlyDescription(); // description.setValue("friendly descNAME value"); // description.setLang("en"); // policies.get(key).getMessage().getFriendlyPolicyName().add(description); // description.setValue("friendly descDESCRIPTION value"); // description.setLang("en"); // policies.get(key).getMessage().getFriendlyPolicyDescription().add(description); entry.setValue(policies.get(key)); pd.getEntry().add(entry); // TODO Demo purpose only, to ensure atleast 2 policydescriptions /* entry = new PolicyDescriptionsEntry(); entry.setKey(key); entry.setValue(policies.get(key)); pd.getEntry().add(entry); */ } return pd; } private CredentialDescriptions createCredentialDescriptions(Map<URI, CredentialDescription> policies) { CredentialDescriptions cd = new CredentialDescriptions(); for(URI key : policies.keySet()) { CredentialDescriptionsEntry entry = new CredentialDescriptionsEntry(); entry.setKey(key); entry.setValue(policies.get(key)); cd.getEntry().add(entry); } return cd; } private PseudonymDescriptions createPseudonymDescriptions(Map<URI, PseudonymDescription> policies) { PseudonymDescriptions pd = new PseudonymDescriptions(); for(URI key : policies.keySet()) { PseudonymDescriptionValue value = new PseudonymDescriptionValue(); value.setPseudonymDescription(policies.get(key)); PseudonymDescriptionsEntry entry = new PseudonymDescriptionsEntry(); entry.setKey(key); entry.setValue(value); pd.getEntry().add(entry); } return pd; } private InspectorDescriptions createInspectorDescriptions(Map<URI, InspectorDescription> policies) { InspectorDescriptions id = new InspectorDescriptions(); for(URI key : policies.keySet()) { InspectorDescriptionsEntry entry = new InspectorDescriptionsEntry(); entry.setKey(key); entry.setValue(policies.get(key)); id.getEntry().add(entry); } return id; } private HashSet<URI> inspectorsInPolicy(List<List<Set<URI>>> inspectorChoice) { HashSet<URI> inspectorURIs = new HashSet<URI>(); for(List<Set<URI>> inner : inspectorChoice) { for(Set<URI> uriSet : inner) { inspectorURIs.addAll(uriSet); } } return inspectorURIs; } private InspectorDescriptions createFakeInspectorDescriptions( HashSet<URI> uriSet) { InspectorDescriptions id = new InspectorDescriptions(); for(URI uri : uriSet) { InspectorDescriptionsEntry entry = new InspectorDescriptionsEntry(); entry.setKey(uri); InspectorDescription inspectorDescription = new InspectorDescription(); inspectorDescription.setInspectorUID(uri); FriendlyDescription friendlyDescription = new FriendlyDescription(); friendlyDescription.setLang("en"); friendlyDescription.setValue("Fake description of : " + uri); inspectorDescription.getFriendlyInspectorDescription().add(friendlyDescription); entry.setValue(inspectorDescription ); id.getEntry().add(entry); } return id; } private CandidatePresentationTokenList createCandidatePresentationTokenList(List<PresentationTokenDescription> tokens, List<List<URI>> credentialUids, List<Set<List<URI>>> pseudonymChoice, List<List<Set<URI>>> inspectorChoice, Map<URI, CredentialDescription> credentialDescriptions){ CandidatePresentationTokenList cptl = new CandidatePresentationTokenList(); for(int i= 0; i< tokens.size(); i++){ PresentationTokenDescription desc = tokens.get(i); List<URI> credentialUidsList = credentialUids.get(i); Set<List<URI>> pseudonymChoices = pseudonymChoice.get(i); List<Set<URI>> inspectorChoices = inspectorChoice.get(i); CandidatePresentationToken cpt = new CandidatePresentationToken(); Token token = new Token(); token.setPolicyUID(desc.getPolicyUID()); token.setTokenUID(desc.getTokenUID()); cpt.setToken(token); CredentialUidList cul = new CredentialUidList(); for(URI credURI: credentialUidsList){ cul.getCredentialUid().add(credURI); // for(FriendlyDescription fd: credentialDescriptions.get(credURI).getFriendlyCredentialName()){ // System.out.println("adding friendly description: "+fd); // cpt.getFriendlyTokenDescription().add(fd); // } } cpt.setCredentialUidList(cul); /*System.out.println("checking the friendly token names:S "+desc.getMessage().getFriendlyPolicyName()); cpt.getFriendlyTokenDescription().add(null); for(FriendlyDescription d: desc.getMessage().getFriendlyPolicyDescription()){ System.out.println("d: "+d); cpt.getFriendlyTokenDescription().add(d); } */ // Create and add a mock FriendlyDescription FriendlyDescription fDesc_en = new FriendlyDescription(); fDesc_en.setValue("Mock FriendlyDescription"); fDesc_en.setLang("en"); cpt.getFriendlyTokenDescription().add(fDesc_en); FriendlyDescription fDesc_dk = new FriendlyDescription(); fDesc_dk.setValue("Mock Venlig Beskrivelse"); fDesc_dk.setLang("da"); cpt.getFriendlyTokenDescription().add(fDesc_dk); PseudonymChoiceList pcl = new PseudonymChoiceList(); for(List<URI> uriset: pseudonymChoices){ URISet uris = new URISet(); for(URI uri: uriset){ uris.getURI().add(uri); } pcl.getURISet().add(uris); } cpt.setPseudonymChoiceList(pcl); InspectorChoiceList icl = new InspectorChoiceList(); for(Set<URI> inspectors: inspectorChoices){ URISet uriset = new URISet(); for(URI ins: inspectors){ uriset.getURI().add(ins); } icl.getURISet().add(uriset); } cpt.setInspectorChoiceList(icl); cptl.getCandidatePresentationToken().add(cpt); } return cptl; } private CandidateIssuanceTokenList createCandidateIssuanceTokenList(List<IssuanceTokenDescription> tokens, List<List<URI>> credentialUids, List<Set<List<URI>>> pseudonymChoice, List<List<Set<URI>>> inspectorChoice, Map<URI, CredentialDescription> credentialDescriptions){ CandidateIssuanceTokenList citl = new CandidateIssuanceTokenList(); for(int i= 0; i< tokens.size(); i++){ IssuanceTokenDescription issuance_desc = tokens.get(i); // try { // System.out.println("XML IssuanceTokenDescription : " + XmlUtils.toXml(new ObjectFactory().createIssuanceTokenDescriptioncreateIssuanceTokenDescription(issuance_desc))); // } catch(Exception e) { // // } PresentationTokenDescription presentation_desc = issuance_desc.getPresentationTokenDescription(); List<URI> credentialUidsList = credentialUids.get(i); Set<List<URI>> pseudonymChoices = pseudonymChoice.get(i); List<Set<URI>> inspectorChoices = inspectorChoice.get(i); // TODO : handle // issuance_desc.getCredentialTemplate() CandidateIssuanceToken cit = new CandidateIssuanceToken(); Token token = new Token(); token.setPolicyUID(presentation_desc.getPolicyUID()); token.setTokenUID(presentation_desc.getTokenUID()); cit.setToken(token); CredentialUidList cul = new CredentialUidList(); for(URI credURI: credentialUidsList){ cul.getCredentialUid().add(credURI); // for(FriendlyDescription fd: credentialDescriptions.get(credURI).getFriendlyCredentialName()){ // System.out.println("adding friendly description: "+fd); // cpt.getFriendlyTokenDescription().add(fd); // } } cit.setCredentialUidList(cul); /*System.out.println("checking the friendly token names:S "+desc.getMessage().getFriendlyPolicyName()); cpt.getFriendlyTokenDescription().add(null); for(FriendlyDescription d: desc.getMessage().getFriendlyPolicyDescription()){ System.out.println("d: "+d); cpt.getFriendlyTokenDescription().add(d); } */ //TODO : Take description from presentation policy... // Create and add a mock FriendlyDescription FriendlyDescription fDesc_en = new FriendlyDescription(); fDesc_en.setValue("Mock FriendlyDescription CandidateIssuanceToken"); fDesc_en.setLang("en"); cit.getFriendlyTokenDescription().add(fDesc_en); FriendlyDescription fDesc_dk = new FriendlyDescription(); fDesc_dk.setValue("Mock Venlig Beskrivelse CandidateIssuanceToken"); fDesc_dk.setLang("da"); cit.getFriendlyTokenDescription().add(fDesc_dk); PseudonymChoiceList pcl = new PseudonymChoiceList(); for(List<URI> uriset: pseudonymChoices){ URISet uris = new URISet(); for(URI uri: uriset){ uris.getURI().add(uri); } pcl.getURISet().add(uris); } cit.setPseudonymChoiceList(pcl); InspectorChoiceList icl = new InspectorChoiceList(); for(Set<URI> inspectors: inspectorChoices){ URISet uriset = new URISet(); for(URI ins: inspectors){ uriset.getURI().add(ins); } icl.getURISet().add(uriset); } cit.setInspectorChoiceList(icl); citl.getCandidateIssuanceToken().add(cit); } return citl; } /* //TODO: broken atm - uses some mock values @SuppressWarnings("unused") private CandidateIssuanceTokenList createCandidateIssuanceTokenList(List<IssuanceTokenDescription> tokens){ CandidateIssuanceTokenList citl = new CandidateIssuanceTokenList(); for(IssuanceTokenDescription desc: tokens){ CandidateIssuanceToken token = new CandidateIssuanceToken(); // token.set citl.getCandidateIssuanceToken().add(token); } return citl; } */ }