Fossil SCM

Fix an issue with inherited capabilities in the subrepo mechanism.

drh 2011-05-09 12:44 trunk
Commit 3bd2de4c92f8f00f1651edbf83615e1640f25292
3 files changed +19 -11 +2 -1 +1 -1
+19 -11
--- src/login.c
+++ src/login.c
@@ -680,11 +680,11 @@
680680
if( fossil_strcmp(g.zLogin,"nobody")==0 ){
681681
g.zLogin = 0;
682682
}
683683
684684
/* Set the capabilities */
685
- login_set_capabilities(zCap);
685
+ login_set_capabilities(zCap, 0);
686686
login_set_anon_nobody_capabilities();
687687
}
688688
689689
/*
690690
** Memory of settings
@@ -698,26 +698,32 @@
698698
void login_set_anon_nobody_capabilities(void){
699699
if( g.zLogin && login_anon_once ){
700700
const char *zCap;
701701
/* All logged-in users inherit privileges from "nobody" */
702702
zCap = db_text("", "SELECT cap FROM user WHERE login = 'nobody'");
703
- login_set_capabilities(zCap);
703
+ login_set_capabilities(zCap, 0);
704704
if( fossil_strcmp(g.zLogin, "nobody")!=0 ){
705705
/* All logged-in users inherit privileges from "anonymous" */
706706
zCap = db_text("", "SELECT cap FROM user WHERE login = 'anonymous'");
707
- login_set_capabilities(zCap);
707
+ login_set_capabilities(zCap, 0);
708708
}
709709
login_anon_once = 0;
710710
}
711711
}
712712
713
+/*
714
+** Flags passed into the 2nd argument of login_set_capabilities().
715
+*/
716
+#if INTERFACE
717
+#define LOGIN_IGNORE_U 0x01 /* Ignore "u" */
718
+#define LOGIN_IGNORE_V 0x01 /* Ignore "v" */
719
+#endif
720
+
713721
/*
714722
** Set the global capability flags based on a capability string.
715723
*/
716
-void login_set_capabilities(const char *zCap){
717
- static char *zDev = 0;
718
- static char *zUser = 0;
724
+void login_set_capabilities(const char *zCap, unsigned flags){
719725
int i;
720726
for(i=0; zCap[i]; i++){
721727
switch( zCap[i] ){
722728
case 's': g.okSetup = 1; /* Fall thru into Admin */
723729
case 'a': g.okAdmin = g.okRdTkt = g.okWrTkt = g.okZip =
@@ -751,23 +757,25 @@
751757
case 'x': g.okPrivate = 1; break;
752758
753759
/* The "u" privileges is a little different. It recursively
754760
** inherits all privileges of the user named "reader" */
755761
case 'u': {
756
- if( zUser==0 ){
762
+ if( (flags & LOGIN_IGNORE_U)==0 ){
763
+ const char *zUser;
757764
zUser = db_text("", "SELECT cap FROM user WHERE login='reader'");
758
- login_set_capabilities(zUser);
765
+ login_set_capabilities(zUser, flags | LOGIN_IGNORE_U);
759766
}
760767
break;
761768
}
762769
763770
/* The "v" privileges is a little different. It recursively
764771
** inherits all privileges of the user named "developer" */
765772
case 'v': {
766
- if( zDev==0 ){
773
+ if( (flags & LOGIN_IGNORE_V)==0 ){
774
+ const char *zDev;
767775
zDev = db_text("", "SELECT cap FROM user WHERE login='developer'");
768
- login_set_capabilities(zDev);
776
+ login_set_capabilities(zDev, flags | LOGIN_IGNORE_V);
769777
}
770778
break;
771779
}
772780
}
773781
}
@@ -859,11 +867,11 @@
859867
}
860868
if( fossil_strcmp(zUser,"nobody")==0 ) zUser = 0;
861869
g.zLogin = fossil_strdup(zUser);
862870
863871
/* Set the capabilities */
864
- login_set_capabilities(zCap);
872
+ login_set_capabilities(zCap, 0);
865873
login_anon_once = 1;
866874
login_set_anon_nobody_capabilities();
867875
}
868876
869877
/*
870878
--- src/login.c
+++ src/login.c
@@ -680,11 +680,11 @@
680 if( fossil_strcmp(g.zLogin,"nobody")==0 ){
681 g.zLogin = 0;
682 }
683
684 /* Set the capabilities */
685 login_set_capabilities(zCap);
686 login_set_anon_nobody_capabilities();
687 }
688
689 /*
690 ** Memory of settings
@@ -698,26 +698,32 @@
698 void login_set_anon_nobody_capabilities(void){
699 if( g.zLogin && login_anon_once ){
700 const char *zCap;
701 /* All logged-in users inherit privileges from "nobody" */
702 zCap = db_text("", "SELECT cap FROM user WHERE login = 'nobody'");
703 login_set_capabilities(zCap);
704 if( fossil_strcmp(g.zLogin, "nobody")!=0 ){
705 /* All logged-in users inherit privileges from "anonymous" */
706 zCap = db_text("", "SELECT cap FROM user WHERE login = 'anonymous'");
707 login_set_capabilities(zCap);
708 }
709 login_anon_once = 0;
710 }
711 }
712
 
 
 
 
 
 
 
 
713 /*
714 ** Set the global capability flags based on a capability string.
715 */
716 void login_set_capabilities(const char *zCap){
717 static char *zDev = 0;
718 static char *zUser = 0;
719 int i;
720 for(i=0; zCap[i]; i++){
721 switch( zCap[i] ){
722 case 's': g.okSetup = 1; /* Fall thru into Admin */
723 case 'a': g.okAdmin = g.okRdTkt = g.okWrTkt = g.okZip =
@@ -751,23 +757,25 @@
751 case 'x': g.okPrivate = 1; break;
752
753 /* The "u" privileges is a little different. It recursively
754 ** inherits all privileges of the user named "reader" */
755 case 'u': {
756 if( zUser==0 ){
 
757 zUser = db_text("", "SELECT cap FROM user WHERE login='reader'");
758 login_set_capabilities(zUser);
759 }
760 break;
761 }
762
763 /* The "v" privileges is a little different. It recursively
764 ** inherits all privileges of the user named "developer" */
765 case 'v': {
766 if( zDev==0 ){
 
767 zDev = db_text("", "SELECT cap FROM user WHERE login='developer'");
768 login_set_capabilities(zDev);
769 }
770 break;
771 }
772 }
773 }
@@ -859,11 +867,11 @@
859 }
860 if( fossil_strcmp(zUser,"nobody")==0 ) zUser = 0;
861 g.zLogin = fossil_strdup(zUser);
862
863 /* Set the capabilities */
864 login_set_capabilities(zCap);
865 login_anon_once = 1;
866 login_set_anon_nobody_capabilities();
867 }
868
869 /*
870
--- src/login.c
+++ src/login.c
@@ -680,11 +680,11 @@
680 if( fossil_strcmp(g.zLogin,"nobody")==0 ){
681 g.zLogin = 0;
682 }
683
684 /* Set the capabilities */
685 login_set_capabilities(zCap, 0);
686 login_set_anon_nobody_capabilities();
687 }
688
689 /*
690 ** Memory of settings
@@ -698,26 +698,32 @@
698 void login_set_anon_nobody_capabilities(void){
699 if( g.zLogin && login_anon_once ){
700 const char *zCap;
701 /* All logged-in users inherit privileges from "nobody" */
702 zCap = db_text("", "SELECT cap FROM user WHERE login = 'nobody'");
703 login_set_capabilities(zCap, 0);
704 if( fossil_strcmp(g.zLogin, "nobody")!=0 ){
705 /* All logged-in users inherit privileges from "anonymous" */
706 zCap = db_text("", "SELECT cap FROM user WHERE login = 'anonymous'");
707 login_set_capabilities(zCap, 0);
708 }
709 login_anon_once = 0;
710 }
711 }
712
713 /*
714 ** Flags passed into the 2nd argument of login_set_capabilities().
715 */
716 #if INTERFACE
717 #define LOGIN_IGNORE_U 0x01 /* Ignore "u" */
718 #define LOGIN_IGNORE_V 0x01 /* Ignore "v" */
719 #endif
720
721 /*
722 ** Set the global capability flags based on a capability string.
723 */
724 void login_set_capabilities(const char *zCap, unsigned flags){
 
 
725 int i;
726 for(i=0; zCap[i]; i++){
727 switch( zCap[i] ){
728 case 's': g.okSetup = 1; /* Fall thru into Admin */
729 case 'a': g.okAdmin = g.okRdTkt = g.okWrTkt = g.okZip =
@@ -751,23 +757,25 @@
757 case 'x': g.okPrivate = 1; break;
758
759 /* The "u" privileges is a little different. It recursively
760 ** inherits all privileges of the user named "reader" */
761 case 'u': {
762 if( (flags & LOGIN_IGNORE_U)==0 ){
763 const char *zUser;
764 zUser = db_text("", "SELECT cap FROM user WHERE login='reader'");
765 login_set_capabilities(zUser, flags | LOGIN_IGNORE_U);
766 }
767 break;
768 }
769
770 /* The "v" privileges is a little different. It recursively
771 ** inherits all privileges of the user named "developer" */
772 case 'v': {
773 if( (flags & LOGIN_IGNORE_V)==0 ){
774 const char *zDev;
775 zDev = db_text("", "SELECT cap FROM user WHERE login='developer'");
776 login_set_capabilities(zDev, flags | LOGIN_IGNORE_V);
777 }
778 break;
779 }
780 }
781 }
@@ -859,11 +867,11 @@
867 }
868 if( fossil_strcmp(zUser,"nobody")==0 ) zUser = 0;
869 g.zLogin = fossil_strdup(zUser);
870
871 /* Set the capabilities */
872 login_set_capabilities(zCap, 0);
873 login_anon_once = 1;
874 login_set_anon_nobody_capabilities();
875 }
876
877 /*
878
+2 -1
--- src/main.c
+++ src/main.c
@@ -1001,10 +1001,11 @@
10011001
zAltRepo[jj] = 0;
10021002
zAltRepo += jj+1;
10031003
}else{
10041004
zUser = "nobody";
10051005
}
1006
+ if( g.zLogin==0 ) zUser = "nobody";
10061007
if( zAltRepo[0]!='/' ){
10071008
zAltRepo = mprintf("%s/../%s", g.zRepositoryName, zAltRepo);
10081009
file_simplify_name(zAltRepo, -1);
10091010
}
10101011
db_close(1);
@@ -1301,11 +1302,11 @@
13011302
**
13021303
** COMMAND: test-http
13031304
** Works like the http command but gives setup permission to all users.
13041305
*/
13051306
void cmd_test_http(void){
1306
- login_set_capabilities("s");
1307
+ login_set_capabilities("s", 0);
13071308
g.httpIn = stdin;
13081309
g.httpOut = stdout;
13091310
find_server_repository(0);
13101311
g.cgiOutput = 1;
13111312
g.fullHttpReply = 1;
13121313
--- src/main.c
+++ src/main.c
@@ -1001,10 +1001,11 @@
1001 zAltRepo[jj] = 0;
1002 zAltRepo += jj+1;
1003 }else{
1004 zUser = "nobody";
1005 }
 
