MCPcopy
hub / github.com/tinode/chat / replyDelMsg

Method replyDelMsg

server/topic.go:3173–3293  ·  view source on GitHub ↗

replyDelMsg deletes (soft or hard) messages in response to del.msg packet.

(sess *Session, asUid types.Uid, asChan bool, msg *ClientComMessage)

Source from the content-addressed store, hash-verified

3171
3172// replyDelMsg deletes (soft or hard) messages in response to del.msg packet.
3173func (t *Topic) replyDelMsg(sess *Session, asUid types.Uid, asChan bool, msg *ClientComMessage) error {
3174 now := types.TimeNow()
3175
3176 if asChan {
3177 // Do not allow channel readers delete messages.
3178 sess.queueOut(ErrOperationNotAllowedReply(msg, now))
3179 return errors.New("channel readers cannot delete messages")
3180 }
3181
3182 del := msg.Del
3183
3184 pud := t.perUser[asUid]
3185 if !(pud.modeGiven & pud.modeWant).IsDeleter() {
3186 // User must have an R permission: if the user cannot read messages, he has
3187 // no business of deleting them.
3188 if !(pud.modeGiven & pud.modeWant).IsReader() {
3189 sess.queueOut(ErrPermissionDeniedReply(msg, now))
3190 return errors.New("del.msg: permission denied")
3191 }
3192
3193 // User has just the R permission, cannot hard-delete messages, silently
3194 // switching to soft-deleting
3195 del.Hard = false
3196 }
3197
3198 var err error
3199 var ranges []types.Range
3200 if len(del.DelSeq) == 0 {
3201 err = errors.New("del.msg: no IDs to delete")
3202 } else {
3203 count := 0
3204 for _, dq := range del.DelSeq {
3205 if dq.LowId > t.lastID || dq.LowId < 0 || dq.HiId < 0 ||
3206 (dq.HiId > 0 && dq.LowId > dq.HiId) ||
3207 (dq.LowId == 0 && dq.HiId == 0) {
3208 err = errors.New("del.msg: invalid entry in list")
3209 break
3210 }
3211
3212 if dq.HiId > t.lastID {
3213 // Range is inclusive - exclusive [low, hi),
3214 // to delete all messages hi must be lastId + 1
3215 dq.HiId = t.lastID + 1
3216 } else if dq.LowId == dq.HiId || dq.LowId+1 == dq.HiId {
3217 dq.HiId = 0
3218 }
3219
3220 if dq.HiId == 0 {
3221 count++
3222 } else {
3223 count += dq.HiId - dq.LowId
3224 }
3225
3226 ranges = append(ranges, types.Range{Low: dq.LowId, Hi: dq.HiId})
3227 }
3228
3229 if err == nil {
3230 // Sort by Low ascending then by Hi descending.

Callers 3

handleMetaDelMethod · 0.95

Calls 15

presSubsOnlineMethod · 0.95
presSubsOfflineMethod · 0.95
presPubMessageDeleteMethod · 0.95
TimeNowFunction · 0.92
RangeSorterTypeAlias · 0.92
ErrPermissionDeniedReplyFunction · 0.85
ErrMalformedReplyFunction · 0.85
ErrUnknownReplyFunction · 0.85
rangeDeserializeFunction · 0.85
calculateUnreadInRangesFunction · 0.85
usersUpdateUnreadFunction · 0.85

Tested by 2