Ignore:
Timestamp:
2013-04-17T20:14:32+02:00 (11 years ago)
Author:
akks
Message:

Remote control: allow adding tags without confirmation for current session (add_tags), see #8612
added parsing of request headers and detecting request sender by IP and "referer" HTTP header

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java

    r5837 r5876  
    22package org.openstreetmap.josm.io.remotecontrol;
    33
    4 import java.io.BufferedInputStream;
    54import java.io.BufferedOutputStream;
     5import java.io.BufferedReader;
    66import java.io.IOException;
    77import java.io.InputStreamReader;
    88import java.io.OutputStream;
    99import java.io.OutputStreamWriter;
    10 import java.io.Reader;
    1110import java.io.Writer;
    1211import java.net.Socket;
    1312import java.util.Arrays;
    1413import java.util.Date;
     14import java.util.HashMap;
    1515import java.util.Map;
    1616import java.util.Map.Entry;
    1717import java.util.StringTokenizer;
    1818import java.util.TreeMap;
     19import java.util.regex.Matcher;
     20import java.util.regex.Pattern;
    1921
    2022import org.openstreetmap.josm.io.remotecontrol.handler.AddNodeHandler;
     
    136138                    request.getOutputStream());
    137139            out = new OutputStreamWriter(raw);
    138             Reader in = new InputStreamReader(new BufferedInputStream(
    139                     request.getInputStream()), "ASCII");
    140 
    141             StringBuffer requestLine = new StringBuffer();
    142             while (requestLine.length() < 1024 * 1024) {
    143                 int c = in.read();
    144                 if (c == -1 || c == '\r' || c == '\n')
    145                     break;
    146                 requestLine.append((char) c);
    147             }
    148 
    149             System.out.println("RemoteControl received: " + requestLine);
    150             String get = requestLine.toString();
     140            BufferedReader in = new BufferedReader(new InputStreamReader(request.getInputStream(), "ASCII"));
     141           
     142            String get = in.readLine();
     143            System.out.println("RemoteControl received: " + get);
     144
    151145            StringTokenizer st = new StringTokenizer(get);
    152146            if (!st.hasMoreTokens()) {
     
    165159                return;
    166160            }
    167 
    168             String command = null;
     161           
    169162            int questionPos = url.indexOf('?');
    170             if(questionPos < 0)
    171             {
    172                 command = url;
    173             }
    174             else
    175             {
    176                 command = url.substring(0, questionPos);
    177             }
    178 
     163           
     164            String command = questionPos < 0 ? url : url.substring(0, questionPos);
     165           
     166            Map <String,String> headers = new HashMap<String, String>();
     167            int k=0, MAX_HEADERS=20;
     168            while (k<MAX_HEADERS) {
     169                get=in.readLine();
     170                if (get==null) break;
     171                k++;
     172                String h[] = get.split(": ", 2);
     173                if (h.length==2) {
     174                    headers.put(h[0], h[1]);
     175                } else break;
     176            }
     177           
     178            // Who sent the request: trying our best to detect
     179            // not from localhost => sender = IP
     180            // from localhost: sender = referer header, if exists
     181            String sender = null;
     182           
     183            if (!request.getInetAddress().isLoopbackAddress()) {
     184                sender = request.getInetAddress().getHostAddress();
     185            } else {
     186                String ref = headers.get("Referer");
     187                Pattern r = Pattern.compile("(https?://)?([^/]*)");
     188                if (ref!=null) {
     189                    Matcher m = r.matcher(ref);
     190                    if (m.find()) {
     191                        sender = m.group(2);
     192                    }
     193                }
     194                if (sender == null) {
     195                    sender = "localhost";
     196                }
     197            }
     198           
    179199            // find a handler for this command
    180200            Class<? extends RequestHandler> handlerClass = handlers.get(command);
     
    202222                    handler.setCommand(command);
    203223                    handler.setUrl(url);
     224                    handler.setSender(sender);
    204225                    handler.handle();
    205226                    sendHeader(out, "200 OK", handler.getContentType(), false);
Note: See TracChangeset for help on using the changeset viewer.