1006 if( zAltRepo[0]!='/' ){
1007 zAltRepo = mprintf("%s/../%s", g.zRepositoryName, zAltRepo);
1008 file_simplify_name(zAltRepo, -1);
1009 }
1010 db_close(1);
@@ -1301,11 +1302,11 @@
1301 **
1302 ** COMMAND: test-http
1303 ** Works like the http command but gives setup permission to all users.
1304 */
1305 void cmd_test_http(void){
1306 login_set_capabilities("s");
1307 g.httpIn = stdin;
1308 g.httpOut = stdout;
1309 find_server_repository(0);
1310 g.cgiOutput = 1;
1311 g.fullHttpReply = 1;
1312
--- src/main.c
+++ src/main.c
@@ -1001,10 +1001,11 @@
1001 zAltRepo[jj] = 0;
1002 zAltRepo += jj+1;
1003 }else{
1004 zUser = "nobody";
1005 }
1006 if( g.zLogin==0 ) zUser = "nobody";
1007 if( zAltRepo[0]!='/' ){
1008 zAltRepo = mprintf("%s/../%s", g.zRepositoryName, zAltRepo);
1009 file_simplify_name(zAltRepo, -1);
1010 }
1011 db_close(1);
@@ -1301,11 +1302,11 @@
1302 **
1303 ** COMMAND: test-http
1304 ** Works like the http command but gives setup permission to all users.
1305 */
1306 void cmd_test_http(void){
1307 login_set_capabilities("s", 0);
1308 g.httpIn = stdin;
1309 g.httpOut = stdout;
1310 find_server_repository(0);
1311 g.cgiOutput = 1;
1312 g.fullHttpReply = 1;
1313
+1 -1
--- src/xfer.c
+++ src/xfer.c
@@ -595,11 +595,11 @@
595595
blob_reset(&combined);
596596
}
597597
if( rc==0 ){
598598
const char *zCap;
599599
zCap = db_column_text(&q, 1);
600
- login_set_capabilities(zCap);
600
+ login_set_capabilities(zCap, 0);
601601
g.userUid = db_column_int(&q, 2);
602602
g.zLogin = mprintf("%b", pLogin);
603603
g.zNonce = mprintf("%b", pNonce);
604604
}
605605
}
606606
--- src/xfer.c
+++ src/xfer.c
@@ -595,11 +595,11 @@
595 blob_reset(&combined);
596 }
597 if( rc==0 ){
598 const char *zCap;
599 zCap = db_column_text(&q, 1);
600 login_set_capabilities(zCap);
601 g.userUid = db_column_int(&q, 2);
602 g.zLogin = mprintf("%b", pLogin);
603 g.zNonce = mprintf("%b", pNonce);
604 }
605 }
606
--- src/xfer.c
+++ src/xfer.c
@@ -595,11 +595,11 @@
595 blob_reset(&combined);
596 }
597 if( rc==0 ){
598 const char *zCap;
599 zCap = db_column_text(&q, 1);
600 login_set_capabilities(zCap, 0);
601 g.userUid = db_column_int(&q, 2);
602 g.zLogin = mprintf("%b", pLogin);
603 g.zNonce = mprintf("%b", pNonce);
604 }
605 }
606

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button