Skip to content

Commit bc5e73e

Browse files
authored
Merge pull request #13 from cytechmobile/feat/jwt
feat(jwt): Added support for RS256-signed JWT authentication.
2 parents 85ccc33 + 668d1c1 commit bc5e73e

File tree

9 files changed

+255
-56
lines changed

9 files changed

+255
-56
lines changed

.wordpress-org/screenshot-10.png

36 KB
Loading

.wordpress-org/screenshot-11.png

50.3 KB
Loading

buddymeet.php

Lines changed: 80 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
Plugin Name: BuddyMeet
44
Plugin URI:
55
Description: Adds a meeting room with video and audio capabilities to BuddyPress. Powered by <a target="_blank" href="https://jitsi.org/"> Jitsi Meet </a>.
6-
Version: 2.5.0
6+
Version: 2.6.0
77
Requires at least: 4.6.0
88
Tags: buddypress
99
License: GPL V2
@@ -21,6 +21,19 @@
2121
* Main BuddyMeet Class
2222
*/
2323
class BuddyMeet {
24+
public $version;
25+
public $file;
26+
public $basename;
27+
public $plugin_dir;
28+
public $plugin_url;
29+
public $includes_dir;
30+
public $lang_dir;
31+
public $buddymeet_slug;
32+
public $includes_url;
33+
public $buddymeet_name;
34+
public $domain;
35+
public $errors;
36+
2437

2538
const USER_ROOMS_PREFIX = 'buddymeet_user_room_';
2639
const ROOM_MEMBERS_PREFIX = 'buddymeet_room_members_';
@@ -37,7 +50,7 @@ class BuddyMeet {
3750
*
3851
* @var string
3952
*/
40-
public static $required_bp_version = '2.5.0';
53+
public static $required_bp_version = '2.6.0';
4154

4255
/**
4356
* BuddyPress config.
@@ -86,7 +99,7 @@ private function __construct() { /* Do nothing here */ }
8699
* @uses plugin_dir_url() to build BuddyMeet plugin url
87100
*/
88101
private function setup_globals() {
89-
$this->version = '2.5.0';
102+
$this->version = '2.6.0';
90103

91104
// Setup some base path and URL information
92105
$this->file = __FILE__;
@@ -120,6 +133,7 @@ private function setup_globals() {
120133
private function includes() {
121134
require( $this->includes_dir . 'buddymeet-actions.php' );
122135
require( $this->includes_dir . 'buddymeet-functions.php' );
136+
require( $this->includes_dir . 'buddymeet-jwt-class.php' );
123137

124138
//TODO CHECK ADMIN INTERFACES
125139
/*if( is_admin() ){
@@ -179,7 +193,25 @@ public function display_admin_menu_page(){ ?>
179193
<table class="form-table">
180194
<tr>
181195
<th scope="row"><?php echo __( 'Default Jitsi Domain', 'buddymeet' ); ?></th>
182-
<td><input type="text" name="buddymeet_jitsi_domain" value="<?php echo BuddyMeet::get_default_jitsi_domain(); ?>"/></td>
196+
<td><input type="text" style="width: 80%" name="buddymeet_jitsi_domain" value="<?php echo BuddyMeet::get_default_jitsi_domain(); ?>"/></td>
197+
</tr>
198+
<tr>
199+
<th scope="row"><?php echo __( 'Application ID', 'buddymeet' ); ?></th>
200+
<td><input style="width: 80%" type="text" name="buddymeet_jitsi_appid" value="<?php echo get_option('buddymeet_jitsi_appid', ""); ?>"/></td>
201+
</tr>
202+
<tr>
203+
<th scope="row"><?php echo __( 'Key ID', 'buddymeet' ); ?></th>
204+
<td>
205+
<input style="width: 80%" type="text" name="buddymeet_jitsi_apikeyid" value="<?php echo get_option('buddymeet_jitsi_apikeyid', ""); ?>"/>
206+
<p class="description"> <?php esc_html_e( 'For the 8x8.vc domain, enter your API Key ID here. For self‑hosted servers, you may enter any value.', 'buddymeet' ); ?></p>
207+
</td>
208+
</tr>
209+
<tr>
210+
<th scope="row"><?php echo __( 'Private Key', 'buddymeet' ); ?></th>
211+
<td>
212+
<textarea style="width: 80%;" rows="10" name="buddymeet_jitsi_privatekey" placeholder="<?php echo get_option( 'buddymeet_jitsi_privatekey', '' ) ? esc_attr__( '************************************** (For security reasons the private key is not displayed)', 'buddymeet' ) : '';?>"></textarea>
213+
<p class="description"> <?php esc_html_e( 'Paste your PEM‑encoded private key here to update it. Leave blank to keep the current key.', 'buddymeet' ); ?></p>
214+
</td>
183215
</tr>
184216
</table>
185217
<?php submit_button(); ?>
@@ -188,6 +220,19 @@ public function display_admin_menu_page(){ ?>
188220

189221
public function register_settings() {
190222
register_setting( 'buddymeet-settings', 'buddymeet_jitsi_domain' );
223+
register_setting( 'buddymeet-settings', 'buddymeet_jitsi_appid' );
224+
register_setting( 'buddymeet-settings', 'buddymeet_jitsi_apikeyid' );
225+
register_setting( 'buddymeet-settings', 'buddymeet_jitsi_privatekey' );
226+
register_setting( 'buddymeet-settings', 'buddymeet_jitsi_privatekey',
227+
['sanitize_callback' => array($this, 'buddymeet_sanitize_privatekey') ]);
228+
}
229+
230+
public function buddymeet_sanitize_privatekey( $new_value ) {
231+
if ( trim( $new_value ) === '' ) {
232+
return get_option( 'buddymeet_jitsi_privatekey', '' );
233+
}
234+
235+
return $new_value;
191236
}
192237

193238
public function set_default_groups_nav() {
@@ -257,7 +302,7 @@ public function enqueue_scripts(){
257302
));
258303

259304
$handle = 'buddymeet-jitsi-js';
260-
wp_enqueue_script( $handle, "https://8x8.vc/external_api.js", array(), buddymeet_get_version(), true);
305+
wp_enqueue_script( $handle, "https://8x8.vc/libs/external_api.min.js", array(), buddymeet_get_version(), true);
261306
}
262307
}
263308

@@ -439,12 +484,31 @@ public function add_shortcode($params) {
439484
return esc_js($item);
440485
}, $params);
441486

487+
$app_id = get_option('buddymeet_jitsi_appid', "");
488+
$key_id = get_option('buddymeet_jitsi_apikeyid', "");
489+
$private_key = get_option('buddymeet_jitsi_privatekey', "");
490+
$jwt_generator = new BuddyMeet_JWT($app_id, $key_id, $private_key);
491+
492+
$user_data = [
493+
'id' => isset($params['user_id']) ? $params['user_id'] : '',
494+
'name' => isset($params['user']) ? $params['user'] : '',
495+
'avatar' => isset($params['avatar']) ? $params['avatar'] : '',
496+
'email' => isset($params['email']) ? $params['email'] : '',
497+
];
498+
499+
$room_name = $params['room'];
500+
$jwt = $jwt_generator->generate_token($user_data, $room_name);
501+
error_log($jwt);
502+
if (isset($jwt) && isset($app_id)) {
503+
$room_name = $app_id . '/' . $room_name;
504+
}
505+
442506
$script = sprintf(
443507
$this->get_jitsi_init_template(),
444508
$params['domain'],
445509
$params['settings'],
446510
$params['toolbar'],
447-
$params['room'],
511+
$room_name,
448512
$params['width'],
449513
$params['height'],
450514
$params['parent_node'],
@@ -461,7 +525,8 @@ public function add_shortcode($params) {
461525
isset($params['avatar']) ? $params['avatar'] : '',
462526
isset($params['password']) ? $params['password'] : '',
463527
$hangoutMessage,
464-
$params['mobile_open_in_browser'] === "true" || $params['mobile_open_in_browser'] === true ? 1 : 0
528+
$params['mobile_open_in_browser'] === "true" || $params['mobile_open_in_browser'] === true ? 1 : 0,
529+
$jwt
465530
);
466531

467532
if(wp_doing_ajax()){
@@ -470,7 +535,7 @@ public function add_shortcode($params) {
470535
echo '<script>' . $script . '</script>';
471536
} else {
472537
$handle = "buddymeet-jitsi-js";
473-
wp_enqueue_script($handle, "https://8x8.vc/external_api.js", array(), buddymeet_get_version(), true);
538+
wp_enqueue_script($handle, "https://8x8.vc/libs/external_api.min.js", array(), buddymeet_get_version(), true);
474539
wp_add_inline_script($handle, $script);
475540
}
476541

@@ -486,6 +551,7 @@ public function get_jitsi_init_template(){
486551
width: "%5$s",
487552
height: %6$d,
488553
parentNode: document.querySelector("%7$s"),
554+
jwt: "%22$s",
489555
configOverwrite: {
490556
startAudioOnly: %8$b === 1,
491557
defaultLanguage: "%9$s",
@@ -533,9 +599,15 @@ public function buddymeet_post_settings($settings){
533599
if ($post && has_shortcode($post->post_content, buddymeet_get_slug())) {
534600
$user = wp_get_current_user();
535601
if($user->exists()) {
602+
if (!array_key_exists('user_id', $settings)) {
603+
$extra['user_id'] = $user->ID;
604+
}
536605
if (!array_key_exists('user', $settings)) {
537606
$extra['user'] = $user->display_name;
538607
}
608+
if (!array_key_exists('email', $settings)) {
609+
$extra['email'] = $user->user_email;
610+
}
539611
if (!array_key_exists('avatar', $settings)) {
540612
$extra['avatar'] = get_avatar_url($user->ID);
541613
}

includes/buddymeet-component-class.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ public function setup_nav( $main_nav = array(), $sub_nav = array() ) {
9898

9999
if ( bp_is_groups_component() && bp_is_single_item() ) {
100100
$group = ($groups_template !== null && $groups_template->group) ? $groups_template->group : groups_get_current_group();
101-
$group_link = bp_get_group_permalink( $group );
101+
$group_link = buddymeet_get_group_url( $group );
102102
$slug = buddymeet_get_slug();
103103
$budddymeet_link = trailingslashit($group_link . $slug);
104104

@@ -233,13 +233,13 @@ public function members_send_invites() {
233233
}
234234

235235
$group = groups_get_group( $group_id );
236-
$group_link = bp_get_group_permalink( $group );
236+
$group_link = buddymeet_get_group_url( $group );
237237
$meet_link = $group_link . buddymeet_get_slug() . '/members/' . $room;
238238

239239
$args = array(
240240
'tokens' => array(
241241
'group' => $group,
242-
'group.url' => bp_get_group_permalink( $group ),
242+
'group.url' => buddymeet_get_group_url( $group ),
243243
'group.name' => $group->name,
244244
'inviter.name' => bp_core_get_userlink($requesting_user_id, true, false),
245245
'inviter.url' => bp_core_get_user_domain( $requesting_user_id ),
@@ -271,7 +271,7 @@ public function members_delete_room() {
271271
$this->remove_users_from_room($group_id, array($user_id), $room);
272272

273273
$group = groups_get_group( $group_id );
274-
$group_link = bp_get_group_permalink( $group );
274+
$group_link = buddymeet_get_group_url( $group );
275275
$meet_link = $group_link . 'buddymeet/members/';
276276
$return = array('redirect' => $meet_link);
277277

@@ -296,7 +296,7 @@ public function format_notifications($action, $item_id, $secondary_item_id, $tot
296296
$text = sprintf( __( '%s: User %s sent you a meet request', 'buddymeet' ), $group->name, $user_fullname );
297297
}
298298

299-
$group_link = bp_get_group_permalink( $group );
299+
$group_link = buddymeet_get_group_url( $group );
300300

301301
$notification_link = $group_link . buddymeet_get_slug() . '/members/' . $room;
302302

includes/buddymeet-functions.php

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -301,19 +301,24 @@ function buddymeet_render_jitsi_meet($room = null, $subject = null){
301301
}
302302

303303
global $bp;
304-
$group_id = $bp->groups->current_group->id;
304+
$group_id = bp_get_current_group_id();
305305

306306
if(is_null($room)){
307307
$room = buddymeet_groups_get_groupmeta( $group_id, 'buddymeet_room', true);
308308
}
309309

310310
if(is_null($subject)){
311-
$group_name = esc_js($bp->groups->current_group->name);
312-
$subject = $group_name;
311+
$current_group = groups_get_current_group();
312+
if ( $current_group ) {
313+
$subject = esc_js($current_group->name);
314+
}
313315
}
314316

315-
$user_name = esc_js($bp->loggedin_user->userdata->display_name);
316-
$avatar_url = esc_js(get_avatar_url($bp->loggedin_user->userdata->ID));
317+
$user = $bp->loggedin_user->userdata;
318+
$user_id = esc_js($user->ID);
319+
$user_name = esc_js($user->display_name);
320+
$user_email = esc_js($user->user_email);
321+
$avatar_url = esc_js(get_avatar_url($user_id));
317322

318323
//apply group settings
319324
$password = buddymeet_groups_get_groupmeta( $group_id, 'buddymeet_password', true);
@@ -337,6 +342,8 @@ function buddymeet_render_jitsi_meet($room = null, $subject = null){
337342
room = "' . $room . '"
338343
subject = "' . $subject . '"
339344
user = "' . $user_name . '"
345+
user_id = "' . $user_id . '"
346+
email = "' . $user_email . '"
340347
avatar = "' . $avatar_url . '"
341348
password = "' . $password . '"
342349
domain = "' . $domain . '"
@@ -371,3 +378,13 @@ function buddymeet_generate_unique_room() {
371378
mt_rand( 0, 0xffff )
372379
);
373380
}
381+
382+
function buddymeet_get_group_url($group) {
383+
if ( function_exists( 'bp_get_group_url' ) ) {
384+
$group_link = bp_get_group_url( $group );
385+
} else {
386+
// Fallback to deprecated function for older BP versions
387+
$group_link = buddymeet_get_group_url( $group );
388+
}
389+
return $group_link;
390+
}

0 commit comments

Comments
 (0)