From 81719a2581f64f43bbc07b241b977cda3eaa5322 Mon Sep 17 00:00:00 2001 From: LeisureLadi <33247104+LeisureLadi@users.noreply.github.com> Date: Sun, 18 Jul 2021 18:21:31 +0200 Subject: [PATCH 1/6] Add files via upload Password capability added to plug-in. If none required simply leave it empty. Use this plug-in only, if you had enough of flashing stupid temporary sketches without password, just to upload the file system and then flash again the final sketch. The dialog box will show up every time, even there is no password required (sorry, can't be avoided without modifying too much). --- src/ESP8266LittleFS.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/ESP8266LittleFS.java b/src/ESP8266LittleFS.java index 70a2001..2bd6302 100644 --- a/src/ESP8266LittleFS.java +++ b/src/ESP8266LittleFS.java @@ -6,6 +6,7 @@ Original copyright (c) 2015 Hristo Gochkov (ficeto at ficeto dot com) Modified from SPIFFS to LittleFS by Earle F. Philhower, III + Modified for OTA password by Ladi Kehl This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -320,7 +321,17 @@ private void createAndUpload(){ if(isNetwork){ System.out.println("[LittleFS] IP : "+serialPort); System.out.println(); - sysExec(new String[]{pythonCmd, espota.getAbsolutePath(), "-i", serialPort, "-s", "-f", imagePath}); + + // ask for a password + String passCode = JOptionPane.showInputDialog(editor, "Please enter password:\n(leave empty if none required!)","ESP8266LittleFS OTA Update", JOptionPane.QUESTION_MESSAGE); + if(passCode != null) { + if(passCode.isEmpty()) { + sysExec(new String[]{pythonCmd, espota.getAbsolutePath(), "-i", serialPort, "-s", "-f", imagePath}); + } else { + sysExec(new String[]{pythonCmd, espota.getAbsolutePath(), "-i", serialPort, "-s", "-f", imagePath, "-a", passCode}); + } + } + } else { System.out.println("[LittleFS] address : "+uploadAddress); System.out.println("[LittleFS] reset : "+resetMethod); From 58917c5516fca99b18ba3c16f40ed4cdb26652cc Mon Sep 17 00:00:00 2001 From: LeisureLadi <33247104+LeisureLadi@users.noreply.github.com> Date: Sun, 18 Jul 2021 18:33:01 +0200 Subject: [PATCH 2/6] Added password dialog box If a password is required to upload LittleFS via OTA, it can be entered now. Downside is, that the dialog box shows up every time. Simply leave it empty, if no password is required. In case you don't like this "extra" effort, don't use this plug-in. From 02a5a925b480923789be00acf819ad4cc5370054 Mon Sep 17 00:00:00 2001 From: LeisureLadi <33247104+LeisureLadi@users.noreply.github.com> Date: Sun, 18 Jul 2021 18:40:57 +0200 Subject: [PATCH 3/6] Password Dialog Box added For ESP8266 OTA upload of LittleFS --- esp8266littlefs.jar | Bin 0 -> 6943 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 esp8266littlefs.jar diff --git a/esp8266littlefs.jar b/esp8266littlefs.jar new file mode 100644 index 0000000000000000000000000000000000000000..363f5273d574282e8facd34393e90705cbbc7d3c GIT binary patch literal 6943 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 K7)a2c)qer4+LC1e literal 0 HcmV?d00001 From 4d8a2ae1c0b27834c9a4cbe5aebd796acd5a0f7d Mon Sep 17 00:00:00 2001 From: LeisureLadi <33247104+LeisureLadi@users.noreply.github.com> Date: Sun, 18 Jul 2021 18:42:07 +0200 Subject: [PATCH 4/6] Windows Batch File to compile ESP8266LittleFS.java --- makeLittleFS.bat | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 makeLittleFS.bat diff --git a/makeLittleFS.bat b/makeLittleFS.bat new file mode 100644 index 0000000..0447df8 --- /dev/null +++ b/makeLittleFS.bat @@ -0,0 +1,46 @@ +ECHO off + +REM set pde_path=C:/temp/JavaTrials/Arduino-master/build/windows/work/lib/pde.jar +REM set pde_path=C:/temp/JavaTrials/Arduino-master/app/pde.jar +set pde_path=D:/Program Files (x86)/Arduino/lib/pde.jar + +REM set core_path=C:/temp/JavaTrials/Arduino-master/build/windows/work/lib/arduino-core.jar +REM set core_path=C:/temp/JavaTrials/Arduino-master/arduino-core/arduino-core.jar +set core_path=D:/Program Files (x86)/Arduino/lib/arduino-core.jar +REM set lib_path=C:/temp/JavaTrials/Arduino-master/build/windows/work/lib/commons-codec-1.7.jar +REM set lib_path=C:/temp/JavaTrials/Arduino-master/app/lib/commons-codec-1.7.jar +REM set lib_path=C:/temp/JavaTrials/Arduino-master/arduino-core/lib/commons-codec-1.7.jar +set lib_path=D:/Program Files (x86)/Arduino/lib/commons-codec-1.7.jar + +echo pde_path: %pde_path% +echo core_path: %core_path% +echo lib_path: %lib_path% + +mkdir bin + +ECHO on +javac -target 1.8 -source 1.8 -cp "%pde_path%;%core_path%;%lib_path%" -d bin src/ESP8266LittleFS.java +ECHO off + +mkdir tools +mkdir tools\ESP8266LittleFS +mkdir tools\ESP8266LittleFS\tool +erase tools\ESP8266LittleFS\tool\esp8266littlefs.jar + +cd bin + +jar cfveM ..\tools\ESP8266LittleFS\tool\esp8266littlefs.jar -C com\esp8266\mklittlefs ESP8266LittleFS.class ESP8266LittleFS$1.class ESP8266LittleFS$2.class + +cd .. + +exit /B + +REM popd + +REM dist=$PWD/dist +REM rev=$(git describe --tags) +REM mkdir -p $dist +REM pushd $INSTALLDIR/tools +REM rm -f $dist/*.zip +REM zip -r $dist/ESP8266LittleFS-$rev.zip ESP8266LittleFS/ +REM popd From 677e33f9b7e619c6eb5a0b0a261223af24be0c66 Mon Sep 17 00:00:00 2001 From: LeisureLadi <33247104+LeisureLadi@users.noreply.github.com> Date: Sun, 18 Jul 2021 19:04:57 +0200 Subject: [PATCH 5/6] Added Password Dialog Box --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 9e96c09..940714c 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,8 @@ On the OS X create the tools directory in ~/Documents/Arduino/ and unpack the fi ![Screenshot](screenshot.png) +![DialogBox](PasswordDialogBox.png) + ## Credits and license - Copyright (c) 2015 Hristo Gochkov (ficeto at ficeto dot com) From 65d28b2c4fd5ad484b158b717cb1b366693ac07b Mon Sep 17 00:00:00 2001 From: LeisureLadi <33247104+LeisureLadi@users.noreply.github.com> Date: Sun, 18 Jul 2021 19:13:00 +0200 Subject: [PATCH 6/6] Added Password Dialog Box --- PasswordDialogBox.png | Bin 0 -> 5802 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 PasswordDialogBox.png diff --git a/PasswordDialogBox.png b/PasswordDialogBox.png new file mode 100644 index 0000000000000000000000000000000000000000..9cc2d874859780e955f18cecb4f2cb662eb278c9 GIT binary patch literal 5802 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 MRj5j(k_G(V02dA@r~m)} literal 0 HcmV?d00001