ここの情報は古いです。ご理解頂いた上でお取り扱いください。

source: OpenPNE3/plugins/opOpenSocialPlugin/trunk/lib/vendor/Shindig/src/social/servlet/ApiServlet.php @ 8979

Last change on this file since 8979 was 8979, checked in by ShogoKawahara, 12 years ago

updated Shindig library

File size: 6.1 KB
Line 
1<?php
2/*
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 *     http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations under the License.
18 */
19
20require 'src/common/HttpServlet.php';
21require 'src/common/SecurityTokenDecoder.php';
22require 'src/common/SecurityToken.php';
23require 'src/common/BlobCrypter.php';
24require 'src/common/OAuthLookupService.php';
25require 'src/social/model/Activity.php';
26require 'src/social/model/Address.php';
27require 'src/social/model/ApiCollection.php';
28require 'src/social/model/BodyType.php';
29require 'src/social/model/Email.php';
30require 'src/social/model/Enum.php';
31require 'src/social/model/IdSpec.php';
32require 'src/social/model/MediaItem.php';
33require 'src/social/model/Message.php';
34require 'src/social/model/Name.php';
35require 'src/social/model/Organization.php';
36require 'src/social/model/Person.php';
37require 'src/social/model/Phone.php';
38require 'src/social/model/Url.php';
39require 'src/social/spi/GroupId.php';
40require 'src/social/spi/UserId.php';
41require 'src/social/spi/RestfulCollection.php';
42require 'src/social/spi/ActivityService.php';
43require 'src/social/spi/AppDataService.php';
44require 'src/social/spi/PersonService.php';
45require 'src/social/service/RestRequestItem.php';
46require 'src/social/service/DataRequestHandler.php';
47require 'src/social/service/ActivityHandler.php';
48require 'src/social/service/AppDataHandler.php';
49require 'src/social/service/PersonHandler.php';
50require 'src/social/service/ResponseItem.php';
51require 'src/social/converters/OutputConverter.php';
52require 'src/social/converters/OutputAtomConverter.php';
53require 'src/social/converters/OutputJsonConverter.php';
54require 'src/social/converters/OutputXmlConverter.php';
55require 'src/social/converters/InputConverter.php';
56require 'src/social/converters/InputAtomConverter.php';
57require 'src/social/converters/InputJsonConverter.php';
58require 'src/social/converters/InputXmlConverter.php';
59require 'src/social/oauth/OAuth.php';
60
61/**
62 * Common base class for API servlets.
63 */
64abstract class ApiServlet {
65        protected $handlers = array();
66       
67        protected static $DEFAULT_ENCODING = "UTF-8";
68       
69        public static $PEOPLE_ROUTE = "people";
70        public static $ACTIVITY_ROUTE = "activities";
71        public static $APPDATA_ROUTE = "appdata";
72        public static $MESSAGE_ROUTE = "messages";
73
74        public function __construct()
75        {
76                $this->handlers[self::$PEOPLE_ROUTE] = new PersonHandler();
77                $this->handlers[self::$ACTIVITY_ROUTE] = new ActivityHandler();
78                $this->handlers[self::$APPDATA_ROUTE] = new AppDataHandler();
79                $this->handlers[self::$MESSAGE_ROUTE] = new MessagesHandler();
80        }
81
82        public function getSecurityToken()
83        {
84                // see if we have an OAuth request
85                $request = OAuthRequest::from_request();
86                $appUrl = $request->get_parameter('oauth_consumer_key');
87                $userId = $request->get_parameter('xoauth_requestor_id'); // from Consumer Request extension (2-legged OAuth)
88                $signature = $request->get_parameter('oauth_signature');
89               
90                // TODO: also allow userId to be specified via oauth token and/or in URL?
91                if ($appUrl && $signature) {
92                        //if ($appUrl && $signature && $userId) {
93                        // look up the user and perms for this oauth request
94                        $oauthLookupService = Config::get('oauth_lookup_service');
95                        $oauthLookupService = new $oauthLookupService();
96                        if ($oauthLookupService->thirdPartyHasAccessToUser($request, $appUrl, $userId)) {
97                                return $oauthLookupService->getSecurityToken($appUrl, $userId);
98                        } else {
99                                return null; // invalid oauth request
100                        }
101                } // else, not a valid oauth request, so don't bother
102
103                // look for encrypted security token
104                $token = isset($_POST['st']) ? $_POST['st'] : (isset($_GET['st']) ? $_GET['st'] : '');
105                if (empty($token)) {
106                        // no security token, continue anonymously, remeber to check
107                        // for private profiles etc in your code so their not publicly
108                        // accessable to anoymous users! Anonymous == owner = viewer = appId = modId = 0
109                        //FIXME change this to a new AnonymousToken when reworking auth token
110                        $gadgetSigner = Config::get('security_token');
111                        // create token with 0 values, no gadget url, no domain and 0 duration
112                        return new $gadgetSigner(null, 0, 0, 0, 0, '', '', 0);
113                }
114                if (count(explode(':', $token)) != 6) {
115                        $token = urldecode(base64_decode($token));
116                }
117                $gadgetSigner = Config::get('security_token_signer');
118                $gadgetSigner = new $gadgetSigner();
119                return $gadgetSigner->createToken($token);
120        }
121
122        protected abstract function sendError(ResponseItem $responseItem);
123
124        protected function sendSecurityError()
125        {
126                $this->sendError(new ResponseItem(ResponseError::$UNAUTHORIZED, "The request did not have a proper security token nor oauth message and unauthenticated requests are not allowed"));
127        }
128
129        /**
130         * Delivers a request item to the appropriate DataRequestHandler.
131         */
132        protected function handleRequestItem(RequestItem $requestItem)
133        {
134                if (! isset($this->handlers[$requestItem->getService()])) {
135                        throw new SocialSpiException("The service " . $requestItem->getService() . " is not implemented", ResponseError::$NOT_IMPLEMENTED);
136                }
137                $handler = $this->handlers[$requestItem->getService()];
138                return $handler->handleItem($requestItem);
139        }
140
141        protected function getResponseItem($result)
142        {
143                if ($result instanceof ResponseItem) {
144                        return $result;
145                } else {
146                        return new ResponseItem(null, null, $result);
147                }
148        }
149
150        protected function responseItemFromException($e)
151        {
152                if ($e instanceof SocialSpiException) {
153                        return new ResponseItem($e->getCode(), $e->getMessage(), null);
154                }
155                return new ResponseItem(ResponseError::$INTERNAL_ERROR, $e->getMessage());
156        }
157}
Note: See TracBrowser for help on using the repository browser.