Theme My Login - Version 7.0.8

Version Description

  • Fix slow-loading extensions page
  • Add dismissible notice of latest available extension
  • Fix "stuck" license status by verifying when visiting the licenses page
  • Ensure a form field object is returned when adding a form field
  • Fix testcookie step causing a 403 error
  • Fix links not being changed in emails sent from the Dashboard
Download this release

Release Info

Developer jfarthing84
Plugin Icon 128x128 Theme My Login
Version 7.0.8
Comparing to
See all releases

Code changes from version 7.0.7 to 7.0.8

admin/assets/scripts/theme-my-login-admin.js CHANGED
@@ -1,5 +1,20 @@
1
  ( function( $ ) {
2
- $( initMetaBoxes );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
 
4
  function initMetaBoxes() {
5
  var metaboxes = $( '.postbox' );
@@ -24,3 +39,18 @@
24
  }
25
  }
26
  } )( jQuery );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ( function( $ ) {
2
+
3
+ $( initAuthCheckForm );
4
+
5
+ function initAuthCheckForm() {
6
+ var authCheckForm = $( '#wp-auth-check-form' );
7
+
8
+ if ( authCheckForm.length ) {
9
+ authCheckForm.attr( 'data-src', tmlAdmin.interimLoginUrl );
10
+ }
11
+ }
12
+ } )( jQuery );
13
+
14
+ ( function( $ ) {
15
+ if ( $( '#tml-settings' ).length ) {
16
+ $( initMetaBoxes );
17
+ }
18
 
19
  function initMetaBoxes() {
20
  var metaboxes = $( '.postbox' );
39
  }
40
  }
41
  } )( jQuery );
42
+
43
+ ( function( $ ) {
44
+ $( initNotices );
45
+
46
+ function initNotices() {
47
+ $( '.tml-notice' ).on( 'click', '.notice-dismiss', function( e ) {
48
+ var notice = $( e.delegateTarget );
49
+
50
+ $.post( ajaxurl, {
51
+ action: 'tml-dismiss-notice',
52
+ notice: notice.data( 'notice' )
53
+ } );
54
+ } );
55
+ }
56
+ } )( jQuery );
admin/assets/scripts/theme-my-login-admin.min.js CHANGED
@@ -1 +1 @@
1
- !function(s){s(function(){s(".postbox").length&&(postboxes.add_postbox_toggles(pagenow),s(".postbox").addClass("closed"),s(".metabox-holder").each(function(){var o=s(this);"off"==o.data("sortable")&&(o.find(".meta-box-sortables").sortable("destroy"),o.find(".postbox .hndle").css("cursor","default"))}))})}(jQuery);
1
+ !function(o){o(function(){var t=o("#wp-auth-check-form");t.length&&t.attr("data-src",tmlAdmin.interimLoginUrl)})}(jQuery),function(o){o("#tml-settings").length&&o(function(){o(".postbox").length&&(postboxes.add_postbox_toggles(pagenow),o(".postbox").addClass("closed"),o(".metabox-holder").each(function(){var t=o(this);"off"==t.data("sortable")&&(t.find(".meta-box-sortables").sortable("destroy"),t.find(".postbox .hndle").css("cursor","default"))}))})}(jQuery),function(n){n(function(){n(".tml-notice").on("click",".notice-dismiss",function(t){var o=n(t.delegateTarget);n.post(ajaxurl,{action:"tml-dismiss-notice",notice:o.data("notice")})})})}(jQuery);
admin/assets/styles/theme-my-login-admin.css CHANGED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .tml-extensions-wrap {
2
+ margin: 0 -15px;
3
+ }
4
+
5
+ .tml-extensions-wrap:after {
6
+ content: "";
7
+ clear: both;
8
+ display: table;
9
+ }
10
+
11
+ .tml-extensions-wrap * {
12
+ -webkit-box-sizing: border-box;
13
+ box-sizing: border-box;
14
+ }
15
+
16
+ .tml-extension {
17
+ background-color: #fff;
18
+ border: 1px solid #ccc;
19
+ -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
20
+ box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
21
+ float: left;
22
+ margin: 15px;
23
+ max-width: 350px;
24
+ }
25
+
26
+ @media (min-width: 576px) {
27
+ .tml-extension {
28
+ width: 40%;
29
+ }
30
+ }
31
+
32
+ @media (min-width: 783px) {
33
+ .tml-extension {
34
+ width: 30%;
35
+ }
36
+ }
37
+
38
+ .tml-extension-image {
39
+ height: auto;
40
+ max-width: 100%;
41
+ }
42
+
43
+ .tml-extension-body {
44
+ padding: 15px;
45
+ }
46
+
47
+ .tml-extension-body p {
48
+ min-height: 5em;
49
+ }
50
+
51
+ .tml-extension-title {
52
+ margin: 0 0 15px;
53
+ padding: 0;
54
+ }
55
+
56
+ .tml-extension-button {
57
+ background-color: #8d50c3;
58
+ color: #fff;
59
+ display: block;
60
+ font-size: 1.1em;
61
+ padding: 10px;
62
+ text-align: center;
63
+ text-decoration: none;
64
+ }
65
+
66
+ .tml-extension-button:hover {
67
+ color: #fff;
68
+ background-color: #7a3cb0;
69
+ }
70
+
71
+ .tml-extension-button:active,
72
+ .tml-extension-button:focus {
73
+ -webkit-box-shadow: 0 0 0 0.2em rgba(141, 80, 195, 0.5);
74
+ box-shadow: 0 0 0 0.2em rgba(141, 80, 195, 0.5);
75
+ color: #fff;
76
+ }
77
+
78
+ .tml-view-all-extensions-wrap {
79
+ padding: 15px 0;
80
+ text-align: center;
81
+ }
82
+
83
+ .tml-view-all-extensions-link {
84
+ display: inline-block;
85
+ font-size: 1.5em;
86
+ text-decoration: none;
87
+ }
admin/assets/styles/theme-my-login-admin.min.css CHANGED
@@ -0,0 +1 @@
 
