Skip to content

Commit

Permalink
Merge pull request #10 from a8cteam51/develop
Browse files Browse the repository at this point in the history
Add server field and validation
  • Loading branch information
NickGreen authored Apr 18, 2024
2 parents ba53978 + 0480c5e commit 9ed856f
Show file tree
Hide file tree
Showing 3 changed files with 134 additions and 41 deletions.
27 changes: 17 additions & 10 deletions feedland-blogroll.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
* Description: Show a Blogroll on your site.
* Requires at least: 6.1
* Requires PHP: 7.4
* Version: 1.1.0
* Author: WordPress.com Special Projects
* Version: 1.1.1
* Author: WordPress.com Special Projects & Dave Winer
* Author URI: https://wpspecialprojects.wordpress.com
* Update URI: https://github.com/a8cteam51/feedland-blogroll
* License: GPL-2.0-or-later
Expand All @@ -26,7 +26,8 @@
define( 'FEEDLAND_BLOGROLL_PATH', plugin_dir_path( __FILE__ ) );

define( 'FEEDLAND_DEFAULT_SERVER', 'https://feedland.com/' );
define( 'FEEDLAND_DEFAULT_USERNAME', 'davewiner' );
define( 'FEEDLAND_DEFAULT_USERNAME', '' );
define( 'FEEDLAND_DEFAULT_CATEGORY', '' );

