{"id":27004543,"url":"https://github.com/tacc/filemanager","last_synced_at":"2025-07-24T21:12:15.350Z","repository":{"id":5263237,"uuid":"6441633","full_name":"TACC/filemanager","owner":"TACC","description":"filemanager","archived":false,"fork":false,"pushed_at":"2014-05-15T20:33:48.000Z","size":50646,"stargazers_count":3,"open_issues_count":1,"forks_count":2,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-04-04T06:16:59.868Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"celiao/tmdbsimple","license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TACC.png","metadata":{"files":{"readme":"README.md","changelog":"history.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"security/certificates/01621954.0","support":null}},"created_at":"2012-10-29T14:17:07.000Z","updated_at":"2018-07-15T04:47:53.000Z","dependencies_parsed_at":"2022-09-12T06:02:01.689Z","dependency_job_id":null,"html_url":"https://github.com/TACC/filemanager","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/TACC/filemanager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TACC%2Ffilemanager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TACC%2Ffilemanager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TACC%2Ffilemanager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TACC%2Ffilemanager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TACC","download_url":"https://codeload.github.com/TACC/filemanager/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TACC%2Ffilemanager/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266904544,"owners_count":24004123,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-24T02:00:09.469Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-04-04T06:17:09.775Z","updated_at":"2025-07-24T21:12:15.300Z","avatar_url":"https://github.com/TACC.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Overview \n\nThe XSEDE File Manager (XFM) started out as a portlet adaptation of the SJTU GridFTP GUI Client(SGGC).\nThe SGGC is a Java desktop application providing graphical GridFTP access to resources.  It is currently \nlisted as a Globus Incubator project with downloads available http://dev.globus.org/wiki/Incubator/SGGC. \nAfter porting the project to an applet and several months of interal review, the original SGGC interface \nwas replaced with the current two panel approach resembling the FUGU (http://rsug.itd.umich.edu/software/fugu/) \nSFTP client.  The general feeling among the group was that a dual panel, drag-and-drop interface was much \nless imposing than a full blown desktop explorer clone.\n\nThe XFM manages the user's credential for them providing single sign on in the portal, then delegated \nauthentication to the remote machines.  The method for doing this is essentially the same as in the \nGSI-SSHTerm applet.  \"The portlet relies on the OGCE ProxyManager service for in-memory proxy credentials \nand passes these credentials to the applet in string form using the \"sshterm.gsscredential\" applet \nparameters.  So, as long as you can get a credential in string form you can use the applet in virtually \nany web setting.  The applet is also capable of contacting a MyPproxy server to retrieve a credential but \nfor the single sign-on purposes of the XSEDE User Portal it is more desirable to not require the user to\nauthenticate at all.\"\n\nSeveral other TGUP-specific features were added to the portlet as well. An XML-RPC sever was written to \nsupport the client applet and provide historical file logging and notifications.  When files transfers are initiated in the client, the transfer is recorded in the middleware and tracked to completion.  At the end\nof the transfer, the user is optionally notified in their preferred method of the event. The service utilizes\nthe javamail library, a remote SMTP server (Gmail), the TGCDB (PostgreSQL), MSN messenger API, and an email-\nto-text service (Teleflip.com) to deliver the notifications.\n\nFinally, the server provides a listing of TG resources to which the user has access automatically upon login.\nThe mechanism used by the service is similar to that of the Accounting portlet.  The 'portal.usage table' is queried in the TGCDB by the user's person_id.  This yields a list of resources that are then mapped to a \nknown list of valid hostnames and short names which is then displayed for the user.\n\n\n\u003cp style=\"border: thin solid red; padding: 3px;\"\u003eNOTE: the applet used in this portlet has some \nconfigurations that are specific to XSEDE (e.g. the default MyProxy server is the XSEDE MyProxy \nserver) so before using this applet in other projects you may want to speak to Jim Basney (NCSA), Rion \nDooley or Maytal Dahan (TACC) about reconfiguring the portlet.\u003c/p\u003e\n\n\n## The Server Code \n\nThe client and server code share a common source tree and build system.  The server runs in standalone \nmode out of the box on port 9001.  A couple common features have been included to make using the server a \nbit easier.  \n\n* Ant build system.\n  *  clean           Delete all build artifacts\n  *  compile         Compile/generate all client- and server-side content\n  *  deploy-eclipse  Deploy client to WEB-INF folder\n  *  dist            Bundle the client and deploy it in the web folder\n  *  gsissh          Test the gsissh env and find commands\n  *  jar             Create client/server jar\n  *  jarhelp         Jar up helpset files and copy to the build directory\n  *  run             Test the gsissh env and find commands\n  *  server          Compile/generate all client- and server-side content\n  *  junitreport     Run the junit tests on the server.\n* Rolling file logging provided by log4j.  Just add the \"SERVER\" keyword to the rootCategory declaration.\n* Configuration files: \n  * sggc.properties for definitions of supporting services and run time options.\n  * hibernate.cfg.xml to specify database connection. Currently there is not database init target for\nthe build system, but the sql file for creating the tables is in the etc folder.\n  * test.properties for running the junit tests on server api\n* Startup.sh and Shutdown scripts.sh\n\nTo run the server:\n\n1. Download the checkout from cvs.\n2. Edit the configuration file.  By default, the service has all the properties configured in cvs to \nrun out of the box using the TGCDB.\n3. At the command line, run 'startup.sh'.  This will build the service and start the server in a background \nservice.  \n4. Optional: to enable rolling output, edit the log4j.properties file, adding SERVER to the log4j.rootCategory declaration.\n\nTo stop the server:\n\n1. At the command line, run 'shutdown.sh'.\n\nTo test the services:\n\n1. Edit the 'test.configuration' file adding two valid dn's in the test.dn and test.baddn lines.\n2. At the command line, run 'ant junitreport'.\n3. View the results in the junit directory created during the test.\n\n\n## The Portlet Code\n\nThe client and server code share a common source tree and build system.  To build and deploy the client \nand all needed libraries to a folder that can be deployed to a web server for use:\n\n1. Download the checkout from cvs.\n1. Edit the build.xml file, changing the 'todir' property in the \"dist\" target to your deployment folder.\n1. At the command line, run 'ant dist'.  This will compile, bundle, sign, and deploy the client and an index.html file for you to run the client locally from your web browser.\n1. Point your web browser to the directory the client was just deployed in.\n1. The client will run a grid-proxy-init if no valid credentials are passed to it from the index.html file.\nTo avoid this, just copy a valid proxy file to the ~/tgup_filemanager/proxies folder on your computer.\nThe XFM will automatically discover it there.\n\n\u003cp style=\"border: thin solid red; padding: 3px;\"\u003eNOTE: the XFM is meant to be run as a client server \napplication.  In the event the TG instance of the server is down, you can run it locally and point the \nclient to it by editing src/org/XSEDE/portal/filemanager/applet/AppMain.java and changing the value \nof the 'HISTORY_SERVLET' variable to your server location.  If you don't do anything and no service is \nrunning, the XFM will simply prompt you to run in \"loner\" mode and get the resource listing from GPIR.  \nIt won't necessarily be an accurate list, but you should have several resources on there you can access.\u003c/p\u003e\n\n\n### Code Location\n\nThe code is currently standalone from the TG User Portal source tree and can be found in ''ROOT/tg-filemanagert''.\n\n\n### Action Class\n\nThe portlet action class, ''edu/tacc/portlets/FileManagerPortlet.java'', is very simple and really only \nthe ''doView'' method has any code.  This method uses the ''obtainUserCredential'' method of the \n''GridPortletUtil'' class from the ''gp-common.jar'' library to grab the proxy from the ProxyManager service.\nIt then converts the proxy to a ''GlobusGSSCredentialImpl'' object and calls the \n''GlobusGSSCredentialImpl.export(ExtendedGSSCredential.IMPEXP_OPAQUE)'' method to convert the proxy to a string.\n\n\n### Applet Declaration\n\nHere is how the applet is declared in the portlet:\n\n\n\t\u003capplet codebase=\"http://localhost/~dooley/XFMRedux/\" \n\t\tcode=\"com.sshtools.sshterm.SshTermApplet\" width=\"900\" height=\"700\" archive=\"activation.jar, axis.jar, commons-codec-1.3.jar, commons-discovery.jar, commons-httpclient-3.1.jar, gms-xstream-1.1.3.jar, GSI-SSHTerm-XSEDE.jar, jaxrpc.jar, jce-jdk13-120.jar, jdom.jar, jhall.jar, saaj.jar, tgfb.jar, ws-commons-util-1.0.2.jar, xmlrpc-client-3.1.jar, xmlrpc-common-3.1.jar\"\n\t\tstyle=\"border-style: solid; border-width: 1; padding-left: 4; padding-right: 4; padding-top: 1; padding-bottom: 1\"\u003e\n\t\u003cPARAM name=\"separate_jvm\" value=\"true\"\u003e\n\t\u003cPARAM name=\"cache_archive\" value=\"\"\u003e\n\t\u003cPARAM name=\"classloader_cache\" value=\"false\"\u003e\n\t\u003cPARAM name=\"filebrowser.gsscredential\" value=\"value=\"-----BEGIN CERTIFICATE-----\n\tMIICuzCCAaOgAwIBAgIDIDrDMA0GCSqGSIb3DQEBBQUAMGkxCzAJBgNVBAYTAlVT\n\tMTgwNgYDVQQKEy9OYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFw\n\tcGxpY2F0aW9uczEgMB4GA1UEAxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcN\n\tMDcwNTI5MjAxNjU3WhcNMDcwNTI5MjIyMTU3WjBeMQswCQYDVQQGEwJVUzE4MDYG\n\tA1UEChMvTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNh\n\tdGlvbnMxFTATBgNVBAMTDEVyaWMgUm9iZXJ0czBcMA0GCSqGSIb3DQEBAQUAA0sA\n\tMEgCQQCAAB/cmuxMri3kcpVr0/OVZrQQJ03An8ujHTlqrpGbU0nPYeCdD8c+P9ly\n\tR4YHVFHYWnIcDn4SJw17Kv+/5xaxAgMBAAGjPzA9MA4GA1UdDwEB/wQEAwIEsDAM\n\tBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQXX4Ovv7L9Wg9g7Q68diQdUxmy2TANBgkq\n\thkiG9w0BAQUFAAOCAQEAAcfdjUYZq30vhddT5iSZNvAl2eYnJ/gEQTqfGhFDyWqE\n\texqdUDkf2XJ3xMxCBJBTMO1cg//FrMM3LtiZiGBLd7Jmmzm8G2yMzDhZX8ZPPdG7\n\tJbZLmQtmSbAt4y9jtT5gFnx+0UKS9cnY5PxmP3Pl45wkLI6qqjogKNTZMzDvex6s\n\t0SNTSUQQhOnpl7PTxb9cpDnGOvy80oxzygC8m96MdmPxxd/dTsc4dmyuIhH+UEMH\n\tE0WTTPGLNvYq5s2O2RtI2BHExDdSiY7uQFQ/N2kpba/bYK/i8sT3po8SXTF1qBYQ\n\tW8Mlv+FSxCdwhREaRuf3Y8Lvf4c4zOFewE1WEPT/6g==\n\t-----END CERTIFICATE-----\n\t-----BEGIN RSA PRIVATE KEY-----\n\tMIIBOgIBAAJBAIAAH9ya7EyuLeRylWvT85VmtBAnTcCfy6MdOWqukZtTSc9h4J0P\n\txz4/2XJHhgdUUdhachwOfhInDXsq/7/nFrECAwEAAQJAf80gAujgRJOomK7biATg\n\t8WvRH0vO8yPZc+xq9pyEH1tjhVa/Rtac0xUrUZWi2gOU9LKt3xfExsyp/LPht1I0\n\tAQIhAP9TGKnGv9nOEaTki8GB9P2yfk5Zhl8UOG1dnr8CNixBAiEAgFbOKKwjZjUh\n\t6k2vi0MhwuNFO6cvsTwPsmBiwPMSDnECICD3i8GwJelrkB+oWts7enSfbWuUZ6Mz\n\tKy4D3pFvKauBAiBc+IVYSXtLa2oqRiTJCdTHTcS1tiOCjTQB0Hk5tdx6wQIhAMyg\n\ts20Jn53WZmkFeNyLVMf0CvUzgxX+enaYkD620yA/\n\t-----END RSA PRIVATE KEY-----\n\t\"/\u003e\n\t\u003c/applet\u003e\n\n\n\u003cp style=\"border: thin solid red; padding: 3px;\"\u003eNOTE: for this applet to run in harmony with the gsissh \nportlet, they must share idential codebase, archive, separate_jvm, classloader_cache, and cache_archive \ntags.  Without these being the same, the possibility of common classloader collisions increases dramatically \nand both portlets will be rendered useless for the majority of users...see more info below.\u003c/p\u003e\n\n### Applet Jars\n\nThe applet and server are bundled with their dependent libraries in descriptive directories within the \n'lib' folder.\n\n- lib\n  - client: client only libraries.  these are not needed by the server and not in it's classpath\n  - common: libraries shared between the client and server.  the client, help and server directory \ncontents are in the archive listing of the applet.\n  - ext: bundled gsisshterm app and dependent libraries. distributed with client.\n  - help: java help library\n  - server: server only libraries\n\n\nOne important note is that the developers at NCSA who provided the GSI-SSHTerm library worked around \nmany of their dependency issues by redeploying all of their application's dependent jar class files in \ntheir main GSI-SSHTerm-XSEDE.jar library.  This is generally not a problem unless you're running \nother applets that rely on the same classes.  The Java security model does not allow applets to share \naccess to previously loaded classes.  Thus if one person starts up a grid enabled app then another person \nstarts one up in another windows, say the gsissh and XFM portlets respectively, then the XFM will throw \na fit and quite because the bouncycastle library was already in the classloader and thus, it cannot relaod \nthe same class or remove the other class from the parent classloader.  Huge problem.  Luckily, tThis \nproblem can be avoided by either sharing a common applet archive or hacking the AppletClassLoader by way \nof the Java Console (don't do this). For future reference, here are the bundled libraries in the \ngsi-sshterm jar: \u003c/p\u003e\n\n* puretls.jar // ssl implementation...that says not to repackage without giving credit :-)\n* cryptix.jar //crypto library\n* cryptix-32.jar //crypto library\n* cryptix-ansi1.jar //crypto library\n* log4j.jar //defacto logging libarary\n* jglobus.jar // globus core java libraries\n* java40.jar // netscape security classes commonly used to extend Java 1.1 functionality\n \n \n### Building the Clients\n \nTo build the applet jar, simply run the 'build.client' ant task by executing\n \n\t$\u003e ant build.client \n \nfrom the command line in the project root directory.\n \nTo build the desktop executable jar, simply run the 'build.exe' ant task. This is currently the default task,\nso you can run it by just running\n \n\t$\u003e ant \n \nfrom the command line in the project root directory.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftacc%2Ffilemanager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftacc%2Ffilemanager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftacc%2Ffilemanager/lists"}