blob: 955d6f6671670ff7568fe1b71d14823fd71a1759 [file] [log] [blame]
Nico Huberee52fbc2023-06-24 11:52:57 +00001<?php
2/*
3 * SimpleID
4 *
5 * Copyright (C) Kelvin Mo 2007-8
6 *
7 * Includes code Drupal OpenID module (http://drupal.org/project/openid)
8 * Rowan Kerr <rowan@standardinteractive.com>
9 * James Walker <james@bryght.com>
10 *
11 * Copyright (C) Rowan Kerr and James Walker
12 *
13 * This program is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU General Public
15 * License as published by the Free Software Foundation; either
16 * version 2 of the License, or (at your option) any later version.
17 *
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 * General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public
24 * License along with this program; if not, write to the Free
25 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 *
27 * $Id$
28 */
29
30/**
31 * Implements the Simple Registration extension.
32 *
33 *
34 * @package simpleid
35 * @subpackage extensions
36 * @filesource
37 */
38
39/** Namespace for the Simple Registration extension */
40define('OPENID_NS_SREG', 'http://openid.net/extensions/sreg/1.1');
41
42/**
43 * @see hook_response()
44 */
45function sreg_response($assertion, $request) {
46 global $user;
47 global $version;
48
49 // We only deal with positive assertions
50 if (!$assertion) return array();
51
52 // We only respond if the extension is requested
53 if (!openid_extension_requested(OPENID_NS_SREG, $request)) return array();
54
55 $request = openid_extension_filter_request(OPENID_NS_SREG, $request);
56 $required = (isset($request['required'])) ? explode(',', $request['required']) : array();
57 $optional = (isset($request['optional'])) ? explode(',', $request['optional']) : array();
58 $fields = array_merge($required, $optional);
59 $alias = openid_extension_alias(OPENID_NS_SREG);
60 $response = array();
61
62 if ($version == OPENID_VERSION_2) $response['openid.ns.' . $alias] = OPENID_NS_SREG;
63
64 foreach ($fields as $field) {
65 $value = _sreg_get_value($field);
66
67 if ($value != NULL) $response['openid.' . $alias . '.' . $field] = $value;
68 }
69
70 return $response;
71}
72
73/**
74 * Returns an array of fields that need signing.
75 *
76 * @see hook_signed_fields()
77 */
78function sreg_signed_fields($response) {
79 // We only respond if the extension is requested
80 if (!openid_extension_requested(OPENID_NS_SREG, $response)) return array();
81
82 $fields = array_keys(openid_extension_filter_request(OPENID_NS_SREG, $response));
83 $alias = openid_extension_alias(OPENID_NS_SREG);
84 $signed_fields = array();
85
86 if (isset($response['openid.ns.' . $alias])) $signed_fields[] = 'ns.' . $alias;
87 foreach ($fields as $field) {
88 if (isset($response['openid.' . $alias . '.' . $field])) $signed_fields[] = $alias . '.' . $field;
89 }
90
91 return $signed_fields;
92}
93
94/**
95 * @see hook_consent_form()
96 */
97function sreg_consent_form($request, $response, $rp) {
98 global $user;
99
100 // We only respond if the extension is requested
101 if (!openid_extension_requested(OPENID_NS_SREG, $request)) return '';
102
103 $request = openid_extension_filter_request(OPENID_NS_SREG, $request);
104 $required = (isset($request['required'])) ? explode(',', $request['required']) : array();
105 $optional = (isset($request['optional'])) ? explode(',', $request['optional']) : array();
106 $fields = array_merge($required, $optional);
107
108 if ((count($request)) && isset($user['sreg'])) {
109 $xtpl2 = new XTemplate('extensions/sreg/sreg.xtpl');
110
111 $xtpl2->assign('alias', openid_extension_alias(OPENID_NS_SREG));
112
113 if (isset($request['policy_url'])) {
114 $xtpl2->assign('policy', t('You can view the site\'s policy in relation to the use of this information at this URL: <a href="@url">@url</a>.', array('@url' => $request['policy_url'])));
115 }
116
117 foreach ($fields as $field) {
118 $value = _sreg_get_value($field);
119
120 if ($value != NULL) {
121 $xtpl2->assign('name', htmlspecialchars($field, ENT_QUOTES, 'UTF-8'));
122 $xtpl2->assign('value', htmlspecialchars($value, ENT_QUOTES, 'UTF-8'));
123
124 $xtpl2->assign('checked', (in_array($field, $required) || !isset($rp['sreg_consents']) || in_array($field, $rp['sreg_consents'])) ? 'checked="checked"' : '');
125 $xtpl2->assign('disabled', (in_array($field, $required)) ? 'disabled="disabled"' : '');
126 if (in_array($field, $required)) $xtpl2->parse('form.sreg.required');
127
128 $xtpl2->parse('form.sreg');
129 }
130 }
131
132 $xtpl2->assign('sreg_data', t('SimpleID will also be sending the following registration information to the site.'));
133 $xtpl2->assign('name_label', t('Name'));
134 $xtpl2->assign('value_label', t('Value'));
135
136 $xtpl2->parse('form');
137 return $xtpl2->text('form');
138 }
139}
140
141/**
142 * @see hook_consent()
143 */
144function sreg_consent($form_request, &$response, &$rp) {
145 // We only respond if the extension is requested
146 if (!openid_extension_requested(OPENID_NS_SREG, $response)) return;
147
148 $fields = array_keys(openid_extension_filter_request(OPENID_NS_SREG, $response));
149 $alias = openid_extension_alias(OPENID_NS_SREG);
150
151 foreach ($fields as $field) {
152 if (isset($response['openid.' . $alias . '.' . $field])) {
153 if (!in_array($field, $form_request['sreg_consents'])) {
154 unset($response['openid.' . $alias . '.' . $field]);
155 }
156 }
157 }
158
159 if (count(array_keys(openid_extension_filter_request(OPENID_NS_SREG, $response))) == 0) {
160 // We have removed all the responses, so we remove the namespace as well
161 unset($response['openid.ns.' . $alias]);
162 }
163
164 $rp['sreg_consents'] = $form_request['sreg_consents'];
165}
166
167/**
168 * @see hook_page_profile()
169 */
170function sreg_page_profile() {
171 global $user;
172 $xtpl2 = new XTemplate('extensions/sreg/sreg.xtpl');
173
174 if (isset($user['sreg'])) {
175 foreach ($user['sreg'] as $name => $value) {
176 $xtpl2->assign('name', htmlspecialchars($name, ENT_QUOTES, 'UTF-8'));
177 $xtpl2->assign('value', htmlspecialchars($value, ENT_QUOTES, 'UTF-8'));
178 $xtpl2->parse('user_page.sreg');
179 }
180 }
181
182 $xtpl2->assign('sreg_data', t('SimpleID will send the following information to sites which supports the Simple Registration Extension.'));
183 $xtpl2->assign('connect_data', t('If you have also supplied OpenID Connect user information in your identity file, these may also be sent as part of this Extension.'));
184 $xtpl2->assign('edit_identity_file', t('To change these, <a href="!url">edit your identity file</a>.', array('!url' => 'http://simpleid.org/docs/1/identity-files/')));
185 $xtpl2->assign('name_label', t('Name'));
186 $xtpl2->assign('value_label', t('Value'));
187
188 $xtpl2->parse('user_page');
189
190 return array(array(
191 'id' => 'sreg',
192 'title' => t('Simple Registration Extension'),
193 'content' => $xtpl2->text('user_page')
194 ));
195}
196
197
198/**
199 * Looks up the value of a specified Simple Registration Extension field.
200 *
201 * This function looks up the sreg section of the user's identity file. If the
202 * specified field cannot be found, it looks up the corresponding field in the
203 * OpenID Connect user information (user_info section).
204 *
205 * @param string $field the field to look up
206 * @return string the value or NULL if not found
207 */
208function _sreg_get_value($field) {
209 global $user;
210
211 if (isset($user['sreg'][$field])) {
212 return $user['sreg'][$field];
213 } else {
214 switch ($field) {
215 case 'nickname':
216 case 'email':
217 if (isset($user['user_info'][$field])) return $user['user_info'][$field];
218 break;
219 case 'fullname':
220 if (isset($user['user_info']['name'])) return $user['user_info']['name'];
221 break;
222 case 'timezone':
223 if (isset($user['user_info']['zoneinfo'])) return $user['user_info']['zoneinfo'];
224 break;
225 case 'gender':
226 if (isset($user['user_info']['gender'])) return strtoupper(substr($user['user_info']['gender'], 0, 1));
227 break;
228 case 'postcode':
229 if (isset($user['user_info']['address']['postal_code'])) return $user['user_info']['address']['postcal_code'];
230 break;
231 default:
232 return NULL;
233 }
234 return NULL;
235 }
236}
237
238
239
240?>