@@ -139,6 +139,91 @@ func TestFilterBlockAndRefIDsByPublishAccess(t *testing.T) {
139139 }
140140}
141141
142+ func TestGetBlockInfoPublishAccess (t * testing.T ) {
143+ const (
144+ boxID = "20260806000020-box0020"
145+ protectedID = "20260806000021-protect"
146+ privateID = "20260806000022-private"
147+ privateChildID = "20260806000023-child20"
148+ disabledID = "20260806000024-disable"
149+ protectedPassword = "protected-password"
150+ privatePassword = "private-password"
151+ )
152+
153+ previousBlockTreeDBPath := util .BlockTreeDBPath
154+ previousDataDir := util .DataDir
155+ util .DataDir = t .TempDir ()
156+ util .BlockTreeDBPath = filepath .Join (util .DataDir , "blocktree.db" )
157+ treenode .InitBlockTree (true )
158+ previousPublishAccess := model .GetPublishAccess ()
159+ if err := model .SetPublishAccess (model.PublishAccess {
160+ {ID : protectedID , Visible : true , Password : protectedPassword },
161+ {ID : privateID , Visible : false , Password : privatePassword },
162+ {ID : disabledID , Visible : true , Disable : true },
163+ }); err != nil {
164+ t .Fatalf ("set publish access failed: %v" , err )
165+ }
166+ t .Cleanup (func () {
167+ _ = model .SetPublishAccess (previousPublishAccess )
168+ treenode .CloseDatabase ()
169+ util .BlockTreeDBPath = previousBlockTreeDBPath
170+ util .DataDir = previousDataDir
171+ })
172+
173+ for _ , id := range []string {protectedID , disabledID } {
174+ treenode .IndexBlockTree (& parse.Tree {
175+ ID : id ,
176+ Box : boxID ,
177+ Path : "/" + id + ".sy" ,
178+ Root : & ast.Node {ID : id , Type : ast .NodeDocument },
179+ })
180+ }
181+ privateRoot := & ast.Node {ID : privateID , Type : ast .NodeDocument }
182+ privateRoot .AppendChild (& ast.Node {ID : privateChildID , Type : ast .NodeParagraph })
183+ treenode .IndexBlockTree (& parse.Tree {
184+ ID : privateID ,
185+ Box : boxID ,
186+ Path : "/" + privateID + ".sy" ,
187+ Root : privateRoot ,
188+ })
189+
190+ c , _ := gin .CreateTestContext (httptest .NewRecorder ())
191+ c .Request = httptest .NewRequest (http .MethodPost , "/" , nil )
192+ c .Set (model .RoleContextKey , model .RoleReader )
193+
194+ _ , passwordRequired , metadataVisible , accessible := getBlockInfoPublishAccess (c , protectedID , "" )
195+ if ! passwordRequired || ! metadataVisible || ! accessible {
196+ t .Fatalf ("protected document gate = [%v, %v, %v], want password required with visible metadata" ,
197+ passwordRequired , metadataVisible , accessible )
198+ }
199+
200+ _ , passwordRequired , metadataVisible , accessible = getBlockInfoPublishAccess (c , privateID , "" )
201+ if ! passwordRequired || metadataVisible || ! accessible {
202+ t .Fatalf ("private document gate = [%v, %v, %v], want password required without visible metadata" ,
203+ passwordRequired , metadataVisible , accessible )
204+ }
205+
206+ _ , _ , _ , accessible = getBlockInfoPublishAccess (c , privateChildID , "" )
207+ if accessible {
208+ t .Fatal ("private child block should not open the password gate before authorization" )
209+ }
210+
211+ _ , _ , _ , accessible = getBlockInfoPublishAccess (c , disabledID , "" )
212+ if accessible {
213+ t .Fatal ("publish-disabled document should not open the password gate" )
214+ }
215+
216+ c .Request .AddCookie (& http.Cookie {
217+ Name : "publish-auth-" + privateID ,
218+ Value : util .SHA256Hash ([]byte (privateID + privatePassword )),
219+ })
220+ _ , passwordRequired , metadataVisible , accessible = getBlockInfoPublishAccess (c , privateChildID , "" )
221+ if passwordRequired || ! metadataVisible || ! accessible {
222+ t .Fatalf ("authorized private child gate = [%v, %v, %v], want normal access" ,
223+ passwordRequired , metadataVisible , accessible )
224+ }
225+ }
226+
142227func TestGetDocBlocksOrdersArguments (t * testing.T ) {
143228 tests := []struct {
144229 name string
0 commit comments