diff --git a/data-access/servlet/src/main/java/auth/authz/AuthPolicy.java b/data-access/servlet/src/main/java/auth/authz/AuthPolicy.java index 10eb3144b1bc6f40b8ed7bbd3d1b6921e7df3371..4c36dc279f28b6e09f4715539a30e3338999a8b0 100644 --- a/data-access/servlet/src/main/java/auth/authz/AuthPolicy.java +++ b/data-access/servlet/src/main/java/auth/authz/AuthPolicy.java @@ -87,7 +87,7 @@ public class AuthPolicy else { userName = principal.getName(); - LOGGER.finer("DBG principal not instance of VlkbUser, but has user-name: " + userName); + LOGGER.finer("DBG principal '"+userName+"' is not instance of it.inaf.ia2.aa.data.User"); userGroups = new String[]{""};//{"VLKB.groupA", "AllPrivate"}; // was for shiro userGroupsValid = true; access = Access.PUBLIC_AND_AUTHORIZED_PRIVATE; @@ -157,19 +157,27 @@ public class AuthPolicy } + // API public String[] filterAuthorized(String[] pubdidArr) { - LOGGER.finer("with String[] trace"); + LOGGER.finer("trace"); - ArrayList<String> pubdidList = new ArrayList<String>(Arrays.asList(pubdidArr)); + List<String> pubdidList = new ArrayList<String>(Arrays.asList(pubdidArr)); switch(access) { case PUBLIC_ONLY : - filterNotPublic(pubdidList); + //filterNotPublic(pubdidList); + AuthPolicyDb adb; + synchronized(AuthPolicyDb.class) + { + adb = new AuthPolicyDb(); + } + pubdidList = adb.selectPublicOnly(pubdidArr); break; + case PUBLIC_AND_AUTHORIZED_PRIVATE : filterNotAuthorized(pubdidList); break; @@ -181,13 +189,16 @@ public class AuthPolicy } - private void filterNotPublic(ArrayList<String> pubdids) - { + // remove PRIVATE from the list + /* + private void filterNotPublic(ArrayList<String> pubdids) + { LOGGER.fine("trace"); assert pubdids != null; LOGGER.finer("PublisherDID list original : " + String.join(" ", pubdids)); List<AuthPolicyDb.PubdidGroups> privateUniqPubdids = db_queryPrivateUniqPubdidGroups(pubdids); + List<String> notAuthorizedUniqPubdids = pubdidsNotPublic(privateUniqPubdids, userGroups); LOGGER.finest("AuthZ removes: " + String.join(" ", notAuthorizedUniqPubdids)); @@ -195,41 +206,38 @@ public class AuthPolicy removeNotAuthorized(pubdids, notAuthorizedUniqPubdids); LOGGER.finest("PublisherDID list filtered : " + (pubdids.isEmpty() ? "" : String.join(" ", pubdids))); - } - - - private List<String> pubdidsNotPublic(List<AuthPolicyDb.PubdidGroups> pubdidList, String[] userGroups) - { + } + private List<String> pubdidsNotPublic(List<AuthPolicyDb.PubdidGroups> pubdidList, String[] userGroups) + { LOGGER.fine("trace"); - LOGGER.finer("userGroups: " + String.join(" ",userGroups)); - List<String> pubdidsNotAuthorizedList = new LinkedList<String>(); ListIterator<AuthPolicyDb.PubdidGroups> it = pubdidList.listIterator(); + List<String> pubdidsNotAuthorizedList = new LinkedList<String>(); while (it.hasNext()) { - AuthPolicyDb.PubdidGroups pubdidGroups = it.next(); - - LOGGER.finest(pubdidGroups.pubdid + " : " + String.join(" ",pubdidGroups.groups)); + AuthPolicyDb.PubdidGroups pubdidGroups = it.next(); - if( true )// isIntersectionEmpty(pubdidGroups.groups, userGroups) ) - { - pubdidsNotAuthorizedList.add(pubdidGroups.pubdid); - } + if( true )// isIntersectionEmpty(pubdidGroups.groups, userGroups) ) + { + pubdidsNotAuthorizedList.add(pubdidGroups.pubdid); + } } return pubdidsNotAuthorizedList; - } - + } + */ + // remove not-authorized from the list - private void filterNotAuthorized(ArrayList<String> pubdids) + private void filterNotAuthorized(List<String> pubdids) { LOGGER.fine("trace"); assert pubdids != null; LOGGER.finer("PublisherDID list original : " + String.join(" ", pubdids)); List<AuthPolicyDb.PubdidGroups> privateUniqPubdids = db_queryPrivateUniqPubdidGroups(pubdids); + List<String> notAuthorizedUniqPubdids = pubdidsNotAuthorized(privateUniqPubdids, userGroups); LOGGER.finest("AuthZ removes: " + String.join(" ", notAuthorizedUniqPubdids)); @@ -240,8 +248,31 @@ public class AuthPolicy } + private List<String> pubdidsNotAuthorized(List<AuthPolicyDb.PubdidGroups> pubdidList, String[] userGroups) + { + LOGGER.fine("trace"); - private void removeNotAuthorized(ArrayList<String> pubdids, List<String> notAuthorizedUniqPubdids) + List<String> pubdidsNotAuthorizedList = new LinkedList<String>(); + ListIterator<AuthPolicyDb.PubdidGroups> it = pubdidList.listIterator(); + + while (it.hasNext()) + { + AuthPolicyDb.PubdidGroups pubdidGroups = it.next(); + + LOGGER.finest(pubdidGroups.pubdid + " : " + String.join(" ",pubdidGroups.groups)); + + if( isIntersectionEmpty(pubdidGroups.groups, userGroups) ) + { + pubdidsNotAuthorizedList.add(pubdidGroups.pubdid); + } + } + + return pubdidsNotAuthorizedList; + } + + + + private void removeNotAuthorized(List<String> pubdids, List<String> notAuthorizedUniqPubdids) { ListIterator<String> itr = pubdids.listIterator(); while (itr.hasNext()) @@ -258,6 +289,21 @@ public class AuthPolicy } + private boolean isIntersectionEmpty(String[] stringsA, String[] stringsB) + { + for(String strA : stringsA) + for(String strB : stringsB) + { + if(strA.equals(strB)) + { + return false; + } + } + return true; + } + + + // DB-query private List<AuthPolicyDb.PubdidGroups> db_queryPrivateUniqPubdidGroups(List<String> pubdids) { @@ -284,44 +330,5 @@ public class AuthPolicy - private List<String> pubdidsNotAuthorized(List<AuthPolicyDb.PubdidGroups> pubdidList, String[] userGroups) - { - LOGGER.fine("trace"); - - List<String> pubdidsNotAuthorizedList = new LinkedList<String>(); - ListIterator<AuthPolicyDb.PubdidGroups> it = pubdidList.listIterator(); - - while (it.hasNext()) - { - AuthPolicyDb.PubdidGroups pubdidGroups = it.next(); - - LOGGER.finest(pubdidGroups.pubdid + " : " + String.join(" ",pubdidGroups.groups)); - - if( isIntersectionEmpty(pubdidGroups.groups, userGroups) ) - { - pubdidsNotAuthorizedList.add(pubdidGroups.pubdid); - } - } - - return pubdidsNotAuthorizedList; - } - - - - private boolean isIntersectionEmpty(String[] stringsA, String[] stringsB) - { - for(String strA : stringsA) - for(String strB : stringsB) - { - if(strA.equals(strB)) - { - return false; - } - } - return true; - } - - - } diff --git a/data-access/servlet/src/main/java/auth/authz/AuthPolicyDb.java b/data-access/servlet/src/main/java/auth/authz/AuthPolicyDb.java index f8c166c24bbe543878da981f2f955c5e887eca41..614bdda9255bb3d0eb1c57c54e500c9f719002a0 100644 --- a/data-access/servlet/src/main/java/auth/authz/AuthPolicyDb.java +++ b/data-access/servlet/src/main/java/auth/authz/AuthPolicyDb.java @@ -89,6 +89,46 @@ public class AuthPolicyDb return pubdidGroups; } + + + public List<String> selectPublicOnly(String[] uniqPubdids) + { + String commaSepObscorePubdids = String.join("\',\'", uniqPubdids); + + assert (commaSepObscorePubdids != null) && (!commaSepObscorePubdids.isEmpty()); + + String TheQuery + = "SELECT obs_publisher_did FROM obscore " + + "WHERE (policy = 'FREE') AND (obs_publisher_did IN (\'"+commaSepObscorePubdids+"\'));"; + + LOGGER.finer("Connecting to: "+dbconn.uri()+" with optional user/pwd: "+dbconn.userName()+" / ***"); + + List<String> pubdidPublic = new LinkedList<String>(); + + try(Connection conn = DriverManager.getConnection(dbconn.uri(), dbconn.userName(), dbconn.password()); + Statement st = conn.createStatement(); + ResultSet res = st.executeQuery(TheQuery);) + { + while (res.next()) + { + pubdidPublic.add(res.getString("obs_publisher_did")); + } + } + catch (SQLException se) + { + logSqlExInfo(se); + se.printStackTrace(); + } + + LOGGER.finest("Found public: " + pubdidPublic.size()); + + return pubdidPublic; + } + + + + + private void logSqlExInfo(SQLException se) { LOGGER.severe("SQLState : " + se.getSQLState()); diff --git a/data-access/servlet/src/main/java/auth/authz/webapi/AuthZFilter.java b/data-access/servlet/src/main/java/auth/authz/webapi/AuthZFilter.java index 25b946497297358c20ef39c8f30f041e70c974f3..ed9b0ec09b976288c44849bd15da3bbc28a0e652 100644 --- a/data-access/servlet/src/main/java/auth/authz/webapi/AuthZFilter.java +++ b/data-access/servlet/src/main/java/auth/authz/webapi/AuthZFilter.java @@ -101,7 +101,17 @@ class AuthZ * if one or more of pubdids not-authorized -> all request not authorized * */ /* NOTE for now soda/vlkb_cutout does not allow multiplicity --> only one pubdid allowed */ - return (authorized_pubdids.length == pubdidArr.length); + + if((authorized_pubdids==null) || (pubdidArr==null)) + { + LOGGER.warning("One of arrays null"); + return true; + } + else + { + LOGGER.finest("authorized vs original length: "+authorized_pubdids.length + " / " + pubdidArr.length); + return (authorized_pubdids.length == pubdidArr.length); + } } } @@ -123,7 +133,8 @@ public class AuthZFilter implements Filter public void destroy() {} @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { LOGGER.fine("doFilter"); @@ -139,6 +150,7 @@ public class AuthZFilter implements Filter else { resp.setContentType("text/plain"); + // FIXME use VO errors vlkb-volib: implement Lib.doPermissionError()... resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Forbidden"); } } diff --git a/docker/deps/soda.logging.properties b/docker/deps/soda.logging.properties index 6c78bf65852876567ff0ca3054862be29db380fc..08c107e9c4fdcd2bcbcc0d14d8fe3f48b27ecf07 100644 --- a/docker/deps/soda.logging.properties +++ b/docker/deps/soda.logging.properties @@ -70,3 +70,5 @@ SodaImpl.level = INFO VlkbCli.level = INFO AuthPolicy.level = INFO AuthPolicyDb.level = INFO +AuthZFilter.level = INFO +AuthZ.level = INFO diff --git a/docker/start-soda.sh.soda b/docker/start-soda.sh.soda index 82e6ce813d6eb538c5f2dd5b8f3710664ef44a85..0ed173f4465f6222dda3c60bb301257d6c895411 100755 --- a/docker/start-soda.sh.soda +++ b/docker/start-soda.sh.soda @@ -129,6 +129,8 @@ sed -i "s/.*SodaImpl\.level.*=.*/SodaImpl.level = $DBG_LEVEL/g" $CATALINA_BASE/c sed -i "s/.*VlkbCli\.level.*=.*/VlkbCli.level = $DBG_LEVEL/g" $CATALINA_BASE/conf/soda.logging.properties sed -i "s/.*AuthPolicy\.level.*=.*/AuthPolicy.level = $DBG_LEVEL/g" $CATALINA_BASE/conf/soda.logging.properties sed -i "s/.*AuthPolicyDb\.level.*=.*/AuthPolicyDb.level = $DBG_LEVEL/g" $CATALINA_BASE/conf/soda.logging.properties +sed -i "s/.*AuthZFilter\.level.*=.*/AuthZFilter.level = $DBG_LEVEL/g" $CATALINA_BASE/conf/soda.logging.properties +sed -i "s/.*AuthZ\.level.*=.*/AuthZ.level = $DBG_LEVEL/g" $CATALINA_BASE/conf/soda.logging.properties date