77import java .io .OutputStreamWriter ;
88import java .io .Writer ;
99import java .util .ArrayList ;
10- import java .util .Hashtable ;
10+ import java .util .Iterator ;
1111import java .util .List ;
1212import java .util .Map .Entry ;
1313import java .util .UUID ;
1414
1515import javax .servlet .ServletContext ;
1616import javax .servlet .ServletException ;
1717import javax .ws .rs .CookieParam ;
18+ import javax .ws .rs .DELETE ;
1819import javax .ws .rs .GET ;
1920import javax .ws .rs .POST ;
2021import javax .ws .rs .PUT ;
2122import javax .ws .rs .Path ;
2223import javax .ws .rs .PathParam ;
2324import javax .ws .rs .Produces ;
24- import javax .ws .rs .QueryParam ;
2525import javax .ws .rs .WebApplicationException ;
2626import javax .ws .rs .core .Context ;
27+ import javax .ws .rs .core .Cookie ;
2728import javax .ws .rs .core .MediaType ;
2829import javax .ws .rs .core .Response ;
2930import javax .ws .rs .core .StreamingOutput ;
4142import org .apache .http .impl .client .HttpClients ;
4243import org .apache .http .message .BasicNameValuePair ;
4344import org .apache .log4j .Logger ;
45+ import org .codehaus .jackson .JsonNode ;
46+ import org .codehaus .jackson .map .ObjectMapper ;
4447
48+ import rdf .SecureRdfStoreManagerImpl ;
4549import util .ObjectPair ;
4650import accounts .FrameworkUserManager ;
51+ import accounts .UserProfile ;
4752import authentication .FrameworkConfiguration ;
4853
4954import com .google .gson .JsonObject ;
55+ import com .ontos .ldiw .vocabulary .LDIWO ;
5056
5157/**
5258 *
@@ -59,17 +65,20 @@ public class AuthorizedSessions {
5965 private static final Logger log = Logger .getLogger (AuthorizedSessions .class );
6066
6167 private FrameworkUserManager frameworkUserManager ;
62- private ObjectPair <String , String > rdfStoreUser ;
63- // TODO: the information of this map has to be stored in the user settings
64- // graph instead
65- public static Hashtable <String , String > map = new Hashtable <String , String >();
68+ private String sessionsGraph ;
6669 private String endpoint ;
6770
71+ private SecureRdfStoreManagerImpl frameworkRdfStoreManager ;
72+
6873 public AuthorizedSessions (@ Context ServletContext context ) throws ServletException {
6974 try {
70- frameworkUserManager = FrameworkConfiguration .getInstance (context )
71- .getFrameworkUserManager ();
75+ FrameworkConfiguration frameworkConfig = FrameworkConfiguration .getInstance (context );
76+ frameworkUserManager = frameworkConfig .getFrameworkUserManager ();
77+ sessionsGraph = frameworkConfig .getAuthSessionsGraph ();
7278 endpoint = FrameworkConfiguration .getInstance (context ).getAuthSparqlEndpoint ();
79+ frameworkRdfStoreManager = new SecureRdfStoreManagerImpl (frameworkConfig
80+ .getAuthSparqlEndpoint (), frameworkConfig .getAuthSparqlUser (), frameworkConfig
81+ .getAuthSparqlPassword ());
7382 } catch (FileNotFoundException e ) {
7483 log .error (e );
7584 e .printStackTrace ();
@@ -83,35 +92,47 @@ public AuthorizedSessions(@Context ServletContext context) throws ServletExcepti
8392
8493 @ PUT
8594 @ Produces (MediaType .APPLICATION_JSON )
86- public Response create (@ QueryParam ( "username " ) String username ,
95+ public Response create (@ CookieParam ( value = "user " ) Cookie userc ,
8796 @ CookieParam (value = "token" ) String token ) {
8897
8998 /*
9099 * authenticates the user, throw exception if failed
91100 */
92- log .debug ("user:" + username + " token:" + token );
93- boolean checkToken = false ;
101+ UserProfile userProfile ;
94102 try {
95- checkToken = frameworkUserManager .checkToken (username , token );
96- if (!checkToken )
97- return Response .status (Response .Status .UNAUTHORIZED ).build ();
98- rdfStoreUser = frameworkUserManager .getRdfStoreUser (username , token );
99-
103+ // authenticates the user, throw exception if fail
104+ userProfile = frameworkUserManager .validate (userc , token );
105+ if (userProfile == null )
106+ return Response .status (Response .Status .UNAUTHORIZED ).entity ("Invalid credentials" )
107+ .build ();
108+ log .info (" user: " + userProfile .getUsername ());
100109 } catch (Exception e ) {
101110 log .error (e );
102111 e .printStackTrace ();
103112 return Response .status (Response .Status .INTERNAL_SERVER_ERROR ).entity (e .getMessage ())
104113 .build ();
105114 }
106115 /*
107- * generates a session for the user
116+ * generates a session for the user and stores it in the sessions graph
117+ * <accountURI> LDIWO.sessionToken
118+ * "1fe39ef0-6987-11e4-9803-0800200c9a66"^^xsd:string
108119 */
109120 String sessionToken = UUID .randomUUID ().toString ();
110- map .put (sessionToken , rdfStoreUser .getFirst () + ":" + rdfStoreUser .getSecond ());
111- log .debug (map .toString ());
121+
122+ String query = "INSERT INTO <" + sessionsGraph + "> { <" + userProfile .getAccountURI ()
123+ + "> <" + LDIWO .sessionToken + "> \" " + sessionToken + "\" ^^xsd:string . }" ;
124+ log .debug (query );
125+
126+ try {
127+ frameworkRdfStoreManager .execute (query , "json" );
128+ } catch (Exception e ) {
129+ return Response .status (Response .Status .INTERNAL_SERVER_ERROR ).entity (e .getMessage ())
130+ .build ();
131+ }
132+
112133 JsonObject body = new JsonObject ();
113134 body .addProperty ("endpoint" , "rest/session/" + sessionToken );
114- return Response .ok ( body .toString (), MediaType . APPLICATION_JSON ).build ();
135+ return Response .status ( Response . Status . CREATED ). entity ( body .toString ()).build ();
115136 }
116137
117138 @ GET
@@ -127,18 +148,43 @@ public Response post(@PathParam("sessionToken") String sessionToken, @Context Ur
127148 throws Exception {
128149
129150 log .info (sessionToken );
130- log .debug (AuthorizedSessions .map .toString ());
151+ String username = "" ;
152+ /*
153+ * retrieves form user that created that session and the rdfUser and
154+ * paswword for that user
155+ */
156+ try {
157+ String query = "SELECT ?user FROM <" + sessionsGraph + "> WHERE { ?user " + " <"
158+ + LDIWO .sessionToken + "> \" " + sessionToken + "\" ^^xsd:string .}" ;
159+ log .debug (query );
160+
161+ String result = frameworkRdfStoreManager .execute (query , "json" );
162+ log .debug (result );
163+ ObjectMapper mapper = new ObjectMapper ();
164+ JsonNode rootNode = mapper .readTree (result );
165+ Iterator <JsonNode > bindingsIter = rootNode .path ("results" ).path ("bindings" )
166+ .getElements ();
131167
132- String userLogin = AuthorizedSessions .map .get (sessionToken );
133- log .debug (userLogin );
134- if (userLogin == null ) {
135- return Response .status (Response .Status .UNAUTHORIZED ).build ();
168+ if (bindingsIter .hasNext ()) {
169+ JsonNode bindingNode = bindingsIter .next ();
170+ username = bindingNode .get ("user" ).path ("value" ).getTextValue ();
171+ }
172+
173+ } catch (Exception e ) {
174+ log .error (e );
175+ e .printStackTrace ();
176+ return Response .status (Response .Status .INTERNAL_SERVER_ERROR ).entity (e .getMessage ())
177+ .build ();
136178 }
179+ log .debug ("user:" + username + "-" );
180+ if (username .equals ("" ))
181+ return Response .status (Response .Status .NOT_FOUND ).build ();
182+
183+ ObjectPair <String , String > rdfStoreUser = frameworkUserManager .getRdfStoreUser (username );
137184
138185 // create a context with credentials
139- String [] creds = userLogin .split (":" );
140- UsernamePasswordCredentials credentials = new UsernamePasswordCredentials (creds [0 ],
141- creds [1 ]);
186+ UsernamePasswordCredentials credentials = new UsernamePasswordCredentials (rdfStoreUser
187+ .getFirst (), rdfStoreUser .getSecond ());
142188 BasicCredentialsProvider credsProvider = new BasicCredentialsProvider ();
143189 credsProvider .setCredentials (AuthScope .ANY , credentials );
144190 HttpClientContext context = HttpClientContext .create ();
@@ -170,4 +216,41 @@ public void write(OutputStream os) throws IOException, WebApplicationException {
170216 return Response .ok (stream ).build ();
171217
172218 }
219+
220+ @ DELETE
221+ @ Path ("{sessionToken}" )
222+ public Response delete (@ PathParam ("sessionToken" ) String sessionToken ,
223+ @ CookieParam (value = "user" ) Cookie userc , @ CookieParam (value = "token" ) String token ) {
224+
225+ /*
226+ * authenticates the user, throw exception if failed
227+ */
228+ UserProfile userProfile ;
229+ try {
230+ // authenticates the user, throw exception if fail
231+ userProfile = frameworkUserManager .validate (userc , token );
232+ if (userProfile == null )
233+ return Response .status (Response .Status .UNAUTHORIZED ).entity ("Invalid credentials" )
234+ .build ();
235+ log .info (" user: " + userProfile .getUsername ());
236+ } catch (Exception e ) {
237+ log .error (e );
238+ e .printStackTrace ();
239+ return Response .status (Response .Status .INTERNAL_SERVER_ERROR ).entity (e .getMessage ())
240+ .build ();
241+ }
242+
243+ String query = "DELETE FROM <http://generator.geoknow.eu/resource/sessionsGraph> {?s ?p ?o} "
244+ + "WHERE { ?s ?p ?o . FILTER(str(?o) = \" " + sessionToken + "\" ) } " ;
245+ log .debug (query );
246+
247+ try {
248+ log .info (frameworkRdfStoreManager .execute (query , "json" ));
249+ } catch (Exception e ) {
250+ return Response .status (Response .Status .INTERNAL_SERVER_ERROR ).entity (e .getMessage ())
251+ .build ();
252+ }
253+
254+ return Response .ok ().build ();
255+ }
173256}
0 commit comments