Merge pull request #33 from NunoSempere/libre_redirect
feat: redirect websites to open-source frontends
This commit is contained in:
		
						commit
						b16665809c
					
				
							
								
								
									
										3
									
								
								build.sh
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								build.sh
									
									
									
									
									
								
							|  | @ -1,5 +1,6 @@ | ||||||
| CC=clang | CC=clang | ||||||
| SRC=rose.c | SRC=rose.c | ||||||
|  | REQS=./plugins/*/*.c | ||||||
| DEPS=('webkit2gtk-4.0') | DEPS=('webkit2gtk-4.0') | ||||||
| 
 | 
 | ||||||
| INCS=`pkg-config --cflags ${DEPS[@]}` | INCS=`pkg-config --cflags ${DEPS[@]}` | ||||||
|  | @ -9,4 +10,4 @@ LIBS=`pkg-config --libs ${DEPS[@]}` | ||||||
| WYEBAB='-L/usr/lib/wyebrowser/adblock.so' | WYEBAB='-L/usr/lib/wyebrowser/adblock.so' | ||||||
| 
 | 
 | ||||||
| cp -f config.def.h config.h | cp -f config.def.h config.h | ||||||
| $CC $INCS $LIBS $SRC $WYEBAB -o rose | $CC $INCS $LIBS $REQS $SRC $WYEBAB -o rose | ||||||
|  |  | ||||||
							
								
								
									
										69
									
								
								plugins/libre_redirect/libre_redirect.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								plugins/libre_redirect/libre_redirect.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,69 @@ | ||||||
|  | #include "str_replace_start.h" | ||||||
|  | #include <string.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdbool.h> | ||||||
|  | #define LIBRE_N 19 | ||||||
|  | #define DEBUG false | ||||||
|  | 
 | ||||||
|  | /* Inspired by https://libredirect.github.io/, but in C. */ | ||||||
|  | 
 | ||||||
|  | void str_init(char* str, int n){ | ||||||
|  |   for(int i=0; i<n; i++){ | ||||||
|  |     str[i] = ' '; | ||||||
|  |   } | ||||||
|  |   str[n] = '\0'; | ||||||
|  | } // could also use <https://manpages.ubuntu.com/manpages/impish/man3/strinit.3pub.html>
 | ||||||
|  | 
 | ||||||
|  | int libre_redirect(const char* uri, char* output){ | ||||||
|  |   int l1 = strlen(uri); | ||||||
|  |   int l2 = strlen(output); | ||||||
|  |    | ||||||
|  |   if((l2 - l1) < LIBRE_N){  | ||||||
|  |     if(DEBUG) printf("Not enough memory\n"); | ||||||
|  |     return 1; // not enough memory. 
 | ||||||
|  |   }else{ | ||||||
|  |     char tmp_uri[l2++]; | ||||||
|  |     char tmp_output[l2++]; | ||||||
|  |     strcpy(tmp_uri, uri); // strcpy also copies the terminating '\0'
 | ||||||
|  |     strcpy(tmp_output, output); | ||||||
|  |    | ||||||
|  |     char* annoying_sites[] = {  | ||||||
|  |       "https://www.youtube.com",  | ||||||
|  |       "https://www.reddit.com",  | ||||||
|  |       "https://medium.com",  | ||||||
|  |       "https://translate.google.com", | ||||||
|  |       "https://forum.effectivealtruism.org", | ||||||
|  |       "https://www.bloomberg.com", | ||||||
|  |       "https://twitter.com" | ||||||
|  |     }; | ||||||
|  |     char* alternatives[] = {  | ||||||
|  |       "https://yt.artemislena.eu",  | ||||||
|  |       "https://teddit.nunosempere.com",  | ||||||
|  |       "https://scribe.rip",  | ||||||
|  |       "https://simplytranslate.org/", | ||||||
|  |       "https://ea.greaterwrong.com", | ||||||
|  |       "https://archive.is/https://www.bloomberg.com", | ||||||
|  |       "https://nitter.net" | ||||||
|  |     }; | ||||||
|  |     int n = sizeof(annoying_sites)/sizeof(annoying_sites[0]); | ||||||
|  |     for(int i=0; i<n ; i++){ | ||||||
|  |       int replace_check = str_replace_start(tmp_uri, annoying_sites[i], alternatives[i], output); | ||||||
|  |       if(replace_check == 2){ | ||||||
|  | 	if(DEBUG) printf("tmp_uri: %s\n", tmp_uri); | ||||||
|  | 	if(DEBUG) printf("output: %s\n", output); | ||||||
|  |         // strcpy(output, tmp_uri);
 | ||||||
|  |         // break;
 | ||||||
|  | 	return 2; | ||||||
|  |       }else if(replace_check == 1){ | ||||||
|  |         if(DEBUG) printf("replace_check failed\n"); | ||||||
|  |         return 1; | ||||||
|  |       } | ||||||
|  |       strcpy(tmp_uri, output); | ||||||
|  |       str_init(output, l2); | ||||||
|  |     } | ||||||
|  |     strcpy(output, tmp_uri); | ||||||
|  |   } | ||||||
|  |   if(DEBUG) printf("No match found\n\n"); | ||||||
|  |   return 0; | ||||||
|  |    | ||||||
|  | } | ||||||
							
								
								
									
										9
									
								
								plugins/libre_redirect/libre_redirect.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										9
									
								
								plugins/libre_redirect/libre_redirect.h
									
									
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,9 @@ | ||||||
|  | #ifndef LIBRE_REDIRECT | ||||||
|  | #define LIBRE_REDIRECT | ||||||
|  | 
 | ||||||
