Changelog
Cosa c'è di nuovo.
Ogni miglioramento alla piattaforma, come si spedisce.
· SecurityService
Cambiare un indirizzo personale dimostrandolo e amministrare i conti
Due superfici sul conto USER, che fino ad ora non aveva server propri — i campi dell'account sono raggiungibili solo tramite MemberController, un endpoint per "l'org nella tua sessione", che è la forma sbagliata per i dati ogni quote di appartenenza. UserAccountController — l'indirizzo personale del membro. USERS.EMAIL è il secondo dei tre identificativi firmati accetta e il indirizzo password di recupero mails un link di reset a. Scriverlo da un PUT significa che chiunque raggiunge un browser firmato incustodito potrebbe ridefinire il recupero in una casella di posta che possiedono, a piedi, e prendere il conto più tardi — con il vero proprietario ancora in grado di firmare, e quindi con nulla da notare. Quindi... il nuovo indirizzo è parcheggiato, un codice e un link vanno ad esso, e solo una risposta lo muove. La password è ri-demanded anche se il chiamante è firmato in: un sessione dimostra che questo browser è stato firmato ad un certo punto, la password dimostra che è in esso ora, e questo è esattamente l'atto in cui quelli differiscono. Solo l'organizzazione chiamata da security provider id può scrivere, e il rifiuto è qui piuttosto che nell'UI — porta il nome di quell'organizzazione e il suo URL di accesso, perché un 403 che dice solo non lascia il membro con e questa regola è invisibile fino a che non morde. Le letture NON sono ristretto in questo modo: vedere il proprio indirizzo da un altro spazio di lavoro rende comprensibile il rifiuto. Il collegamento è deliberatamente non autorizzato. Va a una mailbox personale, di solito leggere su un telefono che non ha mai firmato nello spazio di lavoro; esigendo un sessione renderebbe il lavoro solo per le persone che non ne hanno avuto bisogno. Possessione la prova — posta all'indirizzo rivendicato da solo, memorizzato come hash, uso singolo, espiatorio in un giorno, e finito in ipotesi sbagliate. L'indirizzo lasciato dietro è detto, anche se nessuno ha chiesto questo. È l'unico segnale che raggiunge qualcuno la cui sessione è stata rubata. UserAdminController — la scheda degli utenti della piattaforma, sorvegliata da MANAGE USERS. Quello letto sulla piattaforma che enumera i conti in ogni inquilino invece che all'interno di un'organizzazione; la precondizione top-level-org arriva con la destra, poiché PlatformRightsResolver non restituisce nulla a una sessione in un inquilino. Non può impostare deliberatamente una password (auto-o-de rimane dove è; il ripristino dell'accesso passa attraverso una lettera di reset, che dimostra il controllo del mailbox piuttosto che bypassarlo), non può eliminare un account (seven satellite — la risposta reversibile è la bandiera sintetica, che finalmente ha un UI qui), e non può toccare èDio o è SystemUser. Il test di copertura impara /platform-users, quindi il prossimo controller aggiunto sotto che il prefisso deve portare una guardia piuttosto che ereditarne una, essendo trascurato.
· kamo-shared-library
I due letti della piattaforma L'elenco degli utenti è costruito su
Un cercatore di pagina, cercato su USERS, e un numero di membri in lotto. Il ricercatore non è filtrato da isFake di proposito. Revisione e compensazione di quella bandiera fa parte di ciò che la scheda degli utenti è per, quindi un elenco che nasconde le righe contrassegnate sarebbe nascondere i conti un operatore è venuto a guardare; la proiezione li segna Invece. COALESCE su ogni colonna ricercata è portante di carico — LIKE contro NULL è NULL piuttosto che falso, quindi un account senza cognome corrisponderebbe altrimenti Niente affatto, compreso il nudo % che significa "mostrare a tutti". Il conteggio esiste perché l'alternativa è una query per fila. La lista mostra un pagina dei conti e quante organizzazioni ciascuno appartiene; chiedendo trovareByUser cinquanta volte è cinquanta viaggi rotondi per disegnare uno schermo, e il conte è tutto l'elenco ha bisogno — la visualizzazione dettagliata carica i membri stessi per quello conto che sta mostrando.
· EmailService
Buzz un telefono del membro quando la posta arriva
MessageIndexer è già un consumatore durevole di email.inbox.> e già risolve la casella di posta OWNER, quindi è dove questo appartiene — una notifica per messaggio veramente nuovo, riavvia sopravvissuti, con il membro in mano. Cresciuto prima della fetch IMAP sotto di esso. Tutto il necessario per la notifica è già nell'evento, e facendo aspettare il membro su un viaggio rotondo che esiste per costruire un indice di ricerca sarebbe il modo sbagliato intorno; significa anche una casella di posta la cui le credenziali sono andate stantio ancora avvisa, che è esattamente quando conta. Tre cose che non farà. Notifiche solo per INBOX — una regola che deposita qualcosa in Archivio non è notizie, e spingere per esso insegna le persone a ignorare notifica. Ignora qualcosa di più vecchio di trenta minuti, perché alcuni IMAP server replay messaggiAggiungi su ricollegamento e un telefono che ronzio undici volte dopo un pod riavvio è un telefono con le notifiche spente. E decide nulla sulla presenza o sui dispositivi: MediaService già sopprime una spinta per una membro con un socket live, e una seconda copia di quella regola è come i due avrebbero alla deriva. Il kill switch è in ConfigMap così come application.yml, perché push auto-deploys e la disattivazione di una notifica sbagliata non deve aver bisogno di una ricostruzione. Notare la fusione nel kamo EXISTING: blocco — un secondo kamo di livello superiore: parses chiave e poi silenziosamente cade il primo, prendendo mittenti-avatar e il subtree di sicurezza con esso.
· MediaService
Un tipo EMAIL, e ogni spinta ora nomina il suo org
EmailService solleva la notifica fuori IMAP IDLE e chiede MediaService a fornire attraverso il punto finale di spedizione interno che esiste per esattamente questo — flussi evento che non terminano qui. EMAIL è una spinta ordinaria: crollato, tasso limitato, presenza gated, consegnato in ritardo piuttosto che cadere. Separatamente, e la correzione più grande: nessun mittente ha mai messo orgId in un DATI di spinta. L'applicazione mobile mantiene ogni org un membro appartiene a vivere subito e passa a data.orgId prima di seguire un link profondo, in modo che il ramo non abbia mai eseguito una volta — un membro multi-org toccando una chat o la notifica SMS l'ha aperto sotto qualsiasi org E' successo essere sullo schermo. Il speditore lo timbra ora, che è l'unico posto org è già risolta e quindi fissa ogni tipo di spinta contemporaneamente. putIfAbsent, not put: una spinta su un evento in un different org dal membro fila propria — una sessione di sostegno, un operatore che agisce attraverso gli inquilini — sa meglio di questa risoluzione.
· EmailService
Anteprima variabili per le due lettere di scambio e-mail
Entrambi i nuovi modelli canonici rendono nella console il momento in cui questo servizio è ricostruito sulla biblioteca condivisa che li trasporta; senza un campioneVariables il braccio che rendono con i segnaposto che mostrano, che si legge come un rotto modello piuttosto che come anteprima. Entrambi si chiamano indirizzi BOTH, perché le lettere fanno. Una lettera di verifica che non può mostrare quale indirizzo è richiesto è una lettera che il destinatario non può controllare, e un avviso che nomina solo il nuovo indirizzo non dice al suo lettore cosa hanno perso.
· kamo-shared-library
Un diritto per gli account utente e un indirizzo parcheggiato per cambiarne uno
Tre aggiunte, tutte la metà del lavoro condiviso che atterra in SecurityService e kamo-internal. PlatformRightType.MANAGE USERS, allegato. Un account utente è la persona; un membro è una relazione di organizzazione con quella persona. Tutti gli altri lista dei membri sulla piattaforma è indirizzata a un'organizzazione da costruzione e la scheda Utenti deliberatamente non è, quindi raggiunge ogni inquilino in una sola volta — un raggio di esplosione strettamente più grande della tenuta di org, e quindi non Lavoro di MANAGE ORGANIZZAZIONI. Appendato piuttosto che inserito perché getSortOrder() è l'ordinale. UserEmailChangeRequest, con il suo repository. USERS.EMAIL è il secondo del tre identificativi di accesso e il recupero della password dell'indirizzo scrive a, quindi non può essere scritto da una forma: chi raggiunge un browser firmato per trenta secondi altrimenti sarebbe in grado di indicare il recupero del conto in una casella di posta proprio. Il nuovo indirizzo è parcheggiato qui fino a quando un codice e un link provano la consegna. La propria tabella piuttosto che colonne su email verification tokens — quella tabella NON è NULL in tutto e popolato, e una nuova colonna non modificabile su un popolato il tavolo non è mai creato senza un DEFAULT. USER EMAIL CHANGE VERIFY e USER EMAIL CHANGED. Il primo va all'indirizzo essere rivendicato ed è ciò che rende il cambiamento effetto. Il secondo va all'indirizzo lasciato dietro ed è l'unico avviso qualcuno la cui sessione è stato rubato sarà mai ottenere, motivo per cui viene inviato anche se nessuno lo ha chiesto. Entrambi fissati da un test: una coppia canonica semi-aggiunta lancia dentro caricoAll() e breaks seeding per ogni organizzazione sulla piattaforma, non solo la sua.
· kamo-internal
Pubblica cavalca la fila SEND TO AI, e braccia il hand-off per Dio
Il controllo dell'editore è stato un blocco confinato del suo più lontano giù forma, portando due linee di suggerimento sotto l'interruttore. Ora è una compatta toggle on the head's Row, immediatamente a sinistra di SEND TO AI, etichettato "Public" — e il suggerimento usato per stampare spostato in una punta di utensili, che è l'unico posto che non costa affatto spazio. Il tooltip rimane dipendente dallo stato: "off" è la posizione consequenziale qui, e qualcuno hovering vuole sapere in che modo attualmente punta, non quello che il controllo è chiamato. Entrambi gli interruttori siedono in un gruppo trainante piuttosto che portare un `ml: 'auto' ciascuno. Flexbox divide lo spazio libero tra ogni margine auto, così due di loro avrebbero spinto un divario tra la coppia invece di tenerli insieme; con il gruppo, SEND TO AI finisce ancora duro diritto quando il pubblico è assente, esattamente come prima che esistesse. Pubblica legge sinistra di SEND TO AI perché si tratta del rapporto e SEND A AI si tratta di ciò che accade dopo — leggono nell'ordine che prendono effetto. L'etichetta è "Public" mentre il campo payload, la bandiera e la colonna tutto rimanere `publish`: l'etichetta dice che cosa il report WILL BE, il il campo dice quello che stai facendo. che aveva bisogno di una chiave del dizionario NUOVO — translate.ts visita solo le chiavi che non ha visto, quindi modificando l'inglese sotto "form.publish" avrebbe lasciato 21 locali dicendo "Publish". SEND TO AI ora si arma anche per un operatore dio-eleggibile che deposita un nuovo Rapporto. Questa è un'inversione deliberata del vecchio commento: off era "il solo default defensibile" perché l'interruttore inizia una sessione su una macchina tenere le credenziali del cluster, e rimane fuori per ogni ordinario reporter. È applicato in un effetto e custodito da una ref, perché useState legge il suo argomento sul primo render — quando i diritti sono ancora il caricamento e la risposta è sempre "non dio" — e perché un re-run sarebbe accendere l'interruttore dopo che qualcuno aveva deliberatamente spento, non lasciare nessun modo per archiviare senza una consegna. Gated su maySendToAi troppo, quindi lo stato non può mai essere acceso mentre il controllo è invisibile. Il requisito stesso è bloccato piuttosto che descritto: il nuovo test afferma i nomi accessibili dei due commutatori in ordine DOM e che essi condividere un gruppo con esattamente due caselle di controllo in esso. Un tweak sx che si muove o controllare oltre l'altro fallisce.
· kamo-shared-library
Cancello Pubblica su dio ELIGIBILITÀ, non una finestra aperta
La bandiera Pubblica spedito gated su GodModeActive — GD plus a deliberatamente aperto 30 minuti finestra di rottura vetro. Ogni operatore dio-eleggibile allora trovato l'interruttore mancante, perché tenendo GD e avendo attivato sono diversi fatti e solo il secondo inizia un conto alla rovescia. Un rapporto l'operatore non può vedere è un rapporto che non possono rilasciare, quindi richiede un finestra mettere la bandiera fuori dalla portata di esattamente le persone che è per. Così SessionPlatformFacts guadagna dioAdatto accanto a dioModeActive piuttosto che chiunque legge la sessione una seconda volta — questo record esiste perché due lettori di queste bandiere è come uno di loro finisce sbagliato, e lo stesso argomento vale per un chiamante che desidera solo la metà che già calcola. I due componenti sono rigorosamente ordinati: GodEligible è un set WIDER che GodModeActive, così la lettura di uno dove l'altro era inteso è l'esatto fallire questo disco è stato scritto per prevenire. Ecco perché sono due chiamato accessors piuttosto che una bandiera più un argomento booleano, perché il javadoc su dioEligible dice mai passare a PlatformRightsResolver — fare così avrebbe concesso ad ogni piattaforma diritto ad ogni operatore idoneo, permanentemente — e perché SessionPlatformFatti Prova ora perni entrambe le metà indipendentemente in entrambe le direzioni. Il parametro query viene rinominato :godMode -> :godEligible in tutti e cinque predica per la stessa ragione. Un parametro chiamato GodMode che ignora deliberatamente la finestra è come qualcuno più tardi "fissa" indietro.
· kamo-internal
Fine di un terminale prende la sua finestra e testa di esagonale con esso
Terminare un terminal dell'Interaction Center ha ucciso il guscio e ha lasciato il finestra dietro, mostrando uno stato rosso `chiuso ` su qualcosa che non più esiste. La prossima mossa del membro era di chiudere a mano — e se avessero messo la finestra via prima, la testa di esagonale si sedeva lì a puntare a nulla. Niente ha collegato una sessione che rientrava in una finestra. Ogni vicino nell'app nomina un finestra id, perché ogni chiusura inizia alla finestra: la X sul cromo, la X su una testa, una conversazione che si chiude da dentro. Questo inizia in un elenco, dove il membro ha un id sessione e non c'è modo di imparare un id finestra. Quindi `closeTerminal(sessionGuid)` si unisce `openTerminal` nello stesso modulo, e invia un nuovo `tool:closeMatching`. Il molo lo risolve contro il negozio su toolId AND props — mai props da solo, dal `sessionGuid` è anche chat chiave di dedupe e l'abbinamento sul puntello nudo avrebbe lasciato terminare un terminale chiudere un conversazione — quindi traccia ogni colpo attraverso il `onClose` esistente, quindi `tool: chiuso` ancora fuochi e l'animazione di uscita funziona ancora. Un evento separato piuttosto che un'estensione di `tool:close`: quello deliberatamente no-ops su un dettaglio che trasporta un toolId e nessun windowId, e ChatBox dipende da esso. Insegnarlo a corrispondere su oggetti di scena sarebbe tranquillamente girare che no-op in "chiudere ogni finestra di chat". La testa viene abbattuta esplicitamente. `store.close()` segna solo la finestra uscire e non emette mai `removeHexhead`, quindi una finestra chiusa mentre minimizzato fili la sua testa — il divario HexHeadPopover funziona già intorno a mano, e questo lo segue esattamente, `animato: vero` incluso così la testa gira via invece di lampeggiare. Una partita vuota non corrisponde nulla, non tutto: un chiamante raggiunge uno per passare un id che è tornato non definito, e la risposta onesta a "chiudere finestra per `undefined`" non è nessuno di loro. Chiude prima che il DELETE venga inviato, per lo stesso motivo la riga scompare ottimisticamente — terminare un terminale è un atto confermato, e uno schermo che aspetta per il viaggio rotondo legge come un pulsante che non ha fatto nulla. Ho trovato il pulsante Fine del Centro Interazione. Il pulsante identico nel il navigatore del terminale massimizzato è intatto, come è un guscio che esce sul suo proprio o è finito da un'altra scheda: quelli ancora lasciare la finestra, onestamente reporting `chiuso`.
· SecurityService
Leggi il record SPF live di un dominio e di' di cosa ha realmente bisogno
GET /api/security/domains/{id}/spf, per il passaggio SPF su /setup/dns. La pagina di configurazione non può dare una serie di istruzioni SPF a tutti, perché l'istruzione giusta dipende da ciò che il dominio già pubblica e uno sbagliato è distruttivo. Un dominio senza record SPF ha bisogno di uno creato; un dominio che già ha uno — la maggior parte di loro, da Google, Microsoft e ogni strumento di marketing pubblicare uno — ha bisogno di quel singolo record modificato. "Aggiungi questo record" dato al secondo gruppo lascia due v=spf1 record su un nome, che è un permerror: i ricevitori ignorano BOTH, quindi il cliente si ferma essere autenticato anche. Così questo risolve il record prima e restituisce la stringa esatta per salvare, fuso con qualsiasi cosa ci sia. La fusione inserisce il nostro meccanismo immediatamente prima del terminare `all` (o un `redirect=`), perché tutto dopo quelli non è mai valutata — sostenendo che produrrebbe un record che sembra fisso e fa Niente. Tutto il resto del disco è conservato verbatim. Si rifiuta anche di rispondere dove non esiste una risposta sicura, quindi la pagina ha qualcosa da rifiutare piuttosto che improvvisare: - diversi documenti SPF già pubblicati -> MANUAL; unirli è un giudizio appello su mittenti non sappiamo nulla - la fusione avrebbe violato il limite di RFC 7208 di 10 lookup DNS -> flagged, e la pagina non mostra alcun record da incollare, perché il salvataggio sarebbe invalidare intero record compreso i propri mittenti del cliente Contare queste ricerche significa seguire includere / reindirizzare le catene come un ricevitore fa, delimitato da profondità e da un bilancio di query. Un record che ci autorizza già ip4 o dal nostro dominio aziendale conta come fatto — nessun punto spendere uno dei 10 su un meccanismo che non cambia nulla. Le stringhe di carattere TXT sono concatenate prima della parsing (RFC 7208 §3.3): reale record da Google e HubSpot arrivano suddivisi in diversi, e li analizza separatamente perderebbe completamente il record.
· kamo-internal
Dite a ciascun dominio di cosa ha realmente bisogno il suo record SPF
/setup/dns ha camminato un cliente attraverso la proprietà, sottodomini e SSL e poi non ha detto nulla del record che decide se la posta che inviamo per loro si crede. Senza di esso, un reset password inviamo come NoReply@their-domain è posta non autenticata che pretende di essere da un dominio che non inviamo per, quindi è filtrato allo spam — lo spazio di lavoro sembra finito mentre la sua e-mail tranquillamente è No. istruzioni generiche non potrebbero essere scritte per questo, perché quello corretto è diverso per cliente e quello sbagliato è distruttivo. Un dominio senza SPF record ha bisogno di uno creato. Un dominio che ha già uno — che è il più, dal Google, Microsoft e ogni strumento di marketing pubblicare uno — ha bisogno che singolo record modificato. Dire al secondo gruppo di "aggiungere questo record" lascia due v=spf1 record sullo stesso nome, che è un permerror: i ricevitori ignorano BOTH, quindi i i propri mittenti del cliente smettere di essere autenticato troppo. La pagina avrebbe ha causato l'estrazione che stava cercando di prevenire. Quindi la scheda legge il record live del dominio prima e poi mostra un risultato, con solo i passaggi che si applicano ad esso: - nessun record "Aggiungi un nuovo record", con il valore completo - record esiste -> "Modifica il record che hai già", il valore attuale corrispondere per occhio, il valore fuso per sostituirlo con, e un rosso callout che un secondo record non deve mai essere creato - già elencato -> nulla da fare - Kamo-hosted -> nulla da fare; lo gestiamo Due casi mostrano deliberatamente nessun record per incollare affatto, perché non c'è valore che potremmo offrire è sicuro: un dominio già pubblicato diversi SPF record (già rotto, e unirli è una chiamata di giudizio sui mittenti non lo so), e una fusione che viola il limite di SPF di 10 lookup DNS — salvando che avrebbe invalidato l'intero record, i propri mittenti del cliente incluso. Entrambi chiedono loro di parlare con noi. Il passo è ultimo e mai cancelli entrare spazio di lavoro: lo spazio di lavoro realmente fa lavorare senza.
· kamo-internal
Copia il link di riferimento da qualsiasi ruolo pubblico
I referral sono il canale di conversione più alto che ha una scheda di lavoro, e che cosa si ferma loro qui è l'attrito piuttosto che la non volontà: il sito di carriere risponde su un host diverso, così nessuno può comporre l'URL dalla memoria. Il server ora invia è pronto su ogni elenco dei membri, taggato con lo spettatore, e la carta offre un pulsante di copia — solo per i ruoli che sono effettivamente pubblicati esternamente, quindi un controllo delle quote non può mai circolare uno che l'org ha scelto di mantenere interno. La zecca appare solo quando il fermaglio scrive RESOLVED. navigatore. non definita al di fuori di un contesto sicuro e rifiuta quando il documento non è focalizzato, entrambi silenziosamente; una conferma dopo una copia fallita è peggiore di nessuno, perché il membro non incolla nulla e non sa perché. Risolve anche un errore di tipo in... fallire `tsc` sul principale: il suo `create` mock non ha dichiarato parametri, quindi `calls[0]` digitato come il tuple vuoto e il raggiungimento nel payload registrato non ha compilato. Questo fallisce `next build`, non solo il file di prova.
· DocsService
Il lettore CV, i link di riferimento dei dipendenti, e la forma del modulo nella lista pubblica
Tre cose che il sito di carriera pubblica ha bisogno di questo servizio. La forma del modulo ora cavalca sulla lista pubblica (le dodici impostazioni della domanda*, le richiesta di informazioni aggiuntive, e se il ruolo chiede da dove viene un'istruzione). Senza di esso il sito di carriere dovrebbe rendere l'unione di ogni possibile domanda — fare un richiedente di magazzino per un URL di portafoglio — e non avrebbe modo di sapere quali risposte sono richieste, quindi il primo il candidato sente di un uno mancante è una presentazione respinta. Scritto attraverso un adattatore sopra applicazione esistenteFormShape piuttosto che un secondo elenco di dodici setters. ResumeScanService legge un CV abbastanza bene da pre-riempire il blocco di contatto, e negozi NOTHING: bytes in, cinque regexes sopra i primi pochi mila caratteri, suggerimenti fuori. Questo è l'intero argomento di sicurezza per accettare un file su un punto finale non autorizzato — non c'è stato da corrompere, e l'applicazione è ancora depositato da qualsiasi cosa la ricorrente presenta. PDF e testo semplice (POI è non sul classpath), tipo di file deciso da byte magiche piuttosto che il nome o tipo di contenuto fornito dal chiamante, e ogni file non leggibile ritorna come un mappa vuota piuttosto che un codice di stato. Il nome indovina è volutamente timido: un il nome sbagliato pre-riempito è peggio di una scatola vuota, perché il richiedente non può rileggere un campo che sembra già risposto. Lavorazione Dto guadagna rinvioUrl — l'annuncio pubblico taggato con il membro di visualizzazione — composto qui perché lo spazio di lavoro non può componerlo: un l'ospite di carriera di inquilino è il suo dominio radice verificato e interno. per conoscerlo. Null per un ruolo che non è pubblicato esternamente, quindi un controllo delle quote non può mai circolare un ruolo che l'org ha scelto di non pubblicare. Inoltre: il digest allerta ora costruisce righe HTML sfuggite invece di una nuova linea-giunto stringa. TemplateRenderer è un regex piatto sostituire senza sfuggire, quindi "\n" è crollato a una linea run-on in ogni client di posta e un titolo contenente & o < avrebbe iniettato markup in una lettera che va ad un indirizzo uno sconosciuto digitato in una forma pubblica. La ricevuta ha guadagnato la stessa cosa. dividere l'utilizzo dei modelli di pacchetto HR e entrambi i mittenti hanno smesso di passare organizzazione Nome — EmailService inietta {{orgName}} dalla stessa riga.
· kamo-shared-library
Tre modelli transazionali pubblici, e le chiavi di patch org dietro di loro
Il sito di carriera ora scrive a persone che non hanno account, che è nuovo per questo piattaforma: ogni altro modello transazionale va a un membro. Tre canonici i modelli lo coprono — la ricevuta dell'applicazione (che trasporta il reclamo singolo uso link, ed è la copia SOLO di esso), il talento-avviare doppio opt-in, e il nuovo ruoli digeriscono. Entrambe le lettere di avviso portano un link disiscrizione che funziona senza sign-in, perché il destinatario non ha nulla a cui firmare. Anche due nomi aggiunti... carriereSiteEnabled e carriereNetworkOptIn. Questo metodo è esplicito consentire-list, quindi una chiave che non nomina è accettata con un 200 e mai memorizzata — l'interruttore delle impostazioni avrebbe ribaltato il suo carico successivo con nulla in qualsiasi luogo segnalando un fallimento. HrCareersTemplateTest perni la costante/dotted-key/sender triplica la strada HrPackageTemplateTest lo fa, più il link di cancellazione, il corpo sfuggito contro — un terzo <img> in una lettera a uno sconosciuto è un pixel di monitoraggio.
· kamo-register
Effettuare il reclamo della domanda attraverso la consegna del registro
Un candidato può ora applicarsi dal sito di carriera pubblica senza un account. The l'applicazione è memorizzata contro l'indirizzo e-mail digitato, e la ricevuta porta un token di reclamo a un solo uso che lo collega a un account che creano dopo. Questo account è creato qui, e la registrazione termina su un host diverso, quindi il token è parcheggiato nello stesso biscotto apex-scoped il lavoro uid già utilizza — il una cosa che sopravvive al viaggio. Scritto separatamente dal uid perché il due non viaggiano sempre insieme: /team?jobId=... raggiunto subito da un pubblicità non ha alcuna domanda di rivendicare. Salta questo e l'applicazione è bloccata — HR mantiene una copia anonima, la membro non vede nulla da tracciare, e applicando di nuovo dai file di workspace un duplicati.
· kamo-internal
Vantaggi, imbuto pubblico, la rete opt-in, e rivendicare un'applicazione
Cinque cambiamenti, tutti loro lo spazio di lavoro metà di qualcosa le carriere pubbliche il sito lo fa ora. - Vantaggi e vantaggi nell'editor di posting. Raggiunge l'annuncio pubblico e Effetti/collegati Nei feed, entrambi hanno uno slot per esso che stava uscendo vuoto. - Un avviso di trasparenza. CO/CA/NY/WA richiede che venga divulgata una gamma; l'editor ora lo dice quando il ruolo si trova in uno di loro e compensazione è nascosto. Essa avverte piuttosto che rifiuta — le regole si accendono fatti la pubblicazione non modella (conto principale, se il ruolo può essere svolto nello stato), così questo è un richiamo ad un umano, non un cancello. - Un imbuto di lettura sulla carta di posta: impressioni di bordo, vista pubblicitaria, applicare click e la tariffa di applicazione. Mostrato solo per una pubblicazione esterna con almeno dieci impressioni, perché un tasso calcolato da tre punti di vista è rumore presentato come misura. - Due interruttori org sotto impostazioni essenziali. Il primo decide se carriera. i ruoli pubblicati appaiono anche sulla scheda della piattaforma accanto ad altri Inquilini. L'interruttore di rete è spento per impostazione predefinita ed è disabilitato — e inviato come falso — mentre il sito stesso è spento, quindi optare nella scheda condivisa non può diventare un modo per cambiare il proprio spento. - Pretendiamo una domanda. Qualcuno può ora applicare dal sito pubblico senza conto; la ricevuta trasporta un token monouso, kamo-registra lo parcheggia in il cookie apex-scoped accanto al lavoro uid, e la scheda Carriere lo riscatta una volta all'arrivo. Il reclamo esegue prima che l'annuncio si apre in modo che il rivendicato l'applicazione è già carica quando la scheda decide se mostrare il modulo pre-riempita o l'annuncio di sola lettura — l'altro ordine mostra un candidato modulo vuoto per un lavoro a cui hanno già applicato. Entrambi i cookie sono cancellati che si abbinassero o meno.
· kamo-internal
Un interruttore di pubblicazione su un bug dio-mode
Un operatore con una finestra open God-mode che archivia un bug o un miglioramento ora ottiene un interruttore di pubblicazione. È fuori quando la finestra si apre e non ricorda la sua ultima posizione: la bandiera decide se l'organizzazione il rapporto è archiviato contro può vederlo, e un controllo che ricordato sarebbe eventualmente pubblicare qualcosa che nessuno voleva pubblicare — o peggio, tranquillamente Tienine uno. Il cassetto ottiene un toggle corrispondente in modo che un rapporto già archiviato può essere rilasciato in seguito, e sia carta e cassetto segnare un inedito rapporto in modo che un operatore può vedere a colpo d'occhio che segnala l'inquilino non è Guarda. Gated on God mode, NON su MANAGE SYSTEM BUGS — il SEND TO AI switch seduto accanto a esso nella stessa forma è recintato sulla piattaforma in piedi Giusto, e questo non lo e' volutamente. Un triage di amministratore di piattaforma ogni relazione se hanno o meno vetro rotto; decidere chi può vedere si prende la finestra aperta. La forma legge lo stato di dio-mode del browser, che non riesce CLOSED: il il caso peggiore è un operatore che non viene offerto il controllo e il deposito di un rapporto pubblicato, che è quello che è successo prima che questo esistesse. decide solo se l'interruttore è DRAWN — il server ignora `publish` da Chiunque non abbia una finestra aperta, quindi niente qui garantisce nulla. The il cassetto utilizza invece il server's canPublish, perché ha un dettaglio DTO da leggere. `publish` è omesso dal payload interamente quando l'interruttore non era disegnato, piuttosto che inviato come vero: il server legge un valore assente come "il cliente non ha chiesto", che per un membro ordinario è lo stesso di ogni altra risposta. Questo è ciò che mantiene un membro che non vede mai il controllo da il loro rapporto è invisibile. Fila solo. Una finestra di modifica non mostra mai l'interruttore, perché l'aggiornamento fa non portare la bandiera e un interruttore che silenziosamente non ha fatto nulla sarebbe peggio che nessun interruttore.
· MediaService
Lasciare un operatore Dio-mode file un bug di sistema privatamente
Pubblicare un report ora offre un interruttore di pubblicazione a un operatore con un aperto finestra di Dio-mode. Di default: il rapporto rimane con la modalità dio fino a qualcuno lo rilascia, e POST /{id}/pubblicato rilascia o sostiene uno dopo. La regola di scrittura è di quattro righe e insopportabile. Il `publish` di un cliente leggere SOLO da un chiamante con una finestra di Dio-mode aperta; per tutti gli altri è scartato piuttosto che rifiutato, perché il campo non è offerto a loro e un valore che arriva da un membro ordinario è o una costruzione stante o JSON scritto a mano — né è un motivo per fallire un bug report al quando qualcuno sta cercando di dirci che qualcosa e' rotto. Per una morte dio chiamante una nullità e una falsa terra esplicita nello stesso luogo: una bandiera la cui lo scopo è quello di tenere un rapporto lontano dall'inquilino non deve accendersi perché mancava un campo. Gated in modalità dio, NON su MANAGE SYSTEM BUGS, e la differenza è la punto. Un amministratore di piattaforma tiene che il diritto continuamente e può ogni relazione; decidere chi può vedere prende l'atto deliberato rompere il vetro. Così GodMode() legge E' il momento giusto. che è l'unico posto GD (ammissibilità permanente) è combinato con un finestra aperta — la lettura da sola concederebbe questo a quegli operatori ogni volta, o a nessuno. La regola di lettura viene applicata due volte di proposito e non è ridondante. The query interrompe una relazione inedita che appare in un elenco; smette di essere preso da id, compreso da un manager che detiene il diritto ma non ha rotto il vetro. changeStatus ottiene lo stesso controllo: non hanno modo di imparare l'id, ma "non avrebbero potuto trovarlo" non è un la regola di accesso, e sarebbe altrimenti l'unico punto in cui un privato rapporto può essere agito da qualcuno che è nascosto da. 404 piuttosto che 403 in tutto, corrispondente al controllo di frequenza — un 403 conferma l'ID esiste. L'editoria è annunciata come un cambiamento di stato, perché è lo stesso tipo di evento per il distintivo: un rapporto che diventa visibile unisce il conteggio illeggibile di ogni manager che non poteva vederlo un momento fa. Quando niente cambiato, quindi la reprimere il toggle non sveglia ogni console.
· kamo-shared-library
La bandiera Pubblica su un bug di sistema, e la regola di query dietro di esso
Un bug di sistema ha già attraversato la linea di tenancy in una direzione. Questo aggiunge la seconda regola di visibilità sopra di esso: un rapporto un operatore di Dio-mode archiviato privatamente è visibile ad un chiamante con una finestra OPEN-mode il membro che l'ha presentato, e a nessun altro. Scritto come tre termini ORed piuttosto che un parametro filtrante nullable, perché non c'è valore di GodMode che significa "non applicare questo" — il tutto il punto è che si applica sempre. In tutte e quattro le domande verbatim, accanto al predicato di tenancy che è già duplicato attraverso loro per il motivo che il repository scrive: un conteggio calcolato sotto un regola diversa dalla lista che si apre è un bug report in attesa di accadere. Un tasso di conteggio segnala che l'elenco non mostra leggere come un distintivo che rifiuta di liberarsi. b.reporter.id è sicuro come un'unione implicita per lo stesso motivo b.reporterOrg.id è — l'associazione è facoltativa = falsa, quindi non può cadere silenziosamente righe il modo in cui un'unione implicita su uno nullable fa. A null viewerMemberId è la risposta sicura qui: nessun reporter di fila id uguale null, quindi un visualizzatore irrisolvibile ricade su `pubblicato` da solo piuttosto che abbinare ogni rapporto privato. pubblicato default a TRUE sull'entità, nel costruttore e nel @PrePersist guard, corrispondente alla colonna predefinita. Un nullo scritto come NULL sarebbe letto dal predicato come "non pubblicato", che si nasconde un rapporto dell'inquilino che lo ha presentato perché un costruttore ha omesso un campo. può pubblicare sul dettaglio DTO non è deliberatamente canManage. MANAGE SYSTEM BUGS è tenuto continuamente dagli amministratori della piattaforma; questo risponde se una finestra di vetro è aperta. Piegare insieme i due avrebbe consegnato l'intero punto della bandiera al set sbagliato della gente.
· InitializerService
System bug.Publishing, default a TRUE
La colonna dietro la bandiera Pubblica: un operatore di Dio-mode può ora archiviare un rapporto che rimane con la modalità dio fino a quando qualcuno lo rilascia. DEFAULT TRUE è l'intero motivo per cui questo non ha bisogno di backfill, ed è il una dichiarazione in questo file che può svuotare una pagina piuttosto che romperne una. Ogni relazione che esiste già era visibile all'organizzazione che ha depositato, e così è ogni relazione un file membro ordinario dopo questo — la bandiera può essere spenta solo da un operatore di Dio-mode su un rapporto si stanno depositando. Un DEFAULT di FALSE, all'istante questo correndo, hanno nascosto ogni rapporto mai depositato dalle persone che li hanno archiviati, con nulla in un registro per notarlo. La coda sarebbe semplicemente vuota. NON NULL per lo stesso motivo status name è: un significato di stato terzo "nessuno ha detto" dovrebbe essere interpretato da ogni query che legge questo, per sempre, e le due letture differiscono se un inquilino può vedere la fila.
· DocsService
Applica-first, la rete di lavoro, avvisi, traduzione e ritenzione
Otto cose, tutte dietro la superficie delle carriere anonime, e tutti condividono la governa la scheda single-org già fa rispettare piuttosto che crescere la propria. Prima. PublicApplyService fa un'applicazione prima che il suo autore abbia account e-mail un link di reclamo. La postazione è caricata attraverso lo stesso pubblico predicato — un req archiviato o interno risponde 404, mai 403 — il le risposte passano attraverso il validatore SAME come membro, e il curriculum attraverso il stesso negozio, perché una seconda copia di queste regole è un secondo modo. Duplicazioni sono catturati su e-mail, che è l'unica identità che un richiedente pubblico ha. La rete. Un consiglio di organizzazione trasversale, recintato due volte: è rifiutato a meno che il richiesta arriva sull'host di carriera della piattaforma (leggi dal inoltrato host, fallendo chiuso), e un'organizzazione deve aver optato in. Si riutilizza PublicCareersService proprio mapper e assemblatore, quindi una regola su che cosa il pubblico può vedere non può essere più debole là che su una scheda di un inquilino. Ogni scheda link a l'annuncio sul dominio di EMPLOYER — la rete invia traffico, non catturalo. RELEVANCE. La ricerca del testo era "ogni termine appare da qualche parte", quindi un magazzino pubblicità menzione ingegneri in passaggio livello classificato con lo Staff Engineer ruolo. Ora è ponderato sul campo con bonus di parola intera, e la rilevanza conduce ordine solo quando qualcuno ha effettivamente cercato. Il fiume. Impressioni, apre e applica clic, bufferati in memoria e arrossiti ogni trenta secondi. Una fila per evento sarebbe il tavolo più grande della piattaforma entro un mese e non risponderebbe nulla i contatori non lo fanno; un UPDATE per vista sarebbe una transazione di scrittura per carico di pagina su un sito anonimo. Il costo è onesto: un pod restart perde fino a trenta secondi. TALENT ALERTS con doppio opt-in, un token non-expiring, un scadenza di diciotto mesi, e una spazzata che cancella indirizzi nessuno mai confermato. L'abbonato risponde allo stesso modo in cui la storia dell'indirizzo è: distinguerli sarebbe un oracolo per chi sta guardando il lavoro di una società. TRASPORTO su pubblicazione, su un fagiolo separato quindi @Async non è bypassato da un autoinvocazione, REQUIRES NEW per locale quindi un fallimento non scarta venti, e le impronte digitali così una modifica invalida ogni lingua contemporaneamente. INDICE via Google's JobPosting-specific API — spento e connesso fino a un servizio esiste il conto, lavorando il momento in cui si fa. URL DELETED quando un ruolo si chiude, che è ciò che ferma una tavola accumulando risultati che portano da nessuna parte. RITENZIONE: una spazzata notturna in batch, più un punto finale di cancellazione HR per un soggetto richiesta. 21 nuovi test.
· InitializerService
Fare hr job applicazione.member id nullable
ddl-auto aggiunge colonne; non rilassa mai vincoli. Flipping facoltativo=falso a vero sull'entità cambia ciò che l'ORM crede e nulla di ciò che il esecuzioni del database — la mappatura dice nullable, la colonna rimane NON NULL, e la prima applicazione pubblica non riesce ad inserire all'interno di un metodo @Transactional il cui rollback rimuove le prove. Anche backfills purge after per ogni applicazione che precede la ritenzione politica. Null there significa "mangiare per sempre", quindi senza questo la spazzata sarebbe solo sempre coprire le applicazioni archiviate dopo la funzione spedito, che non è un politica di conservazione. Il (posting, membro) vincolo unico è volutamente lasciato solo: una volta member id può essere null che smette di limitare le righe pubbliche, che è quello che vogliamo — Postgres tratta NULLs come distinti, e i candidati pubblici sono deduplicati su e-mail nel servizio, dove due persone che condividono una casella di posta riceve un messaggio piuttosto che una violazione di vincolo.
· kamo-shared-library
Lo schema dietro app-first, la rete, avvisi e ritenzione
membro id sull'applicazione hr job diventa NULLABLE, che è l'intero applicare-first: cinque passi sono stati tra premendo Applicare e rispondere al primo domanda, e i due più ripidi — creare un account, verificare una e-mail — è venuto prima che avessimo imparato qualcosa. Un'applicazione può ora esistere prima della sua autore lo fa, con un gettone di reclamo che collega un account in seguito. Ogni query che si unisce a quella colonna deve essere un'unione a sinistra. Un interno cade esattamente le righe che questo aggiunge, nascondendo applicazioni pubbliche dalla scheda candidati mentre in nessun posto; trovareForOrgWithPosting AndMember è fisso e dice perché. Due colonne org: carriers site enabled (un org che non vuole alcun consiglio pubblico dovrebbe non rispondere a tale host affatto) e carriere network opt in, default FALSE — pubblicare i tuoi ruoli accanto ad ogni altro inquilino è una decisione, non un default. Tre contatori su un distacco — impressioni, punti di vista dettagli, applicano clic — reset con elencatoAl pari del conteggio richiedente, incrementato con UPDATE ... SET c = c+n così i pod concomitanti non perdono a vicenda le scritture. E lavoroBenefits, che ha un home in schema.org che prosa corpo non lo fa. Due nuove entità. JobPostingTranslation porta un'impronta digitale del testo che era fatto da, quindi una modifica invalida venti una lingue la stessa seconda piuttosto che lasciarli descrivere un vecchio stipendio. CarriereTalentAlert trasporta tutto il ciclo di vita del consenso — il doppio opt-in, un token di disiscrizione mai esorbitante, e un scadenza — perché è una forma pubblica che memorizza l'indirizzo di uno sconosciuto. Plus purge after: le applicazioni tengono un nome, un'email e un CV, e tenerle per sempre non è un default neutro.
· kamo-internal
Force KamoMobile Logout sull'attività di un account
Force Logout elimina le sessioni, che termina un browser. Non finisce un telefono: KamoMobile detiene un token del dispositivo durevole e minte una sessione fresca da esso immediatamente, quindi premendo Force Logout su un portatile perso sembra che abbia funzionato e non cambia nulla. Il nuovo pulsante revoca i dispositivi stessi. È più importante ora che KamoMobile può aprire un terminale completamente interattivo sul macchina di dev del membro: chiunque abbia un portatile sbloccato ha un guscio su una scatola con un kubeconfig cluster-admin fino a quando questo non viene eseguito. Anche consentire-lists l'azione inoltrata. atterra nel PATH a monte, quindi un i segmenti del valore incontrollato che trasportano '.' potrebbero mirare ad un POST autenticato a diversi endpoint SecurityService. Tutti quelli che si autorizzano, quindi questo è un seconda linea piuttosto che l'unica — ma la prima riga non dovrebbe essere «il HTTP Il cliente si normalizza.
· SecurityService
Force KamoMobile Logout — revocare i dispositivi mobili di un membro
Force-logout cancella *** sessioni, che termina un browser. Non finisce telefono: KamoMobile detiene un token dispositivo durevole e mints un fresco *** da esso nel momento in cui ha bisogno di uno, così forza-logout termina la sessione corrente del telefono e il telefono inizia silenziosamente un altro. Rivocare i token del dispositivo è l'unica cosa che chiude un portatile. Questo è il controllo che rende un telefono perso sopravvivere ora che KamoMobile può aprire un terminale completamente interattivo sulla macchina dev del membro — un root-equivalent shell su una scatola che tiene un kubeconfig cluster-admin. Chiunque tiene un fermo Il portatile lo ha fino a quando questo non funziona. I dispositivi vengono revocati prima che le sessioni vengano eliminate; l'altro ordine lascia un gap in cui l'applicazione può ripensare da un token che è ancora valido e tornare firmato. Spingere le registrazioni andare con il dispositivo, o il telefono continua buzzing per un account che non può più aprire. Registrato come FORCE LOGOUT piuttosto che un nuovo tipo di evento: a seconda di un l'enum di solitol-persisted è un cambiamento di schema, e il messaggio dice che tipo era. Stessa porta MANAGE MEMBER SECURITY dei suoi fratelli.
· kamo-internal
Un interruttore per la registrazione della piattaforma, e portare-il proprio sul lato org
Ogni scheda OAuth2 sulla Configurazione della Piattaforma → Avanzate ottiene un abilitare / disabilitare Interruttore nell'angolo in alto a destra. Scrive solo la bandiera abilitata, non è disponibile fino a quando le credenziali esistono dietro di esso, e ritorna se la scrittura fallisce — un abilitare/disattivare che mostra lo stato richiesto dall'operatore piuttosto che quello il server mantenuto sarebbe peggio di nessun interruttore. Il suo tooltip dice che cosa cambia in realtà, dal momento che l'effetto atterra sugli schermi di altre persone. Il lato org è l'altra metà. OrgOAuthAppSection è un componente, caduto in ogni schermata di impostazioni che si collega attraverso uno di questi provider: e-mail mailbox, riunioni, telefono di squadra, sociale, Canva e payroll. Ne chiede uno domanda — L'applicazione di Kamo, o uno si è registrato — e rende la modulo credenziali per il secondo. Quando la registrazione della piattaforma è disattivata la domanda scompare piuttosto che diventare una radio disattivata: non c'è nulla tra cui scegliere, e la forma delle credenziali è l'unico modo per andare avanti. Questo caso è il punto della funzione, così ottiene il sentiero normale, non quello grigio-fuori. Lo schema del campo del fornitore si sposta in un catalogo condiviso entrambi i lati importano. Loro descrivere la stessa registrazione; un campo aggiunto per la piattaforma e non per org sarebbe una credenziale un org non potrebbe mai fornire, e sarebbe superficie solo come fornitore che rifiuta la richiesta di token. Le registrazioni si caricano attraverso una cache condivisa, non validata su scrittura — la e-mail schermo solo rende tre sezioni, e ogni fetching per sé sarebbe emettere la stessa chiamata tre volte per visita.
· VOIPService
Squadre Il telefono rientra nell'app Entra dell'org
Le credenziali per-phone-server ancora vincere — questa è la fonte più specifica. Ciò che cambia è il fallback sotto di loro: il proprio MICROSOFT TEAMS registrazione se ha uno, e solo allora l'app multi-tenant di Kamo. L'URI redirect è org-scoped per lo stesso motivo è i dati di registrazione a tutti: un org sul proprio ingresso app registrato proprio, e Microsoft richiede valore riprodotto sullo scambio token per corrispondere all'autorizzazione byte-for-byte. Così il callback lo risolve sotto lo stesso org autorizzato sotto.
· MediaService
Risolvere le credenziali Canva, Meta, X e meeting per organizzazione
Ogni flusso qui ora legge qualsiasi applicazione l'org è su — la sua registrazione se ne ha portato uno, altrimenti l'app della piattaforma di Kamo. I punti di ingresso Canva e Meta caricano la connessione o l'intento BEFORE risolving il cliente, perché quale app viene eseguito un'autorizzazione dipende dal e l'org id vive nella cosa che viene caricata. Iniziata un'autorizzazione contro un'applicazione non può essere completata contro un'altra. SocialCredsResolver deve seguire l'org per lo stesso motivo inverso: Meta webhook è firmato da qualsiasi applicazione possiede la pagina, quindi verificarlo con il il segreto della piattaforma fallirebbe ogni controllo HMAC per una pagina collegata attraverso l'app di Org. Il callback di ritorno di Canva rimane solo piattaforma ed è commentato come tale: arriva con una correlazione JWT e nessuna organizzazione, quindi un org sulla sua la propria applicazione passa attraverso il percorso di importazione manuale che già esiste per esso. Lo schermo delle riunioni guadagna orgOAuthClientConfigured e oauthClientAvailable, so può offrire "Kamo's app" e "la nostra app" indipendentemente invece di nascondersi un clic collega il momento in cui un operatore della piattaforma spegne un fornitore.
· EmailService
Risolvere le credenziali OAuth per l'organizzazione
Google, Microsoft 365 e Zoho mailbox si collega ora leggere qualsiasi applicazione l'org è su — la sua registrazione se ha portato uno, altrimenti Kamo piattaforma app. L'org è filettato attraverso il rinfresco e la connessione. Una sovvenzione rilasciata a un org's propria app può essere aggiornato solo con il client id di quell'app e segreto, così la lettura della coppia della piattaforma ci sarebbe cominciato a mancare il momento un org smettere di usare l'app di Kamo — un giorno o un'ora dopo la connessione, non immediatamente, che è il tipo peggiore di non diagnosticare. L'inquilino Microsoft segue la stessa regola: un org sulla propria app Entra di solito vuole il proprio inquilino piuttosto che il multi-tenant "comune".
· SecurityService
CRUD di Org-side per un client OAuth2 di un'organizzazione
Il gemello org-scoped di PlatformOAuthClientController, dietro Non e' vero. Stessa forma DTO, stessa cripta su scrittura, stessa regola mai-return-a-secret, più piattaformaEnabled — che è quello che ogni le impostazioni di integrazione si legge per decidere se "utilizzare l'app di Kamo" è su offerta a tutti. Non c'è un solo "integrazione di gestione" diritto, così ogni fornitore è recintato le impostazioni a destra della funzione che lo consuma: la stessa destra che si apre lo schermo da cui la registrazione viene modificata. Microsoft, che è entrambi mailbox app e l'app Teams-meetings, accetta sia. CONFIGURE SYSTEM passa ovunque, come fa altrove nelle impostazioni. Un fornitore senza schermo org-side non è indirizzabile qui affatto, quindi un typo non può creare una registrazione nulla avrebbe mai letto: Meridian Il segreto di Link è per mercato, e RingCentral e ADP sono credenziali per-instance senza app piattaforma da sostituire.

Il tuo universo ti sta aspettando.
Aggiungi i prodotti quando sei pronto: nessuna migrazione, nessun nuovo login, nessuna richiesta di pagamento.
Gratis per sempre — nessuna carta di credito richiesta