@@ -292,26 +292,40 @@ public function gdn_auth_startAuthenticator_handler() {
292
292
}
293
293
294
294
self ::log ('TopcoderPlugin: gdn_auth_startAuthenticator_handler ' , ['Path ' => Gdn::request ()->path ()]);
295
-
296
- // Ignore EntryController endpoints and ApiController endpoints.
295
+ // Ignore EntryController endpoints
297
296
// AccessToken for /api will be checked in class.hooks.php
298
- if (stringBeginsWith (Gdn::request ()->getPath (), '/api/ ' ) || stringBeginsWith (Gdn:: request ()-> getPath (), ' / entry/ ' )) {
297
+ if (stringBeginsWith (Gdn::request ()->getPath (), '/entry/ ' )) {
299
298
return ;
300
299
}
301
300
302
301
$ cookieName = c ('Plugins.Topcoder.SSO.CookieName ' );
303
- self ::log ('Cookie Name ' , ['value ' => $ cookieName ]);
302
+ self ::log ('Cookie Name ' , ['value ' => $ cookieName ]);
304
303
305
304
$ cookiesToken = isset ($ _COOKIE [$ cookieName ]) ? $ _COOKIE [$ cookieName ] : null ;
306
-
307
305
$ headersToken = $ this ->getBearerToken ();
308
- $ accessToken = $ headersToken ? $ headersToken : $ cookiesToken ;
309
306
310
307
if ($ cookiesToken ) {
311
- self ::log ('Token from Cookies ' , ['value ' => $ cookiesToken ]);
308
+ self ::log ('Token from Cookies ' , ['value ' => $ cookiesToken ]);
312
309
}
313
310
if ($ headersToken ) {
314
- self ::log ('Token from Headers ' , ['value ' => '' . $ headersToken ]);
311
+ self ::log ('Token from Headers ' , ['value ' => '' . $ headersToken ]);
312
+ }
313
+
314
+ $ accessToken = null ;
315
+
316
+ if (stringBeginsWith (Gdn::request ()->getPath (), '/api/ ' )) {
317
+ if (stringBeginsWith (Gdn::request ()->getPath (), '/api/v2/users/me-preferences ' ) ||
318
+ stringBeginsWith (Gdn::request ()->getPath (), '/api/v2/discussions/bookmarked ' ) ||
319
+ (stringBeginsWith (Gdn::request ()->getPath (), '/api/v2/discussions/ ' )
320
+ && stringEndsWith (Gdn::request ()->getPath (), '/bookmark ' ))) {
321
+ $ accessToken = $ headersToken ;
322
+ } else {
323
+ // Ignore other ApiController endpoints.
324
+ // AccessToken for /api will be checked in class.hooks.php
325
+ return ;
326
+ }
327
+ } else {
328
+ $ accessToken = $ cookiesToken ;
315
329
}
316
330
317
331
if ($ accessToken ) {
@@ -2122,6 +2136,163 @@ public function discussionController_announce_create($sender, $discussionID = '
2122
2136
2123
2137
$ sender ->render ('Blank ' , 'Utility ' , 'Dashboard ' );
2124
2138
}
2139
+
2140
+ /**
2141
+ * Edit user's preferences (mostly notification settings).
2142
+ *
2143
+ * @param mixed $userReference Unique identifier, possibly username or ID.
2144
+ * @param string $username .
2145
+ * @param int $userID Unique identifier.
2146
+ */
2147
+ public function profileController_preferences_create ($ sender , $ userReference = '' , $ username = '' , $ userID = '' ) {
2148
+ $ sender ->addJsFile ('profile.js ' );
2149
+ $ session = Gdn::session ();
2150
+ $ sender ->permission ('Garden.SignIn.Allow ' );
2151
+
2152
+ // Get user data
2153
+ $ sender ->getUserInfo ($ userReference , $ username , $ userID , true );
2154
+ $ userPrefs = dbdecode ($ sender ->User ->Preferences );
2155
+ if ($ sender ->User ->UserID != $ session ->UserID ) {
2156
+ $ sender ->permission (['Garden.Users.Edit ' , 'Moderation.Profiles.Edit ' ], false );
2157
+ }
2158
+
2159
+ if (!is_array ($ userPrefs )) {
2160
+ $ userPrefs = [];
2161
+ }
2162
+
2163
+ $ metaPrefs = [];// UserModel::getMeta($this->User->UserID, 'Preferences.%', 'Preferences.');
2164
+
2165
+ // Define the preferences to be managed
2166
+ $ notifications = [];
2167
+
2168
+ if (c ('Garden.Profile.ShowActivities ' , true )) {
2169
+ $ notifications = [
2170
+ 'Email.WallComment ' => t ('Notify me when people write on my wall. ' ),
2171
+ 'Email.ActivityComment ' => t ('Notify me when people reply to my wall comments. ' ),
2172
+ 'Popup.WallComment ' => t ('Notify me when people write on my wall. ' ),
2173
+ 'Popup.ActivityComment ' => t ('Notify me when people reply to my wall comments. ' )
2174
+ ];
2175
+ }
2176
+
2177
+ $ sender ->Preferences = ['Notifications ' => $ notifications ];
2178
+
2179
+ // Allow email notification of applicants (if they have permission & are using approval registration)
2180
+ if (checkPermission ('Garden.Users.Approve ' ) && c ('Garden.Registration.Method ' ) == 'Approval ' ) {
2181
+ $ sender ->Preferences ['Notifications ' ]['Email.Applicant ' ] = [t ('NotifyApplicant ' , 'Notify me when anyone applies for membership. ' ), 'Meta ' ];
2182
+ }
2183
+
2184
+ $ sender ->fireEvent ('AfterPreferencesDefined ' );
2185
+
2186
+ // Loop through the preferences looking for duplicates, and merge into a single row
2187
+ $ sender ->PreferenceGroups = [];
2188
+ $ sender ->PreferenceTypes = [];
2189
+ foreach ($ sender ->Preferences as $ preferenceGroup => $ preferences ) {
2190
+ $ sender ->PreferenceGroups [$ preferenceGroup ] = [];
2191
+ $ sender ->PreferenceTypes [$ preferenceGroup ] = [];
2192
+ foreach ($ preferences as $ name => $ description ) {
2193
+ $ location = 'Prefs ' ;
2194
+ if (is_array ($ description )) {
2195
+ list ($ description , $ location ) = $ description ;
2196
+ }
2197
+
2198
+ $ nameParts = explode ('. ' , $ name );
2199
+ $ prefType = val ('0 ' , $ nameParts );
2200
+ $ subName = val ('1 ' , $ nameParts );
2201
+ if ($ subName != false ) {
2202
+ // Save an array of all the different types for this group
2203
+ if (!in_array ($ prefType , $ sender ->PreferenceTypes [$ preferenceGroup ])) {
2204
+ $ sender ->PreferenceTypes [$ preferenceGroup ][] = $ prefType ;
2205
+ }
2206
+
2207
+ // Store all the different subnames for the group
2208
+ if (!array_key_exists ($ subName , $ sender ->PreferenceGroups [$ preferenceGroup ])) {
2209
+ $ sender ->PreferenceGroups [$ preferenceGroup ][$ subName ] = [$ name ];
2210
+ } else {
2211
+ $ sender ->PreferenceGroups [$ preferenceGroup ][$ subName ][] = $ name ;
2212
+ }
2213
+ } else {
2214
+ $ sender ->PreferenceGroups [$ preferenceGroup ][$ name ] = [$ name ];
2215
+ }
2216
+ }
2217
+ }
2218
+
2219
+ // Loop the preferences, setting defaults from the configuration.
2220
+ $ currentPrefs = [];
2221
+ foreach ($ sender ->Preferences as $ prefGroup => $ prefs ) {
2222
+ foreach ($ prefs as $ pref => $ desc ) {
2223
+ $ location = 'Prefs ' ;
2224
+ if (is_array ($ desc )) {
2225
+ list ($ desc , $ location ) = $ desc ;
2226
+ }
2227
+
2228
+ if ($ location == 'Meta ' ) {
2229
+ $ currentPrefs [$ pref ] = val ($ pref , $ metaPrefs , false );
2230
+ } else {
2231
+ $ currentPrefs [$ pref ] = val ($ pref , $ userPrefs , c ('Preferences. ' .$ pref , '0 ' ));
2232
+ }
2233
+
2234
+ unset($ metaPrefs [$ pref ]);
2235
+ }
2236
+ }
2237
+ $ currentPrefs = array_merge ($ currentPrefs , $ metaPrefs );
2238
+ $ currentPrefs = array_map ('intval ' , $ currentPrefs );
2239
+ $ sender ->setData ('Preferences ' , $ currentPrefs );
2240
+
2241
+ if (UserModel::noEmail ()) {
2242
+ $ sender ->PreferenceGroups = self ::_removeEmailPreferences ($ sender ->PreferenceGroups );
2243
+ $ sender ->PreferenceTypes = self ::_removeEmailPreferences ($ sender ->PreferenceTypes );
2244
+ $ sender ->setData ('NoEmail ' , true );
2245
+ }
2246
+
2247
+ $ sender ->setData ('PreferenceGroups ' , $ sender ->PreferenceGroups );
2248
+ $ sender ->setData ('PreferenceTypes ' , $ sender ->PreferenceTypes );
2249
+ $ sender ->setData ('PreferenceList ' , $ sender ->Preferences );
2250
+
2251
+ if ($ sender ->Form ->authenticatedPostBack ()) {
2252
+ // Get, assign, and save the preferences.
2253
+ $ newMetaPrefs = [];
2254
+ foreach ($ sender ->Preferences as $ prefGroup => $ prefs ) {
2255
+ foreach ($ prefs as $ pref => $ desc ) {
2256
+ $ location = 'Prefs ' ;
2257
+ if (is_array ($ desc )) {
2258
+ list ($ desc , $ location ) = $ desc ;
2259
+ }
2260
+
2261
+ $ value = $ sender ->Form ->getValue ($ pref , null );
2262
+ if (is_null ($ value )) {
2263
+ continue ;
2264
+ }
2265
+
2266
+ if ($ location == 'Meta ' ) {
2267
+ // $newMetaPrefs[$pref] = $value ? $value : null;
2268
+ // if ($value) {
2269
+ // $userPrefs[$pref] = $value; // dup for notifications code.
2270
+ // }
2271
+ } else {
2272
+ if (!$ currentPrefs [$ pref ] && !$ value ) {
2273
+ unset($ userPrefs [$ pref ]); // save some space
2274
+ } else {
2275
+ $ userPrefs [$ pref ] = $ value ;
2276
+ }
2277
+ }
2278
+ }
2279
+ }
2280
+
2281
+ $ sender ->UserModel ->savePreference ($ sender ->User ->UserID , $ userPrefs );
2282
+ // UserModel::setMeta($this->User->UserID, $newMetaPrefs, 'Preferences.');
2283
+ $ sender ->setData ('Preferences ' , array_merge ($ sender ->data ('Preferences ' , []), $ userPrefs , $ newMetaPrefs ));
2284
+
2285
+ if (count ($ sender ->Form ->errors () == 0 )) {
2286
+ $ sender ->informMessage (sprite ('Check ' , 'InformSprite ' ).t ('Your preferences have been saved. ' ), 'Dismissable AutoDismiss HasSprite ' );
2287
+ }
2288
+ } else {
2289
+ $ sender ->Form ->setData ($ currentPrefs );
2290
+ }
2291
+
2292
+ $ sender ->title (t ('Notification Preferences ' ));
2293
+ $ sender ->_setBreadcrumbs ($ sender ->data ('Title ' ), $ sender ->canonicalUrl ());
2294
+ $ sender ->render ();
2295
+ }
2125
2296
}
2126
2297
2127
2298
if (!function_exists ('topcoderRatingCssClass ' )) {
0 commit comments