diff --git a/hs_err_pid12404.log b/hs_err_pid12404.log new file mode 100644 index 0000000..1994d05 --- /dev/null +++ b/hs_err_pid12404.log @@ -0,0 +1,403 @@ +# +# There is insufficient memory for the Java Runtime Environment to continue. +# Native memory allocation (malloc) failed to allocate 1152000 bytes. Error detail: AllocateHeap +# Possible reasons: +# The system is out of physical RAM or swap space +# This process is running with CompressedOops enabled, and the Java Heap may be blocking the growth of the native heap +# Possible solutions: +# Reduce memory load on the system +# Increase physical memory or swap space +# Check if swap backing store is full +# Decrease Java heap size (-Xmx/-Xms) +# Decrease number of Java threads +# Decrease Java thread stack sizes (-Xss) +# Set larger code cache with -XX:ReservedCodeCacheSize= +# JVM is running with Unscaled Compressed Oops mode in which the Java heap is +# placed in the first 4GB address space. The Java Heap base address is the +# maximum limit for the native heap growth. Please use -XX:HeapBaseMinAddress +# to set the Java Heap base and to place the Java Heap above 4GB virtual address. +# This output file may be truncated or incomplete. +# +# Out of Memory Error (allocation.cpp:44), pid=12404, tid=2436 +# +# JRE version: (21.0.5+8) (build ) +# Java VM: OpenJDK 64-Bit Server VM (21.0.5+8-b631.16, mixed mode, tiered, compressed oops, compressed class ptrs, g1 gc, windows-amd64) +# No core dump will be written. Minidumps are not enabled by default on client versions of Windows +# + +--------------- S U M M A R Y ------------ + +Command Line: git4idea.http.GitAskPassApp Username for 'https://github.com': + +Host: 11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz, 8 cores, 7G, Windows 11 , 64 bit Build 22621 (10.0.22621.5262) +Time: Sun Jun 1 02:28:04 2025 Windows 11 , 64 bit Build 22621 (10.0.22621.5262) elapsed time: 0.418577 seconds (0d 0h 0m 0s) + +--------------- T H R E A D --------------- + +Current thread (0x000002cf06ec4970): JavaThread "Unknown thread" [_thread_in_vm, id=2436, stack(0x000000f577800000,0x000000f577900000) (1024K)] + +Stack: [0x000000f577800000,0x000000f577900000] +Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) +V [jvm.dll+0x6e52b9] +V [jvm.dll+0x8c3633] +V [jvm.dll+0x8c5b8e] +V [jvm.dll+0x8c6273] +V [jvm.dll+0x288f46] +V [jvm.dll+0xc0e57] +V [jvm.dll+0x8c101d] +V [jvm.dll+0x88ac1f] +V [jvm.dll+0x3ca518] +V [jvm.dll+0x873b98] +V [jvm.dll+0x45eede] +V [jvm.dll+0x460bc1] +C [jli.dll+0x52ab] +C [ucrtbase.dll+0x29333] +C [KERNEL32.DLL+0x1259d] +C [ntdll.dll+0x5af58] + + +--------------- P R O C E S S --------------- + +Threads class SMR info: +_java_thread_list=0x00007ff819bea148, length=0, elements={ +} + +Java Threads: ( => current thread ) +Total: 0 + +Other Threads: + 0x000002cf09213c30 WorkerThread "GC Thread#0" [id=15656, stack(0x000000f577900000,0x000000f577a00000) (1024K)] + 0x000002cf09224290 ConcurrentGCThread "G1 Main Marker" [id=12096, stack(0x000000f577a00000,0x000000f577b00000) (1024K)] + 0x000002cf09225df0 WorkerThread "G1 Conc#0" [id=18784, stack(0x000000f577b00000,0x000000f577c00000) (1024K)] + 0x000002cf0927e060 ConcurrentGCThread "G1 Refine#0" [id=18988, stack(0x000000f577c00000,0x000000f577d00000) (1024K)] + 0x000002cf0927ead0 ConcurrentGCThread "G1 Service" [id=17324, stack(0x000000f577d00000,0x000000f577e00000) (1024K)] + +=>0x000002cf06ec4970 (exited) JavaThread "Unknown thread" [_thread_in_vm, id=2436, stack(0x000000f577800000,0x000000f577900000) (1024K)] +Total: 6 + +Threads with active compile tasks: +Total: 0 + +VM state: not at safepoint (not fully initialized) + +VM Mutex/Monitor currently owned by a thread: None + +Heap address: 0x0000000084400000, size: 1980 MB, Compressed Oops mode: 32-bit + +CDS archive(s) not mapped +Compressed class space mapped at: 0x0000000100000000-0x0000000140000000, reserved size: 1073741824 +Narrow klass base: 0x0000000000000000, Narrow klass shift: 3, Narrow klass range: 0x140000000 + +GC Precious Log: + CardTable entry size: 512 + Card Set container configuration: InlinePtr #cards 5 size 8 Array Of Cards #cards 12 size 40 Howl #buckets 4 coarsen threshold 1843 Howl Bitmap #cards 512 size 80 coarsen threshold 460 Card regions per heap region 1 cards per card region 2048 + CPUs: 8 total, 8 available + Memory: 7916M + Large Page Support: Disabled + NUMA Support: Disabled + Compressed Oops: Enabled (32-bit) + Heap Region Size: 1M + Heap Min Capacity: 8M + Heap Initial Capacity: 124M + Heap Max Capacity: 1980M + Pre-touch: Disabled + Parallel Workers: 8 + Concurrent Workers: 2 + Concurrent Refinement Workers: 8 + Periodic GC: Disabled + +Heap: + garbage-first heap total 126976K, used 0K [0x0000000084400000, 0x0000000100000000) + region size 1024K, 0 young (0K), 0 survivors (0K) + Metaspace used 0K, committed 0K, reserved 1048576K + class space used 0K, committed 0K, reserved 1048576K + +Heap Regions: E=young(eden), S=young(survivor), O=old, HS=humongous(starts), HC=humongous(continues), CS=collection set, F=free, TAMS=top-at-mark-start, PB=parsable bottom +| 0|0x0000000084400000, 0x0000000084400000, 0x0000000084500000| 0%| F| |TAMS 0x0000000084400000| PB 0x0000000084400000| Untracked +| 1|0x0000000084500000, 0x0000000084500000, 0x0000000084600000| 0%| F| |TAMS 0x0000000084500000| PB 0x0000000084500000| Untracked +| 2|0x0000000084600000, 0x0000000084600000, 0x0000000084700000| 0%| F| |TAMS 0x0000000084600000| PB 0x0000000084600000| Untracked +| 3|0x0000000084700000, 0x0000000084700000, 0x0000000084800000| 0%| F| |TAMS 0x0000000084700000| PB 0x0000000084700000| Untracked +| 4|0x0000000084800000, 0x0000000084800000, 0x0000000084900000| 0%| F| |TAMS 0x0000000084800000| PB 0x0000000084800000| Untracked +| 5|0x0000000084900000, 0x0000000084900000, 0x0000000084a00000| 0%| F| |TAMS 0x0000000084900000| PB 0x0000000084900000| Untracked +| 6|0x0000000084a00000, 0x0000000084a00000, 0x0000000084b00000| 0%| F| |TAMS 0x0000000084a00000| PB 0x0000000084a00000| Untracked +| 7|0x0000000084b00000, 0x0000000084b00000, 0x0000000084c00000| 0%| F| |TAMS 0x0000000084b00000| PB 0x0000000084b00000| Untracked +| 8|0x0000000084c00000, 0x0000000084c00000, 0x0000000084d00000| 0%| F| |TAMS 0x0000000084c00000| PB 0x0000000084c00000| Untracked +| 9|0x0000000084d00000, 0x0000000084d00000, 0x0000000084e00000| 0%| F| |TAMS 0x0000000084d00000| PB 0x0000000084d00000| Untracked +| 10|0x0000000084e00000, 0x0000000084e00000, 0x0000000084f00000| 0%| F| |TAMS 0x0000000084e00000| PB 0x0000000084e00000| Untracked +| 11|0x0000000084f00000, 0x0000000084f00000, 0x0000000085000000| 0%| F| |TAMS 0x0000000084f00000| PB 0x0000000084f00000| Untracked +| 12|0x0000000085000000, 0x0000000085000000, 0x0000000085100000| 0%| F| |TAMS 0x0000000085000000| PB 0x0000000085000000| Untracked +| 13|0x0000000085100000, 0x0000000085100000, 0x0000000085200000| 0%| F| |TAMS 0x0000000085100000| PB 0x0000000085100000| Untracked +| 14|0x0000000085200000, 0x0000000085200000, 0x0000000085300000| 0%| F| |TAMS 0x0000000085200000| PB 0x0000000085200000| Untracked +| 15|0x0000000085300000, 0x0000000085300000, 0x0000000085400000| 0%| F| |TAMS 0x0000000085300000| PB 0x0000000085300000| Untracked +| 16|0x0000000085400000, 0x0000000085400000, 0x0000000085500000| 0%| F| |TAMS 0x0000000085400000| PB 0x0000000085400000| Untracked +| 17|0x0000000085500000, 0x0000000085500000, 0x0000000085600000| 0%| F| |TAMS 0x0000000085500000| PB 0x0000000085500000| Untracked +| 18|0x0000000085600000, 0x0000000085600000, 0x0000000085700000| 0%| F| |TAMS 0x0000000085600000| PB 0x0000000085600000| Untracked +| 19|0x0000000085700000, 0x0000000085700000, 0x0000000085800000| 0%| F| |TAMS 0x0000000085700000| PB 0x0000000085700000| Untracked +| 20|0x0000000085800000, 0x0000000085800000, 0x0000000085900000| 0%| F| |TAMS 0x0000000085800000| PB 0x0000000085800000| Untracked +| 21|0x0000000085900000, 0x0000000085900000, 0x0000000085a00000| 0%| F| |TAMS 0x0000000085900000| PB 0x0000000085900000| Untracked +| 22|0x0000000085a00000, 0x0000000085a00000, 0x0000000085b00000| 0%| F| |TAMS 0x0000000085a00000| PB 0x0000000085a00000| Untracked +| 23|0x0000000085b00000, 0x0000000085b00000, 0x0000000085c00000| 0%| F| |TAMS 0x0000000085b00000| PB 0x0000000085b00000| Untracked +| 24|0x0000000085c00000, 0x0000000085c00000, 0x0000000085d00000| 0%| F| |TAMS 0x0000000085c00000| PB 0x0000000085c00000| Untracked +| 25|0x0000000085d00000, 0x0000000085d00000, 0x0000000085e00000| 0%| F| |TAMS 0x0000000085d00000| PB 0x0000000085d00000| Untracked +| 26|0x0000000085e00000, 0x0000000085e00000, 0x0000000085f00000| 0%| F| |TAMS 0x0000000085e00000| PB 0x0000000085e00000| Untracked +| 27|0x0000000085f00000, 0x0000000085f00000, 0x0000000086000000| 0%| F| |TAMS 0x0000000085f00000| PB 0x0000000085f00000| Untracked +| 28|0x0000000086000000, 0x0000000086000000, 0x0000000086100000| 0%| F| |TAMS 0x0000000086000000| PB 0x0000000086000000| Untracked +| 29|0x0000000086100000, 0x0000000086100000, 0x0000000086200000| 0%| F| |TAMS 0x0000000086100000| PB 0x0000000086100000| Untracked +| 30|0x0000000086200000, 0x0000000086200000, 0x0000000086300000| 0%| F| |TAMS 0x0000000086200000| PB 0x0000000086200000| Untracked +| 31|0x0000000086300000, 0x0000000086300000, 0x0000000086400000| 0%| F| |TAMS 0x0000000086300000| PB 0x0000000086300000| Untracked +| 32|0x0000000086400000, 0x0000000086400000, 0x0000000086500000| 0%| F| |TAMS 0x0000000086400000| PB 0x0000000086400000| Untracked +| 33|0x0000000086500000, 0x0000000086500000, 0x0000000086600000| 0%| F| |TAMS 0x0000000086500000| PB 0x0000000086500000| Untracked +| 34|0x0000000086600000, 0x0000000086600000, 0x0000000086700000| 0%| F| |TAMS 0x0000000086600000| PB 0x0000000086600000| Untracked +| 35|0x0000000086700000, 0x0000000086700000, 0x0000000086800000| 0%| F| |TAMS 0x0000000086700000| PB 0x0000000086700000| Untracked +| 36|0x0000000086800000, 0x0000000086800000, 0x0000000086900000| 0%| F| |TAMS 0x0000000086800000| PB 0x0000000086800000| Untracked +| 37|0x0000000086900000, 0x0000000086900000, 0x0000000086a00000| 0%| F| |TAMS 0x0000000086900000| PB 0x0000000086900000| Untracked +| 38|0x0000000086a00000, 0x0000000086a00000, 0x0000000086b00000| 0%| F| |TAMS 0x0000000086a00000| PB 0x0000000086a00000| Untracked +| 39|0x0000000086b00000, 0x0000000086b00000, 0x0000000086c00000| 0%| F| |TAMS 0x0000000086b00000| PB 0x0000000086b00000| Untracked +| 40|0x0000000086c00000, 0x0000000086c00000, 0x0000000086d00000| 0%| F| |TAMS 0x0000000086c00000| PB 0x0000000086c00000| Untracked +| 41|0x0000000086d00000, 0x0000000086d00000, 0x0000000086e00000| 0%| F| |TAMS 0x0000000086d00000| PB 0x0000000086d00000| Untracked +| 42|0x0000000086e00000, 0x0000000086e00000, 0x0000000086f00000| 0%| F| |TAMS 0x0000000086e00000| PB 0x0000000086e00000| Untracked +| 43|0x0000000086f00000, 0x0000000086f00000, 0x0000000087000000| 0%| F| |TAMS 0x0000000086f00000| PB 0x0000000086f00000| Untracked +| 44|0x0000000087000000, 0x0000000087000000, 0x0000000087100000| 0%| F| |TAMS 0x0000000087000000| PB 0x0000000087000000| Untracked +| 45|0x0000000087100000, 0x0000000087100000, 0x0000000087200000| 0%| F| |TAMS 0x0000000087100000| PB 0x0000000087100000| Untracked +| 46|0x0000000087200000, 0x0000000087200000, 0x0000000087300000| 0%| F| |TAMS 0x0000000087200000| PB 0x0000000087200000| Untracked +| 47|0x0000000087300000, 0x0000000087300000, 0x0000000087400000| 0%| F| |TAMS 0x0000000087300000| PB 0x0000000087300000| Untracked +| 48|0x0000000087400000, 0x0000000087400000, 0x0000000087500000| 0%| F| |TAMS 0x0000000087400000| PB 0x0000000087400000| Untracked +| 49|0x0000000087500000, 0x0000000087500000, 0x0000000087600000| 0%| F| |TAMS 0x0000000087500000| PB 0x0000000087500000| Untracked +| 50|0x0000000087600000, 0x0000000087600000, 0x0000000087700000| 0%| F| |TAMS 0x0000000087600000| PB 0x0000000087600000| Untracked +| 51|0x0000000087700000, 0x0000000087700000, 0x0000000087800000| 0%| F| |TAMS 0x0000000087700000| PB 0x0000000087700000| Untracked +| 52|0x0000000087800000, 0x0000000087800000, 0x0000000087900000| 0%| F| |TAMS 0x0000000087800000| PB 0x0000000087800000| Untracked +| 53|0x0000000087900000, 0x0000000087900000, 0x0000000087a00000| 0%| F| |TAMS 0x0000000087900000| PB 0x0000000087900000| Untracked +| 54|0x0000000087a00000, 0x0000000087a00000, 0x0000000087b00000| 0%| F| |TAMS 0x0000000087a00000| PB 0x0000000087a00000| Untracked +| 55|0x0000000087b00000, 0x0000000087b00000, 0x0000000087c00000| 0%| F| |TAMS 0x0000000087b00000| PB 0x0000000087b00000| Untracked +| 56|0x0000000087c00000, 0x0000000087c00000, 0x0000000087d00000| 0%| F| |TAMS 0x0000000087c00000| PB 0x0000000087c00000| Untracked +| 57|0x0000000087d00000, 0x0000000087d00000, 0x0000000087e00000| 0%| F| |TAMS 0x0000000087d00000| PB 0x0000000087d00000| Untracked +| 58|0x0000000087e00000, 0x0000000087e00000, 0x0000000087f00000| 0%| F| |TAMS 0x0000000087e00000| PB 0x0000000087e00000| Untracked +| 59|0x0000000087f00000, 0x0000000087f00000, 0x0000000088000000| 0%| F| |TAMS 0x0000000087f00000| PB 0x0000000087f00000| Untracked +| 60|0x0000000088000000, 0x0000000088000000, 0x0000000088100000| 0%| F| |TAMS 0x0000000088000000| PB 0x0000000088000000| Untracked +| 61|0x0000000088100000, 0x0000000088100000, 0x0000000088200000| 0%| F| |TAMS 0x0000000088100000| PB 0x0000000088100000| Untracked +| 62|0x0000000088200000, 0x0000000088200000, 0x0000000088300000| 0%| F| |TAMS 0x0000000088200000| PB 0x0000000088200000| Untracked +| 63|0x0000000088300000, 0x0000000088300000, 0x0000000088400000| 0%| F| |TAMS 0x0000000088300000| PB 0x0000000088300000| Untracked +| 64|0x0000000088400000, 0x0000000088400000, 0x0000000088500000| 0%| F| |TAMS 0x0000000088400000| PB 0x0000000088400000| Untracked +| 65|0x0000000088500000, 0x0000000088500000, 0x0000000088600000| 0%| F| |TAMS 0x0000000088500000| PB 0x0000000088500000| Untracked +| 66|0x0000000088600000, 0x0000000088600000, 0x0000000088700000| 0%| F| |TAMS 0x0000000088600000| PB 0x0000000088600000| Untracked +| 67|0x0000000088700000, 0x0000000088700000, 0x0000000088800000| 0%| F| |TAMS 0x0000000088700000| PB 0x0000000088700000| Untracked +| 68|0x0000000088800000, 0x0000000088800000, 0x0000000088900000| 0%| F| |TAMS 0x0000000088800000| PB 0x0000000088800000| Untracked +| 69|0x0000000088900000, 0x0000000088900000, 0x0000000088a00000| 0%| F| |TAMS 0x0000000088900000| PB 0x0000000088900000| Untracked +| 70|0x0000000088a00000, 0x0000000088a00000, 0x0000000088b00000| 0%| F| |TAMS 0x0000000088a00000| PB 0x0000000088a00000| Untracked +| 71|0x0000000088b00000, 0x0000000088b00000, 0x0000000088c00000| 0%| F| |TAMS 0x0000000088b00000| PB 0x0000000088b00000| Untracked +| 72|0x0000000088c00000, 0x0000000088c00000, 0x0000000088d00000| 0%| F| |TAMS 0x0000000088c00000| PB 0x0000000088c00000| Untracked +| 73|0x0000000088d00000, 0x0000000088d00000, 0x0000000088e00000| 0%| F| |TAMS 0x0000000088d00000| PB 0x0000000088d00000| Untracked +| 74|0x0000000088e00000, 0x0000000088e00000, 0x0000000088f00000| 0%| F| |TAMS 0x0000000088e00000| PB 0x0000000088e00000| Untracked +| 75|0x0000000088f00000, 0x0000000088f00000, 0x0000000089000000| 0%| F| |TAMS 0x0000000088f00000| PB 0x0000000088f00000| Untracked +| 76|0x0000000089000000, 0x0000000089000000, 0x0000000089100000| 0%| F| |TAMS 0x0000000089000000| PB 0x0000000089000000| Untracked +| 77|0x0000000089100000, 0x0000000089100000, 0x0000000089200000| 0%| F| |TAMS 0x0000000089100000| PB 0x0000000089100000| Untracked +| 78|0x0000000089200000, 0x0000000089200000, 0x0000000089300000| 0%| F| |TAMS 0x0000000089200000| PB 0x0000000089200000| Untracked +| 79|0x0000000089300000, 0x0000000089300000, 0x0000000089400000| 0%| F| |TAMS 0x0000000089300000| PB 0x0000000089300000| Untracked +| 80|0x0000000089400000, 0x0000000089400000, 0x0000000089500000| 0%| F| |TAMS 0x0000000089400000| PB 0x0000000089400000| Untracked +| 81|0x0000000089500000, 0x0000000089500000, 0x0000000089600000| 0%| F| |TAMS 0x0000000089500000| PB 0x0000000089500000| Untracked +| 82|0x0000000089600000, 0x0000000089600000, 0x0000000089700000| 0%| F| |TAMS 0x0000000089600000| PB 0x0000000089600000| Untracked +| 83|0x0000000089700000, 0x0000000089700000, 0x0000000089800000| 0%| F| |TAMS 0x0000000089700000| PB 0x0000000089700000| Untracked +| 84|0x0000000089800000, 0x0000000089800000, 0x0000000089900000| 0%| F| |TAMS 0x0000000089800000| PB 0x0000000089800000| Untracked +| 85|0x0000000089900000, 0x0000000089900000, 0x0000000089a00000| 0%| F| |TAMS 0x0000000089900000| PB 0x0000000089900000| Untracked +| 86|0x0000000089a00000, 0x0000000089a00000, 0x0000000089b00000| 0%| F| |TAMS 0x0000000089a00000| PB 0x0000000089a00000| Untracked +| 87|0x0000000089b00000, 0x0000000089b00000, 0x0000000089c00000| 0%| F| |TAMS 0x0000000089b00000| PB 0x0000000089b00000| Untracked +| 88|0x0000000089c00000, 0x0000000089c00000, 0x0000000089d00000| 0%| F| |TAMS 0x0000000089c00000| PB 0x0000000089c00000| Untracked +| 89|0x0000000089d00000, 0x0000000089d00000, 0x0000000089e00000| 0%| F| |TAMS 0x0000000089d00000| PB 0x0000000089d00000| Untracked +| 90|0x0000000089e00000, 0x0000000089e00000, 0x0000000089f00000| 0%| F| |TAMS 0x0000000089e00000| PB 0x0000000089e00000| Untracked +| 91|0x0000000089f00000, 0x0000000089f00000, 0x000000008a000000| 0%| F| |TAMS 0x0000000089f00000| PB 0x0000000089f00000| Untracked +| 92|0x000000008a000000, 0x000000008a000000, 0x000000008a100000| 0%| F| |TAMS 0x000000008a000000| PB 0x000000008a000000| Untracked +| 93|0x000000008a100000, 0x000000008a100000, 0x000000008a200000| 0%| F| |TAMS 0x000000008a100000| PB 0x000000008a100000| Untracked +| 94|0x000000008a200000, 0x000000008a200000, 0x000000008a300000| 0%| F| |TAMS 0x000000008a200000| PB 0x000000008a200000| Untracked +| 95|0x000000008a300000, 0x000000008a300000, 0x000000008a400000| 0%| F| |TAMS 0x000000008a300000| PB 0x000000008a300000| Untracked +| 96|0x000000008a400000, 0x000000008a400000, 0x000000008a500000| 0%| F| |TAMS 0x000000008a400000| PB 0x000000008a400000| Untracked +| 97|0x000000008a500000, 0x000000008a500000, 0x000000008a600000| 0%| F| |TAMS 0x000000008a500000| PB 0x000000008a500000| Untracked +| 98|0x000000008a600000, 0x000000008a600000, 0x000000008a700000| 0%| F| |TAMS 0x000000008a600000| PB 0x000000008a600000| Untracked +| 99|0x000000008a700000, 0x000000008a700000, 0x000000008a800000| 0%| F| |TAMS 0x000000008a700000| PB 0x000000008a700000| Untracked +| 100|0x000000008a800000, 0x000000008a800000, 0x000000008a900000| 0%| F| |TAMS 0x000000008a800000| PB 0x000000008a800000| Untracked +| 101|0x000000008a900000, 0x000000008a900000, 0x000000008aa00000| 0%| F| |TAMS 0x000000008a900000| PB 0x000000008a900000| Untracked +| 102|0x000000008aa00000, 0x000000008aa00000, 0x000000008ab00000| 0%| F| |TAMS 0x000000008aa00000| PB 0x000000008aa00000| Untracked +| 103|0x000000008ab00000, 0x000000008ab00000, 0x000000008ac00000| 0%| F| |TAMS 0x000000008ab00000| PB 0x000000008ab00000| Untracked +| 104|0x000000008ac00000, 0x000000008ac00000, 0x000000008ad00000| 0%| F| |TAMS 0x000000008ac00000| PB 0x000000008ac00000| Untracked +| 105|0x000000008ad00000, 0x000000008ad00000, 0x000000008ae00000| 0%| F| |TAMS 0x000000008ad00000| PB 0x000000008ad00000| Untracked +| 106|0x000000008ae00000, 0x000000008ae00000, 0x000000008af00000| 0%| F| |TAMS 0x000000008ae00000| PB 0x000000008ae00000| Untracked +| 107|0x000000008af00000, 0x000000008af00000, 0x000000008b000000| 0%| F| |TAMS 0x000000008af00000| PB 0x000000008af00000| Untracked +| 108|0x000000008b000000, 0x000000008b000000, 0x000000008b100000| 0%| F| |TAMS 0x000000008b000000| PB 0x000000008b000000| Untracked +| 109|0x000000008b100000, 0x000000008b100000, 0x000000008b200000| 0%| F| |TAMS 0x000000008b100000| PB 0x000000008b100000| Untracked +| 110|0x000000008b200000, 0x000000008b200000, 0x000000008b300000| 0%| F| |TAMS 0x000000008b200000| PB 0x000000008b200000| Untracked +| 111|0x000000008b300000, 0x000000008b300000, 0x000000008b400000| 0%| F| |TAMS 0x000000008b300000| PB 0x000000008b300000| Untracked +| 112|0x000000008b400000, 0x000000008b400000, 0x000000008b500000| 0%| F| |TAMS 0x000000008b400000| PB 0x000000008b400000| Untracked +| 113|0x000000008b500000, 0x000000008b500000, 0x000000008b600000| 0%| F| |TAMS 0x000000008b500000| PB 0x000000008b500000| Untracked +| 114|0x000000008b600000, 0x000000008b600000, 0x000000008b700000| 0%| F| |TAMS 0x000000008b600000| PB 0x000000008b600000| Untracked +| 115|0x000000008b700000, 0x000000008b700000, 0x000000008b800000| 0%| F| |TAMS 0x000000008b700000| PB 0x000000008b700000| Untracked +| 116|0x000000008b800000, 0x000000008b800000, 0x000000008b900000| 0%| F| |TAMS 0x000000008b800000| PB 0x000000008b800000| Untracked +| 117|0x000000008b900000, 0x000000008b900000, 0x000000008ba00000| 0%| F| |TAMS 0x000000008b900000| PB 0x000000008b900000| Untracked +| 118|0x000000008ba00000, 0x000000008ba00000, 0x000000008bb00000| 0%| F| |TAMS 0x000000008ba00000| PB 0x000000008ba00000| Untracked +| 119|0x000000008bb00000, 0x000000008bb00000, 0x000000008bc00000| 0%| F| |TAMS 0x000000008bb00000| PB 0x000000008bb00000| Untracked +| 120|0x000000008bc00000, 0x000000008bc00000, 0x000000008bd00000| 0%| F| |TAMS 0x000000008bc00000| PB 0x000000008bc00000| Untracked +| 121|0x000000008bd00000, 0x000000008bd00000, 0x000000008be00000| 0%| F| |TAMS 0x000000008bd00000| PB 0x000000008bd00000| Untracked +| 122|0x000000008be00000, 0x000000008be00000, 0x000000008bf00000| 0%| F| |TAMS 0x000000008be00000| PB 0x000000008be00000| Untracked +| 123|0x000000008bf00000, 0x000000008bf00000, 0x000000008c000000| 0%| F| |TAMS 0x000000008bf00000| PB 0x000000008bf00000| Untracked + +Card table byte_map: [0x000002cf1c860000,0x000002cf1cc40000] _byte_map_base: 0x000002cf1c43e000 + +Marking Bits: (CMBitMap*) 0x000002cf09214230 + Bits: [0x000002cf1cc40000, 0x000002cf1eb30000) + +GC Heap History (0 events): +No events + +Dll operation events (1 events): +Event: 0.034 Loaded shared library C:\Program Files\JetBrains\IntelliJ IDEA 2024.3\jbr\bin\java.dll + +Deoptimization events (0 events): +No events + +Classes loaded (0 events): +No events + +Classes unloaded (0 events): +No events + +Classes redefined (0 events): +No events + +Internal exceptions (0 events): +No events + +ZGC Phase Switch (0 events): +No events + +VM Operations (0 events): +No events + +Memory protections (0 events): +No events + +Nmethod flushes (0 events): +No events + +Events (0 events): +No events + + +Dynamic libraries: +0x00007ff6f7590000 - 0x00007ff6f759a000 C:\Program Files\JetBrains\IntelliJ IDEA 2024.3\jbr\bin\java.exe +0x00007ff899dd0000 - 0x00007ff899fe7000 C:\WINDOWS\SYSTEM32\ntdll.dll +0x00007ff8987b0000 - 0x00007ff898874000 C:\WINDOWS\System32\KERNEL32.DLL +0x00007ff897680000 - 0x00007ff897a53000 C:\WINDOWS\System32\KERNELBASE.dll +0x00007ff897420000 - 0x00007ff897531000 C:\WINDOWS\System32\ucrtbase.dll +0x00007ff88e8b0000 - 0x00007ff88e8cb000 C:\Program Files\JetBrains\IntelliJ IDEA 2024.3\jbr\bin\VCRUNTIME140.dll +0x00007ff852670000 - 0x00007ff852688000 C:\Program Files\JetBrains\IntelliJ IDEA 2024.3\jbr\bin\jli.dll +0x00007ff899a10000 - 0x00007ff899bc1000 C:\WINDOWS\System32\USER32.dll +0x00007ff896ff0000 - 0x00007ff897016000 C:\WINDOWS\System32\win32u.dll +0x00007ff899200000 - 0x00007ff899229000 C:\WINDOWS\System32\GDI32.dll +0x00007ff896ec0000 - 0x00007ff896fe2000 C:\WINDOWS\System32\gdi32full.dll +0x00007ff8876d0000 - 0x00007ff88796b000 C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.22621.5262_none_2712bde373830908\COMCTL32.dll +0x00007ff897020000 - 0x00007ff8970ba000 C:\WINDOWS\System32\msvcp_win.dll +0x00007ff899960000 - 0x00007ff899a07000 C:\WINDOWS\System32\msvcrt.dll +0x00007ff898460000 - 0x00007ff898491000 C:\WINDOWS\System32\IMM32.DLL +0x00007ff888240000 - 0x00007ff88824c000 C:\Program Files\JetBrains\IntelliJ IDEA 2024.3\jbr\bin\vcruntime140_1.dll +0x00007ff81b5e0000 - 0x00007ff81b66d000 C:\Program Files\JetBrains\IntelliJ IDEA 2024.3\jbr\bin\msvcp140.dll +0x00007ff818f90000 - 0x00007ff819d51000 C:\Program Files\JetBrains\IntelliJ IDEA 2024.3\jbr\bin\server\jvm.dll +0x00007ff898070000 - 0x00007ff898121000 C:\WINDOWS\System32\ADVAPI32.dll +0x00007ff8998a0000 - 0x00007ff899947000 C:\WINDOWS\System32\sechost.dll +0x00007ff8973f0000 - 0x00007ff897418000 C:\WINDOWS\System32\bcrypt.dll +0x00007ff897ae0000 - 0x00007ff897bf4000 C:\WINDOWS\System32\RPCRT4.dll +0x00007ff897a60000 - 0x00007ff897ad1000 C:\WINDOWS\System32\WS2_32.dll +0x00007ff894ba0000 - 0x00007ff894bd4000 C:\WINDOWS\SYSTEM32\WINMM.dll +0x00007ff896760000 - 0x00007ff8967ad000 C:\WINDOWS\SYSTEM32\POWRPROF.dll +0x00007ff88ba20000 - 0x00007ff88ba2a000 C:\WINDOWS\SYSTEM32\VERSION.dll +0x00007ff896740000 - 0x00007ff896753000 C:\WINDOWS\SYSTEM32\UMPDC.dll +0x00007ff895ec0000 - 0x00007ff895ed8000 C:\WINDOWS\SYSTEM32\kernel.appcore.dll +0x00007ff887fc0000 - 0x00007ff887fca000 C:\Program Files\JetBrains\IntelliJ IDEA 2024.3\jbr\bin\jimage.dll +0x00007ff894640000 - 0x00007ff894872000 C:\WINDOWS\SYSTEM32\DBGHELP.DLL +0x00007ff897c70000 - 0x00007ff898003000 C:\WINDOWS\System32\combase.dll +0x00007ff8986d0000 - 0x00007ff8987a7000 C:\WINDOWS\System32\OLEAUT32.dll +0x00007ff8949f0000 - 0x00007ff894a22000 C:\WINDOWS\SYSTEM32\dbgcore.DLL +0x00007ff897540000 - 0x00007ff8975bb000 C:\WINDOWS\System32\bcryptPrimitives.dll +0x00007ff887fa0000 - 0x00007ff887fc0000 C:\Program Files\JetBrains\IntelliJ IDEA 2024.3\jbr\bin\java.dll + +dbghelp: loaded successfully - version: 4.0.5 - missing functions: none +symbol engine: initialized successfully - sym options: 0x614 - pdb path: .;C:\Program Files\JetBrains\IntelliJ IDEA 2024.3\jbr\bin;C:\WINDOWS\SYSTEM32;C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.22621.5262_none_2712bde373830908;C:\Program Files\JetBrains\IntelliJ IDEA 2024.3\jbr\bin\server + +VM Arguments: +java_command: git4idea.http.GitAskPassApp Username for 'https://github.com': +java_class_path (initial): C:/Program Files/JetBrains/IntelliJ IDEA 2024.3/plugins/vcs-git/lib/git4idea-rt.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2024.3/lib/externalProcess-rt.jar +Launcher Type: SUN_STANDARD + +[Global flags] + intx CICompilerCount = 4 {product} {ergonomic} + uint ConcGCThreads = 2 {product} {ergonomic} + uint G1ConcRefinementThreads = 8 {product} {ergonomic} + size_t G1HeapRegionSize = 1048576 {product} {ergonomic} + uintx GCDrainStackTargetSize = 64 {product} {ergonomic} + size_t InitialHeapSize = 130023424 {product} {ergonomic} + size_t MarkStackSize = 4194304 {product} {ergonomic} + size_t MaxHeapSize = 2076180480 {product} {ergonomic} + size_t MaxNewSize = 1245708288 {product} {ergonomic} + size_t MinHeapDeltaBytes = 1048576 {product} {ergonomic} + size_t MinHeapSize = 8388608 {product} {ergonomic} + uintx NonNMethodCodeHeapSize = 5839372 {pd product} {ergonomic} + uintx NonProfiledCodeHeapSize = 122909434 {pd product} {ergonomic} + uintx ProfiledCodeHeapSize = 122909434 {pd product} {ergonomic} + uintx ReservedCodeCacheSize = 251658240 {pd product} {ergonomic} + bool SegmentedCodeCache = true {product} {ergonomic} + size_t SoftMaxHeapSize = 2076180480 {manageable} {ergonomic} + bool UseCompressedOops = true {product lp64_product} {ergonomic} + bool UseG1GC = true {product} {ergonomic} + bool UseLargePagesIndividualAllocation = false {pd product} {ergonomic} + +Logging: +Log output configuration: + #0: stdout all=warning uptime,level,tags foldmultilines=false + #1: stderr all=off uptime,level,tags foldmultilines=false + +Environment Variables: +JAVA_HOME=C:\Program Files\Java\jdk-20.0.1 +CLASSPATH=C:\Program Files\Java\jdk-20.0.1\lib +PATH=C:\Program Files\Git\mingw64\libexec\git-core;C:\Program Files\Git\mingw64\libexec\git-core;C:\Program Files\Git\mingw64\bin;C:\Program Files\Git\usr\bin;C:\Users\user\bin;C:\Program Files\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\VMware\VMware Player\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Program Files\Java\jdk-20.0.1\bin;C:\;C:\Program Files\Git\cmd;C:\flutter\flutter\bin;C:\Program Files\dotnet;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files (x86)\NetSarang\Xftp 7;C:\Users\user\AppData\Roaming\nvm;C:\Program Files\nodejs;C:\python3.10\Scripts;C:\python3.10;C:\Users\user\AppData\Local\Microsoft\WindowsApps;C:\Users\user\AppData\Local\GitHubDesktop\bin;C:\Users\user\AppData\Local\Programs\Microsoft VS Code\bin;C:\flutter\flutter\bin;C:\Users\user\AppData\Roaming\npm;C:\Users\user\.dotnet\tools;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2023.3.6\bin;C:\Program Files\JetBrains\PyCharm Community Edition 2024.1.4\bin;C:\Users\user\AppData\Local\Programs\Ollama;C:\Users\user\AppData\Roaming\nvm;C:\Program Files\nodejs +USERNAME=user +DISPLAY=:0.0 +LC_ALL=en_US.UTF-8 +TERM=xterm-256color +TMPDIR=C:\Users\user\AppData\Local\Temp +OS=Windows_NT +PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 140 Stepping 1, GenuineIntel +TMP=C:\Users\user\AppData\Local\Temp +TEMP=C:\Users\user\AppData\Local\Temp + + + + +Periodic native trim disabled + +JNI global refs: +JNI global refs: 0, weak refs: 0 + +JNI global refs memory usage: 0, weak refs: 0 + +Process memory usage: +Resident Set Size: 13528K (0% of 8106168K total physical memory with 574420K free physical memory) + +OOME stack traces (most recent first): +Classloader memory used: + +--------------- S Y S T E M --------------- + +OS: + Windows 11 , 64 bit Build 22621 (10.0.22621.5262) +OS uptime: 11 days 21:10 hours +Hyper-V role detected + +CPU: total 8 (initial active 8) (4 cores per cpu, 2 threads per core) family 6 model 140 stepping 1 microcode 0x8a, cx8, cmov, fxsr, ht, mmx, 3dnowpref, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, lzcnt, tsc, tscinvbit, avx, avx2, aes, erms, clmul, bmi1, bmi2, adx, avx512f, avx512dq, avx512cd, avx512bw, avx512vl, sha, fma, vzeroupper, avx512_vpopcntdq, avx512_vpclmulqdq, avx512_vaes, avx512_vnni, clflush, clflushopt, clwb, avx512_vbmi2, avx512_vbmi, hv, rdtscp, rdpid, fsrm, gfni, avx512_bitalg, f16c, cet_ibt, cet_ss, avx512_ifma +Processor Information for all 8 processors : + Max Mhz: 2419, Current Mhz: 2419, Mhz Limit: 2419 + +Memory: 4k page, system-wide physical 7916M (560M free) +TotalPageFile size 15975M (AvailPageFile size 5M) +current process WorkingSet (physical memory assigned to process): 13M, peak: 13M +current process commit charge ("private bytes"): 188M, peak: 192M + +vm_info: OpenJDK 64-Bit Server VM (21.0.5+8-b631.16) for windows-amd64 JRE (21.0.5+8-b631.16), built on 2024-11-02 by "builduser" with MS VC++ 16.10 / 16.11 (VS2019) + +END. diff --git a/src/main/java/com/example/gp_backend_data/card/controller/CardController.java b/src/main/java/com/example/gp_backend_data/card/controller/CardController.java index 43a6a7e..3d8184a 100644 --- a/src/main/java/com/example/gp_backend_data/card/controller/CardController.java +++ b/src/main/java/com/example/gp_backend_data/card/controller/CardController.java @@ -25,24 +25,29 @@ public class CardController { private final CardService cardService; @PostMapping - public CardCreateResponse createCard(@RequestBody CardCreateRequest request) { - return cardService.createCard(request); + public CardCreateResponse createCard( + @RequestHeader("x-auth-sub") UUID userId, + @RequestBody CardCreateRequest request) { + return cardService.createCard(userId, request); } @GetMapping("/{cardId}") - public CardCreateResponse getCardDetails(@PathVariable UUID cardId) { - return cardService.getCardDetails(cardId); + public CardCreateResponse getCardDetails( + @RequestHeader("x-auty-sub") UUID userId, + @PathVariable UUID cardId) { + return cardService.getCardDetails(userId, cardId); } @GetMapping("/by-space") public List getCardsBySpace( + @RequestHeader("x-auth-sub") UUID userId, @RequestParam UUID spaceId, @RequestParam(defaultValue = "10") int count, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "createdAt") String sortBy) { try { - return cardService.getCardsBySpace(spaceId, count, page, sortBy); + return cardService.getCardsBySpace(userId, spaceId, count, page, sortBy); } catch (IllegalArgumentException e) { throw new IllegalArgumentException("400 Bad Request: " + e.getMessage()); } catch (EntityNotFoundException e) { @@ -64,14 +69,17 @@ public ResponseEntity> getCardlinkedCards( @PatchMapping("/{cardId}") public CardResponse updateCard( + @RequestHeader("x-auth-sub") UUID userId, @PathVariable UUID cardId, @RequestBody CardUpdateRequest request) { - return cardService.updateCard(cardId, request); + return cardService.updateCard(userId, cardId, request); } @DeleteMapping("/{cardId}") - public ResponseEntity deleteCard(@PathVariable UUID cardId) { - cardService.deleteCard(cardId); + public ResponseEntity deleteCard( + @RequestHeader("x-auth-sub") UUID userId, + @PathVariable UUID cardId) { + cardService.deleteCard(userId, cardId); return ResponseEntity.ok().build(); } diff --git a/src/main/java/com/example/gp_backend_data/card/controller/CardlinkController.java b/src/main/java/com/example/gp_backend_data/card/controller/CardlinkController.java index f783dc6..be5d1f2 100644 --- a/src/main/java/com/example/gp_backend_data/card/controller/CardlinkController.java +++ b/src/main/java/com/example/gp_backend_data/card/controller/CardlinkController.java @@ -20,19 +20,21 @@ public class CardlinkController { @PostMapping public ResponseEntity createCardlink( + @RequestHeader("x-auth-sub") UUID userId, @PathVariable UUID cardId, @RequestBody CardlinkCreateRequest request ) { - CardlinkResponse response = cardlinkService.createCardlink(cardId, request); + CardlinkResponse response = cardlinkService.createCardlink(userId, cardId, request); return ResponseEntity.status(HttpStatus.CREATED).body(response); } @DeleteMapping("/{cardlinkId}") public ResponseEntity deleteCardlink( + @RequestHeader("x-auth-sub") UUID userId, @PathVariable UUID cardId, @PathVariable UUID cardlinkId) { - cardlinkService.deleteCardlink(cardId, cardlinkId); + cardlinkService.deleteCardlink(userId, cardId, cardlinkId); return ResponseEntity.ok().build(); } } diff --git a/src/main/java/com/example/gp_backend_data/card/service/CardService.java b/src/main/java/com/example/gp_backend_data/card/service/CardService.java index d36cca7..734d7eb 100644 --- a/src/main/java/com/example/gp_backend_data/card/service/CardService.java +++ b/src/main/java/com/example/gp_backend_data/card/service/CardService.java @@ -37,8 +37,26 @@ public class CardService { private final CardlinkRepository cardlinkRepository; private final UUIDHelper uuidHelper; - //지식카드 생성 - public CardCreateResponse createCard(CardCreateRequest request) { + // 권한 체크: userId가 해당 spaceId에 접근 가능한지 검사 + private void validateUserAccessToSpace(UUID userId, byte[] spaceId) { + boolean exists = spaceRepository.existsBySpaceIdAndUserId(spaceId, uuidHelper.convertUUIDToByteArray(userId)); + if (!exists) { + throw new ResponseStatusException(HttpStatus.FORBIDDEN, "User does not have access to the specified space"); + } + } + + // cardId로 카드 조회 후 권한 체크 포함 반환 + private Card getCardWithAccessCheck(UUID userId, UUID cardId) { + Card card = cardRepository.findByCardId(uuidHelper.convertUUIDToByteArray(cardId)) + .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, "Card not found")); + validateUserAccessToSpace(userId, card.getSpaceId()); + return card; + } + + //새 지식카드 생성 - 사용자가 직접 생성 + public CardCreateResponse createCard(UUID userId, CardCreateRequest request) { + + validateUserAccessToSpace(userId, uuidHelper.convertUUIDToByteArray(request.getSpaceId())); // 한국 시간으로 LocalDateTime 생성 LocalDateTime nowInKorea = ZonedDateTime.now(ZoneId.of("Asia/Seoul")).toLocalDateTime(); @@ -71,9 +89,8 @@ public CardCreateResponse createCard(CardCreateRequest request) { //지식카드 세부정보 조회 @Transactional(readOnly = true) - public CardCreateResponse getCardDetails(UUID cardId) { - Card card = cardRepository.findByCardId(uuidHelper.convertUUIDToByteArray(cardId)) - .orElseThrow(() -> new IllegalArgumentException("Card not found")); + public CardCreateResponse getCardDetails(UUID userId, UUID cardId) { + Card card = getCardWithAccessCheck(userId, cardId); List cardlinkDtos = cardlinkRepository.findByCard_CardId(uuidHelper.convertUUIDToByteArray(cardId)).stream() @@ -100,11 +117,13 @@ public CardCreateResponse getCardDetails(UUID cardId) { //특정 스페이스의 지식카드 목록 조회 @Transactional(readOnly = true) - public List getCardsBySpace(UUID spaceId, int count, int page, String sortBy) { + public List getCardsBySpace(UUID userId, UUID spaceId, int count, int page, String sortBy) { if (!"createdAt".equals(sortBy)) { throw new IllegalArgumentException("400 Bad Request: Invalid sortBy value"); } + validateUserAccessToSpace(userId, uuidHelper.convertUUIDToByteArray(spaceId)); + Pageable pageable = PageRequest.of(page - 1, count, Sort.by(Sort.Direction.DESC, "createdAt")); Page cardPage = cardRepository.findBySpaceId(uuidHelper.convertUUIDToByteArray(spaceId), pageable); @@ -188,12 +207,11 @@ public List getSharedCards(UUID sharingId, int count, int pag } - //지식카드 정보 수정 + //지식카드 수정(제목) @Transactional - public CardResponse updateCard(UUID cardId, CardUpdateRequest request) { + public CardResponse updateCard(UUID userId, UUID cardId, CardUpdateRequest request) { - Card card = cardRepository.findByCardId(uuidHelper.convertUUIDToByteArray(cardId)) - .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, "Card not found")); + Card card = getCardWithAccessCheck(userId, cardId); // null이 아닌 값만 업데이트 if (request.getTitle() != null) { @@ -235,12 +253,11 @@ public CardResponse updateCard(UUID cardId, CardUpdateRequest request) { //지식카드 삭제 @Transactional - public void deleteCard(UUID cardId) { - boolean exists = cardRepository.existsById(uuidHelper.convertUUIDToByteArray(cardId)); - if (!exists) { - throw new ResponseStatusException(NOT_FOUND, "Card not found"); - } - cardRepository.deleteByCardId(uuidHelper.convertUUIDToByteArray(cardId)); + public void deleteCard(UUID userId, UUID cardId) { + + Card card = getCardWithAccessCheck(userId, cardId); + + cardRepository.deleteByCardId(card.getCardId()); } //오늘 생성된 지식카드 목록 조회 diff --git a/src/main/java/com/example/gp_backend_data/card/service/CardlinkService.java b/src/main/java/com/example/gp_backend_data/card/service/CardlinkService.java index 9c78daa..fccc57a 100644 --- a/src/main/java/com/example/gp_backend_data/card/service/CardlinkService.java +++ b/src/main/java/com/example/gp_backend_data/card/service/CardlinkService.java @@ -6,6 +6,8 @@ import com.example.gp_backend_data.card.domain.entity.Card; import com.example.gp_backend_data.card.repository.CardlinkRepository; import com.example.gp_backend_data.card.repository.CardRepository; +import com.example.gp_backend_data.space.domain.entity.Space; +import com.example.gp_backend_data.space.repository.SpaceRepository; import com.example.gp_backend_data.utils.UUIDHelper; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; @@ -13,6 +15,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.server.ResponseStatusException; +import java.util.Arrays; import java.util.UUID; @Service @@ -22,13 +25,22 @@ public class CardlinkService { private final CardRepository cardRepository; private final CardlinkRepository cardlinkRepository; private final UUIDHelper uuidHelper; + private final SpaceRepository spaceRepository; - //지식카드 내 새 지식링크 생성 - public CardlinkResponse createCardlink(UUID cardId, CardlinkCreateRequest request) { + //새 지식링크 생성 (지식카드 내) - 사용자가 직접 추가 생성 + public CardlinkResponse createCardlink(UUID userId, UUID cardId, CardlinkCreateRequest request) { byte[] cardIdBytes = uuidHelper.convertUUIDToByteArray(cardId); - Card card = cardRepository.findById(cardIdBytes) + Card card = cardRepository.findByCardId(cardIdBytes) .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Card not found")); + // 권한 체크: card가 속한 space 조회 후 userId와 일치하는지 확인 + Space space = spaceRepository.findById(card.getSpaceId()) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Space not found")); + + if (!Arrays.equals(uuidHelper.convertUUIDToByteArray(userId), space.getUserId())) { + throw new ResponseStatusException(HttpStatus.FORBIDDEN, "User not authorized for this space"); + } + Cardlink cardlink = new Cardlink(); cardlink.setCard(card); cardlink.setCardlinkId(uuidHelper.generateUUIDBytes()); @@ -46,13 +58,21 @@ public CardlinkResponse createCardlink(UUID cardId, CardlinkCreateRequest reques .build(); } - //지식카드 내 지식링크 삭제 + //지식링크 삭제 (지식카드 내) @Transactional - public void deleteCardlink(UUID cardId, UUID cardlinkId) { + public void deleteCardlink(UUID userId, UUID cardId, UUID cardlinkId) { //하이라이트 존재 여부 확인 - Cardlink cardlink = cardlinkRepository.findByCardlinkIdAndCard_CardId(uuidHelper.convertUUIDToByteArray(cardlinkId), uuidHelper.convertUUIDToByteArray(cardId)) + Cardlink cardlink = cardlinkRepository.findByCardlinkIdAndCard_CardId( + uuidHelper.convertUUIDToByteArray(cardlinkId), uuidHelper.convertUUIDToByteArray(cardId)) .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Cardlink not found")); + Space space = spaceRepository.findById(cardlink.getCard().getSpaceId()) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Space not found")); + + if (!Arrays.equals(uuidHelper.convertUUIDToByteArray(userId), space.getUserId())) { + throw new ResponseStatusException(HttpStatus.FORBIDDEN, "User not authorized for this space"); + } + cardlinkRepository.delete(cardlink); } } diff --git a/src/main/java/com/example/gp_backend_data/graph/controller/GraphController.java b/src/main/java/com/example/gp_backend_data/graph/controller/GraphController.java index b86aa0f..f3267c4 100644 --- a/src/main/java/com/example/gp_backend_data/graph/controller/GraphController.java +++ b/src/main/java/com/example/gp_backend_data/graph/controller/GraphController.java @@ -17,23 +17,28 @@ public class GraphController { private final GraphService graphService; @GetMapping - public ResponseEntity getGraph(@RequestParam UUID spaceId) { - GraphResponse response = graphService.getGraphBySpaceId(spaceId); + public ResponseEntity getGraph( + @RequestHeader("x-auth-sub") UUID userId, + @RequestParam UUID spaceId) { + GraphResponse response = graphService.getGraphBySpaceId(userId, spaceId); return ResponseEntity.ok(response); } @GetMapping("/{graphId}") - public ResponseEntity getGraphs(@PathVariable UUID graphId) { - GraphResponse response = graphService.getGraphById(graphId); + public ResponseEntity getGraphs( + @RequestHeader("x-auth-sub") UUID userId, + @PathVariable UUID graphId) { + GraphResponse response = graphService.getGraphById(userId, graphId); return ResponseEntity.ok(response); } @PatchMapping("/{graphId}") public ResponseEntity updateGraph( + @RequestHeader("x-auth-sub") UUID userId, @PathVariable UUID graphId, @RequestBody GraphRequest request) { - GraphResponse response = graphService.updateGraph(graphId, request); + GraphResponse response = graphService.updateGraph(userId, graphId, request); return ResponseEntity.ok(response); } } diff --git a/src/main/java/com/example/gp_backend_data/graph/service/GraphService.java b/src/main/java/com/example/gp_backend_data/graph/service/GraphService.java index 58a1c64..9074bf9 100644 --- a/src/main/java/com/example/gp_backend_data/graph/service/GraphService.java +++ b/src/main/java/com/example/gp_backend_data/graph/service/GraphService.java @@ -12,8 +12,10 @@ import jakarta.persistence.EntityNotFoundException; import lombok.RequiredArgsConstructor; import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.server.ResponseStatusException; import java.util.Optional; import java.util.UUID; @@ -29,8 +31,14 @@ public class GraphService { //특정 스페이스의 그래프 조회 @Transactional - public GraphResponse getGraphBySpaceId(UUID spaceId) { - byte[] spaceIdBytes = uuidHelper.convertUUIDToByteArray(spaceId); + public GraphResponse getGraphBySpaceId(UUID userId, UUID spaceId) { + + Space space = spaceRepository.findBySpaceIdAndUserId( + uuidHelper.convertUUIDToByteArray(spaceId), + uuidHelper.convertUUIDToByteArray(userId) //유저 권한 체크 추가 + ).orElseThrow(() -> new ResponseStatusException(HttpStatus.FORBIDDEN, "You do not have access to this space")); + + byte[] spaceIdBytes = space.getSpaceId(); Graph graph = graphRepository.findBySpaceId(spaceIdBytes) .orElseGet(() -> createNewGraphForSpace(spaceIdBytes)); @@ -87,28 +95,40 @@ private Graph createNewGraphForSpace(byte[] spaceIdBytes) { //그래프 세부 정보 조회 - public GraphResponse getGraphById(UUID graphId) { - Optional graphOptional = graphRepository.findByGraphId(uuidHelper.convertUUIDToByteArray(graphId)); - - return graphOptional.map(graph -> { - try { - return new GraphResponse( - uuidHelper.convertByteArrayToUUID(graph.getGraphId()), - uuidHelper.convertByteArrayToUUID(graph.getSpaceId()), - objectMapper.readTree(graph.getData()) - ); - } catch (Exception e) { - throw new RuntimeException("Error parsing graph data", e); - } - }).orElseThrow(() -> new IllegalArgumentException("Graph not found for graphId: " + graphId)); + public GraphResponse getGraphById(UUID userId, UUID graphId) { + Graph graph = graphRepository.findByGraphId(uuidHelper.convertUUIDToByteArray(graphId)) + .orElseThrow(() -> new IllegalArgumentException("Graph not found for graphId: " + graphId)); + + // 해당 그래프가 속한 스페이스가 본인 소유인지 확인 + Space space = spaceRepository.findBySpaceIdAndUserId( + graph.getSpaceId(), + uuidHelper.convertUUIDToByteArray(userId) + ).orElseThrow(() -> new ResponseStatusException(HttpStatus.FORBIDDEN, "You do not have access to this graph")); + + try { + return new GraphResponse( + uuidHelper.convertByteArrayToUUID(graph.getGraphId()), + uuidHelper.convertByteArrayToUUID(space.getSpaceId()), + objectMapper.readTree(graph.getData()) + ); + } catch (Exception e) { + throw new RuntimeException("Error parsing graph data", e); + } } //그래프 수정 @Transactional - public GraphResponse updateGraph(UUID graphId, GraphRequest request) { + public GraphResponse updateGraph(UUID userId, UUID graphId, GraphRequest request) { Graph graph = graphRepository.findByGraphId(uuidHelper.convertUUIDToByteArray(graphId)) .orElseThrow(() -> new IllegalArgumentException("Graph not found for graphId: " + graphId)); + //권한 체크 추가 + spaceRepository.findBySpaceIdAndUserId( + graph.getSpaceId(), + uuidHelper.convertUUIDToByteArray(userId) + ).orElseThrow(() -> new ResponseStatusException(HttpStatus.FORBIDDEN, "You do not have access to update this graph")); + + try { String updatedData = objectMapper.writeValueAsString(request.getItems()); graph.updateGraph(updatedData); @@ -116,8 +136,11 @@ public GraphResponse updateGraph(UUID graphId, GraphRequest request) { throw new RuntimeException("Error updating graph data", e); } - return new GraphResponse(uuidHelper.convertByteArrayToUUID(graph.getGraphId()), uuidHelper.convertByteArrayToUUID(graph.getSpaceId()), request.getItems()); + return new GraphResponse( + uuidHelper.convertByteArrayToUUID(graph.getGraphId()), + uuidHelper.convertByteArrayToUUID(graph.getSpaceId()), + request.getItems() + ); } - } \ No newline at end of file diff --git a/src/main/java/com/example/gp_backend_data/space/repository/SpaceRepository.java b/src/main/java/com/example/gp_backend_data/space/repository/SpaceRepository.java index 0861118..43f3188 100644 --- a/src/main/java/com/example/gp_backend_data/space/repository/SpaceRepository.java +++ b/src/main/java/com/example/gp_backend_data/space/repository/SpaceRepository.java @@ -10,9 +10,11 @@ @NonNullApi public interface SpaceRepository extends JpaRepository { + Optional findById(byte[] spaceId); List findAllByUserId(byte[] userId, Sort sort); Optional findBySpaceIdAndUserId(byte[] spaceId, byte[] userId); List findByUserId(byte[] userId); + boolean existsBySpaceIdAndUserId(byte[] spaceId, byte[] userId); Optional findBySharingIdAndIsShared(byte[] sharingId, boolean isShared); Optional findBySharingId(byte[] sharingId); } diff --git a/src/main/java/com/example/gp_backend_data/space/service/SpaceService.java b/src/main/java/com/example/gp_backend_data/space/service/SpaceService.java index 87a0eac..71341db 100644 --- a/src/main/java/com/example/gp_backend_data/space/service/SpaceService.java +++ b/src/main/java/com/example/gp_backend_data/space/service/SpaceService.java @@ -24,6 +24,7 @@ public class SpaceService { private final SpaceRepository spaceRepository; private final UUIDHelper uuidHelper; + //새 스페이스 생성 public SpaceCreateResponse createSpace(UUID userId, SpaceCreateRequest request) { Space space = Space.builder() .spaceId(uuidHelper.convertUUIDToByteArray(UUID.randomUUID())) @@ -41,6 +42,7 @@ public SpaceCreateResponse createSpace(UUID userId, SpaceCreateRequest request) .build(); } + //스페이스 목록 조회 @Transactional(readOnly = true) public List getSpaces(UUID userId, String sortBy){ Sort sort = Sort.by(sortBy).descending(); @@ -58,6 +60,7 @@ public List getSpaces(UUID userId, String sortBy){ .toList(); } + //스페이스 수정 @Transactional public SpaceResponse updateSpace(UUID userId, UUID spaceId, SpaceUpdateRequest request) { Space space = spaceRepository.findBySpaceIdAndUserId(uuidHelper.convertUUIDToByteArray(spaceId), uuidHelper.convertUUIDToByteArray(userId)) @@ -84,6 +87,7 @@ public SpaceResponse updateSpace(UUID userId, UUID spaceId, SpaceUpdateRequest r .build(); } + //스페이스 삭제 @Transactional public void deleteSpace(UUID userId, UUID spaceId) { Space space = spaceRepository.findBySpaceIdAndUserId(uuidHelper.convertUUIDToByteArray(spaceId), uuidHelper.convertUUIDToByteArray(userId))