From 50575d9edb5d7e7fa4bafc7433b416d3ff29319d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= Date: Fri, 2 Feb 2007 06:29:42 +0000 Subject: [PATCH] An old tool of mine that handles several url mime types, allowing to redirect urls to commands line tools. Currently supported are telnet:, ssh: and ftp:. Now you should be able to click telnet://towel.blinkenlights.nl on a webpage or in Vision :) TODO: Jamfile; handle ":port" in urls. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20037 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/bin/urlwrapper/makefile | 122 ++++++++++++++ src/bin/urlwrapper/urlwrapper-res.rdef | 37 +++++ src/bin/urlwrapper/urlwrapper-res.rsrc | Bin 0 -> 2960 bytes src/bin/urlwrapper/urlwrapper.cpp | 219 +++++++++++++++++++++++++ 4 files changed, 378 insertions(+) create mode 100644 src/bin/urlwrapper/makefile create mode 100644 src/bin/urlwrapper/urlwrapper-res.rdef create mode 100644 src/bin/urlwrapper/urlwrapper-res.rsrc create mode 100644 src/bin/urlwrapper/urlwrapper.cpp diff --git a/src/bin/urlwrapper/makefile b/src/bin/urlwrapper/makefile new file mode 100644 index 0000000000..47be6a2dad --- /dev/null +++ b/src/bin/urlwrapper/makefile @@ -0,0 +1,122 @@ +## BeOS Generic Makefile v2.2 ## + +## Fill in this file to specify the project being created, and the referenced +## makefile-engine will do all of the hard work for you. This handles both +## Intel and PowerPC builds of the BeOS. + +## Application Specific Settings --------------------------------------------- + +# specify the name of the binary +NAME= urlwrapper + +# specify the type of binary +# APP: Application +# SHARED: Shared library or add-on +# STATIC: Static library archive +# DRIVER: Kernel Driver +TYPE= APP + +# add support for new Pe and Eddie features +# to fill in generic makefile + +#%{ +# @src->@ + +# specify the source files to use +# full paths or paths relative to the makefile can be included +# all files, regardless of directory, will have their object +# files created in the common object directory. +# Note that this means this makefile will not work correctly +# if two source files with the same name (source.c or source.cpp) +# are included from different directories. Also note that spaces +# in folder names do not work well with this makefile. +SRCS= urlwrapper.cpp + +# specify the resource files to use +# full path or a relative path to the resource file can be used. +RSRCS= urlwrapper-res.rsrc + +#RDEFS= urlwrapper-res.rdef + +# @<-src@ +#%} + +# end support for Pe and Eddie + +# specify additional libraries to link against +# there are two acceptable forms of library specifications +# - if your library follows the naming pattern of: +# libXXX.so or libXXX.a you can simply specify XXX +# library: libbe.so entry: be +# +# - if your library does not follow the standard library +# naming scheme you need to specify the path to the library +# and it's name +# library: my_lib.a entry: my_lib.a or path/my_lib.a +LIBS= be + +# specify additional paths to directories following the standard +# libXXX.so or libXXX.a naming scheme. You can specify full paths +# or paths relative to the makefile. The paths included may not +# be recursive, so include all of the paths where libraries can +# be found. Directories where source files are found are +# automatically included. +LIBPATHS= + +# additional paths to look for system headers +# thes use the form: #include
+# source file directories are NOT auto-included here +SYSTEM_INCLUDE_PATHS = + +# additional paths to look for local headers +# thes use the form: #include "header" +# source file directories are automatically included +LOCAL_INCLUDE_PATHS = + +# specify the level of optimization that you desire +# NONE, SOME, FULL +OPTIMIZE= + +# specify any preprocessor symbols to be defined. The symbols will not +# have their values set automatically; you must supply the value (if any) +# to use. For example, setting DEFINES to "DEBUG=1" will cause the +# compiler option "-DDEBUG=1" to be used. Setting DEFINES to "DEBUG" +# would pass "-DDEBUG" on the compiler's command line. +DEFINES= + +# specify special warning levels +# if unspecified default warnings will be used +# NONE = supress all warnings +# ALL = enable all warnings +WARNINGS = + +# specify whether image symbols will be created +# so that stack crawls in the debugger are meaningful +# if TRUE symbols will be created +SYMBOLS = + +# specify debug settings +# if TRUE will allow application to be run from a source-level +# debugger. Note that this will disable all optimzation. +DEBUGGER = + +# specify additional compiler flags for all files +COMPILER_FLAGS = + +# specify additional linker flags +LINKER_FLAGS = + +# specify the version of this particular item +# (for example, -app 3 4 0 d 0 -short 340 -long "340 "`echo -n -e '\302\251'`"1999 GNU GPL") +# This may also be specified in a resource. +APP_VERSION = + +# (for TYPE == DRIVER only) Specify desired location of driver in the /dev +# hierarchy. Used by the driverinstall rule. E.g., DRIVER_PATH = video/usb will +# instruct the driverinstall rule to place a symlink to your driver's binary in +# ~/add-ons/kernel/drivers/dev/video/usb, so that your driver will appear at +# /dev/video/usb when loaded. Default is "misc". +DRIVER_PATH = + +## include the makefile-engine +include $(BUILDHOME)/etc/makefile-engine diff --git a/src/bin/urlwrapper/urlwrapper-res.rdef b/src/bin/urlwrapper/urlwrapper-res.rdef new file mode 100644 index 0000000000..7cb440c5ea --- /dev/null +++ b/src/bin/urlwrapper/urlwrapper-res.rdef @@ -0,0 +1,37 @@ + +resource(1, "BEOS:APP_SIG") #'MIMS' "application/x-vnd.mmu_man.telnetwrapper"; + +resource(1, "BEOS:FILE_TYPES") message +{ + "types" = "application/x-vnd.Be.URL.telnet", + "types" = "application/x-vnd.Be.URL.ssh", + "types" = "application/x-vnd.Be-URL.ftp" +}; + +resource(1, "BEOS:APP_VERSION") #'APPV' array +{ + $"0000000000000000010000000000000000000000000000000000000000000000" + $"0000000000000000000000000000000000000000000000000000000000000000" + $"0000000000000000000000000000000000000000000000000000000000000000" + $"0000000000000000000000000000000000000000000000000000000000000000" + $"0000000000000000000000000000000000000000000000000000000000000000" + $"0000000000000000000000000000000000000000000000000000000000000000" + $"0000000000000000000000000000000000000000000000000000000000000000" + $"0000000000000000000000000000000000000000000000000000000000000000" + $"0000000000000000000000000000000000000000000000000000000000000000" + $"0000000000000000000000000000000000000000000000000000000000000000" + $"0000000000000000000000000000000000000000000000000000000000000000" + $"0000000000000000000000000000000000000000000000000000000000000000" + $"0000000000000000000000000000000000000000000000000000000000000000" + $"0000000000000000000000000000000000000000000000000000000000000000" + $"0000000000000000000000000000000000000000000000000000000000000000" + $"0000000000000000000000000000000000000000000000000000000000000000" + $"0000000000000000000000000000000000000000000000000000000000000000" + $"0000000000000000000000000000000000000000000000000000000000000000" + $"0000000000000000000000000000000000000000000000000000000000000000" + $"0000000000000000000000000000000000000000000000000000000000000000" + $"0000000000000000000000000000000000000000000000000000000000000000" + $"0000000000000000" +}; + +resource(1, "BEOS:APP_FLAGS") #'APPF' $"04000000"; diff --git a/src/bin/urlwrapper/urlwrapper-res.rsrc b/src/bin/urlwrapper/urlwrapper-res.rsrc new file mode 100644 index 0000000000000000000000000000000000000000..3670908ee9cd3574556392eadd3751ed2409cc1b GIT binary patch literal 2960 zcmWFvW?*0t@ONPWQZ69O1|-M;AiWGgy)T&|W@Ioz*dXEmKmZb_1^Yc01H)XP!65V3 zurn}dK&)Z70%Yey+0Gmc3@ex*oYz40Aiu%@E!_sPW7K>|NRNiYXgG|ffzdQDng%FK z1BnF%Iho0cC7Jno`W3omc`16ixux;BiFtY@sX2M6CFMmx6{$rGhED!&z$!Q&RtGXN z2ZaPXGX=1gR2HNbD*zpVX_8Z_UTBaH)F7}kW$~#iF3tceLMDJ#j)Kt;7_=b(YWfBH zdisLWDG2j2IJx=<#0Pu2gIjB$63X2@7_0=;XcT}bar5+XjSq +#include +#include +#include +#include +#include +#include +#include +#include + +#define PROTO "telnet" + +class TWApp : public BApplication +{ +public: + TWApp(); + ~TWApp(); +status_t SplitUrlHostUserPass(const char *url, BString &host, BString &user, BString &pass); +virtual void ArgvReceived(int32 argc, char **argv); +virtual void ReadyToRun(void); +private: + +}; + +const char *app_mime = "application/x-vnd.mmu_man.telnetwrapper"; +//const char *url_mime = "application/x-vnd.Be.URL.telnet"; +const char *url_mime = B_URL_TELNET; +const char *terminal_sig = "application/x-vnd.Be-SHEL"; + +TWApp::TWApp() : BApplication(app_mime) +{ + BMimeType mt(url_mime); + if (mt.InitCheck()) + return; + if (!mt.IsInstalled()) { + mt.Install(); + } +#if 0 + BAppFileInfo afi; + if (!afi.Supports(&mt)) { + //printf("adding support for telnet url\n"); + BMessage typemsg; + typemsg.AddString("types", url_mime); + afi.SetSupportedTypes(&typemsg, true); + } +#endif +} + +TWApp::~TWApp() +{ +} + + +// XXX: handle ":port" as well +status_t TWApp::SplitUrlHostUserPass(const char *url, BString &host, BString &user, BString &pass) +{ + host = url; + if (host.FindFirst("@") > -1) { + printf("%s -- %s\n", host.String(), user.String()); + host.MoveInto(user, 0, host.FindFirst("@")); + host.Remove(0, 1); + if (user.FindFirst(":") > -1) { + user.MoveInto(pass, user.FindFirst(":"), user.Length()); + pass.Remove(0, 1); + return 3; + } + printf("%s -- %s\n", host.String(), user.String()); + return 2; + } + return 1; +} + +void TWApp::ArgvReceived(int32 argc, char **argv) +{ +#if 0 + for (int i = 1; i < argc; i++) { + //printf("argv[%d]=%s\n", i, argv[i]); + } +#endif + if (argc <= 1) + return; + + char *args[] = { "/bin/sh", "-c", NULL, NULL}; + + BString host; + BString user; + BString pass; + + BString url(argv[1]); + + // XXX: should factorize that + + if (url.FindFirst("telnet:") == 0) { + url.RemoveFirst("telnet:"); + if (url.FindFirst("//") == 0) + url.RemoveFirst("//"); + + + const char *failc = " || read -p 'Press any key'"; + BString cmd("telnet "); + SplitUrlHostUserPass(url.String(), host, user, pass); + printf("HOST='%s'\n", host.String()); + printf("USER='%s'\n", user.String()); + printf("PASS='%s'\n", pass.String()); + if (user.Length()) + cmd << "-l " << user << " "; + cmd << host; + printf("CMD='%s'\n", cmd.String()); + cmd << failc; + args[2] = (char *)cmd.String(); + be_roster->Launch(terminal_sig, 3, args); + return; + } + + if (url.FindFirst("ssh:") == 0) { + url.RemoveFirst("ssh:"); + if (url.FindFirst("//") == 0) + url.RemoveFirst("//"); + + + const char *failc = " || read -p 'Press any key'"; + BString cmd("ssh "); + + SplitUrlHostUserPass(url.String(), host, user, pass); + printf("HOST='%s'\n", host.String()); + printf("USER='%s'\n", user.String()); + printf("PASS='%s'\n", pass.String()); + if (user.Length()) + cmd << "-l " << user << " "; + cmd << host; + printf("CMD='%s'\n", cmd.String()); + cmd << failc; + args[2] = (char *)cmd.String(); + be_roster->Launch(terminal_sig, 3, args); + // XXX: handle errors + return; + } + + if (url.FindFirst("ftp:") == 0) { + url.RemoveFirst("ftp:"); + if (url.FindFirst("//") == 0) + url.RemoveFirst("//"); + + + const char *failc = " || read -p 'Press any key'"; + BString cmd("ftp "); + + /* + SplitUrlHostUserPass(url.String(), host, user, pass); + printf("HOST='%s'\n", host.String()); + printf("USER='%s'\n", user.String()); + printf("PASS='%s'\n", pass.String()); + if (user.Length()) + cmd << "-l " << user << " "; + cmd << host; + */ + cmd << url; + printf("CMD='%s'\n", cmd.String()); + cmd << failc; + args[2] = (char *)cmd.String(); + be_roster->Launch(terminal_sig, 3, args); + // XXX: handle errors + return; + } + + if (url.FindFirst("sftp:") == 0) { + url.RemoveFirst("sftp:"); + if (url.FindFirst("//") == 0) + url.RemoveFirst("//"); + + + const char *failc = " || read -p 'Press any key'"; + BString cmd("sftp "); + + /* + SplitUrlHostUserPass(url.String(), host, user, pass); + printf("HOST='%s'\n", host.String()); + printf("USER='%s'\n", user.String()); + printf("PASS='%s'\n", pass.String()); + if (user.Length()) + cmd << "-l " << user << " "; + cmd << host; + */ + cmd << url; + printf("CMD='%s'\n", cmd.String()); + cmd << failc; + args[2] = (char *)cmd.String(); + be_roster->Launch(terminal_sig, 3, args); + // XXX: handle errors + return; + } + + + // finger:user@host + // vnc: ? + // irc: ? + // + // file: -> Tracker ? + // svn: ? + // cvs: ? + // mms: -> VLC + // rtsp: -> VLC + // rtp: -> VLC + + +} + +void TWApp::ReadyToRun(void) +{ + Quit(); +} + +int main(int argc, char **argv) +{ + TWApp app; + if (be_app) + app.Run(); + return 0; +}