77class Token_List_Table extends WP_List_Table {
88 public function get_columns () {
99 return array (
10+ 'cb ' => '<input type="checkbox" /> ' ,
1011 'client_name ' => __ ( 'Client Name ' , 'indieauth ' ),
1112 'client_icon ' => __ ( 'Client Icon ' , 'indieauth ' ),
1213 'client_id ' => __ ( 'Client ID ' , 'indieauth ' ),
1314 'scope ' => __ ( 'Scope ' , 'indieauth ' ),
1415 'issued_at ' => __ ( 'Issue Date ' , 'indieauth ' ),
1516 'last_accessed ' => __ ( 'Last Accessed ' , 'indieauth ' ),
17+ 'expiration ' => __ ( 'Expires ' , 'indieauth ' ),
1618 );
1719 }
1820
21+ public function get_bulk_actions () {
22+ return array (
23+ 'revoke ' => __ ( 'Revoke ' , 'indieauth ' ),
24+ 'revoke_year ' => __ ( 'Revoke Tokens Last Accessed 1 Year Ago or Never ' , 'indieauth ' ),
25+ 'revoke_month ' => __ ( 'Revoke Tokens Last Accessed 1 Month Ago or Never ' , 'indieauth ' ),
26+ 'revoke_week ' => __ ( 'Revoke Tokens Last Accessed 1 Week Ago or Never ' , 'indieauth ' ),
27+ 'revoke_day ' => __ ( 'Revoke Tokens Last Accessed 1 Day Ago or Never ' , 'indieauth ' ),
28+ 'revoke_hour ' => __ ( 'Revoke Tokens Last Accessed 1 Hour Ago or Never ' , 'indieauth ' ),
29+ 'cleanup ' => __ ( 'Clean Up Expired Tokens and Authorization Codes ' , 'indieauth ' ),
30+ );
31+ }
32+
1933 public function get_sortable_columns () {
2034 return array ();
2135 }
@@ -32,37 +46,95 @@ public function prepare_items() {
3246 $ value ['token ' ] = $ key ;
3347 $ this ->items [] = $ value ;
3448 }
49+
3550 }
3651
3752 public function column_default ( $ item , $ column_name ) {
3853 return $ item [ $ column_name ];
3954 }
4055
56+ public function column_cb ( $ item ) {
57+ return sprintf ( '<input type="checkbox" name="tokens[]" value="%s" /> ' , esc_attr ( $ item ['token ' ] ) );
58+ }
59+
4160 public function process_action () {
42- $ tokens = isset ( $ _GET ['tokens ' ] ) ? $ _GET ['tokens ' ] : array (); // phpcs:ignore
61+ $ tokens = isset ( $ _REQUEST ['tokens ' ] ) ? $ _REQUEST ['tokens ' ] : array (); // phpcs:ignore
4362 $ t = new Token_User ( '_indieauth_token_ ' , get_current_user_id () );
44- if ( 'revoke ' === $ this ->current_action () ) {
45- if ( is_string ( $ tokens ) ) {
46- $ t ->destroy ( $ tokens );
47- } elseif ( is_array ( $ tokens ) ) {
48- foreach ( $ tokens as $ token ) {
49- $ t ->destroy ( $ token );
63+ switch ( $ this ->current_action () ) {
64+ case 'revoke ' :
65+ if ( is_string ( $ tokens ) ) {
66+ $ t ->destroy ( $ tokens );
67+ } elseif ( is_array ( $ tokens ) ) {
68+ foreach ( $ tokens as $ token ) {
69+ $ t ->destroy ( $ token );
70+ }
5071 }
51- }
52- }
53- if ( 'retrieve ' === $ this ->current_action () ) {
54- if ( is_string ( $ tokens ) ) {
55- $ token = $ t ->get ( $ tokens , false );
56- $ info = new IndieAuth_Client_Discovery ( $ token ['client_id ' ] );
57- $ name = $ info ->get_name ();
58- if ( isset ( $ name ) ) {
59- $ token ['client_name ' ] = $ name ;
72+ break ;
73+ case 'cleanup ' :
74+ $ t ->check_expires ();
75+ $ users = new Token_User ( '_indieauth_code_ ' , get_current_user_id () );
76+ $ users ->destroy_all ();
77+ break ;
78+ case 'revoke_year ' :
79+ $ this ->destroy_older_than ( $ t , 'year ' );
80+ break ;
81+ case 'revoke_month ' :
82+ $ this ->destroy_older_than ( $ t , 'month ' );
83+ break ;
84+ case 'revoke_week ' :
85+ $ this ->destroy_older_than ( $ t , 'week ' );
86+ break ;
87+ case 'revoke_day ' :
88+ $ this ->destroy_older_than ( $ t , 'day ' );
89+ break ;
90+ case 'revoke_hour ' :
91+ $ this ->destroy_older_than ( $ t , 'hour ' );
92+ break ;
93+ case 'retrieve ' :
94+ if ( is_string ( $ tokens ) ) {
95+ $ token = $ t ->get ( $ tokens , false );
96+ $ info = new IndieAuth_Client_Discovery ( $ token ['client_id ' ] );
97+ $ name = $ info ->get_name ();
98+ if ( isset ( $ name ) ) {
99+ $ token ['client_name ' ] = $ name ;
100+ }
101+ $ icon = $ info ->get_icon ();
102+ if ( isset ( $ icon ) ) {
103+ $ token ['client_icon ' ] = $ icon ;
104+ }
105+ $ t ->update ( $ tokens , $ token , true );
60106 }
61- $ icon = $ info ->get_icon ();
62- if ( isset ( $ icon ) ) {
63- $ token ['client_icon ' ] = $ icon ;
107+ break ;
108+ }
109+ }
110+
111+ public function destroy_older_than ( $ t , $ older_than = 'day ' ) {
112+ switch ( strtolower ( $ older_than ) ) {
113+ case 'year ' :
114+ $ diff = YEAR_IN_SECONDS ;
115+ break ;
116+ case 'month ' :
117+ $ diff = MONTH_IN_SECONDS ;
118+ break ;
119+ case 'week ' :
120+ $ diff = WEEK_IN_SECONDS ;
121+ break ;
122+ case 'day ' :
123+ $ diff = DAY_IN_SECONDS ;
124+ break ;
125+ default :
126+ $ diff = HOUR_IN_SECONDS ;
127+ }
128+ $ tokens = $ t ->get_all ();
129+ foreach ( $ tokens as $ key => $ token ) {
130+ if ( ! isset ( $ token ['last_accessed ' ] ) ) {
131+ $ t ->destroy ( $ key );
132+ } else {
133+ $ time = (int ) $ token ['last_accessed ' ];
134+ $ time_diff = time () - $ time ;
135+ if ( $ time_diff > 0 && $ time_diff > $ diff ) {
136+ $ t ->destroy ( $ key );
64137 }
65- $ t ->update ( $ tokens , $ token , true );
66138 }
67139 }
68140 }
@@ -99,6 +171,21 @@ public function column_last_accessed( $item ) {
99171 return date_i18n ( get_option ( 'date_format ' ), $ time );
100172 }
101173
174+
175+ public function column_expiration ( $ item ) {
176+ if ( ! isset ( $ item ['expiration ' ] ) ) {
177+ return __ ( 'Never ' , 'indieauth ' );
178+ }
179+ $ time = (int ) $ item ['expiration ' ];
180+ $ time_diff = time () - $ time ;
181+ if ( $ time_diff > 0 && $ time_diff < DAY_IN_SECONDS ) {
182+ // translators: Human time difference ago
183+ return sprintf ( __ ( '%s ago ' , 'indieauth ' ), human_time_diff ( $ time ) );
184+ }
185+ return date_i18n ( get_option ( 'date_format ' ), $ time );
186+ }
187+
188+
102189 public function column_issued_at ( $ item ) {
103190 return date_i18n ( get_option ( 'date_format ' ), $ item ['issued_at ' ] );
104191 }
0 commit comments