1
+ .tml-extensions-wrap{margin:0 -15px}.tml-extensions-wrap:after{content:"";clear:both;display:table}.tml-extensions-wrap *{-webkit-box-sizing:border-box;box-sizing:border-box}.tml-extension{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:0 0 5px rgba(0,0,0,.15);box-shadow:0 0 5px rgba(0,0,0,.15);float:left;margin:15px;max-width:350px}@media (min-width:576px){.tml-extension{width:40%}}@media (min-width:783px){.tml-extension{width:30%}}.tml-extension-image{height:auto;max-width:100%}.tml-extension-body{padding:15px}.tml-extension-body p{min-height:5em}.tml-extension-title{margin:0 0 15px;padding:0}.tml-extension-button{background-color:#8d50c3;color:#fff;display:block;font-size:1.1em;padding:10px;text-align:center;text-decoration:none}.tml-extension-button:hover{color:#fff;background-color:#7a3cb0}.tml-extension-button:active,.tml-extension-button:focus{-webkit-box-shadow:0 0 0 .2em rgba(141,80,195,.5);box-shadow:0 0 0 .2em rgba(141,80,195,.5);color:#fff}.tml-view-all-extensions-wrap{padding:15px 0;text-align:center}.tml-view-all-extensions-link{display:inline-block;font-size:1.5em;text-decoration:none}
admin/extensions.php CHANGED
@@ -22,23 +22,34 @@ function tml_admin_get_extensions_feed( $args = array() ) {
22
  'number' => 12,
23
  ) );
24
 
25
- $url = add_query_arg( $args, THEME_MY_LOGIN_EXTENSIONS_API_URL );
26
 
27
- $response = wp_remote_get( $url );
28
- if ( is_wp_error( $response ) ) {
29
- return $response;
30
- }
31
 
32
- $code = wp_remote_retrieve_response_code( $response );
33
- $message = wp_remote_retrieve_response_message( $response );
 
 
 
 
34
 
35
- if ( '200' != $code ) {
36
- return new WP_Error( 'http_error_' . $code, $message );
37
- }
 
 
 
38
 
39
- $response = json_decode( wp_remote_retrieve_body( $response ) );
40
 
41
- return $response->products;
 
 
 
 
 
42
  }
43
 