|  | #define LIBRE_N 19 | ||||||
|  | 
 | ||||||
|  | int libre_redirect(const char* uri, char* uri_filtered); | ||||||
|  | void str_init(char* str, int n); | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
							
								
								
									
										60
									
								
								plugins/libre_redirect/str_replace_start.c
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										60
									
								
								plugins/libre_redirect/str_replace_start.c
									
									
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,60 @@ | ||||||
|  | #include <string.h> | ||||||
|  | #include <stdbool.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #define DEBUG false | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  | See also:  | ||||||
|  | * <https://web.archive.org/web/20160201212501/coding.debuntu.org/c-implementing-str_replace-replace-all-occurrences-substring>
 | ||||||
|  | * https://github.com/irl/la-cucina/blob/master/str_replace.c
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | int str_replace_start(const char* string, const char* target, const char* replacement, char* output){ | ||||||
|  |    | ||||||
|  |   int l1 = strlen(string); | ||||||
|  |   int l2 = strlen(target); | ||||||
|  |   int l3 = strlen(replacement); | ||||||
|  |   int l4 = strlen(output); | ||||||
|  |   if(DEBUG) printf("%d,%d,%d,%d\n", l1, l2, l3, l4); | ||||||
|  |   // if(DEBUG) printf("%s,%s,%s,%s\n", string, target, replacement, output);
 | ||||||
|  |    | ||||||
|  |   if((l4 < (l1 - l2 + l3)) || l4 < l1 ){ | ||||||
|  |     // Not enough memory in output string.
 | ||||||
|  |     if(DEBUG) printf("String not long enough.\n"); | ||||||
|  |     return 1;  | ||||||
|  |   }  | ||||||
|  |   /* else if(l1 < l2){
 | ||||||
|  |     // Not even possible that there is a match.
 | ||||||
|  |     if(DEBUG) printf("Target larger than string.\n"); | ||||||
|  |     strcpy(output, string); | ||||||
|  |   } */ | ||||||
|  |   else { | ||||||
|  |     if(DEBUG) printf("Looking for a match for %s in %s.\n", target, string); | ||||||
|  |     int match = true; | ||||||
|  |     for(int i=0; i<l2; i++){ | ||||||
|  |       if(string[i] != target[i]){ | ||||||
|  | 	match = false; | ||||||
|  | 	break; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if(match){ | ||||||
|  |       if(DEBUG) printf("Found match.\n"); | ||||||
|  |       for(int i=0; i<l3; i++){ | ||||||
|  | 	output[i] = replacement[i]; | ||||||
|  |       } | ||||||
|  |       int counter = l3; | ||||||
|  |       for(int i=l2; i<l1; i++){ | ||||||
|  |         output[counter] = string[i]; | ||||||
|  |         counter++; | ||||||
|  |       } | ||||||
|  |       output[counter] = '\0'; | ||||||
|  |       return 2; // success
 | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |       if(DEBUG) printf("Did not find match.\n"); | ||||||
|  |       strcpy(output, string); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
							
								
								
									
										6
									
								
								plugins/libre_redirect/str_replace_start.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										6
									
								
								plugins/libre_redirect/str_replace_start.h
									
									
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,6 @@ | ||||||
|  | #ifndef STR_REPLACE_H_ | ||||||
|  | #define STR_REPLACE_H_ | ||||||
|  | 
 | ||||||
|  | int str_replace_start(const char* string, const char* target, const char* replacement, char* output); | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
							
								
								
									
										11
									
								
								plugins/libre_redirect/str_replace_test/build-example.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								plugins/libre_redirect/str_replace_test/build-example.sh
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,11 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | CC=gcc | ||||||
|  | 
 | ||||||
|  | FLAGS="-std=c99 -Wall -lm" | ||||||
|  | 
 | ||||||
|  | SRC=example.c | ||||||
|  | REQS="../str_replace_start.c ../libre_redirect.c" | ||||||
|  | 
 | ||||||
|  | echo -e "\n\n\n" | ||||||
|  | $CC $FLAGS $SRC $REQS -o example | ||||||
|  | 
 | ||||||
							
								
								
									
										
											BIN
										
									
								
								plugins/libre_redirect/str_replace_test/example
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								plugins/libre_redirect/str_replace_test/example
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										20
									
								
								plugins/libre_redirect/str_replace_test/example.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								plugins/libre_redirect/str_replace_test/example.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | ||||||
|  | #include "../libre_redirect.h" | ||||||
|  | #include <string.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | 
 | ||||||
|  | int main(){ | ||||||
|  |   char uri[] = "https://reddit.com/r/blah"; | ||||||
|  |    | ||||||
|  |   int l = LIBRE_N + strlen(uri) + 1; | ||||||
|  |   char uri_filtered[l]; | ||||||
|  |   str_init(uri_filtered, l); | ||||||
|  | 
 | ||||||
|  |   if(!libre_redirect(uri, uri_filtered)){ | ||||||
|  |     printf("Filtered uri: %s\n", uri_filtered); | ||||||
|  |   }else{ | ||||||
|  |     printf("Uri: %s\n", uri); | ||||||
|  |     // failure; do something with the original uri.
 | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
							
								
								
									
										40
									
								
								rose.c
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								rose.c
									
									
									
									
									
								
							|  | @ -9,10 +9,12 @@ | ||||||
|  * |  * | ||||||
|  * @author: fenze <contact@fenze.dev> |  * @author: fenze <contact@fenze.dev> | ||||||
|  */ |  */ | ||||||
|  | #include <string.h> | ||||||
|  | #include <stdbool.h> | ||||||
|  | #include <webkit2/webkit2.h> | ||||||
| 
 | 
 | ||||||
| #include "config.h" | #include "config.h" | ||||||
| 
 | #include "plugins/libre_redirect/libre_redirect.h" | ||||||
| #include <webkit2/webkit2.h> |  | ||||||
| 
 | 
 | ||||||
| #define CACHE                               			\ | #define CACHE                               			\ | ||||||
| 	"base-cache-directory", CACHE_DIR,                   	\ | 	"base-cache-directory", CACHE_DIR,                   	\ | ||||||
|  | @ -78,14 +80,42 @@ void load_uri(WebKitWebView *view, const char *uri) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void redirect_if_annoying(WebKitWebView *view, const char *uri){ | ||||||
|  |         int l = LIBRE_N + strlen(uri) + 1; | ||||||
|  |         char uri_filtered[l]; | ||||||
|  |         str_init(uri_filtered, l); | ||||||
|  | 
 | ||||||
|  |         int check = libre_redirect(uri, uri_filtered); | ||||||
|  |         if(check == 2){ | ||||||
|  |                 webkit_web_view_load_uri(view, uri_filtered); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void load_changed(WebKitWebView *self, WebKitLoadEvent load_event, GtkNotebook *notebook) | void load_changed(WebKitWebView *self, WebKitLoadEvent load_event, GtkNotebook *notebook) | ||||||
| { | { | ||||||
| 	if (load_event == WEBKIT_LOAD_FINISHED) { |         switch (load_event) { | ||||||
|  |         /* see <https://webkitgtk.org/reference/webkit2gtk/2.5.1/WebKitWebView.html> */ | ||||||
|  |                 case WEBKIT_LOAD_STARTED: | ||||||
|  |                                 redirect_if_annoying(self, webkit_web_view_get_uri(self)); | ||||||
|  |                                 break; | ||||||
|  |                 case WEBKIT_LOAD_REDIRECTED: | ||||||
|  |                                 redirect_if_annoying(self, webkit_web_view_get_uri(self)); | ||||||
|  |                                 break; | ||||||
|  |                 case WEBKIT_LOAD_COMMITTED: | ||||||
|  |                                 redirect_if_annoying(self, webkit_web_view_get_uri(self)); | ||||||
|  |                                 break; | ||||||
|  |                 case WEBKIT_LOAD_FINISHED: | ||||||
|  |                 { | ||||||
|  |                                 const char* title = webkit_web_view_get_title(self); | ||||||
|                                 gtk_notebook_set_tab_label_text(notebook, GTK_WIDGET(self), |                                 gtk_notebook_set_tab_label_text(notebook, GTK_WIDGET(self), | ||||||
| 						webkit_web_view_get_title(self)); |                                                 title == NULL ? "—" : title ); | ||||||
| 		gtk_widget_hide(GTK_WIDGET(bar)); |                                 // gtk_widget_hide(GTK_WIDGET(bar));
 | ||||||
|  |                                 break; | ||||||
|                 } |                 } | ||||||
|         } |         } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| void notebook_append(GtkNotebook *notebook, const char *uri) | void notebook_append(GtkNotebook *notebook, const char *uri) | ||||||
| { | { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user