diff --git a/app/build.gradle b/app/build.gradle index 49d3387b..8a91e713 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,12 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 32 + compileSdkVersion 33 defaultConfig { applicationId "be.ppareit.swiftp" minSdkVersion 23 - targetSdkVersion 32 + targetSdkVersion 33 versionCode 30100 versionName "3.1" } @@ -45,7 +45,6 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'net.vrallev.android:cat:1.0.5' implementation 'androidx.appcompat:appcompat:1.4.2' implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.documentfile:documentfile:1.0.1' diff --git a/app/src/main/java/be/ppareit/android/DynamicMultiSelectListPreference.java b/app/src/main/java/be/ppareit/android/DynamicMultiSelectListPreference.java index 7df030b8..54714c82 100644 --- a/app/src/main/java/be/ppareit/android/DynamicMultiSelectListPreference.java +++ b/app/src/main/java/be/ppareit/android/DynamicMultiSelectListPreference.java @@ -22,9 +22,9 @@ import android.content.Context; import android.preference.MultiSelectListPreference; import android.util.AttributeSet; +import android.util.Log; import android.view.View; -import net.vrallev.android.cat.Cat; /** * This is the same as the sdk MultiSelectListPreference but each time @@ -41,7 +41,7 @@ public DynamicMultiSelectListPreference(Context context, AttributeSet attrs) { @Override protected View onCreateDialogView() { - Cat.d("Creating dialog view"); + Log.d("swiftp", "Creating dialog view"); mPopulateListener.onPopulate(this); diff --git a/app/src/main/java/be/ppareit/swiftp/App.java b/app/src/main/java/be/ppareit/swiftp/App.java index d2f7bbb4..d5a6da89 100644 --- a/app/src/main/java/be/ppareit/swiftp/App.java +++ b/app/src/main/java/be/ppareit/swiftp/App.java @@ -23,8 +23,8 @@ import android.content.IntentFilter; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; +import android.util.Log; -import net.vrallev.android.cat.Cat; import be.ppareit.swiftp.gui.FsWidgetProvider; @@ -99,7 +99,7 @@ public static String getVersion() { PackageManager pm = context.getPackageManager(); return pm.getPackageInfo(packageName, 0).versionName; } catch (NameNotFoundException e) { - Cat.e("Unable to find the name " + packageName + " in the package"); + Log.e("swiftp","Unable to find the name " + packageName + " in the package"); return null; } } diff --git a/app/src/main/java/be/ppareit/swiftp/FsService.java b/app/src/main/java/be/ppareit/swiftp/FsService.java index 897dc3c3..001f4853 100644 --- a/app/src/main/java/be/ppareit/swiftp/FsService.java +++ b/app/src/main/java/be/ppareit/swiftp/FsService.java @@ -39,7 +39,6 @@ import androidx.core.content.ContextCompat; -import net.vrallev.android.cat.Cat; import java.io.IOException; import java.lang.reflect.Method; @@ -148,7 +147,7 @@ public int onStartCommand(Intent intent, int flags, int startId) { //https://developer.android.com/reference/android/app/Service.html //if there are not any pending start commands to be delivered to the service, it will be called with a null intent object, if (intent != null && intent.getAction() != null) { - Cat.d("onStartCommand called with action: " + intent.getAction()); + Log.d("swiftp","onStartCommand called with action: " + intent.getAction()); switch (intent.getAction()) { case ACTION_REQUEST_START: @@ -365,7 +364,7 @@ public static InetAddress getLocalInetAddress() { && !address.isLinkLocalAddress() && address instanceof Inet4Address) { if (returnAddress != null) { - Cat.w("Found more than one valid address local inet address, why???"); + Log.w("swiftp","Found more than one valid address local inet address, why???"); } returnAddress = address; } @@ -465,7 +464,7 @@ public void onTaskRemoved(Intent rootIntent) { Intent restartService = new Intent(getApplicationContext(), this.getClass()); restartService.setPackage(getPackageName()); PendingIntent restartServicePI = PendingIntent.getService( - getApplicationContext(), 1, restartService, PendingIntent.FLAG_ONE_SHOT); + getApplicationContext(), 1, restartService, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE); AlarmManager alarmService = (AlarmManager) getApplicationContext() .getSystemService(Context.ALARM_SERVICE); alarmService.set(AlarmManager.ELAPSED_REALTIME, diff --git a/app/src/main/java/be/ppareit/swiftp/gui/FolderPickerDialogBuilder.java b/app/src/main/java/be/ppareit/swiftp/gui/FolderPickerDialogBuilder.java index 6c504013..e295701d 100644 --- a/app/src/main/java/be/ppareit/swiftp/gui/FolderPickerDialogBuilder.java +++ b/app/src/main/java/be/ppareit/swiftp/gui/FolderPickerDialogBuilder.java @@ -22,10 +22,10 @@ import android.app.AlertDialog; import android.content.Context; import android.os.Environment; +import android.util.Log; import android.widget.ArrayAdapter; import android.widget.ListView; -import net.vrallev.android.cat.Cat; import java.io.File; import java.io.IOException; @@ -77,7 +77,7 @@ private void update() { try { mRoot = new File(mRoot.getCanonicalPath()); } catch (IOException e) { - Cat.w("Directory root is incorrect, fixing to external storage."); + Log.w("swiftp","Directory root is incorrect, fixing to external storage."); mRoot = Environment.getExternalStorageDirectory(); } @@ -94,8 +94,8 @@ private void update() { return (file.isDirectory() && !file.isHidden()); }); if (dirs == null) { - Cat.w("Unable to receive dirs list, no Access rights?"); - Cat.d("Unable to fix, continue with empty list"); + Log.w("swiftp", "Unable to receive dirs list, no Access rights?"); + Log.d("swiftp","Unable to fix, continue with empty list"); dirs = new String[]{}; } mAdapter.add(".."); diff --git a/app/src/main/java/be/ppareit/swiftp/gui/FsNotification.java b/app/src/main/java/be/ppareit/swiftp/gui/FsNotification.java index e9dc4597..8a3217c1 100644 --- a/app/src/main/java/be/ppareit/swiftp/gui/FsNotification.java +++ b/app/src/main/java/be/ppareit/swiftp/gui/FsNotification.java @@ -28,10 +28,10 @@ import android.content.Context; import android.content.Intent; import android.os.Build; +import android.util.Log; import androidx.core.app.NotificationCompat; -import net.vrallev.android.cat.Cat; import java.net.InetAddress; @@ -44,7 +44,7 @@ public class FsNotification { public static final int NOTIFICATION_ID = 7890; public static Notification setupNotification(Context context) { - Cat.d("Setting up the notification"); + Log.d("swiftp","Setting up the notification"); // Get NotificationManager reference NotificationManager nm = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE); @@ -96,6 +96,7 @@ public static Notification setupNotification(Context context) { int importance = NotificationManager.IMPORTANCE_DEFAULT; NotificationChannel channel = new NotificationChannel(channelId, name, importance); channel.setDescription(description); + channel.setShowBadge(false); nm.createNotificationChannel(channel); } diff --git a/app/src/main/java/be/ppareit/swiftp/gui/FsTileService.java b/app/src/main/java/be/ppareit/swiftp/gui/FsTileService.java index d8bc555a..9ee68ead 100644 --- a/app/src/main/java/be/ppareit/swiftp/gui/FsTileService.java +++ b/app/src/main/java/be/ppareit/swiftp/gui/FsTileService.java @@ -5,9 +5,10 @@ import android.os.Build; import android.service.quicksettings.Tile; import android.service.quicksettings.TileService; +import android.util.Log; + import androidx.annotation.RequiresApi; -import net.vrallev.android.cat.Cat; import java.net.InetAddress; @@ -50,7 +51,7 @@ private void updateTileState() { // Fill in the FTP server address InetAddress address = FsService.getLocalInetAddress(); if (address == null) { - Cat.v("Unable to retrieve wifi ip address"); + Log.v("swiftp","Unable to retrieve wifi ip address"); tile.setLabel(getString(R.string.swiftp_name)); return; } diff --git a/app/src/main/java/be/ppareit/swiftp/gui/FsWidgetProvider.java b/app/src/main/java/be/ppareit/swiftp/gui/FsWidgetProvider.java index b14f334d..c7ec40ca 100644 --- a/app/src/main/java/be/ppareit/swiftp/gui/FsWidgetProvider.java +++ b/app/src/main/java/be/ppareit/swiftp/gui/FsWidgetProvider.java @@ -30,12 +30,12 @@ import android.content.Intent; import android.os.Build; import android.os.IBinder; +import android.util.Log; import android.widget.RemoteViews; import androidx.core.app.NotificationCompat; import androidx.core.content.ContextCompat; -import net.vrallev.android.cat.Cat; import java.net.InetAddress; @@ -52,7 +52,7 @@ public class FsWidgetProvider extends AppWidgetProvider { @Override public void onReceive(Context context, Intent intent) { - Cat.v("Received broadcast: " + intent.getAction()); + Log.v("swiftp","Received broadcast: " + intent.getAction()); // watch for the broadcasts by the ftp server and update the widget if needed final String action = intent.getAction(); if (FsService.ACTION_STARTED.equals(action) || FsService.ACTION_STOPPED.equals(action)) { @@ -65,7 +65,7 @@ public void onReceive(Context context, Intent intent) { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - Cat.d("onUpdated called"); + Log.d("swiftp","onUpdated called"); // let the updating happen by a service Intent updateIntent = new Intent(context, UpdateService.class); ContextCompat.startForegroundService(context, updateIntent); @@ -75,11 +75,11 @@ public static class UpdateService extends Service { // all real work is done in a service to avoid ANR messages @Override public int onStartCommand(Intent intent, int flags, int startId) { - Cat.d("UpdateService start command"); + Log.d("swiftp","UpdateService start command"); // We won't take long, but still we need to keep display a notification while updating NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); if (nm == null) { - Cat.e("We were unable to receive the notification manager."); + Log.e("swiftp","We were unable to receive the notification manager."); return START_NOT_STICKY; } String channelId = "be.ppareit.swiftp.widget_provider.channelId"; @@ -113,7 +113,7 @@ public int onStartCommand(Intent intent, int flags, int startId) { // get ip address InetAddress address = FsService.getLocalInetAddress(); if (address == null) { - Cat.w("Unable to retrieve the local ip address"); + Log.w("swiftp","Unable to retrieve the local ip address"); text = "ERROR"; } else { text = address.getHostAddress(); diff --git a/app/src/main/java/be/ppareit/swiftp/gui/MainActivity.java b/app/src/main/java/be/ppareit/swiftp/gui/MainActivity.java index b0228ee9..59ea6681 100644 --- a/app/src/main/java/be/ppareit/swiftp/gui/MainActivity.java +++ b/app/src/main/java/be/ppareit/swiftp/gui/MainActivity.java @@ -29,6 +29,7 @@ import android.os.Build; import android.os.Build.VERSION; import android.os.Bundle; +import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -37,7 +38,6 @@ import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; -import net.vrallev.android.cat.Cat; import java.util.Arrays; @@ -56,7 +56,7 @@ public class MainActivity extends AppCompatActivity { @Override public void onCreate(Bundle savedInstanceState) { - Cat.d("created"); + Log.d("swiftp","created"); setTheme(FsSettings.getTheme()); super.onCreate(savedInstanceState); @@ -65,7 +65,7 @@ public void onCreate(Bundle savedInstanceState) { } if (App.isFreeVersion() && App.isPaidVersionInstalled()) { - Cat.d("Running demo while paid is installed"); + Log.d("swiftp","Running demo while paid is installed"); AlertDialog ad = new AlertDialog.Builder(this) .setTitle(R.string.demo_while_paid_dialog_title) .setMessage(R.string.demo_while_paid_dialog_message) @@ -101,11 +101,11 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode != PERMISSIONS_REQUEST_CODE) { - Cat.e("Unhandled request code"); + Log.e("swiftp","Unhandled request code"); return; } - Cat.d("permissions: " + Arrays.toString(permissions)); - Cat.d("grantResults: " + Arrays.toString(grantResults)); + Log.d("swiftp","permissions: " + Arrays.toString(permissions)); + Log.d("swiftp","grantResults: " + Arrays.toString(grantResults)); if (grantResults.length > 0) { // Permissions not granted, close down for (int result : grantResults) { diff --git a/app/src/main/java/be/ppareit/swiftp/gui/PreferenceFragment.java b/app/src/main/java/be/ppareit/swiftp/gui/PreferenceFragment.java index 23e37a13..52d72e87 100644 --- a/app/src/main/java/be/ppareit/swiftp/gui/PreferenceFragment.java +++ b/app/src/main/java/be/ppareit/swiftp/gui/PreferenceFragment.java @@ -39,13 +39,13 @@ import android.preference.PreferenceScreen; import android.preference.TwoStatePreference; import android.text.util.Linkify; +import android.util.Log; import android.widget.TextView; import android.widget.Toast; - +import androidx.appcompat.app.AlertDialog; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; -import net.vrallev.android.cat.Cat; import java.net.InetAddress; import java.util.List; @@ -78,7 +78,19 @@ public void onCreate(Bundle savedInstanceState) { updateRunningState(); runningPref.setOnPreferenceChangeListener((preference, newValue) -> { if ((Boolean) newValue) { - FsService.start(); + if (FsSettings.getExternalStorageUri() != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + FsService.start(); + } else { + AlertDialog.Builder adb = new AlertDialog.Builder(getActivity()); + adb.setTitle("Write External Storage is Required"); + adb.setMessage("Please set the starting directory at Advanced Settings->Writing external storage"); + adb.setPositiveButton("Ok", (dialog, which) -> { + dialog.dismiss(); + runningPref.setChecked(false); + }); + adb.show(); + FsService.stop(); + } } else { FsService.stop(); } @@ -120,7 +132,7 @@ public void onCreate(Bundle savedInstanceState) { try { portNumber = Integer.parseInt(newPortNumberString); } catch (Exception e) { - Cat.d("Error parsing port number! Moving on..."); + Log.d("swiftp","Error parsing port number! Moving on..."); } if (portNumber <= 0 || 65535 < portNumber) { Toast.makeText(getActivity(), @@ -182,7 +194,7 @@ public void onCreate(Bundle savedInstanceState) { Preference helpPref = findPref("help"); helpPref.setOnPreferenceClickListener(preference -> { - Cat.v("On preference help clicked"); + Log.v("swiftp","On preference help clicked"); Context context = getActivity(); AlertDialog ad = new AlertDialog.Builder(context) .setTitle(R.string.help_dlg_title) @@ -228,7 +240,7 @@ public void onResume() { updateRunningState(); updateUsersPref(); - Cat.d("onResume: Registering the FTP server actions"); + Log.d("swiftp","onResume: Registering the FTP server actions"); IntentFilter filter = new IntentFilter(); filter.addAction(FsService.ACTION_STARTED); filter.addAction(FsService.ACTION_STOPPED); @@ -240,17 +252,17 @@ public void onResume() { public void onPause() { super.onPause(); - Cat.v("onPause: Unregistering the FTPServer actions"); + Log.v("swiftp","onPause: Unregistering the FTPServer actions"); getActivity().unregisterReceiver(mFsActionsReceiver); } @Override public void onActivityResult(int requestCode, int resultCode, Intent resultData) { - Cat.d("onActivityResult called"); + Log.d("swiftp","onActivityResult called"); if (requestCode == ACTION_OPEN_DOCUMENT_TREE && resultCode == Activity.RESULT_OK) { Uri treeUri = resultData.getData(); String path = treeUri.getPath(); - Cat.d("Action Open Document Tree on path " + path); + Log.d("swiftp","Action Open Document Tree on path " + path); final CheckBoxPreference writeExternalStoragePref = findPref("writeExternalStorage"); if (!":".equals(path.substring(path.length() - 1)) || path.contains("primary")) { @@ -302,7 +314,7 @@ private void updateRunningState() { // Fill in the FTP server address InetAddress address = FsService.getLocalInetAddress(); if (address == null) { - Cat.v("Unable to retrieve wifi ip address"); + Log.v("swiftp","Unable to retrieve wifi ip address"); runningPref.setSummary(R.string.running_summary_failed_to_get_ip_address); return; } @@ -324,7 +336,7 @@ private void updateRunningState() { BroadcastReceiver mFsActionsReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - Cat.v("action received: " + intent.getAction()); + Log.v("swiftp","action received: " + intent.getAction()); if (intent.getAction() == null) { return; } diff --git a/app/src/main/java/be/ppareit/swiftp/locale/EditActivity.java b/app/src/main/java/be/ppareit/swiftp/locale/EditActivity.java index bfa742f7..325b340b 100644 --- a/app/src/main/java/be/ppareit/swiftp/locale/EditActivity.java +++ b/app/src/main/java/be/ppareit/swiftp/locale/EditActivity.java @@ -23,13 +23,14 @@ import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; + +import android.util.Log; import android.view.MenuItem; import android.widget.RadioButton; import android.widget.RadioGroup; import com.twofortyfouram.locale.sdk.client.ui.activity.AbstractAppCompatPluginActivity; -import net.vrallev.android.cat.Cat; import be.ppareit.swiftp.FsSettings; import be.ppareit.swiftp.R; @@ -56,7 +57,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { ApplicationInfo ai = pm.getApplicationInfo(getCallingPackage(), 0); callingApplicationLabel = pm.getApplicationLabel(ai); } catch (final PackageManager.NameNotFoundException e) { - Cat.e("Calling package couldn't be found%s", e); //$NON-NLS-1$ + Log.e("swiftp","Calling package couldn't be found%s", e); //$NON-NLS-1$ } if (null != callingApplicationLabel) { setTitle(callingApplicationLabel); @@ -85,7 +86,7 @@ public boolean isBundleValid(@NonNull Bundle bundle) { public void onPostCreateWithPreviousResult(@NonNull Bundle previousBundle, @NonNull String previousBlurb) { if (!isBundleValid(previousBundle)) { - Cat.e("Invalid bundle received, repairing to default"); + Log.e("swiftp","Invalid bundle received, repairing to default"); previousBundle = generateBundle(this, false); } boolean running = previousBundle.getBoolean(BUNDLE_BOOLEAN_RUNNING); diff --git a/app/src/main/java/be/ppareit/swiftp/locale/SettingsBundleHelper.java b/app/src/main/java/be/ppareit/swiftp/locale/SettingsBundleHelper.java index ef5e63d6..4ea104ee 100644 --- a/app/src/main/java/be/ppareit/swiftp/locale/SettingsBundleHelper.java +++ b/app/src/main/java/be/ppareit/swiftp/locale/SettingsBundleHelper.java @@ -20,12 +20,13 @@ import android.content.Context; import android.os.Bundle; +import android.util.Log; + import androidx.annotation.NonNull; import com.twofortyfouram.assertion.BundleAssertions; import com.twofortyfouram.spackle.AppBuildInfo; -import net.vrallev.android.cat.Cat; public final class SettingsBundleHelper { @@ -41,7 +42,7 @@ static public boolean isBundleValid(Bundle bundle) { BundleAssertions.assertHasBoolean(bundle, BUNDLE_BOOLEAN_RUNNING); BundleAssertions.assertHasInt(bundle, BUNDLE_VERSION_CODE); } catch (AssertionError e) { - Cat.e("Bundle failed verification"); + Log.e("swiftp","Bundle failed verification"); return false; } return true; diff --git a/app/src/main/java/be/ppareit/swiftp/server/CmdAbstractStore.java b/app/src/main/java/be/ppareit/swiftp/server/CmdAbstractStore.java index 8ced03eb..9f3a2935 100644 --- a/app/src/main/java/be/ppareit/swiftp/server/CmdAbstractStore.java +++ b/app/src/main/java/be/ppareit/swiftp/server/CmdAbstractStore.java @@ -26,7 +26,6 @@ import android.util.Log; -import net.vrallev.android.cat.Cat; import java.io.File; import java.io.FileNotFoundException; @@ -44,7 +43,7 @@ public CmdAbstractStore(SessionThread sessionThread, String input) { } public void doStorOrAppe(String param, boolean append) { - Cat.d("STOR/APPE executing with append = " + append); + Log.d("swiftp","STOR/APPE executing with append = " + append); File storeFile = inputPathToChrootedFile(sessionThread.getChrootDir(), sessionThread.getWorkingDir(), param); @@ -104,7 +103,7 @@ public void doStorOrAppe(String param, boolean append) { } } catch (FileNotFoundException e) { - Cat.e("error : ", e); + Log.e("swiftp","error : ", e); try { errString = "451 Couldn't open file \"" + param + "\" aka \"" + storeFile.getCanonicalPath() + "\" for writing\r\n"; @@ -120,18 +119,18 @@ public void doStorOrAppe(String param, boolean append) { errString = "425 Couldn't open data socket\r\n"; break storing; } - Cat.d("Data socket ready"); + Log.d("swiftp","Data socket ready"); sessionThread.writeString("150 Data socket ready\r\n"); byte[] buffer = new byte[SessionThread.DATA_CHUNK_SIZE]; int numRead; - Cat.d("Mode is " + (sessionThread.isBinaryMode() ? "binary" : "ascii")); + Log.d("swiftp","Mode is " + (sessionThread.isBinaryMode() ? "binary" : "ascii")); while (true) { switch (numRead = sessionThread.receiveFromDataSocket(buffer)) { case -1: - Cat.d("Returned from final read"); + Log.d("swiftp","Returned from final read"); // We're finished reading break storing; case 0: @@ -162,7 +161,7 @@ public void doStorOrAppe(String param, boolean append) { } } catch (IOException e) { errString = "451 File IO problem. Device might be full.\r\n"; - Cat.d("Exception while storing: " + e); + Log.d("swiftp","Exception while storing: " + e); break storing; } break; @@ -177,7 +176,7 @@ public void doStorOrAppe(String param, boolean append) { } if (errString != null) { - Cat.i("STOR error: " + errString.trim()); + Log.i("swiftp","STOR error: " + errString.trim()); sessionThread.writeString(errString); } else { sessionThread.writeString("226 Transmission complete\r\n"); @@ -186,6 +185,6 @@ public void doStorOrAppe(String param, boolean append) { MediaUpdater.notifyFileCreated(storeFile.getPath()); } sessionThread.closeDataSocket(); - Cat.d("STOR finished"); + Log.d("swiftp","STOR finished"); } } diff --git a/app/src/main/java/be/ppareit/swiftp/server/CmdHASH.java b/app/src/main/java/be/ppareit/swiftp/server/CmdHASH.java index d7695b88..83daa109 100644 --- a/app/src/main/java/be/ppareit/swiftp/server/CmdHASH.java +++ b/app/src/main/java/be/ppareit/swiftp/server/CmdHASH.java @@ -2,7 +2,6 @@ import android.util.Log; -import net.vrallev.android.cat.Cat; import java.io.File; import java.io.FileInputStream; @@ -27,7 +26,7 @@ public CmdHASH(SessionThread sessionThread, String input) { @Override public void run() { - Cat.d("HASH executing"); + Log.d("swiftp","HASH executing"); String param = getParameter(input); File fileToHash; String errString = null; @@ -39,15 +38,15 @@ public void run() { errString = "550 Invalid name or chroot violation\r\n"; break mainblock; } else if (fileToHash.isDirectory()) { - Cat.d("Ignoring HASH for directory"); + Log.d("swiftp","Ignoring HASH for directory"); errString = "553 Can't HASH a directory\r\n"; break mainblock; } else if (!fileToHash.exists()) { - Cat.d("Can't HASH nonexistent file: " + fileToHash.getAbsolutePath()); + Log.d("swiftp","Can't HASH nonexistent file: " + fileToHash.getAbsolutePath()); errString = "550 File does not exist\r\n"; break mainblock; } else if (!fileToHash.canRead()) { - Cat.i("Failed HASH permission (canRead() is false)"); + Log.i("swiftp","Failed HASH permission (canRead() is false)"); errString = "556 No read permissions\r\n"; break mainblock; } @@ -111,6 +110,6 @@ public void run() { if (errString != null) { sessionThread.writeString(errString); } - Cat.d("HASH done"); + Log.d("swiftp","HASH done"); } } diff --git a/app/src/main/java/be/ppareit/swiftp/server/CmdLIST.java b/app/src/main/java/be/ppareit/swiftp/server/CmdLIST.java index c54ac7bd..038a0061 100644 --- a/app/src/main/java/be/ppareit/swiftp/server/CmdLIST.java +++ b/app/src/main/java/be/ppareit/swiftp/server/CmdLIST.java @@ -33,7 +33,6 @@ import android.util.Log; -import net.vrallev.android.cat.Cat; public class CmdLIST extends CmdAbstractListing implements Runnable { @@ -52,10 +51,10 @@ public void run() { mainblock: { String param = getParameter(input); - Cat.d("LIST parameter: " + param); + Log.d("swiftp","LIST parameter: " + param); while (param.startsWith("-")) { // Skip all dashed -args, if present - Cat.d("LIST is skipping dashed arg " + param); + Log.d("swiftp","LIST is skipping dashed arg " + param); param = getParameter(param); } File fileToList = null; @@ -95,9 +94,9 @@ public void run() { if (errString != null) { sessionThread.writeString(errString); - Cat.d("LIST failed with: " + errString); + Log.d("swiftp","LIST failed with: " + errString); } else { - Cat.d("LIST completed OK"); + Log.d("swiftp","LIST completed OK"); } // The success or error response over the control connection will // have already been handled by sendListing, so we can just quit now. @@ -110,7 +109,7 @@ protected String makeLsString(File file) { StringBuilder response = new StringBuilder(); if (!file.exists()) { - Cat.i("makeLsString had nonexistent file"); + Log.i("swiftp","makeLsString had nonexistent file"); return null; } @@ -121,7 +120,7 @@ protected String makeLsString(File file) { String lastNamePart = file.getName(); // Many clients can't handle files containing these symbols if (lastNamePart.contains("*") || lastNamePart.contains("/")) { - Cat.i("Filename omitted due to disallowed character"); + Log.i("swiftp","Filename omitted due to disallowed character"); return null; } else { // The following line generates many calls in large directories diff --git a/app/src/main/java/be/ppareit/swiftp/server/CmdMFMT.java b/app/src/main/java/be/ppareit/swiftp/server/CmdMFMT.java index b8753505..3ad2d011 100644 --- a/app/src/main/java/be/ppareit/swiftp/server/CmdMFMT.java +++ b/app/src/main/java/be/ppareit/swiftp/server/CmdMFMT.java @@ -30,7 +30,6 @@ import android.util.Log; -import net.vrallev.android.cat.Cat; /** * CmdMFMT implements File Modification Time. See draft-somers-ftp-mfxx-04 in documentation. @@ -46,14 +45,14 @@ public CmdMFMT(SessionThread sessionThread, String input) { @Override public void run() { - Cat.d("run: MFMT executing, input: " + mInput); + Log.d("swiftp","run: MFMT executing, input: " + mInput); //Syntax: "MFMT" SP time-val SP pathname CRLF String parameter = getParameter(mInput); int splitPosition = parameter.indexOf(' '); if (splitPosition == -1) { sessionThread.writeString("500 wrong number of parameters\r\n"); - Cat.d("run: MFMT failed, wrong number of parameters"); + Log.d("swiftp","run: MFMT failed, wrong number of parameters"); return; } @@ -70,7 +69,7 @@ public void run() { timeVal = Util.parseDate(timeString); } catch (ParseException e) { sessionThread.writeString("501 unable to parse parameter time-val\r\n"); - Cat.d("run: MFMT failed, unable to parse parameter time-val"); + Log.d("swiftp","run: MFMT failed, unable to parse parameter time-val"); return; } @@ -79,14 +78,14 @@ public void run() { if (!file.exists()) { sessionThread.writeString("550 file does not exist on server\r\n"); - Cat.d("run: MFMT failed, file does not exist"); + Log.d("swiftp","run: MFMT failed, file does not exist"); return; } boolean success = file.setLastModified(timeVal.getTime()); if (!success) { sessionThread.writeString("500 unable to modify last modification time\r\n"); - Cat.d("run: MFMT failed, unable to modify last modification time"); + Log.d("swiftp","run: MFMT failed, unable to modify last modification time"); // more info at https://code.google.com/p/android/issues/detail?id=18624 return; } @@ -96,7 +95,7 @@ public void run() { + file.getAbsolutePath() + "\r\n"; sessionThread.writeString(response); - Cat.d("run: MFMT completed successful"); + Log.d("swiftp","run: MFMT completed successful"); } } diff --git a/app/src/main/java/be/ppareit/swiftp/server/CmdRANG.java b/app/src/main/java/be/ppareit/swiftp/server/CmdRANG.java index 7869aa8d..10bad13b 100644 --- a/app/src/main/java/be/ppareit/swiftp/server/CmdRANG.java +++ b/app/src/main/java/be/ppareit/swiftp/server/CmdRANG.java @@ -1,7 +1,7 @@ package be.ppareit.swiftp.server; -import net.vrallev.android.cat.Cat; +import android.util.Log; /** * CmdRANG add's a RANG command to be used by clients to designate an octet range to a @@ -18,7 +18,7 @@ public CmdRANG(SessionThread sessionThread, String input) { @Override public void run() { - Cat.d("RANG executing"); + Log.d("swiftp","RANG executing"); String param = getParameter(input); String splits[] = param.split(" "); String errString = null; diff --git a/app/src/main/java/be/ppareit/swiftp/server/CmdREST.java b/app/src/main/java/be/ppareit/swiftp/server/CmdREST.java index 99a1adf3..75bd6b99 100644 --- a/app/src/main/java/be/ppareit/swiftp/server/CmdREST.java +++ b/app/src/main/java/be/ppareit/swiftp/server/CmdREST.java @@ -17,7 +17,8 @@ package be.ppareit.swiftp.server; -import net.vrallev.android.cat.Cat; + +import android.util.Log; public class CmdREST extends FtpCmd implements Runnable { protected String input; @@ -41,7 +42,7 @@ public void run() { sessionThread.writeString("550 Restart position must be non-negative\r\n"); return; } - Cat.d("run REST with offset " + offset); + Log.d("swiftp","run REST with offset " + offset); if (sessionThread.isBinaryMode()) { sessionThread.offset = offset; sessionThread.writeString("350 Restart position accepted (" + offset + ")\r\n"); diff --git a/app/src/main/java/be/ppareit/swiftp/server/CmdRETR.java b/app/src/main/java/be/ppareit/swiftp/server/CmdRETR.java index b5f35b27..0f460781 100644 --- a/app/src/main/java/be/ppareit/swiftp/server/CmdRETR.java +++ b/app/src/main/java/be/ppareit/swiftp/server/CmdRETR.java @@ -21,7 +21,6 @@ import android.util.Log; -import net.vrallev.android.cat.Cat; import java.io.File; import java.io.FileInputStream; @@ -39,7 +38,7 @@ public CmdRETR(SessionThread sessionThread, String input) { @Override public void run() { - Cat.d("RETR executing"); + Log.d("swiftp","RETR executing"); String param = getParameter(input); File fileToRetr; String errString = null; @@ -51,15 +50,15 @@ public void run() { errString = "550 Invalid name or chroot violation\r\n"; break mainblock; } else if (fileToRetr.isDirectory()) { - Cat.d("Ignoring RETR for directory"); + Log.d("swiftp","Ignoring RETR for directory"); errString = "550 Can't RETR a directory\r\n"; break mainblock; } else if (!fileToRetr.exists()) { - Cat.d("Can't RETR nonexistent file: " + fileToRetr.getAbsolutePath()); + Log.d("swiftp","Can't RETR nonexistent file: " + fileToRetr.getAbsolutePath()); errString = "550 File does not exist\r\n"; break mainblock; } else if (!fileToRetr.canRead()) { - Cat.i("Failed RETR permission (canRead() is false)"); + Log.i("swiftp","Failed RETR permission (canRead() is false)"); errString = "550 No read permissions\r\n"; break mainblock; } @@ -70,15 +69,15 @@ public void run() { byte[] buffer = new byte[SessionThread.DATA_CHUNK_SIZE]; int bytesRead; if (sessionThread.openDataSocket()) { - Cat.d("RETR opened data socket"); + Log.d("swiftp","RETR opened data socket"); } else { errString = "425 Error opening socket\r\n"; - Cat.i("Error in initDataSocket()"); + Log.i("swiftp","Error in initDataSocket()"); break mainblock; } sessionThread.writeString("150 Sending file\r\n"); if (sessionThread.isBinaryMode()) { // RANG is supported only in binary mode. - Cat.d("Transferring in binary mode"); + Log.d("swiftp","Transferring in binary mode"); long offset = 0L; long endPosition = fileToRetr.length() - 1; if (sessionThread.offset >= 0) { @@ -102,15 +101,15 @@ public void run() { if (!success) { errString = "426 Data socket error\r\n"; - Cat.i("Data socket error"); + Log.i("swiftp","Data socket error"); break mainblock; } } } else { // We're in ASCII mode - Cat.d("Transferring in ASCII mode"); + Log.d("swiftp","Transferring in ASCII mode"); if (sessionThread.offset >= 0) { errString = "550 Unable to seek to requested position in ASCII mode"; - Cat.e("Error: " + errString); + Log.e("swiftp","Error: " + errString); break mainblock; } // We have to convert all solitary \n to \r\n @@ -169,6 +168,6 @@ public void run() { } else { sessionThread.writeString("226 Transmission finished\r\n"); } - Cat.d("RETR done"); + Log.d("swiftp","RETR done"); } } diff --git a/app/src/main/java/be/ppareit/swiftp/server/CmdRNFR.java b/app/src/main/java/be/ppareit/swiftp/server/CmdRNFR.java index 09a6d236..0af69cbb 100644 --- a/app/src/main/java/be/ppareit/swiftp/server/CmdRNFR.java +++ b/app/src/main/java/be/ppareit/swiftp/server/CmdRNFR.java @@ -23,7 +23,6 @@ import android.util.Log; -import net.vrallev.android.cat.Cat; /** * CmdRNFR implements RENAME FROM (RNFR) @@ -42,7 +41,7 @@ public CmdRNFR(SessionThread sessionThread, String input) { @Override public void run() { - Cat.d("Executing RNFR"); + Log.d("swiftp","Executing RNFR"); String param = getParameter(input); String errString = null; File file = null; @@ -59,7 +58,7 @@ public void run() { } if (errString != null) { sessionThread.writeString(errString); - Cat.d("RNFR failed: " + errString.trim()); + Log.d("swiftp","RNFR failed: " + errString.trim()); sessionThread.setRenameFrom(null); } else { sessionThread.writeString("350 Filename noted, now send RNTO\r\n"); diff --git a/app/src/main/java/be/ppareit/swiftp/server/CmdRNTO.java b/app/src/main/java/be/ppareit/swiftp/server/CmdRNTO.java index 136a04fd..a6104b73 100644 --- a/app/src/main/java/be/ppareit/swiftp/server/CmdRNTO.java +++ b/app/src/main/java/be/ppareit/swiftp/server/CmdRNTO.java @@ -25,7 +25,6 @@ import android.os.Build; import android.util.Log; -import net.vrallev.android.cat.Cat; import be.ppareit.swiftp.App; import be.ppareit.swiftp.utils.FileUtil; @@ -48,14 +47,14 @@ public CmdRNTO(SessionThread sessionThread, String input) { @Override public void run() { - Cat.d("RNTO executing"); + Log.d("swiftp","RNTO executing"); String param = getParameter(input); String errString = null; File toFile = null; mainblock: { toFile = inputPathToChrootedFile(sessionThread.getChrootDir(), sessionThread.getWorkingDir(), param); - Cat.i("RNTO to file: " + toFile.getPath()); + Log.i("swiftp","RNTO to file: " + toFile.getPath()); if (violatesChroot(toFile)) { errString = "550 Invalid name or chroot violation\r\n"; break mainblock; @@ -65,7 +64,7 @@ public void run() { errString = "550 Rename error, maybe RNFR not sent\r\n"; break mainblock; } - Cat.i("RNTO from file: " + fromFile.getPath()); + Log.i("swiftp","RNTO from file: " + fromFile.getPath()); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { // TODO: this code is working around a bug that java6 and before cannot @@ -105,11 +104,11 @@ public void run() { } if (errString != null) { sessionThread.writeString(errString); - Cat.i("RNFR failed: " + errString.trim()); + Log.i("swiftp","RNFR failed: " + errString.trim()); } else { sessionThread.writeString("250 rename successful\r\n"); } sessionThread.setRenameFrom(null); - Cat.d("RNTO finished"); + Log.d("swiftp","RNTO finished"); } } diff --git a/app/src/main/java/be/ppareit/swiftp/server/SessionThread.java b/app/src/main/java/be/ppareit/swiftp/server/SessionThread.java index 7a485ff8..3914c1f0 100644 --- a/app/src/main/java/be/ppareit/swiftp/server/SessionThread.java +++ b/app/src/main/java/be/ppareit/swiftp/server/SessionThread.java @@ -19,7 +19,8 @@ package be.ppareit.swiftp.server; -import net.vrallev.android.cat.Cat; + +import android.util.Log; import java.io.BufferedReader; import java.io.File; @@ -78,10 +79,10 @@ public SessionThread(Socket socket, LocalDataSocket dataSocket) { public boolean sendViaDataSocket(String string) { try { byte[] bytes = string.getBytes(encoding); - Cat.d("Using data connection encoding: " + encoding); + Log.d("swiftp","Using data connection encoding: " + encoding); return sendViaDataSocket(bytes, 0, bytes.length); } catch (UnsupportedEncodingException e) { - Cat.e("Unsupported encoding for data socket send"); + Log.e("swiftp","Unsupported encoding for data socket send"); return false; } } @@ -97,7 +98,7 @@ public boolean sendViaDataSocket(String string) { public boolean sendViaDataSocket(byte[] bytes, int start, int len) { if (dataOutputStream == null) { - Cat.i("Can't send via null dataOutputStream"); + Log.i("swiftp","Can't send via null dataOutputStream"); return false; } if (len == 0) { @@ -106,7 +107,7 @@ public boolean sendViaDataSocket(byte[] bytes, int start, int len) { try { dataOutputStream.write(bytes, start, len); } catch (IOException e) { - Cat.e("Couldn't write output stream for data socket, error:" + e.toString()); + Log.e("swiftp","Couldn't write output stream for data socket, error:" + e.toString()); return false; } localDataSocket.reportTraffic(len); @@ -128,11 +129,11 @@ public int receiveFromDataSocket(byte[] buf) { int bytesRead; if (dataSocket == null) { - Cat.i("Can't receive from null dataSocket"); + Log.i("swiftp","Can't receive from null dataSocket"); return -2; } if (!dataSocket.isConnected()) { - Cat.i("Can't receive from unconnected socket"); + Log.i("swiftp","Can't receive from unconnected socket"); return -2; } @@ -141,7 +142,7 @@ public int receiveFromDataSocket(byte[] buf) { bytesRead = dataInputStream.read(buf, 0, buf.length); } while (bytesRead == 0); } catch (IOException e) { - Cat.i("Error reading data socket"); + Log.i("swiftp","Error reading data socket"); return 0; } return bytesRead; @@ -184,14 +185,14 @@ public boolean openDataSocket() { try { dataSocket = localDataSocket.onTransfer(); if (dataSocket == null) { - Cat.i("dataSocketFactory.onTransfer() returned null"); + Log.i("swiftp","dataSocketFactory.onTransfer() returned null"); return false; } dataInputStream = dataSocket.getInputStream(); dataOutputStream = dataSocket.getOutputStream(); return true; } catch (IOException e) { - Cat.i("IOException getting OutputStream for data socket"); + Log.i("swiftp","IOException getting OutputStream for data socket"); dataSocket = null; return false; } @@ -201,7 +202,7 @@ public boolean openDataSocket() { * Call when done doing IO over the data socket */ public void closeDataSocket() { - Cat.d("Closing data socket"); + Log.d("swiftp","Closing data socket"); if (dataInputStream != null) { try { dataInputStream.close(); @@ -226,13 +227,13 @@ public void closeDataSocket() { } public void quit() { - Cat.d("SessionThread told to quit"); + Log.d("swiftp","SessionThread told to quit"); closeSocket(); } @Override public void run() { - Cat.i("SessionThread started"); + Log.i("swiftp","SessionThread started"); // Give client a welcome if (sendWelcomeBanner) { writeString("220 SwiFTP " + App.getVersion() + " ready\r\n"); @@ -245,15 +246,15 @@ public void run() { String line; line = in.readLine(); // will accept \r\n or \n for terminator if (line != null) { - Cat.d("Received line from client: " + line); + Log.d("swiftp","Received line from client: " + line); FtpCmd.dispatchCommand(this, line); } else { - Cat.i("readLine gave null, quitting"); + Log.i("swiftp","readLine gave null, quitting"); break; } } } catch (IOException e) { - Cat.i("Connection was dropped"); + Log.i("swiftp","Connection was dropped"); } closeSocket(); } @@ -275,7 +276,7 @@ public void writeBytes(byte[] bytes) { outputStream.flush(); localDataSocket.reportTraffic(bytes.length); } catch (IOException e) { - Cat.i("Exception writing socket"); + Log.i("swiftp","Exception writing socket"); closeSocket(); } } @@ -285,7 +286,7 @@ public void writeString(String str) { try { strBytes = str.getBytes(encoding); } catch (UnsupportedEncodingException e) { - Cat.e("Unsupported encoding: " + encoding); + Log.e("swiftp","Unsupported encoding: " + encoding); strBytes = str.getBytes(); } writeBytes(strBytes); @@ -342,13 +343,13 @@ public boolean isUserLoggedIn() { public void authAttempt(boolean authenticated) { if (authenticated) { - Cat.i("Authentication complete"); + Log.i("swiftp","Authentication complete"); userAuthenticated = true; } else { authFails++; - Cat.i("Auth failed: " + authFails + "/" + MAX_AUTH_FAILS); + Log.i("swiftp","Auth failed: " + authFails + "/" + MAX_AUTH_FAILS); if (authFails > MAX_AUTH_FAILS) { - Cat.i("Too many auth fails, quitting session"); + Log.i("swiftp","Too many auth fails, quitting session"); quit(); } } @@ -362,7 +363,7 @@ public void setWorkingDir(File workingDir) { try { this.workingDir = workingDir.getCanonicalFile().getAbsoluteFile(); } catch (IOException e) { - Cat.i("SessionThread canonical error"); + Log.i("swiftp","SessionThread canonical error"); } }