webidor/src/main/java/cz/xelfi/quoridor/webidor/resources/Users.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 14 Sep 2010 08:56:13 +0200
changeset 264 d60370059c3c
parent 239 a47345ebbdd7
permissions -rw-r--r--
Changing headers to GPLv3
jaroslav@143
     1
/*
jaroslav@264
     2
 * Quoridor server and related libraries
jaroslav@264
     3
 * Copyright (C) 2009-2010 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@143
     4
 *
jaroslav@264
     5
 * This program is free software: you can redistribute it and/or modify
jaroslav@264
     6
 * it under the terms of the GNU General Public License as published by
jaroslav@264
     7
 * the Free Software Foundation, either version 3 of the License.
jaroslav@143
     8
 *
jaroslav@264
     9
 * This program is distributed in the hope that it will be useful,
jaroslav@264
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@264
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@264
    12
 * GNU General Public License for more details.
jaroslav@143
    13
 *
jaroslav@264
    14
 * You should have received a copy of the GNU General Public License
jaroslav@264
    15
 * along with this program. Look for COPYING file in the top folder.
jaroslav@264
    16
 * If not, see http://www.gnu.org/licenses/.
jaroslav@143
    17
 */
jaroslav@143
    18
package cz.xelfi.quoridor.webidor.resources;
jaroslav@143
    19
jaroslav@189
    20
import com.sun.jersey.api.json.JSONWithPadding;
jaroslav@143
    21
import cz.xelfi.quoridor.webidor.*;
jaroslav@143
    22
import java.io.File;
jaroslav@143
    23
import java.io.FileInputStream;
jaroslav@143
    24
import java.io.FileNotFoundException;
jaroslav@144
    25
import java.io.FileOutputStream;
jaroslav@143
    26
import java.io.IOException;
jaroslav@143
    27
import java.util.Properties;
jaroslav@143
    28
import java.util.logging.Logger;
jaroslav@143
    29
import javax.ws.rs.GET;
jaroslav@144
    30
import javax.ws.rs.POST;
jaroslav@143
    31
import javax.ws.rs.Path;
jaroslav@143
    32
import javax.ws.rs.PathParam;
jaroslav@143
    33
import javax.ws.rs.Produces;
jaroslav@143
    34
import javax.ws.rs.QueryParam;
jaroslav@143
    35
import javax.ws.rs.core.MediaType;
jaroslav@144
    36
import javax.ws.rs.core.Response;
jaroslav@143
    37
jaroslav@143
    38
/**
jaroslav@143
    39
 *
jaroslav@143
    40
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@143
    41
 */
jaroslav@143
    42
