241461214e3b3de104bf1b2c81aedaec0ebffba3
[codereview/qtwebservice.git] / examples / webservice / official / root / examples / oauth.qml
1 /* Copyright (c) 2012 QtWebService Project.
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *     * Redistributions of source code must retain the above copyright
7  *       notice, this list of conditions and the following disclaimer.
8  *     * Redistributions in binary form must reproduce the above copyright
9  *       notice, this list of conditions and the following disclaimer in the
10  *       documentation and/or other materials provided with the distribution.
11  *     * Neither the name of the QtWebService nor the
12  *       names of its contributors may be used to endorse or promote products
13  *       derived from this software without specific prior written permission.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18  * DISCLAIMED. IN NO EVENT SHALL QTWEBSERVICE BE LIABLE FOR ANY
19  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 import QtWebService.HTML 5.0
28 import QtWebService.Cache 1.0
29 import "./components"
30
31 Html {
32     Cache { id: cache }
33
34     UserInput {
35         id: input
36
37         property string action
38         property string oauth_token
39         property string oauth_verifier
40
41         onSubmit: {
42             var responseCookies = http.responseCookies;
43             switch(input.action) {
44             case 'authorize':
45                 http.loading = true;
46                 twitter.requestToken();
47                 break;
48             case 'unauthorize':
49                 twitter.token = '';
50                 twitter.tokenSecret = '';
51                 twitter.user_id = '';
52                 twitter.screen_name = '';
53                 responseCookies.session_id = {value: undefined, expires: new Date(0)};
54                 cache.remove(http.requestCookies.session_id);
55                 break;
56             default:
57                 if (input.oauth_verifier.length > 0) {
58                     http.loading = true;
59                     twitter.token = input.oauth_token;
60                     twitter.tokenSecret = cache.fetch(input.oauth_token);
61                     cache.remove(input.oauth_token);
62                     twitter.accessToken(input.oauth_verifier);
63                 } else {
64                     if (typeof http.requestCookies.session_id !== 'undefined') {
65                         var session_data = cache.fetch(http.requestCookies.session_id.value);
66                         if (typeof session_data !== 'undefined') {
67                             http.loading = true;
68                             twitter.token = session_data.token;
69                             twitter.tokenSecret = session_data.tokenSecret;
70                             if (typeof session_data.user_id !== 'undefined' ) twitter.user_id = session_data.user_id;
71                             if (typeof session_data.screen_name !== 'undefined' ) twitter.screen_name = session_data.screen_name;
72
73                             var request = new XMLHttpRequest();
74                             request.onreadystatechange = function() {
75                                 switch (request.readyState) {
76                                 case 4: { // Done
77                                     var result = JSON.parse(request.responseText);
78                                     profile_image.src = result.profile_image_url;
79                                     name.text = result.name;
80                                     http.loading = false;
81                                     break }
82                                 }
83                             }
84                             var header = twitter.authHeader('GET', 'https://api.twitter.com/1.1/account/verify_credentials.json');
85                             request.open('GET', 'https://api.twitter.com/1.1/account/verify_credentials.json');
86                             request.setRequestHeader('Authorization', header);
87                             request.send();
88                         }
89                     }
90                 }
91
92                 break;
93             }
94             http.responseCookies = responseCookies;
95         }
96     }
97
98     Twitter {
99         id: twitter
100         onAuthorize: {
101             cache.add(twitter.token, twitter.tokenSecret);
102             http.status = 301;
103             http.responseHeader = {'Content-Type': 'text/plain; charset=utf-8', 'Location': url};
104             http.loading = false;
105         }
106         onAuthorizedChanged: {
107             if (authorized) {
108                 var session_id = QtWebService.uuid();
109                 var session_data = {}
110                 session_data.token = twitter.token;
111                 session_data.tokenSecret = twitter.tokenSecret;
112                 session_data.user_id = twitter.user_id;
113                 session_data.screen_name = twitter.screen_name;
114                 cache.add(session_id, session_data);
115
116                 var cookies = http.responseCookies;
117                 cookies.session_id = { 'value': session_id, 'httponly': true };
118                 http.responseCookies = cookies;
119
120                 http.status = 301
121                 http.responseHeader = {'Content-Type': 'text/plain; charset=utf-8', 'Location': '/examples/oauth.qml'}
122             }
123             http.loading = false
124         }
125     }
126
127     Head {
128         enabled: http.status === 200
129         Title { id: title; text: "OAuth" }
130     }
131
132     Body {
133         enabled: http.status === 200
134         H1 { text: title.text }
135         P {
136             enabled: twitter.consumerKey.length === 0
137             Text {
138                 text: 'to test oauth.qml you have to add oauth config to <a href="/config.qml">silkrc</a> like below.'
139             }
140             Pre {
141                 text: '{
142     "oauth:" {
143         "consumerKey": "<em>consumerKey</em>"
144         , "consumerSecret": "<em>consumerSecret</em>"
145     }
146 }'
147             }
148         }
149         P {
150             enabled: profile_image.src.length > 0
151             Img { id: profile_image; }
152             Text { id: name }
153         }
154
155         Form {
156             id: form
157             enabled: twitter.consumerKey.length > 0
158             method: 'POST'
159             Input { type: 'submit'; value: twitter.user_id.length === 0 ? 'Sign in with twitter' : 'Sign out' }
160             Input { type: 'hidden'; name: 'action'; value: twitter.user_id.length === 0 ? 'authorize' : 'unauthorize' }
161         }
162     }
163 }