Changeset 0ac83bd


Ignore:
Timestamp:
Apr 24, 2016 9:03:10 PM (4 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
fc8b7276
Parents:
2a34d1c4
Message:

i2ptunnel: Enhance registration authentication page

  • Enable form
  • Switch to multipart form for getting old private key file
  • Add advanced authentications

PrivateKeyFile?: Add InputStream? constructor for i2ptunnel

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • apps/i2ptunnel/java/build.xml

    r2a34d1c4 r0ac83bd  
    271271                <pathelement location="build/temp-beans.jar" />
    272272                <pathelement location="../../../core/java/build/i2p.jar" />
     273                <!-- required for multipart form handling in register.jsp -->
     274                <pathelement location="../../jetty/jettylib/jetty-i2p.jar" />
    273275            </classpath>
    274276            <arg value="-d" />
     
    300302                <pathelement location="build/temp-beans.jar" />
    301303                <pathelement location="../../../core/java/build/i2p.jar" />
     304                <!-- required for multipart form handling in register.jsp -->
     305                <pathelement location="../../jetty/jettylib/jetty-i2p.jar" />
    302306            </classpath>
    303307        </javac>
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/Messages.java

    r2a34d1c4 r0ac83bd  
    4141    }
    4242
     43    /** @since 0.9.26 */
     44    public String _t(String s, Object o1, Object o2) {
     45        return Translate.getString(s, o1, o2, _context, BUNDLE_NAME);
     46    }
     47
    4348    /** translate (ngettext)
    4449     *  @since 0.9.7
  • apps/i2ptunnel/jsp/register.jsp

    r2a34d1c4 r0ac83bd  
    1 <%@page contentType="text/html" import="net.i2p.i2ptunnel.web.EditBean,net.i2p.client.naming.HostTxtEntry,net.i2p.data.SigningPrivateKey,net.i2p.util.OrderedProperties"
     1<%@page contentType="text/html" import="java.io.InputStream,net.i2p.i2ptunnel.web.EditBean,net.i2p.servlet.RequestWrapper,net.i2p.client.I2PSessionException,net.i2p.client.naming.HostTxtEntry,net.i2p.data.PrivateKeyFile,net.i2p.data.SigningPrivateKey,net.i2p.util.OrderedProperties"
    22%><%@page trimDirectiveWhitespaces="true"
    33%><?xml version="1.0" encoding="UTF-8"?>
     
    99<jsp:useBean class="net.i2p.i2ptunnel.web.EditBean" id="editBean" scope="request" />
    1010<jsp:useBean class="net.i2p.i2ptunnel.web.Messages" id="intl" scope="request" />
    11 <% String tun = request.getParameter("tunnel");
     11<%
     12   RequestWrapper wrequest = new RequestWrapper(request);
     13   String tun = wrequest.getParameter("tunnel");
    1214   int curTunnel = -1;
    1315   if (tun != null) {
     
    4446
    4547%>
    46     <form method="post" action="authenticate">
    47 
     48    <form method="post" enctype="multipart/form-data" action="register" accept-charset="UTF-8">
    4849        <div id="tunnelEditPanel" class="panel">
    4950            <div class="header">
     
    7475    if (!"new".equals(tunnelType)) {     
    7576%>
    76             <div class="separator">
    77                 <hr />
    78             </div>
    79 
     77  <span class="comment">
     78    <%=intl._t("Please be sure to select, copy, and paste the entire contents of the appropriate authentication data into the form of your favorite registration site")%>
     79  </span>
     80            <div class="separator">
     81                <hr />
     82            </div>
    8083            <div id="nameField" class="rowItem">
    8184                <label for="name" accesskey="N">
    82                     <%=intl._t("Name")%>(<span class="accessKey">N</span>):
     85                    <%=intl._t("Name")%>
    8386                </label>
    8487                <span class="text"><%=editBean.getTunnelName(curTunnel)%></span>
    8588            </div>
    86             <div id="typeField" class="rowItem">
    87                 <label><%=intl._t("Type")%>:</label>
    88                 <span class="text"><%=tunnelTypeName%></span>
    89             </div>
    90                  
    9189<%           
    9290      if (("httpserver".equals(tunnelType)) || ("httpbidirserver".equals(tunnelType))) {
    9391          %><div id="websiteField" class="rowItem">
    9492                <label for="spoofedHost" accesskey="W">
    95                     <%=intl._t("Website name")%>(<span class="accessKey">W</span>):
     93                    <%=intl._t("Website name")%>
    9694                </label>
    9795                <span class="text"><%=editBean.getSpoofedHost(curTunnel)%></span>   
     
    102100            <div id="destinationField" class="rowItem">
    103101                <label for="localDestination" accesskey="L">
    104                     <%=intl._t("Local destination")%>(<span class="accessKey">L</span>):
     102                    <%=intl._t("Local destination")%>
    105103                </label>
    106104                <textarea rows="1" style="height: 3em;" cols="60" readonly="readonly" id="localDestination" title="Read Only: Local Destination (if known)" wrap="off" spellcheck="false"><%=editBean.getDestinationBase64(curTunnel)%></textarea>               
     
    127125               HostTxtEntry he = new HostTxtEntry(name, b64, props);
    128126               he.sign(spk);
    129           %><div id="destinationField" class="rowItem">
    130                 <label><%=intl._t("Authentication Strings")%>:</label>
    131                 <span class="text"><%=intl._t("Select and copy the entire contents of the appropriate box")%></span>
    132             </div>
    133             <div id="sigField" class="rowItem">
     127          %><div id="sigField" class="rowItem">
    134128                <label for="signature">
    135129                    <%=intl._t("Authentication for adding host")%>
    136130                </label>
    137131                <textarea rows="1" style="height: 3em;" cols="60" readonly="readonly" id="localDestination" title="Copy and paste this to the registration site" wrap="off" spellcheck="false"><% he.writeProps(out); %></textarea>               
     132            </div>
     133        </div>
     134        <div id="tunnelAdvancedNetworking" class="panel">
     135            <div class="header">
     136                <h4><%=intl._t("Advanced authentication strings")%></h4>
    138137            </div>
    139138<%
     
    146145                </label>
    147146                <textarea rows="1" style="height: 3em;" cols="60" readonly="readonly" id="localDestination" title="Copy and paste this to the registration site" wrap="off" spellcheck="false"><% he.writeRemove(out); %></textarea>               
    148             </div>
    149 
    150 
    151             <div class="footer">
     147                <span class="comment"><%=intl._t("This will remove the entry for {0}", name)%></span>
     148            </div>
     149            <div class="separator">
     150                <hr />
     151            </div>
     152<%
     153               String oldname = wrequest.getParameter("oldname");
     154               String olddestfile = wrequest.getFilename("olddestfile");
     155               SigningPrivateKey spk2 = null;
     156               String olddest = null;
     157               if (olddestfile != null) {
     158                   InputStream destIn = wrequest.getInputStream("olddestfile");
     159                   if (destIn.available() > 0) {
     160                       try {
     161                           PrivateKeyFile pkf2 = new PrivateKeyFile(destIn);
     162                           String oldb64 = pkf2.getDestination().toBase64();
     163                           if (!b64.equals(oldb64)) {
     164                               // disallow dup
     165                               olddest = b64;
     166                               spk2 = pkf2.getSigningPrivKey();
     167                           }
     168                       } catch (I2PSessionException ise) {
     169                           throw new IllegalStateException("Unable to open private key file " + olddestfile, ise);
     170                       }
     171                   }
     172               }
     173               props.remove(HostTxtEntry.PROP_SIG);
     174          %><div id="sigField" class="rowItem">
     175                <label for="signature">
     176                    <%=intl._t("Authentication for changing name")%>
     177                </label>
     178<%
     179               if (oldname != null && oldname.length() > 0 && !oldname.equals(name)) {
     180                   props.setProperty(HostTxtEntry.PROP_ACTION, HostTxtEntry.ACTION_CHANGENAME);
     181                   props.setProperty(HostTxtEntry.PROP_OLDNAME, oldname);
     182                   he.sign(spk);
     183                %><textarea rows="1" style="height: 3em;" cols="60" readonly="readonly" id="localDestination" title="Copy and paste this to the registration site" wrap="off" spellcheck="false"><% he.writeProps(out); %></textarea>               
     184                <span class="comment"><%=intl._t("This will change the name from {0} to {1}, using the same destination", oldname, name)%></span>
     185<%
     186               } else {
     187                %><span class="comment"><%=intl._t("This tunnel must be configured with the new host name.")%></span>
     188                  <span class="comment"><%=intl._t("Enter old host name below.")%></span>
     189<%
     190               }
     191          %></div>
     192            <div class="separator">
     193                <hr />
     194            </div>
     195<%
     196               props.remove(HostTxtEntry.PROP_SIG);
     197          %><div id="sigField" class="rowItem">
     198                <label for="signature">
     199                    <%=intl._t("Authentication for adding alias")%>
     200                </label>
     201<%
     202               if (oldname != null && oldname.length() > 0 && !oldname.equals(name)) {
     203                   props.setProperty(HostTxtEntry.PROP_ACTION, HostTxtEntry.ACTION_ADDNAME);
     204                   props.setProperty(HostTxtEntry.PROP_OLDNAME, oldname);
     205                   he.sign(spk);
     206                %><textarea rows="1" style="height: 3em;" cols="60" readonly="readonly" id="localDestination" title="Copy and paste this to the registration site" wrap="off" spellcheck="false"><% he.writeProps(out); %></textarea>               
     207                <span class="comment"><%=intl._t("This will add an alias {0} for {1}, using the same destination", name, oldname)%></span>
     208<%
     209               } else {
     210                %><span class="comment"><%=intl._t("This tunnel must be configured with the new host name.")%></span>
     211                  <span class="comment"><%=intl._t("Enter old host name below.")%></span>
     212<%
     213               }
     214          %></div>
     215            <div class="separator">
     216                <hr />
     217            </div>
     218<%
     219               props.remove(HostTxtEntry.PROP_SIG);
     220          %><div id="sigField" class="rowItem">
     221                <label for="signature">
     222                    <%=intl._t("Authentication for changing destination")%>
     223                </label>
     224<%
     225               if (spk2 != null) {
     226                   props.setProperty(HostTxtEntry.PROP_ACTION, HostTxtEntry.ACTION_CHANGEDEST);
     227                   props.setProperty(HostTxtEntry.PROP_OLDDEST, olddest);
     228                   he.signInner(spk2);
     229                   he.sign(spk);
     230                %><textarea rows="1" style="height: 3em;" cols="60" readonly="readonly" id="localDestination" title="Copy and paste this to the registration site" wrap="off" spellcheck="false"><% he.writeProps(out); %></textarea>               
     231                <span class="comment"><%=intl._t("This will change the destination for {0}", name)%></span>
     232<%
     233               } else {
     234                %><span class="comment"><%=intl._t("This tunnel must be configured with the new destination.")%></span>
     235                  <span class="comment"><%=intl._t("Enter old destination below.")%></span>
     236<%
     237               }
     238          %></div>
     239            <div class="separator">
     240                <hr />
     241            </div>
     242<%
     243               props.remove(HostTxtEntry.PROP_SIG);
     244               props.remove(HostTxtEntry.PROP_OLDSIG);
     245          %><div id="sigField" class="rowItem">
     246                <label for="signature">
     247                    <%=intl._t("Authentication for adding alternate destination")%>
     248                </label>
     249<%
     250               if (spk2 != null) {
     251                   props.setProperty(HostTxtEntry.PROP_ACTION, HostTxtEntry.ACTION_ADDDEST);
     252                   props.setProperty(HostTxtEntry.PROP_OLDDEST, olddest);
     253                   he.signInner(spk2);
     254                   he.sign(spk);
     255                %><textarea rows="1" style="height: 3em;" cols="60" readonly="readonly" id="localDestination" title="Copy and paste this to the registration site" wrap="off" spellcheck="false"><% he.writeProps(out); %></textarea>               
     256                <span class="comment"><%=intl._t("This will add an alternate destination for {0}", name)%></span>
     257<%
     258               } else {
     259                %><span class="comment"><%=intl._t("This tunnel must be configured with the new destination.")%></span>
     260                  <span class="comment"><%=intl._t("Enter old destination below.")%></span>
     261<%
     262               }
     263          %></div>
     264            <div class="separator">
     265                <hr />
     266            </div>
     267<%
     268               props.remove(HostTxtEntry.PROP_SIG);
     269               props.remove(HostTxtEntry.PROP_OLDSIG);
     270          %><div id="sigField" class="rowItem">
     271                <label for="signature">
     272                    <%=intl._t("Authentication for adding subdomain")%>
     273                </label>
     274<%
     275               if (oldname != null && oldname.length() > 0 && !oldname.equals(name) && spk2 != null) {
     276                   props.setProperty(HostTxtEntry.PROP_ACTION, HostTxtEntry.ACTION_ADDSUBDOMAIN);
     277                   props.setProperty(HostTxtEntry.PROP_OLDNAME, oldname);
     278                   props.setProperty(HostTxtEntry.PROP_OLDDEST, olddest);
     279                   he.signInner(spk2);
     280                   he.sign(spk);
     281                %><textarea rows="1" style="height: 3em;" cols="60" readonly="readonly" id="localDestination" title="Copy and paste this to the registration site" wrap="off" spellcheck="false"><% he.writeProps(out); %></textarea>               
     282                <span class="comment"><%=intl._t("This will add a subdomain {0} of {1}, with a different destination", name, oldname)%></span>
     283<%
     284               } else {
     285                %><span class="comment"><%=intl._t("This tunnel must be configured with the new subdomain and destination.")%></span>
     286                  <span class="comment"><%=intl._t("Enter higher-level domain and destination below.")%></span>
     287<%
     288               }
     289          %></div>
     290
     291          <div class="footer">
    152292            </div>
    153293<%
     
    155295       }  // valid b64 and name
    156296    }  // !"new".equals(tunnelType)
    157     if (!valid) {
     297    if (!valid && curTunnel >= 0) {
    158298        %><a href="edit?tunnel=<%=curTunnel%>"><%=intl._t("Go back and edit the tunnel")%></a><%
    159299    }
     
    163303
    164304<%
    165     if (false && valid) {
     305    if (valid) {
    166306%>
    167307        <div id="globalOperationsPanel" class="panel">
    168             <div class="header"></div>
     308            <div class="header">
     309                <h4><%=intl._t("Specify old name and destination")%></h4>
     310            </div>
     311  <span class="comment">
     312    <%=intl._t("This is only required for advanced authentication.")%>
     313    <%=intl._t("See above for required items.")%>
     314  </span>
     315<%
     316               String oldname = wrequest.getParameter("oldname");
     317               if (oldname == null) oldname = "";
     318          %><div id="sigField" class="rowItem">
     319                <label for="signature">
     320                    <%=intl._t("Old Host Name")%>
     321                </label>
     322                <input type="text" size="30" maxlength="50" name="oldname" id="name" title="Old Host Name" value="<%=oldname%>" class="freetext" />               
     323            </div>
     324            <div id="sigField" class="rowItem">
     325                <label for="signature">
     326                    <%=intl._t("Private Key File for old Destination")%>
     327                </label>
     328                <input type="file" size="50%" name="olddestfile" id="name" value="" />               
     329            </div>
    169330            <div class="footer">
    170331                <div class="toolbox">
    171332                    <input type="hidden" value="true" name="removeConfirm" />
    172333                    <button id="controlCancel" class="control" type="submit" name="action" value="" title="Cancel"><%=intl._t("Cancel")%></button>
    173                     <button id="controlSave" accesskey="S" class="control" type="submit" name="action" value="authenticate" title="Generate Authentication"><%=intl._t("Generate")%>(<span class="accessKey">S</span>)</button>
     334                    <button id="controlSave" accesskey="S" class="control" type="submit" name="action" value="authenticate" title="Generate Authentication"><%=intl._t("Generate")%></button>
    174335                </div>
    175336            </div>
  • core/java/src/net/i2p/data/PrivateKeyFile.java

    r2a34d1c4 r0ac83bd  
    272272        this.privKey = pk;
    273273        this.signingPrivKey = spk;
     274    }
     275   
     276    /**
     277     *  Can't be used for writing
     278     *  @since 0.9.26
     279     */
     280    public PrivateKeyFile(InputStream in) throws I2PSessionException {
     281        this("/dev/null");
     282        I2PSession s = this.client.createSession(in, new Properties());
     283        this.dest = s.getMyDestination();
     284        this.privKey = s.getDecryptionKey();
     285        this.signingPrivKey = s.getPrivateKey();
    274286    }
    275287   
Note: See TracChangeset for help on using the changeset viewer.