public final class Users {
jaroslav@143
    43
    private final Quoridor quoridor;
jaroslav@143
    44
    private final File dir;
jaroslav@143
    45
    private static final Logger LOG = Logger.getLogger(Users.class.getName());
jaroslav@143
    46
jaroslav@143
    47
    Users(File dir, Quoridor quoridor) {
jaroslav@143
    48
        this.dir = dir;
jaroslav@143
    49
        this.quoridor = quoridor;
jaroslav@143
    50
        dir.mkdirs();
jaroslav@143
    51
    }
jaroslav@143
    52
jaroslav@143
    53
    @GET
jaroslav@189
    54
    @Produces({ "application/x-javascript", MediaType.APPLICATION_JSON, MediaType.TEXT_XML })
jaroslav@189
    55
    public JSONWithPadding getOwnInfo(
jaroslav@189
    56
        @QueryParam("callback") String callback,
jaroslav@189
    57
        @QueryParam("loginID") String loginId
jaroslav@145
    58
    ) throws IOException {
jaroslav@189
    59
        return getUserInfo(callback, loginId, null);
jaroslav@145
    60
    }
jaroslav@189
    61
jaroslav@189
    62
    User getUserInfo(
jaroslav@143
    63
        @QueryParam("loginID") String loginId,
jaroslav@143
    64
        @PathParam("id") String id
jaroslav@143
    65
    ) throws IOException {
jaroslav@143
    66
        String  myid = quoridor.isLoggedIn(loginId);
jaroslav@145
    67
        if (id == null) {
jaroslav@145
    68
            id = myid;
jaroslav@145
    69
        }
jaroslav@143
    70
        Properties myp = getProp(myid);
jaroslav@143
    71
        Properties p = getProp(id);
jaroslav@143
    72
        User user = new User(id);
jaroslav@143
    73
        for (String n : p.stringPropertyNames()) {
jaroslav@171
    74
            final String prefix = "permission.";
jaroslav@171
    75
            if (n.startsWith(prefix)) {
jaroslav@171
    76
                if ("true".equals(p.getProperty(n))) {
jaroslav@171
    77
                    user.addPermission(n.substring(prefix.length()));
jaroslav@171
    78
                }
jaroslav@143
    79
                continue;
jaroslav@143
    80
            }
jaroslav@143
    81
            if (!id.equals(myid) && !"true".equals(myp.getProperty("permission." + n))) {
jaroslav@143
    82
                continue;
jaroslav@143
    83
            }
jaroslav@143
    84
            user.addProperty(n, p.getProperty(n));
jaroslav@143
    85
        }
jaroslav@143
    86
        return user;
jaroslav@143
    87
    }
jaroslav@143
    88
jaroslav@189
    89
    @GET
jaroslav@189
    90
    @Path("{id}")
jaroslav@189
    91
    @Produces({ "application/x-javascript", MediaType.APPLICATION_JSON, MediaType.TEXT_XML })
jaroslav@189
    92
    public JSONWithPadding getUserInfo(
jaroslav@189
    93
        @QueryParam("callback") String callback,
jaroslav@189
    94
        @QueryParam("loginID") String loginId,
jaroslav@189
    95
        @PathParam("id") String id
jaroslav@189
    96
    ) throws IOException {
jaroslav@189
    97
        return new JSONWithPadding(getUserInfo(loginId, id), callback);
jaroslav@189
    98
    }
jaroslav@189
    99
jaroslav@144
   100
    @POST
jaroslav@144
   101
    @Path("{id}")
jaroslav@144
   102
    @Produces({ MediaType.APPLICATION_JSON, MediaType.TEXT_XML })
jaroslav@144
   103
    public synchronized Response changeProperty(
jaroslav@144
   104
        @QueryParam("loginID") String loginId,
jaroslav@144
   105
        @PathParam("id") String id,
jaroslav@144
   106
        @QueryParam("name") String name,
jaroslav@144
   107
        @QueryParam("value") String value
jaroslav@144
   108
    ) throws IOException {
jaroslav@144
   109
        String myid = quoridor.isLoggedIn(loginId);
jaroslav@144
   110
        if (!id.equals(myid) || name.startsWith("permission.")) {
jaroslav@144
   111
            return Response.status(Response.Status.UNAUTHORIZED).build();
jaroslav@144
   112
        }
jaroslav@144
   113
jaroslav@144
   114
        Properties p = getProp(myid);
jaroslav@144
   115
        p.setProperty(name, value);
jaroslav@144
   116
jaroslav@144
   117
        File f = new File(dir, id);
jaroslav@144
   118
        FileOutputStream os = new FileOutputStream(f);
jaroslav@144
   119
        p.store(os, "");
jaroslav@144
   120
        os.close();
jaroslav@144
   121
        
jaroslav@189
   122
        return Response.ok().entity(getUserInfo(null, loginId, id).getJsonSource()).build();
jaroslav@144
   123
    }
jaroslav@144
   124
jtulach@239
   125
    final boolean verifyPassword(String id, String passwd) throws IOException {
jtulach@239
   126
        Properties p = getProp(id);
jtulach@239
   127
        if (p != null) {
jtulach@239
   128
            return passwd.equals(p.getProperty("passwd"));
jtulach@239
   129
        }
jtulach@239
   130
        return false;
jtulach@239
   131
    }
jtulach@239
   132
jaroslav@144
   133
    private synchronized Properties getProp(String id) throws FileNotFoundException, IOException {
jaroslav@143
   134
        Properties p = new Properties();
jaroslav@143
   135
        if (id != null && id.length() > 0) {
jaroslav@143
   136
            File f = new File(dir, id);
jaroslav@145
   137
            if (f.exists()) {
jaroslav@145
   138
                FileInputStream is = new FileInputStream(f);
jaroslav@145
   139
                p.load(is);
jaroslav@145
   140
                is.close();
jaroslav@145
   141
            }
jaroslav@143
   142
        }
jaroslav@143
   143
        return p;
jaroslav@143
   144
    }
jaroslav@143
   145
}