44
  /**
@@ -99,104 +110,6 @@ function tml_admin_extensions_page() {
99
  <?php
100
  }
101
 
102
- /**
103
- * Render the extensions styles.
104
- *
105
- * @since 7.0
106
- */
107
- function tml_admin_extensions_styles() {
108
- global $plugin_page;
109
-
110
- if ( 'theme-my-login-extensions' != $plugin_page ) {
111
- return;
112
- }
113
- ?>
114
-
115
- <style type="text/css">
116
- .tml-extensions-wrap {
117
- margin: 0 -15px;
118
- }
119
-
120
- .tml-extensions-wrap:after {
121
- content: "";
122
- clear: both;
123
- display: table;
124
- }
125
-
126
- .tml-extensions-wrap * {
127
- box-sizing: border-box;
128
- }
129
-
130
- .tml-extension {
131
- background-color: #fff;
132
- border: 1px solid #ccc;
133
- box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
134
- float: left;
135
- margin: 15px;
136
- }
137
-
138
- .tml-extension-image {
139
- height: auto;
140
- max-width: 100%;
141
- }
142
-
143
- .tml-extension-body {
144
- padding: 15px;
145
- }
146
-
147
- .tml-extension-title {
148
- margin: 0 0 15px;
149
- padding: 0;
150
- }
151
-
152
- .tml-extension-button {
153
- background-color: #8d50c3;
154
- color: #fff;
155
- display: block;
156
- font-size: 1.1em;
157
- padding: 10px;
158
- text-align: center;
159
- text-decoration: none;
160
- }
161
-
162
- .tml-extension-button:hover {
163
- color: #fff;
164
- background-color: #7a3cb0;
165
- }
166
-
167
- .tml-extension-button:active,
168
- .tml-extension-button:focus {
169
- box-shadow: 0 0 0 0.2em rgba(141, 80, 195, 0.5);
170
- color: #fff;
171
- }
172
-
173
- .tml-view-all-extensions-wrap {
174
- padding: 15px 0;
175
- text-align: center;
176
- }
177
-
178
- .tml-view-all-extensions-link {
179
- display: inline-block;
180
- font-size: 1.5em;
181
- text-decoration: none;
182
- }
183
-
184
- @media (min-width: 576px) {
185
- .tml-extension {
186
- width: 40%;
187
- }
188
- }
189
-
190
- @media (min-width: 783px) {
191
- .tml-extension {
192
- width: 30%;
193
- }
194
- }
195
- </style>
196
-
197
- <?php
198
- }
199
-
200
  /**
201
  * Handle extension license activation and deactivation.
202
  *
@@ -241,3 +154,33 @@ function tml_admin_handle_extension_licenses() {
241
  }
242
  }
243
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  'number' => 12,
23
  ) );
24
 
25
+ $transient_key = 'tml_extensions_feed-' . md5( http_build_query( $args ) );
26
 
27
+ $feed = get_site_transient( $transient_key );
28
+ if ( false === $feed ) {
29
+ $url = add_query_arg( $args, THEME_MY_LOGIN_EXTENSIONS_API_URL );
 
30
 
31
+ $response = wp_remote_get( $url, array(
32
+ 'timeout' => 30,
33
+ ) );
34
+ if ( is_wp_error( $response ) ) {
35
+ return $response;
36
+ }
37
 
38
+ $code = wp_remote_retrieve_response_code( $response );
39
+ $message = wp_remote_retrieve_response_message( $response );
40
+
41
+ if ( '200' != $code ) {
42
+ return new WP_Error( 'http_error_' . $code, $message );
43
+ }
44
 
45
+ $response = json_decode( wp_remote_retrieve_body( $response ) );
46
 
47
+ $feed = $response->products;
48
+
49
+ set_site_transient( $transient_key, $feed, DAY_IN_SECONDS / 2 );
50
+ }
51
+
52
+ return $feed;
53
  }
54
 
55
  /**
110
  <?php
111
  }
112
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
113
  /**
114
  * Handle extension license activation and deactivation.
115
  *
154
  }
155
  }
156
  }
157
+
158
+ /**
159
+ * Check that all of the licenses are valid.
160
+ *
161
+ * @since 7.0.8
162
+ */
163
+ function tml_admin_check_extension_licenses() {
164
+ global $plugin_page;
165
+
166
+ if ( tml_is_post_request() ) {
167
+ return;
168
+ }
169
+
170
+ if ( 'theme-my-login-licenses' != $plugin_page ) {
171
+ return;
172
+ }
173
+
174
+ foreach ( tml_get_extensions() as $extension ) {
175
+ if ( empty( $extension->get_license_key() ) ) {
176
+ continue;
177
+ }
178
+ if ( 'valid' != $extension->get_license_status() ) {
179
+ continue;
180
+ }
181
+ $status = tml_check_extension_license( $extension );
182
+ if ( ! is_wp_error( $status ) ) {
183
+ $extension->set_license_status( $status );
184
+ }
185
+ }
186
+ }
admin/functions.php CHANGED
@@ -121,14 +121,17 @@ function tml_admin_add_menu_items() {
121
  *
122
  * @since 7.0
123
  */
124
- function tml_admin_enqueue_scripts() {
125
- if ( ! tml_admin_is_plugin_page() ) {
126
- return;
127
- }
128
-
129
  $suffix = SCRIPT_DEBUG ? '' : '.min';
130
 
 
131
  wp_enqueue_script( 'theme-my-login-admin', THEME_MY_LOGIN_URL . "admin/assets/scripts/theme-my-login-admin$suffix.js", array( 'jquery', 'postbox' ), THEME_MY_LOGIN_VERSION );
 
 
 
 
 
 
132
  }
133
 
134
  /**
@@ -150,6 +153,46 @@ function tml_admin_notices() {
150
 
151
  <?php
152
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
153
  }
154
 
155
  /**
@@ -277,3 +320,67 @@ function tml_admin_filter_edit_nav_menu_walker( $walker ) {
277
  }
278
  return $walker;
279
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  *
122
  * @since 7.0
123
  */
124
+ function tml_admin_enqueue_style_and_scripts() {
 
 
 
 
125
  $suffix = SCRIPT_DEBUG ? '' : '.min';
126
 
127
+ wp_enqueue_style( 'theme-my-login-admin', THEME_MY_LOGIN_URL . "admin/assets/styles/theme-my-login-admin$suffix.css", array(), THEME_MY_LOGIN_VERSION );
128
  wp_enqueue_script( 'theme-my-login-admin', THEME_MY_LOGIN_URL . "admin/assets/scripts/theme-my-login-admin$suffix.js", array( 'jquery', 'postbox' ), THEME_MY_LOGIN_VERSION );
129
+ wp_localize_script( 'theme-my-login-admin', 'tmlAdmin', array(
130
+ 'interimLoginUrl' => site_url( add_query_arg( array(
131
+ 'interim-login' => 1,
132
+ 'wp_lang' => get_user_locale(),
133
+ ), 'wp-login.php' ), 'login' ),
134
+ ) );
135
  }
136
 
137
  /**
153
 
154
  <?php
155
  }
156
+
157
+ $response = tml_admin_get_extensions_feed();
158
+ if ( ! empty( $response ) && ! is_wp_error( $response ) ) {
159
+ $extension = reset( $response );
160
+
161
+ $notice_key = 'new_extension-' . $extension->info->slug;
162
+
163
+ if ( ! in_array( $notice_key, get_site_option( '_tml_dismissed_notices', array() ) ) ) : ?>
164
+
165
+ <div class="notice notice-info tml-notice is-dismissible" data-notice="<?php echo $notice_key; ?>">
166
+ <?php echo implode( "\n", array(
167
+ '<p>' . __( 'A new <strong>Theme My Login</strong> extension is available!', 'theme-my-login' ) . '</p>',
168
+ '<p>' . sprintf( '<strong>%s</strong>: %s',
169
+ $extension->info->title,
170
+ $extension->info->excerpt
171
+ ) . '</p>',
172
+ '<p>' . sprintf( '<a class="button button-primary" href="%s">%s</a>',
173
+ $extension->info->link,
174
+ __( 'Get This Extension', 'theme-my-login' )
175
+ ) . '</p>',
176
+ ) ); ?>
177
+ </div>
178
+
179
+ <?php endif;
180
+ }
181
+ }
182
+
183
+ /**
184
+ * Handle saving of notice dismissals.
185
+ *
186
+ * @since 7.0.8
187
+ */
188
+ function tml_admin_ajax_dismiss_notice() {
189
+ if ( empty( $_POST['notice'] ) ) {
190
+ return;
191
+ }
192
+ $dismissed_notices = get_site_option( '_tml_dismissed_notices', array() );
193
+ $dismissed_notices[] = sanitize_key( $_POST['notice'] );
194
+ update_site_option( '_tml_dismissed_notices', $dismissed_notices );
195
+ wp_send_json_success();
196
  }
197
 
198
  /**
320
  }
321
  return $walker;
322
  }
323
+
324
+ /**
325
+ * Ask for feedback when the plugin is deactivated.
326
+ *
327
+ * @since 7.0.8
328
+ */
329
+ function tml_admin_deactivation_survey() {
330
+ global $pagenow, $wp_version;
331
+
332
+ // Bail if we're not on the plugins page
333
+ if ( 'plugins.php' != $pagenow ) {
334
+ return;
335
+ }
336
+
337
+ // Bail if we're not deactivating a plugin
338
+ if ( 'deactivate' != tml_get_request_value( 'action' ) ) {
339
+ return;
340
+ }
341
+
342
+ // Bail if not deactivating TML
343
+ if ( 'theme-my-login/theme-my-login.php' != tml_get_request_value( 'plugin' ) ) {
344
+ return;
345
+ }
346
+
347
+ // Bail if the survery has been submitted/ignored
348
+ if ( tml_get_request_value( 'skip_survey' ) ) {
349
+ return;
350
+ }
351
+
352
+ // Handle form submission
353
+ if ( tml_is_post_request() ) {
354
+ if ( $comments = tml_get_request_value( 'comments', 'post' ) ) {
355
+ $message = wp_unslash( $comments ) . "\r\n\r\n";
356
+ $message .= implode( "\r\n", array(
357
+ 'WP Version: ' . $wp_version,
358
+ 'TML Version: ' . THEME_MY_LOGIN_VERSION,
359
+ 'PHP Version: ' . phpversion(),
360
+ 'Multisite: ' . ( is_multisite() ? 'Yes' : 'No' ),
361
+ ) );
362
+ @wp_mail( 'deactivations@thememylogin.com', 'Deactivation Survey', $message );
363
+ }
364
+ wp_redirect( add_query_arg( 'skip_survey', 1 ) );
365
+ exit;
366
+
367
+ // Handle form output
368
+ } else {
369
+ ob_start(); ?>
370
+
371
+ <h2><?php esc_html_e( 'Deactivating Theme My Login', 'theme-my-login' ); ?></h2>
372
+ <p><?php esc_html_e( 'Before you go, please take a moment to let us know why you are deactivating:', 'theme-my-login' ); ?></p>
373
+ <form method="post">
374
+ <p>
375
+ <textarea name="comments" rows="8" cols="50" style="width: 100%;"></textarea><br />
376
+ <span style="color: #888; font-size: 13px; font-style: italic;"><?php esc_html_e( 'Submitting this form will also include your WordPress version, TML version, PHP version and whether this is a multisite installation or not.', 'theme-my-login' ); ?></span>
377
+ </p>
378
+ <p>
379
+ <input type="submit" name="submit_survey" value="<?php esc_attr_e( 'Submit & Deactivate', 'theme-my-login' ); ?>" class="button" style="margin-right: 10px;" />
380
+ <a href="<?php echo add_query_arg( 'skip_survey', 1 ); ?>" style="display: inline-block; font-size: 13px; height: 28px; line-height: 26px;"><?php esc_html_e( 'No thanks, just deactivate', 'theme-my-login' ); ?></a>
381
+ </p>
382
+ </form>
383
+
384
+ <?php wp_die( ob_get_clean(), __( 'Deactivating Theme My Login', 'theme-my-login' ) );
385
+ }
386
+ }
admin/hooks.php CHANGED
@@ -8,12 +8,15 @@
8
  */
9
 
10
  // General
11
- add_action( 'admin_enqueue_scripts', 'tml_admin_enqueue_scripts' );
12
- add_action( 'admin_notices', 'tml_admin_notices' );
 
 
 
13
 
14
  // Extensions
15
- add_action( 'admin_init', 'tml_admin_handle_extension_licenses' );
16
- add_action( 'admin_print_styles', 'tml_admin_extensions_styles' );
17
 
18
  // Settings
19
  if ( is_multisite() ) {
@@ -32,3 +35,6 @@ add_action( 'admin_init', 'tml_admin_update' );
32
  // Nav menus
33
  add_action( 'admin_head-nav-menus.php', 'tml_admin_add_nav_menu_meta_box', 10 );
34
  add_filter( 'wp_edit_nav_menu_walker', 'tml_admin_filter_edit_nav_menu_walker', 99 );
 
 
 
8
  */
9
 
10
  // General
11
+ add_action( 'admin_enqueue_scripts', 'tml_admin_enqueue_style_and_scripts' );
12
+
13
+ // Notices
14
+ add_action( 'admin_notices', 'tml_admin_notices' );
15
+ add_action( 'wp_ajax_tml-dismiss-notice', 'tml_admin_ajax_dismiss_notice' );
16
 
17
  // Extensions
18
+ add_action( 'admin_init', 'tml_admin_handle_extension_licenses' );
19
+ add_action( 'admin_init', 'tml_admin_check_extension_licenses' );
20
 
21
  // Settings
22
  if ( is_multisite() ) {
35
  // Nav menus
36
  add_action( 'admin_head-nav-menus.php', 'tml_admin_add_nav_menu_meta_box', 10 );
37
  add_filter( 'wp_edit_nav_menu_walker', 'tml_admin_filter_edit_nav_menu_walker', 99 );
38
+
39
+ // Deactivation
40
+ add_action( 'admin_init', 'tml_admin_deactivation_survey' );
admin/settings.php CHANGED
@@ -467,7 +467,7 @@ function tml_admin_settings_page() {
467
  <h1><?php echo esc_html( $title ) ?></h1>
468
  <hr class="wp-header-end">
469
 
470
- <form action="<?php echo is_network_admin() ? '' : 'options.php'; ?>" method="post">
471
 
472
  <?php settings_fields( $plugin_page ); ?>
473
 
467
  <h1><?php echo esc_html( $title ) ?></h1>
468
  <hr class="wp-header-end">
469
 
470
+ <form id="tml-settings" action="<?php echo is_network_admin() ? '' : 'options.php'; ?>" method="post">
471
 
472
  <?php settings_fields( $plugin_page ); ?>
473
 
includes/actions.php CHANGED
@@ -389,7 +389,7 @@ function tml_login_handler() {
389
  if ( ! is_wp_error( $user ) && empty( $_COOKIE[ LOGGED_IN_COOKIE ] ) ) {
390
  $redirect_to = add_query_arg( array(
391
  'testcookie' => 1,
392
- 'redirect_to' => $redirect_to
393
  ) );
394
  wp_redirect( $redirect_to );
395
  exit;
389
  if ( ! is_wp_error( $user ) && empty( $_COOKIE[ LOGGED_IN_COOKIE ] ) ) {
390
  $redirect_to = add_query_arg( array(
391
  'testcookie' => 1,
392
+ 'redirect_to' => urlencode( $redirect_to ),
393
  ) );
394
  wp_redirect( $redirect_to );
395
  exit;
includes/class-theme-my-login-form.php CHANGED
@@ -259,7 +259,10 @@ class Theme_My_Login_Form {
259
  * @param TML_Form_Field $field The field object.
260
  */
261
  public function add_field( Theme_My_Login_Form_Field $field ) {
 
262
  $this->fields[ $field->get_name() ] = $field;
 
 
263
  }
264
 
265
  /**
259
  * @param TML_Form_Field $field The field object.
260
  */
261
  public function add_field( Theme_My_Login_Form_Field $field ) {
262
+
263
  $this->fields[ $field->get_name() ] = $field;
264
+
265
+ return $field;
266
  }
267
 
268
  /**
includes/extensions.php CHANGED
@@ -253,6 +253,34 @@ function tml_deactivate_extension_license( $extension ) {
253
  return $response->license;
254
  }
255
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
256
  /**
257
  * Make an API call to an extension's store.
258
  *
@@ -282,7 +310,7 @@ function tml_extension_api_call( $url, $args = array() ) {
282
  ) );
283
 
284
  $response = wp_remote_post( $url, array(
285
- 'timeout' => 15,
286
  'sslverify' => true,
287
  'body' => $args,
288
  ) );
253
  return $response->license;
254
  }
255
 
256
+ /**
257
+ * Check an extenstion's license status.
258
+ *
259
+ * @since 7.0.8
260
+ *
261
+ * @param string|Theme_My_Login_Extension $extension The extension name or object.
262
+ * @return bool|string|WP_Error The license status on success, false if the
263
+ * extension doesn't exist or WP_Error on failure.
264
+ */
265
+ function tml_check_extension_license( $extension ) {
266
+ if ( ! $extension = tml_get_extension( $extension ) ) {
267
+ return false;
268
+ }
269
+
270
+ $response = tml_extension_api_call( $extension->get_store_url(), array(
271
+ 'edd_action' => 'check_license',
272
+ 'license' => $extension->get_license_key(),
273
+ 'item_id' => $extension->get_item_id(),
274
+ 'url' => home_url(),
275
+ ) );
276
+
277
+ if ( empty( $response ) ) {
278
+ return new WP_Error( 'http_error', __( 'An error occurred, please try again.', 'theme-my-login' ) );
279
+ }
280
+
281
+ return $response->license;
282
+ }
283
+
284
  /**
285
  * Make an API call to an extension's store.
286
  *
310
  ) );
311
 
312
  $response = wp_remote_post( $url, array(
313
+ 'timeout' => 30,
314
  'sslverify' => true,
315
  'body' => $args,
316
  ) );
includes/forms.php CHANGED
@@ -373,6 +373,7 @@ function tml_form_exists( $form ) {
373
  * @param array {
374
  * Optional. An array of arguments for registering a form field.
375
  * }
 
376
  */
377
  function tml_add_form_field( $form, $field, $args = array() ) {
378
 
@@ -384,7 +385,7 @@ function tml_add_form_field( $form, $field, $args = array() ) {
384
  $field = new Theme_My_Login_Form_Field( $form, $field, $args );
385
  }
386
 
387
- $form->add_field( $field );
388
  }
389
 
390
  /**
373
  * @param array {
374
  * Optional. An array of arguments for registering a form field.
375
  * }
376
+ * @return Theme_My_Login_Form_Field The field object.
377
  */
378
  function tml_add_form_field( $form, $field, $args = array() ) {
379
 
385
  $field = new Theme_My_Login_Form_Field( $form, $field, $args );
386
  }
387
 
388
+ return $form->add_field( $field );
389
  }
390
 
391
  /**
includes/functions.php CHANGED
@@ -270,11 +270,6 @@ function tml_filter_site_url( $url, $path, $scheme ) {
270
  return $url;
271
  }
272
 
273
- // Bail if currently in /wp-admin
274
- if ( is_admin() && did_action( 'admin_init' ) ) {
275
- return $url;
276
- }
277
-
278
  // Bail if currently customizing
279
  if ( is_customize_preview() ) {
280
  return $url;
@@ -295,6 +290,15 @@ function tml_filter_site_url( $url, $path, $scheme ) {
295
  parse_str( htmlspecialchars_decode( $parsed_url['query'] ), $query );
296
  }
297
 
 
 
 
 
 
 
 
 
 
298
  // Determine the action
299
  switch ( $path ) {
300
  case 'wp-login.php' :
270
  return $url;
271
  }
272
 
 
 
 
 
 
273
  // Bail if currently customizing
274
  if ( is_customize_preview() ) {
275
  return $url;
290
  parse_str( htmlspecialchars_decode( $parsed_url['query'] ), $query );
291
  }
292
 
293
+ /**
294
+ * Bail if the URL is an interim-login URL
295
+ *
296
+ * @see https://core.trac.wordpress.org/ticket/31821
297
+ */
298
+ if ( isset( $query['interim-login'] ) ) {
299
+ return $url;
300
+ }
301
+
302
  // Determine the action
303
  switch ( $path ) {
304
  case 'wp-login.php' :
languages/theme-my-login.pot CHANGED
@@ -2,45 +2,45 @@
2
  # This file is distributed under the same license as the Theme My Login package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Theme My Login 7.0.7\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/theme-my-login\n"
7
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
8
  "Language-Team: LANGUAGE <LL@li.org>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "POT-Creation-Date: 2018-06-24T17:54:40-04:00\n"
13
- "PO-Revision-Date: 2018-06-24T17:54:40-04:00\n"
14
  "X-Domain: theme-my-login\n"
15
 
16
- #: includes/functions.php:402
17
- #: admin/functions.php:223
18
  msgid "Theme My Login Actions"
19
  msgstr ""
20
 
21
- #: includes/functions.php:403
22
  msgid "Theme My Login Action"
23
  msgstr ""
24
 
25
- #: includes/functions.php:431
26
- #: includes/functions.php:458
27
- #: includes/functions.php:473
28
  msgid "TML Action"
29
  msgstr ""
30
 
31
- #: includes/functions.php:535
32
  msgid "<strong>ERROR</strong>: Please enter a password."
33
  msgstr ""
34
 
35
- #: includes/functions.php:538
36
  msgid "<strong>ERROR</strong>: Passwords may not contain the character \"\\\"."
37
  msgstr ""
38
 
39
- #: includes/functions.php:541
40
  msgid "<strong>ERROR</strong>: Please enter the same password in both password fields."
41
  msgstr ""
42
 
43
- #: includes/functions.php:557
44
  msgid "If you have already set your own password, you may disregard this email and use the password you have already set."
45
  msgstr ""
46
 
@@ -74,6 +74,7 @@ msgstr ""
74
  #: includes/extensions.php:189
75
  #: includes/extensions.php:220
76
  #: includes/extensions.php:250
 
77
  msgid "An error occurred, please try again."
78
  msgstr ""
79
 
@@ -118,10 +119,40 @@ msgstr ""
118
  msgid "Extensions"
119
  msgstr ""
120
 
121
- #: admin/functions.php:148
122
  msgid "As a token of our gratitude, we would like to offer your an incentive for upgrading Theme My Login to version 7.0. For a limited time, we are offering a <strong>20% discount</strong> when you use the code <strong>SAVINGFACE</strong> at checkout. Act now - this offer won't last!"
123
  msgstr ""
124
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
125
  #: admin/settings.php:96
126
  msgid "Registration"
127
  msgstr ""
@@ -255,19 +286,15 @@ msgstr ""
255
  msgid "On this page, you can configure the settings for the Theme My Login %s extension."
256
  msgstr ""
257
 
258
- #: admin/extensions.php:61
259
  msgid "Whoops! Looks like there was an error fetching extensions from the server. Please try again."
260
  msgstr ""
261
 
262
- #: admin/extensions.php:62
263
  msgid "Error: %s"
264
  msgstr ""
265
 
266
- #: admin/extensions.php:84
267
- msgid "Get This Extension"
268
- msgstr ""
269
-
270
- #: admin/extensions.php:94
271
  msgid "View All Extensions"
272
  msgstr ""
273
 
2
  # This file is distributed under the same license as the Theme My Login package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Theme My Login 7.0.8\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/theme-my-login\n"
7
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
8
  "Language-Team: LANGUAGE <LL@li.org>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
+ "POT-Creation-Date: 2018-07-12T12:11:46-04:00\n"
13
+ "PO-Revision-Date: 2018-07-12T12:11:46-04:00\n"
14
  "X-Domain: theme-my-login\n"
15
 
16
+ #: includes/functions.php:406
17
+ #: admin/functions.php:266
18
  msgid "Theme My Login Actions"
19
  msgstr ""
20
 
21
+ #: includes/functions.php:407
22
  msgid "Theme My Login Action"
23
  msgstr ""
24
 
25
+ #: includes/functions.php:435
26
+ #: includes/functions.php:462
27
+ #: includes/functions.php:477
28
  msgid "TML Action"
29
  msgstr ""
30
 
31
+ #: includes/functions.php:539
32
  msgid "<strong>ERROR</strong>: Please enter a password."
33
  msgstr ""
34
 
35
+ #: includes/functions.php:542
36
  msgid "<strong>ERROR</strong>: Passwords may not contain the character \"\\\"."
37
  msgstr ""
38
 
39
+ #: includes/functions.php:545
40
  msgid "<strong>ERROR</strong>: Please enter the same password in both password fields."
41
  msgstr ""
42
 
43
+ #: includes/functions.php:561
44
  msgid "If you have already set your own password, you may disregard this email and use the password you have already set."
45
  msgstr ""
46
 
74
  #: includes/extensions.php:189
75
  #: includes/extensions.php:220
76
  #: includes/extensions.php:250
77
+ #: includes/extensions.php:278
78
  msgid "An error occurred, please try again."
79
  msgstr ""
80
 
119
  msgid "Extensions"
120
  msgstr ""
121
 
122
+ #: admin/functions.php:151
123
  msgid "As a token of our gratitude, we would like to offer your an incentive for upgrading Theme My Login to version 7.0. For a limited time, we are offering a <strong>20% discount</strong> when you use the code <strong>SAVINGFACE</strong> at checkout. Act now - this offer won't last!"
124
  msgstr ""
125
 
126
+ #: admin/functions.php:167
127
+ msgid "A new <strong>Theme My Login</strong> extension is available!"
128
+ msgstr ""
129
+
130
+ #: admin/functions.php:174
131
+ #: admin/extensions.php:95
132
+ msgid "Get This Extension"
133
+ msgstr ""
134
+
135
+ #: admin/functions.php:371
136
+ #: admin/functions.php:384
137
+ msgid "Deactivating Theme My Login"
138
+ msgstr ""
139
+
140
+ #: admin/functions.php:372
141
+ msgid "Before you go, please take a moment to let us know why you are deactivating:"
142
+ msgstr ""
143
+
144
+ #: admin/functions.php:376
145
+ msgid "Submitting this form will also include your WordPress version, TML version, PHP version and whether this is a multisite installation or not."
146
+ msgstr ""
147
+
148
+ #: admin/functions.php:379
149
+ msgid "Submit & Deactivate"
150
+ msgstr ""
151
+
152
+ #: admin/functions.php:380
153
+ msgid "No thanks, just deactivate"
154
+ msgstr ""
155
+
156
  #: admin/settings.php:96
157
  msgid "Registration"
158
  msgstr ""
286
  msgid "On this page, you can configure the settings for the Theme My Login %s extension."
287
  msgstr ""
288
 
289
+ #: admin/extensions.php:72
290
  msgid "Whoops! Looks like there was an error fetching extensions from the server. Please try again."
291
  msgstr ""
292
 
293
+ #: admin/extensions.php:73
294
  msgid "Error: %s"
295
  msgstr ""
296
 
297
+ #: admin/extensions.php:105
 
 
 
 
298
  msgid "View All Extensions"
299
  msgstr ""
300
 
readme.txt CHANGED
@@ -2,8 +2,8 @@
2
  Contributors: thememylogin, jfarthing84
3
  Tags: login, register, password, branding, customize, widget, wp-login, wp-login.php
4
  Requires at least: 4.6
5
- Tested up to: 4.9.6
6
- Stable tag: 7.0.7
7
 
8
  The ultimate login branding solution! Theme My Login offers matchless customization of your WordPress user experience!
9
 
@@ -59,11 +59,19 @@ Report bugs, suggest ideas and participate in development at [GitHub](https://gi
59
 
60
  == Changelog ==
61
 
 
 
 
 
 
 
 
 
62
  = 7.0.7 =
63
  * Fix sorting of form fields
64
  * Fix "Remember Me" not being clickable
65
  * Add "checked" property to form fields to allow for easy checking of checkboxes
66
- * Add plugin textdomain to strings not found in front-end core transalations
67
  * Add `tml_send_new_user_notification` filter
68
  * Add `tml_send_new_user_admin_notification` filter
69
  * Add `tml_retrieve_password_email` filter
2
  Contributors: thememylogin, jfarthing84
3
  Tags: login, register, password, branding, customize, widget, wp-login, wp-login.php
4
  Requires at least: 4.6
5
+ Tested up to: 4.9.7
6
+ Stable tag: 7.0.8
7
 
8
  The ultimate login branding solution! Theme My Login offers matchless customization of your WordPress user experience!
9
 
59
 
60
  == Changelog ==
61
 
62
+ = 7.0.8 =
63
+ * Fix slow-loading extensions page
64
+ * Add dismissible notice of latest available extension
65
+ * Fix "stuck" license status by verifying when visiting the licenses page
66
+ * Ensure a form field object is returned when adding a form field
67
+ * Fix testcookie step causing a 403 error
68
+ * Fix links not being changed in emails sent from the Dashboard
69
+
70
  = 7.0.7 =
71
  * Fix sorting of form fields
72
  * Fix "Remember Me" not being clickable
73
  * Add "checked" property to form fields to allow for easy checking of checkboxes
74
+ * Add plugin textdomain to strings not found in front-end core translations
75
  * Add `tml_send_new_user_notification` filter
76
  * Add `tml_send_new_user_admin_notification` filter
77
  * Add `tml_retrieve_password_email` filter
theme-my-login.php CHANGED
@@ -10,7 +10,7 @@
10
  Plugin Name: Theme My Login
11
  Plugin URI: https://thememylogin.com
12
  Description: Creates an alternate login, registration and password recovery experience within your theme.
13
- Version: 7.0.7
14
  Author: Theme My Login
15
  Author URI: https://thememylogin.com
16
  License: GPLv2
@@ -24,7 +24,7 @@ Network: true
24
  *
25
  * @since 7.0
26
  */
27
- define( 'THEME_MY_LOGIN_VERSION', '7.0.7' );
28
 
29
  /**
30
  * Stores the path to TML.
10
  Plugin Name: Theme My Login
11
  Plugin URI: https://thememylogin.com
12
  Description: Creates an alternate login, registration and password recovery experience within your theme.
13
+ Version: 7.0.8
14
  Author: Theme My Login
15
  Author URI: https://thememylogin.com
16
  License: GPLv2
24
  *
25
  * @since 7.0
26
  */
27
+ define( 'THEME_MY_LOGIN_VERSION', '7.0.8' );
28
 
29
  /**
30
  * Stores the path to TML.