require_once 'includes/settings.php';
require_once 'includes/self-update.php';
Expand Down Expand Up @@ -151,7 +152,6 @@ function feedland_blogroll_enqueue_scripts(): void {
'BLOGROLL_OPTIONS',
array(
'title' => $options['feedland_blogroll_title'],
'flDisplayTitle' => $options['feedland_blogroll_flDisplayTitle'] ?? false, // Prevents a warning if settings are saved and checkbox is unchecked.
'urlBlogrollOpml' => feedland_get_opml_url(),
'urlFeedlandViewBlogroll' => feedland_get_blogroll_url(),
'maxItemsInBlogroll' => 40,
Expand Down Expand Up @@ -189,7 +189,7 @@ function feedland_blogroll_default_options(): void {
// Set default option values if not already set
$defaults = array(
'feedland_blogroll_title' => __( 'My Blogroll', 'feedland-blogroll' ),
'feedland_blogroll_flDisplayTitle' => '1',
'feedland_blogroll_category' => FEEDLAND_DEFAULT_CATEGORY,
'feedland_blogroll_server' => FEEDLAND_DEFAULT_SERVER,
'feedland_blogroll_username' => FEEDLAND_DEFAULT_USERNAME,
'feedland_blogroll_urlBlogrollOpml' => feedland_get_opml_url(),
Expand All @@ -213,16 +213,20 @@ function feedland_blogroll_default_options(): void {
*
* @return string
*/
function feedland_get_opml_url() {
function feedland_get_opml_url( $category = FEEDLAND_DEFAULT_CATEGORY ) {
$options = get_option( 'feedland_blogroll_options' );

return add_query_arg(
array_filter(
array(
'screenname' => $options['feedland_blogroll_username'] ?: FEEDLAND_DEFAULT_USERNAME, // phpcs:ignore Universal.Operators.DisallowShortTernary.Found
// phpcs:ignore WordPress.PHP.DisallowShortTernary.Found
'screenname' => $options['feedland_blogroll_username'] ?: FEEDLAND_DEFAULT_USERNAME,
// phpcs:ignore WordPress.PHP.DisallowShortTernary.Found
'catname' => $category ?: $options['feedland_blogroll_category'],
)
),
FEEDLAND_DEFAULT_SERVER . 'opml'
// phpcs:ignore WordPress.PHP.DisallowShortTernary.Found
trailingslashit( $options['feedland_blogroll_server'] ?: FEEDLAND_DEFAULT_SERVER ) . 'opml'
);
}

Expand All @@ -237,9 +241,12 @@ function feedland_get_blogroll_url() {
return add_query_arg(
array_filter(
array(
'username' => $options['feedland_blogroll_username'] ?: FEEDLAND_DEFAULT_USERNAME, // phpcs:ignore Universal.Operators.DisallowShortTernary.Found
// phpcs:ignore WordPress.PHP.DisallowShortTernary.Found
'username' => $options['feedland_blogroll_username'] ?: FEEDLAND_DEFAULT_USERNAME,
'catname' => $options['feedland_blogroll_category'],
)
),
FEEDLAND_DEFAULT_SERVER
// phpcs:ignore WordPress.PHP.DisallowShortTernary.Found
trailingslashit( $options['feedland_blogroll_server'] ?: FEEDLAND_DEFAULT_SERVER )
);
}
2 changes: 1 addition & 1 deletion includes/self-update.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ function feedland_blogroll_self_update( $update, array $plugin_data, string $plu
);

if ( is_wp_error( $response ) ) {
return;
return false;
} else {
$output = json_decode( wp_remote_retrieve_body( $response ), true );
}
Expand Down
146 changes: 116 additions & 30 deletions includes/settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -66,39 +66,57 @@ function feedland_blogroll_settings_init(): void {
'feedland_blogroll_settings',
'feedland_blogroll_settings_section',
array(
'label_for' => 'feedland_blogroll_title',
'type' => 'text',
'name' => 'feedland_blogroll_title',
'class' => 'regular-text', // Class for styling if needed
'label_for' => 'feedland_blogroll_title',
'type' => 'text',
'name' => 'feedland_blogroll_title',
'class' => 'regular-text', // Class for styling if needed
'description' => esc_html__( 'The title appears at the top of the blogroll box. It defaults to My Blogroll.', 'feedland-blogroll' ),
)
);

add_settings_field(
'feedland_blogroll_flDisplayTitle',
__( 'Display Title', 'feedland-blogroll' ),
'feedland_blogroll_username',
__( 'FeedLand username', 'feedland-blogroll' ),
'feedland_blogroll_settings_field_callback',
'feedland_blogroll_settings',
'feedland_blogroll_settings_section',
array(
'label_for' => 'feedland_blogroll_flDisplayTitle',
'type' => 'checkbox',
'name' => 'feedland_blogroll_flDisplayTitle',
'class' => '',
'label_for' => 'feedland_blogroll_username',
'type' => 'text',
'name' => 'feedland_blogroll_username',
'class' => 'regular-text',
'description' => esc_html__( 'The username of the account whose blogroll you want shown. (Required)', 'feedland-blogroll' ),
)
);

add_settings_field(
'feedland_blogroll_username',
__( 'FeedLand Username', 'feedland-blogroll' ),
'feedland_blogroll_server',
__( 'FeedLand server', 'feedland-blogroll' ),
'feedland_blogroll_settings_field_callback',
'feedland_blogroll_settings',
'feedland_blogroll_settings_section',
array(
'label_for' => 'feedland_blogroll_username',
'label_for' => 'feedland_blogroll_server',
'type' => 'url',
'name' => 'feedland_blogroll_server',
'class' => 'regular-text',
'placeholder' => FEEDLAND_DEFAULT_SERVER,
'description' => esc_html__( 'The server that account is on. (Defaults to feedland.com, required)', 'feedland-blogroll' ),
)
);

add_settings_field(
'feedland_blogroll_category',
__( 'Category (optional)', 'feedland-blogroll' ),
'feedland_blogroll_settings_field_callback',
'feedland_blogroll_settings',
'feedland_blogroll_settings_section',
array(
'label_for' => 'feedland_blogroll_category',
'type' => 'text',
'name' => 'feedland_blogroll_username',
'name' => 'feedland_blogroll_category',
'class' => 'regular-text',
'description' => esc_html__( 'Username associated with the FeedLand feed you want to display on your site.', 'feedland-blogroll' ),
'description' => esc_html__( 'You can choose only to have feeds from a specific category in the blogroll, if you want all the feeds you\'ve subscribed to, leave this blank.', 'feedland-blogroll' ),
)
);
}
Expand Down Expand Up @@ -174,35 +192,103 @@ function feedland_blogroll_add_action_links( array $links ): array {
* @return array Validated options
*/
function feedland_blogroll_validate_options( array $input ): array {
$input = array_map( 'sanitize_text_field', $input );
$user_endpoint = sprintf( '%1$sisuserindatabase?screenname=%2$s', FEEDLAND_DEFAULT_SERVER, $input['feedland_blogroll_username'] );

$request = wp_remote_get( $user_endpoint );
// Validate server URL
if ( ! empty( $input['feedland_blogroll_server'] ) ) {
// Ensure the server URL is properly formatted and sanitize it
if ( filter_var( $input['feedland_blogroll_server'], FILTER_VALIDATE_URL ) ) {
$input['feedland_blogroll_server'] = esc_url_raw( $input['feedland_blogroll_server'] );
} else {
add_settings_error(
'feedland_blogroll_settings',
'feedland_blogroll_server',
esc_html__( 'The FeedLand server URL is not valid.', 'feedland-blogroll' )
);
$input['feedland_blogroll_server'] = FEEDLAND_DEFAULT_SERVER;
}
} else {
$input['feedland_blogroll_server'] = FEEDLAND_DEFAULT_SERVER;
}

if ( is_wp_error( $request ) ) {
// Sanitize and validate username
if ( ! empty( trim( $input['feedland_blogroll_username'] ) ) ) {
$input['feedland_blogroll_username'] = sanitize_text_field( $input['feedland_blogroll_username'] );
} else {
add_settings_error(
'feedland_blogroll_settings',
'feedland_blogroll_username',
esc_html__( 'There was an error communicating with the server.', 'feedland-blogroll' )
sprintf(
/* translators: %s: Default username placeholder */
esc_html__( 'The username cannot be empty.', 'feedland-blogroll' ),
FEEDLAND_DEFAULT_USERNAME
)
);

$input['feedland_blogroll_username'] = FEEDLAND_DEFAULT_USERNAME;
}

$response = json_decode( wp_remote_retrieve_body( $request ), true );
// Now that we have sanitized server and username, we can perform the remote check
$user_endpoint = sprintf( '%1$sisuserindatabase?screenname=%2$s', $input['feedland_blogroll_server'], $input['feedland_blogroll_username'] );

$request = wp_remote_get( $user_endpoint );

if ( ! $response['flInDatabase'] ) {
// Handle error in communication with the server
if ( is_wp_error( $request ) ) {
add_settings_error(
'feedland_blogroll_settings',
'feedland_blogroll_username',
sprintf(
/* translators: %s: Default username placeholder */
esc_html__( 'The username provided is not associated with a FeedLand account. Using default "%s".', 'feedland-blogroll' ),
FEEDLAND_DEFAULT_USERNAME
'feedland_blogroll_server',
esc_html__( 'There was an error communicating with the server. Resetting to default server.', 'feedland-blogroll' )
);
$input['feedland_blogroll_server'] = FEEDLAND_DEFAULT_SERVER;
} else {
$response = json_decode( wp_remote_retrieve_body( $request ), true );

// Verify that the username exists in the database
if ( ! $response['flInDatabase'] ) {
add_settings_error(
'feedland_blogroll_settings',
'feedland_blogroll_username',
esc_html__( 'The username provided is not associated with a FeedLand account.', 'feedland-blogroll' )
);

$input['feedland_blogroll_username'] = FEEDLAND_DEFAULT_USERNAME;
}
}
if ( ! empty( trim( $input['feedland_blogroll_category'] ) ) ) {
// Validate category, since username is now validated or default.
$request = wp_remote_get(
add_query_arg(
array(
'url' => rawurlencode( feedland_get_opml_url( $input['feedland_blogroll_category'] ) ),
),
FEEDLAND_DEFAULT_SERVER . 'getfeedlistfromopml'
)
);

$input['feedland_blogroll_username'] = FEEDLAND_DEFAULT_USERNAME;
if ( is_wp_error( $request ) ) {
add_settings_error(
'feedland_blogroll_settings',
'feedland_blogroll_category',
esc_html__( 'There was an error communicating with the server.', 'feedland-blogroll' )
);

$input['feedland_blogroll_category'] = FEEDLAND_DEFAULT_CATEGORY;
}

$response = json_decode( wp_remote_retrieve_body( $request ), true );

// If the response contains a message, the category does not exist.
if ( array_key_exists( 'message', $response ) ) {
add_settings_error(
'feedland_blogroll_settings',
'feedland_blogroll_category',
sprintf(
/* translators: %s: Default category placeholder */
esc_html__( 'The user does not have that category in their feed.', 'feedland-blogroll' ),
FEEDLAND_DEFAULT_CATEGORY
)
);

$input['feedland_blogroll_category'] = FEEDLAND_DEFAULT_CATEGORY;
}
}

return $input;
Expand Down

0 comments on commit 9ed856f

Please sign in to comment.