src-main.org.kawanfw.file.servlet.KawanNotifier Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of awake-file Show documentation
Show all versions of awake-file Show documentation
Awake FILE is a secure Open Source framework that allows to program very easily file uploads/downloads and RPC through http. File transfers include
powerful features like file chunking and automatic recovery mechanism.
Security has been taken into account from the design: server side allows
to specify strong security rules in order to protect the files and to secure the RPC calls.
The newest version!
/*
* This file is part of Awake FILE.
* Awake file: Easy file upload & download over HTTP with Java.
* Copyright (C) 2015, KawanSoft SAS
* (http://www.kawansoft.com). All rights reserved.
*
* Awake FILE is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* Awake FILE is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*
* Any modifications to this file must keep this entire header
* intact.
*/
package org.kawanfw.file.servlet;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.io.IOUtils;
import org.kawanfw.commons.api.server.CommonsConfigurator;
import org.kawanfw.commons.api.server.util.Sha1;
import org.kawanfw.commons.server.util.ServerLogger;
import org.kawanfw.commons.util.FrameworkDebug;
import org.kawanfw.commons.util.FrameworkFileUtil;
import org.kawanfw.commons.util.Tag;
/**
*
* Thread will notify our remote Kawan servers that a user has succeeded to
* login.
*
* This is done once during the JVM session per client user login, at first
* login. It is also done in a separated and secured thread: your File
* Manager Servlet will not be slowed down by the notification and no Exceptions
* will be thrown. Notification contains only anonymous data that are not
* reversible and thus can not identify your server: hash value of your server ip
* address and login count. There are no notifications for localhost or
* 127.0.0.1 server name.
*
* Please note that the notification mechanism is important for us as software
* editor: it says if our software is used, and the average client users per
* installation. However, if you *really* don't want our remote Kawan servers to
* be notified by your server, just create the following file with any content:
* user.home/.kawansoft/no_notify.txt
, where user.home
is
* the one of your Java EE Web server. Notification will be deactivated and at
* server startup the message
* "[FRAMEWORK START] Notification to Kawan Servers: OFF"
* will be inserted in the log defined by
* {@link CommonsConfigurator#getLogger()}
* You can check the notification mechanism following source code in class
* org.kawanfw.sql.servlet.KawanNotifier.java
.
*
* @author Nicolas de Pomereu
*/
public class KawanNotifier extends Thread {
private static boolean DEBUG = FrameworkDebug.isSet(KawanNotifier.class);
/** All the usernames that have logged */
private static Set usernames = new HashSet();
/** the username that has logged */
private String username = null;
/** The framwork in use SQL or FILE + Version */
private String product = null;
/** The counter of users that successfully logged once */
private static int usernameCpt = 0;
/**
*
* @param username
* the username that has logged
* @param product
* the product in use
*/
public KawanNotifier(String username, String product) {
this.username = username;
this.product = product;
}
/**
* Notify the Host that a user has done a login - Done once in a server
* session.
* This is done in this secured thread: the Server File Manager Servlet will
* not wait and all thrown Exceptions
are trapped
*/
public void run() {
BufferedReader bufferedReader = null;
try {
if (!usernames.contains(username)) {
usernames.add(username);
// Increment the number of users
usernameCpt++;
InetAddress inetAddress = InetAddress.getLocalHost();
String ip = inetAddress.toString();
// Make IP address completely anonymous
Sha1 sha1 = new Sha1();
ip = sha1.getHexHash(ip.getBytes());
String urlStr = "http://www.kawanfw.org/NotifyNew?ip=" + ip
+ "&user=" + usernameCpt + "&product=" + product;
debug("urlStr: " + urlStr);
URL url = new URL(urlStr);
URLConnection urlConnection = url.openConnection();
bufferedReader = new BufferedReader(new InputStreamReader(
urlConnection.getInputStream()));
String inputLine;
while ((inputLine = bufferedReader.readLine()) != null) {
debug(inputLine);
}
}
} catch (Exception e) {
if (DEBUG) {
try {
ServerLogger.getLogger().log(Level.WARNING, Tag.PRODUCT_EXCEPTION_RAISED
+ " Notify Exception: " + e.toString());
} catch (Exception e1) {
e1.printStackTrace(System.out);
}
}
} finally {
IOUtils.closeQuietly(bufferedReader);
}
}
/**
* Says it the username has already logged once in JVM session
* @param username
* the username that has logged
* @return thrue if the username has already logged once in JVM session
*/
public static boolean usernameAlreadyLogged(String username) {
return usernames.contains(username) ? true : false;
}
/**
* Says if the file user.home/.kawansoft/no_notify.txt exists.
*
* @return true if user.home/.kawansoft/no_notify.txt exists.
*/
public static boolean existsNoNotifyTxt() {
String NoNotifyTxt = FrameworkFileUtil.getUserHomeDotKawansoftDir() + File.separator
+ "no_notify.txt";
boolean noNotifyFileExists = new File(NoNotifyTxt).exists();
return noNotifyFileExists;
}
/**
* Says if web server is localhost (or 127.0.0.1)
*
* @return true if web server is localhost (or 127.0.0.1)
*/
public static boolean serverNameIsLocalhost() {
//RequestInfoStore requestInfoStore = new RequestInfoStore();
//String serverName = requestInfoStore.getServerName();
HttpServletRequest httpServletRequest = RequestInfoStore.getHttpServletRequest();
String serverName = httpServletRequest.getServerName();
if (serverName.toLowerCase().contains("localhost")
|| serverName.toLowerCase().contains("127.0.0.1")) {
debug("localhost serverName: " + serverName);
return true;
} else {
return false;
}
}
/**
* Method called by children Servlet for debug purpose Println is done only
* if class name name is in debug_list.ini
*/
public static void debug(String s) {
if (DEBUG) {
ServerLogger.getLogger().log(Level.WARNING, s);
}
}
}